Statistics
| Branch: | Tag: | Revision:

root / test / ganeti.utils.text_unittest.py @ 66d1f035

History | View | Annotate | Download (15.5 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 7fcffe27 Michael Hanselmann
class TestFormatUnit(unittest.TestCase):
110 7fcffe27 Michael Hanselmann
  """Test case for the FormatUnit function"""
111 7fcffe27 Michael Hanselmann
112 7fcffe27 Michael Hanselmann
  def testMiB(self):
113 7fcffe27 Michael Hanselmann
    self.assertEqual(utils.FormatUnit(1, "h"), "1M")
114 7fcffe27 Michael Hanselmann
    self.assertEqual(utils.FormatUnit(100, "h"), "100M")
115 7fcffe27 Michael Hanselmann
    self.assertEqual(utils.FormatUnit(1023, "h"), "1023M")
116 7fcffe27 Michael Hanselmann
117 7fcffe27 Michael Hanselmann
    self.assertEqual(utils.FormatUnit(1, "m"), "1")
118 7fcffe27 Michael Hanselmann
    self.assertEqual(utils.FormatUnit(100, "m"), "100")
119 7fcffe27 Michael Hanselmann
    self.assertEqual(utils.FormatUnit(1023, "m"), "1023")
120 7fcffe27 Michael Hanselmann
121 7fcffe27 Michael Hanselmann
    self.assertEqual(utils.FormatUnit(1024, "m"), "1024")
122 7fcffe27 Michael Hanselmann
    self.assertEqual(utils.FormatUnit(1536, "m"), "1536")
123 7fcffe27 Michael Hanselmann
    self.assertEqual(utils.FormatUnit(17133, "m"), "17133")
124 7fcffe27 Michael Hanselmann
    self.assertEqual(utils.FormatUnit(1024 * 1024 - 1, "m"), "1048575")
125 7fcffe27 Michael Hanselmann
126 7fcffe27 Michael Hanselmann
  def testGiB(self):
127 7fcffe27 Michael Hanselmann
    self.assertEqual(utils.FormatUnit(1024, "h"), "1.0G")
128 7fcffe27 Michael Hanselmann
    self.assertEqual(utils.FormatUnit(1536, "h"), "1.5G")
129 7fcffe27 Michael Hanselmann
    self.assertEqual(utils.FormatUnit(17133, "h"), "16.7G")
130 7fcffe27 Michael Hanselmann
    self.assertEqual(utils.FormatUnit(1024 * 1024 - 1, "h"), "1024.0G")
131 7fcffe27 Michael Hanselmann
132 7fcffe27 Michael Hanselmann
    self.assertEqual(utils.FormatUnit(1024, "g"), "1.0")
133 7fcffe27 Michael Hanselmann
    self.assertEqual(utils.FormatUnit(1536, "g"), "1.5")
134 7fcffe27 Michael Hanselmann
    self.assertEqual(utils.FormatUnit(17133, "g"), "16.7")
135 7fcffe27 Michael Hanselmann
    self.assertEqual(utils.FormatUnit(1024 * 1024 - 1, "g"), "1024.0")
136 7fcffe27 Michael Hanselmann
137 7fcffe27 Michael Hanselmann
    self.assertEqual(utils.FormatUnit(1024 * 1024, "g"), "1024.0")
138 7fcffe27 Michael Hanselmann
    self.assertEqual(utils.FormatUnit(5120 * 1024, "g"), "5120.0")
139 7fcffe27 Michael Hanselmann
    self.assertEqual(utils.FormatUnit(29829 * 1024, "g"), "29829.0")
140 7fcffe27 Michael Hanselmann
141 7fcffe27 Michael Hanselmann
  def testTiB(self):
142 7fcffe27 Michael Hanselmann
    self.assertEqual(utils.FormatUnit(1024 * 1024, "h"), "1.0T")
143 7fcffe27 Michael Hanselmann
    self.assertEqual(utils.FormatUnit(5120 * 1024, "h"), "5.0T")
144 7fcffe27 Michael Hanselmann
    self.assertEqual(utils.FormatUnit(29829 * 1024, "h"), "29.1T")
145 7fcffe27 Michael Hanselmann
146 7fcffe27 Michael Hanselmann
    self.assertEqual(utils.FormatUnit(1024 * 1024, "t"), "1.0")
147 7fcffe27 Michael Hanselmann
    self.assertEqual(utils.FormatUnit(5120 * 1024, "t"), "5.0")
148 7fcffe27 Michael Hanselmann
    self.assertEqual(utils.FormatUnit(29829 * 1024, "t"), "29.1")
149 7fcffe27 Michael Hanselmann
150 7fcffe27 Michael Hanselmann
  def testErrors(self):
151 7fcffe27 Michael Hanselmann
    self.assertRaises(errors.ProgrammerError, utils.FormatUnit, 1, "a")
152 7fcffe27 Michael Hanselmann
153 7fcffe27 Michael Hanselmann
154 7fcffe27 Michael Hanselmann
class TestParseUnit(unittest.TestCase):
155 7fcffe27 Michael Hanselmann
  """Test case for the ParseUnit function"""
156 7fcffe27 Michael Hanselmann
157 7fcffe27 Michael Hanselmann
  SCALES = (("", 1),
158 7fcffe27 Michael Hanselmann
            ("M", 1), ("G", 1024), ("T", 1024 * 1024),
159 7fcffe27 Michael Hanselmann
            ("MB", 1), ("GB", 1024), ("TB", 1024 * 1024),
160 7fcffe27 Michael Hanselmann
            ("MiB", 1), ("GiB", 1024), ("TiB", 1024 * 1024))
161 7fcffe27 Michael Hanselmann
162 7fcffe27 Michael Hanselmann
  def testRounding(self):
163 7fcffe27 Michael Hanselmann
    self.assertEqual(utils.ParseUnit("0"), 0)
164 7fcffe27 Michael Hanselmann
    self.assertEqual(utils.ParseUnit("1"), 4)
165 7fcffe27 Michael Hanselmann
    self.assertEqual(utils.ParseUnit("2"), 4)
166 7fcffe27 Michael Hanselmann
    self.assertEqual(utils.ParseUnit("3"), 4)
167 7fcffe27 Michael Hanselmann
168 7fcffe27 Michael Hanselmann
    self.assertEqual(utils.ParseUnit("124"), 124)
169 7fcffe27 Michael Hanselmann
    self.assertEqual(utils.ParseUnit("125"), 128)
170 7fcffe27 Michael Hanselmann
    self.assertEqual(utils.ParseUnit("126"), 128)
171 7fcffe27 Michael Hanselmann
    self.assertEqual(utils.ParseUnit("127"), 128)
172 7fcffe27 Michael Hanselmann
    self.assertEqual(utils.ParseUnit("128"), 128)
173 7fcffe27 Michael Hanselmann
    self.assertEqual(utils.ParseUnit("129"), 132)
174 7fcffe27 Michael Hanselmann
    self.assertEqual(utils.ParseUnit("130"), 132)
175 7fcffe27 Michael Hanselmann
176 7fcffe27 Michael Hanselmann
  def testFloating(self):
177 7fcffe27 Michael Hanselmann
    self.assertEqual(utils.ParseUnit("0"), 0)
178 7fcffe27 Michael Hanselmann
    self.assertEqual(utils.ParseUnit("0.5"), 4)
179 7fcffe27 Michael Hanselmann
    self.assertEqual(utils.ParseUnit("1.75"), 4)
180 7fcffe27 Michael Hanselmann
    self.assertEqual(utils.ParseUnit("1.99"), 4)
181 7fcffe27 Michael Hanselmann
    self.assertEqual(utils.ParseUnit("2.00"), 4)
182 7fcffe27 Michael Hanselmann
    self.assertEqual(utils.ParseUnit("2.01"), 4)
183 7fcffe27 Michael Hanselmann
    self.assertEqual(utils.ParseUnit("3.99"), 4)
184 7fcffe27 Michael Hanselmann
    self.assertEqual(utils.ParseUnit("4.00"), 4)
185 7fcffe27 Michael Hanselmann
    self.assertEqual(utils.ParseUnit("4.01"), 8)
186 7fcffe27 Michael Hanselmann
    self.assertEqual(utils.ParseUnit("1.5G"), 1536)
187 7fcffe27 Michael Hanselmann
    self.assertEqual(utils.ParseUnit("1.8G"), 1844)
188 7fcffe27 Michael Hanselmann
    self.assertEqual(utils.ParseUnit("8.28T"), 8682212)
189 7fcffe27 Michael Hanselmann
190 7fcffe27 Michael Hanselmann
  def testSuffixes(self):
191 7fcffe27 Michael Hanselmann
    for sep in ("", " ", "   ", "\t", "\t "):
192 7fcffe27 Michael Hanselmann
      for suffix, scale in self.SCALES:
193 7fcffe27 Michael Hanselmann
        for func in (lambda x: x, str.lower, str.upper):
194 7fcffe27 Michael Hanselmann
          self.assertEqual(utils.ParseUnit("1024" + sep + func(suffix)),
195 7fcffe27 Michael Hanselmann
                           1024 * scale)
196 7fcffe27 Michael Hanselmann
197 7fcffe27 Michael Hanselmann
  def testInvalidInput(self):
198 7fcffe27 Michael Hanselmann
    for sep in ("-", "_", ",", "a"):
199 7fcffe27 Michael Hanselmann
      for suffix, _ in self.SCALES:
200 7fcffe27 Michael Hanselmann
        self.assertRaises(errors.UnitParseError, utils.ParseUnit,
201 7fcffe27 Michael Hanselmann
                          "1" + sep + suffix)
202 7fcffe27 Michael Hanselmann
203 7fcffe27 Michael Hanselmann
    for suffix, _ in self.SCALES:
204 7fcffe27 Michael Hanselmann
      self.assertRaises(errors.UnitParseError, utils.ParseUnit,
205 7fcffe27 Michael Hanselmann
                        "1,3" + suffix)
206 7fcffe27 Michael Hanselmann
207 7fcffe27 Michael Hanselmann
208 7fcffe27 Michael Hanselmann
class TestShellQuoting(unittest.TestCase):
209 7fcffe27 Michael Hanselmann
  """Test case for shell quoting functions"""
210 7fcffe27 Michael Hanselmann
211 7fcffe27 Michael Hanselmann
  def testShellQuote(self):
212 7fcffe27 Michael Hanselmann
    self.assertEqual(utils.ShellQuote('abc'), "abc")
213 7fcffe27 Michael Hanselmann
    self.assertEqual(utils.ShellQuote('ab"c'), "'ab\"c'")
214 7fcffe27 Michael Hanselmann
    self.assertEqual(utils.ShellQuote("a'bc"), "'a'\\''bc'")
215 7fcffe27 Michael Hanselmann
    self.assertEqual(utils.ShellQuote("a b c"), "'a b c'")
216 7fcffe27 Michael Hanselmann
    self.assertEqual(utils.ShellQuote("a b\\ c"), "'a b\\ c'")
217 7fcffe27 Michael Hanselmann
218 7fcffe27 Michael Hanselmann
  def testShellQuoteArgs(self):
219 7fcffe27 Michael Hanselmann
    self.assertEqual(utils.ShellQuoteArgs(['a', 'b', 'c']), "a b c")
220 7fcffe27 Michael Hanselmann
    self.assertEqual(utils.ShellQuoteArgs(['a', 'b"', 'c']), "a 'b\"' c")
221 7fcffe27 Michael Hanselmann
    self.assertEqual(utils.ShellQuoteArgs(['a', 'b\'', 'c']), "a 'b'\\\''' c")
222 7fcffe27 Michael Hanselmann
223 7fcffe27 Michael Hanselmann
224 7fcffe27 Michael Hanselmann
class TestShellWriter(unittest.TestCase):
225 7fcffe27 Michael Hanselmann
  def test(self):
226 7fcffe27 Michael Hanselmann
    buf = StringIO()
227 7fcffe27 Michael Hanselmann
    sw = utils.ShellWriter(buf)
228 7fcffe27 Michael Hanselmann
    sw.Write("#!/bin/bash")
229 7fcffe27 Michael Hanselmann
    sw.Write("if true; then")
230 7fcffe27 Michael Hanselmann
    sw.IncIndent()
231 7fcffe27 Michael Hanselmann
    try:
232 7fcffe27 Michael Hanselmann
      sw.Write("echo true")
233 7fcffe27 Michael Hanselmann
234 7fcffe27 Michael Hanselmann
      sw.Write("for i in 1 2 3")
235 7fcffe27 Michael Hanselmann
      sw.Write("do")
236 7fcffe27 Michael Hanselmann
      sw.IncIndent()
237 7fcffe27 Michael Hanselmann
      try:
238 7fcffe27 Michael Hanselmann
        self.assertEqual(sw._indent, 2)
239 7fcffe27 Michael Hanselmann
        sw.Write("date")
240 7fcffe27 Michael Hanselmann
      finally:
241 7fcffe27 Michael Hanselmann
        sw.DecIndent()
242 7fcffe27 Michael Hanselmann
      sw.Write("done")
243 7fcffe27 Michael Hanselmann
    finally:
244 7fcffe27 Michael Hanselmann
      sw.DecIndent()
245 7fcffe27 Michael Hanselmann
    sw.Write("echo %s", utils.ShellQuote("Hello World"))
246 7fcffe27 Michael Hanselmann
    sw.Write("exit 0")
247 7fcffe27 Michael Hanselmann
248 7fcffe27 Michael Hanselmann
    self.assertEqual(sw._indent, 0)
249 7fcffe27 Michael Hanselmann
250 7fcffe27 Michael Hanselmann
    output = buf.getvalue()
251 7fcffe27 Michael Hanselmann
252 7fcffe27 Michael Hanselmann
    self.assert_(output.endswith("\n"))
253 7fcffe27 Michael Hanselmann
254 7fcffe27 Michael Hanselmann
    lines = output.splitlines()
255 7fcffe27 Michael Hanselmann
    self.assertEqual(len(lines), 9)
256 7fcffe27 Michael Hanselmann
    self.assertEqual(lines[0], "#!/bin/bash")
257 7fcffe27 Michael Hanselmann
    self.assert_(re.match(r"^\s+date$", lines[5]))
258 7fcffe27 Michael Hanselmann
    self.assertEqual(lines[7], "echo 'Hello World'")
259 7fcffe27 Michael Hanselmann
260 7fcffe27 Michael Hanselmann
  def testEmpty(self):
261 7fcffe27 Michael Hanselmann
    buf = StringIO()
262 7fcffe27 Michael Hanselmann
    sw = utils.ShellWriter(buf)
263 7fcffe27 Michael Hanselmann
    sw = None
264 7fcffe27 Michael Hanselmann
    self.assertEqual(buf.getvalue(), "")
265 7fcffe27 Michael Hanselmann
266 7fcffe27 Michael Hanselmann
267 7fcffe27 Michael Hanselmann
class TestNormalizeAndValidateMac(unittest.TestCase):
268 7fcffe27 Michael Hanselmann
  def testInvalid(self):
269 7fcffe27 Michael Hanselmann
    self.assertRaises(errors.OpPrereqError,
270 7fcffe27 Michael Hanselmann
                      utils.NormalizeAndValidateMac, "xxx")
271 7fcffe27 Michael Hanselmann
272 7fcffe27 Michael Hanselmann
  def testNormalization(self):
273 7fcffe27 Michael Hanselmann
    for mac in ["aa:bb:cc:dd:ee:ff", "00:AA:11:bB:22:cc"]:
274 7fcffe27 Michael Hanselmann
      self.assertEqual(utils.NormalizeAndValidateMac(mac), mac.lower())
275 7fcffe27 Michael Hanselmann
276 7fcffe27 Michael Hanselmann
277 7fcffe27 Michael Hanselmann
class TestSafeEncode(unittest.TestCase):
278 7fcffe27 Michael Hanselmann
  """Test case for SafeEncode"""
279 7fcffe27 Michael Hanselmann
280 7fcffe27 Michael Hanselmann
  def testAscii(self):
281 7fcffe27 Michael Hanselmann
    for txt in [string.digits, string.letters, string.punctuation]:
282 7fcffe27 Michael Hanselmann
      self.failUnlessEqual(txt, utils.SafeEncode(txt))
283 7fcffe27 Michael Hanselmann
284 7fcffe27 Michael Hanselmann
  def testDoubleEncode(self):
285 7fcffe27 Michael Hanselmann
    for i in range(255):
286 7fcffe27 Michael Hanselmann
      txt = utils.SafeEncode(chr(i))
287 7fcffe27 Michael Hanselmann
      self.failUnlessEqual(txt, utils.SafeEncode(txt))
288 7fcffe27 Michael Hanselmann
289 7fcffe27 Michael Hanselmann
  def testUnicode(self):
290 7fcffe27 Michael Hanselmann
    # 1024 is high enough to catch non-direct ASCII mappings
291 7fcffe27 Michael Hanselmann
    for i in range(1024):
292 7fcffe27 Michael Hanselmann
      txt = utils.SafeEncode(unichr(i))
293 7fcffe27 Michael Hanselmann
      self.failUnlessEqual(txt, utils.SafeEncode(txt))
294 7fcffe27 Michael Hanselmann
295 7fcffe27 Michael Hanselmann
296 7fcffe27 Michael Hanselmann
class TestUnescapeAndSplit(unittest.TestCase):
297 7fcffe27 Michael Hanselmann
  """Testing case for UnescapeAndSplit"""
298 7fcffe27 Michael Hanselmann
299 7fcffe27 Michael Hanselmann
  def setUp(self):
300 7fcffe27 Michael Hanselmann
    # testing more that one separator for regexp safety
301 7fcffe27 Michael Hanselmann
    self._seps = [",", "+", "."]
302 7fcffe27 Michael Hanselmann
303 7fcffe27 Michael Hanselmann
  def testSimple(self):
304 7fcffe27 Michael Hanselmann
    a = ["a", "b", "c", "d"]
305 7fcffe27 Michael Hanselmann
    for sep in self._seps:
306 7fcffe27 Michael Hanselmann
      self.failUnlessEqual(utils.UnescapeAndSplit(sep.join(a), sep=sep), a)
307 7fcffe27 Michael Hanselmann
308 7fcffe27 Michael Hanselmann
  def testEscape(self):
309 7fcffe27 Michael Hanselmann
    for sep in self._seps:
310 7fcffe27 Michael Hanselmann
      a = ["a", "b\\" + sep + "c", "d"]
311 7fcffe27 Michael Hanselmann
      b = ["a", "b" + sep + "c", "d"]
312 7fcffe27 Michael Hanselmann
      self.failUnlessEqual(utils.UnescapeAndSplit(sep.join(a), sep=sep), b)
313 7fcffe27 Michael Hanselmann
314 7fcffe27 Michael Hanselmann
  def testDoubleEscape(self):
315 7fcffe27 Michael Hanselmann
    for sep in self._seps:
316 7fcffe27 Michael Hanselmann
      a = ["a", "b\\\\", "c", "d"]
317 7fcffe27 Michael Hanselmann
      b = ["a", "b\\", "c", "d"]
318 7fcffe27 Michael Hanselmann
      self.failUnlessEqual(utils.UnescapeAndSplit(sep.join(a), sep=sep), b)
319 7fcffe27 Michael Hanselmann
320 7fcffe27 Michael Hanselmann
  def testThreeEscape(self):
321 7fcffe27 Michael Hanselmann
    for sep in self._seps:
322 7fcffe27 Michael Hanselmann
      a = ["a", "b\\\\\\" + sep + "c", "d"]
323 7fcffe27 Michael Hanselmann
      b = ["a", "b\\" + sep + "c", "d"]
324 7fcffe27 Michael Hanselmann
      self.failUnlessEqual(utils.UnescapeAndSplit(sep.join(a), sep=sep), b)
325 7fcffe27 Michael Hanselmann
326 7fcffe27 Michael Hanselmann
327 7fcffe27 Michael Hanselmann
class TestCommaJoin(unittest.TestCase):
328 7fcffe27 Michael Hanselmann
  def test(self):
329 7fcffe27 Michael Hanselmann
    self.assertEqual(utils.CommaJoin([]), "")
330 7fcffe27 Michael Hanselmann
    self.assertEqual(utils.CommaJoin([1, 2, 3]), "1, 2, 3")
331 7fcffe27 Michael Hanselmann
    self.assertEqual(utils.CommaJoin(["Hello"]), "Hello")
332 7fcffe27 Michael Hanselmann
    self.assertEqual(utils.CommaJoin(["Hello", "World"]), "Hello, World")
333 7fcffe27 Michael Hanselmann
    self.assertEqual(utils.CommaJoin(["Hello", "World", 99]),
334 7fcffe27 Michael Hanselmann
                     "Hello, World, 99")
335 7fcffe27 Michael Hanselmann
336 7fcffe27 Michael Hanselmann
337 7fcffe27 Michael Hanselmann
class TestFormatTime(unittest.TestCase):
338 7fcffe27 Michael Hanselmann
  """Testing case for FormatTime"""
339 7fcffe27 Michael Hanselmann
340 7fcffe27 Michael Hanselmann
  @staticmethod
341 7fcffe27 Michael Hanselmann
  def _TestInProcess(tz, timestamp, expected):
342 7fcffe27 Michael Hanselmann
    os.environ["TZ"] = tz
343 7fcffe27 Michael Hanselmann
    time.tzset()
344 7fcffe27 Michael Hanselmann
    return utils.FormatTime(timestamp) == expected
345 7fcffe27 Michael Hanselmann
346 7fcffe27 Michael Hanselmann
  def _Test(self, *args):
347 7fcffe27 Michael Hanselmann
    # Need to use separate process as we want to change TZ
348 7fcffe27 Michael Hanselmann
    self.assert_(utils.RunInSeparateProcess(self._TestInProcess, *args))
349 7fcffe27 Michael Hanselmann
350 7fcffe27 Michael Hanselmann
  def test(self):
351 7fcffe27 Michael Hanselmann
    self._Test("UTC", 0, "1970-01-01 00:00:00")
352 7fcffe27 Michael Hanselmann
    self._Test("America/Sao_Paulo", 1292606926, "2010-12-17 15:28:46")
353 7fcffe27 Michael Hanselmann
    self._Test("Europe/London", 1292606926, "2010-12-17 17:28:46")
354 7fcffe27 Michael Hanselmann
    self._Test("Europe/Zurich", 1292606926, "2010-12-17 18:28:46")
355 7fcffe27 Michael Hanselmann
    self._Test("Australia/Sydney", 1292606926, "2010-12-18 04:28:46")
356 7fcffe27 Michael Hanselmann
357 7fcffe27 Michael Hanselmann
  def testNone(self):
358 7fcffe27 Michael Hanselmann
    self.failUnlessEqual(utils.FormatTime(None), "N/A")
359 7fcffe27 Michael Hanselmann
360 7fcffe27 Michael Hanselmann
  def testInvalid(self):
361 7fcffe27 Michael Hanselmann
    self.failUnlessEqual(utils.FormatTime(()), "N/A")
362 7fcffe27 Michael Hanselmann
363 7fcffe27 Michael Hanselmann
  def testNow(self):
364 7fcffe27 Michael Hanselmann
    # tests that we accept time.time input
365 7fcffe27 Michael Hanselmann
    utils.FormatTime(time.time())
366 7fcffe27 Michael Hanselmann
    # tests that we accept int input
367 7fcffe27 Michael Hanselmann
    utils.FormatTime(int(time.time()))
368 7fcffe27 Michael Hanselmann
369 7fcffe27 Michael Hanselmann
370 7fcffe27 Michael Hanselmann
class TestFormatSeconds(unittest.TestCase):
371 7fcffe27 Michael Hanselmann
  def test(self):
372 7fcffe27 Michael Hanselmann
    self.assertEqual(utils.FormatSeconds(1), "1s")
373 7fcffe27 Michael Hanselmann
    self.assertEqual(utils.FormatSeconds(3600), "1h 0m 0s")
374 7fcffe27 Michael Hanselmann
    self.assertEqual(utils.FormatSeconds(3599), "59m 59s")
375 7fcffe27 Michael Hanselmann
    self.assertEqual(utils.FormatSeconds(7200), "2h 0m 0s")
376 7fcffe27 Michael Hanselmann
    self.assertEqual(utils.FormatSeconds(7201), "2h 0m 1s")
377 7fcffe27 Michael Hanselmann
    self.assertEqual(utils.FormatSeconds(7281), "2h 1m 21s")
378 7fcffe27 Michael Hanselmann
    self.assertEqual(utils.FormatSeconds(29119), "8h 5m 19s")
379 7fcffe27 Michael Hanselmann
    self.assertEqual(utils.FormatSeconds(19431228), "224d 21h 33m 48s")
380 7fcffe27 Michael Hanselmann
    self.assertEqual(utils.FormatSeconds(-1), "-1s")
381 7fcffe27 Michael Hanselmann
    self.assertEqual(utils.FormatSeconds(-282), "-282s")
382 7fcffe27 Michael Hanselmann
    self.assertEqual(utils.FormatSeconds(-29119), "-29119s")
383 7fcffe27 Michael Hanselmann
384 7fcffe27 Michael Hanselmann
  def testFloat(self):
385 7fcffe27 Michael Hanselmann
    self.assertEqual(utils.FormatSeconds(1.3), "1s")
386 7fcffe27 Michael Hanselmann
    self.assertEqual(utils.FormatSeconds(1.9), "2s")
387 7fcffe27 Michael Hanselmann
    self.assertEqual(utils.FormatSeconds(3912.12311), "1h 5m 12s")
388 7fcffe27 Michael Hanselmann
    self.assertEqual(utils.FormatSeconds(3912.8), "1h 5m 13s")
389 7fcffe27 Michael Hanselmann
390 7fcffe27 Michael Hanselmann
391 7fcffe27 Michael Hanselmann
class TestLineSplitter(unittest.TestCase):
392 7fcffe27 Michael Hanselmann
  def test(self):
393 7fcffe27 Michael Hanselmann
    lines = []
394 7fcffe27 Michael Hanselmann
    ls = utils.LineSplitter(lines.append)
395 7fcffe27 Michael Hanselmann
    ls.write("Hello World\n")
396 7fcffe27 Michael Hanselmann
    self.assertEqual(lines, [])
397 7fcffe27 Michael Hanselmann
    ls.write("Foo\n Bar\r\n ")
398 7fcffe27 Michael Hanselmann
    ls.write("Baz")
399 7fcffe27 Michael Hanselmann
    ls.write("Moo")
400 7fcffe27 Michael Hanselmann
    self.assertEqual(lines, [])
401 7fcffe27 Michael Hanselmann
    ls.flush()
402 7fcffe27 Michael Hanselmann
    self.assertEqual(lines, ["Hello World", "Foo", " Bar"])
403 7fcffe27 Michael Hanselmann
    ls.close()
404 7fcffe27 Michael Hanselmann
    self.assertEqual(lines, ["Hello World", "Foo", " Bar", " BazMoo"])
405 7fcffe27 Michael Hanselmann
406 7fcffe27 Michael Hanselmann
  def _testExtra(self, line, all_lines, p1, p2):
407 7fcffe27 Michael Hanselmann
    self.assertEqual(p1, 999)
408 7fcffe27 Michael Hanselmann
    self.assertEqual(p2, "extra")
409 7fcffe27 Michael Hanselmann
    all_lines.append(line)
410 7fcffe27 Michael Hanselmann
411 7fcffe27 Michael Hanselmann
  def testExtraArgsNoFlush(self):
412 7fcffe27 Michael Hanselmann
    lines = []
413 7fcffe27 Michael Hanselmann
    ls = utils.LineSplitter(self._testExtra, lines, 999, "extra")
414 7fcffe27 Michael Hanselmann
    ls.write("\n\nHello World\n")
415 7fcffe27 Michael Hanselmann
    ls.write("Foo\n Bar\r\n ")
416 7fcffe27 Michael Hanselmann
    ls.write("")
417 7fcffe27 Michael Hanselmann
    ls.write("Baz")
418 7fcffe27 Michael Hanselmann
    ls.write("Moo\n\nx\n")
419 7fcffe27 Michael Hanselmann
    self.assertEqual(lines, [])
420 7fcffe27 Michael Hanselmann
    ls.close()
421 7fcffe27 Michael Hanselmann
    self.assertEqual(lines, ["", "", "Hello World", "Foo", " Bar", " BazMoo",
422 7fcffe27 Michael Hanselmann
                             "", "x"])
423 7fcffe27 Michael Hanselmann
424 7fcffe27 Michael Hanselmann
425 7ebd876f Michael Hanselmann
class TestIsValidShellParam(unittest.TestCase):
426 7ebd876f Michael Hanselmann
  def test(self):
427 7ebd876f Michael Hanselmann
    for val, result in [
428 7ebd876f Michael Hanselmann
      ("abc", True),
429 7ebd876f Michael Hanselmann
      ("ab;cd", False),
430 7ebd876f Michael Hanselmann
      ]:
431 7ebd876f Michael Hanselmann
      self.assertEqual(utils.IsValidShellParam(val), result)
432 7ebd876f Michael Hanselmann
433 7ebd876f Michael Hanselmann
434 7ebd876f Michael Hanselmann
class TestBuildShellCmd(unittest.TestCase):
435 7ebd876f Michael Hanselmann
  def test(self):
436 7ebd876f Michael Hanselmann
    self.assertRaises(errors.ProgrammerError, utils.BuildShellCmd,
437 7ebd876f Michael Hanselmann
                      "ls %s", "ab;cd")
438 7ebd876f Michael Hanselmann
    self.assertEqual(utils.BuildShellCmd("ls %s", "ab"), "ls ab")
439 7ebd876f Michael Hanselmann
440 7ebd876f Michael Hanselmann
441 7fcffe27 Michael Hanselmann
if __name__ == "__main__":
442 7fcffe27 Michael Hanselmann
  testutils.GanetiTestProgram()