From bd7fb1c30ffb71b22bed1ce56c6caab5290cecc0 Mon Sep 17 00:00:00 2001 From: Dan Smith Date: Fri, 14 Dec 2012 11:02:25 -0800 Subject: Add a developer trap for api samples This adds a test in test_api_samples to verify that no new extensions get added to the tree without matching api_samples. Since not all the extensions currently in the tree have samples, there is an exclusion list so that this passes now. Extensions should never be added to that exclusion list, and the list should eventually go away when we get all of the extensions tested. Change-Id: I506450d2f3f5a32ff5c653b5940bae6c47790d01 --- nova/tests/integrated/test_api_samples.py | 72 +++++++++++++++++++++++++++++++ 1 file changed, 72 insertions(+) diff --git a/nova/tests/integrated/test_api_samples.py b/nova/tests/integrated/test_api_samples.py index 4f73f6bfe..cff4e1be3 100644 --- a/nova/tests/integrated/test_api_samples.py +++ b/nova/tests/integrated/test_api_samples.py @@ -15,6 +15,7 @@ import base64 import datetime +import inspect import os import re import urllib @@ -312,6 +313,77 @@ class ApiSampleTestBase(integrated_helpers._IntegratedTestBase): return self._get_response(url, 'DELETE') +class ApiSamplesTrap(ApiSampleTestBase): + """Make sure extensions don't get added without tests""" + + all_extensions = True + + def _get_extensions_tested(self): + tests = [] + for attr in globals().values(): + if not inspect.isclass(attr): + continue # Skip non-class objects + if not issubclass(attr, integrated_helpers._IntegratedTestBase): + continue # Skip non-test classes + if attr.extension_name is None: + continue # Skip base tests + cls = importutils.import_class(attr.extension_name) + tests.append(cls.alias) + return tests + + def _get_extensions(self): + extensions = [] + response = self._do_get('extensions') + for extension in jsonutils.loads(response.read())['extensions']: + extensions.append(str(extension['alias'])) + return extensions + + def test_all_extensions_have_samples(self): + # NOTE(danms): This is a list of extensions which are currently + # in the tree but that don't (yet) have tests. This list should + # NOT be allowed to grow, and should shrink to zero (and be + # removed) soon. + do_not_approve_additions = [] + do_not_approve_additions.append('NMN') + do_not_approve_additions.append('OS-FLV-DISABLED') + do_not_approve_additions.append('os-config-drive') + do_not_approve_additions.append('os-coverage') + do_not_approve_additions.append('os-create-server-ext') + do_not_approve_additions.append('os-fixed-ips') + do_not_approve_additions.append('os-flavor-access') + do_not_approve_additions.append('os-flavor-extra-specs') + do_not_approve_additions.append('os-flavor-rxtx') + do_not_approve_additions.append('os-flavor-swap') + do_not_approve_additions.append('os-floating-ip-dns') + do_not_approve_additions.append('os-floating-ip-pools') + do_not_approve_additions.append('os-fping') + do_not_approve_additions.append('os-hypervisors') + do_not_approve_additions.append('os-instance_usage_audit_log') + do_not_approve_additions.append('os-networks') + do_not_approve_additions.append('os-quota-class-sets') + do_not_approve_additions.append('os-services') + do_not_approve_additions.append('os-volumes') + + tests = self._get_extensions_tested() + extensions = self._get_extensions() + missing_tests = [] + for extension in extensions: + # NOTE(danms): if you add tests, remove it from the + # exclusions list + self.assertFalse(extension in do_not_approve_additions and + extension in tests) + + # NOTE(danms): if you add an extension, it must come with + # api_samples tests! + if (extension not in tests and + extension not in do_not_approve_additions): + missing_tests.append(extension) + + if missing_tests: + LOG.error("Extensions are missing tests: %s" % missing_tests) + self.assertEqual(missing_tests, []) + + class VersionsSampleJsonTest(ApiSampleTestBase): def test_versions_get(self): response = self._do_get('', strip_version=True) -- cgit