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
This commit is contained in:
Salvatore Orlando 2013-09-04 12:22:23 -07:00
parent b60ff6b2a5
commit a07927dbe8
5 changed files with 32 additions and 27 deletions

View 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)

View 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)

View 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

View 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)

View 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()