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