Statistics
| Branch: | Tag: | Revision:

root / test / ganeti.utils.text_unittest.py @ eac9b7b8

History | View | Annotate | Download (22 kB)

1 7fcffe27 Michael Hanselmann
#!/usr/bin/python
2 7fcffe27 Michael Hanselmann
#
3 7fcffe27 Michael Hanselmann
4 7fcffe27 Michael Hanselmann
# Copyright (C) 2011 Google Inc.
5 7fcffe27 Michael Hanselmann
#
6 7fcffe27 Michael Hanselmann
# This program is free software; you can redistribute it and/or modify
7 7fcffe27 Michael Hanselmann
# it under the terms of the GNU General Public License as published by
8 7fcffe27 Michael Hanselmann
# the Free Software Foundation; either version 2 of the License, or
9 7fcffe27 Michael Hanselmann
# (at your option) any later version.
10 7fcffe27 Michael Hanselmann
#
11 7fcffe27 Michael Hanselmann
# This program is distributed in the hope that it will be useful, but
12 7fcffe27 Michael Hanselmann
# WITHOUT ANY WARRANTY; without even the implied warranty of
13 7fcffe27 Michael Hanselmann
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14 7fcffe27 Michael Hanselmann
# General Public License for more details.
15 7fcffe27 Michael Hanselmann
#
16 7fcffe27 Michael Hanselmann
# You should have received a copy of the GNU General Public License
17 7fcffe27 Michael Hanselmann
# along with this program; if not, write to the Free Software
18 7fcffe27 Michael Hanselmann
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
19 7fcffe27 Michael Hanselmann
# 02110-1301, USA.
20 7fcffe27 Michael Hanselmann
21 7fcffe27 Michael Hanselmann
22 7fcffe27 Michael Hanselmann
"""Script for testing ganeti.utils.text"""
23 7fcffe27 Michael Hanselmann
24 7fcffe27 Michael Hanselmann
import re
25 7fcffe27 Michael Hanselmann
import string
26 7fcffe27 Michael Hanselmann
import time
27 7fcffe27 Michael Hanselmann
import unittest
28 7fcffe27 Michael Hanselmann
import os
29 7fcffe27 Michael Hanselmann
30 7fcffe27 Michael Hanselmann
from cStringIO import StringIO
31 7fcffe27 Michael Hanselmann
32 7fcffe27 Michael Hanselmann
from ganeti import constants
33 7fcffe27 Michael Hanselmann
from ganeti import utils
34 7fcffe27 Michael Hanselmann
from ganeti import errors
35 7fcffe27 Michael Hanselmann
36 7fcffe27 Michael Hanselmann
import testutils
37 7fcffe27 Michael Hanselmann
38 7fcffe27 Michael Hanselmann
39 7fcffe27 Michael Hanselmann
class TestMatchNameComponent(unittest.TestCase):
40 7fcffe27 Michael Hanselmann
  """Test case for the MatchNameComponent function"""
41 7fcffe27 Michael Hanselmann
42 7fcffe27 Michael Hanselmann
  def testEmptyList(self):
43 7fcffe27 Michael Hanselmann
    """Test that there is no match against an empty list"""
44 7fcffe27 Michael Hanselmann
    self.failUnlessEqual(utils.MatchNameComponent("", []), None)
45 7fcffe27 Michael Hanselmann
    self.failUnlessEqual(utils.MatchNameComponent("test", []), None)
46 7fcffe27 Michael Hanselmann
47 7fcffe27 Michael Hanselmann
  def testSingleMatch(self):
48 7fcffe27 Michael Hanselmann
    """Test that a single match is performed correctly"""
49 7fcffe27 Michael Hanselmann
    mlist = ["test1.example.com", "test2.example.com", "test3.example.com"]
50 7fcffe27 Michael Hanselmann
    for key in "test2", "test2.example", "test2.example.com":
51 7fcffe27 Michael Hanselmann
      self.failUnlessEqual(utils.MatchNameComponent(key, mlist), mlist[1])
52 7fcffe27 Michael Hanselmann
53 7fcffe27 Michael Hanselmann
  def testMultipleMatches(self):
54 7fcffe27 Michael Hanselmann
    """Test that a multiple match is returned as None"""
55 7fcffe27 Michael Hanselmann
    mlist = ["test1.example.com", "test1.example.org", "test1.example.net"]
56 7fcffe27 Michael Hanselmann
    for key in "test1", "test1.example":
57 7fcffe27 Michael Hanselmann
      self.failUnlessEqual(utils.MatchNameComponent(key, mlist), None)
58 7fcffe27 Michael Hanselmann
59 7fcffe27 Michael Hanselmann
  def testFullMatch(self):
60 7fcffe27 Michael Hanselmann
    """Test that a full match is returned correctly"""
61 7fcffe27 Michael Hanselmann
    key1 = "test1"
62 7fcffe27 Michael Hanselmann
    key2 = "test1.example"
63 7fcffe27 Michael Hanselmann
    mlist = [key2, key2 + ".com"]
64 7fcffe27 Michael Hanselmann
    self.failUnlessEqual(utils.MatchNameComponent(key1, mlist), None)
65 7fcffe27 Michael Hanselmann
    self.failUnlessEqual(utils.MatchNameComponent(key2, mlist), key2)
66 7fcffe27 Michael Hanselmann
67 7fcffe27 Michael Hanselmann
  def testCaseInsensitivePartialMatch(self):
68 7fcffe27 Michael Hanselmann
    """Test for the case_insensitive keyword"""
69 7fcffe27 Michael Hanselmann
    mlist = ["test1.example.com", "test2.example.net"]
70 7fcffe27 Michael Hanselmann
    self.assertEqual(utils.MatchNameComponent("test2", mlist,
71 7fcffe27 Michael Hanselmann
                                              case_sensitive=False),
72 7fcffe27 Michael Hanselmann
                     "test2.example.net")
73 7fcffe27 Michael Hanselmann
    self.assertEqual(utils.MatchNameComponent("Test2", mlist,
74 7fcffe27 Michael Hanselmann
                                              case_sensitive=False),
75 7fcffe27 Michael Hanselmann
                     "test2.example.net")
76 7fcffe27 Michael Hanselmann
    self.assertEqual(utils.MatchNameComponent("teSt2", mlist,
77 7fcffe27 Michael Hanselmann
                                              case_sensitive=False),
78 7fcffe27 Michael Hanselmann
                     "test2.example.net")
79 7fcffe27 Michael Hanselmann
    self.assertEqual(utils.MatchNameComponent("TeSt2", mlist,
80 7fcffe27 Michael Hanselmann
                                              case_sensitive=False),
81 7fcffe27 Michael Hanselmann
                     "test2.example.net")
82 7fcffe27 Michael Hanselmann
83 7fcffe27 Michael Hanselmann
  def testCaseInsensitiveFullMatch(self):
84 7fcffe27 Michael Hanselmann
    mlist = ["ts1.ex", "ts1.ex.org", "ts2.ex", "Ts2.ex"]
85 7fcffe27 Michael Hanselmann
86 7fcffe27 Michael Hanselmann
    # Between the two ts1 a full string match non-case insensitive should work
87 7fcffe27 Michael Hanselmann
    self.assertEqual(utils.MatchNameComponent("Ts1", mlist,
88 7fcffe27 Michael Hanselmann
                                              case_sensitive=False),
89 7fcffe27 Michael Hanselmann
                     None)
90 7fcffe27 Michael Hanselmann
    self.assertEqual(utils.MatchNameComponent("Ts1.ex", mlist,
91 7fcffe27 Michael Hanselmann
                                              case_sensitive=False),
92 7fcffe27 Michael Hanselmann
                     "ts1.ex")
93 7fcffe27 Michael Hanselmann
    self.assertEqual(utils.MatchNameComponent("ts1.ex", mlist,
94 7fcffe27 Michael Hanselmann
                                              case_sensitive=False),
95 7fcffe27 Michael Hanselmann
                     "ts1.ex")
96 7fcffe27 Michael Hanselmann
97 7fcffe27 Michael Hanselmann
    # Between the two ts2 only case differs, so only case-match works
98 7fcffe27 Michael Hanselmann
    self.assertEqual(utils.MatchNameComponent("ts2.ex", mlist,
99 7fcffe27 Michael Hanselmann
                                              case_sensitive=False),
100 7fcffe27 Michael Hanselmann
                     "ts2.ex")
101 7fcffe27 Michael Hanselmann
    self.assertEqual(utils.MatchNameComponent("Ts2.ex", mlist,
102 7fcffe27 Michael Hanselmann
                                              case_sensitive=False),
103 7fcffe27 Michael Hanselmann
                     "Ts2.ex")
104 7fcffe27 Michael Hanselmann
    self.assertEqual(utils.MatchNameComponent("TS2.ex", mlist,
105 7fcffe27 Michael Hanselmann
                                              case_sensitive=False),
106 7fcffe27 Michael Hanselmann
                     None)
107 7fcffe27 Michael Hanselmann
108 7fcffe27 Michael Hanselmann
109 bbfed756 Michael Hanselmann
class TestDnsNameGlobPattern(unittest.TestCase):
110 bbfed756 Michael Hanselmann
  def setUp(self):
111 bbfed756 Michael Hanselmann
    self.names = [
112 bbfed756 Michael Hanselmann
      "node1.example.com",
113 bbfed756 Michael Hanselmann
      "node2-0.example.com",
114 bbfed756 Michael Hanselmann
      "node2-1.example.com",
115 bbfed756 Michael Hanselmann
      "node1.example.net",
116 bbfed756 Michael Hanselmann
      "web1.example.com",
117 bbfed756 Michael Hanselmann
      "web2.example.com",
118 bbfed756 Michael Hanselmann
      "sub.site.example.com",
119 bbfed756 Michael Hanselmann
      ]
120 bbfed756 Michael Hanselmann
121 bbfed756 Michael Hanselmann
  def _Test(self, pattern):
122 bbfed756 Michael Hanselmann
    re_pat = utils.DnsNameGlobPattern(pattern)
123 bbfed756 Michael Hanselmann
124 bbfed756 Michael Hanselmann
    return filter(re.compile(re_pat).match, self.names)
125 bbfed756 Michael Hanselmann
126 bbfed756 Michael Hanselmann
  def test(self):
127 bbfed756 Michael Hanselmann
    for pattern in ["xyz", "node", " ", "example.net", "x*.example.*",
128 bbfed756 Michael Hanselmann
                    "x*.example.com"]:
129 bbfed756 Michael Hanselmann
      self.assertEqual(self._Test(pattern), [])
130 bbfed756 Michael Hanselmann
131 bbfed756 Michael Hanselmann
    for pattern in ["*", "???*"]:
132 bbfed756 Michael Hanselmann
      self.assertEqual(self._Test(pattern), self.names)
133 bbfed756 Michael Hanselmann
134 bbfed756 Michael Hanselmann
    self.assertEqual(self._Test("node1.*.net"), ["node1.example.net"])
135 bbfed756 Michael Hanselmann
    self.assertEqual(self._Test("*.example.net"), ["node1.example.net"])
136 bbfed756 Michael Hanselmann
    self.assertEqual(self._Test("web1.example.com"), ["web1.example.com"])
137 bbfed756 Michael Hanselmann
138 bbfed756 Michael Hanselmann
    for pattern in ["*.*.*.*", "???", "*.site"]:
139 bbfed756 Michael Hanselmann
      self.assertEqual(self._Test(pattern), ["sub.site.example.com"])
140 bbfed756 Michael Hanselmann
141 bbfed756 Michael Hanselmann
    self.assertEqual(self._Test("node1"), [
142 bbfed756 Michael Hanselmann
      "node1.example.com",
143 bbfed756 Michael Hanselmann
      "node1.example.net",
144 bbfed756 Michael Hanselmann
      ])
145 bbfed756 Michael Hanselmann
    self.assertEqual(self._Test("node?*.example.*"), [
146 bbfed756 Michael Hanselmann
      "node1.example.com",
147 bbfed756 Michael Hanselmann
      "node2-0.example.com",
148 bbfed756 Michael Hanselmann
      "node2-1.example.com",
149 bbfed756 Michael Hanselmann
      "node1.example.net",
150 bbfed756 Michael Hanselmann
      ])
151 bbfed756 Michael Hanselmann
    self.assertEqual(self._Test("*-?"), [
152 bbfed756 Michael Hanselmann
      "node2-0.example.com",
153 bbfed756 Michael Hanselmann
      "node2-1.example.com",
154 bbfed756 Michael Hanselmann
      ])
155 bbfed756 Michael Hanselmann
    self.assertEqual(self._Test("node2-?.example.com"), [
156 bbfed756 Michael Hanselmann
      "node2-0.example.com",
157 bbfed756 Michael Hanselmann
      "node2-1.example.com",
158 bbfed756 Michael Hanselmann
      ])
159 bbfed756 Michael Hanselmann
160 bbfed756 Michael Hanselmann
161 7fcffe27 Michael Hanselmann
class TestFormatUnit(unittest.TestCase):
162 7fcffe27 Michael Hanselmann
  """Test case for the FormatUnit function"""
163 7fcffe27 Michael Hanselmann
164 7fcffe27 Michael Hanselmann
  def testMiB(self):
165 7fcffe27 Michael Hanselmann
    self.assertEqual(utils.FormatUnit(1, "h"), "1M")
166 7fcffe27 Michael Hanselmann
    self.assertEqual(utils.FormatUnit(100, "h"), "100M")
167 7fcffe27 Michael Hanselmann
    self.assertEqual(utils.FormatUnit(1023, "h"), "1023M")
168 7fcffe27 Michael Hanselmann
169 7fcffe27 Michael Hanselmann
    self.assertEqual(utils.FormatUnit(1, "m"), "1")
170 7fcffe27 Michael Hanselmann
    self.assertEqual(utils.FormatUnit(100, "m"), "100")
171 7fcffe27 Michael Hanselmann
    self.assertEqual(utils.FormatUnit(1023, "m"), "1023")
172 7fcffe27 Michael Hanselmann
173 7fcffe27 Michael Hanselmann
    self.assertEqual(utils.FormatUnit(1024, "m"), "1024")
174 7fcffe27 Michael Hanselmann
    self.assertEqual(utils.FormatUnit(1536, "m"), "1536")
175 7fcffe27 Michael Hanselmann
    self.assertEqual(utils.FormatUnit(17133, "m"), "17133")
176 7fcffe27 Michael Hanselmann
    self.assertEqual(utils.FormatUnit(1024 * 1024 - 1, "m"), "1048575")
177 7fcffe27 Michael Hanselmann
178 7fcffe27 Michael Hanselmann
  def testGiB(self):
179 7fcffe27 Michael Hanselmann
    self.assertEqual(utils.FormatUnit(1024, "h"), "1.0G")
180 7fcffe27 Michael Hanselmann
    self.assertEqual(utils.FormatUnit(1536, "h"), "1.5G")
181 7fcffe27 Michael Hanselmann
    self.assertEqual(utils.FormatUnit(17133, "h"), "16.7G")
182 7fcffe27 Michael Hanselmann
    self.assertEqual(utils.FormatUnit(1024 * 1024 - 1, "h"), "1024.0G")
183 7fcffe27 Michael Hanselmann
184 7fcffe27 Michael Hanselmann
    self.assertEqual(utils.FormatUnit(1024, "g"), "1.0")
185 7fcffe27 Michael Hanselmann
    self.assertEqual(utils.FormatUnit(1536, "g"), "1.5")
186 7fcffe27 Michael Hanselmann
    self.assertEqual(utils.FormatUnit(17133, "g"), "16.7")
187 7fcffe27 Michael Hanselmann
    self.assertEqual(utils.FormatUnit(1024 * 1024 - 1, "g"), "1024.0")
188 7fcffe27 Michael Hanselmann
189 7fcffe27 Michael Hanselmann
    self.assertEqual(utils.FormatUnit(1024 * 1024, "g"), "1024.0")
190 7fcffe27 Michael Hanselmann
    self.assertEqual(utils.FormatUnit(5120 * 1024, "g"), "5120.0")
191 7fcffe27 Michael Hanselmann
    self.assertEqual(utils.FormatUnit(29829 * 1024, "g"), "29829.0")
192 7fcffe27 Michael Hanselmann
193 7fcffe27 Michael Hanselmann
  def testTiB(self):
194 7fcffe27 Michael Hanselmann
    self.assertEqual(utils.FormatUnit(1024 * 1024, "h"), "1.0T")
195 7fcffe27 Michael Hanselmann
    self.assertEqual(utils.FormatUnit(5120 * 1024, "h"), "5.0T")
196 7fcffe27 Michael Hanselmann
    self.assertEqual(utils.FormatUnit(29829 * 1024, "h"), "29.1T")
197 7fcffe27 Michael Hanselmann
198 7fcffe27 Michael Hanselmann
    self.assertEqual(utils.FormatUnit(1024 * 1024, "t"), "1.0")
199 7fcffe27 Michael Hanselmann
    self.assertEqual(utils.FormatUnit(5120 * 1024, "t"), "5.0")
200 7fcffe27 Michael Hanselmann
    self.assertEqual(utils.FormatUnit(29829 * 1024, "t"), "29.1")
201 7fcffe27 Michael Hanselmann
202 7fcffe27 Michael Hanselmann
  def testErrors(self):
203 7fcffe27 Michael Hanselmann
    self.assertRaises(errors.ProgrammerError, utils.FormatUnit, 1, "a")
204 7fcffe27 Michael Hanselmann
205 7fcffe27 Michael Hanselmann
206 7fcffe27 Michael Hanselmann
class TestParseUnit(unittest.TestCase):
207 7fcffe27 Michael Hanselmann
  """Test case for the ParseUnit function"""
208 7fcffe27 Michael Hanselmann
209 7fcffe27 Michael Hanselmann
  SCALES = (("", 1),
210 7fcffe27 Michael Hanselmann
            ("M", 1), ("G", 1024), ("T", 1024 * 1024),
211 7fcffe27 Michael Hanselmann
            ("MB", 1), ("GB", 1024), ("TB", 1024 * 1024),
212 7fcffe27 Michael Hanselmann
            ("MiB", 1), ("GiB", 1024), ("TiB", 1024 * 1024))
213 7fcffe27 Michael Hanselmann
214 7fcffe27 Michael Hanselmann
  def testRounding(self):
215 7fcffe27 Michael Hanselmann
    self.assertEqual(utils.ParseUnit("0"), 0)
216 7fcffe27 Michael Hanselmann
    self.assertEqual(utils.ParseUnit("1"), 4)
217 7fcffe27 Michael Hanselmann
    self.assertEqual(utils.ParseUnit("2"), 4)
218 7fcffe27 Michael Hanselmann
    self.assertEqual(utils.ParseUnit("3"), 4)
219 7fcffe27 Michael Hanselmann
220 7fcffe27 Michael Hanselmann
    self.assertEqual(utils.ParseUnit("124"), 124)
221 7fcffe27 Michael Hanselmann
    self.assertEqual(utils.ParseUnit("125"), 128)
222 7fcffe27 Michael Hanselmann
    self.assertEqual(utils.ParseUnit("126"), 128)
223 7fcffe27 Michael Hanselmann
    self.assertEqual(utils.ParseUnit("127"), 128)
224 7fcffe27 Michael Hanselmann
    self.assertEqual(utils.ParseUnit("128"), 128)
225 7fcffe27 Michael Hanselmann
    self.assertEqual(utils.ParseUnit("129"), 132)
226 7fcffe27 Michael Hanselmann
    self.assertEqual(utils.ParseUnit("130"), 132)
227 7fcffe27 Michael Hanselmann
228 7fcffe27 Michael Hanselmann
  def testFloating(self):
229 7fcffe27 Michael Hanselmann
    self.assertEqual(utils.ParseUnit("0"), 0)
230 7fcffe27 Michael Hanselmann
    self.assertEqual(utils.ParseUnit("0.5"), 4)
231 7fcffe27 Michael Hanselmann
    self.assertEqual(utils.ParseUnit("1.75"), 4)
232 7fcffe27 Michael Hanselmann
    self.assertEqual(utils.ParseUnit("1.99"), 4)
233 7fcffe27 Michael Hanselmann
    self.assertEqual(utils.ParseUnit("2.00"), 4)
234 7fcffe27 Michael Hanselmann
    self.assertEqual(utils.ParseUnit("2.01"), 4)
235 7fcffe27 Michael Hanselmann
    self.assertEqual(utils.ParseUnit("3.99"), 4)
236 7fcffe27 Michael Hanselmann
    self.assertEqual(utils.ParseUnit("4.00"), 4)
237 7fcffe27 Michael Hanselmann
    self.assertEqual(utils.ParseUnit("4.01"), 8)
238 7fcffe27 Michael Hanselmann
    self.assertEqual(utils.ParseUnit("1.5G"), 1536)
239 7fcffe27 Michael Hanselmann
    self.assertEqual(utils.ParseUnit("1.8G"), 1844)
240 7fcffe27 Michael Hanselmann
    self.assertEqual(utils.ParseUnit("8.28T"), 8682212)
241 7fcffe27 Michael Hanselmann
242 7fcffe27 Michael Hanselmann
  def testSuffixes(self):
243 7fcffe27 Michael Hanselmann
    for sep in ("", " ", "   ", "\t", "\t "):
244 7fcffe27 Michael Hanselmann
      for suffix, scale in self.SCALES:
245 7fcffe27 Michael Hanselmann
        for func in (lambda x: x, str.lower, str.upper):
246 7fcffe27 Michael Hanselmann
          self.assertEqual(utils.ParseUnit("1024" + sep + func(suffix)),
247 7fcffe27 Michael Hanselmann
                           1024 * scale)
248 7fcffe27 Michael Hanselmann
249 7fcffe27 Michael Hanselmann
  def testInvalidInput(self):
250 7fcffe27 Michael Hanselmann
    for sep in ("-", "_", ",", "a"):
251 7fcffe27 Michael Hanselmann
      for suffix, _ in self.SCALES:
252 7fcffe27 Michael Hanselmann
        self.assertRaises(errors.UnitParseError, utils.ParseUnit,
253 7fcffe27 Michael Hanselmann
                          "1" + sep + suffix)
254 7fcffe27 Michael Hanselmann
255 7fcffe27 Michael Hanselmann
    for suffix, _ in self.SCALES:
256 7fcffe27 Michael Hanselmann
      self.assertRaises(errors.UnitParseError, utils.ParseUnit,
257 7fcffe27 Michael Hanselmann
                        "1,3" + suffix)
258 7fcffe27 Michael Hanselmann
259 7fcffe27 Michael Hanselmann
260 7fcffe27 Michael Hanselmann
class TestShellQuoting(unittest.TestCase):
261 7fcffe27 Michael Hanselmann
  """Test case for shell quoting functions"""
262 7fcffe27 Michael Hanselmann
263 7fcffe27 Michael Hanselmann
  def testShellQuote(self):
264 8c114acd Michael Hanselmann
    self.assertEqual(utils.ShellQuote("abc"), "abc")
265 7fcffe27 Michael Hanselmann
    self.assertEqual(utils.ShellQuote('ab"c'), "'ab\"c'")
266 7fcffe27 Michael Hanselmann
    self.assertEqual(utils.ShellQuote("a'bc"), "'a'\\''bc'")
267 7fcffe27 Michael Hanselmann
    self.assertEqual(utils.ShellQuote("a b c"), "'a b c'")
268 7fcffe27 Michael Hanselmann
    self.assertEqual(utils.ShellQuote("a b\\ c"), "'a b\\ c'")
269 7fcffe27 Michael Hanselmann
270 7fcffe27 Michael Hanselmann
  def testShellQuoteArgs(self):
271 8c114acd Michael Hanselmann
    self.assertEqual(utils.ShellQuoteArgs(["a", "b", "c"]), "a b c")
272 7fcffe27 Michael Hanselmann
    self.assertEqual(utils.ShellQuoteArgs(['a', 'b"', 'c']), "a 'b\"' c")
273 7fcffe27 Michael Hanselmann
    self.assertEqual(utils.ShellQuoteArgs(['a', 'b\'', 'c']), "a 'b'\\\''' c")
274 7fcffe27 Michael Hanselmann
275 7fcffe27 Michael Hanselmann
276 7fcffe27 Michael Hanselmann
class TestShellWriter(unittest.TestCase):
277 7fcffe27 Michael Hanselmann
  def test(self):
278 7fcffe27 Michael Hanselmann
    buf = StringIO()
279 7fcffe27 Michael Hanselmann
    sw = utils.ShellWriter(buf)
280 7fcffe27 Michael Hanselmann
    sw.Write("#!/bin/bash")
281 7fcffe27 Michael Hanselmann
    sw.Write("if true; then")
282 7fcffe27 Michael Hanselmann
    sw.IncIndent()
283 7fcffe27 Michael Hanselmann
    try:
284 7fcffe27 Michael Hanselmann
      sw.Write("echo true")
285 7fcffe27 Michael Hanselmann
286 7fcffe27 Michael Hanselmann
      sw.Write("for i in 1 2 3")
287 7fcffe27 Michael Hanselmann
      sw.Write("do")
288 7fcffe27 Michael Hanselmann
      sw.IncIndent()
289 7fcffe27 Michael Hanselmann
      try:
290 7fcffe27 Michael Hanselmann
        self.assertEqual(sw._indent, 2)
291 7fcffe27 Michael Hanselmann
        sw.Write("date")
292 7fcffe27 Michael Hanselmann
      finally:
293 7fcffe27 Michael Hanselmann
        sw.DecIndent()
294 7fcffe27 Michael Hanselmann
      sw.Write("done")
295 7fcffe27 Michael Hanselmann
    finally:
296 7fcffe27 Michael Hanselmann
      sw.DecIndent()
297 7fcffe27 Michael Hanselmann
    sw.Write("echo %s", utils.ShellQuote("Hello World"))
298 7fcffe27 Michael Hanselmann
    sw.Write("exit 0")
299 7fcffe27 Michael Hanselmann
300 7fcffe27 Michael Hanselmann
    self.assertEqual(sw._indent, 0)
301 7fcffe27 Michael Hanselmann
302 7fcffe27 Michael Hanselmann
    output = buf.getvalue()
303 7fcffe27 Michael Hanselmann
304 7fcffe27 Michael Hanselmann
    self.assert_(output.endswith("\n"))
305 7fcffe27 Michael Hanselmann
306 7fcffe27 Michael Hanselmann
    lines = output.splitlines()
307 7fcffe27 Michael Hanselmann
    self.assertEqual(len(lines), 9)
308 7fcffe27 Michael Hanselmann
    self.assertEqual(lines[0], "#!/bin/bash")
309 7fcffe27 Michael Hanselmann
    self.assert_(re.match(r"^\s+date$", lines[5]))
310 7fcffe27 Michael Hanselmann
    self.assertEqual(lines[7], "echo 'Hello World'")
311 7fcffe27 Michael Hanselmann
312 7fcffe27 Michael Hanselmann
  def testEmpty(self):
313 7fcffe27 Michael Hanselmann
    buf = StringIO()
314 7fcffe27 Michael Hanselmann
    sw = utils.ShellWriter(buf)
315 7fcffe27 Michael Hanselmann
    sw = None
316 7fcffe27 Michael Hanselmann
    self.assertEqual(buf.getvalue(), "")
317 7fcffe27 Michael Hanselmann
318 4af458e3 Michael Hanselmann
  def testEmptyNoIndent(self):
319 4af458e3 Michael Hanselmann
    buf = StringIO()
320 4af458e3 Michael Hanselmann
    sw = utils.ShellWriter(buf, indent=False)
321 4af458e3 Michael Hanselmann
    sw = None
322 4af458e3 Michael Hanselmann
    self.assertEqual(buf.getvalue(), "")
323 4af458e3 Michael Hanselmann
324 4af458e3 Michael Hanselmann
  @classmethod
325 4af458e3 Michael Hanselmann
  def _AddLevel(cls, sw, level):
326 4af458e3 Michael Hanselmann
    if level == 6:
327 4af458e3 Michael Hanselmann
      return
328 4af458e3 Michael Hanselmann
329 4af458e3 Michael Hanselmann
    sw.IncIndent()
330 4af458e3 Michael Hanselmann
    try:
331 4af458e3 Michael Hanselmann
      # Add empty line, it should not be indented
332 4af458e3 Michael Hanselmann
      sw.Write("")
333 4af458e3 Michael Hanselmann
      sw.Write(str(level))
334 4af458e3 Michael Hanselmann
      cls._AddLevel(sw, level + 1)
335 4af458e3 Michael Hanselmann
    finally:
336 4af458e3 Michael Hanselmann
      sw.DecIndent()
337 4af458e3 Michael Hanselmann
338 dce20078 Michael Hanselmann
  def testEmptyLines(self):
339 dce20078 Michael Hanselmann
    buf = StringIO()
340 dce20078 Michael Hanselmann
    sw = utils.ShellWriter(buf)
341 dce20078 Michael Hanselmann
342 4af458e3 Michael Hanselmann
    self._AddLevel(sw, 1)
343 dce20078 Michael Hanselmann
344 dce20078 Michael Hanselmann
    self.assertEqual(buf.getvalue(),
345 dce20078 Michael Hanselmann
                     "".join("\n%s%s\n" % (i * "  ", i) for i in range(1, 6)))
346 dce20078 Michael Hanselmann
347 4af458e3 Michael Hanselmann
  def testEmptyLinesNoIndent(self):
348 4af458e3 Michael Hanselmann
    buf = StringIO()
349 4af458e3 Michael Hanselmann
    sw = utils.ShellWriter(buf, indent=False)
350 4af458e3 Michael Hanselmann
351 4af458e3 Michael Hanselmann
    self._AddLevel(sw, 1)
352 4af458e3 Michael Hanselmann
353 4af458e3 Michael Hanselmann
    self.assertEqual(buf.getvalue(),
354 4af458e3 Michael Hanselmann
                     "".join("\n%s\n" % i for i in range(1, 6)))
355 4af458e3 Michael Hanselmann
356 7fcffe27 Michael Hanselmann
357 7fcffe27 Michael Hanselmann
class TestNormalizeAndValidateMac(unittest.TestCase):
358 7fcffe27 Michael Hanselmann
  def testInvalid(self):
359 d242923c Michael Hanselmann
    for i in ["xxx", "00:11:22:33:44:55:66", "zz:zz:zz:zz:zz:zz"]:
360 d242923c Michael Hanselmann
      self.assertRaises(errors.OpPrereqError, utils.NormalizeAndValidateMac, i)
361 7fcffe27 Michael Hanselmann
362 7fcffe27 Michael Hanselmann
  def testNormalization(self):
363 7fcffe27 Michael Hanselmann
    for mac in ["aa:bb:cc:dd:ee:ff", "00:AA:11:bB:22:cc"]:
364 7fcffe27 Michael Hanselmann
      self.assertEqual(utils.NormalizeAndValidateMac(mac), mac.lower())
365 7fcffe27 Michael Hanselmann
366 7fcffe27 Michael Hanselmann
367 d242923c Michael Hanselmann
class TestNormalizeAndValidateThreeOctetMacPrefix(unittest.TestCase):
368 d242923c Michael Hanselmann
  def testInvalid(self):
369 d242923c Michael Hanselmann
    for i in ["xxx", "00:11:22:33:44:55:66", "zz:zz:zz:zz:zz:zz",
370 d242923c Michael Hanselmann
              "aa:bb:cc:dd:ee:ff", "00:AA:11:bB:22:cc",
371 d242923c Michael Hanselmann
              "00:11:"]:
372 d242923c Michael Hanselmann
      self.assertRaises(errors.OpPrereqError,
373 d242923c Michael Hanselmann
                        utils.NormalizeAndValidateThreeOctetMacPrefix, i)
374 d242923c Michael Hanselmann
375 d242923c Michael Hanselmann
  def testNormalization(self):
376 d242923c Michael Hanselmann
    for mac in ["aa:bb:cc", "00:AA:11"]:
377 d242923c Michael Hanselmann
      self.assertEqual(utils.NormalizeAndValidateThreeOctetMacPrefix(mac),
378 d242923c Michael Hanselmann
                       mac.lower())
379 d242923c Michael Hanselmann
380 d242923c Michael Hanselmann
381 7fcffe27 Michael Hanselmann
class TestSafeEncode(unittest.TestCase):
382 7fcffe27 Michael Hanselmann
  """Test case for SafeEncode"""
383 7fcffe27 Michael Hanselmann
384 7fcffe27 Michael Hanselmann
  def testAscii(self):
385 7fcffe27 Michael Hanselmann
    for txt in [string.digits, string.letters, string.punctuation]:
386 7fcffe27 Michael Hanselmann
      self.failUnlessEqual(txt, utils.SafeEncode(txt))
387 7fcffe27 Michael Hanselmann
388 7fcffe27 Michael Hanselmann
  def testDoubleEncode(self):
389 7fcffe27 Michael Hanselmann
    for i in range(255):
390 7fcffe27 Michael Hanselmann
      txt = utils.SafeEncode(chr(i))
391 7fcffe27 Michael Hanselmann
      self.failUnlessEqual(txt, utils.SafeEncode(txt))
392 7fcffe27 Michael Hanselmann
393 7fcffe27 Michael Hanselmann
  def testUnicode(self):
394 7fcffe27 Michael Hanselmann
    # 1024 is high enough to catch non-direct ASCII mappings
395 7fcffe27 Michael Hanselmann
    for i in range(1024):
396 7fcffe27 Michael Hanselmann
      txt = utils.SafeEncode(unichr(i))
397 7fcffe27 Michael Hanselmann
      self.failUnlessEqual(txt, utils.SafeEncode(txt))
398 7fcffe27 Michael Hanselmann
399 7fcffe27 Michael Hanselmann
400 7fcffe27 Michael Hanselmann
class TestUnescapeAndSplit(unittest.TestCase):
401 7fcffe27 Michael Hanselmann
  """Testing case for UnescapeAndSplit"""
402 7fcffe27 Michael Hanselmann
403 7fcffe27 Michael Hanselmann
  def setUp(self):
404 7fcffe27 Michael Hanselmann
    # testing more that one separator for regexp safety
405 e4a48c7b Michael Hanselmann
    self._seps = [",", "+", ".", ":"]
406 7fcffe27 Michael Hanselmann
407 7fcffe27 Michael Hanselmann
  def testSimple(self):
408 7fcffe27 Michael Hanselmann
    a = ["a", "b", "c", "d"]
409 7fcffe27 Michael Hanselmann
    for sep in self._seps:
410 7fcffe27 Michael Hanselmann
      self.failUnlessEqual(utils.UnescapeAndSplit(sep.join(a), sep=sep), a)
411 7fcffe27 Michael Hanselmann
412 7fcffe27 Michael Hanselmann
  def testEscape(self):
413 7fcffe27 Michael Hanselmann
    for sep in self._seps:
414 7fcffe27 Michael Hanselmann
      a = ["a", "b\\" + sep + "c", "d"]
415 7fcffe27 Michael Hanselmann
      b = ["a", "b" + sep + "c", "d"]
416 7fcffe27 Michael Hanselmann
      self.failUnlessEqual(utils.UnescapeAndSplit(sep.join(a), sep=sep), b)
417 7fcffe27 Michael Hanselmann
418 7fcffe27 Michael Hanselmann
  def testDoubleEscape(self):
419 7fcffe27 Michael Hanselmann
    for sep in self._seps:
420 7fcffe27 Michael Hanselmann
      a = ["a", "b\\\\", "c", "d"]
421 7fcffe27 Michael Hanselmann
      b = ["a", "b\\", "c", "d"]
422 7fcffe27 Michael Hanselmann
      self.failUnlessEqual(utils.UnescapeAndSplit(sep.join(a), sep=sep), b)
423 7fcffe27 Michael Hanselmann
424 7fcffe27 Michael Hanselmann
  def testThreeEscape(self):
425 7fcffe27 Michael Hanselmann
    for sep in self._seps:
426 7fcffe27 Michael Hanselmann
      a = ["a", "b\\\\\\" + sep + "c", "d"]
427 7fcffe27 Michael Hanselmann
      b = ["a", "b\\" + sep + "c", "d"]
428 7fcffe27 Michael Hanselmann
      self.failUnlessEqual(utils.UnescapeAndSplit(sep.join(a), sep=sep), b)
429 7fcffe27 Michael Hanselmann
430 e4a48c7b Michael Hanselmann
  def testEscapeAtEnd(self):
431 e4a48c7b Michael Hanselmann
    for sep in self._seps:
432 e4a48c7b Michael Hanselmann
      self.assertEqual(utils.UnescapeAndSplit("\\", sep=sep), ["\\"])
433 e4a48c7b Michael Hanselmann
434 e4a48c7b Michael Hanselmann
      a = ["a", "b\\", "c"]
435 e4a48c7b Michael Hanselmann
      b = ["a", "b" + sep + "c\\"]
436 e4a48c7b Michael Hanselmann
      self.assertEqual(utils.UnescapeAndSplit("%s\\" % sep.join(a), sep=sep), b)
437 e4a48c7b Michael Hanselmann
438 e4a48c7b Michael Hanselmann
      a = ["\\" + sep, "\\" + sep, "c", "d\\.moo"]
439 e4a48c7b Michael Hanselmann
      b = [sep, sep, "c", "d.moo\\"]
440 e4a48c7b Michael Hanselmann
      self.assertEqual(utils.UnescapeAndSplit("%s\\" % sep.join(a), sep=sep), b)
441 e4a48c7b Michael Hanselmann
442 e7f7212b Iustin Pop
  def testMultipleEscapes(self):
443 e7f7212b Iustin Pop
    for sep in self._seps:
444 e7f7212b Iustin Pop
      a = ["a", "b\\" + sep + "c", "d\\" + sep + "e\\" + sep + "f", "g"]
445 e7f7212b Iustin Pop
      b = ["a", "b" + sep + "c", "d" + sep + "e" + sep + "f", "g"]
446 e7f7212b Iustin Pop
      self.failUnlessEqual(utils.UnescapeAndSplit(sep.join(a), sep=sep), b)
447 e7f7212b Iustin Pop
448 7fcffe27 Michael Hanselmann
449 7fcffe27 Michael Hanselmann
class TestCommaJoin(unittest.TestCase):
450 7fcffe27 Michael Hanselmann
  def test(self):
451 7fcffe27 Michael Hanselmann
    self.assertEqual(utils.CommaJoin([]), "")
452 7fcffe27 Michael Hanselmann
    self.assertEqual(utils.CommaJoin([1, 2, 3]), "1, 2, 3")
453 7fcffe27 Michael Hanselmann
    self.assertEqual(utils.CommaJoin(["Hello"]), "Hello")
454 7fcffe27 Michael Hanselmann
    self.assertEqual(utils.CommaJoin(["Hello", "World"]), "Hello, World")
455 7fcffe27 Michael Hanselmann
    self.assertEqual(utils.CommaJoin(["Hello", "World", 99]),
456 7fcffe27 Michael Hanselmann
                     "Hello, World, 99")
457 7fcffe27 Michael Hanselmann
458 7fcffe27 Michael Hanselmann
459 7fcffe27 Michael Hanselmann
class TestFormatTime(unittest.TestCase):
460 7fcffe27 Michael Hanselmann
  """Testing case for FormatTime"""
461 7fcffe27 Michael Hanselmann
462 7fcffe27 Michael Hanselmann
  @staticmethod
463 26a72a48 Michael Hanselmann
  def _TestInProcess(tz, timestamp, usecs, expected):
464 7fcffe27 Michael Hanselmann
    os.environ["TZ"] = tz
465 7fcffe27 Michael Hanselmann
    time.tzset()
466 26a72a48 Michael Hanselmann
    return utils.FormatTime(timestamp, usecs=usecs) == expected
467 7fcffe27 Michael Hanselmann
468 7fcffe27 Michael Hanselmann
  def _Test(self, *args):
469 7fcffe27 Michael Hanselmann
    # Need to use separate process as we want to change TZ
470 7fcffe27 Michael Hanselmann
    self.assert_(utils.RunInSeparateProcess(self._TestInProcess, *args))
471 7fcffe27 Michael Hanselmann
472 7fcffe27 Michael Hanselmann
  def test(self):
473 26a72a48 Michael Hanselmann
    self._Test("UTC", 0, None, "1970-01-01 00:00:00")
474 26a72a48 Michael Hanselmann
    self._Test("America/Sao_Paulo", 1292606926, None, "2010-12-17 15:28:46")
475 26a72a48 Michael Hanselmann
    self._Test("Europe/London", 1292606926, None, "2010-12-17 17:28:46")
476 26a72a48 Michael Hanselmann
    self._Test("Europe/Zurich", 1292606926, None, "2010-12-17 18:28:46")
477 26a72a48 Michael Hanselmann
    self._Test("Europe/Zurich", 1332944288, 8787, "2012-03-28 16:18:08.008787")
478 26a72a48 Michael Hanselmann
    self._Test("Australia/Sydney", 1292606926, None, "2010-12-18 04:28:46")
479 26a72a48 Michael Hanselmann
    self._Test("Australia/Sydney", 1292606926, None, "2010-12-18 04:28:46")
480 26a72a48 Michael Hanselmann
    self._Test("Australia/Sydney", 1292606926, 999999,
481 26a72a48 Michael Hanselmann
               "2010-12-18 04:28:46.999999")
482 7fcffe27 Michael Hanselmann
483 7fcffe27 Michael Hanselmann
  def testNone(self):
484 7fcffe27 Michael Hanselmann
    self.failUnlessEqual(utils.FormatTime(None), "N/A")
485 7fcffe27 Michael Hanselmann
486 7fcffe27 Michael Hanselmann
  def testInvalid(self):
487 7fcffe27 Michael Hanselmann
    self.failUnlessEqual(utils.FormatTime(()), "N/A")
488 7fcffe27 Michael Hanselmann
489 7fcffe27 Michael Hanselmann
  def testNow(self):
490 7fcffe27 Michael Hanselmann
    # tests that we accept time.time input
491 7fcffe27 Michael Hanselmann
    utils.FormatTime(time.time())
492 7fcffe27 Michael Hanselmann
    # tests that we accept int input
493 7fcffe27 Michael Hanselmann
    utils.FormatTime(int(time.time()))
494 7fcffe27 Michael Hanselmann
495 7fcffe27 Michael Hanselmann
496 7fcffe27 Michael Hanselmann
class TestFormatSeconds(unittest.TestCase):
497 7fcffe27 Michael Hanselmann
  def test(self):
498 7fcffe27 Michael Hanselmann
    self.assertEqual(utils.FormatSeconds(1), "1s")
499 7fcffe27 Michael Hanselmann
    self.assertEqual(utils.FormatSeconds(3600), "1h 0m 0s")
500 7fcffe27 Michael Hanselmann
    self.assertEqual(utils.FormatSeconds(3599), "59m 59s")
501 7fcffe27 Michael Hanselmann
    self.assertEqual(utils.FormatSeconds(7200), "2h 0m 0s")
502 7fcffe27 Michael Hanselmann
    self.assertEqual(utils.FormatSeconds(7201), "2h 0m 1s")
503 7fcffe27 Michael Hanselmann
    self.assertEqual(utils.FormatSeconds(7281), "2h 1m 21s")
504 7fcffe27 Michael Hanselmann
    self.assertEqual(utils.FormatSeconds(29119), "8h 5m 19s")
505 7fcffe27 Michael Hanselmann
    self.assertEqual(utils.FormatSeconds(19431228), "224d 21h 33m 48s")
506 7fcffe27 Michael Hanselmann
    self.assertEqual(utils.FormatSeconds(-1), "-1s")
507 7fcffe27 Michael Hanselmann
    self.assertEqual(utils.FormatSeconds(-282), "-282s")
508 7fcffe27 Michael Hanselmann
    self.assertEqual(utils.FormatSeconds(-29119), "-29119s")
509 7fcffe27 Michael Hanselmann
510 7fcffe27 Michael Hanselmann
  def testFloat(self):
511 7fcffe27 Michael Hanselmann
    self.assertEqual(utils.FormatSeconds(1.3), "1s")
512 7fcffe27 Michael Hanselmann
    self.assertEqual(utils.FormatSeconds(1.9), "2s")
513 7fcffe27 Michael Hanselmann
    self.assertEqual(utils.FormatSeconds(3912.12311), "1h 5m 12s")
514 7fcffe27 Michael Hanselmann
    self.assertEqual(utils.FormatSeconds(3912.8), "1h 5m 13s")
515 7fcffe27 Michael Hanselmann
516 7fcffe27 Michael Hanselmann
517 7fcffe27 Michael Hanselmann
class TestLineSplitter(unittest.TestCase):
518 7fcffe27 Michael Hanselmann
  def test(self):
519 7fcffe27 Michael Hanselmann
    lines = []
520 7fcffe27 Michael Hanselmann
    ls = utils.LineSplitter(lines.append)
521 7fcffe27 Michael Hanselmann
    ls.write("Hello World\n")
522 7fcffe27 Michael Hanselmann
    self.assertEqual(lines, [])
523 7fcffe27 Michael Hanselmann
    ls.write("Foo\n Bar\r\n ")
524 7fcffe27 Michael Hanselmann
    ls.write("Baz")
525 7fcffe27 Michael Hanselmann
    ls.write("Moo")
526 7fcffe27 Michael Hanselmann
    self.assertEqual(lines, [])
527 7fcffe27 Michael Hanselmann
    ls.flush()
528 7fcffe27 Michael Hanselmann
    self.assertEqual(lines, ["Hello World", "Foo", " Bar"])
529 7fcffe27 Michael Hanselmann
    ls.close()
530 7fcffe27 Michael Hanselmann
    self.assertEqual(lines, ["Hello World", "Foo", " Bar", " BazMoo"])
531 7fcffe27 Michael Hanselmann
532 7fcffe27 Michael Hanselmann
  def _testExtra(self, line, all_lines, p1, p2):
533 7fcffe27 Michael Hanselmann
    self.assertEqual(p1, 999)
534 7fcffe27 Michael Hanselmann
    self.assertEqual(p2, "extra")
535 7fcffe27 Michael Hanselmann
    all_lines.append(line)
536 7fcffe27 Michael Hanselmann
537 7fcffe27 Michael Hanselmann
  def testExtraArgsNoFlush(self):
538 7fcffe27 Michael Hanselmann
    lines = []
539 7fcffe27 Michael Hanselmann
    ls = utils.LineSplitter(self._testExtra, lines, 999, "extra")
540 7fcffe27 Michael Hanselmann
    ls.write("\n\nHello World\n")
541 7fcffe27 Michael Hanselmann
    ls.write("Foo\n Bar\r\n ")
542 7fcffe27 Michael Hanselmann
    ls.write("")
543 7fcffe27 Michael Hanselmann
    ls.write("Baz")
544 7fcffe27 Michael Hanselmann
    ls.write("Moo\n\nx\n")
545 7fcffe27 Michael Hanselmann
    self.assertEqual(lines, [])
546 7fcffe27 Michael Hanselmann
    ls.close()
547 7fcffe27 Michael Hanselmann
    self.assertEqual(lines, ["", "", "Hello World", "Foo", " Bar", " BazMoo",
548 7fcffe27 Michael Hanselmann
                             "", "x"])
549 7fcffe27 Michael Hanselmann
550 7fcffe27 Michael Hanselmann
551 7ebd876f Michael Hanselmann
class TestIsValidShellParam(unittest.TestCase):
552 7ebd876f Michael Hanselmann
  def test(self):
553 7ebd876f Michael Hanselmann
    for val, result in [
554 7ebd876f Michael Hanselmann
      ("abc", True),
555 7ebd876f Michael Hanselmann
      ("ab;cd", False),
556 7ebd876f Michael Hanselmann
      ]:
557 7ebd876f Michael Hanselmann
      self.assertEqual(utils.IsValidShellParam(val), result)
558 7ebd876f Michael Hanselmann
559 7ebd876f Michael Hanselmann
560 7ebd876f Michael Hanselmann
class TestBuildShellCmd(unittest.TestCase):
561 7ebd876f Michael Hanselmann
  def test(self):
562 7ebd876f Michael Hanselmann
    self.assertRaises(errors.ProgrammerError, utils.BuildShellCmd,
563 7ebd876f Michael Hanselmann
                      "ls %s", "ab;cd")
564 7ebd876f Michael Hanselmann
    self.assertEqual(utils.BuildShellCmd("ls %s", "ab"), "ls ab")
565 7ebd876f Michael Hanselmann
566 7ebd876f Michael Hanselmann
567 92ea69bf Michael Hanselmann
class TestOrdinal(unittest.TestCase):
568 92ea69bf Michael Hanselmann
  def test(self):
569 92ea69bf Michael Hanselmann
    checks = {
570 92ea69bf Michael Hanselmann
      0: "0th", 1: "1st", 2: "2nd", 3: "3rd", 4: "4th", 5: "5th", 6: "6th",
571 92ea69bf Michael Hanselmann
      7: "7th", 8: "8th", 9: "9th", 10: "10th", 11: "11th", 12: "12th",
572 92ea69bf Michael Hanselmann
      13: "13th", 14: "14th", 15: "15th", 16: "16th", 17: "17th",
573 92ea69bf Michael Hanselmann
      18: "18th", 19: "19th", 20: "20th", 21: "21st", 25: "25th", 30: "30th",
574 92ea69bf Michael Hanselmann
      32: "32nd", 40: "40th", 50: "50th", 55: "55th", 60: "60th", 62: "62nd",
575 92ea69bf Michael Hanselmann
      70: "70th", 80: "80th", 83: "83rd", 90: "90th", 91: "91st",
576 92ea69bf Michael Hanselmann
      582: "582nd", 999: "999th",
577 92ea69bf Michael Hanselmann
      }
578 92ea69bf Michael Hanselmann
579 92ea69bf Michael Hanselmann
    for value, ordinal in checks.items():
580 92ea69bf Michael Hanselmann
      self.assertEqual(utils.FormatOrdinal(value), ordinal)
581 92ea69bf Michael Hanselmann
582 92ea69bf Michael Hanselmann
583 5401c39d Michael Hanselmann
class TestTruncate(unittest.TestCase):
584 5401c39d Michael Hanselmann
  def _Test(self, text, length):
585 5401c39d Michael Hanselmann
    result = utils.Truncate(text, length)
586 5401c39d Michael Hanselmann
    self.assertTrue(len(result) <= length)
587 5401c39d Michael Hanselmann
    return result
588 5401c39d Michael Hanselmann
589 5401c39d Michael Hanselmann
  def test(self):
590 5401c39d Michael Hanselmann
    self.assertEqual(self._Test("", 80), "")
591 5401c39d Michael Hanselmann
    self.assertEqual(self._Test("abc", 4), "abc")
592 5401c39d Michael Hanselmann
    self.assertEqual(self._Test("Hello World", 80), "Hello World")
593 5401c39d Michael Hanselmann
    self.assertEqual(self._Test("Hello World", 4), "H...")
594 5401c39d Michael Hanselmann
    self.assertEqual(self._Test("Hello World", 5), "He...")
595 5401c39d Michael Hanselmann
596 5401c39d Michael Hanselmann
    for i in [4, 10, 100]:
597 5401c39d Michael Hanselmann
      data = i * "FooBarBaz"
598 5401c39d Michael Hanselmann
      self.assertEqual(self._Test(data, len(data)), data)
599 5401c39d Michael Hanselmann
600 5401c39d Michael Hanselmann
    for (length, exp) in [(8, u"T\u00e4st\u2026xyz"), (7, u"T\u00e4st...")]:
601 5401c39d Michael Hanselmann
      self.assertEqual(self._Test(u"T\u00e4st\u2026xyz", length), exp)
602 5401c39d Michael Hanselmann
603 5401c39d Michael Hanselmann
    self.assertEqual(self._Test(range(100), 20), "[0, 1, 2, 3, 4, 5...")
604 5401c39d Michael Hanselmann
605 5401c39d Michael Hanselmann
  def testError(self):
606 5401c39d Michael Hanselmann
    for i in range(4):
607 5401c39d Michael Hanselmann
      self.assertRaises(AssertionError, utils.Truncate, "", i)
608 5401c39d Michael Hanselmann
609 5401c39d Michael Hanselmann
610 1be3e86c Michael Hanselmann
class TestFilterEmptyLinesAndComments(unittest.TestCase):
611 1be3e86c Michael Hanselmann
  def testEmpty(self):
612 6a9b9778 Michael Hanselmann
    self.assertEqual(utils.FilterEmptyLinesAndComments(""), [])
613 6a9b9778 Michael Hanselmann
    self.assertEqual(utils.FilterEmptyLinesAndComments("\n"), [])
614 6a9b9778 Michael Hanselmann
    self.assertEqual(utils.FilterEmptyLinesAndComments("\n" * 100), [])
615 6a9b9778 Michael Hanselmann
    self.assertEqual(utils.FilterEmptyLinesAndComments("\n  \n\t \n"), [])
616 1be3e86c Michael Hanselmann
617 1be3e86c Michael Hanselmann
  def test(self):
618 1be3e86c Michael Hanselmann
    text = """
619 1be3e86c Michael Hanselmann
      This
620 1be3e86c Michael Hanselmann
        is
621 1be3e86c Michael Hanselmann
      # with comments
622 1be3e86c Michael Hanselmann
          a
623 1be3e86c Michael Hanselmann
            test
624 1be3e86c Michael Hanselmann
            # in
625 1be3e86c Michael Hanselmann
            #
626 1be3e86c Michael Hanselmann
            saying
627 1be3e86c Michael Hanselmann
      ...#...
628 1be3e86c Michael Hanselmann
        # multiple places
629 1be3e86c Michael Hanselmann
        Hello World!
630 1be3e86c Michael Hanselmann
      """
631 6a9b9778 Michael Hanselmann
    self.assertEqual(utils.FilterEmptyLinesAndComments(text), [
632 1be3e86c Michael Hanselmann
      "This",
633 1be3e86c Michael Hanselmann
      "is",
634 1be3e86c Michael Hanselmann
      "a",
635 1be3e86c Michael Hanselmann
      "test",
636 1be3e86c Michael Hanselmann
      "saying",
637 1be3e86c Michael Hanselmann
      "...#...",
638 1be3e86c Michael Hanselmann
      "Hello World!",
639 1be3e86c Michael Hanselmann
      ])
640 1be3e86c Michael Hanselmann
641 1be3e86c Michael Hanselmann
642 eac9b7b8 Michael Hanselmann
class TestFormatKeyValue(unittest.TestCase):
643 eac9b7b8 Michael Hanselmann
  def test(self):
644 eac9b7b8 Michael Hanselmann
    self.assertEqual(utils.FormatKeyValue({}), [])
645 eac9b7b8 Michael Hanselmann
    self.assertEqual(utils.FormatKeyValue({1: 2}), ["1=2"])
646 eac9b7b8 Michael Hanselmann
    self.assertEqual(utils.FormatKeyValue({
647 eac9b7b8 Michael Hanselmann
      "zzz": "0",
648 eac9b7b8 Michael Hanselmann
      "aaa": "1",
649 eac9b7b8 Michael Hanselmann
      }),
650 eac9b7b8 Michael Hanselmann
      ["aaa=1", "zzz=0"])
651 eac9b7b8 Michael Hanselmann
652 eac9b7b8 Michael Hanselmann
653 7fcffe27 Michael Hanselmann
if __name__ == "__main__":
654 7fcffe27 Michael Hanselmann
  testutils.GanetiTestProgram()