blob: e99a810296f4f5467aa6408ef8b7b908ce136cfe [file] [log] [blame]
#!/usr/bin/python
#
# Copyright (C) 2011, 2012 Google Inc.
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful, but
# WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
# General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
# 02110-1301, USA.
"""Script for testing ganeti.ht"""
import unittest
from ganeti import constants
from ganeti import ht
import testutils
class TestTypeChecks(unittest.TestCase):
def testNone(self):
self.assertFalse(ht.TNotNone(None))
self.assertTrue(ht.TNone(None))
for val in [0, True, "", "Hello World", [], range(5)]:
self.assertTrue(ht.TNotNone(val))
self.assertFalse(ht.TNone(val))
def testBool(self):
self.assertTrue(ht.TBool(True))
self.assertTrue(ht.TBool(False))
for val in [0, None, "", [], "Hello"]:
self.assertFalse(ht.TBool(val))
for val in [True, -449, 1, 3, "x", "abc", [1, 2]]:
self.assertTrue(ht.TTrue(val))
for val in [False, 0, None, []]:
self.assertFalse(ht.TTrue(val))
def testInt(self):
for val in [-100, -3, 0, 16, 128, 923874]:
self.assertTrue(ht.TInt(val))
self.assertTrue(ht.TNumber(val))
for val in [False, True, None, "", [], "Hello", 0.0, 0.23, -3818.163]:
self.assertFalse(ht.TInt(val))
for val in range(0, 100, 4):
self.assertTrue(ht.TNonNegativeInt(val))
neg = -(val + 1)
self.assertFalse(ht.TNonNegativeInt(neg))
self.assertFalse(ht.TPositiveInt(neg))
self.assertFalse(ht.TNonNegativeInt(0.1 + val))
self.assertFalse(ht.TPositiveInt(0.1 + val))
for val in [0, 0.1, 0.9, -0.3]:
self.assertFalse(ht.TPositiveInt(val))
for val in range(1, 100, 4):
self.assertTrue(ht.TPositiveInt(val))
self.assertFalse(ht.TPositiveInt(0.1 + val))
def testFloat(self):
for val in [-100.21, -3.0, 0.0, 16.12, 128.3433, 923874.928]:
self.assertTrue(ht.TFloat(val))
self.assertTrue(ht.TNumber(val))
for val in [False, True, None, "", [], "Hello", 0, 28, -1, -3281]:
self.assertFalse(ht.TFloat(val))
def testNumber(self):
for val in [-100, -3, 0, 16, 128, 923874,
-100.21, -3.0, 0.0, 16.12, 128.3433, 923874.928]:
self.assertTrue(ht.TNumber(val))
for val in [False, True, None, "", [], "Hello", "1"]:
self.assertFalse(ht.TNumber(val))
def testString(self):
for val in ["", "abc", "Hello World", "123",
u"", u"\u272C", u"abc"]:
self.assertTrue(ht.TString(val))
for val in [False, True, None, [], 0, 1, 5, -193, 93.8582]:
self.assertFalse(ht.TString(val))
def testElemOf(self):
fn = ht.TElemOf(range(10))
self.assertTrue(fn(0))
self.assertTrue(fn(3))
self.assertTrue(fn(9))
self.assertFalse(fn(-1))
self.assertFalse(fn(100))
fn = ht.TElemOf([])
self.assertFalse(fn(0))
self.assertFalse(fn(100))
self.assertFalse(fn(True))
fn = ht.TElemOf(["Hello", "World"])
self.assertTrue(fn("Hello"))
self.assertTrue(fn("World"))
self.assertFalse(fn("e"))
def testList(self):
for val in [[], range(10), ["Hello", "World", "!"]]:
self.assertTrue(ht.TList(val))
for val in [False, True, None, {}, 0, 1, 5, -193, 93.8582]:
self.assertFalse(ht.TList(val))
def testDict(self):
for val in [{}, dict.fromkeys(range(10)), {"Hello": [], "World": "!"}]:
self.assertTrue(ht.TDict(val))
for val in [False, True, None, [], 0, 1, 5, -193, 93.8582]:
self.assertFalse(ht.TDict(val))
def testIsLength(self):
fn = ht.TIsLength(10)
self.assertTrue(fn(range(10)))
self.assertFalse(fn(range(1)))
self.assertFalse(fn(range(100)))
def testAnd(self):
fn = ht.TAnd(ht.TNotNone, ht.TString)
self.assertTrue(fn(""))
self.assertFalse(fn(1))
self.assertFalse(fn(None))
def testOr(self):
fn = ht.TMaybe(ht.TAnd(ht.TString, ht.TIsLength(5)))
self.assertTrue(fn("12345"))
self.assertTrue(fn(None))
self.assertFalse(fn(1))
self.assertFalse(fn(""))
self.assertFalse(fn("abc"))
def testMap(self):
self.assertTrue(ht.TMap(str, ht.TString)(123))
self.assertTrue(ht.TMap(int, ht.TInt)("9999"))
self.assertFalse(ht.TMap(lambda x: x + 100, ht.TString)(123))
def testNonEmptyString(self):
self.assertTrue(ht.TNonEmptyString("xyz"))
self.assertTrue(ht.TNonEmptyString("Hello World"))
self.assertFalse(ht.TNonEmptyString(""))
self.assertFalse(ht.TNonEmptyString(None))
self.assertFalse(ht.TNonEmptyString([]))
def testMaybeString(self):
self.assertTrue(ht.TMaybeString("xyz"))
self.assertTrue(ht.TMaybeString("Hello World"))
self.assertTrue(ht.TMaybeString(None))
self.assertFalse(ht.TMaybeString(""))
self.assertFalse(ht.TMaybeString([]))
def testMaybeBool(self):
self.assertTrue(ht.TMaybeBool(False))
self.assertTrue(ht.TMaybeBool(True))
self.assertTrue(ht.TMaybeBool(None))
self.assertFalse(ht.TMaybeBool([]))
self.assertFalse(ht.TMaybeBool("0"))
self.assertFalse(ht.TMaybeBool("False"))
def testListOf(self):
fn = ht.TListOf(ht.TNonEmptyString)
self.assertTrue(fn([]))
self.assertTrue(fn(["x"]))
self.assertTrue(fn(["Hello", "World"]))
self.assertFalse(fn(None))
self.assertFalse(fn(False))
self.assertFalse(fn(range(3)))
self.assertFalse(fn(["x", None]))
def testDictOf(self):
fn = ht.TDictOf(ht.TNonEmptyString, ht.TInt)
self.assertTrue(fn({}))
self.assertTrue(fn({"x": 123, "y": 999}))
self.assertFalse(fn(None))
self.assertFalse(fn({1: "x"}))
self.assertFalse(fn({"x": ""}))
self.assertFalse(fn({"x": None}))
self.assertFalse(fn({"": 8234}))
def testStrictDictRequireAllExclusive(self):
fn = ht.TStrictDict(True, True, { "a": ht.TInt, })
self.assertFalse(fn(1))
self.assertFalse(fn(None))
self.assertFalse(fn({}))
self.assertFalse(fn({"a": "Hello", }))
self.assertFalse(fn({"unknown": 999,}))
self.assertFalse(fn({"unknown": None,}))
self.assertTrue(fn({"a": 123, }))
self.assertTrue(fn({"a": -5, }))
fn = ht.TStrictDict(True, True, { "a": ht.TInt, "x": ht.TString, })
self.assertFalse(fn({}))
self.assertFalse(fn({"a": -5, }))
self.assertTrue(fn({"a": 123, "x": "", }))
self.assertFalse(fn({"a": 123, "x": None, }))
def testStrictDictExclusive(self):
fn = ht.TStrictDict(False, True, { "a": ht.TInt, "b": ht.TList, })
self.assertTrue(fn({}))
self.assertTrue(fn({"a": 123, }))
self.assertTrue(fn({"b": range(4), }))
self.assertFalse(fn({"b": 123, }))
self.assertFalse(fn({"foo": {}, }))
self.assertFalse(fn({"bar": object(), }))
def testStrictDictRequireAll(self):
fn = ht.TStrictDict(True, False, { "a": ht.TInt, "m": ht.TInt, })
self.assertTrue(fn({"a": 1, "m": 2, "bar": object(), }))
self.assertFalse(fn({}))
self.assertFalse(fn({"a": 1, "bar": object(), }))
self.assertFalse(fn({"a": 1, "m": [], "bar": object(), }))
def testStrictDict(self):
fn = ht.TStrictDict(False, False, { "a": ht.TInt, })
self.assertTrue(fn({}))
self.assertFalse(fn({"a": ""}))
self.assertTrue(fn({"a": 11}))
self.assertTrue(fn({"other": 11}))
self.assertTrue(fn({"other": object()}))
def testJobId(self):
for i in [0, 1, 4395, 2347625220]:
self.assertTrue(ht.TJobId(i))
self.assertTrue(ht.TJobId(str(i)))
self.assertFalse(ht.TJobId(-(i + 1)))
for i in ["", "-", ".", ",", "a", "99j", "job-123", "\t", " 83 ",
None, [], {}, object()]:
self.assertFalse(ht.TJobId(i))
def testRelativeJobId(self):
for i in [-1, -93, -4395]:
self.assertTrue(ht.TRelativeJobId(i))
self.assertFalse(ht.TRelativeJobId(str(i)))
for i in [0, 1, 2, 10, 9289, "", "0", "-1", "-999"]:
self.assertFalse(ht.TRelativeJobId(i))
self.assertFalse(ht.TRelativeJobId(str(i)))
def testItems(self):
self.assertRaises(AssertionError, ht.TItems, [])
fn = ht.TItems([ht.TString])
self.assertFalse(fn([0]))
self.assertFalse(fn([None]))
self.assertTrue(fn(["Hello"]))
self.assertTrue(fn(["Hello", "World"]))
self.assertTrue(fn(["Hello", 0, 1, 2, "anything"]))
fn = ht.TItems([ht.TAny, ht.TInt, ht.TAny])
self.assertTrue(fn(["Hello", 0, []]))
self.assertTrue(fn(["Hello", 893782]))
self.assertTrue(fn([{}, -938210858947, None]))
self.assertFalse(fn(["Hello", []]))
def testInstanceOf(self):
fn = ht.TInstanceOf(self.__class__)
self.assertTrue(fn(self))
self.assertTrue(str(fn).startswith("Instance of "))
self.assertFalse(fn(None))
def testMaybeValueNone(self):
fn = ht.TMaybeValueNone(ht.TInt)
self.assertTrue(fn(None))
self.assertTrue(fn(0))
self.assertTrue(fn(constants.VALUE_NONE))
self.assertFalse(fn(""))
self.assertFalse(fn([]))
self.assertFalse(fn(constants.VALUE_DEFAULT))
if __name__ == "__main__":
testutils.GanetiTestProgram()