summaryrefslogtreecommitdiffstats
path: root/nova
diff options
context:
space:
mode:
Diffstat (limited to 'nova')
-rw-r--r--nova/tests/integrated/test_api_samples.py72
1 files changed, 72 insertions, 0 deletions
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)