Revision 560ef132 test/py/ganeti.serializer_unittest.py

b/test/py/ganeti.serializer_unittest.py
22 22
"""Script for unittesting the serializer module"""
23 23

  
24 24

  
25
import doctest
25 26
import unittest
26 27

  
27
from ganeti import serializer
28 28
from ganeti import errors
29 29
from ganeti import ht
30
from ganeti import objects
31
from ganeti import serializer
30 32

  
31 33
import testutils
32 34

  
......
39 41
    255,
40 42
    [1, 2, 3],
41 43
    (1, 2, 3),
42
    { "1": 2, "foo": "bar", },
44
    {"1": 2,
45
     "foo": "bar"},
43 46
    ["abc", 1, 2, 3, 999,
44 47
      {
45 48
        "a1": ("Hello", "World"),
46 49
        "a2": "This is only a test",
47 50
        "a3": None,
48
        },
49
      {
50
        "foo": "bar",
51
        },
52
      ]
51
        "osparams:": serializer.PrivateDict({
52
                      "foo": 5,
53
                     })
54
      }
53 55
    ]
56
  ]
54 57

  
55 58
  def _TestSerializer(self, dump_fn, load_fn):
59
    _dump_fn = lambda data: dump_fn(
60
      data,
61
      private_encoder=serializer.EncodeWithPrivateFields
62
    )
56 63
    for data in self._TESTDATA:
57
      self.failUnless(dump_fn(data).endswith("\n"))
58
      self.assertEqualValues(load_fn(dump_fn(data)), data)
64
      self.failUnless(_dump_fn(data).endswith("\n"))
65
      self.assertEqualValues(load_fn(_dump_fn(data)), data)
59 66

  
60 67
  def testGeneric(self):
61 68
    self._TestSerializer(serializer.Dump, serializer.Load)
......
70 77
    self._TestSigned(serializer.DumpSignedJson, serializer.LoadSignedJson)
71 78

  
72 79
  def _TestSigned(self, dump_fn, load_fn):
80
    _dump_fn = lambda *args, **kwargs: dump_fn(
81
      *args,
82
      private_encoder=serializer.EncodeWithPrivateFields,
83
      **kwargs
84
    )
73 85
    for data in self._TESTDATA:
74
      self.assertEqualValues(load_fn(dump_fn(data, "mykey"), "mykey"),
86
      self.assertEqualValues(load_fn(_dump_fn(data, "mykey"), "mykey"),
75 87
                             (data, ""))
76
      self.assertEqualValues(load_fn(dump_fn(data, "myprivatekey",
77
                                             salt="mysalt"),
88
      self.assertEqualValues(load_fn(_dump_fn(data, "myprivatekey",
89
                                              salt="mysalt"),
78 90
                                     "myprivatekey"),
79 91
                             (data, "mysalt"))
80 92

  
81 93
      keydict = {
82 94
        "mykey_id": "myprivatekey",
83 95
        }
84
      self.assertEqualValues(load_fn(dump_fn(data, "myprivatekey",
85
                                             salt="mysalt",
86
                                             key_selector="mykey_id"),
96
      self.assertEqualValues(load_fn(_dump_fn(data, "myprivatekey",
97
                                              salt="mysalt",
98
                                              key_selector="mykey_id"),
87 99
                                     keydict.get),
88 100
                             (data, "mysalt"))
89 101
      self.assertRaises(errors.SignatureError, load_fn,
90
                        dump_fn(data, "myprivatekey",
91
                                salt="mysalt",
92
                                key_selector="mykey_id"),
102
                        _dump_fn(data, "myprivatekey",
103
                                 salt="mysalt",
104
                                 key_selector="mykey_id"),
93 105
                        {}.get)
94 106

  
95 107
    self.assertRaises(errors.SignatureError, load_fn,
96
                      dump_fn("test", "myprivatekey"),
108
                      _dump_fn("test", "myprivatekey"),
97 109
                      "myotherkey")
98 110

  
99 111
    self.assertRaises(errors.SignatureError, load_fn,
......
131 143
    self.assertEqual(serializer.LoadAndVerifyJson("\"Foo\"", ht.TAny), "Foo")
132 144

  
133 145

  
146
class TestPrivate(unittest.TestCase):
147

  
148
  def testEquality(self):
149
    pDict = serializer.PrivateDict()
150
    pDict["bar"] = "egg"
151
    nDict = {"bar": "egg"}
152
    self.assertEqual(pDict, nDict, "PrivateDict-dict equality failure")
153

  
154
  def testPrivateDictUnprivate(self):
155
    pDict = serializer.PrivateDict()
156
    pDict["bar"] = "egg"
157
    uDict = pDict.Unprivate()
158
    nDict = {"bar": "egg"}
159
    self.assertEquals(type(uDict), dict,
160
                      "PrivateDict.Unprivate() did not return a dict")
161
    self.assertEqual(pDict, uDict, "PrivateDict.Unprivate() equality failure")
162
    self.assertEqual(nDict, uDict, "PrivateDict.Unprivate() failed to return")
163

  
164
  def testAttributeTransparency(self):
165
    class Dummy(object):
166
      pass
167

  
168
    dummy = Dummy()
169
    dummy.bar = "egg"
170
    pDummy = serializer.Private(dummy)
171
    self.assertEqual(pDummy.bar, "egg", "Failed to access attribute of Private")
172

  
173
  def testCallTransparency(self):
174
    foo = serializer.Private("egg")
175
    self.assertEqual(foo.upper(), "EGG", "Failed to call Private instance")
176

  
177
  def testFillDict(self):
178
    pDict = serializer.PrivateDict()
179
    pDict["bar"] = "egg"
180
    self.assertEqual(pDict, objects.FillDict({}, pDict))
181

  
182
  def testLeak(self):
183
    pDict = serializer.PrivateDict()
184
    pDict["bar"] = "egg"
185
    self.assertNotIn("egg", str(pDict), "Value leaked in str(PrivateDict)")
186
    self.assertNotIn("egg", repr(pDict), "Value leaked in repr(PrivateDict)")
187
    self.assertNotIn("egg", "{0}".format(pDict),
188
                     "Value leaked in PrivateDict.__format__")
189
    self.assertNotIn("egg", serializer.Dump(pDict),
190
                     "Value leaked in serializer.Dump(PrivateDict)")
191

  
192
  def testProperAccess(self):
193
    pDict = serializer.PrivateDict()
194
    pDict["bar"] = "egg"
195

  
196
    self.assertIs("egg", pDict["bar"].Get(),
197
                  "Value not returned by Private.Get()")
198
    self.assertIs("egg", pDict.GetPrivate("bar"),
199
                  "Value not returned by Private.GetPrivate()")
200
    self.assertIs("egg", pDict.Unprivate()["bar"],
201
                  "Value not returned by PrivateDict.Unprivate()")
202
    self.assertIn(
203
      "egg",
204
      serializer.Dump(pDict,
205
                      private_encoder=serializer.EncodeWithPrivateFields)
206
    )
207

  
208
  def testDictGet(self):
209
    self.assertIs("tar", serializer.PrivateDict().GetPrivate("bar", "tar"),
210
                  "Private.GetPrivate() did not handle the default case")
211

  
212
  def testZeronessPrivate(self):
213
    self.assertTrue(serializer.Private("foo"),
214
                    "Private of non-empty string is false")
215
    self.assertFalse(serializer.Private(""), "Private empty string is true")
216

  
217

  
218
class TestCheckDoctests(unittest.TestCase):
219

  
220
  def testCheckSerializer(self):
221
    results = doctest.testmod(serializer)
222
    self.assertEquals(results.failed, 0, "Doctest failures detected")
223

  
134 224
if __name__ == "__main__":
135 225
  testutils.GanetiTestProgram()

Also available in: Unified diff