summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRui Chen <chenrui.momo@gmail.com>2015-11-28 18:07:16 +0800
committerRui Chen <chenrui.momo@gmail.com>2015-12-01 19:57:15 +0800
commit7c18662e748c51645497d2ecd6372e24eee1adf8 (patch)
tree635ddb7b75ec5bfaee8f0b3762640160698edd1c
parentcdb47d9646236e19208b7e49ffc6c7d42000dd89 (diff)
downloadpython-ceilometerclient-7c18662e748c51645497d2ecd6372e24eee1adf8.tar.gz
Fix Resource.__eq__ mismatch semantics of object equal
The __eq__ of apiclient.base.Resource will return True, if the two objects have same id, even if they have different other attributes value. The behavior is weird and don't match the semantics of object equal. The objects that have different value should be different objects. Fix this issue and add some test cases in this patch. Change-Id: Ieb28aa179bda945686e0d9c2f341c373ce2bab74 Closes-Bug: #1499369
-rw-r--r--ceilometerclient/openstack/common/apiclient/base.py2
-rw-r--r--ceilometerclient/tests/unit/test_openstack_common.py45
2 files changed, 45 insertions, 2 deletions
diff --git a/ceilometerclient/openstack/common/apiclient/base.py b/ceilometerclient/openstack/common/apiclient/base.py
index 53aad2a..8493b44 100644
--- a/ceilometerclient/openstack/common/apiclient/base.py
+++ b/ceilometerclient/openstack/common/apiclient/base.py
@@ -518,8 +518,6 @@ class Resource(object):
# two resources of different types are not equal
if not isinstance(other, self.__class__):
return False
- if hasattr(self, 'id') and hasattr(other, 'id'):
- return self.id == other.id
return self._info == other._info
def is_loaded(self):
diff --git a/ceilometerclient/tests/unit/test_openstack_common.py b/ceilometerclient/tests/unit/test_openstack_common.py
new file mode 100644
index 0000000..9fea065
--- /dev/null
+++ b/ceilometerclient/tests/unit/test_openstack_common.py
@@ -0,0 +1,45 @@
+# Copyright 2015 Huawei.
+# 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.
+
+from ceilometerclient.common import base
+from ceilometerclient.tests.unit import utils
+from ceilometerclient.v2 import events
+
+
+class BaseTest(utils.BaseTestCase):
+
+ def test_two_resources_with_same_id_are_not_equal(self):
+ # Two resources with same ID: never equal if their info is not equal
+ r1 = base.Resource(None, {'id': 1, 'name': 'hi'})
+ r2 = base.Resource(None, {'id': 1, 'name': 'hello'})
+ self.assertNotEqual(r1, r2)
+
+ def test_two_resources_with_same_id_and_info_are_equal(self):
+ # Two resources with same ID: equal if their info is equal
+ r1 = base.Resource(None, {'id': 1, 'name': 'hello'})
+ r2 = base.Resource(None, {'id': 1, 'name': 'hello'})
+ self.assertEqual(r1, r2)
+
+ def test_two_resources_with_diff_type_are_not_equal(self):
+ # Two resoruces of different types: never equal
+ r1 = base.Resource(None, {'id': 1})
+ r2 = events.Event(None, {'id': 1})
+ self.assertNotEqual(r1, r2)
+
+ def test_two_resources_with_no_id_are_equal(self):
+ # Two resources with no ID: equal if their info is equal
+ r1 = base.Resource(None, {'name': 'joe', 'age': 12})
+ r2 = base.Resource(None, {'name': 'joe', 'age': 12})
+ self.assertEqual(r1, r2)