From c108ef4629c855c33745764bcd92b7231f78415d Mon Sep 17 00:00:00 2001 From: Isaku Yamahata Date: Wed, 19 Jul 2017 09:27:02 -0700 Subject: [PATCH] unit test: mock.patch before super.setUp There are intermittent failures with journal db. e.g. there is should corresponding journal entry, but it didn't. One of the possible causes is, there can be one or more journal threads running unintentionally. In principle JournalThread is prevented from creating thread by mocking methods that spawns such threads. Make it sure that do mock.patch or useFixture which calls mock.patch before calling super.setUp Change-Id: I884c6ca5c07f330c2c416226d95304ac618bfc66 --- networking_odl/tests/unit/base_v2.py | 10 +++---- .../tests/unit/common/test_odl_features.py | 2 +- .../unit/common/test_websocket_client.py | 2 +- .../tests/unit/journal/test_full_sync.py | 4 +-- .../tests/unit/journal/test_recovery.py | 6 ++--- .../tests/unit/l3/test_l3_odl_v2.py | 2 +- .../tests/unit/ml2/test_mechanism_odl.py | 10 +++---- .../tests/unit/ml2/test_mechanism_odl_v2.py | 27 +++++++++++-------- .../tests/unit/ml2/test_port_status_update.py | 2 +- .../unit/ml2/test_pseudo_agentdb_binding.py | 4 +-- .../tests/unit/qos/test_qos_driver_v2.py | 2 +- .../test_sfc_flowclassifier_v1.py | 2 +- .../tests/unit/sfc/test_sfc_driver_v1.py | 2 +- 13 files changed, 39 insertions(+), 36 deletions(-) diff --git a/networking_odl/tests/unit/base_v2.py b/networking_odl/tests/unit/base_v2.py index 7b60b3f1c..4e1481b8e 100644 --- a/networking_odl/tests/unit/base_v2.py +++ b/networking_odl/tests/unit/base_v2.py @@ -29,15 +29,15 @@ from networking_odl.tests.unit import test_base_db class OpenDaylightConfigBase(test_plugin.Ml2PluginV2TestCase, test_base_db.ODLBaseDbTestCase): def setUp(self): + self.useFixture(base.OpenDaylightJournalThreadFixture()) + self.mock_mt_thread = mock.patch.object( + maintenance.MaintenanceThread, 'start').start() self.useFixture(base.OpenDaylightRestClientFixture()) super(OpenDaylightConfigBase, self).setUp() cfg.CONF.set_override('mechanism_drivers', ['logger', 'opendaylight_v2'], 'ml2') cfg.CONF.set_override('extension_drivers', ['port_security', 'qos'], 'ml2') - self.useFixture(base.OpenDaylightJournalThreadFixture()) - self.mock_mt_thread = mock.patch.object( - maintenance.MaintenanceThread, 'start').start() self.thread = journal.OpenDaylightJournalThread() def run_journal_processing(self): @@ -47,11 +47,11 @@ class OpenDaylightConfigBase(test_plugin.Ml2PluginV2TestCase, class OpenDaylightTestCase(OpenDaylightConfigBase): def setUp(self): + self.mock_sendjson = mock.patch.object(client.OpenDaylightRestClient, + 'sendjson').start() super(OpenDaylightTestCase, self).setUp() self.port_create_status = 'DOWN' self.mech = mech_driver_v2.OpenDaylightMechanismDriver() - self.mock_sendjson = mock.patch.object(client.OpenDaylightRestClient, - 'sendjson').start() self.mock_sendjson.side_effect = self.check_sendjson def check_sendjson(self, method, urlpath, obj): diff --git a/networking_odl/tests/unit/common/test_odl_features.py b/networking_odl/tests/unit/common/test_odl_features.py index ff5671fe9..ac47987b5 100644 --- a/networking_odl/tests/unit/common/test_odl_features.py +++ b/networking_odl/tests/unit/common/test_odl_features.py @@ -32,9 +32,9 @@ class TestOdlFeatures(base.DietTestCase): "neutron-extensions:operational-port-status"}]}}""" def setUp(self): - super(TestOdlFeatures, self).setUp() self.features_fixture = base.OpenDaylightFeaturesFixture() self.useFixture(self.features_fixture) + super(TestOdlFeatures, self).setUp() self.features_fixture.mock_odl_features_init.stop() @mock.patch.object(OpenDaylightRestClient, 'request') diff --git a/networking_odl/tests/unit/common/test_websocket_client.py b/networking_odl/tests/unit/common/test_websocket_client.py index 287d943b9..cf53bde6f 100644 --- a/networking_odl/tests/unit/common/test_websocket_client.py +++ b/networking_odl/tests/unit/common/test_websocket_client.py @@ -48,10 +48,10 @@ class TestWebsocketClient(base.DietTestCase): def setUp(self): """Setup test.""" - super(TestWebsocketClient, self).setUp() self.useFixture(base.OpenDaylightRestClientFixture()) mock.patch.object(wsc.OpenDaylightWebsocketClient, 'start_odl_websocket_thread').start() + super(TestWebsocketClient, self).setUp() self.mgr = wsc.OpenDaylightWebsocketClient.odl_create_websocket( "http://localhost:8080/", diff --git a/networking_odl/tests/unit/journal/test_full_sync.py b/networking_odl/tests/unit/journal/test_full_sync.py index d72e12aa1..940a853a8 100644 --- a/networking_odl/tests/unit/journal/test_full_sync.py +++ b/networking_odl/tests/unit/journal/test_full_sync.py @@ -44,10 +44,10 @@ from networking_odl.trunk import trunk_driver_v2 as trunk_driver class FullSyncTestCase(test_base_db.ODLBaseDbTestCase): def setUp(self): - super(FullSyncTestCase, self).setUp() - self.useFixture( base.OpenDaylightRestClientGlobalFixture(full_sync._CLIENT)) + super(FullSyncTestCase, self).setUp() + self._CLIENT = full_sync._CLIENT.get_client() for plugin_name in self._get_all_resources(): diff --git a/networking_odl/tests/unit/journal/test_recovery.py b/networking_odl/tests/unit/journal/test_recovery.py index 8bc86600a..ed25ff330 100644 --- a/networking_odl/tests/unit/journal/test_recovery.py +++ b/networking_odl/tests/unit/journal/test_recovery.py @@ -34,13 +34,11 @@ from networking_odl.tests import base class RecoveryTestCase(SqlTestCaseLight): def setUp(self): - super(RecoveryTestCase, self).setUp() - self.db_session = neutron_db_api.get_writer_session() - self.useFixture( base.OpenDaylightRestClientGlobalFixture(recovery._CLIENT)) + super(RecoveryTestCase, self).setUp() + self.db_session = neutron_db_api.get_writer_session() self._CLIENT = recovery._CLIENT.get_client() - self.addCleanup(self._db_cleanup) self.addCleanup(self.clean_registered_resources) diff --git a/networking_odl/tests/unit/l3/test_l3_odl_v2.py b/networking_odl/tests/unit/l3/test_l3_odl_v2.py index 75ae6e013..d7c4f8af2 100644 --- a/networking_odl/tests/unit/l3/test_l3_odl_v2.py +++ b/networking_odl/tests/unit/l3/test_l3_odl_v2.py @@ -49,9 +49,9 @@ PORT_ID = uuidutils.generate_uuid() class OpenDayLightMechanismConfigTests(testlib_api.SqlTestCase): def setUp(self): - super(OpenDayLightMechanismConfigTests, self).setUp() self.useFixture(odl_base.OpenDaylightRestClientFixture()) self.useFixture(odl_base.OpenDaylightFeaturesFixture()) + super(OpenDayLightMechanismConfigTests, self).setUp() cfg.CONF.set_override('mechanism_drivers', ['logger', 'opendaylight_v2'], 'ml2') cfg.CONF.set_override('port_binding_controller', diff --git a/networking_odl/tests/unit/ml2/test_mechanism_odl.py b/networking_odl/tests/unit/ml2/test_mechanism_odl.py index e12406f84..28aad27a5 100644 --- a/networking_odl/tests/unit/ml2/test_mechanism_odl.py +++ b/networking_odl/tests/unit/ml2/test_mechanism_odl.py @@ -124,13 +124,13 @@ class OpenDaylightTestCase(test_plugin.Ml2PluginV2TestCase): def setUp(self): self.useFixture(odl_base.OpenDaylightRestClientFixture()) self.useFixture(odl_base.OpenDaylightFeaturesFixture()) - super(OpenDaylightTestCase, self).setUp() - self.port_create_status = 'DOWN' - self.mech = mech_driver.OpenDaylightMechanismDriver() mock.patch.object( client.OpenDaylightRestClient, 'sendjson', new=self.check_sendjson).start() + super(OpenDaylightTestCase, self).setUp() + self.port_create_status = 'DOWN' + self.mech = mech_driver.OpenDaylightMechanismDriver() def check_sendjson(self, method, urlpath, obj): self.assertFalse(urlpath.startswith("http://")) @@ -138,8 +138,8 @@ class OpenDaylightTestCase(test_plugin.Ml2PluginV2TestCase): class OpenDayLightMechanismConfigTests(testlib_api.SqlTestCase): def setUp(self): - super(OpenDayLightMechanismConfigTests, self).setUp() self.useFixture(odl_base.OpenDaylightFeaturesFixture()) + super(OpenDayLightMechanismConfigTests, self).setUp() config.cfg.CONF.set_override('mechanism_drivers', ['logger', 'opendaylight'], 'ml2') @@ -303,9 +303,9 @@ class OpenDaylightSyncTestCase(OpenDaylightTestCase): class OpenDaylightMechanismDriverTestCase(base.BaseTestCase): def setUp(self): - super(OpenDaylightMechanismDriverTestCase, self).setUp() self.useFixture(odl_base.OpenDaylightRestClientFixture()) self.useFixture(odl_base.OpenDaylightFeaturesFixture()) + super(OpenDaylightMechanismDriverTestCase, self).setUp() config.cfg.CONF.set_override('mechanism_drivers', ['logger', 'opendaylight'], 'ml2') self.mech = mech_driver.OpenDaylightMechanismDriver() diff --git a/networking_odl/tests/unit/ml2/test_mechanism_odl_v2.py b/networking_odl/tests/unit/ml2/test_mechanism_odl_v2.py index f85c7211b..09fdaf0d8 100644 --- a/networking_odl/tests/unit/ml2/test_mechanism_odl_v2.py +++ b/networking_odl/tests/unit/ml2/test_mechanism_odl_v2.py @@ -59,15 +59,15 @@ SG_RULE_FAKE_ID = uuidutils.generate_uuid() class OpenDayLightMechanismConfigTests(testlib_api.SqlTestCase): def setUp(self): - super(OpenDayLightMechanismConfigTests, self).setUp() + self.useFixture(base.OpenDaylightFeaturesFixture()) self.useFixture(base.OpenDaylightJournalThreadFixture()) self.mock_mt_thread = mock.patch.object( maintenance.MaintenanceThread, 'start').start() + super(OpenDayLightMechanismConfigTests, self).setUp() cfg.CONF.set_override('mechanism_drivers', ['logger', 'opendaylight_v2'], 'ml2') cfg.CONF.set_override('port_binding_controller', 'legacy-port-binding', 'ml2_odl') - self.useFixture(base.OpenDaylightFeaturesFixture()) def _set_config(self, url='http://127.0.0.1:9999', username='someuser', password='somepass'): @@ -154,10 +154,9 @@ class AttributeDict(dict): class OpenDaylightMechanismDriverTestCase(base_v2.OpenDaylightConfigBase): def setUp(self): - super(OpenDaylightMechanismDriverTestCase, self).setUp() self.useFixture(base.OpenDaylightFeaturesFixture()) - self.mock_sync_thread = mock.patch.object( - journal.OpenDaylightJournalThread, 'start_odl_sync_thread').start() + self.useFixture(base.OpenDaylightJournalThreadFixture()) + super(OpenDaylightMechanismDriverTestCase, self).setUp() self.db_session = neutron_db_api.get_writer_session() self.mech = mech_driver_v2.OpenDaylightMechanismDriver() self.mech.initialize() @@ -577,13 +576,19 @@ class OpenDaylightMechanismDriverTestCase(base_v2.OpenDaylightConfigBase): def test_thread_call(self): """Verify that the sync thread method is called.""" - # Create any object that would spin up the sync thread via the - # decorator call_thread_on_end() used by all the event handlers. - self._call_operation_object(odl_const.ODL_CREATE, - odl_const.ODL_NETWORK) + with mock.patch.object( + journal.OpenDaylightJournalThread, + 'start_odl_sync_thread') as mock_sync_thread: + self.mech = mech_driver_v2.OpenDaylightMechanismDriver() + self.mech.initialize() - # Verify that the thread call was made. - self.assertTrue(self.mock_sync_thread.called) + # Create any object that would spin up the sync thread via the + # decorator call_thread_on_end() used by all the event handlers. + self._call_operation_object(odl_const.ODL_CREATE, + odl_const.ODL_NETWORK) + + # Verify that the thread call was made. + mock_sync_thread.assert_called() def test_sg(self): self._test_object_type(odl_const.ODL_SG, 2) diff --git a/networking_odl/tests/unit/ml2/test_port_status_update.py b/networking_odl/tests/unit/ml2/test_port_status_update.py index b29d85396..d430d5ea1 100644 --- a/networking_odl/tests/unit/ml2/test_port_status_update.py +++ b/networking_odl/tests/unit/ml2/test_port_status_update.py @@ -56,10 +56,10 @@ class TestOdlPortStatusUpdate(base.DietTestCase): }""") def setUp(self): - super(TestOdlPortStatusUpdate, self).setUp() self.useFixture(base.OpenDaylightFeaturesFixture()) self.mock_ws_client = mock.patch.object( OpenDaylightWebsocketClient, 'odl_create_websocket') + super(TestOdlPortStatusUpdate, self).setUp() def test_object_create(self): OdlPortStatusUpdate() diff --git a/networking_odl/tests/unit/ml2/test_pseudo_agentdb_binding.py b/networking_odl/tests/unit/ml2/test_pseudo_agentdb_binding.py index 6091c7391..a9463259b 100644 --- a/networking_odl/tests/unit/ml2/test_pseudo_agentdb_binding.py +++ b/networking_odl/tests/unit/ml2/test_pseudo_agentdb_binding.py @@ -228,9 +228,9 @@ class TestPseudoAgentDBBindingController(base.DietTestCase): def setUp(self): """Setup test.""" - super(TestPseudoAgentDBBindingController, self).setUp() self.useFixture(base.OpenDaylightRestClientFixture()) self.useFixture(base.OpenDaylightFeaturesFixture()) + super(TestPseudoAgentDBBindingController, self).setUp() fake_agents_db = mock.MagicMock() fake_agents_db.create_or_update_agent = mock.MagicMock() @@ -496,9 +496,9 @@ class TestPseudoAgentDBBindingControllerBug1608659( ]}} def setUp(self): + self.useFixture(base.OpenDaylightRestClientFixture()) super(TestPseudoAgentDBBindingControllerBug1608659, self).setUp( plugin='ml2') - self.useFixture(base.OpenDaylightRestClientFixture()) self.core_plugin = directory.get_plugin() self.mgr = pseudo_agentdb_binding.PseudoAgentDBBindingController( self.core_plugin) diff --git a/networking_odl/tests/unit/qos/test_qos_driver_v2.py b/networking_odl/tests/unit/qos/test_qos_driver_v2.py index e79096231..6eae751d4 100644 --- a/networking_odl/tests/unit/qos/test_qos_driver_v2.py +++ b/networking_odl/tests/unit/qos/test_qos_driver_v2.py @@ -26,10 +26,10 @@ from networking_odl.tests.unit import base_v2 class OpenDaylightQosDriverTestCase(base_v2.OpenDaylightConfigBase): def setUp(self): + self.useFixture(base.OpenDaylightJournalThreadFixture()) super(OpenDaylightQosDriverTestCase, self).setUp() self.db_session = neutron_db_api.get_writer_session() self.qos_driver = qos_driver.OpenDaylightQosDriver() - self.useFixture(base.OpenDaylightJournalThreadFixture()) def _get_mock_context(self): current = {'tenant_id': 'tenant_id'} diff --git a/networking_odl/tests/unit/sfc/flowclassifier/test_sfc_flowclassifier_v1.py b/networking_odl/tests/unit/sfc/flowclassifier/test_sfc_flowclassifier_v1.py index 4e31b1193..654b66c5d 100644 --- a/networking_odl/tests/unit/sfc/flowclassifier/test_sfc_flowclassifier_v1.py +++ b/networking_odl/tests/unit/sfc/flowclassifier/test_sfc_flowclassifier_v1.py @@ -25,10 +25,10 @@ class TestOpenDaylightSFCFlowClassifierDriverV1(base.DietTestCase): def setUp(self): self.useFixture(odl_base.OpenDaylightRestClientFixture()) - super(TestOpenDaylightSFCFlowClassifierDriverV1, self).setUp() self.mocked_fc_context = patch( 'networking_sfc.services.flowclassifier.common.context' '.FlowClassifierContext').start().return_value + super(TestOpenDaylightSFCFlowClassifierDriverV1, self).setUp() self.driver = sfc_fc.OpenDaylightSFCFlowClassifierDriverV1() self.driver.initialize() diff --git a/networking_odl/tests/unit/sfc/test_sfc_driver_v1.py b/networking_odl/tests/unit/sfc/test_sfc_driver_v1.py index 14d4a312a..fac544143 100644 --- a/networking_odl/tests/unit/sfc/test_sfc_driver_v1.py +++ b/networking_odl/tests/unit/sfc/test_sfc_driver_v1.py @@ -27,7 +27,6 @@ class TestOpenDaylightSFCDriverV1(base.DietTestCase): def setUp(self): self.useFixture(odl_base.OpenDaylightRestClientFixture()) - super(TestOpenDaylightSFCDriverV1, self).setUp() self.mocked_pp_context = patch( 'networking_sfc.services.sfc.common.context.PortPairContext' ).start().return_value @@ -39,6 +38,7 @@ class TestOpenDaylightSFCDriverV1(base.DietTestCase): self.mocked_pc_context = patch( 'networking_sfc.services.sfc.common.context.PortChainContext' ).start().return_value + super(TestOpenDaylightSFCDriverV1, self).setUp() self.driver = sfc_driver_v1.OpenDaylightSFCDriverV1() self.driver.initialize()