nova/nova/tests/unit/test_loadables.py

114 lines
5.3 KiB
Python

# Copyright 2012 OpenStack Foundation # All Rights Reserved.
#
# 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.
"""
Tests For Loadable class handling.
"""
from nova import exception
from nova import test
from nova.tests.unit import fake_loadables
class LoadablesTestCase(test.NoDBTestCase):
def setUp(self):
super(LoadablesTestCase, self).setUp()
self.fake_loader = fake_loadables.FakeLoader()
# The name that we imported above for testing
self.test_package = 'nova.tests.unit.fake_loadables'
def test_loader_init(self):
self.assertEqual(self.fake_loader.package, self.test_package)
# Test the path of the module
ending_path = '/' + self.test_package.replace('.', '/')
self.assertTrue(self.fake_loader.path.endswith(ending_path))
self.assertEqual(self.fake_loader.loadable_cls_type,
fake_loadables.FakeLoadable)
def _compare_classes(self, classes, expected):
class_names = [cls.__name__ for cls in classes]
self.assertEqual(set(class_names), set(expected))
def test_get_all_classes(self):
classes = self.fake_loader.get_all_classes()
expected_class_names = ['FakeLoadableSubClass1',
'FakeLoadableSubClass2',
'FakeLoadableSubClass5',
'FakeLoadableSubClass6']
self._compare_classes(classes, expected_class_names)
def test_get_matching_classes(self):
prefix = self.test_package
test_classes = [prefix + '.fake_loadable1.FakeLoadableSubClass1',
prefix + '.fake_loadable2.FakeLoadableSubClass5']
classes = self.fake_loader.get_matching_classes(test_classes)
expected_class_names = ['FakeLoadableSubClass1',
'FakeLoadableSubClass5']
self._compare_classes(classes, expected_class_names)
def test_get_matching_classes_with_underscore(self):
prefix = self.test_package
test_classes = [prefix + '.fake_loadable1.FakeLoadableSubClass1',
prefix + '.fake_loadable2._FakeLoadableSubClass7']
self.assertRaises(exception.ClassNotFound,
self.fake_loader.get_matching_classes,
test_classes)
def test_get_matching_classes_with_wrong_type1(self):
prefix = self.test_package
test_classes = [prefix + '.fake_loadable1.FakeLoadableSubClass4',
prefix + '.fake_loadable2.FakeLoadableSubClass5']
self.assertRaises(exception.ClassNotFound,
self.fake_loader.get_matching_classes,
test_classes)
def test_get_matching_classes_with_wrong_type2(self):
prefix = self.test_package
test_classes = [prefix + '.fake_loadable1.FakeLoadableSubClass1',
prefix + '.fake_loadable2.FakeLoadableSubClass8']
self.assertRaises(exception.ClassNotFound,
self.fake_loader.get_matching_classes,
test_classes)
def test_get_matching_classes_with_one_function(self):
prefix = self.test_package
test_classes = [prefix + '.fake_loadable1.return_valid_classes',
prefix + '.fake_loadable2.FakeLoadableSubClass5']
classes = self.fake_loader.get_matching_classes(test_classes)
expected_class_names = ['FakeLoadableSubClass1',
'FakeLoadableSubClass2',
'FakeLoadableSubClass5']
self._compare_classes(classes, expected_class_names)
def test_get_matching_classes_with_two_functions(self):
prefix = self.test_package
test_classes = [prefix + '.fake_loadable1.return_valid_classes',
prefix + '.fake_loadable2.return_valid_class']
classes = self.fake_loader.get_matching_classes(test_classes)
expected_class_names = ['FakeLoadableSubClass1',
'FakeLoadableSubClass2',
'FakeLoadableSubClass6']
self._compare_classes(classes, expected_class_names)
def test_get_matching_classes_with_function_including_invalids(self):
# When using a method, no checking is done on valid classes.
prefix = self.test_package
test_classes = [prefix + '.fake_loadable1.return_invalid_classes',
prefix + '.fake_loadable2.return_valid_class']
classes = self.fake_loader.get_matching_classes(test_classes)
expected_class_names = ['FakeLoadableSubClass1',
'_FakeLoadableSubClass3',
'FakeLoadableSubClass4',
'FakeLoadableSubClass6']
self._compare_classes(classes, expected_class_names)