From: Salvatore Orlando Date: Wed, 4 Sep 2013 19:22:23 +0000 (-0700) Subject: Ensure unit tests do not let looping calls roam freely X-Git-Url: https://review.fuel-infra.org/gitweb?a=commitdiff_plain;h=dabbb1bfc567b06573b55a3e250cd3d5d98ade16;p=openstack-build%2Fneutron-build.git Ensure unit tests do not let looping calls roam freely 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 --- diff --git a/neutron/plugins/nicira/common/sync.py b/neutron/plugins/nicira/common/sync.py index a321d6941..449be2957 100644 --- a/neutron/plugins/nicira/common/sync.py +++ b/neutron/plugins/nicira/common/sync.py @@ -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) diff --git a/neutron/tests/unit/nicira/test_nvp_sync.py b/neutron/tests/unit/nicira/test_nvp_sync.py index 9b2b28fa0..3f3c74b5c 100644 --- a/neutron/tests/unit/nicira/test_nvp_sync.py +++ b/neutron/tests/unit/nicira/test_nvp_sync.py @@ -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) diff --git a/neutron/tests/unit/services/metering/test_metering_agent.py b/neutron/tests/unit/services/metering/test_metering_agent.py index 20c6bbd03..87246a190 100644 --- a/neutron/tests/unit/services/metering/test_metering_agent.py +++ b/neutron/tests/unit/services/metering/test_metering_agent.py @@ -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 diff --git a/neutron/tests/unit/services/vpn/test_vpn_agent.py b/neutron/tests/unit/services/vpn/test_vpn_agent.py index 623bfcc97..f22c18c0b 100644 --- a/neutron/tests/unit/services/vpn/test_vpn_agent.py +++ b/neutron/tests/unit/services/vpn/test_vpn_agent.py @@ -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) diff --git a/neutron/tests/unit/test_l3_agent.py b/neutron/tests/unit/test_l3_agent.py index 6ba181c48..844137db0 100644 --- a/neutron/tests/unit/test_l3_agent.py +++ b/neutron/tests/unit/test_l3_agent.py @@ -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()