root / test / py / ganeti.rapi.baserlib_unittest.py @ f41b569f
History | View | Annotate | Download (5.4 kB)
1 | cfaeaaf7 | Michael Hanselmann | #!/usr/bin/python
|
---|---|---|---|
2 | cfaeaaf7 | Michael Hanselmann | #
|
3 | cfaeaaf7 | Michael Hanselmann | |
4 | cfaeaaf7 | Michael Hanselmann | # Copyright (C) 2011 Google Inc.
|
5 | cfaeaaf7 | Michael Hanselmann | #
|
6 | cfaeaaf7 | Michael Hanselmann | # This program is free software; you can redistribute it and/or modify
|
7 | cfaeaaf7 | Michael Hanselmann | # it under the terms of the GNU General Public License as published by
|
8 | cfaeaaf7 | Michael Hanselmann | # the Free Software Foundation; either version 2 of the License, or
|
9 | cfaeaaf7 | Michael Hanselmann | # (at your option) any later version.
|
10 | cfaeaaf7 | Michael Hanselmann | #
|
11 | cfaeaaf7 | Michael Hanselmann | # This program is distributed in the hope that it will be useful, but
|
12 | cfaeaaf7 | Michael Hanselmann | # WITHOUT ANY WARRANTY; without even the implied warranty of
|
13 | cfaeaaf7 | Michael Hanselmann | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
14 | cfaeaaf7 | Michael Hanselmann | # General Public License for more details.
|
15 | cfaeaaf7 | Michael Hanselmann | #
|
16 | cfaeaaf7 | Michael Hanselmann | # You should have received a copy of the GNU General Public License
|
17 | cfaeaaf7 | Michael Hanselmann | # along with this program; if not, write to the Free Software
|
18 | cfaeaaf7 | Michael Hanselmann | # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
|
19 | cfaeaaf7 | Michael Hanselmann | # 02110-1301, USA.
|
20 | cfaeaaf7 | Michael Hanselmann | |
21 | cfaeaaf7 | Michael Hanselmann | |
22 | cfaeaaf7 | Michael Hanselmann | """Script for testing ganeti.rapi.baserlib"""
|
23 | cfaeaaf7 | Michael Hanselmann | |
24 | cfaeaaf7 | Michael Hanselmann | import unittest |
25 | f6ce0ba2 | Michael Hanselmann | import itertools |
26 | cfaeaaf7 | Michael Hanselmann | |
27 | cfaeaaf7 | Michael Hanselmann | from ganeti import errors |
28 | cfaeaaf7 | Michael Hanselmann | from ganeti import opcodes |
29 | cfaeaaf7 | Michael Hanselmann | from ganeti import ht |
30 | cfaeaaf7 | Michael Hanselmann | from ganeti import http |
31 | f6ce0ba2 | Michael Hanselmann | from ganeti import compat |
32 | cfaeaaf7 | Michael Hanselmann | from ganeti.rapi import baserlib |
33 | cfaeaaf7 | Michael Hanselmann | |
34 | cfaeaaf7 | Michael Hanselmann | import testutils |
35 | cfaeaaf7 | Michael Hanselmann | |
36 | cfaeaaf7 | Michael Hanselmann | |
37 | cfaeaaf7 | Michael Hanselmann | class TestFillOpcode(unittest.TestCase): |
38 | ff0d18e6 | Iustin Pop | class OpTest(opcodes.OpCode): |
39 | cfaeaaf7 | Michael Hanselmann | OP_PARAMS = [ |
40 | 197b323b | Michael Hanselmann | ("test", None, ht.TMaybeString, None), |
41 | cfaeaaf7 | Michael Hanselmann | ] |
42 | cfaeaaf7 | Michael Hanselmann | |
43 | cfaeaaf7 | Michael Hanselmann | def test(self): |
44 | cfaeaaf7 | Michael Hanselmann | for static in [None, {}]: |
45 | ff0d18e6 | Iustin Pop | op = baserlib.FillOpcode(self.OpTest, {}, static)
|
46 | ff0d18e6 | Iustin Pop | self.assertTrue(isinstance(op, self.OpTest)) |
47 | cfaeaaf7 | Michael Hanselmann | self.assertFalse(hasattr(op, "test")) |
48 | cfaeaaf7 | Michael Hanselmann | |
49 | cfaeaaf7 | Michael Hanselmann | def testStatic(self): |
50 | ff0d18e6 | Iustin Pop | op = baserlib.FillOpcode(self.OpTest, {}, {"test": "abc"}) |
51 | ff0d18e6 | Iustin Pop | self.assertTrue(isinstance(op, self.OpTest)) |
52 | cfaeaaf7 | Michael Hanselmann | self.assertEqual(op.test, "abc") |
53 | cfaeaaf7 | Michael Hanselmann | |
54 | cfaeaaf7 | Michael Hanselmann | # Overwrite static parameter
|
55 | cfaeaaf7 | Michael Hanselmann | self.assertRaises(http.HttpBadRequest, baserlib.FillOpcode,
|
56 | ff0d18e6 | Iustin Pop | self.OpTest, {"test": 123}, {"test": "abc"}) |
57 | cfaeaaf7 | Michael Hanselmann | |
58 | cfaeaaf7 | Michael Hanselmann | def testType(self): |
59 | cfaeaaf7 | Michael Hanselmann | self.assertRaises(http.HttpBadRequest, baserlib.FillOpcode,
|
60 | ff0d18e6 | Iustin Pop | self.OpTest, {"test": [1, 2, 3]}, {}) |
61 | cfaeaaf7 | Michael Hanselmann | |
62 | cfaeaaf7 | Michael Hanselmann | def testStaticType(self): |
63 | cfaeaaf7 | Michael Hanselmann | self.assertRaises(http.HttpBadRequest, baserlib.FillOpcode,
|
64 | ff0d18e6 | Iustin Pop | self.OpTest, {}, {"test": [1, 2, 3]}) |
65 | cfaeaaf7 | Michael Hanselmann | |
66 | cfaeaaf7 | Michael Hanselmann | def testUnicode(self): |
67 | ff0d18e6 | Iustin Pop | op = baserlib.FillOpcode(self.OpTest, {u"test": "abc"}, {}) |
68 | ff0d18e6 | Iustin Pop | self.assertTrue(isinstance(op, self.OpTest)) |
69 | cfaeaaf7 | Michael Hanselmann | self.assertEqual(op.test, "abc") |
70 | cfaeaaf7 | Michael Hanselmann | |
71 | ff0d18e6 | Iustin Pop | op = baserlib.FillOpcode(self.OpTest, {}, {u"test": "abc"}) |
72 | ff0d18e6 | Iustin Pop | self.assertTrue(isinstance(op, self.OpTest)) |
73 | cfaeaaf7 | Michael Hanselmann | self.assertEqual(op.test, "abc") |
74 | cfaeaaf7 | Michael Hanselmann | |
75 | cfaeaaf7 | Michael Hanselmann | def testUnknownParameter(self): |
76 | cfaeaaf7 | Michael Hanselmann | self.assertRaises(http.HttpBadRequest, baserlib.FillOpcode,
|
77 | ff0d18e6 | Iustin Pop | self.OpTest, {"othervalue": 123}, None) |
78 | cfaeaaf7 | Michael Hanselmann | |
79 | cfaeaaf7 | Michael Hanselmann | def testInvalidBody(self): |
80 | cfaeaaf7 | Michael Hanselmann | self.assertRaises(http.HttpBadRequest, baserlib.FillOpcode,
|
81 | ff0d18e6 | Iustin Pop | self.OpTest, "", None) |
82 | cfaeaaf7 | Michael Hanselmann | self.assertRaises(http.HttpBadRequest, baserlib.FillOpcode,
|
83 | ff0d18e6 | Iustin Pop | self.OpTest, range(10), None) |
84 | cfaeaaf7 | Michael Hanselmann | |
85 | b166ef84 | Michael Hanselmann | def testRenameBothSpecified(self): |
86 | b166ef84 | Michael Hanselmann | self.assertRaises(http.HttpBadRequest, baserlib.FillOpcode,
|
87 | b166ef84 | Michael Hanselmann | self.OpTest, { "old": 123, "new": 999, }, None, |
88 | b166ef84 | Michael Hanselmann | rename={ "old": "new", }) |
89 | b166ef84 | Michael Hanselmann | |
90 | b166ef84 | Michael Hanselmann | def testRename(self): |
91 | b166ef84 | Michael Hanselmann | value = "Hello World"
|
92 | b166ef84 | Michael Hanselmann | op = baserlib.FillOpcode(self.OpTest, { "data": value, }, None, |
93 | b166ef84 | Michael Hanselmann | rename={ "data": "test", }) |
94 | b166ef84 | Michael Hanselmann | self.assertEqual(op.test, value)
|
95 | b166ef84 | Michael Hanselmann | |
96 | b166ef84 | Michael Hanselmann | def testRenameStatic(self): |
97 | b166ef84 | Michael Hanselmann | self.assertRaises(http.HttpBadRequest, baserlib.FillOpcode,
|
98 | b166ef84 | Michael Hanselmann | self.OpTest, { "data": 0, }, { "test": None, }, |
99 | b166ef84 | Michael Hanselmann | rename={ "data": "test", }) |
100 | b166ef84 | Michael Hanselmann | |
101 | cfaeaaf7 | Michael Hanselmann | |
102 | c08fd0d6 | Michael Hanselmann | class TestOpcodeResource(unittest.TestCase): |
103 | f6ce0ba2 | Michael Hanselmann | @staticmethod
|
104 | f6ce0ba2 | Michael Hanselmann | def _MakeClass(method, attrs): |
105 | f6ce0ba2 | Michael Hanselmann | return type("Test%s" % method, (baserlib.OpcodeResource, ), attrs) |
106 | f6ce0ba2 | Michael Hanselmann | |
107 | f6ce0ba2 | Michael Hanselmann | @staticmethod
|
108 | f6ce0ba2 | Michael Hanselmann | def _GetMethodAttributes(method): |
109 | f6ce0ba2 | Michael Hanselmann | attrs = ["%s_OPCODE" % method, "%s_RENAME" % method, |
110 | f6ce0ba2 | Michael Hanselmann | "Get%sOpInput" % method.capitalize()]
|
111 | f6ce0ba2 | Michael Hanselmann | assert attrs == dict((opattrs[0], list(opattrs[1:])) |
112 | c3a5176f | Michael Hanselmann | for opattrs in baserlib.OPCODE_ATTRS)[method] |
113 | f6ce0ba2 | Michael Hanselmann | return attrs
|
114 | c08fd0d6 | Michael Hanselmann | |
115 | f6ce0ba2 | Michael Hanselmann | def test(self): |
116 | f6ce0ba2 | Michael Hanselmann | for method in baserlib._SUPPORTED_METHODS: |
117 | f6ce0ba2 | Michael Hanselmann | # Empty handler
|
118 | 61f8fda4 | Michele Tartara | obj = self._MakeClass(method, {})(None, {}, None) |
119 | c3a5176f | Michael Hanselmann | for attr in itertools.chain(*baserlib.OPCODE_ATTRS): |
120 | f6ce0ba2 | Michael Hanselmann | self.assertFalse(hasattr(obj, attr)) |
121 | f6ce0ba2 | Michael Hanselmann | |
122 | f6ce0ba2 | Michael Hanselmann | # Direct handler function
|
123 | f6ce0ba2 | Michael Hanselmann | obj = self._MakeClass(method, {
|
124 | f6ce0ba2 | Michael Hanselmann | method: lambda _: None, |
125 | 61f8fda4 | Michele Tartara | })(None, {}, None) |
126 | f6ce0ba2 | Michael Hanselmann | self.assertFalse(compat.all(hasattr(obj, attr) |
127 | f6ce0ba2 | Michael Hanselmann | for i in baserlib._SUPPORTED_METHODS |
128 | f6ce0ba2 | Michael Hanselmann | for attr in self._GetMethodAttributes(i))) |
129 | f6ce0ba2 | Michael Hanselmann | |
130 | f6ce0ba2 | Michael Hanselmann | # Let metaclass define handler function
|
131 | f6ce0ba2 | Michael Hanselmann | for opcls in [None, object()]: |
132 | f6ce0ba2 | Michael Hanselmann | obj = self._MakeClass(method, {
|
133 | f6ce0ba2 | Michael Hanselmann | "%s_OPCODE" % method: opcls,
|
134 | 61f8fda4 | Michele Tartara | })(None, {}, None) |
135 | f6ce0ba2 | Michael Hanselmann | self.assertTrue(callable(getattr(obj, method))) |
136 | f6ce0ba2 | Michael Hanselmann | self.assertEqual(getattr(obj, "%s_OPCODE" % method), opcls) |
137 | f6ce0ba2 | Michael Hanselmann | self.assertFalse(hasattr(obj, "%s_RENAME" % method)) |
138 | f6ce0ba2 | Michael Hanselmann | self.assertFalse(compat.any(hasattr(obj, attr) |
139 | f6ce0ba2 | Michael Hanselmann | for i in baserlib._SUPPORTED_METHODS |
140 | f6ce0ba2 | Michael Hanselmann | if i != method
|
141 | f6ce0ba2 | Michael Hanselmann | for attr in self._GetMethodAttributes(i))) |
142 | c08fd0d6 | Michael Hanselmann | |
143 | c08fd0d6 | Michael Hanselmann | def testIllegalRename(self): |
144 | c08fd0d6 | Michael Hanselmann | class _TClass(baserlib.OpcodeResource): |
145 | c08fd0d6 | Michael Hanselmann | PUT_RENAME = None
|
146 | c08fd0d6 | Michael Hanselmann | def PUT(self): pass |
147 | c08fd0d6 | Michael Hanselmann | |
148 | c08fd0d6 | Michael Hanselmann | self.assertRaises(AssertionError, _TClass, None, None, None) |
149 | c08fd0d6 | Michael Hanselmann | |
150 | c08fd0d6 | Michael Hanselmann | def testEmpty(self): |
151 | c08fd0d6 | Michael Hanselmann | class _Empty(baserlib.OpcodeResource): |
152 | c08fd0d6 | Michael Hanselmann | pass
|
153 | c08fd0d6 | Michael Hanselmann | |
154 | 61f8fda4 | Michele Tartara | obj = _Empty(None, {}, None) |
155 | f6ce0ba2 | Michael Hanselmann | |
156 | c3a5176f | Michael Hanselmann | for attr in itertools.chain(*baserlib.OPCODE_ATTRS): |
157 | c08fd0d6 | Michael Hanselmann | self.assertFalse(hasattr(obj, attr)) |
158 | c08fd0d6 | Michael Hanselmann | |
159 | c08fd0d6 | Michael Hanselmann | |
160 | cfaeaaf7 | Michael Hanselmann | if __name__ == "__main__": |
161 | cfaeaaf7 | Michael Hanselmann | testutils.GanetiTestProgram() |