[MediaWiki-commits] [Gerrit] Add unit tests for FileConfigurationObserver - change (operations...pybal)

2015-08-27 Thread Giuseppe Lavagetto (Code Review)
Giuseppe Lavagetto has submitted this change and it was merged.

Change subject: Add unit tests for FileConfigurationObserver
..


Add unit tests for FileConfigurationObserver

Change-Id: I526d573716ba668c9b8b7eb585daab6d9402c64e
---
M pybal/config.py
M pybal/pybal.py
M pybal/test/fixtures.py
M pybal/test/test_config.py
M tox.ini
5 files changed, 91 insertions(+), 3 deletions(-)

Approvals:
  Giuseppe Lavagetto: Looks good to me, approved



diff --git a/pybal/config.py b/pybal/config.py
index 7e3a43b..3172cf6 100644
--- a/pybal/config.py
+++ b/pybal/config.py
@@ -69,7 +69,6 @@
 self.lastFileStat = None
 self.lastConfig = None
 self.reloadTask = task.LoopingCall(self.reloadConfig)
-self.startObserving()
 
 def startObserving(self):
 """Start (or re-start) watching the configuration file for changes."""
@@ -95,7 +94,8 @@
 continue
 server = ast.literal_eval(line)
 host = server.pop('host')
-config[host] = server
+config[host] = {'enabled': server['enabled'],
+'weight': server['weight']}
 except (KeyError, SyntaxError, TypeError, ValueError) as ex:
 # We catch exceptions here (rather than simply allow them to
 # bubble up to FileConfigurationObserver.logError) because we
diff --git a/pybal/pybal.py b/pybal/pybal.py
old mode 100644
new mode 100755
index 0ae9df6..f39816c
--- a/pybal/pybal.py
+++ b/pybal/pybal.py
@@ -278,6 +278,7 @@
 self.serverConfigUrl = configUrl
 self.serverInitDeferredList = defer.Deferred()
 self.configObserver = config.ConfigurationObserver.fromUrl(self, 
configUrl)
+self.configObserver.startObserving()
 
 def __str__(self):
 return "[%s]" % self.lvsservice.name
diff --git a/pybal/test/fixtures.py b/pybal/test/fixtures.py
index 1fe18e2..ab480f8 100644
--- a/pybal/test/fixtures.py
+++ b/pybal/test/fixtures.py
@@ -47,6 +47,9 @@
 self.up = False
 self.reason = reason
 
+def onConfigUpdate(self, config):
+self.config = config
+
 
 class StubLVSService(object):
 """Test stub for `pybal.ipvs.LVSService`."""
diff --git a/pybal/test/test_config.py b/pybal/test/test_config.py
index 5fd9db1..2e77801 100644
--- a/pybal/test/test_config.py
+++ b/pybal/test/test_config.py
@@ -6,12 +6,13 @@
   This module contains tests for `pybal.config`.
 
 """
-import unittest
+import mock
 import tempfile
 import os
 
 import pybal
 import pybal.config
+
 
 from .fixtures import PyBalTestCase
 
@@ -32,3 +33,85 @@
 pybal.config.ConfigurationObserver.fromUrl(None, 'dummy://'),
 DummyConfigurationObserver
 )
+
+
+class FileConfigurationObserverTestCase(PyBalTestCase):
+"""Test case for `pybal.config.FileConfigurationObserver`."""
+
+def setUp(self):
+super(FileConfigurationObserverTestCase, self).setUp()
+self.observer = self.getObserver()
+
+def getObserver(self, filename='file:///something/here'):
+return pybal.config.FileConfigurationObserver(
+self.coordinator, filename)
+
+def testInit(self):
+"""Test `FileConfigurationObserver.__init__`"""
+self.assertEquals(self.observer.filePath, '/something/here')
+self.assertEquals(self.observer.reloadIntervalSeconds, 1)
+
+@mock.patch('os.stat')
+def testReloadConfig(self, mock_stat):
+"""Test `FileConfigurationObserver.reloadConfig`"""
+self.observer.lastFileStat = 'WMF'
+mock_stat.return_value = 'WMF'
+self.observer.parseConfig = mock.MagicMock(return_value="some_config")
+# No stat changes mean no config parsing
+self.observer.reloadConfig()
+mock_stat.assert_called_with('/something/here')
+self.observer.parseConfig.assert_not_called()
+# Stat change means we open the file and parse the configuration
+mock_stat.reset_mock()
+mock_stat.return_value = 'WMF!'
+m = mock.mock_open(read_data="123")
+with mock.patch('__builtin__.open', m, True) as mock_open:
+self.observer.reloadConfig()
+mock_stat.assert_called_with('/something/here')
+mock_open.assert_called_with('/something/here', 'rt')
+self.observer.parseConfig.assert_called_with('123')
+self.assertEquals(self.observer.lastConfig, 'some_config')
+self.assertEquals(self.observer.coordinator.config, 'some_config')
+
+def testParseConfig(self):
+"""Test `FileConfigurationObserver.parseConfig`"""
+self.observer.parseLegacyConfig = 
mock.MagicMock(return_value='legacy_config')
+self.observer.parseJsonConfig = 
mock.MagicMock(return_value='json_config')
+self.assertEquals(self.observer.parseConfig("I am legacy"), 
'legacy_config')
+self.observer.parseLegacyConfig.assert_called

[MediaWiki-commits] [Gerrit] Add unit tests for FileConfigurationObserver - change (operations...pybal)

2015-08-26 Thread Giuseppe Lavagetto (Code Review)
Giuseppe Lavagetto has uploaded a new change for review.

  https://gerrit.wikimedia.org/r/234008

Change subject: Add unit tests for FileConfigurationObserver
..

Add unit tests for FileConfigurationObserver

Change-Id: I526d573716ba668c9b8b7eb585daab6d9402c64e
---
M pybal/config.py
M pybal/pybal.py
M pybal/test/fixtures.py
M pybal/test/test_config.py
4 files changed, 90 insertions(+), 3 deletions(-)


  git pull ssh://gerrit.wikimedia.org:29418/operations/debs/pybal 
refs/changes/08/234008/1

diff --git a/pybal/config.py b/pybal/config.py
index 7e3a43b..3172cf6 100644
--- a/pybal/config.py
+++ b/pybal/config.py
@@ -69,7 +69,6 @@
 self.lastFileStat = None
 self.lastConfig = None
 self.reloadTask = task.LoopingCall(self.reloadConfig)
-self.startObserving()
 
 def startObserving(self):
 """Start (or re-start) watching the configuration file for changes."""
@@ -95,7 +94,8 @@
 continue
 server = ast.literal_eval(line)
 host = server.pop('host')
-config[host] = server
+config[host] = {'enabled': server['enabled'],
+'weight': server['weight']}
 except (KeyError, SyntaxError, TypeError, ValueError) as ex:
 # We catch exceptions here (rather than simply allow them to
 # bubble up to FileConfigurationObserver.logError) because we
diff --git a/pybal/pybal.py b/pybal/pybal.py
old mode 100644
new mode 100755
index 0ae9df6..f39816c
--- a/pybal/pybal.py
+++ b/pybal/pybal.py
@@ -278,6 +278,7 @@
 self.serverConfigUrl = configUrl
 self.serverInitDeferredList = defer.Deferred()
 self.configObserver = config.ConfigurationObserver.fromUrl(self, 
configUrl)
+self.configObserver.startObserving()
 
 def __str__(self):
 return "[%s]" % self.lvsservice.name
diff --git a/pybal/test/fixtures.py b/pybal/test/fixtures.py
index 1fe18e2..ab480f8 100644
--- a/pybal/test/fixtures.py
+++ b/pybal/test/fixtures.py
@@ -47,6 +47,9 @@
 self.up = False
 self.reason = reason
 
+def onConfigUpdate(self, config):
+self.config = config
+
 
 class StubLVSService(object):
 """Test stub for `pybal.ipvs.LVSService`."""
diff --git a/pybal/test/test_config.py b/pybal/test/test_config.py
index 5fd9db1..2e77801 100644
--- a/pybal/test/test_config.py
+++ b/pybal/test/test_config.py
@@ -6,12 +6,13 @@
   This module contains tests for `pybal.config`.
 
 """
-import unittest
+import mock
 import tempfile
 import os
 
 import pybal
 import pybal.config
+
 
 from .fixtures import PyBalTestCase
 
@@ -32,3 +33,85 @@
 pybal.config.ConfigurationObserver.fromUrl(None, 'dummy://'),
 DummyConfigurationObserver
 )
+
+
+class FileConfigurationObserverTestCase(PyBalTestCase):
+"""Test case for `pybal.config.FileConfigurationObserver`."""
+
+def setUp(self):
+super(FileConfigurationObserverTestCase, self).setUp()
+self.observer = self.getObserver()
+
+def getObserver(self, filename='file:///something/here'):
+return pybal.config.FileConfigurationObserver(
+self.coordinator, filename)
+
+def testInit(self):
+"""Test `FileConfigurationObserver.__init__`"""
+self.assertEquals(self.observer.filePath, '/something/here')
+self.assertEquals(self.observer.reloadIntervalSeconds, 1)
+
+@mock.patch('os.stat')
+def testReloadConfig(self, mock_stat):
+"""Test `FileConfigurationObserver.reloadConfig`"""
+self.observer.lastFileStat = 'WMF'
+mock_stat.return_value = 'WMF'
+self.observer.parseConfig = mock.MagicMock(return_value="some_config")
+# No stat changes mean no config parsing
+self.observer.reloadConfig()
+mock_stat.assert_called_with('/something/here')
+self.observer.parseConfig.assert_not_called()
+# Stat change means we open the file and parse the configuration
+mock_stat.reset_mock()
+mock_stat.return_value = 'WMF!'
+m = mock.mock_open(read_data="123")
+with mock.patch('__builtin__.open', m, True) as mock_open:
+self.observer.reloadConfig()
+mock_stat.assert_called_with('/something/here')
+mock_open.assert_called_with('/something/here', 'rt')
+self.observer.parseConfig.assert_called_with('123')
+self.assertEquals(self.observer.lastConfig, 'some_config')
+self.assertEquals(self.observer.coordinator.config, 'some_config')
+
+def testParseConfig(self):
+"""Test `FileConfigurationObserver.parseConfig`"""
+self.observer.parseLegacyConfig = 
mock.MagicMock(return_value='legacy_config')
+self.observer.parseJsonConfig = 
mock.MagicMock(return_value='json_config')
+self.assertEquals(self.observer.parseConfig("I am legacy"), 
'legacy_config')