]> review.fuel-infra Code Review - openstack-build/cinder-build.git/commitdiff
Fix cinder objects unit test registration
authorMatt Riedemann <mriedem@us.ibm.com>
Tue, 10 Nov 2015 23:45:29 +0000 (15:45 -0800)
committerMatt Riedemann <mriedem@us.ibm.com>
Wed, 11 Nov 2015 21:06:36 +0000 (13:06 -0800)
The base test case was extending test code from oslo_versionedobjects
which is bad because (1) it was adding test objects from the o.vo
registry into the cinder object registry and (2) it was extending
internal private test classes from o.vo which are subject to change and
would break cinder.

This cleans up the base test case and object registration to basically
do it the same way that nova does.

It also moves the duplicate _compare() method into the base class and
fixes a bug where db obj fields that were lists were compared
incorrectly against object lists.

This will allow us to verify object version hashes using o.vo's
ObjectVersionChecker fixture in a follow on change without the
extraneous object registrations from o.vo messing with the results.

Partial-Bug: #1514926

Change-Id: Ie34675e378951cda9aa218f3181dc86767717450

cinder/test.py
cinder/tests/unit/__init__.py
cinder/tests/unit/objects/__init__.py
cinder/tests/unit/objects/test_backup.py
cinder/tests/unit/objects/test_cgsnapshot.py
cinder/tests/unit/objects/test_consistencygroup.py
cinder/tests/unit/objects/test_service.py
cinder/tests/unit/objects/test_snapshot.py
cinder/tests/unit/objects/test_volume.py
cinder/tests/unit/objects/test_volume_attachment.py
cinder/tests/unit/objects/test_volume_type.py

index d0601802a2bc89e564e6e60e35034255f86e2d43..a06e4439482271d52a0db55ecb7549752f11b5d9 100644 (file)
@@ -42,7 +42,6 @@ from cinder.common import config  # noqa Need to register global_opts
 from cinder.db import migration
 from cinder.db.sqlalchemy import api as sqla_api
 from cinder import i18n
-from cinder import objects
 from cinder import rpc
 from cinder import service
 from cinder.tests.unit import conf_fixture
@@ -149,9 +148,6 @@ class TestCase(testtools.TestCase):
                        side_effect=self._get_joined_notifier)
         p.start()
 
-        # Import cinder objects for test cases
-        objects.register_all()
-
         # Unit tests do not need to use lazy gettext
         i18n.enable_lazy(False)
 
index 35f2079f6153e41044d705b98e4b3a0af5fdce20..f59fa3d6ed5767cdbed661c9a9e0e5c4fa0407ca 100644 (file)
 import eventlet
 from six.moves import builtins
 
+from cinder import objects
+
 eventlet.monkey_patch()
 
 # See http://code.google.com/p/python-nose/issues/detail?id=373
 # The code below enables nosetests to work with i18n _() blocks
 setattr(builtins, '_', lambda x: x)
+
+# NOTE(alaski): Make sure this is done after eventlet monkey patching otherwise
+# the threading.local() store used in oslo_messaging will be initialized to
+# threadlocal storage rather than greenthread local.  This will cause context
+# sets and deletes in that storage to clobber each other.
+# NOTE(comstud): Make sure we have all of the objects loaded. We do this
+# at module import time, because we may be using mock decorators in our
+# tests that run at import time.
+objects.register_all()
index b62125f9ac012f8772dbab4924e40e59cc33eedd..c697b391d197fa4b82222b8d6012ffd34070214f 100644 (file)
@@ -1,10 +1,49 @@
-from oslo_versionedobjects.tests import test_objects
+#    Copyright 2015 IBM Corp.
+#
+#    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.
 
-from cinder import objects
+from oslo_utils import timeutils
 
+from cinder import context
+from cinder.objects import base as obj_base
+from cinder import test
 
-class BaseObjectsTestCase(test_objects._LocalTest):
+
+class BaseObjectsTestCase(test.TestCase):
     def setUp(self):
         super(BaseObjectsTestCase, self).setUp()
-        # Import cinder objects for test cases
-        objects.register_all()
+        self.user_id = 'fake-user'
+        self.project_id = 'fake-project'
+        self.context = context.RequestContext(self.user_id, self.project_id,
+                                              is_admin=False)
+        # We only test local right now.
+        # TODO(mriedem): Testing remote would be nice...
+        self.assertIsNone(obj_base.CinderObject.indirection_api)
+
+    # TODO(mriedem): Replace this with
+    # oslo_versionedobjects.fixture.compare_obj when that is in a released
+    # version of o.vo.
+    @staticmethod
+    def _compare(test, db, obj):
+        for field, value in db.items():
+            if not hasattr(obj, field):
+                continue
+
+            if field in ('modified_at', 'created_at',
+                         'updated_at', 'deleted_at') and db[field]:
+                test.assertEqual(db[field],
+                                 timeutils.normalize_time(obj[field]))
+            elif isinstance(obj[field], obj_base.ObjectListBase):
+                test.assertEqual(db[field], obj[field].objects)
+            else:
+                test.assertEqual(db[field], obj[field])
index 9ebb50c8d12ddc1af6a6015156f0d0c1f121cabd..e5ba470b7f22cd4b68cc30c22a28c28e6e445156 100644 (file)
@@ -14,7 +14,6 @@
 
 import mock
 
-from cinder import context
 from cinder import exception
 from cinder import objects
 from cinder.tests.unit import fake_volume
@@ -37,18 +36,6 @@ fake_backup = {
 
 
 class TestBackup(test_objects.BaseObjectsTestCase):
-    def setUp(self):
-        super(TestBackup, self).setUp()
-        # NOTE (e0ne): base tests contains original RequestContext from
-        # oslo_context. We change it to our RequestContext implementation
-        # to have 'elevated' method
-        self.context = context.RequestContext(self.user_id, self.project_id,
-                                              is_admin=False)
-
-    @staticmethod
-    def _compare(test, db, obj):
-        for field, value in db.items():
-            test.assertEqual(db[field], obj[field])
 
     @mock.patch('cinder.db.backup_get', return_value=fake_backup)
     def test_get_by_id(self, backup_get):
index d72225084b73c1837b39556261f74f1782b1e8c6..b846df237b9a3df4679e498f14a330b542346d80 100644 (file)
@@ -14,7 +14,6 @@
 
 import mock
 
-from cinder import context
 from cinder import exception
 from cinder import objects
 from cinder.tests.unit import objects as test_objects
@@ -33,20 +32,6 @@ fake_cgsnapshot = {
 
 
 class TestCGSnapshot(test_objects.BaseObjectsTestCase):
-    def setUp(self):
-        super(TestCGSnapshot, self).setUp()
-        # NOTE (e0ne): base tests contains original RequestContext from
-        # oslo_context. We change it to our RequestContext implementation
-        # to have 'elevated' method
-        self.user_id = 123
-        self.project_id = 456
-        self.context = context.RequestContext(self.user_id, self.project_id,
-                                              is_admin=False)
-
-    @staticmethod
-    def _compare(test, db, obj):
-        for field, value in db.items():
-            test.assertEqual(db[field], getattr(obj, field))
 
     @mock.patch('cinder.db.cgsnapshot_get',
                 return_value=fake_cgsnapshot)
index 0f24a30a2480bff4132ca4393652391e3de1d05a..9743e3c3b42720f6f5208bf6a128955b71a6b262 100644 (file)
@@ -14,7 +14,6 @@
 
 import mock
 
-from cinder import context
 from cinder import exception
 from cinder import objects
 from cinder.tests.unit import objects as test_objects
@@ -35,20 +34,6 @@ fake_consistencygroup = {
 
 
 class TestConsistencyGroup(test_objects.BaseObjectsTestCase):
-    def setUp(self):
-        super(TestConsistencyGroup, self).setUp()
-        # NOTE (e0ne): base tests contains original RequestContext from
-        # oslo_context. We change it to our RequestContext implementation
-        # to have 'elevated' method
-        self.user_id = 123
-        self.project_id = 456
-        self.context = context.RequestContext(self.user_id, self.project_id,
-                                              is_admin=False)
-
-    @staticmethod
-    def _compare(test, db, obj):
-        for field, value in db.items():
-            test.assertEqual(db[field], getattr(obj, field))
 
     @mock.patch('cinder.db.consistencygroup_get',
                 return_value=fake_consistencygroup)
index b91ef3d02eae1e65a68ecdc07d2c21b085cfa424..89f0739713615d3d8ae1dfc599cca58d278736ad 100644 (file)
 
 import mock
 
-from oslo_utils import timeutils
-
-from cinder import context
 from cinder import objects
 from cinder.tests.unit import fake_service
 from cinder.tests.unit import objects as test_objects
 
 
 class TestService(test_objects.BaseObjectsTestCase):
-    def setUp(self):
-        super(TestService, self).setUp()
-        # NOTE (e0ne): base tests contains original RequestContext from
-        # oslo_context. We change it to our RequestContext implementation
-        # to have 'elevated' method
-        self.context = context.RequestContext(self.user_id, self.project_id,
-                                              is_admin=False)
-
-    @staticmethod
-    def _compare(test, db, obj):
-        for field, value in db.items():
-            if field in ('modified_at', 'created_at',
-                         'updated_at', 'deleted_at') and db[field]:
-                test.assertEqual(db[field],
-                                 timeutils.normalize_time(obj[field]))
-            else:
-                test.assertEqual(db[field], obj[field])
 
     @mock.patch('cinder.db.service_get')
     def test_get_by_id(self, service_get):
index e0efce88b26552e8d497e8120d8f3def117691d1..3237d26e4d5a328b1beb421e1b0eff2e86ff90d0 100644 (file)
@@ -47,11 +47,6 @@ fake_snapshot_obj = {
 
 
 class TestSnapshot(test_objects.BaseObjectsTestCase):
-    @staticmethod
-    def _compare(test, expected, actual):
-        for field, value in expected.items():
-            test.assertEqual(expected[field], actual[field],
-                             "Field '%s' is not equal" % field)
 
     @mock.patch('cinder.db.snapshot_get', return_value=fake_db_snapshot)
     def test_get_by_id(self, snapshot_get):
index 8cadcafde327506cd27aa1a320692c542cd7b943..d50f0b79f6de3da6706ac91a410b94b412e1df8f 100644 (file)
@@ -21,21 +21,6 @@ from cinder.tests.unit import objects as test_objects
 
 
 class TestVolume(test_objects.BaseObjectsTestCase):
-    def setUp(self):
-        super(TestVolume, self).setUp()
-        # NOTE (e0ne): base tests contains original RequestContext from
-        # oslo_context. We change it to our RequestContext implementation
-        # to have 'elevated' method
-        self.context = context.RequestContext(self.user_id, self.project_id,
-                                              is_admin=False)
-
-    @staticmethod
-    def _compare(test, db, obj):
-        for field, value in db.items():
-            if not hasattr(obj, field):
-                continue
-
-            test.assertEqual(db[field], obj[field])
 
     @mock.patch('cinder.db.volume_glance_metadata_get', return_value={})
     @mock.patch('cinder.db.volume_get')
index bce660696f5da33c24f98b7840286d202c0b541e..0bd8c2ec4da9d5e83347fc3d3c7485ad30be5c2f 100644 (file)
@@ -20,10 +20,6 @@ from cinder.tests.unit import objects as test_objects
 
 
 class TestVolumeAttachment(test_objects.BaseObjectsTestCase):
-    @staticmethod
-    def _compare(test, db, obj):
-        for field, value in db.items():
-            test.assertEqual(db[field], obj[field])
 
     @mock.patch('cinder.db.volume_attachment_get')
     def test_get_by_id(self, volume_attachment_get):
index d0453513c5ba8e299ff9f4a862303934cc9c2967..ad22bd36c299b1c0cd411e3bb2c0dcc7a9b965c7 100644 (file)
 
 import mock
 
-from cinder import context
 from cinder import objects
 from cinder.tests.unit import fake_volume
 from cinder.tests.unit import objects as test_objects
 
 
 class TestVolumeType(test_objects.BaseObjectsTestCase):
-    def setUp(self):
-        super(TestVolumeType, self).setUp()
-        # NOTE (e0ne): base tests contains original RequestContext from
-        # oslo_context. We change it to our RequestContext implementation
-        # to have 'elevated' method
-        self.context = context.RequestContext(self.user_id, self.project_id,
-                                              is_admin=False)
-
-    @staticmethod
-    def _compare(test, db, obj):
-        for field, value in db.items():
-            test.assertEqual(db[field], obj[field])
 
     @mock.patch('cinder.db.volume_type_get')
     def test_get_by_id(self, volume_type_get):