root / test / ganeti.utils.text_unittest.py @ 3c002a13
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() |