Statistics
| Branch: | Tag: | Revision:

root / test / py / ganeti.utils.text_unittest.py @ 560ef132

History | View | Annotate | Download (22.7 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 f2b91949 Klaus Aehlig
class TestEscapeAndJoin(unittest.TestCase):
449 f2b91949 Klaus Aehlig
  def verifyParsesCorrect(self, args):
450 f2b91949 Klaus Aehlig
    for sep in [",", "+", ".", ":"]:
451 f2b91949 Klaus Aehlig
      self.assertEqual(utils.UnescapeAndSplit(
452 f2b91949 Klaus Aehlig
          utils.EscapeAndJoin(args, sep=sep),
453 f2b91949 Klaus Aehlig
          sep=sep), args)
454 f2b91949 Klaus Aehlig
455 f2b91949 Klaus Aehlig
  def test(self):
456 f2b91949 Klaus Aehlig
    self.verifyParsesCorrect(["a", "b", "c"])
457 f2b91949 Klaus Aehlig
    self.verifyParsesCorrect(["2.10.0", "12345"])
458 f2b91949 Klaus Aehlig
    self.verifyParsesCorrect(["2.10.0~alpha1", "12345"])
459 f2b91949 Klaus Aehlig
    self.verifyParsesCorrect(["..:", ",,+"])
460 f2b91949 Klaus Aehlig
    self.verifyParsesCorrect(["a\\", "b\\\\", "c"])
461 f2b91949 Klaus Aehlig
    self.verifyParsesCorrect(["a"])
462 f2b91949 Klaus Aehlig
    self.verifyParsesCorrect(["+"])
463 f2b91949 Klaus Aehlig
    self.verifyParsesCorrect(["\\"])
464 f2b91949 Klaus Aehlig
    self.verifyParsesCorrect(["\\\\"])
465 f2b91949 Klaus Aehlig
466 7fcffe27 Michael Hanselmann
467 7fcffe27 Michael Hanselmann
class TestCommaJoin(unittest.TestCase):
468 7fcffe27 Michael Hanselmann
  def test(self):
469 7fcffe27 Michael Hanselmann
    self.assertEqual(utils.CommaJoin([]), "")
470 7fcffe27 Michael Hanselmann
    self.assertEqual(utils.CommaJoin([1, 2, 3]), "1, 2, 3")
471 7fcffe27 Michael Hanselmann
    self.assertEqual(utils.CommaJoin(["Hello"]), "Hello")
472 7fcffe27 Michael Hanselmann
    self.assertEqual(utils.CommaJoin(["Hello", "World"]), "Hello, World")
473 7fcffe27 Michael Hanselmann
    self.assertEqual(utils.CommaJoin(["Hello", "World", 99]),
474 7fcffe27 Michael Hanselmann
                     "Hello, World, 99")
475 7fcffe27 Michael Hanselmann
476 7fcffe27 Michael Hanselmann
477 7fcffe27 Michael Hanselmann
class TestFormatTime(unittest.TestCase):
478 7fcffe27 Michael Hanselmann
  """Testing case for FormatTime"""
479 7fcffe27 Michael Hanselmann
480 7fcffe27 Michael Hanselmann
  @staticmethod
481 26a72a48 Michael Hanselmann
  def _TestInProcess(tz, timestamp, usecs, expected):
482 7fcffe27 Michael Hanselmann
    os.environ["TZ"] = tz
483 7fcffe27 Michael Hanselmann
    time.tzset()
484 26a72a48 Michael Hanselmann
    return utils.FormatTime(timestamp, usecs=usecs) == expected
485 7fcffe27 Michael Hanselmann
486 7fcffe27 Michael Hanselmann
  def _Test(self, *args):
487 7fcffe27 Michael Hanselmann
    # Need to use separate process as we want to change TZ
488 7fcffe27 Michael Hanselmann
    self.assert_(utils.RunInSeparateProcess(self._TestInProcess, *args))
489 7fcffe27 Michael Hanselmann
490 7fcffe27 Michael Hanselmann
  def test(self):
491 26a72a48 Michael Hanselmann
    self._Test("UTC", 0, None, "1970-01-01 00:00:00")
492 26a72a48 Michael Hanselmann
    self._Test("America/Sao_Paulo", 1292606926, None, "2010-12-17 15:28:46")
493 26a72a48 Michael Hanselmann
    self._Test("Europe/London", 1292606926, None, "2010-12-17 17:28:46")
494 26a72a48 Michael Hanselmann
    self._Test("Europe/Zurich", 1292606926, None, "2010-12-17 18:28:46")
495 26a72a48 Michael Hanselmann
    self._Test("Europe/Zurich", 1332944288, 8787, "2012-03-28 16:18:08.008787")
496 26a72a48 Michael Hanselmann
    self._Test("Australia/Sydney", 1292606926, None, "2010-12-18 04:28:46")
497 26a72a48 Michael Hanselmann
    self._Test("Australia/Sydney", 1292606926, None, "2010-12-18 04:28:46")
498 26a72a48 Michael Hanselmann
    self._Test("Australia/Sydney", 1292606926, 999999,
499 26a72a48 Michael Hanselmann
               "2010-12-18 04:28:46.999999")
500 7fcffe27 Michael Hanselmann
501 7fcffe27 Michael Hanselmann
  def testNone(self):
502 7fcffe27 Michael Hanselmann
    self.failUnlessEqual(utils.FormatTime(None), "N/A")
503 7fcffe27 Michael Hanselmann
504 7fcffe27 Michael Hanselmann
  def testInvalid(self):
505 7fcffe27 Michael Hanselmann
    self.failUnlessEqual(utils.FormatTime(()), "N/A")
506 7fcffe27 Michael Hanselmann
507 7fcffe27 Michael Hanselmann
  def testNow(self):
508 7fcffe27 Michael Hanselmann
    # tests that we accept time.time input
509 7fcffe27 Michael Hanselmann
    utils.FormatTime(time.time())
510 7fcffe27 Michael Hanselmann
    # tests that we accept int input
511 7fcffe27 Michael Hanselmann
    utils.FormatTime(int(time.time()))
512 7fcffe27 Michael Hanselmann
513 7fcffe27 Michael Hanselmann
514 7fcffe27 Michael Hanselmann
class TestFormatSeconds(unittest.TestCase):
515 7fcffe27 Michael Hanselmann
  def test(self):
516 7fcffe27 Michael Hanselmann
    self.assertEqual(utils.FormatSeconds(1), "1s")
517 7fcffe27 Michael Hanselmann
    self.assertEqual(utils.FormatSeconds(3600), "1h 0m 0s")
518 7fcffe27 Michael Hanselmann
    self.assertEqual(utils.FormatSeconds(3599), "59m 59s")
519 7fcffe27 Michael Hanselmann
    self.assertEqual(utils.FormatSeconds(7200), "2h 0m 0s")
520 7fcffe27 Michael Hanselmann
    self.assertEqual(utils.FormatSeconds(7201), "2h 0m 1s")
521 7fcffe27 Michael Hanselmann
    self.assertEqual(utils.FormatSeconds(7281), "2h 1m 21s")
522 7fcffe27 Michael Hanselmann
    self.assertEqual(utils.FormatSeconds(29119), "8h 5m 19s")
523 7fcffe27 Michael Hanselmann
    self.assertEqual(utils.FormatSeconds(19431228), "224d 21h 33m 48s")
524 7fcffe27 Michael Hanselmann
    self.assertEqual(utils.FormatSeconds(-1), "-1s")
525 7fcffe27 Michael Hanselmann
    self.assertEqual(utils.FormatSeconds(-282), "-282s")
526 7fcffe27 Michael Hanselmann
    self.assertEqual(utils.FormatSeconds(-29119), "-29119s")
527 7fcffe27 Michael Hanselmann
528 7fcffe27 Michael Hanselmann
  def testFloat(self):
529 7fcffe27 Michael Hanselmann
    self.assertEqual(utils.FormatSeconds(1.3), "1s")
530 7fcffe27 Michael Hanselmann
    self.assertEqual(utils.FormatSeconds(1.9), "2s")
531 7fcffe27 Michael Hanselmann
    self.assertEqual(utils.FormatSeconds(3912.12311), "1h 5m 12s")
532 7fcffe27 Michael Hanselmann
    self.assertEqual(utils.FormatSeconds(3912.8), "1h 5m 13s")
533 7fcffe27 Michael Hanselmann
534 7fcffe27 Michael Hanselmann
535 7fcffe27 Michael Hanselmann
class TestLineSplitter(unittest.TestCase):
536 7fcffe27 Michael Hanselmann
  def test(self):
537 7fcffe27 Michael Hanselmann
    lines = []
538 7fcffe27 Michael Hanselmann
    ls = utils.LineSplitter(lines.append)
539 7fcffe27 Michael Hanselmann
    ls.write("Hello World\n")
540 7fcffe27 Michael Hanselmann
    self.assertEqual(lines, [])
541 7fcffe27 Michael Hanselmann
    ls.write("Foo\n Bar\r\n ")
542 7fcffe27 Michael Hanselmann
    ls.write("Baz")
543 7fcffe27 Michael Hanselmann
    ls.write("Moo")
544 7fcffe27 Michael Hanselmann
    self.assertEqual(lines, [])
545 7fcffe27 Michael Hanselmann
    ls.flush()
546 7fcffe27 Michael Hanselmann
    self.assertEqual(lines, ["Hello World", "Foo", " Bar"])
547 7fcffe27 Michael Hanselmann
    ls.close()
548 7fcffe27 Michael Hanselmann
    self.assertEqual(lines, ["Hello World", "Foo", " Bar", " BazMoo"])
549 7fcffe27 Michael Hanselmann
550 7fcffe27 Michael Hanselmann
  def _testExtra(self, line, all_lines, p1, p2):
551 7fcffe27 Michael Hanselmann
    self.assertEqual(p1, 999)
552 7fcffe27 Michael Hanselmann
    self.assertEqual(p2, "extra")
553 7fcffe27 Michael Hanselmann
    all_lines.append(line)
554 7fcffe27 Michael Hanselmann
555 7fcffe27 Michael Hanselmann
  def testExtraArgsNoFlush(self):
556 7fcffe27 Michael Hanselmann
    lines = []
557 7fcffe27 Michael Hanselmann
    ls = utils.LineSplitter(self._testExtra, lines, 999, "extra")
558 7fcffe27 Michael Hanselmann
    ls.write("\n\nHello World\n")
559 7fcffe27 Michael Hanselmann
    ls.write("Foo\n Bar\r\n ")
560 7fcffe27 Michael Hanselmann
    ls.write("")
561 7fcffe27 Michael Hanselmann
    ls.write("Baz")
562 7fcffe27 Michael Hanselmann
    ls.write("Moo\n\nx\n")
563 7fcffe27 Michael Hanselmann
    self.assertEqual(lines, [])
564 7fcffe27 Michael Hanselmann
    ls.close()
565 7fcffe27 Michael Hanselmann
    self.assertEqual(lines, ["", "", "Hello World", "Foo", " Bar", " BazMoo",
566 7fcffe27 Michael Hanselmann
                             "", "x"])
567 7fcffe27 Michael Hanselmann
568 7fcffe27 Michael Hanselmann
569 7ebd876f Michael Hanselmann
class TestIsValidShellParam(unittest.TestCase):
570 7ebd876f Michael Hanselmann
  def test(self):
571 7ebd876f Michael Hanselmann
    for val, result in [
572 7ebd876f Michael Hanselmann
      ("abc", True),
573 7ebd876f Michael Hanselmann
      ("ab;cd", False),
574 7ebd876f Michael Hanselmann
      ]:
575 7ebd876f Michael Hanselmann
      self.assertEqual(utils.IsValidShellParam(val), result)
576 7ebd876f Michael Hanselmann
577 7ebd876f Michael Hanselmann
578 7ebd876f Michael Hanselmann
class TestBuildShellCmd(unittest.TestCase):
579 7ebd876f Michael Hanselmann
  def test(self):
580 7ebd876f Michael Hanselmann
    self.assertRaises(errors.ProgrammerError, utils.BuildShellCmd,
581 7ebd876f Michael Hanselmann
                      "ls %s", "ab;cd")
582 7ebd876f Michael Hanselmann
    self.assertEqual(utils.BuildShellCmd("ls %s", "ab"), "ls ab")
583 7ebd876f Michael Hanselmann
584 7ebd876f Michael Hanselmann
585 92ea69bf Michael Hanselmann
class TestOrdinal(unittest.TestCase):
586 92ea69bf Michael Hanselmann
  def test(self):
587 92ea69bf Michael Hanselmann
    checks = {
588 92ea69bf Michael Hanselmann
      0: "0th", 1: "1st", 2: "2nd", 3: "3rd", 4: "4th", 5: "5th", 6: "6th",
589 92ea69bf Michael Hanselmann
      7: "7th", 8: "8th", 9: "9th", 10: "10th", 11: "11th", 12: "12th",
590 92ea69bf Michael Hanselmann
      13: "13th", 14: "14th", 15: "15th", 16: "16th", 17: "17th",
591 92ea69bf Michael Hanselmann
      18: "18th", 19: "19th", 20: "20th", 21: "21st", 25: "25th", 30: "30th",
592 92ea69bf Michael Hanselmann
      32: "32nd", 40: "40th", 50: "50th", 55: "55th", 60: "60th", 62: "62nd",
593 92ea69bf Michael Hanselmann
      70: "70th", 80: "80th", 83: "83rd", 90: "90th", 91: "91st",
594 92ea69bf Michael Hanselmann
      582: "582nd", 999: "999th",
595 92ea69bf Michael Hanselmann
      }
596 92ea69bf Michael Hanselmann
597 92ea69bf Michael Hanselmann
    for value, ordinal in checks.items():
598 92ea69bf Michael Hanselmann
      self.assertEqual(utils.FormatOrdinal(value), ordinal)
599 92ea69bf Michael Hanselmann
600 92ea69bf Michael Hanselmann
601 5401c39d Michael Hanselmann
class TestTruncate(unittest.TestCase):
602 5401c39d Michael Hanselmann
  def _Test(self, text, length):
603 5401c39d Michael Hanselmann
    result = utils.Truncate(text, length)
604 5401c39d Michael Hanselmann
    self.assertTrue(len(result) <= length)
605 5401c39d Michael Hanselmann
    return result
606 5401c39d Michael Hanselmann
607 5401c39d Michael Hanselmann
  def test(self):
608 5401c39d Michael Hanselmann
    self.assertEqual(self._Test("", 80), "")
609 5401c39d Michael Hanselmann
    self.assertEqual(self._Test("abc", 4), "abc")
610 5401c39d Michael Hanselmann
    self.assertEqual(self._Test("Hello World", 80), "Hello World")
611 5401c39d Michael Hanselmann
    self.assertEqual(self._Test("Hello World", 4), "H...")
612 5401c39d Michael Hanselmann
    self.assertEqual(self._Test("Hello World", 5), "He...")
613 5401c39d Michael Hanselmann
614 5401c39d Michael Hanselmann
    for i in [4, 10, 100]:
615 5401c39d Michael Hanselmann
      data = i * "FooBarBaz"
616 5401c39d Michael Hanselmann
      self.assertEqual(self._Test(data, len(data)), data)
617 5401c39d Michael Hanselmann
618 5401c39d Michael Hanselmann
    for (length, exp) in [(8, u"T\u00e4st\u2026xyz"), (7, u"T\u00e4st...")]:
619 5401c39d Michael Hanselmann
      self.assertEqual(self._Test(u"T\u00e4st\u2026xyz", length), exp)
620 5401c39d Michael Hanselmann
621 5401c39d Michael Hanselmann
    self.assertEqual(self._Test(range(100), 20), "[0, 1, 2, 3, 4, 5...")
622 5401c39d Michael Hanselmann
623 5401c39d Michael Hanselmann
  def testError(self):
624 5401c39d Michael Hanselmann
    for i in range(4):
625 5401c39d Michael Hanselmann
      self.assertRaises(AssertionError, utils.Truncate, "", i)
626 5401c39d Michael Hanselmann
627 5401c39d Michael Hanselmann
628 1be3e86c Michael Hanselmann
class TestFilterEmptyLinesAndComments(unittest.TestCase):
629 1be3e86c Michael Hanselmann
  def testEmpty(self):
630 6a9b9778 Michael Hanselmann
    self.assertEqual(utils.FilterEmptyLinesAndComments(""), [])
631 6a9b9778 Michael Hanselmann
    self.assertEqual(utils.FilterEmptyLinesAndComments("\n"), [])
632 6a9b9778 Michael Hanselmann
    self.assertEqual(utils.FilterEmptyLinesAndComments("\n" * 100), [])
633 6a9b9778 Michael Hanselmann
    self.assertEqual(utils.FilterEmptyLinesAndComments("\n  \n\t \n"), [])
634 1be3e86c Michael Hanselmann
635 1be3e86c Michael Hanselmann
  def test(self):
636 1be3e86c Michael Hanselmann
    text = """
637 1be3e86c Michael Hanselmann
      This
638 1be3e86c Michael Hanselmann
        is
639 1be3e86c Michael Hanselmann
      # with comments
640 1be3e86c Michael Hanselmann
          a
641 1be3e86c Michael Hanselmann
            test
642 1be3e86c Michael Hanselmann
            # in
643 1be3e86c Michael Hanselmann
            #
644 1be3e86c Michael Hanselmann
            saying
645 1be3e86c Michael Hanselmann
      ...#...
646 1be3e86c Michael Hanselmann
        # multiple places
647 1be3e86c Michael Hanselmann
        Hello World!
648 1be3e86c Michael Hanselmann
      """
649 6a9b9778 Michael Hanselmann
    self.assertEqual(utils.FilterEmptyLinesAndComments(text), [
650 1be3e86c Michael Hanselmann
      "This",
651 1be3e86c Michael Hanselmann
      "is",
652 1be3e86c Michael Hanselmann
      "a",
653 1be3e86c Michael Hanselmann
      "test",
654 1be3e86c Michael Hanselmann
      "saying",
655 1be3e86c Michael Hanselmann
      "...#...",
656 1be3e86c Michael Hanselmann
      "Hello World!",
657 1be3e86c Michael Hanselmann
      ])
658 1be3e86c Michael Hanselmann
659 1be3e86c Michael Hanselmann
660 eac9b7b8 Michael Hanselmann
class TestFormatKeyValue(unittest.TestCase):
661 eac9b7b8 Michael Hanselmann
  def test(self):
662 eac9b7b8 Michael Hanselmann
    self.assertEqual(utils.FormatKeyValue({}), [])
663 eac9b7b8 Michael Hanselmann
    self.assertEqual(utils.FormatKeyValue({1: 2}), ["1=2"])
664 eac9b7b8 Michael Hanselmann
    self.assertEqual(utils.FormatKeyValue({
665 eac9b7b8 Michael Hanselmann
      "zzz": "0",
666 eac9b7b8 Michael Hanselmann
      "aaa": "1",
667 eac9b7b8 Michael Hanselmann
      }),
668 eac9b7b8 Michael Hanselmann
      ["aaa=1", "zzz=0"])
669 eac9b7b8 Michael Hanselmann
670 eac9b7b8 Michael Hanselmann
671 7fcffe27 Michael Hanselmann
if __name__ == "__main__":
672 7fcffe27 Michael Hanselmann
  testutils.GanetiTestProgram()