Statistics
| Branch: | Tag: | Revision:

root / test / ganeti.ht_unittest.py @ 1a2eb2dc

History | View | Annotate | Download (8.8 kB)

1
#!/usr/bin/python
2
#
3

    
4
# Copyright (C) 2011 Google Inc.
5
#
6
# This program is free software; you can redistribute it and/or modify
7
# it under the terms of the GNU General Public License as published by
8
# the Free Software Foundation; either version 2 of the License, or
9
# (at your option) any later version.
10
#
11
# This program is distributed in the hope that it will be useful, but
12
# WITHOUT ANY WARRANTY; without even the implied warranty of
13
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14
# General Public License for more details.
15
#
16
# You should have received a copy of the GNU General Public License
17
# along with this program; if not, write to the Free Software
18
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
19
# 02110-1301, USA.
20

    
21

    
22
"""Script for testing ganeti.ht"""
23

    
24
import unittest
25

    
26
from ganeti import ht
27

    
28
import testutils
29

    
30

    
31
class TestTypeChecks(unittest.TestCase):
32
  def testNone(self):
33
    self.assertFalse(ht.TNotNone(None))
34
    self.assertTrue(ht.TNone(None))
35

    
36
    for val in [0, True, "", "Hello World", [], range(5)]:
37
      self.assertTrue(ht.TNotNone(val))
38
      self.assertFalse(ht.TNone(val))
39

    
40
  def testBool(self):
41
    self.assertTrue(ht.TBool(True))
42
    self.assertTrue(ht.TBool(False))
43

    
44
    for val in [0, None, "", [], "Hello"]:
45
      self.assertFalse(ht.TBool(val))
46

    
47
    for val in [True, -449, 1, 3, "x", "abc", [1, 2]]:
48
      self.assertTrue(ht.TTrue(val))
49

    
50
    for val in [False, 0, None, []]:
51
      self.assertFalse(ht.TTrue(val))
52

    
53
  def testInt(self):
54
    for val in [-100, -3, 0, 16, 128, 923874]:
55
      self.assertTrue(ht.TInt(val))
56
      self.assertTrue(ht.TNumber(val))
57

    
58
    for val in [False, True, None, "", [], "Hello", 0.0, 0.23, -3818.163]:
59
      self.assertFalse(ht.TInt(val))
60

    
61
    for val in range(0, 100, 4):
62
      self.assertTrue(ht.TPositiveInt(val))
63
      neg = -(val + 1)
64
      self.assertFalse(ht.TPositiveInt(neg))
65
      self.assertFalse(ht.TStrictPositiveInt(neg))
66

    
67
      self.assertFalse(ht.TPositiveInt(0.1 + val))
68
      self.assertFalse(ht.TStrictPositiveInt(0.1 + val))
69

    
70
    for val in [0, 0.1, 0.9, -0.3]:
71
      self.assertFalse(ht.TStrictPositiveInt(val))
72

    
73
    for val in range(1, 100, 4):
74
      self.assertTrue(ht.TStrictPositiveInt(val))
75
      self.assertFalse(ht.TStrictPositiveInt(0.1 + val))
76

    
77
  def testFloat(self):
78
    for val in [-100.21, -3.0, 0.0, 16.12, 128.3433, 923874.928]:
79
      self.assertTrue(ht.TFloat(val))
80
      self.assertTrue(ht.TNumber(val))
81

    
82
    for val in [False, True, None, "", [], "Hello", 0, 28, -1, -3281]:
83
      self.assertFalse(ht.TFloat(val))
84

    
85
  def testNumber(self):
86
    for val in [-100, -3, 0, 16, 128, 923874,
87
                -100.21, -3.0, 0.0, 16.12, 128.3433, 923874.928]:
88
      self.assertTrue(ht.TNumber(val))
89

    
90
    for val in [False, True, None, "", [], "Hello", "1"]:
91
      self.assertFalse(ht.TNumber(val))
92

    
93
  def testString(self):
94
    for val in ["", "abc", "Hello World", "123",
95
                u"", u"\u272C", u"abc"]:
96
      self.assertTrue(ht.TString(val))
97

    
98
    for val in [False, True, None, [], 0, 1, 5, -193, 93.8582]:
99
      self.assertFalse(ht.TString(val))
100

    
101
  def testElemOf(self):
102
    fn = ht.TElemOf(range(10))
103
    self.assertTrue(fn(0))
104
    self.assertTrue(fn(3))
105
    self.assertTrue(fn(9))
106
    self.assertFalse(fn(-1))
107
    self.assertFalse(fn(100))
108

    
109
    fn = ht.TElemOf([])
110
    self.assertFalse(fn(0))
111
    self.assertFalse(fn(100))
112
    self.assertFalse(fn(True))
113

    
114
    fn = ht.TElemOf(["Hello", "World"])
115
    self.assertTrue(fn("Hello"))
116
    self.assertTrue(fn("World"))
117
    self.assertFalse(fn("e"))
118

    
119
  def testList(self):
120
    for val in [[], range(10), ["Hello", "World", "!"]]:
121
      self.assertTrue(ht.TList(val))
122

    
123
    for val in [False, True, None, {}, 0, 1, 5, -193, 93.8582]:
124
      self.assertFalse(ht.TList(val))
125

    
126
  def testDict(self):
127
    for val in [{}, dict.fromkeys(range(10)), {"Hello": [], "World": "!"}]:
128
      self.assertTrue(ht.TDict(val))
129

    
130
    for val in [False, True, None, [], 0, 1, 5, -193, 93.8582]:
131
      self.assertFalse(ht.TDict(val))
132

    
133
  def testIsLength(self):
134
    fn = ht.TIsLength(10)
135
    self.assertTrue(fn(range(10)))
136
    self.assertFalse(fn(range(1)))
137
    self.assertFalse(fn(range(100)))
138

    
139
  def testAnd(self):
140
    fn = ht.TAnd(ht.TNotNone, ht.TString)
141
    self.assertTrue(fn(""))
142
    self.assertFalse(fn(1))
143
    self.assertFalse(fn(None))
144

    
145
  def testOr(self):
146
    fn = ht.TOr(ht.TNone, ht.TAnd(ht.TString, ht.TIsLength(5)))
147
    self.assertTrue(fn("12345"))
148
    self.assertTrue(fn(None))
149
    self.assertFalse(fn(1))
150
    self.assertFalse(fn(""))
151
    self.assertFalse(fn("abc"))
152

    
153
  def testMap(self):
154
    self.assertTrue(ht.TMap(str, ht.TString)(123))
155
    self.assertTrue(ht.TMap(int, ht.TInt)("9999"))
156
    self.assertFalse(ht.TMap(lambda x: x + 100, ht.TString)(123))
157

    
158
  def testNonEmptyString(self):
159
    self.assertTrue(ht.TNonEmptyString("xyz"))
160
    self.assertTrue(ht.TNonEmptyString("Hello World"))
161
    self.assertFalse(ht.TNonEmptyString(""))
162
    self.assertFalse(ht.TNonEmptyString(None))
163
    self.assertFalse(ht.TNonEmptyString([]))
164

    
165
  def testMaybeString(self):
166
    self.assertTrue(ht.TMaybeString("xyz"))
167
    self.assertTrue(ht.TMaybeString("Hello World"))
168
    self.assertTrue(ht.TMaybeString(None))
169
    self.assertFalse(ht.TMaybeString(""))
170
    self.assertFalse(ht.TMaybeString([]))
171

    
172
  def testMaybeBool(self):
173
    self.assertTrue(ht.TMaybeBool(False))
174
    self.assertTrue(ht.TMaybeBool(True))
175
    self.assertTrue(ht.TMaybeBool(None))
176
    self.assertFalse(ht.TMaybeBool([]))
177
    self.assertFalse(ht.TMaybeBool("0"))
178
    self.assertFalse(ht.TMaybeBool("False"))
179

    
180
  def testListOf(self):
181
    fn = ht.TListOf(ht.TNonEmptyString)
182
    self.assertTrue(fn([]))
183
    self.assertTrue(fn(["x"]))
184
    self.assertTrue(fn(["Hello", "World"]))
185
    self.assertFalse(fn(None))
186
    self.assertFalse(fn(False))
187
    self.assertFalse(fn(range(3)))
188
    self.assertFalse(fn(["x", None]))
189

    
190
  def testDictOf(self):
191
    fn = ht.TDictOf(ht.TNonEmptyString, ht.TInt)
192
    self.assertTrue(fn({}))
193
    self.assertTrue(fn({"x": 123, "y": 999}))
194
    self.assertFalse(fn(None))
195
    self.assertFalse(fn({1: "x"}))
196
    self.assertFalse(fn({"x": ""}))
197
    self.assertFalse(fn({"x": None}))
198
    self.assertFalse(fn({"": 8234}))
199

    
200
  def testStrictDictRequireAllExclusive(self):
201
    fn = ht.TStrictDict(True, True, { "a": ht.TInt, })
202
    self.assertFalse(fn(1))
203
    self.assertFalse(fn(None))
204
    self.assertFalse(fn({}))
205
    self.assertFalse(fn({"a": "Hello", }))
206
    self.assertFalse(fn({"unknown": 999,}))
207
    self.assertFalse(fn({"unknown": None,}))
208

    
209
    self.assertTrue(fn({"a": 123, }))
210
    self.assertTrue(fn({"a": -5, }))
211

    
212
    fn = ht.TStrictDict(True, True, { "a": ht.TInt, "x": ht.TString, })
213
    self.assertFalse(fn({}))
214
    self.assertFalse(fn({"a": -5, }))
215
    self.assertTrue(fn({"a": 123, "x": "", }))
216
    self.assertFalse(fn({"a": 123, "x": None, }))
217

    
218
  def testStrictDictExclusive(self):
219
    fn = ht.TStrictDict(False, True, { "a": ht.TInt, "b": ht.TList, })
220
    self.assertTrue(fn({}))
221
    self.assertTrue(fn({"a": 123, }))
222
    self.assertTrue(fn({"b": range(4), }))
223
    self.assertFalse(fn({"b": 123, }))
224

    
225
    self.assertFalse(fn({"foo": {}, }))
226
    self.assertFalse(fn({"bar": object(), }))
227

    
228
  def testStrictDictRequireAll(self):
229
    fn = ht.TStrictDict(True, False, { "a": ht.TInt, "m": ht.TInt, })
230
    self.assertTrue(fn({"a": 1, "m": 2, "bar": object(), }))
231
    self.assertFalse(fn({}))
232
    self.assertFalse(fn({"a": 1, "bar": object(), }))
233
    self.assertFalse(fn({"a": 1, "m": [], "bar": object(), }))
234

    
235
  def testStrictDict(self):
236
    fn = ht.TStrictDict(False, False, { "a": ht.TInt, })
237
    self.assertTrue(fn({}))
238
    self.assertFalse(fn({"a": ""}))
239
    self.assertTrue(fn({"a": 11}))
240
    self.assertTrue(fn({"other": 11}))
241
    self.assertTrue(fn({"other": object()}))
242

    
243
  def testJobId(self):
244
    for i in [0, 1, 4395, 2347625220]:
245
      self.assertTrue(ht.TJobId(i))
246
      self.assertTrue(ht.TJobId(str(i)))
247
      self.assertFalse(ht.TJobId(-(i + 1)))
248

    
249
    for i in ["", "-", ".", ",", "a", "99j", "job-123", "\t", " 83 ",
250
              None, [], {}, object()]:
251
      self.assertFalse(ht.TJobId(i))
252

    
253
  def testRelativeJobId(self):
254
    for i in [-1, -93, -4395]:
255
      self.assertTrue(ht.TRelativeJobId(i))
256
      self.assertFalse(ht.TRelativeJobId(str(i)))
257

    
258
    for i in [0, 1, 2, 10, 9289, "", "0", "-1", "-999"]:
259
      self.assertFalse(ht.TRelativeJobId(i))
260
      self.assertFalse(ht.TRelativeJobId(str(i)))
261

    
262
  def testItems(self):
263
    self.assertRaises(AssertionError, ht.TItems, [])
264

    
265
    fn = ht.TItems([ht.TString])
266
    self.assertFalse(fn([0]))
267
    self.assertFalse(fn([None]))
268
    self.assertTrue(fn(["Hello"]))
269
    self.assertTrue(fn(["Hello", "World"]))
270
    self.assertTrue(fn(["Hello", 0, 1, 2, "anything"]))
271

    
272
    fn = ht.TItems([ht.TAny, ht.TInt, ht.TAny])
273
    self.assertTrue(fn(["Hello", 0, []]))
274
    self.assertTrue(fn(["Hello", 893782]))
275
    self.assertTrue(fn([{}, -938210858947, None]))
276
    self.assertFalse(fn(["Hello", []]))
277

    
278

    
279
if __name__ == "__main__":
280
  testutils.GanetiTestProgram()