Statistics
| Branch: | Tag: | Revision:

root / test / ganeti.utils.text_unittest.py @ 1a2eb2dc

History | View | Annotate | Download (21.2 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 4af458e3 Michael Hanselmann
  def testEmptyNoIndent(self):
319 4af458e3 Michael Hanselmann
    buf = StringIO()
320 4af458e3 Michael Hanselmann
    sw = utils.ShellWriter(buf, indent=False)
321 4af458e3 Michael Hanselmann
    sw = None
322 4af458e3 Michael Hanselmann
    self.assertEqual(buf.getvalue(), "")
323 4af458e3 Michael Hanselmann
324 4af458e3 Michael Hanselmann
  @classmethod
325 4af458e3 Michael Hanselmann
  def _AddLevel(cls, sw, level):
326 4af458e3 Michael Hanselmann
    if level == 6:
327 4af458e3 Michael Hanselmann
      return
328 4af458e3 Michael Hanselmann
329 4af458e3 Michael Hanselmann
    sw.IncIndent()
330 4af458e3 Michael Hanselmann
    try:
331 4af458e3 Michael Hanselmann
      # Add empty line, it should not be indented
332 4af458e3 Michael Hanselmann
      sw.Write("")
333 4af458e3 Michael Hanselmann
      sw.Write(str(level))
334 4af458e3 Michael Hanselmann
      cls._AddLevel(sw, level + 1)
335 4af458e3 Michael Hanselmann
    finally:
336 4af458e3 Michael Hanselmann
      sw.DecIndent()
337 4af458e3 Michael Hanselmann
338 dce20078 Michael Hanselmann
  def testEmptyLines(self):
339 dce20078 Michael Hanselmann
    buf = StringIO()
340 dce20078 Michael Hanselmann
    sw = utils.ShellWriter(buf)
341 dce20078 Michael Hanselmann
342 4af458e3 Michael Hanselmann
    self._AddLevel(sw, 1)
343 dce20078 Michael Hanselmann
344 dce20078 Michael Hanselmann
    self.assertEqual(buf.getvalue(),
345 dce20078 Michael Hanselmann
                     "".join("\n%s%s\n" % (i * "  ", i) for i in range(1, 6)))
346 dce20078 Michael Hanselmann
347 4af458e3 Michael Hanselmann
  def testEmptyLinesNoIndent(self):
348 4af458e3 Michael Hanselmann
    buf = StringIO()
349 4af458e3 Michael Hanselmann
    sw = utils.ShellWriter(buf, indent=False)
350 4af458e3 Michael Hanselmann
351 4af458e3 Michael Hanselmann
    self._AddLevel(sw, 1)
352 4af458e3 Michael Hanselmann
353 4af458e3 Michael Hanselmann
    self.assertEqual(buf.getvalue(),
354 4af458e3 Michael Hanselmann
                     "".join("\n%s\n" % i for i in range(1, 6)))
355 4af458e3 Michael Hanselmann
356 7fcffe27 Michael Hanselmann
357 7fcffe27 Michael Hanselmann
class TestNormalizeAndValidateMac(unittest.TestCase):
358 7fcffe27 Michael Hanselmann
  def testInvalid(self):
359 7fcffe27 Michael Hanselmann
    self.assertRaises(errors.OpPrereqError,
360 7fcffe27 Michael Hanselmann
                      utils.NormalizeAndValidateMac, "xxx")
361 7fcffe27 Michael Hanselmann
362 7fcffe27 Michael Hanselmann
  def testNormalization(self):
363 7fcffe27 Michael Hanselmann
    for mac in ["aa:bb:cc:dd:ee:ff", "00:AA:11:bB:22:cc"]:
364 7fcffe27 Michael Hanselmann
      self.assertEqual(utils.NormalizeAndValidateMac(mac), mac.lower())
365 7fcffe27 Michael Hanselmann
366 7fcffe27 Michael Hanselmann
367 7fcffe27 Michael Hanselmann
class TestSafeEncode(unittest.TestCase):
368 7fcffe27 Michael Hanselmann
  """Test case for SafeEncode"""
369 7fcffe27 Michael Hanselmann
370 7fcffe27 Michael Hanselmann
  def testAscii(self):
371 7fcffe27 Michael Hanselmann
    for txt in [string.digits, string.letters, string.punctuation]:
372 7fcffe27 Michael Hanselmann
      self.failUnlessEqual(txt, utils.SafeEncode(txt))
373 7fcffe27 Michael Hanselmann
374 7fcffe27 Michael Hanselmann
  def testDoubleEncode(self):
375 7fcffe27 Michael Hanselmann
    for i in range(255):
376 7fcffe27 Michael Hanselmann
      txt = utils.SafeEncode(chr(i))
377 7fcffe27 Michael Hanselmann
      self.failUnlessEqual(txt, utils.SafeEncode(txt))
378 7fcffe27 Michael Hanselmann
379 7fcffe27 Michael Hanselmann
  def testUnicode(self):
380 7fcffe27 Michael Hanselmann
    # 1024 is high enough to catch non-direct ASCII mappings
381 7fcffe27 Michael Hanselmann
    for i in range(1024):
382 7fcffe27 Michael Hanselmann
      txt = utils.SafeEncode(unichr(i))
383 7fcffe27 Michael Hanselmann
      self.failUnlessEqual(txt, utils.SafeEncode(txt))
384 7fcffe27 Michael Hanselmann
385 7fcffe27 Michael Hanselmann
386 7fcffe27 Michael Hanselmann
class TestUnescapeAndSplit(unittest.TestCase):
387 7fcffe27 Michael Hanselmann
  """Testing case for UnescapeAndSplit"""
388 7fcffe27 Michael Hanselmann
389 7fcffe27 Michael Hanselmann
  def setUp(self):
390 7fcffe27 Michael Hanselmann
    # testing more that one separator for regexp safety
391 e4a48c7b Michael Hanselmann
    self._seps = [",", "+", ".", ":"]
392 7fcffe27 Michael Hanselmann
393 7fcffe27 Michael Hanselmann
  def testSimple(self):
394 7fcffe27 Michael Hanselmann
    a = ["a", "b", "c", "d"]
395 7fcffe27 Michael Hanselmann
    for sep in self._seps:
396 7fcffe27 Michael Hanselmann
      self.failUnlessEqual(utils.UnescapeAndSplit(sep.join(a), sep=sep), a)
397 7fcffe27 Michael Hanselmann
398 7fcffe27 Michael Hanselmann
  def testEscape(self):
399 7fcffe27 Michael Hanselmann
    for sep in self._seps:
400 7fcffe27 Michael Hanselmann
      a = ["a", "b\\" + sep + "c", "d"]
401 7fcffe27 Michael Hanselmann
      b = ["a", "b" + sep + "c", "d"]
402 7fcffe27 Michael Hanselmann
      self.failUnlessEqual(utils.UnescapeAndSplit(sep.join(a), sep=sep), b)
403 7fcffe27 Michael Hanselmann
404 7fcffe27 Michael Hanselmann
  def testDoubleEscape(self):
405 7fcffe27 Michael Hanselmann
    for sep in self._seps:
406 7fcffe27 Michael Hanselmann
      a = ["a", "b\\\\", "c", "d"]
407 7fcffe27 Michael Hanselmann
      b = ["a", "b\\", "c", "d"]
408 7fcffe27 Michael Hanselmann
      self.failUnlessEqual(utils.UnescapeAndSplit(sep.join(a), sep=sep), b)
409 7fcffe27 Michael Hanselmann
410 7fcffe27 Michael Hanselmann
  def testThreeEscape(self):
411 7fcffe27 Michael Hanselmann
    for sep in self._seps:
412 7fcffe27 Michael Hanselmann
      a = ["a", "b\\\\\\" + sep + "c", "d"]
413 7fcffe27 Michael Hanselmann
      b = ["a", "b\\" + sep + "c", "d"]
414 7fcffe27 Michael Hanselmann
      self.failUnlessEqual(utils.UnescapeAndSplit(sep.join(a), sep=sep), b)
415 7fcffe27 Michael Hanselmann
416 e4a48c7b Michael Hanselmann
  def testEscapeAtEnd(self):
417 e4a48c7b Michael Hanselmann
    for sep in self._seps:
418 e4a48c7b Michael Hanselmann
      self.assertEqual(utils.UnescapeAndSplit("\\", sep=sep), ["\\"])
419 e4a48c7b Michael Hanselmann
420 e4a48c7b Michael Hanselmann
      a = ["a", "b\\", "c"]
421 e4a48c7b Michael Hanselmann
      b = ["a", "b" + sep + "c\\"]
422 e4a48c7b Michael Hanselmann
      self.assertEqual(utils.UnescapeAndSplit("%s\\" % sep.join(a), sep=sep), b)
423 e4a48c7b Michael Hanselmann
424 e4a48c7b Michael Hanselmann
      a = ["\\" + sep, "\\" + sep, "c", "d\\.moo"]
425 e4a48c7b Michael Hanselmann
      b = [sep, sep, "c", "d.moo\\"]
426 e4a48c7b Michael Hanselmann
      self.assertEqual(utils.UnescapeAndSplit("%s\\" % sep.join(a), sep=sep), b)
427 e4a48c7b Michael Hanselmann
428 e7f7212b Iustin Pop
  def testMultipleEscapes(self):
429 e7f7212b Iustin Pop
    for sep in self._seps:
430 e7f7212b Iustin Pop
      a = ["a", "b\\" + sep + "c", "d\\" + sep + "e\\" + sep + "f", "g"]
431 e7f7212b Iustin Pop
      b = ["a", "b" + sep + "c", "d" + sep + "e" + sep + "f", "g"]
432 e7f7212b Iustin Pop
      self.failUnlessEqual(utils.UnescapeAndSplit(sep.join(a), sep=sep), b)
433 e7f7212b Iustin Pop
434 7fcffe27 Michael Hanselmann
435 7fcffe27 Michael Hanselmann
class TestCommaJoin(unittest.TestCase):
436 7fcffe27 Michael Hanselmann
  def test(self):
437 7fcffe27 Michael Hanselmann
    self.assertEqual(utils.CommaJoin([]), "")
438 7fcffe27 Michael Hanselmann
    self.assertEqual(utils.CommaJoin([1, 2, 3]), "1, 2, 3")
439 7fcffe27 Michael Hanselmann
    self.assertEqual(utils.CommaJoin(["Hello"]), "Hello")
440 7fcffe27 Michael Hanselmann
    self.assertEqual(utils.CommaJoin(["Hello", "World"]), "Hello, World")
441 7fcffe27 Michael Hanselmann
    self.assertEqual(utils.CommaJoin(["Hello", "World", 99]),
442 7fcffe27 Michael Hanselmann
                     "Hello, World, 99")
443 7fcffe27 Michael Hanselmann
444 7fcffe27 Michael Hanselmann
445 7fcffe27 Michael Hanselmann
class TestFormatTime(unittest.TestCase):
446 7fcffe27 Michael Hanselmann
  """Testing case for FormatTime"""
447 7fcffe27 Michael Hanselmann
448 7fcffe27 Michael Hanselmann
  @staticmethod
449 26a72a48 Michael Hanselmann
  def _TestInProcess(tz, timestamp, usecs, expected):
450 7fcffe27 Michael Hanselmann
    os.environ["TZ"] = tz
451 7fcffe27 Michael Hanselmann
    time.tzset()
452 26a72a48 Michael Hanselmann
    return utils.FormatTime(timestamp, usecs=usecs) == expected
453 7fcffe27 Michael Hanselmann
454 7fcffe27 Michael Hanselmann
  def _Test(self, *args):
455 7fcffe27 Michael Hanselmann
    # Need to use separate process as we want to change TZ
456 7fcffe27 Michael Hanselmann
    self.assert_(utils.RunInSeparateProcess(self._TestInProcess, *args))
457 7fcffe27 Michael Hanselmann
458 7fcffe27 Michael Hanselmann
  def test(self):
459 26a72a48 Michael Hanselmann
    self._Test("UTC", 0, None, "1970-01-01 00:00:00")
460 26a72a48 Michael Hanselmann
    self._Test("America/Sao_Paulo", 1292606926, None, "2010-12-17 15:28:46")
461 26a72a48 Michael Hanselmann
    self._Test("Europe/London", 1292606926, None, "2010-12-17 17:28:46")
462 26a72a48 Michael Hanselmann
    self._Test("Europe/Zurich", 1292606926, None, "2010-12-17 18:28:46")
463 26a72a48 Michael Hanselmann
    self._Test("Europe/Zurich", 1332944288, 8787, "2012-03-28 16:18:08.008787")
464 26a72a48 Michael Hanselmann
    self._Test("Australia/Sydney", 1292606926, None, "2010-12-18 04:28:46")
465 26a72a48 Michael Hanselmann
    self._Test("Australia/Sydney", 1292606926, None, "2010-12-18 04:28:46")
466 26a72a48 Michael Hanselmann
    self._Test("Australia/Sydney", 1292606926, 999999,
467 26a72a48 Michael Hanselmann
               "2010-12-18 04:28:46.999999")
468 7fcffe27 Michael Hanselmann
469 7fcffe27 Michael Hanselmann
  def testNone(self):
470 7fcffe27 Michael Hanselmann
    self.failUnlessEqual(utils.FormatTime(None), "N/A")
471 7fcffe27 Michael Hanselmann
472 7fcffe27 Michael Hanselmann
  def testInvalid(self):
473 7fcffe27 Michael Hanselmann
    self.failUnlessEqual(utils.FormatTime(()), "N/A")
474 7fcffe27 Michael Hanselmann
475 7fcffe27 Michael Hanselmann
  def testNow(self):
476 7fcffe27 Michael Hanselmann
    # tests that we accept time.time input
477 7fcffe27 Michael Hanselmann
    utils.FormatTime(time.time())
478 7fcffe27 Michael Hanselmann
    # tests that we accept int input
479 7fcffe27 Michael Hanselmann
    utils.FormatTime(int(time.time()))
480 7fcffe27 Michael Hanselmann
481 7fcffe27 Michael Hanselmann
482 7fcffe27 Michael Hanselmann
class TestFormatSeconds(unittest.TestCase):
483 7fcffe27 Michael Hanselmann
  def test(self):
484 7fcffe27 Michael Hanselmann
    self.assertEqual(utils.FormatSeconds(1), "1s")
485 7fcffe27 Michael Hanselmann
    self.assertEqual(utils.FormatSeconds(3600), "1h 0m 0s")
486 7fcffe27 Michael Hanselmann
    self.assertEqual(utils.FormatSeconds(3599), "59m 59s")
487 7fcffe27 Michael Hanselmann
    self.assertEqual(utils.FormatSeconds(7200), "2h 0m 0s")
488 7fcffe27 Michael Hanselmann
    self.assertEqual(utils.FormatSeconds(7201), "2h 0m 1s")
489 7fcffe27 Michael Hanselmann
    self.assertEqual(utils.FormatSeconds(7281), "2h 1m 21s")
490 7fcffe27 Michael Hanselmann
    self.assertEqual(utils.FormatSeconds(29119), "8h 5m 19s")
491 7fcffe27 Michael Hanselmann
    self.assertEqual(utils.FormatSeconds(19431228), "224d 21h 33m 48s")
492 7fcffe27 Michael Hanselmann
    self.assertEqual(utils.FormatSeconds(-1), "-1s")
493 7fcffe27 Michael Hanselmann
    self.assertEqual(utils.FormatSeconds(-282), "-282s")
494 7fcffe27 Michael Hanselmann
    self.assertEqual(utils.FormatSeconds(-29119), "-29119s")
495 7fcffe27 Michael Hanselmann
496 7fcffe27 Michael Hanselmann
  def testFloat(self):
497 7fcffe27 Michael Hanselmann
    self.assertEqual(utils.FormatSeconds(1.3), "1s")
498 7fcffe27 Michael Hanselmann
    self.assertEqual(utils.FormatSeconds(1.9), "2s")
499 7fcffe27 Michael Hanselmann
    self.assertEqual(utils.FormatSeconds(3912.12311), "1h 5m 12s")
500 7fcffe27 Michael Hanselmann
    self.assertEqual(utils.FormatSeconds(3912.8), "1h 5m 13s")
501 7fcffe27 Michael Hanselmann
502 7fcffe27 Michael Hanselmann
503 7fcffe27 Michael Hanselmann
class TestLineSplitter(unittest.TestCase):
504 7fcffe27 Michael Hanselmann
  def test(self):
505 7fcffe27 Michael Hanselmann
    lines = []
506 7fcffe27 Michael Hanselmann
    ls = utils.LineSplitter(lines.append)
507 7fcffe27 Michael Hanselmann
    ls.write("Hello World\n")
508 7fcffe27 Michael Hanselmann
    self.assertEqual(lines, [])
509 7fcffe27 Michael Hanselmann
    ls.write("Foo\n Bar\r\n ")
510 7fcffe27 Michael Hanselmann
    ls.write("Baz")
511 7fcffe27 Michael Hanselmann
    ls.write("Moo")
512 7fcffe27 Michael Hanselmann
    self.assertEqual(lines, [])
513 7fcffe27 Michael Hanselmann
    ls.flush()
514 7fcffe27 Michael Hanselmann
    self.assertEqual(lines, ["Hello World", "Foo", " Bar"])
515 7fcffe27 Michael Hanselmann
    ls.close()
516 7fcffe27 Michael Hanselmann
    self.assertEqual(lines, ["Hello World", "Foo", " Bar", " BazMoo"])
517 7fcffe27 Michael Hanselmann
518 7fcffe27 Michael Hanselmann
  def _testExtra(self, line, all_lines, p1, p2):
519 7fcffe27 Michael Hanselmann
    self.assertEqual(p1, 999)
520 7fcffe27 Michael Hanselmann
    self.assertEqual(p2, "extra")
521 7fcffe27 Michael Hanselmann
    all_lines.append(line)
522 7fcffe27 Michael Hanselmann
523 7fcffe27 Michael Hanselmann
  def testExtraArgsNoFlush(self):
524 7fcffe27 Michael Hanselmann
    lines = []
525 7fcffe27 Michael Hanselmann
    ls = utils.LineSplitter(self._testExtra, lines, 999, "extra")
526 7fcffe27 Michael Hanselmann
    ls.write("\n\nHello World\n")
527 7fcffe27 Michael Hanselmann
    ls.write("Foo\n Bar\r\n ")
528 7fcffe27 Michael Hanselmann
    ls.write("")
529 7fcffe27 Michael Hanselmann
    ls.write("Baz")
530 7fcffe27 Michael Hanselmann
    ls.write("Moo\n\nx\n")
531 7fcffe27 Michael Hanselmann
    self.assertEqual(lines, [])
532 7fcffe27 Michael Hanselmann
    ls.close()
533 7fcffe27 Michael Hanselmann
    self.assertEqual(lines, ["", "", "Hello World", "Foo", " Bar", " BazMoo",
534 7fcffe27 Michael Hanselmann
                             "", "x"])
535 7fcffe27 Michael Hanselmann
536 7fcffe27 Michael Hanselmann
537 7ebd876f Michael Hanselmann
class TestIsValidShellParam(unittest.TestCase):
538 7ebd876f Michael Hanselmann
  def test(self):
539 7ebd876f Michael Hanselmann
    for val, result in [
540 7ebd876f Michael Hanselmann
      ("abc", True),
541 7ebd876f Michael Hanselmann
      ("ab;cd", False),
542 7ebd876f Michael Hanselmann
      ]:
543 7ebd876f Michael Hanselmann
      self.assertEqual(utils.IsValidShellParam(val), result)
544 7ebd876f Michael Hanselmann
545 7ebd876f Michael Hanselmann
546 7ebd876f Michael Hanselmann
class TestBuildShellCmd(unittest.TestCase):
547 7ebd876f Michael Hanselmann
  def test(self):
548 7ebd876f Michael Hanselmann
    self.assertRaises(errors.ProgrammerError, utils.BuildShellCmd,
549 7ebd876f Michael Hanselmann
                      "ls %s", "ab;cd")
550 7ebd876f Michael Hanselmann
    self.assertEqual(utils.BuildShellCmd("ls %s", "ab"), "ls ab")
551 7ebd876f Michael Hanselmann
552 7ebd876f Michael Hanselmann
553 92ea69bf Michael Hanselmann
class TestOrdinal(unittest.TestCase):
554 92ea69bf Michael Hanselmann
  def test(self):
555 92ea69bf Michael Hanselmann
    checks = {
556 92ea69bf Michael Hanselmann
      0: "0th", 1: "1st", 2: "2nd", 3: "3rd", 4: "4th", 5: "5th", 6: "6th",
557 92ea69bf Michael Hanselmann
      7: "7th", 8: "8th", 9: "9th", 10: "10th", 11: "11th", 12: "12th",
558 92ea69bf Michael Hanselmann
      13: "13th", 14: "14th", 15: "15th", 16: "16th", 17: "17th",
559 92ea69bf Michael Hanselmann
      18: "18th", 19: "19th", 20: "20th", 21: "21st", 25: "25th", 30: "30th",
560 92ea69bf Michael Hanselmann
      32: "32nd", 40: "40th", 50: "50th", 55: "55th", 60: "60th", 62: "62nd",
561 92ea69bf Michael Hanselmann
      70: "70th", 80: "80th", 83: "83rd", 90: "90th", 91: "91st",
562 92ea69bf Michael Hanselmann
      582: "582nd", 999: "999th",
563 92ea69bf Michael Hanselmann
      }
564 92ea69bf Michael Hanselmann
565 92ea69bf Michael Hanselmann
    for value, ordinal in checks.items():
566 92ea69bf Michael Hanselmann
      self.assertEqual(utils.FormatOrdinal(value), ordinal)
567 92ea69bf Michael Hanselmann
568 92ea69bf Michael Hanselmann
569 5401c39d Michael Hanselmann
class TestTruncate(unittest.TestCase):
570 5401c39d Michael Hanselmann
  def _Test(self, text, length):
571 5401c39d Michael Hanselmann
    result = utils.Truncate(text, length)
572 5401c39d Michael Hanselmann
    self.assertTrue(len(result) <= length)
573 5401c39d Michael Hanselmann
    return result
574 5401c39d Michael Hanselmann
575 5401c39d Michael Hanselmann
  def test(self):
576 5401c39d Michael Hanselmann
    self.assertEqual(self._Test("", 80), "")
577 5401c39d Michael Hanselmann
    self.assertEqual(self._Test("abc", 4), "abc")
578 5401c39d Michael Hanselmann
    self.assertEqual(self._Test("Hello World", 80), "Hello World")
579 5401c39d Michael Hanselmann
    self.assertEqual(self._Test("Hello World", 4), "H...")
580 5401c39d Michael Hanselmann
    self.assertEqual(self._Test("Hello World", 5), "He...")
581 5401c39d Michael Hanselmann
582 5401c39d Michael Hanselmann
    for i in [4, 10, 100]:
583 5401c39d Michael Hanselmann
      data = i * "FooBarBaz"
584 5401c39d Michael Hanselmann
      self.assertEqual(self._Test(data, len(data)), data)
585 5401c39d Michael Hanselmann
586 5401c39d Michael Hanselmann
    for (length, exp) in [(8, u"T\u00e4st\u2026xyz"), (7, u"T\u00e4st...")]:
587 5401c39d Michael Hanselmann
      self.assertEqual(self._Test(u"T\u00e4st\u2026xyz", length), exp)
588 5401c39d Michael Hanselmann
589 5401c39d Michael Hanselmann
    self.assertEqual(self._Test(range(100), 20), "[0, 1, 2, 3, 4, 5...")
590 5401c39d Michael Hanselmann
591 5401c39d Michael Hanselmann
  def testError(self):
592 5401c39d Michael Hanselmann
    for i in range(4):
593 5401c39d Michael Hanselmann
      self.assertRaises(AssertionError, utils.Truncate, "", i)
594 5401c39d Michael Hanselmann
595 5401c39d Michael Hanselmann
596 1be3e86c Michael Hanselmann
class TestFilterEmptyLinesAndComments(unittest.TestCase):
597 1be3e86c Michael Hanselmann
  def testEmpty(self):
598 6a9b9778 Michael Hanselmann
    self.assertEqual(utils.FilterEmptyLinesAndComments(""), [])
599 6a9b9778 Michael Hanselmann
    self.assertEqual(utils.FilterEmptyLinesAndComments("\n"), [])
600 6a9b9778 Michael Hanselmann
    self.assertEqual(utils.FilterEmptyLinesAndComments("\n" * 100), [])
601 6a9b9778 Michael Hanselmann
    self.assertEqual(utils.FilterEmptyLinesAndComments("\n  \n\t \n"), [])
602 1be3e86c Michael Hanselmann
603 1be3e86c Michael Hanselmann
  def test(self):
604 1be3e86c Michael Hanselmann
    text = """
605 1be3e86c Michael Hanselmann
      This
606 1be3e86c Michael Hanselmann
        is
607 1be3e86c Michael Hanselmann
      # with comments
608 1be3e86c Michael Hanselmann
          a
609 1be3e86c Michael Hanselmann
            test
610 1be3e86c Michael Hanselmann
            # in
611 1be3e86c Michael Hanselmann
            #
612 1be3e86c Michael Hanselmann
            saying
613 1be3e86c Michael Hanselmann
      ...#...
614 1be3e86c Michael Hanselmann
        # multiple places
615 1be3e86c Michael Hanselmann
        Hello World!
616 1be3e86c Michael Hanselmann
      """
617 6a9b9778 Michael Hanselmann
    self.assertEqual(utils.FilterEmptyLinesAndComments(text), [
618 1be3e86c Michael Hanselmann
      "This",
619 1be3e86c Michael Hanselmann
      "is",
620 1be3e86c Michael Hanselmann
      "a",
621 1be3e86c Michael Hanselmann
      "test",
622 1be3e86c Michael Hanselmann
      "saying",
623 1be3e86c Michael Hanselmann
      "...#...",
624 1be3e86c Michael Hanselmann
      "Hello World!",
625 1be3e86c Michael Hanselmann
      ])
626 1be3e86c Michael Hanselmann
627 1be3e86c Michael Hanselmann
628 7fcffe27 Michael Hanselmann
if __name__ == "__main__":
629 7fcffe27 Michael Hanselmann
  testutils.GanetiTestProgram()