]> review.fuel-infra Code Review - openstack-build/neutron-build.git/commitdiff
Ensure unit tests do not let looping calls roam freely
authorSalvatore Orlando <salv.orlando@gmail.com>
Wed, 4 Sep 2013 19:22:23 +0000 (12:22 -0700)
committerSalvatore Orlando <salv.orlando@gmail.com>
Thu, 5 Sep 2013 00:19:21 +0000 (17:19 -0700)
Bug 1220871

This patch does minimal changes in neutron.plugins.nicira.common.sync
providing unit tests with a reference to the looping call object, so
that they can control its lifecycle.
Also, it perform a bit of refactoring in test_l3_agent.py in the way
mocks are created and started.

Change-Id: I73a1eb8ecdb7c6d46ff12afba549dd27095b7202

neutron/plugins/nicira/common/sync.py
neutron/tests/unit/nicira/test_nvp_sync.py
neutron/tests/unit/services/metering/test_metering_agent.py
neutron/tests/unit/services/vpn/test_vpn_agent.py
neutron/tests/unit/test_l3_agent.py

index a321d69411272e9b8944ebacb29060f6599d0274..449be2957108676ccfb3af0367f145281d7da6cc 100644 (file)
@@ -1,5 +1,3 @@
-# vim: tabstop=4 shiftwidth=4 softtabstop=4
-
 # Copyright 2013 Nicira, Inc.
 # All Rights Reserved
 #
@@ -182,6 +180,7 @@ def _start_loopingcall(min_chunk_size, state_sync_interval, func):
         func, sp=SyncParameters(min_chunk_size))
     state_synchronizer.start(
         periodic_interval_max=state_sync_interval)
+    return state_synchronizer
 
 
 class NvpSynchronizer():
@@ -219,8 +218,10 @@ class NvpSynchronizer():
             raise nvp_exc.NvpPluginException(err_msg=err_msg)
         # Backoff time in case of failures while fetching sync data
         self._sync_backoff = 1
-        _start_loopingcall(min_chunk_size, state_sync_interval,
-                           self._synchronize_state)
+        # Store the looping call in an instance variable to allow unit tests
+        # for controlling its lifecycle
+        self._sync_looping_call = _start_loopingcall(
+            min_chunk_size, state_sync_interval, self._synchronize_state)
 
     def _get_tag_dict(self, tags):
         return dict((tag.get('scope'), tag['tag']) for tag in tags)
index 9b2b28fa0bf2e598bdac3ed327606bf805acbd20..3f3c74b5c0c9fad8765458510d14c483135fe4f1 100644 (file)
@@ -248,6 +248,8 @@ class SyncLoopingCallTestCase(base.BaseTestCase):
             synchronizer = sync.NvpSynchronizer(None, None,
                                                 100, 0, 0)
             time.sleep(0.04999)
+            # stop looping call before asserting
+            synchronizer._sync_looping_call.stop()
             self.assertEqual(
                 5, synchronizer._synchronize_state.call_count)
 
index 20c6bbd031899f514cf01828906d89cb85005904..87246a190b04abcb122f9ff0518da4ea9a48c2fa 100644 (file)
@@ -63,6 +63,10 @@ class TestMeteringOperations(base.BaseTestCase):
         self.driver_patch = mock.patch(self.noop_driver, autospec=True)
         self.driver_patch.start()
 
+        loopingcall_patch = mock.patch(
+            'neutron.openstack.common.loopingcall.FixedIntervalLoopingCall')
+        loopingcall_patch.start()
+
         self.agent = metering_agent.MeteringAgent('my agent', cfg.CONF)
         self.driver = self.agent.metering_driver
 
index 623bfcc97cbec63e4730d8d44207307024e4dec8..f22c18c0bff3ed87127d3be40acc4ed0b76988fe 100644 (file)
@@ -75,6 +75,10 @@ class TestVPNAgent(base.BaseTestCase):
         self.plugin_api = mock.Mock()
         l3pluginApi_cls.return_value = self.plugin_api
 
+        looping_call_p = mock.patch(
+            'neutron.openstack.common.loopingcall.FixedIntervalLoopingCall')
+        looping_call_p.start()
+
         self.fake_host = 'fake_host'
         self.agent = agent.VPNAgent(self.fake_host)
 
index 6ba181c48a4ebe8a8585e54aa49348257f2c37f5..844137db0e3c4c0d99dbbf1d6bb6e938448bf96c 100644 (file)
@@ -646,41 +646,35 @@ class TestL3AgentEventHandler(base.BaseTestCase):
         cfg.CONF.set_override('use_namespaces', True)
         agent_config.register_root_helper(cfg.CONF)
 
-        self.device_exists_p = mock.patch(
+        device_exists_p = mock.patch(
             'neutron.agent.linux.ip_lib.device_exists')
-        self.device_exists = self.device_exists_p.start()
+        device_exists_p.start()
 
-        self.utils_exec_p = mock.patch(
+        utils_exec_p = mock.patch(
             'neutron.agent.linux.utils.execute')
-        self.utils_exec = self.utils_exec_p.start()
+        utils_exec_p.start()
 
-        self.drv_cls_p = mock.patch('neutron.agent.linux.interface.NullDriver')
-        driver_cls = self.drv_cls_p.start()
-        self.mock_driver = mock.MagicMock()
-        self.mock_driver.DEV_NAME_LEN = (
+        drv_cls_p = mock.patch('neutron.agent.linux.interface.NullDriver')
+        driver_cls = drv_cls_p.start()
+        mock_driver = mock.MagicMock()
+        mock_driver.DEV_NAME_LEN = (
             interface.LinuxInterfaceDriver.DEV_NAME_LEN)
-        driver_cls.return_value = self.mock_driver
+        driver_cls.return_value = mock_driver
 
-        self.l3_plugin_p = mock.patch(
+        l3_plugin_p = mock.patch(
             'neutron.agent.l3_agent.L3PluginApi')
-        l3_plugin_cls = self.l3_plugin_p.start()
-        self.plugin_api = mock.Mock()
-        l3_plugin_cls.return_value = self.plugin_api
+        l3_plugin_cls = l3_plugin_p.start()
+        l3_plugin_cls.return_value = mock.Mock()
 
         self.external_process_p = mock.patch(
             'neutron.agent.linux.external_process.ProcessManager'
         )
-        self.external_process = self.external_process_p.start()
-
+        self.external_process_p.start()
+        looping_call_p = mock.patch(
+            'neutron.openstack.common.loopingcall.FixedIntervalLoopingCall')
+        looping_call_p.start()
         self.agent = l3_agent.L3NATAgent(HOSTNAME)
-
-    def tearDown(self):
-        self.device_exists_p.stop()
-        self.utils_exec_p.stop()
-        self.drv_cls_p.stop()
-        self.l3_plugin_p.stop()
-        self.external_process_p.stop()
-        super(TestL3AgentEventHandler, self).tearDown()
+        self.addCleanup(mock.patch.stopall)
 
     def test_spawn_metadata_proxy(self):
         router_id = _uuid()