diff --git a/neutron/tests/tools.py b/neutron/tests/tools.py index 980024c1bce..ffdfffe335c 100644 --- a/neutron/tests/tools.py +++ b/neutron/tests/tools.py @@ -13,10 +13,12 @@ # License for the specific language governing permissions and limitations # under the License. +import importlib import os import platform import random import string +import sys import time import warnings @@ -24,6 +26,7 @@ import fixtures import mock import six +import neutron from neutron.api.v2 import attributes @@ -185,6 +188,36 @@ class UnorderedList(list): return not self == other +def import_modules_recursively(topdir): + '''Import and return all modules below the topdir directory.''' + modules = [] + for root, dirs, files in os.walk(topdir): + for file_ in files: + if file_[-3:] != '.py': + continue + + module = file_[:-3] + if module == '__init__': + continue + + import_base = root.replace('/', '.') + + # NOTE(ihrachys): in Python3, or when we are not located in the + # directory containing neutron code, __file__ is absolute, so we + # should truncate it to exclude PYTHONPATH prefix + prefixlen = len(os.path.dirname(neutron.__file__)) + import_base = 'neutron' + import_base[prefixlen:] + + module = '.'.join([import_base, module]) + if module not in sys.modules: + importlib.import_module(module) + modules.append(module) + + for dir_ in dirs: + modules.extend(import_modules_recursively(dir_)) + return modules + + def get_random_string(n=10): return ''.join(random.choice(string.ascii_lowercase) for _ in range(n)) diff --git a/neutron/tests/unit/objects/test_objects.py b/neutron/tests/unit/objects/test_objects.py index 341fc0fa26f..08257cf8f55 100644 --- a/neutron/tests/unit/objects/test_objects.py +++ b/neutron/tests/unit/objects/test_objects.py @@ -18,7 +18,9 @@ import pprint from oslo_versionedobjects import base as obj_base from oslo_versionedobjects import fixture +from neutron import objects from neutron.tests import base as test_base +from neutron.tests import tools # NOTE: The hashes in this list should only be changed if they come with a @@ -32,6 +34,12 @@ object_data = { class TestObjectVersions(test_base.BaseTestCase): + def setUp(self): + super(TestObjectVersions, self).setUp() + # NOTE(ihrachys): seed registry with all objects under neutron.objects + # before validating the hashes + tools.import_modules_recursively(os.path.dirname(objects.__file__)) + def test_versions(self): checker = fixture.ObjectVersionChecker( obj_base.VersionedObjectRegistry.obj_classes()) diff --git a/neutron/tests/unit/tests/example/README b/neutron/tests/unit/tests/example/README new file mode 100644 index 00000000000..4eebbde9962 --- /dev/null +++ b/neutron/tests/unit/tests/example/README @@ -0,0 +1,2 @@ +This directory is used by: +neutron.tests.unit.tests.test_tools.ImportModulesRecursivelyTestCase diff --git a/neutron/tests/unit/tests/example/__init__.py b/neutron/tests/unit/tests/example/__init__.py new file mode 100644 index 00000000000..e69de29bb2d diff --git a/neutron/tests/unit/tests/example/dir/__init__.py b/neutron/tests/unit/tests/example/dir/__init__.py new file mode 100644 index 00000000000..e69de29bb2d diff --git a/neutron/tests/unit/tests/example/dir/example_module.py b/neutron/tests/unit/tests/example/dir/example_module.py new file mode 100644 index 00000000000..e69de29bb2d diff --git a/neutron/tests/unit/tests/test_tools.py b/neutron/tests/unit/tests/test_tools.py new file mode 100644 index 00000000000..1ab3e939fda --- /dev/null +++ b/neutron/tests/unit/tests/test_tools.py @@ -0,0 +1,33 @@ +# Licensed under the Apache License, Version 2.0 (the "License"); you may +# not use this file except in compliance with the License. You may obtain +# a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +# License for the specific language governing permissions and limitations +# under the License. + +import os +import sys + +from neutron.tests import base +from neutron.tests import tools +from neutron.tests.unit import tests # noqa + + +EXAMPLE_MODULE = 'neutron.tests.unit.tests.example.dir.example_module' + + +class ImportModulesRecursivelyTestCase(base.BaseTestCase): + + def test_object_modules(self): + sys.modules.pop(EXAMPLE_MODULE, None) + modules = tools.import_modules_recursively( + os.path.dirname(tests.__file__)) + self.assertIn( + 'neutron.tests.unit.tests.example.dir.example_module', + modules) + self.assertIn(EXAMPLE_MODULE, sys.modules)