Statistics
| Branch: | Tag: | Revision:

root / test / py / ganeti.rapi.baserlib_unittest.py @ 91c17910

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 f6ce0ba2 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 f6ce0ba2 Michael Hanselmann
      obj = self._MakeClass(method, {})(None, None, None)
119 f6ce0ba2 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 f6ce0ba2 Michael Hanselmann
        })(None, 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 f6ce0ba2 Michael Hanselmann
          })(None, 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 c08fd0d6 Michael Hanselmann
    obj = _Empty(None, None, None)
155 f6ce0ba2 Michael Hanselmann
156 f6ce0ba2 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()