Statistics
| Branch: | Tag: | Revision:

root / test / ganeti.utils_unittest.py @ a4ccecf6

History | View | Annotate | Download (10.6 kB)

1 a8083063 Iustin Pop
#!/usr/bin/python
2 a8083063 Iustin Pop
#
3 a8083063 Iustin Pop
4 7831fc5f Michael Hanselmann
# Copyright (C) 2006, 2007, 2010, 2011 Google Inc.
5 a8083063 Iustin Pop
#
6 a8083063 Iustin Pop
# This program is free software; you can redistribute it and/or modify
7 a8083063 Iustin Pop
# it under the terms of the GNU General Public License as published by
8 a8083063 Iustin Pop
# the Free Software Foundation; either version 2 of the License, or
9 a8083063 Iustin Pop
# (at your option) any later version.
10 a8083063 Iustin Pop
#
11 a8083063 Iustin Pop
# This program is distributed in the hope that it will be useful, but
12 a8083063 Iustin Pop
# WITHOUT ANY WARRANTY; without even the implied warranty of
13 a8083063 Iustin Pop
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14 a8083063 Iustin Pop
# General Public License for more details.
15 a8083063 Iustin Pop
#
16 a8083063 Iustin Pop
# You should have received a copy of the GNU General Public License
17 a8083063 Iustin Pop
# along with this program; if not, write to the Free Software
18 a8083063 Iustin Pop
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
19 a8083063 Iustin Pop
# 02110-1301, USA.
20 a8083063 Iustin Pop
21 a8083063 Iustin Pop
22 a8083063 Iustin Pop
"""Script for unittesting the utils module"""
23 a8083063 Iustin Pop
24 a744b676 Manuel Franceschini
import errno
25 a744b676 Manuel Franceschini
import fcntl
26 a744b676 Manuel Franceschini
import glob
27 a8083063 Iustin Pop
import os
28 a8083063 Iustin Pop
import os.path
29 a744b676 Manuel Franceschini
import re
30 a744b676 Manuel Franceschini
import shutil
31 740c5aab Guido Trotter
import signal
32 2c30e9d7 Alexander Schreiber
import socket
33 a744b676 Manuel Franceschini
import stat
34 a744b676 Manuel Franceschini
import tempfile
35 a744b676 Manuel Franceschini
import time
36 a744b676 Manuel Franceschini
import unittest
37 27e46076 Michael Hanselmann
import warnings
38 153533f3 Michael Hanselmann
import random
39 153533f3 Michael Hanselmann
import operator
40 a8083063 Iustin Pop
41 c9c4f19e Michael Hanselmann
import testutils
42 16abfbc2 Alexander Schreiber
from ganeti import constants
43 716a32cb Guido Trotter
from ganeti import compat
44 59072e7e Michael Hanselmann
from ganeti import utils
45 a5728081 Guido Trotter
from ganeti import errors
46 3865ca48 Michael Hanselmann
from ganeti.utils import RunCmd, \
47 3865ca48 Michael Hanselmann
     FirstFree, \
48 17b97ab3 Michael Hanselmann
     RunParts
49 a8083063 Iustin Pop
50 d9f311d7 Iustin Pop
51 31155d60 Balazs Lecz
class TestParseCpuMask(unittest.TestCase):
52 31155d60 Balazs Lecz
  """Test case for the ParseCpuMask function."""
53 31155d60 Balazs Lecz
54 31155d60 Balazs Lecz
  def testWellFormed(self):
55 31155d60 Balazs Lecz
    self.assertEqual(utils.ParseCpuMask(""), [])
56 31155d60 Balazs Lecz
    self.assertEqual(utils.ParseCpuMask("1"), [1])
57 31155d60 Balazs Lecz
    self.assertEqual(utils.ParseCpuMask("0-2,4,5-5"), [0,1,2,4,5])
58 31155d60 Balazs Lecz
59 31155d60 Balazs Lecz
  def testInvalidInput(self):
60 f40ae421 Iustin Pop
    for data in ["garbage", "0,", "0-1-2", "2-1", "1-a"]:
61 f40ae421 Iustin Pop
      self.assertRaises(errors.ParseError, utils.ParseCpuMask, data)
62 f40ae421 Iustin Pop
63 31155d60 Balazs Lecz
64 1b045f5d Balazs Lecz
class TestGetMounts(unittest.TestCase):
65 1b045f5d Balazs Lecz
  """Test case for GetMounts()."""
66 1b045f5d Balazs Lecz
67 1b045f5d Balazs Lecz
  TESTDATA = (
68 1b045f5d Balazs Lecz
    "rootfs /     rootfs rw 0 0\n"
69 1b045f5d Balazs Lecz
    "none   /sys  sysfs  rw,nosuid,nodev,noexec,relatime 0 0\n"
70 1b045f5d Balazs Lecz
    "none   /proc proc   rw,nosuid,nodev,noexec,relatime 0 0\n")
71 1b045f5d Balazs Lecz
72 1b045f5d Balazs Lecz
  def setUp(self):
73 1b045f5d Balazs Lecz
    self.tmpfile = tempfile.NamedTemporaryFile()
74 1b045f5d Balazs Lecz
    utils.WriteFile(self.tmpfile.name, data=self.TESTDATA)
75 1b045f5d Balazs Lecz
76 1b045f5d Balazs Lecz
  def testGetMounts(self):
77 1b045f5d Balazs Lecz
    self.assertEqual(utils.GetMounts(filename=self.tmpfile.name),
78 1b045f5d Balazs Lecz
      [
79 1b045f5d Balazs Lecz
        ("rootfs", "/", "rootfs", "rw"),
80 1b045f5d Balazs Lecz
        ("none", "/sys", "sysfs", "rw,nosuid,nodev,noexec,relatime"),
81 1b045f5d Balazs Lecz
        ("none", "/proc", "proc", "rw,nosuid,nodev,noexec,relatime"),
82 1b045f5d Balazs Lecz
      ])
83 1b045f5d Balazs Lecz
84 24818e8f Michael Hanselmann
class TestNewUUID(unittest.TestCase):
85 24818e8f Michael Hanselmann
  """Test case for NewUUID"""
86 59072e7e Michael Hanselmann
87 59072e7e Michael Hanselmann
  def runTest(self):
88 05636402 Guido Trotter
    self.failUnless(utils.UUID_RE.match(utils.NewUUID()))
89 59072e7e Michael Hanselmann
90 59072e7e Michael Hanselmann
91 7b4126b7 Iustin Pop
class TestFirstFree(unittest.TestCase):
92 7b4126b7 Iustin Pop
  """Test case for the FirstFree function"""
93 7b4126b7 Iustin Pop
94 7b4126b7 Iustin Pop
  def test(self):
95 7b4126b7 Iustin Pop
    """Test FirstFree"""
96 7b4126b7 Iustin Pop
    self.failUnlessEqual(FirstFree([0, 1, 3]), 2)
97 7b4126b7 Iustin Pop
    self.failUnlessEqual(FirstFree([]), None)
98 7b4126b7 Iustin Pop
    self.failUnlessEqual(FirstFree([3, 4, 6]), 0)
99 7b4126b7 Iustin Pop
    self.failUnlessEqual(FirstFree([3, 4, 6], base=3), 5)
100 7b4126b7 Iustin Pop
    self.failUnlessRaises(AssertionError, FirstFree, [0, 3, 4, 6], base=3)
101 f7414041 Michael Hanselmann
102 a87b4824 Michael Hanselmann
103 739be818 Michael Hanselmann
class TestTimeFunctions(unittest.TestCase):
104 739be818 Michael Hanselmann
  """Test case for time functions"""
105 739be818 Michael Hanselmann
106 739be818 Michael Hanselmann
  def runTest(self):
107 739be818 Michael Hanselmann
    self.assertEqual(utils.SplitTime(1), (1, 0))
108 45bc5e4a Michael Hanselmann
    self.assertEqual(utils.SplitTime(1.5), (1, 500000))
109 45bc5e4a Michael Hanselmann
    self.assertEqual(utils.SplitTime(1218448917.4809151), (1218448917, 480915))
110 45bc5e4a Michael Hanselmann
    self.assertEqual(utils.SplitTime(123.48012), (123, 480120))
111 45bc5e4a Michael Hanselmann
    self.assertEqual(utils.SplitTime(123.9996), (123, 999600))
112 45bc5e4a Michael Hanselmann
    self.assertEqual(utils.SplitTime(123.9995), (123, 999500))
113 45bc5e4a Michael Hanselmann
    self.assertEqual(utils.SplitTime(123.9994), (123, 999400))
114 45bc5e4a Michael Hanselmann
    self.assertEqual(utils.SplitTime(123.999999999), (123, 999999))
115 45bc5e4a Michael Hanselmann
116 45bc5e4a Michael Hanselmann
    self.assertRaises(AssertionError, utils.SplitTime, -1)
117 739be818 Michael Hanselmann
118 739be818 Michael Hanselmann
    self.assertEqual(utils.MergeTime((1, 0)), 1.0)
119 45bc5e4a Michael Hanselmann
    self.assertEqual(utils.MergeTime((1, 500000)), 1.5)
120 45bc5e4a Michael Hanselmann
    self.assertEqual(utils.MergeTime((1218448917, 500000)), 1218448917.5)
121 739be818 Michael Hanselmann
122 4d4a651d Michael Hanselmann
    self.assertEqual(round(utils.MergeTime((1218448917, 481000)), 3),
123 4d4a651d Michael Hanselmann
                     1218448917.481)
124 45bc5e4a Michael Hanselmann
    self.assertEqual(round(utils.MergeTime((1, 801000)), 3), 1.801)
125 739be818 Michael Hanselmann
126 739be818 Michael Hanselmann
    self.assertRaises(AssertionError, utils.MergeTime, (0, -1))
127 45bc5e4a Michael Hanselmann
    self.assertRaises(AssertionError, utils.MergeTime, (0, 1000000))
128 45bc5e4a Michael Hanselmann
    self.assertRaises(AssertionError, utils.MergeTime, (0, 9999999))
129 739be818 Michael Hanselmann
    self.assertRaises(AssertionError, utils.MergeTime, (-1, 0))
130 739be818 Michael Hanselmann
    self.assertRaises(AssertionError, utils.MergeTime, (-9999, 0))
131 739be818 Michael Hanselmann
132 739be818 Michael Hanselmann
133 a2d2e1a7 Iustin Pop
class FieldSetTestCase(unittest.TestCase):
134 a2d2e1a7 Iustin Pop
  """Test case for FieldSets"""
135 a2d2e1a7 Iustin Pop
136 a2d2e1a7 Iustin Pop
  def testSimpleMatch(self):
137 a2d2e1a7 Iustin Pop
    f = utils.FieldSet("a", "b", "c", "def")
138 a2d2e1a7 Iustin Pop
    self.failUnless(f.Matches("a"))
139 a2d2e1a7 Iustin Pop
    self.failIf(f.Matches("d"), "Substring matched")
140 a2d2e1a7 Iustin Pop
    self.failIf(f.Matches("defghi"), "Prefix string matched")
141 a2d2e1a7 Iustin Pop
    self.failIf(f.NonMatching(["b", "c"]))
142 a2d2e1a7 Iustin Pop
    self.failIf(f.NonMatching(["a", "b", "c", "def"]))
143 a2d2e1a7 Iustin Pop
    self.failUnless(f.NonMatching(["a", "d"]))
144 a2d2e1a7 Iustin Pop
145 a2d2e1a7 Iustin Pop
  def testRegexMatch(self):
146 a2d2e1a7 Iustin Pop
    f = utils.FieldSet("a", "b([0-9]+)", "c")
147 a2d2e1a7 Iustin Pop
    self.failUnless(f.Matches("b1"))
148 a2d2e1a7 Iustin Pop
    self.failUnless(f.Matches("b99"))
149 a2d2e1a7 Iustin Pop
    self.failIf(f.Matches("b/1"))
150 a2d2e1a7 Iustin Pop
    self.failIf(f.NonMatching(["b12", "c"]))
151 a2d2e1a7 Iustin Pop
    self.failUnless(f.NonMatching(["a", "1"]))
152 a2d2e1a7 Iustin Pop
153 a5728081 Guido Trotter
class TestForceDictType(unittest.TestCase):
154 a5728081 Guido Trotter
  """Test case for ForceDictType"""
155 f40ae421 Iustin Pop
  KEY_TYPES = {
156 f40ae421 Iustin Pop
    "a": constants.VTYPE_INT,
157 f40ae421 Iustin Pop
    "b": constants.VTYPE_BOOL,
158 f40ae421 Iustin Pop
    "c": constants.VTYPE_STRING,
159 f40ae421 Iustin Pop
    "d": constants.VTYPE_SIZE,
160 f40ae421 Iustin Pop
    "e": constants.VTYPE_MAYBE_STRING,
161 f40ae421 Iustin Pop
    }
162 a5728081 Guido Trotter
163 a5728081 Guido Trotter
  def _fdt(self, dict, allowed_values=None):
164 a5728081 Guido Trotter
    if allowed_values is None:
165 f40ae421 Iustin Pop
      utils.ForceDictType(dict, self.KEY_TYPES)
166 a5728081 Guido Trotter
    else:
167 f40ae421 Iustin Pop
      utils.ForceDictType(dict, self.KEY_TYPES, allowed_values=allowed_values)
168 a5728081 Guido Trotter
169 a5728081 Guido Trotter
    return dict
170 a5728081 Guido Trotter
171 a5728081 Guido Trotter
  def testSimpleDict(self):
172 a5728081 Guido Trotter
    self.assertEqual(self._fdt({}), {})
173 a5728081 Guido Trotter
    self.assertEqual(self._fdt({'a': 1}), {'a': 1})
174 a5728081 Guido Trotter
    self.assertEqual(self._fdt({'a': '1'}), {'a': 1})
175 a5728081 Guido Trotter
    self.assertEqual(self._fdt({'a': 1, 'b': 1}), {'a':1, 'b': True})
176 a5728081 Guido Trotter
    self.assertEqual(self._fdt({'b': 1, 'c': 'foo'}), {'b': True, 'c': 'foo'})
177 a5728081 Guido Trotter
    self.assertEqual(self._fdt({'b': 1, 'c': False}), {'b': True, 'c': ''})
178 a5728081 Guido Trotter
    self.assertEqual(self._fdt({'b': 'false'}), {'b': False})
179 a5728081 Guido Trotter
    self.assertEqual(self._fdt({'b': 'False'}), {'b': False})
180 f40ae421 Iustin Pop
    self.assertEqual(self._fdt({'b': False}), {'b': False})
181 a5728081 Guido Trotter
    self.assertEqual(self._fdt({'b': 'true'}), {'b': True})
182 a5728081 Guido Trotter
    self.assertEqual(self._fdt({'b': 'True'}), {'b': True})
183 a5728081 Guido Trotter
    self.assertEqual(self._fdt({'d': '4'}), {'d': 4})
184 a5728081 Guido Trotter
    self.assertEqual(self._fdt({'d': '4M'}), {'d': 4})
185 59525e1f Michael Hanselmann
    self.assertEqual(self._fdt({"e": None, }), {"e": None, })
186 59525e1f Michael Hanselmann
    self.assertEqual(self._fdt({"e": "Hello World", }), {"e": "Hello World", })
187 59525e1f Michael Hanselmann
    self.assertEqual(self._fdt({"e": False, }), {"e": '', })
188 f40ae421 Iustin Pop
    self.assertEqual(self._fdt({"b": "hello", }, ["hello"]), {"b": "hello"})
189 a5728081 Guido Trotter
190 a5728081 Guido Trotter
  def testErrors(self):
191 a5728081 Guido Trotter
    self.assertRaises(errors.TypeEnforcementError, self._fdt, {'a': 'astring'})
192 f40ae421 Iustin Pop
    self.assertRaises(errors.TypeEnforcementError, self._fdt, {"b": "hello"})
193 a5728081 Guido Trotter
    self.assertRaises(errors.TypeEnforcementError, self._fdt, {'c': True})
194 a5728081 Guido Trotter
    self.assertRaises(errors.TypeEnforcementError, self._fdt, {'d': 'astring'})
195 a5728081 Guido Trotter
    self.assertRaises(errors.TypeEnforcementError, self._fdt, {'d': '4 L'})
196 59525e1f Michael Hanselmann
    self.assertRaises(errors.TypeEnforcementError, self._fdt, {"e": object(), })
197 59525e1f Michael Hanselmann
    self.assertRaises(errors.TypeEnforcementError, self._fdt, {"e": [], })
198 f40ae421 Iustin Pop
    self.assertRaises(errors.TypeEnforcementError, self._fdt, {"x": None, })
199 f40ae421 Iustin Pop
    self.assertRaises(errors.TypeEnforcementError, self._fdt, [])
200 f40ae421 Iustin Pop
    self.assertRaises(errors.ProgrammerError, utils.ForceDictType,
201 f40ae421 Iustin Pop
                      {"b": "hello"}, {"b": "no-such-type"})
202 a5728081 Guido Trotter
203 a2d2e1a7 Iustin Pop
204 28f34048 Michael Hanselmann
class TestValidateServiceName(unittest.TestCase):
205 28f34048 Michael Hanselmann
  def testValid(self):
206 28f34048 Michael Hanselmann
    testnames = [
207 28f34048 Michael Hanselmann
      0, 1, 2, 3, 1024, 65000, 65534, 65535,
208 28f34048 Michael Hanselmann
      "ganeti",
209 28f34048 Michael Hanselmann
      "gnt-masterd",
210 28f34048 Michael Hanselmann
      "HELLO_WORLD_SVC",
211 28f34048 Michael Hanselmann
      "hello.world.1",
212 28f34048 Michael Hanselmann
      "0", "80", "1111", "65535",
213 28f34048 Michael Hanselmann
      ]
214 28f34048 Michael Hanselmann
215 28f34048 Michael Hanselmann
    for name in testnames:
216 28f34048 Michael Hanselmann
      self.assertEqual(utils.ValidateServiceName(name), name)
217 28f34048 Michael Hanselmann
218 28f34048 Michael Hanselmann
  def testInvalid(self):
219 28f34048 Michael Hanselmann
    testnames = [
220 28f34048 Michael Hanselmann
      -15756, -1, 65536, 133428083,
221 28f34048 Michael Hanselmann
      "", "Hello World!", "!", "'", "\"", "\t", "\n", "`",
222 28f34048 Michael Hanselmann
      "-8546", "-1", "65536",
223 28f34048 Michael Hanselmann
      (129 * "A"),
224 28f34048 Michael Hanselmann
      ]
225 28f34048 Michael Hanselmann
226 28f34048 Michael Hanselmann
    for name in testnames:
227 a744b676 Manuel Franceschini
      self.assertRaises(errors.OpPrereqError, utils.ValidateServiceName, name)
228 28f34048 Michael Hanselmann
229 28f34048 Michael Hanselmann
230 debed9ae Michael Hanselmann
class TestReadLockedPidFile(unittest.TestCase):
231 debed9ae Michael Hanselmann
  def setUp(self):
232 debed9ae Michael Hanselmann
    self.tmpdir = tempfile.mkdtemp()
233 debed9ae Michael Hanselmann
234 debed9ae Michael Hanselmann
  def tearDown(self):
235 debed9ae Michael Hanselmann
    shutil.rmtree(self.tmpdir)
236 debed9ae Michael Hanselmann
237 debed9ae Michael Hanselmann
  def testNonExistent(self):
238 3865ca48 Michael Hanselmann
    path = utils.PathJoin(self.tmpdir, "nonexist")
239 debed9ae Michael Hanselmann
    self.assert_(utils.ReadLockedPidFile(path) is None)
240 debed9ae Michael Hanselmann
241 debed9ae Michael Hanselmann
  def testUnlocked(self):
242 3865ca48 Michael Hanselmann
    path = utils.PathJoin(self.tmpdir, "pid")
243 debed9ae Michael Hanselmann
    utils.WriteFile(path, data="123")
244 debed9ae Michael Hanselmann
    self.assert_(utils.ReadLockedPidFile(path) is None)
245 debed9ae Michael Hanselmann
246 debed9ae Michael Hanselmann
  def testLocked(self):
247 3865ca48 Michael Hanselmann
    path = utils.PathJoin(self.tmpdir, "pid")
248 debed9ae Michael Hanselmann
    utils.WriteFile(path, data="123")
249 debed9ae Michael Hanselmann
250 debed9ae Michael Hanselmann
    fl = utils.FileLock.Open(path)
251 debed9ae Michael Hanselmann
    try:
252 debed9ae Michael Hanselmann
      fl.Exclusive(blocking=True)
253 debed9ae Michael Hanselmann
254 debed9ae Michael Hanselmann
      self.assertEqual(utils.ReadLockedPidFile(path), 123)
255 debed9ae Michael Hanselmann
    finally:
256 debed9ae Michael Hanselmann
      fl.Close()
257 debed9ae Michael Hanselmann
258 debed9ae Michael Hanselmann
    self.assert_(utils.ReadLockedPidFile(path) is None)
259 debed9ae Michael Hanselmann
260 debed9ae Michael Hanselmann
  def testError(self):
261 3865ca48 Michael Hanselmann
    path = utils.PathJoin(self.tmpdir, "foobar", "pid")
262 3865ca48 Michael Hanselmann
    utils.WriteFile(utils.PathJoin(self.tmpdir, "foobar"), data="")
263 debed9ae Michael Hanselmann
    # open(2) should return ENOTDIR
264 debed9ae Michael Hanselmann
    self.assertRaises(EnvironmentError, utils.ReadLockedPidFile, path)
265 debed9ae Michael Hanselmann
266 debed9ae Michael Hanselmann
267 691c81b7 Michael Hanselmann
class TestFindMatch(unittest.TestCase):
268 691c81b7 Michael Hanselmann
  def test(self):
269 691c81b7 Michael Hanselmann
    data = {
270 691c81b7 Michael Hanselmann
      "aaaa": "Four A",
271 691c81b7 Michael Hanselmann
      "bb": {"Two B": True},
272 691c81b7 Michael Hanselmann
      re.compile(r"^x(foo|bar|bazX)([0-9]+)$"): (1, 2, 3),
273 691c81b7 Michael Hanselmann
      }
274 691c81b7 Michael Hanselmann
275 691c81b7 Michael Hanselmann
    self.assertEqual(utils.FindMatch(data, "aaaa"), ("Four A", []))
276 691c81b7 Michael Hanselmann
    self.assertEqual(utils.FindMatch(data, "bb"), ({"Two B": True}, []))
277 691c81b7 Michael Hanselmann
278 691c81b7 Michael Hanselmann
    for i in ["foo", "bar", "bazX"]:
279 691c81b7 Michael Hanselmann
      for j in range(1, 100, 7):
280 691c81b7 Michael Hanselmann
        self.assertEqual(utils.FindMatch(data, "x%s%s" % (i, j)),
281 691c81b7 Michael Hanselmann
                         ((1, 2, 3), [i, str(j)]))
282 691c81b7 Michael Hanselmann
283 691c81b7 Michael Hanselmann
  def testNoMatch(self):
284 691c81b7 Michael Hanselmann
    self.assert_(utils.FindMatch({}, "") is None)
285 691c81b7 Michael Hanselmann
    self.assert_(utils.FindMatch({}, "foo") is None)
286 691c81b7 Michael Hanselmann
    self.assert_(utils.FindMatch({}, 1234) is None)
287 691c81b7 Michael Hanselmann
288 691c81b7 Michael Hanselmann
    data = {
289 691c81b7 Michael Hanselmann
      "X": "Hello World",
290 691c81b7 Michael Hanselmann
      re.compile("^(something)$"): "Hello World",
291 691c81b7 Michael Hanselmann
      }
292 691c81b7 Michael Hanselmann
293 691c81b7 Michael Hanselmann
    self.assert_(utils.FindMatch(data, "") is None)
294 691c81b7 Michael Hanselmann
    self.assert_(utils.FindMatch(data, "Hello World") is None)
295 691c81b7 Michael Hanselmann
296 691c81b7 Michael Hanselmann
297 f40ae421 Iustin Pop
class TestTryConvert(unittest.TestCase):
298 f40ae421 Iustin Pop
  def test(self):
299 f40ae421 Iustin Pop
    for src, fn, result in [
300 f40ae421 Iustin Pop
      ("1", int, 1),
301 f40ae421 Iustin Pop
      ("a", int, "a"),
302 f40ae421 Iustin Pop
      ("", bool, False),
303 f40ae421 Iustin Pop
      ("a", bool, True),
304 f40ae421 Iustin Pop
      ]:
305 f40ae421 Iustin Pop
      self.assertEqual(utils.TryConvert(fn, src), result)
306 f40ae421 Iustin Pop
307 f40ae421 Iustin Pop
308 f40ae421 Iustin Pop
class TestIsValidShellParam(unittest.TestCase):
309 f40ae421 Iustin Pop
  def test(self):
310 f40ae421 Iustin Pop
    for val, result in [
311 f40ae421 Iustin Pop
      ("abc", True),
312 f40ae421 Iustin Pop
      ("ab;cd", False),
313 f40ae421 Iustin Pop
      ]:
314 f40ae421 Iustin Pop
      self.assertEqual(utils.IsValidShellParam(val), result)
315 f40ae421 Iustin Pop
316 f40ae421 Iustin Pop
317 f40ae421 Iustin Pop
class TestBuildShellCmd(unittest.TestCase):
318 f40ae421 Iustin Pop
  def test(self):
319 f40ae421 Iustin Pop
    self.assertRaises(errors.ProgrammerError, utils.BuildShellCmd,
320 f40ae421 Iustin Pop
                      "ls %s", "ab;cd")
321 f40ae421 Iustin Pop
    self.assertEqual(utils.BuildShellCmd("ls %s", "ab"), "ls ab")
322 f40ae421 Iustin Pop
323 f40ae421 Iustin Pop
324 a8083063 Iustin Pop
if __name__ == '__main__':
325 25231ec5 Michael Hanselmann
  testutils.GanetiTestProgram()