From c19a227c0eda5c88a4e0de78878dc6332167c14e Mon Sep 17 00:00:00 2001 From: Kevin Benton Date: Thu, 18 Sep 2014 06:52:13 -0700 Subject: [PATCH] Remove some duplicate unit tests There are several locations where some unit test mixins are incorrectly used multiple times with an otherwise same configuration, which results in pointless re-runs of the same unit test. Similarily, there are a few tests defined in classes inherited by multiple tests that don't change behavior in the child tests so they are run multiple times as well. This patch eliminates the duplicates and moves some test cases from their parent class into a subclass when they don't need to be run multiple times. The result is 221 fewer test runs (~1.5% of the tests run). Closes-Bug: #1374836 Change-Id: I292091488cd944510fa1250920d41be2a50dabaf --- .../tests/unit/cisco/n1kv/test_n1kv_plugin.py | 28 +-- .../unit/embrane/test_embrane_l3_plugin.py | 7 +- .../mech_sriov/test_mech_sriov_nic_switch.py | 8 +- .../tests/unit/ml2/drivers/test_mech_mlnx.py | 5 - neutron/tests/unit/ml2/test_mechanism_odl.py | 34 ++-- neutron/tests/unit/nuage/test_nuage_plugin.py | 159 +++++++++--------- neutron/tests/unit/nuage/test_syncmanager.py | 12 +- 7 files changed, 113 insertions(+), 140 deletions(-) diff --git a/neutron/tests/unit/cisco/n1kv/test_n1kv_plugin.py b/neutron/tests/unit/cisco/n1kv/test_n1kv_plugin.py index 0a64ba109..7a3ba50fa 100644 --- a/neutron/tests/unit/cisco/n1kv/test_n1kv_plugin.py +++ b/neutron/tests/unit/cisco/n1kv/test_n1kv_plugin.py @@ -237,20 +237,6 @@ class N1kvPluginTestCase(test_plugin.NeutronDbPluginV2TestCase): # Restore the original RESOURCE_ATTRIBUTE_MAP attributes.RESOURCE_ATTRIBUTE_MAP = self.saved_attr_map - def test_plugin(self): - self._make_network('json', - 'some_net', - True, - tenant_id=self.tenant_id, - set_context=True) - - req = self.new_list_request('networks', params="fields=tenant_id") - req.environ['neutron.context'] = context.Context('', self.tenant_id) - res = req.get_response(self.api) - self.assertEqual(res.status_int, 200) - body = self.deserialize('json', res) - self.assertIn('tenant_id', body['networks'][0]) - class TestN1kvNetworkProfiles(N1kvPluginTestCase): def _prepare_net_profile_data(self, @@ -944,6 +930,20 @@ class TestN1kvPolicyProfiles(N1kvPluginTestCase): class TestN1kvNetworks(test_plugin.TestNetworksV2, N1kvPluginTestCase): + def test_plugin(self): + self._make_network('json', + 'some_net', + True, + tenant_id=self.tenant_id, + set_context=True) + + req = self.new_list_request('networks', params="fields=tenant_id") + req.environ['neutron.context'] = context.Context('', self.tenant_id) + res = req.get_response(self.api) + self.assertEqual(res.status_int, 200) + body = self.deserialize('json', res) + self.assertIn('tenant_id', body['networks'][0]) + def _prepare_net_data(self, net_profile_id): return {'network': {'name': 'net1', n1kv.PROFILE_ID: net_profile_id, diff --git a/neutron/tests/unit/embrane/test_embrane_l3_plugin.py b/neutron/tests/unit/embrane/test_embrane_l3_plugin.py index 849096fc5..3aa1773b8 100644 --- a/neutron/tests/unit/embrane/test_embrane_l3_plugin.py +++ b/neutron/tests/unit/embrane/test_embrane_l3_plugin.py @@ -17,19 +17,14 @@ from oslo.config import cfg from neutron.plugins.embrane.common import config # noqa from neutron.tests.unit import test_extension_extraroute as extraroute_test -from neutron.tests.unit import test_l3_plugin as router_test PLUGIN_NAME = ('neutron.plugins.embrane.plugins.embrane_fake_plugin.' 'EmbraneFakePlugin') -class TestEmbraneL3NatDBTestCase(router_test.L3NatDBIntTestCase): +class TestEmbraneL3NatDBTestCase(extraroute_test.ExtraRouteDBIntTestCase): _plugin_name = PLUGIN_NAME def setUp(self): cfg.CONF.set_override('admin_password', "admin123", 'heleos') super(TestEmbraneL3NatDBTestCase, self).setUp() - - -class ExtraRouteDBTestCase(extraroute_test.ExtraRouteDBIntTestCase): - _plugin_name = PLUGIN_NAME diff --git a/neutron/tests/unit/ml2/drivers/mech_sriov/test_mech_sriov_nic_switch.py b/neutron/tests/unit/ml2/drivers/mech_sriov/test_mech_sriov_nic_switch.py index e854f0684..0de8e67f4 100644 --- a/neutron/tests/unit/ml2/drivers/mech_sriov/test_mech_sriov_nic_switch.py +++ b/neutron/tests/unit/ml2/drivers/mech_sriov/test_mech_sriov_nic_switch.py @@ -82,6 +82,9 @@ class SriovNicSwitchMechanismBaseTestCase(base.AgentMechanismBaseTestCase): self.driver = mech_driver.SriovNicSwitchMechanismDriver() self.driver.initialize() + +class SriovSwitchMechGenericTestCase(SriovNicSwitchMechanismBaseTestCase, + base.AgentMechanismGenericTestCase): def test_check_segment(self): """Validate the check_segment call.""" segment = {'api.NETWORK_TYPE': ""} @@ -92,11 +95,6 @@ class SriovNicSwitchMechanismBaseTestCase(base.AgentMechanismBaseTestCase): self.assertFalse(self.driver.check_segment(segment)) -class SriovSwitchMechGenericTestCase(SriovNicSwitchMechanismBaseTestCase, - base.AgentMechanismGenericTestCase): - pass - - class SriovMechVlanTestCase(SriovNicSwitchMechanismBaseTestCase, base.AgentMechanismBaseTestCase): VLAN_SEGMENTS = [{api.ID: 'unknown_segment_id', diff --git a/neutron/tests/unit/ml2/drivers/test_mech_mlnx.py b/neutron/tests/unit/ml2/drivers/test_mech_mlnx.py index 3b8805724..5cf13ae30 100644 --- a/neutron/tests/unit/ml2/drivers/test_mech_mlnx.py +++ b/neutron/tests/unit/ml2/drivers/test_mech_mlnx.py @@ -62,11 +62,6 @@ class MlnxMechanismFlatTestCase(MlnxMechanismBaseTestCase, pass -class MlnxMechanismVlanTestCase(MlnxMechanismBaseTestCase, - base.AgentMechanismVlanTestCase): - pass - - class MlnxMechanismVnicTypeTestCase(MlnxMechanismBaseTestCase, base.AgentMechanismVlanTestCase): def _check_vif_type_for_vnic_type(self, vnic_type, diff --git a/neutron/tests/unit/ml2/test_mechanism_odl.py b/neutron/tests/unit/ml2/test_mechanism_odl.py index 8d87eb5a6..4d3ba0beb 100644 --- a/neutron/tests/unit/ml2/test_mechanism_odl.py +++ b/neutron/tests/unit/ml2/test_mechanism_odl.py @@ -46,7 +46,6 @@ class OpenDaylightTestCase(test_plugin.NeutronDbPluginV2TestCase): super(OpenDaylightTestCase, self).setUp(PLUGIN_NAME) self.port_create_status = 'DOWN' - self.segment = {'api.NETWORK_TYPE': ""} self.mech = mechanism_odl.OpenDaylightMechanismDriver() mechanism_odl.OpenDaylightMechanismDriver.sendjson = ( self.check_sendjson) @@ -54,22 +53,6 @@ class OpenDaylightTestCase(test_plugin.NeutronDbPluginV2TestCase): def check_sendjson(self, method, urlpath, obj, ignorecodes=[]): self.assertFalse(urlpath.startswith("http://")) - def test_check_segment(self): - """Validate the check_segment call.""" - self.segment[api.NETWORK_TYPE] = constants.TYPE_LOCAL - self.assertTrue(self.mech.check_segment(self.segment)) - self.segment[api.NETWORK_TYPE] = constants.TYPE_FLAT - self.assertFalse(self.mech.check_segment(self.segment)) - self.segment[api.NETWORK_TYPE] = constants.TYPE_VLAN - self.assertTrue(self.mech.check_segment(self.segment)) - self.segment[api.NETWORK_TYPE] = constants.TYPE_GRE - self.assertTrue(self.mech.check_segment(self.segment)) - self.segment[api.NETWORK_TYPE] = constants.TYPE_VXLAN - self.assertTrue(self.mech.check_segment(self.segment)) - # Validate a network type not currently supported - self.segment[api.NETWORK_TYPE] = 'mpls' - self.assertFalse(self.mech.check_segment(self.segment)) - class OpenDayLightMechanismConfigTests(testlib_api.SqlTestCase): @@ -378,3 +361,20 @@ class OpenDaylightMechanismDriverTestCase(base.BaseTestCase): requests.codes.not_implemented): self._test_delete_resource_postcommit( 'port', status_code, requests.exceptions.HTTPError) + + def test_check_segment(self): + """Validate the check_segment call.""" + segment = {'api.NETWORK_TYPE': ""} + segment[api.NETWORK_TYPE] = constants.TYPE_LOCAL + self.assertTrue(self.mech.check_segment(segment)) + segment[api.NETWORK_TYPE] = constants.TYPE_FLAT + self.assertFalse(self.mech.check_segment(segment)) + segment[api.NETWORK_TYPE] = constants.TYPE_VLAN + self.assertTrue(self.mech.check_segment(segment)) + segment[api.NETWORK_TYPE] = constants.TYPE_GRE + self.assertTrue(self.mech.check_segment(segment)) + segment[api.NETWORK_TYPE] = constants.TYPE_VXLAN + self.assertTrue(self.mech.check_segment(segment)) + # Validate a network type not currently supported + segment[api.NETWORK_TYPE] = 'mpls' + self.assertFalse(self.mech.check_segment(segment)) diff --git a/neutron/tests/unit/nuage/test_nuage_plugin.py b/neutron/tests/unit/nuage/test_nuage_plugin.py index 37c062aff..424d7194f 100644 --- a/neutron/tests/unit/nuage/test_nuage_plugin.py +++ b/neutron/tests/unit/nuage/test_nuage_plugin.py @@ -41,7 +41,6 @@ from neutron.tests.unit import test_db_plugin from neutron.tests.unit import test_extension_extraroute as extraroute_test from neutron.tests.unit import test_extension_security_group as test_sg from neutron.tests.unit import test_extensions -from neutron.tests.unit import test_l3_plugin API_EXT_PATH = os.path.dirname(extensions.__file__) @@ -383,8 +382,83 @@ class TestNuagePluginPortBinding(NuagePluginV2TestCase, self._check_response_no_portbindings(non_admin_port) -class TestNuageL3NatTestCase(NuagePluginV2TestCase, - test_l3_plugin.L3NatDBIntTestCase): +class TestNuageExtrarouteTestCase(NuagePluginV2TestCase, + extraroute_test.ExtraRouteDBIntTestCase): + + def test_router_update_with_dup_destination_address(self): + with self.router() as r: + with self.subnet(cidr='10.0.1.0/24') as s: + with self.port(subnet=s) as p: + self._router_interface_action('add', + r['router']['id'], + None, + p['port']['id']) + + routes = [{'destination': '135.207.0.0/16', + 'nexthop': '10.0.1.3'}, + {'destination': '135.207.0.0/16', + 'nexthop': '10.0.1.5'}] + + self._update('routers', r['router']['id'], + {'router': {'routes': + routes}}, + expected_code=exc.HTTPBadRequest.code) + + # clean-up + self._router_interface_action('remove', + r['router']['id'], + None, + p['port']['id']) + + def test_router_update_on_external_port(self): + with self.router() as r: + with self.subnet(cidr='10.0.1.0/24') as s: + self._set_net_external(s['subnet']['network_id']) + self._add_external_gateway_to_router( + r['router']['id'], + s['subnet']['network_id']) + body = self._show('routers', r['router']['id']) + net_id = body['router']['external_gateway_info']['network_id'] + self.assertEqual(net_id, s['subnet']['network_id']) + port_res = self._list_ports( + 'json', + 200, + s['subnet']['network_id'], + tenant_id=r['router']['tenant_id'], + device_own=constants.DEVICE_OWNER_ROUTER_GW) + port_list = self.deserialize('json', port_res) + # The plugin will create 1 port + self.assertEqual(2, len(port_list['ports'])) + + routes = [{'destination': '135.207.0.0/16', + 'nexthop': '10.0.1.3'}] + + body = self._update('routers', r['router']['id'], + {'router': {'routes': + routes}}) + + body = self._show('routers', r['router']['id']) + self.assertEqual(routes, + body['router']['routes']) + + self._remove_external_gateway_from_router( + r['router']['id'], + s['subnet']['network_id']) + body = self._show('routers', r['router']['id']) + gw_info = body['router']['external_gateway_info'] + self.assertIsNone(gw_info) + + def test_floatingip_create_different_fixed_ip_same_port(self): + self._test_floatingip_create_different_fixed_ip_same_port() + + def test_floatingip_update_different_router(self): + self._test_floatingip_update_different_router() + + def test_floatingip_update_different_fixed_ip_same_port(self): + self._test_floatingip_update_different_fixed_ip_same_port() + + def test_network_update_external_failure(self): + self._test_network_update_external_failure() def test_update_port_with_assoc_floatingip(self): with self.subnet(cidr='200.0.0.0/24') as public_sub: @@ -465,85 +539,6 @@ class TestNuageRouterExtTestCase(NuagePluginV2TestCase): self.assertEqual(exc.HTTPCreated.code, router_res.status_int) -class TestNuageExtrarouteTestCase(NuagePluginV2TestCase, - extraroute_test.ExtraRouteDBIntTestCase): - - def test_router_update_with_dup_destination_address(self): - with self.router() as r: - with self.subnet(cidr='10.0.1.0/24') as s: - with self.port(subnet=s) as p: - self._router_interface_action('add', - r['router']['id'], - None, - p['port']['id']) - - routes = [{'destination': '135.207.0.0/16', - 'nexthop': '10.0.1.3'}, - {'destination': '135.207.0.0/16', - 'nexthop': '10.0.1.5'}] - - self._update('routers', r['router']['id'], - {'router': {'routes': - routes}}, - expected_code=exc.HTTPBadRequest.code) - - # clean-up - self._router_interface_action('remove', - r['router']['id'], - None, - p['port']['id']) - - def test_router_update_on_external_port(self): - with self.router() as r: - with self.subnet(cidr='10.0.1.0/24') as s: - self._set_net_external(s['subnet']['network_id']) - self._add_external_gateway_to_router( - r['router']['id'], - s['subnet']['network_id']) - body = self._show('routers', r['router']['id']) - net_id = body['router']['external_gateway_info']['network_id'] - self.assertEqual(net_id, s['subnet']['network_id']) - port_res = self._list_ports( - 'json', - 200, - s['subnet']['network_id'], - tenant_id=r['router']['tenant_id'], - device_own=constants.DEVICE_OWNER_ROUTER_GW) - port_list = self.deserialize('json', port_res) - # The plugin will create 1 port - self.assertEqual(2, len(port_list['ports'])) - - routes = [{'destination': '135.207.0.0/16', - 'nexthop': '10.0.1.3'}] - - body = self._update('routers', r['router']['id'], - {'router': {'routes': - routes}}) - - body = self._show('routers', r['router']['id']) - self.assertEqual(routes, - body['router']['routes']) - - self._remove_external_gateway_from_router( - r['router']['id'], - s['subnet']['network_id']) - body = self._show('routers', r['router']['id']) - gw_info = body['router']['external_gateway_info'] - self.assertIsNone(gw_info) - - def test_floatingip_create_different_fixed_ip_same_port(self): - self._test_floatingip_create_different_fixed_ip_same_port() - - def test_floatingip_update_different_router(self): - self._test_floatingip_update_different_router() - - def test_floatingip_update_different_fixed_ip_same_port(self): - self._test_floatingip_update_different_fixed_ip_same_port() - - def test_network_update_external_failure(self): - self._test_network_update_external_failure() - - class TestNuageProviderNetTestCase(NuagePluginV2TestCase): def test_create_provider_network(self): diff --git a/neutron/tests/unit/nuage/test_syncmanager.py b/neutron/tests/unit/nuage/test_syncmanager.py index 1c2b7e0b0..1883b7aa0 100644 --- a/neutron/tests/unit/nuage/test_syncmanager.py +++ b/neutron/tests/unit/nuage/test_syncmanager.py @@ -23,13 +23,12 @@ from neutron.tests.unit.nuage import test_netpartition from neutron.tests.unit.nuage import test_nuage_plugin from neutron.tests.unit import test_extension_extraroute as extraroute_test from neutron.tests.unit import test_extension_security_group as test_sg -from neutron.tests.unit import test_l3_plugin _uuid = uuidutils.generate_uuid class TestL3Sync(test_nuage_plugin.NuagePluginV2TestCase, - test_l3_plugin.L3NatDBIntTestCase): + extraroute_test.ExtraRouteDBIntTestCase): def setUp(self): self.session = context.get_admin_context().session @@ -154,15 +153,6 @@ class TestL3Sync(test_nuage_plugin.NuagePluginV2TestCase, def test_network_update_external_failure(self): self._test_network_update_external_failure() - -class TestExtraRouteSync(extraroute_test.ExtraRouteDBIntTestCase): - - def setUp(self): - self.session = context.get_admin_context().session - self.syncmanager = sync.SyncManager( - test_nuage_plugin.getNuageClient()) - super(TestExtraRouteSync, self).setUp() - def test_route_sync(self): route = {'destination': '135.207.0.0/16', 'nexthop': '10.0.1.3'} with self.router() as r: -- 2.45.2