Statistics
| Branch: | Tag: | Revision:

root / test / ganeti.luxi_unittest.py @ c1912a48

History | View | Annotate | Download (8.9 kB)

1 231db3a5 Michael Hanselmann
#!/usr/bin/python
2 231db3a5 Michael Hanselmann
#
3 231db3a5 Michael Hanselmann
4 231db3a5 Michael Hanselmann
# Copyright (C) 2010 Google Inc.
5 231db3a5 Michael Hanselmann
#
6 231db3a5 Michael Hanselmann
# This program is free software; you can redistribute it and/or modify
7 231db3a5 Michael Hanselmann
# it under the terms of the GNU General Public License as published by
8 231db3a5 Michael Hanselmann
# the Free Software Foundation; either version 2 of the License, or
9 231db3a5 Michael Hanselmann
# (at your option) any later version.
10 231db3a5 Michael Hanselmann
#
11 231db3a5 Michael Hanselmann
# This program is distributed in the hope that it will be useful, but
12 231db3a5 Michael Hanselmann
# WITHOUT ANY WARRANTY; without even the implied warranty of
13 231db3a5 Michael Hanselmann
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14 231db3a5 Michael Hanselmann
# General Public License for more details.
15 231db3a5 Michael Hanselmann
#
16 231db3a5 Michael Hanselmann
# You should have received a copy of the GNU General Public License
17 231db3a5 Michael Hanselmann
# along with this program; if not, write to the Free Software
18 231db3a5 Michael Hanselmann
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
19 231db3a5 Michael Hanselmann
# 02110-1301, USA.
20 231db3a5 Michael Hanselmann
21 231db3a5 Michael Hanselmann
22 231db3a5 Michael Hanselmann
"""Script for unittesting the luxi module"""
23 231db3a5 Michael Hanselmann
24 231db3a5 Michael Hanselmann
25 231db3a5 Michael Hanselmann
import unittest
26 231db3a5 Michael Hanselmann
27 e986f20c Michael Hanselmann
from ganeti import constants
28 e986f20c Michael Hanselmann
from ganeti import errors
29 231db3a5 Michael Hanselmann
from ganeti import luxi
30 231db3a5 Michael Hanselmann
from ganeti import serializer
31 231db3a5 Michael Hanselmann
32 231db3a5 Michael Hanselmann
import testutils
33 231db3a5 Michael Hanselmann
34 231db3a5 Michael Hanselmann
35 231db3a5 Michael Hanselmann
class TestLuxiParsing(testutils.GanetiTestCase):
36 231db3a5 Michael Hanselmann
  def testParseRequest(self):
37 231db3a5 Michael Hanselmann
    msg = serializer.DumpJson({
38 231db3a5 Michael Hanselmann
      luxi.KEY_METHOD: "foo",
39 231db3a5 Michael Hanselmann
      luxi.KEY_ARGS: ("bar", "baz", 123),
40 231db3a5 Michael Hanselmann
      })
41 231db3a5 Michael Hanselmann
42 231db3a5 Michael Hanselmann
    self.assertEqualValues(luxi.ParseRequest(msg),
43 e986f20c Michael Hanselmann
                           ("foo", ["bar", "baz", 123], None))
44 231db3a5 Michael Hanselmann
45 231db3a5 Michael Hanselmann
    self.assertRaises(luxi.ProtocolError, luxi.ParseRequest,
46 231db3a5 Michael Hanselmann
                      "this\"is {invalid, ]json data")
47 231db3a5 Michael Hanselmann
48 231db3a5 Michael Hanselmann
    # No dict
49 231db3a5 Michael Hanselmann
    self.assertRaises(luxi.ProtocolError, luxi.ParseRequest,
50 231db3a5 Michael Hanselmann
                      serializer.DumpJson(123))
51 231db3a5 Michael Hanselmann
52 231db3a5 Michael Hanselmann
    # Empty dict
53 231db3a5 Michael Hanselmann
    self.assertRaises(luxi.ProtocolError, luxi.ParseRequest,
54 231db3a5 Michael Hanselmann
                      serializer.DumpJson({ }))
55 231db3a5 Michael Hanselmann
56 231db3a5 Michael Hanselmann
    # No arguments
57 231db3a5 Michael Hanselmann
    self.assertRaises(luxi.ProtocolError, luxi.ParseRequest,
58 231db3a5 Michael Hanselmann
                      serializer.DumpJson({ luxi.KEY_METHOD: "foo", }))
59 231db3a5 Michael Hanselmann
60 231db3a5 Michael Hanselmann
    # No method
61 231db3a5 Michael Hanselmann
    self.assertRaises(luxi.ProtocolError, luxi.ParseRequest,
62 231db3a5 Michael Hanselmann
                      serializer.DumpJson({ luxi.KEY_ARGS: [], }))
63 231db3a5 Michael Hanselmann
64 e986f20c Michael Hanselmann
    # No method or arguments
65 e986f20c Michael Hanselmann
    self.assertRaises(luxi.ProtocolError, luxi.ParseRequest,
66 e986f20c Michael Hanselmann
                      serializer.DumpJson({ luxi.KEY_VERSION: 1, }))
67 e986f20c Michael Hanselmann
68 e986f20c Michael Hanselmann
  def testParseRequestWithVersion(self):
69 e986f20c Michael Hanselmann
    msg = serializer.DumpJson({
70 e986f20c Michael Hanselmann
      luxi.KEY_METHOD: "version",
71 e986f20c Michael Hanselmann
      luxi.KEY_ARGS: (["some"], "args", 0, "here"),
72 e986f20c Michael Hanselmann
      luxi.KEY_VERSION: 20100101,
73 e986f20c Michael Hanselmann
      })
74 e986f20c Michael Hanselmann
75 e986f20c Michael Hanselmann
    self.assertEqualValues(luxi.ParseRequest(msg),
76 e986f20c Michael Hanselmann
                           ("version", [["some"], "args", 0, "here"], 20100101))
77 e986f20c Michael Hanselmann
78 231db3a5 Michael Hanselmann
  def testParseResponse(self):
79 231db3a5 Michael Hanselmann
    msg = serializer.DumpJson({
80 231db3a5 Michael Hanselmann
      luxi.KEY_SUCCESS: True,
81 231db3a5 Michael Hanselmann
      luxi.KEY_RESULT: None,
82 231db3a5 Michael Hanselmann
      })
83 231db3a5 Michael Hanselmann
84 e986f20c Michael Hanselmann
    self.assertEqual(luxi.ParseResponse(msg), (True, None, None))
85 231db3a5 Michael Hanselmann
86 231db3a5 Michael Hanselmann
    self.assertRaises(luxi.ProtocolError, luxi.ParseResponse,
87 231db3a5 Michael Hanselmann
                      "this\"is {invalid, ]json data")
88 231db3a5 Michael Hanselmann
89 231db3a5 Michael Hanselmann
    # No dict
90 231db3a5 Michael Hanselmann
    self.assertRaises(luxi.ProtocolError, luxi.ParseResponse,
91 231db3a5 Michael Hanselmann
                      serializer.DumpJson(123))
92 231db3a5 Michael Hanselmann
93 231db3a5 Michael Hanselmann
    # Empty dict
94 231db3a5 Michael Hanselmann
    self.assertRaises(luxi.ProtocolError, luxi.ParseResponse,
95 231db3a5 Michael Hanselmann
                      serializer.DumpJson({ }))
96 231db3a5 Michael Hanselmann
97 231db3a5 Michael Hanselmann
    # No success
98 231db3a5 Michael Hanselmann
    self.assertRaises(luxi.ProtocolError, luxi.ParseResponse,
99 231db3a5 Michael Hanselmann
                      serializer.DumpJson({ luxi.KEY_RESULT: True, }))
100 231db3a5 Michael Hanselmann
101 231db3a5 Michael Hanselmann
    # No result
102 231db3a5 Michael Hanselmann
    self.assertRaises(luxi.ProtocolError, luxi.ParseResponse,
103 231db3a5 Michael Hanselmann
                      serializer.DumpJson({ luxi.KEY_SUCCESS: True, }))
104 231db3a5 Michael Hanselmann
105 e986f20c Michael Hanselmann
    # No result or success
106 e986f20c Michael Hanselmann
    self.assertRaises(luxi.ProtocolError, luxi.ParseResponse,
107 e986f20c Michael Hanselmann
                      serializer.DumpJson({ luxi.KEY_VERSION: 123, }))
108 e986f20c Michael Hanselmann
109 e986f20c Michael Hanselmann
  def testParseResponseWithVersion(self):
110 e986f20c Michael Hanselmann
    msg = serializer.DumpJson({
111 e986f20c Michael Hanselmann
      luxi.KEY_SUCCESS: True,
112 e986f20c Michael Hanselmann
      luxi.KEY_RESULT: "Hello World",
113 e986f20c Michael Hanselmann
      luxi.KEY_VERSION: 19991234,
114 e986f20c Michael Hanselmann
      })
115 e986f20c Michael Hanselmann
116 e986f20c Michael Hanselmann
    self.assertEqual(luxi.ParseResponse(msg), (True, "Hello World", 19991234))
117 e986f20c Michael Hanselmann
118 231db3a5 Michael Hanselmann
  def testFormatResponse(self):
119 231db3a5 Michael Hanselmann
    for success, result in [(False, "error"), (True, "abc"),
120 231db3a5 Michael Hanselmann
                            (True, { "a": 123, "b": None, })]:
121 231db3a5 Michael Hanselmann
      msg = luxi.FormatResponse(success, result)
122 231db3a5 Michael Hanselmann
      msgdata = serializer.LoadJson(msg)
123 231db3a5 Michael Hanselmann
      self.assert_(luxi.KEY_SUCCESS in msgdata)
124 231db3a5 Michael Hanselmann
      self.assert_(luxi.KEY_RESULT in msgdata)
125 e986f20c Michael Hanselmann
      self.assert_(luxi.KEY_VERSION not in msgdata)
126 e986f20c Michael Hanselmann
      self.assertEqualValues(msgdata,
127 e986f20c Michael Hanselmann
                             { luxi.KEY_SUCCESS: success,
128 e986f20c Michael Hanselmann
                               luxi.KEY_RESULT: result,
129 e986f20c Michael Hanselmann
                             })
130 e986f20c Michael Hanselmann
131 e986f20c Michael Hanselmann
  def testFormatResponseWithVersion(self):
132 e986f20c Michael Hanselmann
    for success, result, version in [(False, "error", 123), (True, "abc", 999),
133 e986f20c Michael Hanselmann
                                     (True, { "a": 123, "b": None, }, 2010)]:
134 e986f20c Michael Hanselmann
      msg = luxi.FormatResponse(success, result, version=version)
135 e986f20c Michael Hanselmann
      msgdata = serializer.LoadJson(msg)
136 e986f20c Michael Hanselmann
      self.assert_(luxi.KEY_SUCCESS in msgdata)
137 e986f20c Michael Hanselmann
      self.assert_(luxi.KEY_RESULT in msgdata)
138 e986f20c Michael Hanselmann
      self.assert_(luxi.KEY_VERSION in msgdata)
139 231db3a5 Michael Hanselmann
      self.assertEqualValues(msgdata,
140 231db3a5 Michael Hanselmann
                             { luxi.KEY_SUCCESS: success,
141 231db3a5 Michael Hanselmann
                               luxi.KEY_RESULT: result,
142 e986f20c Michael Hanselmann
                               luxi.KEY_VERSION: version,
143 231db3a5 Michael Hanselmann
                             })
144 231db3a5 Michael Hanselmann
145 231db3a5 Michael Hanselmann
  def testFormatRequest(self):
146 231db3a5 Michael Hanselmann
    for method, args in [("a", []), ("b", [1, 2, 3])]:
147 231db3a5 Michael Hanselmann
      msg = luxi.FormatRequest(method, args)
148 231db3a5 Michael Hanselmann
      msgdata = serializer.LoadJson(msg)
149 231db3a5 Michael Hanselmann
      self.assert_(luxi.KEY_METHOD in msgdata)
150 231db3a5 Michael Hanselmann
      self.assert_(luxi.KEY_ARGS in msgdata)
151 e986f20c Michael Hanselmann
      self.assert_(luxi.KEY_VERSION not in msgdata)
152 e986f20c Michael Hanselmann
      self.assertEqualValues(msgdata,
153 e986f20c Michael Hanselmann
                             { luxi.KEY_METHOD: method,
154 e986f20c Michael Hanselmann
                               luxi.KEY_ARGS: args,
155 e986f20c Michael Hanselmann
                             })
156 e986f20c Michael Hanselmann
157 e986f20c Michael Hanselmann
  def testFormatRequestWithVersion(self):
158 e986f20c Michael Hanselmann
    for method, args, version in [("fn1", [], 123), ("fn2", [1, 2, 3], 999)]:
159 e986f20c Michael Hanselmann
      msg = luxi.FormatRequest(method, args, version=version)
160 e986f20c Michael Hanselmann
      msgdata = serializer.LoadJson(msg)
161 e986f20c Michael Hanselmann
      self.assert_(luxi.KEY_METHOD in msgdata)
162 e986f20c Michael Hanselmann
      self.assert_(luxi.KEY_ARGS in msgdata)
163 e986f20c Michael Hanselmann
      self.assert_(luxi.KEY_VERSION in msgdata)
164 231db3a5 Michael Hanselmann
      self.assertEqualValues(msgdata,
165 231db3a5 Michael Hanselmann
                             { luxi.KEY_METHOD: method,
166 231db3a5 Michael Hanselmann
                               luxi.KEY_ARGS: args,
167 e986f20c Michael Hanselmann
                               luxi.KEY_VERSION: version,
168 231db3a5 Michael Hanselmann
                             })
169 231db3a5 Michael Hanselmann
170 231db3a5 Michael Hanselmann
171 e986f20c Michael Hanselmann
class TestCallLuxiMethod(unittest.TestCase):
172 e986f20c Michael Hanselmann
  MY_LUXI_VERSION = 1234
173 e986f20c Michael Hanselmann
  assert constants.LUXI_VERSION != MY_LUXI_VERSION
174 e986f20c Michael Hanselmann
175 e986f20c Michael Hanselmann
  def testSuccessNoVersion(self):
176 e986f20c Michael Hanselmann
    def _Cb(msg):
177 e986f20c Michael Hanselmann
      (method, args, version) = luxi.ParseRequest(msg)
178 e986f20c Michael Hanselmann
      self.assertEqual(method, "fn1")
179 e986f20c Michael Hanselmann
      self.assertEqual(args, "Hello World")
180 e986f20c Michael Hanselmann
      return luxi.FormatResponse(True, "x")
181 e986f20c Michael Hanselmann
182 e986f20c Michael Hanselmann
    result = luxi.CallLuxiMethod(_Cb, "fn1", "Hello World")
183 e986f20c Michael Hanselmann
184 e986f20c Michael Hanselmann
  def testServerVersionOnly(self):
185 e986f20c Michael Hanselmann
    def _Cb(msg):
186 e986f20c Michael Hanselmann
      (method, args, version) = luxi.ParseRequest(msg)
187 e986f20c Michael Hanselmann
      self.assertEqual(method, "fn1")
188 e986f20c Michael Hanselmann
      self.assertEqual(args, "Hello World")
189 e986f20c Michael Hanselmann
      return luxi.FormatResponse(True, "x", version=self.MY_LUXI_VERSION)
190 e986f20c Michael Hanselmann
191 e986f20c Michael Hanselmann
    self.assertRaises(errors.LuxiError, luxi.CallLuxiMethod,
192 e986f20c Michael Hanselmann
                      _Cb, "fn1", "Hello World")
193 e986f20c Michael Hanselmann
194 e986f20c Michael Hanselmann
  def testWithVersion(self):
195 e986f20c Michael Hanselmann
    def _Cb(msg):
196 e986f20c Michael Hanselmann
      (method, args, version) = luxi.ParseRequest(msg)
197 e986f20c Michael Hanselmann
      self.assertEqual(method, "fn99")
198 e986f20c Michael Hanselmann
      self.assertEqual(args, "xyz")
199 e986f20c Michael Hanselmann
      return luxi.FormatResponse(True, "y", version=self.MY_LUXI_VERSION)
200 e986f20c Michael Hanselmann
201 e986f20c Michael Hanselmann
    self.assertEqual("y", luxi.CallLuxiMethod(_Cb, "fn99", "xyz",
202 e986f20c Michael Hanselmann
                                              version=self.MY_LUXI_VERSION))
203 e986f20c Michael Hanselmann
204 e986f20c Michael Hanselmann
  def testVersionMismatch(self):
205 e986f20c Michael Hanselmann
    def _Cb(msg):
206 e986f20c Michael Hanselmann
      (method, args, version) = luxi.ParseRequest(msg)
207 e986f20c Michael Hanselmann
      self.assertEqual(method, "fn5")
208 e986f20c Michael Hanselmann
      self.assertEqual(args, "xyz")
209 e986f20c Michael Hanselmann
      return luxi.FormatResponse(True, "F", version=self.MY_LUXI_VERSION * 2)
210 e986f20c Michael Hanselmann
211 e986f20c Michael Hanselmann
    self.assertRaises(errors.LuxiError, luxi.CallLuxiMethod,
212 e986f20c Michael Hanselmann
                      _Cb, "fn5", "xyz", version=self.MY_LUXI_VERSION)
213 e986f20c Michael Hanselmann
214 e986f20c Michael Hanselmann
  def testError(self):
215 e986f20c Michael Hanselmann
    def _Cb(msg):
216 e986f20c Michael Hanselmann
      (method, args, version) = luxi.ParseRequest(msg)
217 e986f20c Michael Hanselmann
      self.assertEqual(method, "fnErr")
218 e986f20c Michael Hanselmann
      self.assertEqual(args, [])
219 e986f20c Michael Hanselmann
      err = errors.OpPrereqError("Test")
220 e986f20c Michael Hanselmann
      return luxi.FormatResponse(False, errors.EncodeException(err))
221 e986f20c Michael Hanselmann
222 e986f20c Michael Hanselmann
    self.assertRaises(errors.OpPrereqError, luxi.CallLuxiMethod,
223 e986f20c Michael Hanselmann
                      _Cb, "fnErr", [])
224 e986f20c Michael Hanselmann
225 e986f20c Michael Hanselmann
  def testErrorWithVersionMismatch(self):
226 e986f20c Michael Hanselmann
    def _Cb(msg):
227 e986f20c Michael Hanselmann
      (method, args, version) = luxi.ParseRequest(msg)
228 e986f20c Michael Hanselmann
      self.assertEqual(method, "fnErr")
229 e986f20c Michael Hanselmann
      self.assertEqual(args, [])
230 e986f20c Michael Hanselmann
      err = errors.OpPrereqError("TestVer")
231 e986f20c Michael Hanselmann
      return luxi.FormatResponse(False, errors.EncodeException(err),
232 e986f20c Michael Hanselmann
                                 version=self.MY_LUXI_VERSION * 2)
233 e986f20c Michael Hanselmann
234 e986f20c Michael Hanselmann
    self.assertRaises(errors.LuxiError, luxi.CallLuxiMethod,
235 e986f20c Michael Hanselmann
                      _Cb, "fnErr", [],
236 e986f20c Michael Hanselmann
                      version=self.MY_LUXI_VERSION)
237 e986f20c Michael Hanselmann
238 e986f20c Michael Hanselmann
  def testErrorWithVersion(self):
239 e986f20c Michael Hanselmann
    def _Cb(msg):
240 e986f20c Michael Hanselmann
      (method, args, version) = luxi.ParseRequest(msg)
241 e986f20c Michael Hanselmann
      self.assertEqual(method, "fn9")
242 e986f20c Michael Hanselmann
      self.assertEqual(args, [])
243 e986f20c Michael Hanselmann
      err = errors.OpPrereqError("TestVer")
244 e986f20c Michael Hanselmann
      return luxi.FormatResponse(False, errors.EncodeException(err),
245 e986f20c Michael Hanselmann
                                 version=self.MY_LUXI_VERSION)
246 e986f20c Michael Hanselmann
247 e986f20c Michael Hanselmann
    self.assertRaises(errors.OpPrereqError, luxi.CallLuxiMethod,
248 e986f20c Michael Hanselmann
                      _Cb, "fn9", [],
249 e986f20c Michael Hanselmann
                      version=self.MY_LUXI_VERSION)
250 e986f20c Michael Hanselmann
251 e986f20c Michael Hanselmann
252 231db3a5 Michael Hanselmann
if __name__ == "__main__":
253 231db3a5 Michael Hanselmann
  testutils.GanetiTestProgram()