root / test / py / ganeti.utils.algo_unittest.py @ ec3cc4a8
History | View | Annotate | Download (12 kB)
1 | 4fd029cf | Michael Hanselmann | #!/usr/bin/python
|
---|---|---|---|
2 | 4fd029cf | Michael Hanselmann | #
|
3 | 4fd029cf | Michael Hanselmann | |
4 | 2b5b0fe9 | Iustin Pop | # Copyright (C) 2011, 2012 Google Inc.
|
5 | 4fd029cf | Michael Hanselmann | #
|
6 | 4fd029cf | Michael Hanselmann | # This program is free software; you can redistribute it and/or modify
|
7 | 4fd029cf | Michael Hanselmann | # it under the terms of the GNU General Public License as published by
|
8 | 4fd029cf | Michael Hanselmann | # the Free Software Foundation; either version 2 of the License, or
|
9 | 4fd029cf | Michael Hanselmann | # (at your option) any later version.
|
10 | 4fd029cf | Michael Hanselmann | #
|
11 | 4fd029cf | Michael Hanselmann | # This program is distributed in the hope that it will be useful, but
|
12 | 4fd029cf | Michael Hanselmann | # WITHOUT ANY WARRANTY; without even the implied warranty of
|
13 | 4fd029cf | Michael Hanselmann | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
14 | 4fd029cf | Michael Hanselmann | # General Public License for more details.
|
15 | 4fd029cf | Michael Hanselmann | #
|
16 | 4fd029cf | Michael Hanselmann | # You should have received a copy of the GNU General Public License
|
17 | 4fd029cf | Michael Hanselmann | # along with this program; if not, write to the Free Software
|
18 | 4fd029cf | Michael Hanselmann | # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
|
19 | 4fd029cf | Michael Hanselmann | # 02110-1301, USA.
|
20 | 4fd029cf | Michael Hanselmann | |
21 | 4fd029cf | Michael Hanselmann | |
22 | 4fd029cf | Michael Hanselmann | """Script for testing ganeti.utils.algo"""
|
23 | 4fd029cf | Michael Hanselmann | |
24 | 4fd029cf | Michael Hanselmann | import unittest |
25 | 4fd029cf | Michael Hanselmann | import random |
26 | 4fd029cf | Michael Hanselmann | import operator |
27 | 4fd029cf | Michael Hanselmann | |
28 | 4fd029cf | Michael Hanselmann | from ganeti import constants |
29 | 6d0accae | Michael Hanselmann | from ganeti import compat |
30 | 4fd029cf | Michael Hanselmann | from ganeti.utils import algo |
31 | 4fd029cf | Michael Hanselmann | |
32 | 4fd029cf | Michael Hanselmann | import testutils |
33 | 4fd029cf | Michael Hanselmann | |
34 | 4fd029cf | Michael Hanselmann | |
35 | 4fd029cf | Michael Hanselmann | class TestUniqueSequence(unittest.TestCase): |
36 | 4fd029cf | Michael Hanselmann | """Test case for UniqueSequence"""
|
37 | 4fd029cf | Michael Hanselmann | |
38 | 4fd029cf | Michael Hanselmann | def _test(self, input, expected): |
39 | 4fd029cf | Michael Hanselmann | self.assertEqual(algo.UniqueSequence(input), expected) |
40 | 4fd029cf | Michael Hanselmann | |
41 | 4fd029cf | Michael Hanselmann | def runTest(self): |
42 | 4fd029cf | Michael Hanselmann | # Ordered input
|
43 | 4fd029cf | Michael Hanselmann | self._test([1, 2, 3], [1, 2, 3]) |
44 | 4fd029cf | Michael Hanselmann | self._test([1, 1, 2, 2, 3, 3], [1, 2, 3]) |
45 | 4fd029cf | Michael Hanselmann | self._test([1, 2, 2, 3], [1, 2, 3]) |
46 | 4fd029cf | Michael Hanselmann | self._test([1, 2, 3, 3], [1, 2, 3]) |
47 | 4fd029cf | Michael Hanselmann | |
48 | 4fd029cf | Michael Hanselmann | # Unordered input
|
49 | 4fd029cf | Michael Hanselmann | self._test([1, 2, 3, 1, 2, 3], [1, 2, 3]) |
50 | 4fd029cf | Michael Hanselmann | self._test([1, 1, 2, 3, 3, 1, 2], [1, 2, 3]) |
51 | 4fd029cf | Michael Hanselmann | |
52 | 4fd029cf | Michael Hanselmann | # Strings
|
53 | 4fd029cf | Michael Hanselmann | self._test(["a", "a"], ["a"]) |
54 | 4fd029cf | Michael Hanselmann | self._test(["a", "b"], ["a", "b"]) |
55 | 4fd029cf | Michael Hanselmann | self._test(["a", "b", "a"], ["a", "b"]) |
56 | 4fd029cf | Michael Hanselmann | |
57 | 4fd029cf | Michael Hanselmann | |
58 | 4fd029cf | Michael Hanselmann | class TestFindDuplicates(unittest.TestCase): |
59 | 4fd029cf | Michael Hanselmann | """Test case for FindDuplicates"""
|
60 | 4fd029cf | Michael Hanselmann | |
61 | 4fd029cf | Michael Hanselmann | def _Test(self, seq, expected): |
62 | 4fd029cf | Michael Hanselmann | result = algo.FindDuplicates(seq) |
63 | 4fd029cf | Michael Hanselmann | self.assertEqual(result, algo.UniqueSequence(result))
|
64 | 4fd029cf | Michael Hanselmann | self.assertEqual(set(result), set(expected)) |
65 | 4fd029cf | Michael Hanselmann | |
66 | 4fd029cf | Michael Hanselmann | def test(self): |
67 | 4fd029cf | Michael Hanselmann | self._Test([], [])
|
68 | 4fd029cf | Michael Hanselmann | self._Test([1, 2, 3], []) |
69 | 4fd029cf | Michael Hanselmann | self._Test([9, 8, 8, 0, 5, 1, 7, 0, 6, 7], [8, 0, 7]) |
70 | 4fd029cf | Michael Hanselmann | for exp in [[1, 2, 3], [3, 2, 1]]: |
71 | 4fd029cf | Michael Hanselmann | self._Test([1, 1, 2, 2, 3, 3], exp) |
72 | 4fd029cf | Michael Hanselmann | |
73 | 4fd029cf | Michael Hanselmann | self._Test(["A", "a", "B"], []) |
74 | 4fd029cf | Michael Hanselmann | self._Test(["a", "A", "a", "B"], ["a"]) |
75 | 4fd029cf | Michael Hanselmann | self._Test("Hello World out there!", ["e", " ", "o", "r", "t", "l"]) |
76 | 4fd029cf | Michael Hanselmann | |
77 | 4fd029cf | Michael Hanselmann | self._Test(self._Gen(False), []) |
78 | 4fd029cf | Michael Hanselmann | self._Test(self._Gen(True), range(1, 10)) |
79 | 4fd029cf | Michael Hanselmann | |
80 | 4fd029cf | Michael Hanselmann | @staticmethod
|
81 | 4fd029cf | Michael Hanselmann | def _Gen(dup): |
82 | 4fd029cf | Michael Hanselmann | for i in range(10): |
83 | 4fd029cf | Michael Hanselmann | yield i
|
84 | 4fd029cf | Michael Hanselmann | if dup:
|
85 | 4fd029cf | Michael Hanselmann | for _ in range(i): |
86 | 4fd029cf | Michael Hanselmann | yield i
|
87 | 4fd029cf | Michael Hanselmann | |
88 | 4fd029cf | Michael Hanselmann | |
89 | 4fd029cf | Michael Hanselmann | class TestNiceSort(unittest.TestCase): |
90 | 4fd029cf | Michael Hanselmann | def test(self): |
91 | 4fd029cf | Michael Hanselmann | self.assertEqual(algo.NiceSort([]), [])
|
92 | 4fd029cf | Michael Hanselmann | self.assertEqual(algo.NiceSort(["foo"]), ["foo"]) |
93 | 4fd029cf | Michael Hanselmann | self.assertEqual(algo.NiceSort(["bar", ""]), ["", "bar"]) |
94 | 4fd029cf | Michael Hanselmann | self.assertEqual(algo.NiceSort([",", "."]), [",", "."]) |
95 | 4fd029cf | Michael Hanselmann | self.assertEqual(algo.NiceSort(["0.1", "0.2"]), ["0.1", "0.2"]) |
96 | 4fd029cf | Michael Hanselmann | self.assertEqual(algo.NiceSort(["0;099", "0,099", "0.1", "0.2"]), |
97 | 4fd029cf | Michael Hanselmann | ["0,099", "0.1", "0.2", "0;099"]) |
98 | 4fd029cf | Michael Hanselmann | |
99 | 4fd029cf | Michael Hanselmann | data = ["a0", "a1", "a99", "a20", "a2", "b10", "b70", "b00", "0000"] |
100 | 4fd029cf | Michael Hanselmann | self.assertEqual(algo.NiceSort(data),
|
101 | 4fd029cf | Michael Hanselmann | ["0000", "a0", "a1", "a2", "a20", "a99", |
102 | 4fd029cf | Michael Hanselmann | "b00", "b10", "b70"]) |
103 | 4fd029cf | Michael Hanselmann | |
104 | 4fd029cf | Michael Hanselmann | data = ["a0-0", "a1-0", "a99-10", "a20-3", "a0-4", "a99-3", "a09-2", |
105 | 4fd029cf | Michael Hanselmann | "Z", "a9-1", "A", "b"] |
106 | 4fd029cf | Michael Hanselmann | self.assertEqual(algo.NiceSort(data),
|
107 | 4fd029cf | Michael Hanselmann | ["A", "Z", "a0-0", "a0-4", "a1-0", "a9-1", "a09-2", |
108 | 4fd029cf | Michael Hanselmann | "a20-3", "a99-3", "a99-10", "b"]) |
109 | 4fd029cf | Michael Hanselmann | self.assertEqual(algo.NiceSort(data, key=str.lower), |
110 | 4fd029cf | Michael Hanselmann | ["A", "a0-0", "a0-4", "a1-0", "a9-1", "a09-2", |
111 | 4fd029cf | Michael Hanselmann | "a20-3", "a99-3", "a99-10", "b", "Z"]) |
112 | 4fd029cf | Michael Hanselmann | self.assertEqual(algo.NiceSort(data, key=str.upper), |
113 | 4fd029cf | Michael Hanselmann | ["A", "a0-0", "a0-4", "a1-0", "a9-1", "a09-2", |
114 | 4fd029cf | Michael Hanselmann | "a20-3", "a99-3", "a99-10", "b", "Z"]) |
115 | 4fd029cf | Michael Hanselmann | |
116 | 4fd029cf | Michael Hanselmann | def testLargeA(self): |
117 | 4fd029cf | Michael Hanselmann | data = [ |
118 | 4fd029cf | Michael Hanselmann | "Eegah9ei", "xij88brTulHYAv8IEOyU", "3jTwJPtrXOY22bwL2YoW", |
119 | 4fd029cf | Michael Hanselmann | "Z8Ljf1Pf5eBfNg171wJR", "WvNJd91OoXvLzdEiEXa6", "uHXAyYYftCSG1o7qcCqe", |
120 | 4fd029cf | Michael Hanselmann | "xpIUJeVT1Rp", "KOt7vn1dWXi", "a07h8feON165N67PIE", "bH4Q7aCu3PUPjK3JtH", |
121 | 4fd029cf | Michael Hanselmann | "cPRi0lM7HLnSuWA2G9", "KVQqLPDjcPjf8T3oyzjcOsfkb", |
122 | 4fd029cf | Michael Hanselmann | "guKJkXnkULealVC8CyF1xefym", "pqF8dkU5B1cMnyZuREaSOADYx", |
123 | 4fd029cf | Michael Hanselmann | ] |
124 | 4fd029cf | Michael Hanselmann | self.assertEqual(algo.NiceSort(data), [
|
125 | 4fd029cf | Michael Hanselmann | "3jTwJPtrXOY22bwL2YoW", "Eegah9ei", "KOt7vn1dWXi", |
126 | 4fd029cf | Michael Hanselmann | "KVQqLPDjcPjf8T3oyzjcOsfkb", "WvNJd91OoXvLzdEiEXa6", |
127 | 4fd029cf | Michael Hanselmann | "Z8Ljf1Pf5eBfNg171wJR", "a07h8feON165N67PIE", "bH4Q7aCu3PUPjK3JtH", |
128 | 4fd029cf | Michael Hanselmann | "cPRi0lM7HLnSuWA2G9", "guKJkXnkULealVC8CyF1xefym", |
129 | 4fd029cf | Michael Hanselmann | "pqF8dkU5B1cMnyZuREaSOADYx", "uHXAyYYftCSG1o7qcCqe", |
130 | 4fd029cf | Michael Hanselmann | "xij88brTulHYAv8IEOyU", "xpIUJeVT1Rp" |
131 | 4fd029cf | Michael Hanselmann | ]) |
132 | 4fd029cf | Michael Hanselmann | |
133 | 4fd029cf | Michael Hanselmann | def testLargeB(self): |
134 | 4fd029cf | Michael Hanselmann | data = [ |
135 | 4fd029cf | Michael Hanselmann | "inst-0.0.0.0-0.0.0.0",
|
136 | 4fd029cf | Michael Hanselmann | "inst-0.1.0.0-0.0.0.0",
|
137 | 4fd029cf | Michael Hanselmann | "inst-0.2.0.0-0.0.0.0",
|
138 | 4fd029cf | Michael Hanselmann | "inst-0.2.1.0-0.0.0.0",
|
139 | 4fd029cf | Michael Hanselmann | "inst-0.2.2.0-0.0.0.0",
|
140 | 4fd029cf | Michael Hanselmann | "inst-0.2.2.0-0.0.0.9",
|
141 | 4fd029cf | Michael Hanselmann | "inst-0.2.2.0-0.0.3.9",
|
142 | 4fd029cf | Michael Hanselmann | "inst-0.2.2.0-0.2.0.9",
|
143 | 4fd029cf | Michael Hanselmann | "inst-0.2.2.0-0.9.0.9",
|
144 | 4fd029cf | Michael Hanselmann | "inst-0.20.2.0-0.0.0.0",
|
145 | 4fd029cf | Michael Hanselmann | "inst-0.20.2.0-0.9.0.9",
|
146 | 4fd029cf | Michael Hanselmann | "inst-10.020.2.0-0.9.0.10",
|
147 | 4fd029cf | Michael Hanselmann | "inst-15.020.2.0-0.9.1.00",
|
148 | 4fd029cf | Michael Hanselmann | "inst-100.020.2.0-0.9.0.9",
|
149 | 4fd029cf | Michael Hanselmann | |
150 | 4fd029cf | Michael Hanselmann | # Only the last group, not converted to a number anymore, differs
|
151 | 4fd029cf | Michael Hanselmann | "inst-100.020.2.0a999",
|
152 | 4fd029cf | Michael Hanselmann | "inst-100.020.2.0b000",
|
153 | 4fd029cf | Michael Hanselmann | "inst-100.020.2.0c10",
|
154 | 4fd029cf | Michael Hanselmann | "inst-100.020.2.0c101",
|
155 | 4fd029cf | Michael Hanselmann | "inst-100.020.2.0c2",
|
156 | 4fd029cf | Michael Hanselmann | "inst-100.020.2.0c20",
|
157 | 4fd029cf | Michael Hanselmann | "inst-100.020.2.0c3",
|
158 | 4fd029cf | Michael Hanselmann | "inst-100.020.2.0c39123",
|
159 | 4fd029cf | Michael Hanselmann | ] |
160 | 4fd029cf | Michael Hanselmann | |
161 | 4fd029cf | Michael Hanselmann | rnd = random.Random(16205)
|
162 | 4fd029cf | Michael Hanselmann | for _ in range(10): |
163 | 4fd029cf | Michael Hanselmann | testdata = data[:] |
164 | 4fd029cf | Michael Hanselmann | rnd.shuffle(testdata) |
165 | 4fd029cf | Michael Hanselmann | assert testdata != data
|
166 | 4fd029cf | Michael Hanselmann | self.assertEqual(algo.NiceSort(testdata), data)
|
167 | 4fd029cf | Michael Hanselmann | |
168 | 4fd029cf | Michael Hanselmann | class _CallCount: |
169 | 4fd029cf | Michael Hanselmann | def __init__(self, fn): |
170 | 4fd029cf | Michael Hanselmann | self.count = 0 |
171 | 4fd029cf | Michael Hanselmann | self.fn = fn
|
172 | 4fd029cf | Michael Hanselmann | |
173 | 4fd029cf | Michael Hanselmann | def __call__(self, *args): |
174 | 4fd029cf | Michael Hanselmann | self.count += 1 |
175 | 4fd029cf | Michael Hanselmann | return self.fn(*args) |
176 | 4fd029cf | Michael Hanselmann | |
177 | 4fd029cf | Michael Hanselmann | def testKeyfuncA(self): |
178 | 4fd029cf | Michael Hanselmann | # Generate some random numbers
|
179 | 4fd029cf | Michael Hanselmann | rnd = random.Random(21131)
|
180 | 4fd029cf | Michael Hanselmann | numbers = [rnd.randint(0, 10000) for _ in range(999)] |
181 | 4fd029cf | Michael Hanselmann | assert numbers != sorted(numbers) |
182 | 4fd029cf | Michael Hanselmann | |
183 | 4fd029cf | Michael Hanselmann | # Convert to hex
|
184 | 4fd029cf | Michael Hanselmann | data = [hex(i) for i in numbers] |
185 | 4fd029cf | Michael Hanselmann | datacopy = data[:] |
186 | 4fd029cf | Michael Hanselmann | |
187 | 4fd029cf | Michael Hanselmann | keyfn = self._CallCount(lambda value: str(int(value, 16))) |
188 | 4fd029cf | Michael Hanselmann | |
189 | 4fd029cf | Michael Hanselmann | # Sort with key function converting hex to decimal
|
190 | 4fd029cf | Michael Hanselmann | result = algo.NiceSort(data, key=keyfn) |
191 | 4fd029cf | Michael Hanselmann | |
192 | 4fd029cf | Michael Hanselmann | self.assertEqual([hex(i) for i in sorted(numbers)], result) |
193 | 4fd029cf | Michael Hanselmann | self.assertEqual(data, datacopy, msg="Input data was modified in NiceSort") |
194 | 4fd029cf | Michael Hanselmann | self.assertEqual(keyfn.count, len(numbers), |
195 | 4fd029cf | Michael Hanselmann | msg="Key function was not called once per value")
|
196 | 4fd029cf | Michael Hanselmann | |
197 | 4fd029cf | Michael Hanselmann | class _TestData: |
198 | 4fd029cf | Michael Hanselmann | def __init__(self, name, value): |
199 | 4fd029cf | Michael Hanselmann | self.name = name
|
200 | 4fd029cf | Michael Hanselmann | self.value = value
|
201 | 4fd029cf | Michael Hanselmann | |
202 | 4fd029cf | Michael Hanselmann | def testKeyfuncB(self): |
203 | 4fd029cf | Michael Hanselmann | rnd = random.Random(27396)
|
204 | 4fd029cf | Michael Hanselmann | data = [] |
205 | 4fd029cf | Michael Hanselmann | for i in range(123): |
206 | 4fd029cf | Michael Hanselmann | v1 = rnd.randint(0, 5) |
207 | 4fd029cf | Michael Hanselmann | v2 = rnd.randint(0, 5) |
208 | 4fd029cf | Michael Hanselmann | data.append(self._TestData("inst-%s-%s-%s" % (v1, v2, i), |
209 | 4fd029cf | Michael Hanselmann | (v1, v2, i))) |
210 | 4fd029cf | Michael Hanselmann | rnd.shuffle(data) |
211 | 4fd029cf | Michael Hanselmann | assert data != sorted(data, key=operator.attrgetter("name")) |
212 | 4fd029cf | Michael Hanselmann | |
213 | 4fd029cf | Michael Hanselmann | keyfn = self._CallCount(operator.attrgetter("name")) |
214 | 4fd029cf | Michael Hanselmann | |
215 | 4fd029cf | Michael Hanselmann | # Sort by name
|
216 | 4fd029cf | Michael Hanselmann | result = algo.NiceSort(data, key=keyfn) |
217 | 4fd029cf | Michael Hanselmann | |
218 | 4fd029cf | Michael Hanselmann | self.assertEqual(result, sorted(data, key=operator.attrgetter("value"))) |
219 | 4fd029cf | Michael Hanselmann | self.assertEqual(keyfn.count, len(data), |
220 | 4fd029cf | Michael Hanselmann | msg="Key function was not called once per value")
|
221 | 4fd029cf | Michael Hanselmann | |
222 | 7d4da09e | Michael Hanselmann | def testNiceSortKey(self): |
223 | 7d4da09e | Michael Hanselmann | self.assertEqual(algo.NiceSortKey(""), |
224 | 7d4da09e | Michael Hanselmann | ([None] * algo._SORTER_GROUPS) + [""]) |
225 | 7d4da09e | Michael Hanselmann | self.assertEqual(algo.NiceSortKey("Hello World"), |
226 | 7d4da09e | Michael Hanselmann | ["Hello World"] +
|
227 | 7d4da09e | Michael Hanselmann | ([None] * int(algo._SORTER_GROUPS - 1)) + [""]) |
228 | 7d4da09e | Michael Hanselmann | self.assertEqual(algo.NiceSortKey("node1.net75.bld3.example.com"), |
229 | 7d4da09e | Michael Hanselmann | ["node", 1, ".net", 75, ".bld", 3, ".example.com", |
230 | 7d4da09e | Michael Hanselmann | None, ""]) |
231 | 7d4da09e | Michael Hanselmann | |
232 | 4fd029cf | Michael Hanselmann | |
233 | 0a9a0e5a | René Nussbaumer | class TestInvertDict(unittest.TestCase): |
234 | 0a9a0e5a | René Nussbaumer | def testInvertDict(self): |
235 | 0a9a0e5a | René Nussbaumer | test_dict = { "foo": 1, "bar": 2, "baz": 5 } |
236 | 0a9a0e5a | René Nussbaumer | self.assertEqual(algo.InvertDict(test_dict),
|
237 | 0a9a0e5a | René Nussbaumer | { 1: "foo", 2: "bar", 5: "baz"}) |
238 | 0a9a0e5a | René Nussbaumer | |
239 | 0a9a0e5a | René Nussbaumer | |
240 | d60946d9 | René Nussbaumer | class TestInsertAtPos(unittest.TestCase): |
241 | d60946d9 | René Nussbaumer | def test(self): |
242 | d60946d9 | René Nussbaumer | a = [1, 5, 6] |
243 | d60946d9 | René Nussbaumer | b = [2, 3, 4] |
244 | d60946d9 | René Nussbaumer | self.assertEqual(algo.InsertAtPos(a, 1, b), [1, 2, 3, 4, 5, 6]) |
245 | d60946d9 | René Nussbaumer | self.assertEqual(algo.InsertAtPos(a, 0, b), b + a) |
246 | d60946d9 | René Nussbaumer | self.assertEqual(algo.InsertAtPos(a, len(a), b), a + b) |
247 | d60946d9 | René Nussbaumer | self.assertEqual(algo.InsertAtPos(a, 2, b), [1, 5, 2, 3, 4, 6]) |
248 | d60946d9 | René Nussbaumer | |
249 | d60946d9 | René Nussbaumer | |
250 | 7d444d59 | Michael Hanselmann | class TimeMock: |
251 | 7d444d59 | Michael Hanselmann | def __init__(self, values): |
252 | 7d444d59 | Michael Hanselmann | self.values = values
|
253 | 7d444d59 | Michael Hanselmann | |
254 | 7d444d59 | Michael Hanselmann | def __call__(self): |
255 | 7d444d59 | Michael Hanselmann | return self.values.pop(0) |
256 | 7d444d59 | Michael Hanselmann | |
257 | 7d444d59 | Michael Hanselmann | |
258 | 7d444d59 | Michael Hanselmann | class TestRunningTimeout(unittest.TestCase): |
259 | 7d444d59 | Michael Hanselmann | def setUp(self): |
260 | 7d444d59 | Michael Hanselmann | self.time_fn = TimeMock([0.0, 0.3, 4.6, 6.5]) |
261 | 7d444d59 | Michael Hanselmann | |
262 | 7d444d59 | Michael Hanselmann | def testRemainingFloat(self): |
263 | 7d444d59 | Michael Hanselmann | timeout = algo.RunningTimeout(5.0, True, _time_fn=self.time_fn) |
264 | 7d444d59 | Michael Hanselmann | self.assertAlmostEqual(timeout.Remaining(), 4.7) |
265 | 7d444d59 | Michael Hanselmann | self.assertAlmostEqual(timeout.Remaining(), 0.4) |
266 | 7d444d59 | Michael Hanselmann | self.assertAlmostEqual(timeout.Remaining(), -1.5) |
267 | 7d444d59 | Michael Hanselmann | |
268 | 7d444d59 | Michael Hanselmann | def testRemaining(self): |
269 | 7d444d59 | Michael Hanselmann | self.time_fn = TimeMock([0, 2, 4, 5, 6]) |
270 | 7d444d59 | Michael Hanselmann | timeout = algo.RunningTimeout(5, True, _time_fn=self.time_fn) |
271 | 7d444d59 | Michael Hanselmann | self.assertEqual(timeout.Remaining(), 3) |
272 | 7d444d59 | Michael Hanselmann | self.assertEqual(timeout.Remaining(), 1) |
273 | 7d444d59 | Michael Hanselmann | self.assertEqual(timeout.Remaining(), 0) |
274 | 7d444d59 | Michael Hanselmann | self.assertEqual(timeout.Remaining(), -1) |
275 | 7d444d59 | Michael Hanselmann | |
276 | 7d444d59 | Michael Hanselmann | def testRemainingNonNegative(self): |
277 | 7d444d59 | Michael Hanselmann | timeout = algo.RunningTimeout(5.0, False, _time_fn=self.time_fn) |
278 | 7d444d59 | Michael Hanselmann | self.assertAlmostEqual(timeout.Remaining(), 4.7) |
279 | 7d444d59 | Michael Hanselmann | self.assertAlmostEqual(timeout.Remaining(), 0.4) |
280 | 7d444d59 | Michael Hanselmann | self.assertEqual(timeout.Remaining(), 0.0) |
281 | 7d444d59 | Michael Hanselmann | |
282 | 7d444d59 | Michael Hanselmann | def testNegativeTimeout(self): |
283 | 7d444d59 | Michael Hanselmann | self.assertRaises(ValueError, algo.RunningTimeout, -1.0, True) |
284 | 7d444d59 | Michael Hanselmann | |
285 | 7d444d59 | Michael Hanselmann | |
286 | cdf71b12 | Andrea Spadaccini | class TestJoinDisjointDicts(unittest.TestCase): |
287 | cdf71b12 | Andrea Spadaccini | def setUp(self): |
288 | cdf71b12 | Andrea Spadaccini | self.non_empty_dict = {"a": 1, "b": 2} |
289 | 2b5b0fe9 | Iustin Pop | self.empty_dict = {}
|
290 | cdf71b12 | Andrea Spadaccini | |
291 | cdf71b12 | Andrea Spadaccini | def testWithEmptyDicts(self): |
292 | cdf71b12 | Andrea Spadaccini | self.assertEqual(self.empty_dict, algo.JoinDisjointDicts(self.empty_dict, |
293 | cdf71b12 | Andrea Spadaccini | self.empty_dict))
|
294 | cdf71b12 | Andrea Spadaccini | self.assertEqual(self.non_empty_dict, algo.JoinDisjointDicts( |
295 | cdf71b12 | Andrea Spadaccini | self.empty_dict, self.non_empty_dict)) |
296 | cdf71b12 | Andrea Spadaccini | self.assertEqual(self.non_empty_dict, algo.JoinDisjointDicts( |
297 | cdf71b12 | Andrea Spadaccini | self.non_empty_dict, self.empty_dict)) |
298 | cdf71b12 | Andrea Spadaccini | |
299 | cdf71b12 | Andrea Spadaccini | def testNonDisjoint(self): |
300 | cdf71b12 | Andrea Spadaccini | self.assertRaises(AssertionError, algo.JoinDisjointDicts, |
301 | cdf71b12 | Andrea Spadaccini | self.non_empty_dict, self.non_empty_dict) |
302 | cdf71b12 | Andrea Spadaccini | |
303 | cdf71b12 | Andrea Spadaccini | def testCommonCase(self): |
304 | cdf71b12 | Andrea Spadaccini | dict_a = {"TEST1": 1, "TEST2": 2} |
305 | cdf71b12 | Andrea Spadaccini | dict_b = {"TEST3": 3, "TEST4": 4} |
306 | cdf71b12 | Andrea Spadaccini | |
307 | cdf71b12 | Andrea Spadaccini | result = dict_a.copy() |
308 | cdf71b12 | Andrea Spadaccini | result.update(dict_b) |
309 | cdf71b12 | Andrea Spadaccini | |
310 | cdf71b12 | Andrea Spadaccini | self.assertEqual(result, algo.JoinDisjointDicts(dict_a, dict_b))
|
311 | cdf71b12 | Andrea Spadaccini | self.assertEqual(result, algo.JoinDisjointDicts(dict_b, dict_a))
|
312 | cdf71b12 | Andrea Spadaccini | |
313 | cdf71b12 | Andrea Spadaccini | |
314 | 6d0accae | Michael Hanselmann | class TestSequenceToDict(unittest.TestCase): |
315 | 6d0accae | Michael Hanselmann | def testEmpty(self): |
316 | 6d0accae | Michael Hanselmann | self.assertEqual(algo.SequenceToDict([]), {})
|
317 | 6d0accae | Michael Hanselmann | self.assertEqual(algo.SequenceToDict({}), {})
|
318 | 6d0accae | Michael Hanselmann | |
319 | 6d0accae | Michael Hanselmann | def testSimple(self): |
320 | 6d0accae | Michael Hanselmann | data = [(i, str(i), "test%s" % i) for i in range(391)] |
321 | 6d0accae | Michael Hanselmann | self.assertEqual(algo.SequenceToDict(data),
|
322 | 6d0accae | Michael Hanselmann | dict((i, (i, str(i), "test%s" % i)) |
323 | 6d0accae | Michael Hanselmann | for i in range(391))) |
324 | 6d0accae | Michael Hanselmann | |
325 | 6d0accae | Michael Hanselmann | def testCustomKey(self): |
326 | 6d0accae | Michael Hanselmann | data = [(i, hex(i), "test%s" % i) for i in range(100)] |
327 | 6d0accae | Michael Hanselmann | self.assertEqual(algo.SequenceToDict(data, key=compat.snd),
|
328 | 6d0accae | Michael Hanselmann | dict((hex(i), (i, hex(i), "test%s" % i)) |
329 | 6d0accae | Michael Hanselmann | for i in range(100))) |
330 | 6d0accae | Michael Hanselmann | self.assertEqual(algo.SequenceToDict(data,
|
331 | 6d0accae | Michael Hanselmann | key=lambda (a, b, val): hash(val)), |
332 | 6d0accae | Michael Hanselmann | dict((hash("test%s" % i), (i, hex(i), "test%s" % i)) |
333 | 6d0accae | Michael Hanselmann | for i in range(100))) |
334 | 6d0accae | Michael Hanselmann | |
335 | 6d0accae | Michael Hanselmann | def testDuplicate(self): |
336 | 6d0accae | Michael Hanselmann | self.assertRaises(ValueError, algo.SequenceToDict, |
337 | 6d0accae | Michael Hanselmann | [(0, 0), (0, 0)]) |
338 | 6d0accae | Michael Hanselmann | self.assertRaises(ValueError, algo.SequenceToDict, |
339 | 6d0accae | Michael Hanselmann | [(i, ) for i in range(200)] + [(10, )]) |
340 | 6d0accae | Michael Hanselmann | |
341 | 6d0accae | Michael Hanselmann | |
342 | 9c709b31 | René Nussbaumer | class TestFlatToDict(unittest.TestCase): |
343 | 9c709b31 | René Nussbaumer | def testNormal(self): |
344 | 9c709b31 | René Nussbaumer | data = [ |
345 | 9c709b31 | René Nussbaumer | ("lv/xenvg", {"foo": "bar", "bar": "baz"}), |
346 | 9c709b31 | René Nussbaumer | ("lv/xenfoo", {"foo": "bar", "baz": "blubb"}), |
347 | 9c709b31 | René Nussbaumer | ("san/foo", {"ip": "127.0.0.1", "port": 1337}), |
348 | 9c709b31 | René Nussbaumer | ("san/blubb/blibb", 54), |
349 | 9c709b31 | René Nussbaumer | ] |
350 | 9c709b31 | René Nussbaumer | reference = { |
351 | 9c709b31 | René Nussbaumer | "lv": {
|
352 | 9c709b31 | René Nussbaumer | "xenvg": {"foo": "bar", "bar": "baz"}, |
353 | 9c709b31 | René Nussbaumer | "xenfoo": {"foo": "bar", "baz": "blubb"}, |
354 | 9c709b31 | René Nussbaumer | }, |
355 | 9c709b31 | René Nussbaumer | "san": {
|
356 | 9c709b31 | René Nussbaumer | "foo": {"ip": "127.0.0.1", "port": 1337}, |
357 | 9c709b31 | René Nussbaumer | "blubb": {"blibb": 54}, |
358 | 9c709b31 | René Nussbaumer | }, |
359 | 9c709b31 | René Nussbaumer | } |
360 | 9c709b31 | René Nussbaumer | self.assertEqual(algo.FlatToDict(data), reference)
|
361 | 9c709b31 | René Nussbaumer | |
362 | 9c709b31 | René Nussbaumer | def testUnlikeDepth(self): |
363 | 9c709b31 | René Nussbaumer | data = [ |
364 | 9c709b31 | René Nussbaumer | ("san/foo", {"ip": "127.0.0.1", "port": 1337}), |
365 | 9c709b31 | René Nussbaumer | ("san/foo/blubb", 23), # Another foo entry under san |
366 | 9c709b31 | René Nussbaumer | ("san/blubb/blibb", 54), |
367 | 9c709b31 | René Nussbaumer | ] |
368 | 9c709b31 | René Nussbaumer | self.assertRaises(AssertionError, algo.FlatToDict, data) |
369 | 9c709b31 | René Nussbaumer | |
370 | 9c709b31 | René Nussbaumer | |
371 | 4fd029cf | Michael Hanselmann | if __name__ == "__main__": |
372 | 4fd029cf | Michael Hanselmann | testutils.GanetiTestProgram() |