Statistics
| Branch: | Tag: | Revision:

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

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