diff --git a/oslo_versionedobjects/checks.py b/oslo_versionedobjects/checks.py index b715eb82..6648a144 100644 --- a/oslo_versionedobjects/checks.py +++ b/oslo_versionedobjects/checks.py @@ -215,3 +215,31 @@ class ObjectVersionChecker(object): obj_classes = base.VersionedObjectRegistry.obj_classes()[obj_name] for obj_class in obj_classes: self._test_object_compatibility(obj_class) + + def _test_relationships_in_order(self, obj_class): + for field, versions in obj_class.obj_relationships.items(): + last_my_version = (0, 0) + last_child_version = (0, 0) + for my_version, child_version in versions: + _my_version = utils.convert_version_to_tuple(my_version) + _ch_version = utils.convert_version_to_tuple(child_version) + assert (last_my_version < _my_version + and last_child_version <= _ch_version), \ + ('Object %s relationship ' + '%s->%s for field %s is out of order') % ( + obj_class.obj_name(), my_version, + child_version, field) + last_my_version = _my_version + last_child_version = _ch_version + + def test_relationships_in_order(self): + # Iterate all object classes and verify that we can run + # obj_make_compatible with every older version than current. + # This doesn't actually test the data conversions, but it at least + # makes sure the method doesn't blow up on something basic like + # expecting the wrong version format. + all_obj_classes = base.VersionedObjectRegistry.obj_classes() + for obj_name in all_obj_classes: + obj_classes = base.VersionedObjectRegistry.obj_classes()[obj_name] + for obj_class in obj_classes: + self._test_relationships_in_order(obj_class) diff --git a/oslo_versionedobjects/tests/test_objects.py b/oslo_versionedobjects/tests/test_objects.py index 3993a30d..e6a149ef 100755 --- a/oslo_versionedobjects/tests/test_objects.py +++ b/oslo_versionedobjects/tests/test_objects.py @@ -22,7 +22,6 @@ from oslo_context import context from oslo_serialization import jsonutils from testtools import matchers -from oslo_versionedobjects import _utils as utils from oslo_versionedobjects import base from oslo_versionedobjects import checks from oslo_versionedobjects import exception @@ -464,6 +463,59 @@ class TestChecks(_BaseTestCase): mock.call(target_version='1.2'), mock.call(target_version='1.3')]) + def test_test_relationships_in_order(self): + registry = base.VersionedObjectRegistry() + checker = checks.ObjectVersionChecker() + fake_classes = {mock.sentinel.class_one: [mock.sentinel.impl_one_one, + mock.sentinel.impl_one_two], + mock.sentinel.class_two: [mock.sentinel.impl_two_one, + mock.sentinel.impl_two_two], + } + + @mock.patch.object(checker, '_test_relationships_in_order') + def test(mock_compat): + checker.test_relationships_in_order() + mock_compat.assert_has_calls( + [mock.call(mock.sentinel.impl_one_one), + mock.call(mock.sentinel.impl_one_two), + mock.call(mock.sentinel.impl_two_one), + mock.call(mock.sentinel.impl_two_two)], + any_order=True) + + with mock.patch.object(registry, '_obj_classes', new=fake_classes): + test() + + def test_test_relationships_in_order_good(self): + fake = mock.MagicMock() + fake.VERSION = '1.5' + fake.fields = {'foo': fields.ObjectField('bar')} + fake.obj_relationships = {'foo': [('1.2', '1.0'), + ('1.3', '1.2')]} + + checker = checks.ObjectVersionChecker() + checker._test_relationships_in_order(fake) + + def _test_test_relationships_in_order_bad(self, fake_rels): + fake = mock.MagicMock() + fake.VERSION = '1.5' + fake.fields = {'foo': fields.ObjectField('bar')} + fake.obj_relationships = fake_rels + checker = checks.ObjectVersionChecker() + self.assertRaises(AssertionError, + checker._test_relationships_in_order, fake) + + def test_test_relationships_in_order_bad_my_version(self): + self._test_test_relationships_in_order_bad( + {'foo': [('1.4', '1.1'), ('1.3', '1.2')]}) + + def test_test_relationships_in_order_bad_child_version(self): + self._test_test_relationships_in_order_bad( + {'foo': [('1.2', '1.3'), ('1.3', '1.2')]}) + + def test_test_relationships_in_order_bad_both_versions(self): + self._test_test_relationships_in_order_bad( + {'foo': [('1.5', '1.4'), ('1.3', '1.2')]}) + class _LocalTest(_BaseTestCase): def setUp(self): @@ -1154,31 +1206,3 @@ class TestObjectSerializer(_BaseTestCase): self.assertEqual(thing, primitive) thing2 = ser.deserialize_entity(self.context, thing) self.assertIsInstance(thing2['foo'], base.VersionedObject) - - -class TestObjectVersions(test.TestCase): - def setUp(self): - self.skip('disabled in the library for now') - - def test_obj_relationships_in_order(self): - # Iterate all object classes and verify that we can run - # obj_make_compatible with every older version than current. - # This doesn't actually test the data conversions, but it at least - # makes sure the method doesn't blow up on something basic like - # expecting the wrong version format. - for obj_name in base.VersionedObjectRegistry.obj_classes(): - obj_class = base.VersionedObjectRegistry.obj_classes()[obj_name][0] - for field, versions in obj_class.obj_relationships.items(): - last_my_version = (0, 0) - last_child_version = (0, 0) - for my_version, child_version in versions: - _my_version = utils.convert_version_to_tuple(my_version) - _ch_version = utils.convert_version_to_tuple(child_version) - self.assertTrue((last_my_version < _my_version - and last_child_version <= _ch_version), - 'Object %s relationship ' - '%s->%s for field %s is out of order' % ( - obj_name, my_version, child_version, - field)) - last_my_version = _my_version - last_child_version = _ch_version