diff --git a/Makefile.am b/Makefile.am index 875cd123708b6b88f8e3db5dcb75710b34c3b480..b4d3aeaa944d33ac2bbc1687e65cc327f924487a 100644 --- a/Makefile.am +++ b/Makefile.am @@ -231,6 +231,7 @@ dist_TESTS = \ test/ganeti.hooks_unittest.py \ test/ganeti.http_unittest.py \ test/ganeti.locking_unittest.py \ + test/ganeti.objects_unittest.py \ test/ganeti.rapi.resources_unittest.py \ test/ganeti.serializer_unittest.py \ test/ganeti.ssh_unittest.py \ diff --git a/lib/objects.py b/lib/objects.py index 1cdc98f11ba304e6cd6a7b7c0597aee74577937b..5c879069b1288f6ea7338cae305595ae2cf4819b 100644 --- a/lib/objects.py +++ b/lib/objects.py @@ -104,13 +104,6 @@ class ConfigObject(object): raise KeyError(key) setattr(self, key, value) - def __getstate__(self): - state = {} - for name in self.__slots__: - if hasattr(self, name): - state[name] = getattr(self, name) - return state - def __setstate__(self, state): for name in state: if name in self.__slots__: @@ -126,7 +119,14 @@ class ConfigObject(object): make sure all objects returned are only standard python types. """ - return dict([(k, getattr(self, k, None)) for k in self.__slots__]) + result = {} + for name in self.__slots__: + value = getattr(self, name, None) + if value is not None: + result[name] = value + return result + + __getstate__ = ToDict @classmethod def FromDict(cls, val): diff --git a/test/ganeti.objects_unittest.py b/test/ganeti.objects_unittest.py new file mode 100755 index 0000000000000000000000000000000000000000..fdea939c71f16b65d3e49db886c594edb156f8d1 --- /dev/null +++ b/test/ganeti.objects_unittest.py @@ -0,0 +1,48 @@ +#!/usr/bin/python +# + +# Copyright (C) 2006, 2007, 2008 Google Inc. +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA +# 0.0510-1301, USA. + + +"""Script for unittesting the objects module""" + + +import unittest + +from ganeti import objects + +class SimpleObject(objects.ConfigObject): + __slots__ = ['a', 'b'] + +class TestDictState(unittest.TestCase): + """Simple dict tansformation tests""" + + def testSimpleObjectToDict(self): + o1 = SimpleObject(a='1') + self.assertEquals(o1.ToDict(), {'a': '1'}) + self.assertEquals(o1.__getstate__(), {'a': '1'}) + self.assertEquals(o1.__getstate__(), o1.ToDict()) + o1.a = 2 + o1.b = 5 + self.assertEquals(o1.ToDict(), {'a': 2, 'b': 5}) + o2 = SimpleObject.FromDict(o1.ToDict()) + self.assertEquals(o1.ToDict(), {'a': 2, 'b': 5}) + + +if __name__ == '__main__': + unittest.main()