Statistics
| Branch: | Tag: | Revision:

root / test / py / ganeti.utils.algo_unittest.py @ d01e51a5

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()