Statistics
| Branch: | Tag: | Revision:

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

History | View | Annotate | Download (17.6 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 7fcffe27 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 7fcffe27 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 7fcffe27 Michael Hanselmann
319 7fcffe27 Michael Hanselmann
class TestNormalizeAndValidateMac(unittest.TestCase):
320 7fcffe27 Michael Hanselmann
  def testInvalid(self):
321 7fcffe27 Michael Hanselmann
    self.assertRaises(errors.OpPrereqError,
322 7fcffe27 Michael Hanselmann
                      utils.NormalizeAndValidateMac, "xxx")
323 7fcffe27 Michael Hanselmann
324 7fcffe27 Michael Hanselmann
  def testNormalization(self):
325 7fcffe27 Michael Hanselmann
    for mac in ["aa:bb:cc:dd:ee:ff", "00:AA:11:bB:22:cc"]:
326 7fcffe27 Michael Hanselmann
      self.assertEqual(utils.NormalizeAndValidateMac(mac), mac.lower())
327 7fcffe27 Michael Hanselmann
328 7fcffe27 Michael Hanselmann
329 7fcffe27 Michael Hanselmann
class TestSafeEncode(unittest.TestCase):
330 7fcffe27 Michael Hanselmann
  """Test case for SafeEncode"""
331 7fcffe27 Michael Hanselmann
332 7fcffe27 Michael Hanselmann
  def testAscii(self):
333 7fcffe27 Michael Hanselmann
    for txt in [string.digits, string.letters, string.punctuation]:
334 7fcffe27 Michael Hanselmann
      self.failUnlessEqual(txt, utils.SafeEncode(txt))
335 7fcffe27 Michael Hanselmann
336 7fcffe27 Michael Hanselmann
  def testDoubleEncode(self):
337 7fcffe27 Michael Hanselmann
    for i in range(255):
338 7fcffe27 Michael Hanselmann
      txt = utils.SafeEncode(chr(i))
339 7fcffe27 Michael Hanselmann
      self.failUnlessEqual(txt, utils.SafeEncode(txt))
340 7fcffe27 Michael Hanselmann
341 7fcffe27 Michael Hanselmann
  def testUnicode(self):
342 7fcffe27 Michael Hanselmann
    # 1024 is high enough to catch non-direct ASCII mappings
343 7fcffe27 Michael Hanselmann
    for i in range(1024):
344 7fcffe27 Michael Hanselmann
      txt = utils.SafeEncode(unichr(i))
345 7fcffe27 Michael Hanselmann
      self.failUnlessEqual(txt, utils.SafeEncode(txt))
346 7fcffe27 Michael Hanselmann
347 7fcffe27 Michael Hanselmann
348 7fcffe27 Michael Hanselmann
class TestUnescapeAndSplit(unittest.TestCase):
349 7fcffe27 Michael Hanselmann
  """Testing case for UnescapeAndSplit"""
350 7fcffe27 Michael Hanselmann
351 7fcffe27 Michael Hanselmann
  def setUp(self):
352 7fcffe27 Michael Hanselmann
    # testing more that one separator for regexp safety
353 7fcffe27 Michael Hanselmann
    self._seps = [",", "+", "."]
354 7fcffe27 Michael Hanselmann
355 7fcffe27 Michael Hanselmann
  def testSimple(self):
356 7fcffe27 Michael Hanselmann
    a = ["a", "b", "c", "d"]
357 7fcffe27 Michael Hanselmann
    for sep in self._seps:
358 7fcffe27 Michael Hanselmann
      self.failUnlessEqual(utils.UnescapeAndSplit(sep.join(a), sep=sep), a)
359 7fcffe27 Michael Hanselmann
360 7fcffe27 Michael Hanselmann
  def testEscape(self):
361 7fcffe27 Michael Hanselmann
    for sep in self._seps:
362 7fcffe27 Michael Hanselmann
      a = ["a", "b\\" + sep + "c", "d"]
363 7fcffe27 Michael Hanselmann
      b = ["a", "b" + sep + "c", "d"]
364 7fcffe27 Michael Hanselmann
      self.failUnlessEqual(utils.UnescapeAndSplit(sep.join(a), sep=sep), b)
365 7fcffe27 Michael Hanselmann
366 7fcffe27 Michael Hanselmann
  def testDoubleEscape(self):
367 7fcffe27 Michael Hanselmann
    for sep in self._seps:
368 7fcffe27 Michael Hanselmann
      a = ["a", "b\\\\", "c", "d"]
369 7fcffe27 Michael Hanselmann
      b = ["a", "b\\", "c", "d"]
370 7fcffe27 Michael Hanselmann
      self.failUnlessEqual(utils.UnescapeAndSplit(sep.join(a), sep=sep), b)
371 7fcffe27 Michael Hanselmann
372 7fcffe27 Michael Hanselmann
  def testThreeEscape(self):
373 7fcffe27 Michael Hanselmann
    for sep in self._seps:
374 7fcffe27 Michael Hanselmann
      a = ["a", "b\\\\\\" + sep + "c", "d"]
375 7fcffe27 Michael Hanselmann
      b = ["a", "b\\" + sep + "c", "d"]
376 7fcffe27 Michael Hanselmann
      self.failUnlessEqual(utils.UnescapeAndSplit(sep.join(a), sep=sep), b)
377 7fcffe27 Michael Hanselmann
378 7fcffe27 Michael Hanselmann
379 7fcffe27 Michael Hanselmann
class TestCommaJoin(unittest.TestCase):
380 7fcffe27 Michael Hanselmann
  def test(self):
381 7fcffe27 Michael Hanselmann
    self.assertEqual(utils.CommaJoin([]), "")
382 7fcffe27 Michael Hanselmann
    self.assertEqual(utils.CommaJoin([1, 2, 3]), "1, 2, 3")
383 7fcffe27 Michael Hanselmann
    self.assertEqual(utils.CommaJoin(["Hello"]), "Hello")
384 7fcffe27 Michael Hanselmann
    self.assertEqual(utils.CommaJoin(["Hello", "World"]), "Hello, World")
385 7fcffe27 Michael Hanselmann
    self.assertEqual(utils.CommaJoin(["Hello", "World", 99]),
386 7fcffe27 Michael Hanselmann
                     "Hello, World, 99")
387 7fcffe27 Michael Hanselmann
388 7fcffe27 Michael Hanselmann
389 7fcffe27 Michael Hanselmann
class TestFormatTime(unittest.TestCase):
390 7fcffe27 Michael Hanselmann
  """Testing case for FormatTime"""
391 7fcffe27 Michael Hanselmann
392 7fcffe27 Michael Hanselmann
  @staticmethod
393 7fcffe27 Michael Hanselmann
  def _TestInProcess(tz, timestamp, expected):
394 7fcffe27 Michael Hanselmann
    os.environ["TZ"] = tz
395 7fcffe27 Michael Hanselmann
    time.tzset()
396 7fcffe27 Michael Hanselmann
    return utils.FormatTime(timestamp) == expected
397 7fcffe27 Michael Hanselmann
398 7fcffe27 Michael Hanselmann
  def _Test(self, *args):
399 7fcffe27 Michael Hanselmann
    # Need to use separate process as we want to change TZ
400 7fcffe27 Michael Hanselmann
    self.assert_(utils.RunInSeparateProcess(self._TestInProcess, *args))
401 7fcffe27 Michael Hanselmann
402 7fcffe27 Michael Hanselmann
  def test(self):
403 7fcffe27 Michael Hanselmann
    self._Test("UTC", 0, "1970-01-01 00:00:00")
404 7fcffe27 Michael Hanselmann
    self._Test("America/Sao_Paulo", 1292606926, "2010-12-17 15:28:46")
405 7fcffe27 Michael Hanselmann
    self._Test("Europe/London", 1292606926, "2010-12-17 17:28:46")
406 7fcffe27 Michael Hanselmann
    self._Test("Europe/Zurich", 1292606926, "2010-12-17 18:28:46")
407 7fcffe27 Michael Hanselmann
    self._Test("Australia/Sydney", 1292606926, "2010-12-18 04:28:46")
408 7fcffe27 Michael Hanselmann
409 7fcffe27 Michael Hanselmann
  def testNone(self):
410 7fcffe27 Michael Hanselmann
    self.failUnlessEqual(utils.FormatTime(None), "N/A")
411 7fcffe27 Michael Hanselmann
412 7fcffe27 Michael Hanselmann
  def testInvalid(self):
413 7fcffe27 Michael Hanselmann
    self.failUnlessEqual(utils.FormatTime(()), "N/A")
414 7fcffe27 Michael Hanselmann
415 7fcffe27 Michael Hanselmann
  def testNow(self):
416 7fcffe27 Michael Hanselmann
    # tests that we accept time.time input
417 7fcffe27 Michael Hanselmann
    utils.FormatTime(time.time())
418 7fcffe27 Michael Hanselmann
    # tests that we accept int input
419 7fcffe27 Michael Hanselmann
    utils.FormatTime(int(time.time()))
420 7fcffe27 Michael Hanselmann
421 7fcffe27 Michael Hanselmann
422 7fcffe27 Michael Hanselmann
class TestFormatSeconds(unittest.TestCase):
423 7fcffe27 Michael Hanselmann
  def test(self):
424 7fcffe27 Michael Hanselmann
    self.assertEqual(utils.FormatSeconds(1), "1s")
425 7fcffe27 Michael Hanselmann
    self.assertEqual(utils.FormatSeconds(3600), "1h 0m 0s")
426 7fcffe27 Michael Hanselmann
    self.assertEqual(utils.FormatSeconds(3599), "59m 59s")
427 7fcffe27 Michael Hanselmann
    self.assertEqual(utils.FormatSeconds(7200), "2h 0m 0s")
428 7fcffe27 Michael Hanselmann
    self.assertEqual(utils.FormatSeconds(7201), "2h 0m 1s")
429 7fcffe27 Michael Hanselmann
    self.assertEqual(utils.FormatSeconds(7281), "2h 1m 21s")
430 7fcffe27 Michael Hanselmann
    self.assertEqual(utils.FormatSeconds(29119), "8h 5m 19s")
431 7fcffe27 Michael Hanselmann
    self.assertEqual(utils.FormatSeconds(19431228), "224d 21h 33m 48s")
432 7fcffe27 Michael Hanselmann
    self.assertEqual(utils.FormatSeconds(-1), "-1s")
433 7fcffe27 Michael Hanselmann
    self.assertEqual(utils.FormatSeconds(-282), "-282s")
434 7fcffe27 Michael Hanselmann
    self.assertEqual(utils.FormatSeconds(-29119), "-29119s")
435 7fcffe27 Michael Hanselmann
436 7fcffe27 Michael Hanselmann
  def testFloat(self):
437 7fcffe27 Michael Hanselmann
    self.assertEqual(utils.FormatSeconds(1.3), "1s")
438 7fcffe27 Michael Hanselmann
    self.assertEqual(utils.FormatSeconds(1.9), "2s")
439 7fcffe27 Michael Hanselmann
    self.assertEqual(utils.FormatSeconds(3912.12311), "1h 5m 12s")
440 7fcffe27 Michael Hanselmann
    self.assertEqual(utils.FormatSeconds(3912.8), "1h 5m 13s")
441 7fcffe27 Michael Hanselmann
442 7fcffe27 Michael Hanselmann
443 7fcffe27 Michael Hanselmann
class TestLineSplitter(unittest.TestCase):
444 7fcffe27 Michael Hanselmann
  def test(self):
445 7fcffe27 Michael Hanselmann
    lines = []
446 7fcffe27 Michael Hanselmann
    ls = utils.LineSplitter(lines.append)
447 7fcffe27 Michael Hanselmann
    ls.write("Hello World\n")
448 7fcffe27 Michael Hanselmann
    self.assertEqual(lines, [])
449 7fcffe27 Michael Hanselmann
    ls.write("Foo\n Bar\r\n ")
450 7fcffe27 Michael Hanselmann
    ls.write("Baz")
451 7fcffe27 Michael Hanselmann
    ls.write("Moo")
452 7fcffe27 Michael Hanselmann
    self.assertEqual(lines, [])
453 7fcffe27 Michael Hanselmann
    ls.flush()
454 7fcffe27 Michael Hanselmann
    self.assertEqual(lines, ["Hello World", "Foo", " Bar"])
455 7fcffe27 Michael Hanselmann
    ls.close()
456 7fcffe27 Michael Hanselmann
    self.assertEqual(lines, ["Hello World", "Foo", " Bar", " BazMoo"])
457 7fcffe27 Michael Hanselmann
458 7fcffe27 Michael Hanselmann
  def _testExtra(self, line, all_lines, p1, p2):
459 7fcffe27 Michael Hanselmann
    self.assertEqual(p1, 999)
460 7fcffe27 Michael Hanselmann
    self.assertEqual(p2, "extra")
461 7fcffe27 Michael Hanselmann
    all_lines.append(line)
462 7fcffe27 Michael Hanselmann
463 7fcffe27 Michael Hanselmann
  def testExtraArgsNoFlush(self):
464 7fcffe27 Michael Hanselmann
    lines = []
465 7fcffe27 Michael Hanselmann
    ls = utils.LineSplitter(self._testExtra, lines, 999, "extra")
466 7fcffe27 Michael Hanselmann
    ls.write("\n\nHello World\n")
467 7fcffe27 Michael Hanselmann
    ls.write("Foo\n Bar\r\n ")
468 7fcffe27 Michael Hanselmann
    ls.write("")
469 7fcffe27 Michael Hanselmann
    ls.write("Baz")
470 7fcffe27 Michael Hanselmann
    ls.write("Moo\n\nx\n")
471 7fcffe27 Michael Hanselmann
    self.assertEqual(lines, [])
472 7fcffe27 Michael Hanselmann
    ls.close()
473 7fcffe27 Michael Hanselmann
    self.assertEqual(lines, ["", "", "Hello World", "Foo", " Bar", " BazMoo",
474 7fcffe27 Michael Hanselmann
                             "", "x"])
475 7fcffe27 Michael Hanselmann
476 7fcffe27 Michael Hanselmann
477 7ebd876f Michael Hanselmann
class TestIsValidShellParam(unittest.TestCase):
478 7ebd876f Michael Hanselmann
  def test(self):
479 7ebd876f Michael Hanselmann
    for val, result in [
480 7ebd876f Michael Hanselmann
      ("abc", True),
481 7ebd876f Michael Hanselmann
      ("ab;cd", False),
482 7ebd876f Michael Hanselmann
      ]:
483 7ebd876f Michael Hanselmann
      self.assertEqual(utils.IsValidShellParam(val), result)
484 7ebd876f Michael Hanselmann
485 7ebd876f Michael Hanselmann
486 7ebd876f Michael Hanselmann
class TestBuildShellCmd(unittest.TestCase):
487 7ebd876f Michael Hanselmann
  def test(self):
488 7ebd876f Michael Hanselmann
    self.assertRaises(errors.ProgrammerError, utils.BuildShellCmd,
489 7ebd876f Michael Hanselmann
                      "ls %s", "ab;cd")
490 7ebd876f Michael Hanselmann
    self.assertEqual(utils.BuildShellCmd("ls %s", "ab"), "ls ab")
491 7ebd876f Michael Hanselmann
492 7ebd876f Michael Hanselmann
493 92ea69bf Michael Hanselmann
class TestOrdinal(unittest.TestCase):
494 92ea69bf Michael Hanselmann
  def test(self):
495 92ea69bf Michael Hanselmann
    checks = {
496 92ea69bf Michael Hanselmann
      0: "0th", 1: "1st", 2: "2nd", 3: "3rd", 4: "4th", 5: "5th", 6: "6th",
497 92ea69bf Michael Hanselmann
      7: "7th", 8: "8th", 9: "9th", 10: "10th", 11: "11th", 12: "12th",
498 92ea69bf Michael Hanselmann
      13: "13th", 14: "14th", 15: "15th", 16: "16th", 17: "17th",
499 92ea69bf Michael Hanselmann
      18: "18th", 19: "19th", 20: "20th", 21: "21st", 25: "25th", 30: "30th",
500 92ea69bf Michael Hanselmann
      32: "32nd", 40: "40th", 50: "50th", 55: "55th", 60: "60th", 62: "62nd",
501 92ea69bf Michael Hanselmann
      70: "70th", 80: "80th", 83: "83rd", 90: "90th", 91: "91st",
502 92ea69bf Michael Hanselmann
      582: "582nd", 999: "999th",
503 92ea69bf Michael Hanselmann
      }
504 92ea69bf Michael Hanselmann
505 92ea69bf Michael Hanselmann
    for value, ordinal in checks.items():
506 92ea69bf Michael Hanselmann
      self.assertEqual(utils.FormatOrdinal(value), ordinal)
507 92ea69bf Michael Hanselmann
508 92ea69bf Michael Hanselmann
509 7fcffe27 Michael Hanselmann
if __name__ == "__main__":
510 7fcffe27 Michael Hanselmann
  testutils.GanetiTestProgram()