Statistics
| Branch: | Tag: | Revision:

root / test / ganeti.utils.io_unittest.py @ 2dbc6857

History | View | Annotate | Download (31.8 kB)

1 3865ca48 Michael Hanselmann
#!/usr/bin/python
2 3865ca48 Michael Hanselmann
#
3 3865ca48 Michael Hanselmann
4 3865ca48 Michael Hanselmann
# Copyright (C) 2006, 2007, 2010, 2011 Google Inc.
5 3865ca48 Michael Hanselmann
#
6 3865ca48 Michael Hanselmann
# This program is free software; you can redistribute it and/or modify
7 3865ca48 Michael Hanselmann
# it under the terms of the GNU General Public License as published by
8 3865ca48 Michael Hanselmann
# the Free Software Foundation; either version 2 of the License, or
9 3865ca48 Michael Hanselmann
# (at your option) any later version.
10 3865ca48 Michael Hanselmann
#
11 3865ca48 Michael Hanselmann
# This program is distributed in the hope that it will be useful, but
12 3865ca48 Michael Hanselmann
# WITHOUT ANY WARRANTY; without even the implied warranty of
13 3865ca48 Michael Hanselmann
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14 3865ca48 Michael Hanselmann
# General Public License for more details.
15 3865ca48 Michael Hanselmann
#
16 3865ca48 Michael Hanselmann
# You should have received a copy of the GNU General Public License
17 3865ca48 Michael Hanselmann
# along with this program; if not, write to the Free Software
18 3865ca48 Michael Hanselmann
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
19 3865ca48 Michael Hanselmann
# 02110-1301, USA.
20 3865ca48 Michael Hanselmann
21 3865ca48 Michael Hanselmann
22 3865ca48 Michael Hanselmann
"""Script for testing ganeti.utils.io"""
23 3865ca48 Michael Hanselmann
24 3865ca48 Michael Hanselmann
import os
25 3865ca48 Michael Hanselmann
import tempfile
26 3865ca48 Michael Hanselmann
import unittest
27 3865ca48 Michael Hanselmann
import shutil
28 3865ca48 Michael Hanselmann
import glob
29 3865ca48 Michael Hanselmann
import time
30 3ae8dd03 Michael Hanselmann
import signal
31 b81b3c96 René Nussbaumer
import stat
32 b81b3c96 René Nussbaumer
import errno
33 3865ca48 Michael Hanselmann
34 3865ca48 Michael Hanselmann
from ganeti import constants
35 3865ca48 Michael Hanselmann
from ganeti import utils
36 3865ca48 Michael Hanselmann
from ganeti import compat
37 3865ca48 Michael Hanselmann
from ganeti import errors
38 3865ca48 Michael Hanselmann
39 3865ca48 Michael Hanselmann
import testutils
40 3865ca48 Michael Hanselmann
41 3865ca48 Michael Hanselmann
42 3865ca48 Michael Hanselmann
class TestReadFile(testutils.GanetiTestCase):
43 3865ca48 Michael Hanselmann
  def testReadAll(self):
44 3865ca48 Michael Hanselmann
    data = utils.ReadFile(self._TestDataFilename("cert1.pem"))
45 3865ca48 Michael Hanselmann
    self.assertEqual(len(data), 814)
46 3865ca48 Michael Hanselmann
47 3865ca48 Michael Hanselmann
    h = compat.md5_hash()
48 3865ca48 Michael Hanselmann
    h.update(data)
49 3865ca48 Michael Hanselmann
    self.assertEqual(h.hexdigest(), "a491efb3efe56a0535f924d5f8680fd4")
50 3865ca48 Michael Hanselmann
51 3865ca48 Michael Hanselmann
  def testReadSize(self):
52 3865ca48 Michael Hanselmann
    data = utils.ReadFile(self._TestDataFilename("cert1.pem"),
53 3865ca48 Michael Hanselmann
                          size=100)
54 3865ca48 Michael Hanselmann
    self.assertEqual(len(data), 100)
55 3865ca48 Michael Hanselmann
56 3865ca48 Michael Hanselmann
    h = compat.md5_hash()
57 3865ca48 Michael Hanselmann
    h.update(data)
58 3865ca48 Michael Hanselmann
    self.assertEqual(h.hexdigest(), "893772354e4e690b9efd073eed433ce7")
59 3865ca48 Michael Hanselmann
60 0e5084ee Michael Hanselmann
  def testCallback(self):
61 0e5084ee Michael Hanselmann
    def _Cb(fh):
62 0e5084ee Michael Hanselmann
      self.assertEqual(fh.tell(), 0)
63 0e5084ee Michael Hanselmann
    data = utils.ReadFile(self._TestDataFilename("cert1.pem"), preread=_Cb)
64 0e5084ee Michael Hanselmann
    self.assertEqual(len(data), 814)
65 0e5084ee Michael Hanselmann
66 3865ca48 Michael Hanselmann
  def testError(self):
67 3865ca48 Michael Hanselmann
    self.assertRaises(EnvironmentError, utils.ReadFile,
68 3865ca48 Michael Hanselmann
                      "/dev/null/does-not-exist")
69 3865ca48 Michael Hanselmann
70 3865ca48 Michael Hanselmann
71 3865ca48 Michael Hanselmann
class TestReadOneLineFile(testutils.GanetiTestCase):
72 3865ca48 Michael Hanselmann
  def setUp(self):
73 3865ca48 Michael Hanselmann
    testutils.GanetiTestCase.setUp(self)
74 3865ca48 Michael Hanselmann
75 3865ca48 Michael Hanselmann
  def testDefault(self):
76 3865ca48 Michael Hanselmann
    data = utils.ReadOneLineFile(self._TestDataFilename("cert1.pem"))
77 3865ca48 Michael Hanselmann
    self.assertEqual(len(data), 27)
78 3865ca48 Michael Hanselmann
    self.assertEqual(data, "-----BEGIN CERTIFICATE-----")
79 3865ca48 Michael Hanselmann
80 3865ca48 Michael Hanselmann
  def testNotStrict(self):
81 3865ca48 Michael Hanselmann
    data = utils.ReadOneLineFile(self._TestDataFilename("cert1.pem"),
82 3865ca48 Michael Hanselmann
                                 strict=False)
83 3865ca48 Michael Hanselmann
    self.assertEqual(len(data), 27)
84 3865ca48 Michael Hanselmann
    self.assertEqual(data, "-----BEGIN CERTIFICATE-----")
85 3865ca48 Michael Hanselmann
86 3865ca48 Michael Hanselmann
  def testStrictFailure(self):
87 3865ca48 Michael Hanselmann
    self.assertRaises(errors.GenericError, utils.ReadOneLineFile,
88 3865ca48 Michael Hanselmann
                      self._TestDataFilename("cert1.pem"), strict=True)
89 3865ca48 Michael Hanselmann
90 3865ca48 Michael Hanselmann
  def testLongLine(self):
91 3865ca48 Michael Hanselmann
    dummydata = (1024 * "Hello World! ")
92 3865ca48 Michael Hanselmann
    myfile = self._CreateTempFile()
93 3865ca48 Michael Hanselmann
    utils.WriteFile(myfile, data=dummydata)
94 3865ca48 Michael Hanselmann
    datastrict = utils.ReadOneLineFile(myfile, strict=True)
95 3865ca48 Michael Hanselmann
    datalax = utils.ReadOneLineFile(myfile, strict=False)
96 3865ca48 Michael Hanselmann
    self.assertEqual(dummydata, datastrict)
97 3865ca48 Michael Hanselmann
    self.assertEqual(dummydata, datalax)
98 3865ca48 Michael Hanselmann
99 3865ca48 Michael Hanselmann
  def testNewline(self):
100 3865ca48 Michael Hanselmann
    myfile = self._CreateTempFile()
101 3865ca48 Michael Hanselmann
    myline = "myline"
102 3865ca48 Michael Hanselmann
    for nl in ["", "\n", "\r\n"]:
103 3865ca48 Michael Hanselmann
      dummydata = "%s%s" % (myline, nl)
104 3865ca48 Michael Hanselmann
      utils.WriteFile(myfile, data=dummydata)
105 3865ca48 Michael Hanselmann
      datalax = utils.ReadOneLineFile(myfile, strict=False)
106 3865ca48 Michael Hanselmann
      self.assertEqual(myline, datalax)
107 3865ca48 Michael Hanselmann
      datastrict = utils.ReadOneLineFile(myfile, strict=True)
108 3865ca48 Michael Hanselmann
      self.assertEqual(myline, datastrict)
109 3865ca48 Michael Hanselmann
110 3865ca48 Michael Hanselmann
  def testWhitespaceAndMultipleLines(self):
111 3865ca48 Michael Hanselmann
    myfile = self._CreateTempFile()
112 3865ca48 Michael Hanselmann
    for nl in ["", "\n", "\r\n"]:
113 3865ca48 Michael Hanselmann
      for ws in [" ", "\t", "\t\t  \t", "\t "]:
114 3865ca48 Michael Hanselmann
        dummydata = (1024 * ("Foo bar baz %s%s" % (ws, nl)))
115 3865ca48 Michael Hanselmann
        utils.WriteFile(myfile, data=dummydata)
116 3865ca48 Michael Hanselmann
        datalax = utils.ReadOneLineFile(myfile, strict=False)
117 3865ca48 Michael Hanselmann
        if nl:
118 3865ca48 Michael Hanselmann
          self.assert_(set("\r\n") & set(dummydata))
119 3865ca48 Michael Hanselmann
          self.assertRaises(errors.GenericError, utils.ReadOneLineFile,
120 3865ca48 Michael Hanselmann
                            myfile, strict=True)
121 3865ca48 Michael Hanselmann
          explen = len("Foo bar baz ") + len(ws)
122 3865ca48 Michael Hanselmann
          self.assertEqual(len(datalax), explen)
123 3865ca48 Michael Hanselmann
          self.assertEqual(datalax, dummydata[:explen])
124 3865ca48 Michael Hanselmann
          self.assertFalse(set("\r\n") & set(datalax))
125 3865ca48 Michael Hanselmann
        else:
126 3865ca48 Michael Hanselmann
          datastrict = utils.ReadOneLineFile(myfile, strict=True)
127 3865ca48 Michael Hanselmann
          self.assertEqual(dummydata, datastrict)
128 3865ca48 Michael Hanselmann
          self.assertEqual(dummydata, datalax)
129 3865ca48 Michael Hanselmann
130 3865ca48 Michael Hanselmann
  def testEmptylines(self):
131 3865ca48 Michael Hanselmann
    myfile = self._CreateTempFile()
132 3865ca48 Michael Hanselmann
    myline = "myline"
133 3865ca48 Michael Hanselmann
    for nl in ["\n", "\r\n"]:
134 3865ca48 Michael Hanselmann
      for ol in ["", "otherline"]:
135 3865ca48 Michael Hanselmann
        dummydata = "%s%s%s%s%s%s" % (nl, nl, myline, nl, ol, nl)
136 3865ca48 Michael Hanselmann
        utils.WriteFile(myfile, data=dummydata)
137 3865ca48 Michael Hanselmann
        self.assert_(set("\r\n") & set(dummydata))
138 3865ca48 Michael Hanselmann
        datalax = utils.ReadOneLineFile(myfile, strict=False)
139 3865ca48 Michael Hanselmann
        self.assertEqual(myline, datalax)
140 3865ca48 Michael Hanselmann
        if ol:
141 3865ca48 Michael Hanselmann
          self.assertRaises(errors.GenericError, utils.ReadOneLineFile,
142 3865ca48 Michael Hanselmann
                            myfile, strict=True)
143 3865ca48 Michael Hanselmann
        else:
144 3865ca48 Michael Hanselmann
          datastrict = utils.ReadOneLineFile(myfile, strict=True)
145 3865ca48 Michael Hanselmann
          self.assertEqual(myline, datastrict)
146 3865ca48 Michael Hanselmann
147 3865ca48 Michael Hanselmann
  def testEmptyfile(self):
148 3865ca48 Michael Hanselmann
    myfile = self._CreateTempFile()
149 3865ca48 Michael Hanselmann
    self.assertRaises(errors.GenericError, utils.ReadOneLineFile, myfile)
150 3865ca48 Michael Hanselmann
151 3865ca48 Michael Hanselmann
152 3865ca48 Michael Hanselmann
class TestTimestampForFilename(unittest.TestCase):
153 3865ca48 Michael Hanselmann
  def test(self):
154 3865ca48 Michael Hanselmann
    self.assert_("." not in utils.TimestampForFilename())
155 3865ca48 Michael Hanselmann
    self.assert_(":" not in utils.TimestampForFilename())
156 3865ca48 Michael Hanselmann
157 3865ca48 Michael Hanselmann
158 3865ca48 Michael Hanselmann
class TestCreateBackup(testutils.GanetiTestCase):
159 3865ca48 Michael Hanselmann
  def setUp(self):
160 3865ca48 Michael Hanselmann
    testutils.GanetiTestCase.setUp(self)
161 3865ca48 Michael Hanselmann
162 3865ca48 Michael Hanselmann
    self.tmpdir = tempfile.mkdtemp()
163 3865ca48 Michael Hanselmann
164 3865ca48 Michael Hanselmann
  def tearDown(self):
165 3865ca48 Michael Hanselmann
    testutils.GanetiTestCase.tearDown(self)
166 3865ca48 Michael Hanselmann
167 3865ca48 Michael Hanselmann
    shutil.rmtree(self.tmpdir)
168 3865ca48 Michael Hanselmann
169 3865ca48 Michael Hanselmann
  def testEmpty(self):
170 3865ca48 Michael Hanselmann
    filename = utils.PathJoin(self.tmpdir, "config.data")
171 3865ca48 Michael Hanselmann
    utils.WriteFile(filename, data="")
172 3865ca48 Michael Hanselmann
    bname = utils.CreateBackup(filename)
173 3865ca48 Michael Hanselmann
    self.assertFileContent(bname, "")
174 3865ca48 Michael Hanselmann
    self.assertEqual(len(glob.glob("%s*" % filename)), 2)
175 3865ca48 Michael Hanselmann
    utils.CreateBackup(filename)
176 3865ca48 Michael Hanselmann
    self.assertEqual(len(glob.glob("%s*" % filename)), 3)
177 3865ca48 Michael Hanselmann
    utils.CreateBackup(filename)
178 3865ca48 Michael Hanselmann
    self.assertEqual(len(glob.glob("%s*" % filename)), 4)
179 3865ca48 Michael Hanselmann
180 3865ca48 Michael Hanselmann
    fifoname = utils.PathJoin(self.tmpdir, "fifo")
181 3865ca48 Michael Hanselmann
    os.mkfifo(fifoname)
182 3865ca48 Michael Hanselmann
    self.assertRaises(errors.ProgrammerError, utils.CreateBackup, fifoname)
183 3865ca48 Michael Hanselmann
184 3865ca48 Michael Hanselmann
  def testContent(self):
185 3865ca48 Michael Hanselmann
    bkpcount = 0
186 3865ca48 Michael Hanselmann
    for data in ["", "X", "Hello World!\n" * 100, "Binary data\0\x01\x02\n"]:
187 3865ca48 Michael Hanselmann
      for rep in [1, 2, 10, 127]:
188 3865ca48 Michael Hanselmann
        testdata = data * rep
189 3865ca48 Michael Hanselmann
190 3865ca48 Michael Hanselmann
        filename = utils.PathJoin(self.tmpdir, "test.data_")
191 3865ca48 Michael Hanselmann
        utils.WriteFile(filename, data=testdata)
192 3865ca48 Michael Hanselmann
        self.assertFileContent(filename, testdata)
193 3865ca48 Michael Hanselmann
194 3865ca48 Michael Hanselmann
        for _ in range(3):
195 3865ca48 Michael Hanselmann
          bname = utils.CreateBackup(filename)
196 3865ca48 Michael Hanselmann
          bkpcount += 1
197 3865ca48 Michael Hanselmann
          self.assertFileContent(bname, testdata)
198 3865ca48 Michael Hanselmann
          self.assertEqual(len(glob.glob("%s*" % filename)), 1 + bkpcount)
199 3865ca48 Michael Hanselmann
200 3865ca48 Michael Hanselmann
201 3865ca48 Michael Hanselmann
class TestListVisibleFiles(unittest.TestCase):
202 3865ca48 Michael Hanselmann
  """Test case for ListVisibleFiles"""
203 3865ca48 Michael Hanselmann
204 3865ca48 Michael Hanselmann
  def setUp(self):
205 3865ca48 Michael Hanselmann
    self.path = tempfile.mkdtemp()
206 3865ca48 Michael Hanselmann
207 3865ca48 Michael Hanselmann
  def tearDown(self):
208 3865ca48 Michael Hanselmann
    shutil.rmtree(self.path)
209 3865ca48 Michael Hanselmann
210 3865ca48 Michael Hanselmann
  def _CreateFiles(self, files):
211 3865ca48 Michael Hanselmann
    for name in files:
212 3865ca48 Michael Hanselmann
      utils.WriteFile(os.path.join(self.path, name), data="test")
213 3865ca48 Michael Hanselmann
214 3865ca48 Michael Hanselmann
  def _test(self, files, expected):
215 3865ca48 Michael Hanselmann
    self._CreateFiles(files)
216 3865ca48 Michael Hanselmann
    found = utils.ListVisibleFiles(self.path)
217 3865ca48 Michael Hanselmann
    self.assertEqual(set(found), set(expected))
218 3865ca48 Michael Hanselmann
219 3865ca48 Michael Hanselmann
  def testAllVisible(self):
220 3865ca48 Michael Hanselmann
    files = ["a", "b", "c"]
221 3865ca48 Michael Hanselmann
    expected = files
222 3865ca48 Michael Hanselmann
    self._test(files, expected)
223 3865ca48 Michael Hanselmann
224 3865ca48 Michael Hanselmann
  def testNoneVisible(self):
225 3865ca48 Michael Hanselmann
    files = [".a", ".b", ".c"]
226 3865ca48 Michael Hanselmann
    expected = []
227 3865ca48 Michael Hanselmann
    self._test(files, expected)
228 3865ca48 Michael Hanselmann
229 3865ca48 Michael Hanselmann
  def testSomeVisible(self):
230 3865ca48 Michael Hanselmann
    files = ["a", "b", ".c"]
231 3865ca48 Michael Hanselmann
    expected = ["a", "b"]
232 3865ca48 Michael Hanselmann
    self._test(files, expected)
233 3865ca48 Michael Hanselmann
234 3865ca48 Michael Hanselmann
  def testNonAbsolutePath(self):
235 3865ca48 Michael Hanselmann
    self.failUnlessRaises(errors.ProgrammerError, utils.ListVisibleFiles,
236 3865ca48 Michael Hanselmann
                          "abc")
237 3865ca48 Michael Hanselmann
238 3865ca48 Michael Hanselmann
  def testNonNormalizedPath(self):
239 3865ca48 Michael Hanselmann
    self.failUnlessRaises(errors.ProgrammerError, utils.ListVisibleFiles,
240 3865ca48 Michael Hanselmann
                          "/bin/../tmp")
241 3865ca48 Michael Hanselmann
242 2dbc6857 Michael Hanselmann
  def testMountpoint(self):
243 2dbc6857 Michael Hanselmann
    lvfmp_fn = compat.partial(utils.ListVisibleFiles,
244 2dbc6857 Michael Hanselmann
                              _is_mountpoint=lambda _: True)
245 2dbc6857 Michael Hanselmann
    self.assertEqual(lvfmp_fn(self.path), [])
246 2dbc6857 Michael Hanselmann
247 2dbc6857 Michael Hanselmann
    # Create "lost+found" as a regular file
248 2dbc6857 Michael Hanselmann
    self._CreateFiles(["foo", "bar", ".baz", "lost+found"])
249 2dbc6857 Michael Hanselmann
    self.assertEqual(set(lvfmp_fn(self.path)),
250 2dbc6857 Michael Hanselmann
                     set(["foo", "bar", "lost+found"]))
251 2dbc6857 Michael Hanselmann
252 2dbc6857 Michael Hanselmann
    # Replace "lost+found" with a directory
253 2dbc6857 Michael Hanselmann
    laf_path = utils.PathJoin(self.path, "lost+found")
254 2dbc6857 Michael Hanselmann
    utils.RemoveFile(laf_path)
255 2dbc6857 Michael Hanselmann
    os.mkdir(laf_path)
256 2dbc6857 Michael Hanselmann
    self.assertEqual(set(lvfmp_fn(self.path)), set(["foo", "bar"]))
257 2dbc6857 Michael Hanselmann
258 2dbc6857 Michael Hanselmann
  def testLostAndFoundNoMountpoint(self):
259 2dbc6857 Michael Hanselmann
    files = ["foo", "bar", ".Hello World", "lost+found"]
260 2dbc6857 Michael Hanselmann
    expected = ["foo", "bar", "lost+found"]
261 2dbc6857 Michael Hanselmann
    self._test(files, expected)
262 2dbc6857 Michael Hanselmann
263 3865ca48 Michael Hanselmann
264 3865ca48 Michael Hanselmann
class TestWriteFile(unittest.TestCase):
265 3865ca48 Michael Hanselmann
  def setUp(self):
266 a9d68e40 Michael Hanselmann
    self.tmpdir = None
267 3865ca48 Michael Hanselmann
    self.tfile = tempfile.NamedTemporaryFile()
268 3865ca48 Michael Hanselmann
    self.did_pre = False
269 3865ca48 Michael Hanselmann
    self.did_post = False
270 3865ca48 Michael Hanselmann
    self.did_write = False
271 3865ca48 Michael Hanselmann
272 a9d68e40 Michael Hanselmann
  def tearDown(self):
273 a9d68e40 Michael Hanselmann
    if self.tmpdir:
274 a9d68e40 Michael Hanselmann
      shutil.rmtree(self.tmpdir)
275 a9d68e40 Michael Hanselmann
276 3865ca48 Michael Hanselmann
  def markPre(self, fd):
277 3865ca48 Michael Hanselmann
    self.did_pre = True
278 3865ca48 Michael Hanselmann
279 3865ca48 Michael Hanselmann
  def markPost(self, fd):
280 3865ca48 Michael Hanselmann
    self.did_post = True
281 3865ca48 Michael Hanselmann
282 3865ca48 Michael Hanselmann
  def markWrite(self, fd):
283 3865ca48 Michael Hanselmann
    self.did_write = True
284 3865ca48 Michael Hanselmann
285 3865ca48 Michael Hanselmann
  def testWrite(self):
286 3865ca48 Michael Hanselmann
    data = "abc"
287 3865ca48 Michael Hanselmann
    utils.WriteFile(self.tfile.name, data=data)
288 3865ca48 Michael Hanselmann
    self.assertEqual(utils.ReadFile(self.tfile.name), data)
289 3865ca48 Michael Hanselmann
290 1d39e245 Iustin Pop
  def testWriteSimpleUnicode(self):
291 1d39e245 Iustin Pop
    data = u"abc"
292 1d39e245 Iustin Pop
    utils.WriteFile(self.tfile.name, data=data)
293 1d39e245 Iustin Pop
    self.assertEqual(utils.ReadFile(self.tfile.name), data)
294 1d39e245 Iustin Pop
295 3865ca48 Michael Hanselmann
  def testErrors(self):
296 3865ca48 Michael Hanselmann
    self.assertRaises(errors.ProgrammerError, utils.WriteFile,
297 3865ca48 Michael Hanselmann
                      self.tfile.name, data="test", fn=lambda fd: None)
298 3865ca48 Michael Hanselmann
    self.assertRaises(errors.ProgrammerError, utils.WriteFile, self.tfile.name)
299 3865ca48 Michael Hanselmann
    self.assertRaises(errors.ProgrammerError, utils.WriteFile,
300 3865ca48 Michael Hanselmann
                      self.tfile.name, data="test", atime=0)
301 3865ca48 Michael Hanselmann
302 a9d68e40 Michael Hanselmann
  def testPreWrite(self):
303 a9d68e40 Michael Hanselmann
    utils.WriteFile(self.tfile.name, data="", prewrite=self.markPre)
304 3865ca48 Michael Hanselmann
    self.assertTrue(self.did_pre)
305 a9d68e40 Michael Hanselmann
    self.assertFalse(self.did_post)
306 a9d68e40 Michael Hanselmann
    self.assertFalse(self.did_write)
307 a9d68e40 Michael Hanselmann
308 a9d68e40 Michael Hanselmann
  def testPostWrite(self):
309 a9d68e40 Michael Hanselmann
    utils.WriteFile(self.tfile.name, data="", postwrite=self.markPost)
310 a9d68e40 Michael Hanselmann
    self.assertFalse(self.did_pre)
311 3865ca48 Michael Hanselmann
    self.assertTrue(self.did_post)
312 a9d68e40 Michael Hanselmann
    self.assertFalse(self.did_write)
313 a9d68e40 Michael Hanselmann
314 a9d68e40 Michael Hanselmann
  def testWriteFunction(self):
315 a9d68e40 Michael Hanselmann
    utils.WriteFile(self.tfile.name, fn=self.markWrite)
316 a9d68e40 Michael Hanselmann
    self.assertFalse(self.did_pre)
317 a9d68e40 Michael Hanselmann
    self.assertFalse(self.did_post)
318 3865ca48 Michael Hanselmann
    self.assertTrue(self.did_write)
319 3865ca48 Michael Hanselmann
320 3865ca48 Michael Hanselmann
  def testDryRun(self):
321 3865ca48 Michael Hanselmann
    orig = "abc"
322 3865ca48 Michael Hanselmann
    self.tfile.write(orig)
323 3865ca48 Michael Hanselmann
    self.tfile.flush()
324 3865ca48 Michael Hanselmann
    utils.WriteFile(self.tfile.name, data="hello", dry_run=True)
325 3865ca48 Michael Hanselmann
    self.assertEqual(utils.ReadFile(self.tfile.name), orig)
326 3865ca48 Michael Hanselmann
327 3865ca48 Michael Hanselmann
  def testTimes(self):
328 3865ca48 Michael Hanselmann
    f = self.tfile.name
329 3865ca48 Michael Hanselmann
    for at, mt in [(0, 0), (1000, 1000), (2000, 3000),
330 3865ca48 Michael Hanselmann
                   (int(time.time()), 5000)]:
331 3865ca48 Michael Hanselmann
      utils.WriteFile(f, data="hello", atime=at, mtime=mt)
332 3865ca48 Michael Hanselmann
      st = os.stat(f)
333 3865ca48 Michael Hanselmann
      self.assertEqual(st.st_atime, at)
334 3865ca48 Michael Hanselmann
      self.assertEqual(st.st_mtime, mt)
335 3865ca48 Michael Hanselmann
336 3865ca48 Michael Hanselmann
  def testNoClose(self):
337 3865ca48 Michael Hanselmann
    data = "hello"
338 3865ca48 Michael Hanselmann
    self.assertEqual(utils.WriteFile(self.tfile.name, data="abc"), None)
339 3865ca48 Michael Hanselmann
    fd = utils.WriteFile(self.tfile.name, data=data, close=False)
340 3865ca48 Michael Hanselmann
    try:
341 3865ca48 Michael Hanselmann
      os.lseek(fd, 0, 0)
342 3865ca48 Michael Hanselmann
      self.assertEqual(os.read(fd, 4096), data)
343 3865ca48 Michael Hanselmann
    finally:
344 3865ca48 Michael Hanselmann
      os.close(fd)
345 3865ca48 Michael Hanselmann
346 a9d68e40 Michael Hanselmann
  def testNoLeftovers(self):
347 a9d68e40 Michael Hanselmann
    self.tmpdir = tempfile.mkdtemp()
348 a9d68e40 Michael Hanselmann
    self.assertEqual(utils.WriteFile(utils.PathJoin(self.tmpdir, "test"),
349 a9d68e40 Michael Hanselmann
                                     data="abc"),
350 a9d68e40 Michael Hanselmann
                     None)
351 a9d68e40 Michael Hanselmann
    self.assertEqual(os.listdir(self.tmpdir), ["test"])
352 a9d68e40 Michael Hanselmann
353 a9d68e40 Michael Hanselmann
  def testFailRename(self):
354 a9d68e40 Michael Hanselmann
    self.tmpdir = tempfile.mkdtemp()
355 a9d68e40 Michael Hanselmann
    target = utils.PathJoin(self.tmpdir, "target")
356 a9d68e40 Michael Hanselmann
    os.mkdir(target)
357 a9d68e40 Michael Hanselmann
    self.assertRaises(OSError, utils.WriteFile, target, data="abc")
358 a9d68e40 Michael Hanselmann
    self.assertTrue(os.path.isdir(target))
359 a9d68e40 Michael Hanselmann
    self.assertEqual(os.listdir(self.tmpdir), ["target"])
360 a9d68e40 Michael Hanselmann
    self.assertFalse(os.listdir(target))
361 a9d68e40 Michael Hanselmann
362 a9d68e40 Michael Hanselmann
  def testFailRenameDryRun(self):
363 a9d68e40 Michael Hanselmann
    self.tmpdir = tempfile.mkdtemp()
364 a9d68e40 Michael Hanselmann
    target = utils.PathJoin(self.tmpdir, "target")
365 a9d68e40 Michael Hanselmann
    os.mkdir(target)
366 a9d68e40 Michael Hanselmann
    self.assertEqual(utils.WriteFile(target, data="abc", dry_run=True), None)
367 a9d68e40 Michael Hanselmann
    self.assertTrue(os.path.isdir(target))
368 a9d68e40 Michael Hanselmann
    self.assertEqual(os.listdir(self.tmpdir), ["target"])
369 a9d68e40 Michael Hanselmann
    self.assertFalse(os.listdir(target))
370 a9d68e40 Michael Hanselmann
371 a9d68e40 Michael Hanselmann
  def testBackup(self):
372 a9d68e40 Michael Hanselmann
    self.tmpdir = tempfile.mkdtemp()
373 a9d68e40 Michael Hanselmann
    testfile = utils.PathJoin(self.tmpdir, "test")
374 a9d68e40 Michael Hanselmann
375 a9d68e40 Michael Hanselmann
    self.assertEqual(utils.WriteFile(testfile, data="foo", backup=True), None)
376 a9d68e40 Michael Hanselmann
    self.assertEqual(utils.ReadFile(testfile), "foo")
377 a9d68e40 Michael Hanselmann
    self.assertEqual(os.listdir(self.tmpdir), ["test"])
378 a9d68e40 Michael Hanselmann
379 a9d68e40 Michael Hanselmann
    # Write again
380 a9d68e40 Michael Hanselmann
    assert os.path.isfile(testfile)
381 a9d68e40 Michael Hanselmann
    self.assertEqual(utils.WriteFile(testfile, data="bar", backup=True), None)
382 a9d68e40 Michael Hanselmann
    self.assertEqual(utils.ReadFile(testfile), "bar")
383 a9d68e40 Michael Hanselmann
    self.assertEqual(len(glob.glob("%s.backup*" % testfile)), 1)
384 a9d68e40 Michael Hanselmann
    self.assertTrue("test" in os.listdir(self.tmpdir))
385 a9d68e40 Michael Hanselmann
    self.assertEqual(len(os.listdir(self.tmpdir)), 2)
386 a9d68e40 Michael Hanselmann
387 a9d68e40 Michael Hanselmann
    # Write again as dry-run
388 a9d68e40 Michael Hanselmann
    assert os.path.isfile(testfile)
389 a9d68e40 Michael Hanselmann
    self.assertEqual(utils.WriteFile(testfile, data="000", backup=True,
390 a9d68e40 Michael Hanselmann
                                     dry_run=True),
391 a9d68e40 Michael Hanselmann
                     None)
392 a9d68e40 Michael Hanselmann
    self.assertEqual(utils.ReadFile(testfile), "bar")
393 a9d68e40 Michael Hanselmann
    self.assertEqual(len(glob.glob("%s.backup*" % testfile)), 1)
394 a9d68e40 Michael Hanselmann
    self.assertTrue("test" in os.listdir(self.tmpdir))
395 a9d68e40 Michael Hanselmann
    self.assertEqual(len(os.listdir(self.tmpdir)), 2)
396 a9d68e40 Michael Hanselmann
397 3865ca48 Michael Hanselmann
398 3865ca48 Michael Hanselmann
class TestFileID(testutils.GanetiTestCase):
399 3865ca48 Michael Hanselmann
  def testEquality(self):
400 3865ca48 Michael Hanselmann
    name = self._CreateTempFile()
401 3865ca48 Michael Hanselmann
    oldi = utils.GetFileID(path=name)
402 3865ca48 Michael Hanselmann
    self.failUnless(utils.VerifyFileID(oldi, oldi))
403 3865ca48 Michael Hanselmann
404 3865ca48 Michael Hanselmann
  def testUpdate(self):
405 3865ca48 Michael Hanselmann
    name = self._CreateTempFile()
406 3865ca48 Michael Hanselmann
    oldi = utils.GetFileID(path=name)
407 3865ca48 Michael Hanselmann
    fd = os.open(name, os.O_RDWR)
408 3865ca48 Michael Hanselmann
    try:
409 3865ca48 Michael Hanselmann
      newi = utils.GetFileID(fd=fd)
410 3865ca48 Michael Hanselmann
      self.failUnless(utils.VerifyFileID(oldi, newi))
411 3865ca48 Michael Hanselmann
      self.failUnless(utils.VerifyFileID(newi, oldi))
412 3865ca48 Michael Hanselmann
    finally:
413 3865ca48 Michael Hanselmann
      os.close(fd)
414 3865ca48 Michael Hanselmann
415 3865ca48 Michael Hanselmann
  def testWriteFile(self):
416 3865ca48 Michael Hanselmann
    name = self._CreateTempFile()
417 3865ca48 Michael Hanselmann
    oldi = utils.GetFileID(path=name)
418 3865ca48 Michael Hanselmann
    mtime = oldi[2]
419 3865ca48 Michael Hanselmann
    os.utime(name, (mtime + 10, mtime + 10))
420 3865ca48 Michael Hanselmann
    self.assertRaises(errors.LockError, utils.SafeWriteFile, name,
421 3865ca48 Michael Hanselmann
                      oldi, data="")
422 3865ca48 Michael Hanselmann
    os.utime(name, (mtime - 10, mtime - 10))
423 3865ca48 Michael Hanselmann
    utils.SafeWriteFile(name, oldi, data="")
424 3865ca48 Michael Hanselmann
    oldi = utils.GetFileID(path=name)
425 3865ca48 Michael Hanselmann
    mtime = oldi[2]
426 3865ca48 Michael Hanselmann
    os.utime(name, (mtime + 10, mtime + 10))
427 3865ca48 Michael Hanselmann
    # this doesn't raise, since we passed None
428 3865ca48 Michael Hanselmann
    utils.SafeWriteFile(name, None, data="")
429 3865ca48 Michael Hanselmann
430 3865ca48 Michael Hanselmann
  def testError(self):
431 3865ca48 Michael Hanselmann
    t = tempfile.NamedTemporaryFile()
432 3865ca48 Michael Hanselmann
    self.assertRaises(errors.ProgrammerError, utils.GetFileID,
433 3865ca48 Michael Hanselmann
                      path=t.name, fd=t.fileno())
434 3865ca48 Michael Hanselmann
435 3865ca48 Michael Hanselmann
436 3865ca48 Michael Hanselmann
class TestRemoveFile(unittest.TestCase):
437 3865ca48 Michael Hanselmann
  """Test case for the RemoveFile function"""
438 3865ca48 Michael Hanselmann
439 3865ca48 Michael Hanselmann
  def setUp(self):
440 3865ca48 Michael Hanselmann
    """Create a temp dir and file for each case"""
441 3865ca48 Michael Hanselmann
    self.tmpdir = tempfile.mkdtemp('', 'ganeti-unittest-')
442 3865ca48 Michael Hanselmann
    fd, self.tmpfile = tempfile.mkstemp('', '', self.tmpdir)
443 3865ca48 Michael Hanselmann
    os.close(fd)
444 3865ca48 Michael Hanselmann
445 3865ca48 Michael Hanselmann
  def tearDown(self):
446 3865ca48 Michael Hanselmann
    if os.path.exists(self.tmpfile):
447 3865ca48 Michael Hanselmann
      os.unlink(self.tmpfile)
448 3865ca48 Michael Hanselmann
    os.rmdir(self.tmpdir)
449 3865ca48 Michael Hanselmann
450 3865ca48 Michael Hanselmann
  def testIgnoreDirs(self):
451 3865ca48 Michael Hanselmann
    """Test that RemoveFile() ignores directories"""
452 3865ca48 Michael Hanselmann
    self.assertEqual(None, utils.RemoveFile(self.tmpdir))
453 3865ca48 Michael Hanselmann
454 3865ca48 Michael Hanselmann
  def testIgnoreNotExisting(self):
455 3865ca48 Michael Hanselmann
    """Test that RemoveFile() ignores non-existing files"""
456 3865ca48 Michael Hanselmann
    utils.RemoveFile(self.tmpfile)
457 3865ca48 Michael Hanselmann
    utils.RemoveFile(self.tmpfile)
458 3865ca48 Michael Hanselmann
459 3865ca48 Michael Hanselmann
  def testRemoveFile(self):
460 3865ca48 Michael Hanselmann
    """Test that RemoveFile does remove a file"""
461 3865ca48 Michael Hanselmann
    utils.RemoveFile(self.tmpfile)
462 3865ca48 Michael Hanselmann
    if os.path.exists(self.tmpfile):
463 3865ca48 Michael Hanselmann
      self.fail("File '%s' not removed" % self.tmpfile)
464 3865ca48 Michael Hanselmann
465 3865ca48 Michael Hanselmann
  def testRemoveSymlink(self):
466 3865ca48 Michael Hanselmann
    """Test that RemoveFile does remove symlinks"""
467 3865ca48 Michael Hanselmann
    symlink = self.tmpdir + "/symlink"
468 3865ca48 Michael Hanselmann
    os.symlink("no-such-file", symlink)
469 3865ca48 Michael Hanselmann
    utils.RemoveFile(symlink)
470 3865ca48 Michael Hanselmann
    if os.path.exists(symlink):
471 3865ca48 Michael Hanselmann
      self.fail("File '%s' not removed" % symlink)
472 3865ca48 Michael Hanselmann
    os.symlink(self.tmpfile, symlink)
473 3865ca48 Michael Hanselmann
    utils.RemoveFile(symlink)
474 3865ca48 Michael Hanselmann
    if os.path.exists(symlink):
475 3865ca48 Michael Hanselmann
      self.fail("File '%s' not removed" % symlink)
476 3865ca48 Michael Hanselmann
477 3865ca48 Michael Hanselmann
478 3865ca48 Michael Hanselmann
class TestRemoveDir(unittest.TestCase):
479 3865ca48 Michael Hanselmann
  def setUp(self):
480 3865ca48 Michael Hanselmann
    self.tmpdir = tempfile.mkdtemp()
481 3865ca48 Michael Hanselmann
482 3865ca48 Michael Hanselmann
  def tearDown(self):
483 3865ca48 Michael Hanselmann
    try:
484 3865ca48 Michael Hanselmann
      shutil.rmtree(self.tmpdir)
485 3865ca48 Michael Hanselmann
    except EnvironmentError:
486 3865ca48 Michael Hanselmann
      pass
487 3865ca48 Michael Hanselmann
488 3865ca48 Michael Hanselmann
  def testEmptyDir(self):
489 3865ca48 Michael Hanselmann
    utils.RemoveDir(self.tmpdir)
490 3865ca48 Michael Hanselmann
    self.assertFalse(os.path.isdir(self.tmpdir))
491 3865ca48 Michael Hanselmann
492 3865ca48 Michael Hanselmann
  def testNonEmptyDir(self):
493 3865ca48 Michael Hanselmann
    self.tmpfile = os.path.join(self.tmpdir, "test1")
494 3865ca48 Michael Hanselmann
    open(self.tmpfile, "w").close()
495 3865ca48 Michael Hanselmann
    self.assertRaises(EnvironmentError, utils.RemoveDir, self.tmpdir)
496 3865ca48 Michael Hanselmann
497 3865ca48 Michael Hanselmann
498 3865ca48 Michael Hanselmann
class TestRename(unittest.TestCase):
499 3865ca48 Michael Hanselmann
  """Test case for RenameFile"""
500 3865ca48 Michael Hanselmann
501 3865ca48 Michael Hanselmann
  def setUp(self):
502 3865ca48 Michael Hanselmann
    """Create a temporary directory"""
503 3865ca48 Michael Hanselmann
    self.tmpdir = tempfile.mkdtemp()
504 3865ca48 Michael Hanselmann
    self.tmpfile = os.path.join(self.tmpdir, "test1")
505 3865ca48 Michael Hanselmann
506 3865ca48 Michael Hanselmann
    # Touch the file
507 3865ca48 Michael Hanselmann
    open(self.tmpfile, "w").close()
508 3865ca48 Michael Hanselmann
509 3865ca48 Michael Hanselmann
  def tearDown(self):
510 3865ca48 Michael Hanselmann
    """Remove temporary directory"""
511 3865ca48 Michael Hanselmann
    shutil.rmtree(self.tmpdir)
512 3865ca48 Michael Hanselmann
513 3865ca48 Michael Hanselmann
  def testSimpleRename1(self):
514 3865ca48 Michael Hanselmann
    """Simple rename 1"""
515 3865ca48 Michael Hanselmann
    utils.RenameFile(self.tmpfile, os.path.join(self.tmpdir, "xyz"))
516 3865ca48 Michael Hanselmann
    self.assert_(os.path.isfile(os.path.join(self.tmpdir, "xyz")))
517 3865ca48 Michael Hanselmann
518 3865ca48 Michael Hanselmann
  def testSimpleRename2(self):
519 3865ca48 Michael Hanselmann
    """Simple rename 2"""
520 3865ca48 Michael Hanselmann
    utils.RenameFile(self.tmpfile, os.path.join(self.tmpdir, "xyz"),
521 3865ca48 Michael Hanselmann
                     mkdir=True)
522 3865ca48 Michael Hanselmann
    self.assert_(os.path.isfile(os.path.join(self.tmpdir, "xyz")))
523 3865ca48 Michael Hanselmann
524 3865ca48 Michael Hanselmann
  def testRenameMkdir(self):
525 3865ca48 Michael Hanselmann
    """Rename with mkdir"""
526 3865ca48 Michael Hanselmann
    utils.RenameFile(self.tmpfile, os.path.join(self.tmpdir, "test/xyz"),
527 3865ca48 Michael Hanselmann
                     mkdir=True)
528 3865ca48 Michael Hanselmann
    self.assert_(os.path.isdir(os.path.join(self.tmpdir, "test")))
529 3865ca48 Michael Hanselmann
    self.assert_(os.path.isfile(os.path.join(self.tmpdir, "test/xyz")))
530 3865ca48 Michael Hanselmann
531 9c2b3a70 René Nussbaumer
    self.assertRaises(EnvironmentError, utils.RenameFile,
532 9c2b3a70 René Nussbaumer
                      os.path.join(self.tmpdir, "test/xyz"),
533 9c2b3a70 René Nussbaumer
                      os.path.join(self.tmpdir, "test/foo/bar/baz"),
534 9c2b3a70 René Nussbaumer
                      mkdir=True)
535 9c2b3a70 René Nussbaumer
536 9c2b3a70 René Nussbaumer
    self.assertTrue(os.path.exists(os.path.join(self.tmpdir, "test/xyz")))
537 9c2b3a70 René Nussbaumer
    self.assertFalse(os.path.exists(os.path.join(self.tmpdir, "test/foo/bar")))
538 b355affb René Nussbaumer
    self.assertFalse(os.path.exists(os.path.join(self.tmpdir,
539 b355affb René Nussbaumer
                                                 "test/foo/bar/baz")))
540 3865ca48 Michael Hanselmann
541 3865ca48 Michael Hanselmann
542 3865ca48 Michael Hanselmann
class TestMakedirs(unittest.TestCase):
543 3865ca48 Michael Hanselmann
  def setUp(self):
544 3865ca48 Michael Hanselmann
    self.tmpdir = tempfile.mkdtemp()
545 3865ca48 Michael Hanselmann
546 3865ca48 Michael Hanselmann
  def tearDown(self):
547 3865ca48 Michael Hanselmann
    shutil.rmtree(self.tmpdir)
548 3865ca48 Michael Hanselmann
549 3865ca48 Michael Hanselmann
  def testNonExisting(self):
550 3865ca48 Michael Hanselmann
    path = utils.PathJoin(self.tmpdir, "foo")
551 3865ca48 Michael Hanselmann
    utils.Makedirs(path)
552 3865ca48 Michael Hanselmann
    self.assert_(os.path.isdir(path))
553 3865ca48 Michael Hanselmann
554 3865ca48 Michael Hanselmann
  def testExisting(self):
555 3865ca48 Michael Hanselmann
    path = utils.PathJoin(self.tmpdir, "foo")
556 3865ca48 Michael Hanselmann
    os.mkdir(path)
557 3865ca48 Michael Hanselmann
    utils.Makedirs(path)
558 3865ca48 Michael Hanselmann
    self.assert_(os.path.isdir(path))
559 3865ca48 Michael Hanselmann
560 3865ca48 Michael Hanselmann
  def testRecursiveNonExisting(self):
561 3865ca48 Michael Hanselmann
    path = utils.PathJoin(self.tmpdir, "foo/bar/baz")
562 3865ca48 Michael Hanselmann
    utils.Makedirs(path)
563 3865ca48 Michael Hanselmann
    self.assert_(os.path.isdir(path))
564 3865ca48 Michael Hanselmann
565 3865ca48 Michael Hanselmann
  def testRecursiveExisting(self):
566 3865ca48 Michael Hanselmann
    path = utils.PathJoin(self.tmpdir, "B/moo/xyz")
567 3865ca48 Michael Hanselmann
    self.assertFalse(os.path.exists(path))
568 3865ca48 Michael Hanselmann
    os.mkdir(utils.PathJoin(self.tmpdir, "B"))
569 3865ca48 Michael Hanselmann
    utils.Makedirs(path)
570 3865ca48 Michael Hanselmann
    self.assert_(os.path.isdir(path))
571 3865ca48 Michael Hanselmann
572 3865ca48 Michael Hanselmann
573 3865ca48 Michael Hanselmann
class TestEnsureDirs(unittest.TestCase):
574 3865ca48 Michael Hanselmann
  """Tests for EnsureDirs"""
575 3865ca48 Michael Hanselmann
576 3865ca48 Michael Hanselmann
  def setUp(self):
577 3865ca48 Michael Hanselmann
    self.dir = tempfile.mkdtemp()
578 3865ca48 Michael Hanselmann
    self.old_umask = os.umask(0777)
579 3865ca48 Michael Hanselmann
580 3865ca48 Michael Hanselmann
  def testEnsureDirs(self):
581 3865ca48 Michael Hanselmann
    utils.EnsureDirs([
582 3865ca48 Michael Hanselmann
        (utils.PathJoin(self.dir, "foo"), 0777),
583 3865ca48 Michael Hanselmann
        (utils.PathJoin(self.dir, "bar"), 0000),
584 3865ca48 Michael Hanselmann
        ])
585 3865ca48 Michael Hanselmann
    self.assertEquals(os.stat(utils.PathJoin(self.dir, "foo"))[0] & 0777, 0777)
586 3865ca48 Michael Hanselmann
    self.assertEquals(os.stat(utils.PathJoin(self.dir, "bar"))[0] & 0777, 0000)
587 3865ca48 Michael Hanselmann
588 3865ca48 Michael Hanselmann
  def tearDown(self):
589 3865ca48 Michael Hanselmann
    os.rmdir(utils.PathJoin(self.dir, "foo"))
590 3865ca48 Michael Hanselmann
    os.rmdir(utils.PathJoin(self.dir, "bar"))
591 3865ca48 Michael Hanselmann
    os.rmdir(self.dir)
592 3865ca48 Michael Hanselmann
    os.umask(self.old_umask)
593 3865ca48 Michael Hanselmann
594 3865ca48 Michael Hanselmann
595 3865ca48 Michael Hanselmann
class TestIsNormAbsPath(unittest.TestCase):
596 3865ca48 Michael Hanselmann
  """Testing case for IsNormAbsPath"""
597 3865ca48 Michael Hanselmann
598 3865ca48 Michael Hanselmann
  def _pathTestHelper(self, path, result):
599 3865ca48 Michael Hanselmann
    if result:
600 3865ca48 Michael Hanselmann
      self.assert_(utils.IsNormAbsPath(path),
601 3865ca48 Michael Hanselmann
          "Path %s should result absolute and normalized" % path)
602 3865ca48 Michael Hanselmann
    else:
603 3865ca48 Michael Hanselmann
      self.assertFalse(utils.IsNormAbsPath(path),
604 3865ca48 Michael Hanselmann
          "Path %s should not result absolute and normalized" % path)
605 3865ca48 Michael Hanselmann
606 3865ca48 Michael Hanselmann
  def testBase(self):
607 3865ca48 Michael Hanselmann
    self._pathTestHelper("/etc", True)
608 3865ca48 Michael Hanselmann
    self._pathTestHelper("/srv", True)
609 3865ca48 Michael Hanselmann
    self._pathTestHelper("etc", False)
610 3865ca48 Michael Hanselmann
    self._pathTestHelper("/etc/../root", False)
611 3865ca48 Michael Hanselmann
    self._pathTestHelper("/etc/", False)
612 3865ca48 Michael Hanselmann
613 3865ca48 Michael Hanselmann
614 fb17bebd René Nussbaumer
class TestIsBelowDir(unittest.TestCase):
615 fb17bebd René Nussbaumer
  """Testing case for IsBelowDir"""
616 fb17bebd René Nussbaumer
617 fb17bebd René Nussbaumer
  def testSamePrefix(self):
618 fb17bebd René Nussbaumer
    self.assertTrue(utils.IsBelowDir("/a/b", "/a/b/c"))
619 fb17bebd René Nussbaumer
    self.assertTrue(utils.IsBelowDir("/a/b/", "/a/b/e"))
620 fb17bebd René Nussbaumer
621 fb17bebd René Nussbaumer
  def testSamePrefixButDifferentDir(self):
622 fb17bebd René Nussbaumer
    self.assertFalse(utils.IsBelowDir("/a/b", "/a/bc/d"))
623 fb17bebd René Nussbaumer
    self.assertFalse(utils.IsBelowDir("/a/b/", "/a/bc/e"))
624 fb17bebd René Nussbaumer
625 fb17bebd René Nussbaumer
  def testSamePrefixButDirTraversal(self):
626 fb17bebd René Nussbaumer
    self.assertFalse(utils.IsBelowDir("/a/b", "/a/b/../c"))
627 fb17bebd René Nussbaumer
    self.assertFalse(utils.IsBelowDir("/a/b/", "/a/b/../d"))
628 fb17bebd René Nussbaumer
629 fb17bebd René Nussbaumer
  def testSamePrefixAndTraversal(self):
630 fb17bebd René Nussbaumer
    self.assertTrue(utils.IsBelowDir("/a/b", "/a/b/c/../d"))
631 fb17bebd René Nussbaumer
    self.assertTrue(utils.IsBelowDir("/a/b", "/a/b/c/./e"))
632 fb17bebd René Nussbaumer
    self.assertTrue(utils.IsBelowDir("/a/b", "/a/b/../b/./e"))
633 fb17bebd René Nussbaumer
634 fb17bebd René Nussbaumer
  def testBothAbsPath(self):
635 fb17bebd René Nussbaumer
    self.assertRaises(ValueError, utils.IsBelowDir, "/a/b/c", "d")
636 fb17bebd René Nussbaumer
    self.assertRaises(ValueError, utils.IsBelowDir, "a/b/c", "/d")
637 fb17bebd René Nussbaumer
    self.assertRaises(ValueError, utils.IsBelowDir, "a/b/c", "d")
638 fb17bebd René Nussbaumer
639 fb17bebd René Nussbaumer
640 3865ca48 Michael Hanselmann
class TestPathJoin(unittest.TestCase):
641 3865ca48 Michael Hanselmann
  """Testing case for PathJoin"""
642 3865ca48 Michael Hanselmann
643 3865ca48 Michael Hanselmann
  def testBasicItems(self):
644 3865ca48 Michael Hanselmann
    mlist = ["/a", "b", "c"]
645 3865ca48 Michael Hanselmann
    self.failUnlessEqual(utils.PathJoin(*mlist), "/".join(mlist))
646 3865ca48 Michael Hanselmann
647 3865ca48 Michael Hanselmann
  def testNonAbsPrefix(self):
648 3865ca48 Michael Hanselmann
    self.failUnlessRaises(ValueError, utils.PathJoin, "a", "b")
649 3865ca48 Michael Hanselmann
650 3865ca48 Michael Hanselmann
  def testBackTrack(self):
651 3865ca48 Michael Hanselmann
    self.failUnlessRaises(ValueError, utils.PathJoin, "/a", "b/../c")
652 3865ca48 Michael Hanselmann
653 3865ca48 Michael Hanselmann
  def testMultiAbs(self):
654 3865ca48 Michael Hanselmann
    self.failUnlessRaises(ValueError, utils.PathJoin, "/a", "/b")
655 3865ca48 Michael Hanselmann
656 3865ca48 Michael Hanselmann
657 3865ca48 Michael Hanselmann
class TestTailFile(testutils.GanetiTestCase):
658 3865ca48 Michael Hanselmann
  """Test case for the TailFile function"""
659 3865ca48 Michael Hanselmann
660 3865ca48 Michael Hanselmann
  def testEmpty(self):
661 3865ca48 Michael Hanselmann
    fname = self._CreateTempFile()
662 3865ca48 Michael Hanselmann
    self.failUnlessEqual(utils.TailFile(fname), [])
663 3865ca48 Michael Hanselmann
    self.failUnlessEqual(utils.TailFile(fname, lines=25), [])
664 3865ca48 Michael Hanselmann
665 3865ca48 Michael Hanselmann
  def testAllLines(self):
666 3865ca48 Michael Hanselmann
    data = ["test %d" % i for i in range(30)]
667 3865ca48 Michael Hanselmann
    for i in range(30):
668 3865ca48 Michael Hanselmann
      fname = self._CreateTempFile()
669 3865ca48 Michael Hanselmann
      fd = open(fname, "w")
670 3865ca48 Michael Hanselmann
      fd.write("\n".join(data[:i]))
671 3865ca48 Michael Hanselmann
      if i > 0:
672 3865ca48 Michael Hanselmann
        fd.write("\n")
673 3865ca48 Michael Hanselmann
      fd.close()
674 3865ca48 Michael Hanselmann
      self.failUnlessEqual(utils.TailFile(fname, lines=i), data[:i])
675 3865ca48 Michael Hanselmann
676 3865ca48 Michael Hanselmann
  def testPartialLines(self):
677 3865ca48 Michael Hanselmann
    data = ["test %d" % i for i in range(30)]
678 3865ca48 Michael Hanselmann
    fname = self._CreateTempFile()
679 3865ca48 Michael Hanselmann
    fd = open(fname, "w")
680 3865ca48 Michael Hanselmann
    fd.write("\n".join(data))
681 3865ca48 Michael Hanselmann
    fd.write("\n")
682 3865ca48 Michael Hanselmann
    fd.close()
683 3865ca48 Michael Hanselmann
    for i in range(1, 30):
684 3865ca48 Michael Hanselmann
      self.failUnlessEqual(utils.TailFile(fname, lines=i), data[-i:])
685 3865ca48 Michael Hanselmann
686 3865ca48 Michael Hanselmann
  def testBigFile(self):
687 3865ca48 Michael Hanselmann
    data = ["test %d" % i for i in range(30)]
688 3865ca48 Michael Hanselmann
    fname = self._CreateTempFile()
689 3865ca48 Michael Hanselmann
    fd = open(fname, "w")
690 3865ca48 Michael Hanselmann
    fd.write("X" * 1048576)
691 3865ca48 Michael Hanselmann
    fd.write("\n")
692 3865ca48 Michael Hanselmann
    fd.write("\n".join(data))
693 3865ca48 Michael Hanselmann
    fd.write("\n")
694 3865ca48 Michael Hanselmann
    fd.close()
695 3865ca48 Michael Hanselmann
    for i in range(1, 30):
696 3865ca48 Michael Hanselmann
      self.failUnlessEqual(utils.TailFile(fname, lines=i), data[-i:])
697 3865ca48 Michael Hanselmann
698 3865ca48 Michael Hanselmann
699 3865ca48 Michael Hanselmann
class TestPidFileFunctions(unittest.TestCase):
700 79b60c1c Michael Hanselmann
  """Tests for WritePidFile and ReadPidFile"""
701 3865ca48 Michael Hanselmann
702 3865ca48 Michael Hanselmann
  def setUp(self):
703 3865ca48 Michael Hanselmann
    self.dir = tempfile.mkdtemp()
704 3865ca48 Michael Hanselmann
    self.f_dpn = lambda name: os.path.join(self.dir, "%s.pid" % name)
705 3865ca48 Michael Hanselmann
706 3865ca48 Michael Hanselmann
  def testPidFileFunctions(self):
707 3865ca48 Michael Hanselmann
    pid_file = self.f_dpn('test')
708 3865ca48 Michael Hanselmann
    fd = utils.WritePidFile(self.f_dpn('test'))
709 3865ca48 Michael Hanselmann
    self.failUnless(os.path.exists(pid_file),
710 3865ca48 Michael Hanselmann
                    "PID file should have been created")
711 3865ca48 Michael Hanselmann
    read_pid = utils.ReadPidFile(pid_file)
712 3865ca48 Michael Hanselmann
    self.failUnlessEqual(read_pid, os.getpid())
713 3865ca48 Michael Hanselmann
    self.failUnless(utils.IsProcessAlive(read_pid))
714 3865ca48 Michael Hanselmann
    self.failUnlessRaises(errors.LockError, utils.WritePidFile,
715 3865ca48 Michael Hanselmann
                          self.f_dpn('test'))
716 3865ca48 Michael Hanselmann
    os.close(fd)
717 79b60c1c Michael Hanselmann
    utils.RemoveFile(self.f_dpn("test"))
718 3865ca48 Michael Hanselmann
    self.failIf(os.path.exists(pid_file),
719 3865ca48 Michael Hanselmann
                "PID file should not exist anymore")
720 3865ca48 Michael Hanselmann
    self.failUnlessEqual(utils.ReadPidFile(pid_file), 0,
721 3865ca48 Michael Hanselmann
                         "ReadPidFile should return 0 for missing pid file")
722 3865ca48 Michael Hanselmann
    fh = open(pid_file, "w")
723 3865ca48 Michael Hanselmann
    fh.write("blah\n")
724 3865ca48 Michael Hanselmann
    fh.close()
725 3865ca48 Michael Hanselmann
    self.failUnlessEqual(utils.ReadPidFile(pid_file), 0,
726 3865ca48 Michael Hanselmann
                         "ReadPidFile should return 0 for invalid pid file")
727 3865ca48 Michael Hanselmann
    # but now, even with the file existing, we should be able to lock it
728 3865ca48 Michael Hanselmann
    fd = utils.WritePidFile(self.f_dpn('test'))
729 3865ca48 Michael Hanselmann
    os.close(fd)
730 79b60c1c Michael Hanselmann
    utils.RemoveFile(self.f_dpn("test"))
731 3865ca48 Michael Hanselmann
    self.failIf(os.path.exists(pid_file),
732 3865ca48 Michael Hanselmann
                "PID file should not exist anymore")
733 3865ca48 Michael Hanselmann
734 3865ca48 Michael Hanselmann
  def testKill(self):
735 3865ca48 Michael Hanselmann
    pid_file = self.f_dpn('child')
736 3865ca48 Michael Hanselmann
    r_fd, w_fd = os.pipe()
737 3865ca48 Michael Hanselmann
    new_pid = os.fork()
738 3865ca48 Michael Hanselmann
    if new_pid == 0: #child
739 3865ca48 Michael Hanselmann
      utils.WritePidFile(self.f_dpn('child'))
740 3865ca48 Michael Hanselmann
      os.write(w_fd, 'a')
741 3865ca48 Michael Hanselmann
      signal.pause()
742 3865ca48 Michael Hanselmann
      os._exit(0)
743 3865ca48 Michael Hanselmann
      return
744 3865ca48 Michael Hanselmann
    # else we are in the parent
745 3865ca48 Michael Hanselmann
    # wait until the child has written the pid file
746 3865ca48 Michael Hanselmann
    os.read(r_fd, 1)
747 3865ca48 Michael Hanselmann
    read_pid = utils.ReadPidFile(pid_file)
748 3865ca48 Michael Hanselmann
    self.failUnlessEqual(read_pid, new_pid)
749 3865ca48 Michael Hanselmann
    self.failUnless(utils.IsProcessAlive(new_pid))
750 3865ca48 Michael Hanselmann
    utils.KillProcess(new_pid, waitpid=True)
751 3865ca48 Michael Hanselmann
    self.failIf(utils.IsProcessAlive(new_pid))
752 79b60c1c Michael Hanselmann
    utils.RemoveFile(self.f_dpn('child'))
753 3865ca48 Michael Hanselmann
    self.failUnlessRaises(errors.ProgrammerError, utils.KillProcess, 0)
754 3865ca48 Michael Hanselmann
755 3865ca48 Michael Hanselmann
  def tearDown(self):
756 3865ca48 Michael Hanselmann
    shutil.rmtree(self.dir)
757 3865ca48 Michael Hanselmann
758 3865ca48 Michael Hanselmann
759 3865ca48 Michael Hanselmann
class TestSshKeys(testutils.GanetiTestCase):
760 3865ca48 Michael Hanselmann
  """Test case for the AddAuthorizedKey function"""
761 3865ca48 Michael Hanselmann
762 3865ca48 Michael Hanselmann
  KEY_A = 'ssh-dss AAAAB3NzaC1w5256closdj32mZaQU root@key-a'
763 3865ca48 Michael Hanselmann
  KEY_B = ('command="/usr/bin/fooserver -t --verbose",from="198.51.100.4" '
764 3865ca48 Michael Hanselmann
           'ssh-dss AAAAB3NzaC1w520smc01ms0jfJs22 root@key-b')
765 3865ca48 Michael Hanselmann
766 3865ca48 Michael Hanselmann
  def setUp(self):
767 3865ca48 Michael Hanselmann
    testutils.GanetiTestCase.setUp(self)
768 3865ca48 Michael Hanselmann
    self.tmpname = self._CreateTempFile()
769 3865ca48 Michael Hanselmann
    handle = open(self.tmpname, 'w')
770 3865ca48 Michael Hanselmann
    try:
771 3865ca48 Michael Hanselmann
      handle.write("%s\n" % TestSshKeys.KEY_A)
772 3865ca48 Michael Hanselmann
      handle.write("%s\n" % TestSshKeys.KEY_B)
773 3865ca48 Michael Hanselmann
    finally:
774 3865ca48 Michael Hanselmann
      handle.close()
775 3865ca48 Michael Hanselmann
776 3865ca48 Michael Hanselmann
  def testAddingNewKey(self):
777 3865ca48 Michael Hanselmann
    utils.AddAuthorizedKey(self.tmpname,
778 3865ca48 Michael Hanselmann
                           'ssh-dss AAAAB3NzaC1kc3MAAACB root@test')
779 3865ca48 Michael Hanselmann
780 3865ca48 Michael Hanselmann
    self.assertFileContent(self.tmpname,
781 3865ca48 Michael Hanselmann
      "ssh-dss AAAAB3NzaC1w5256closdj32mZaQU root@key-a\n"
782 3865ca48 Michael Hanselmann
      'command="/usr/bin/fooserver -t --verbose",from="198.51.100.4"'
783 3865ca48 Michael Hanselmann
      " ssh-dss AAAAB3NzaC1w520smc01ms0jfJs22 root@key-b\n"
784 3865ca48 Michael Hanselmann
      "ssh-dss AAAAB3NzaC1kc3MAAACB root@test\n")
785 3865ca48 Michael Hanselmann
786 3865ca48 Michael Hanselmann
  def testAddingAlmostButNotCompletelyTheSameKey(self):
787 3865ca48 Michael Hanselmann
    utils.AddAuthorizedKey(self.tmpname,
788 3865ca48 Michael Hanselmann
        'ssh-dss AAAAB3NzaC1w5256closdj32mZaQU root@test')
789 3865ca48 Michael Hanselmann
790 3865ca48 Michael Hanselmann
    self.assertFileContent(self.tmpname,
791 3865ca48 Michael Hanselmann
      "ssh-dss AAAAB3NzaC1w5256closdj32mZaQU root@key-a\n"
792 3865ca48 Michael Hanselmann
      'command="/usr/bin/fooserver -t --verbose",from="198.51.100.4"'
793 3865ca48 Michael Hanselmann
      " ssh-dss AAAAB3NzaC1w520smc01ms0jfJs22 root@key-b\n"
794 3865ca48 Michael Hanselmann
      "ssh-dss AAAAB3NzaC1w5256closdj32mZaQU root@test\n")
795 3865ca48 Michael Hanselmann
796 3865ca48 Michael Hanselmann
  def testAddingExistingKeyWithSomeMoreSpaces(self):
797 3865ca48 Michael Hanselmann
    utils.AddAuthorizedKey(self.tmpname,
798 3865ca48 Michael Hanselmann
        'ssh-dss  AAAAB3NzaC1w5256closdj32mZaQU   root@key-a')
799 3865ca48 Michael Hanselmann
800 3865ca48 Michael Hanselmann
    self.assertFileContent(self.tmpname,
801 3865ca48 Michael Hanselmann
      "ssh-dss AAAAB3NzaC1w5256closdj32mZaQU root@key-a\n"
802 3865ca48 Michael Hanselmann
      'command="/usr/bin/fooserver -t --verbose",from="198.51.100.4"'
803 3865ca48 Michael Hanselmann
      " ssh-dss AAAAB3NzaC1w520smc01ms0jfJs22 root@key-b\n")
804 3865ca48 Michael Hanselmann
805 3865ca48 Michael Hanselmann
  def testRemovingExistingKeyWithSomeMoreSpaces(self):
806 3865ca48 Michael Hanselmann
    utils.RemoveAuthorizedKey(self.tmpname,
807 3865ca48 Michael Hanselmann
        'ssh-dss  AAAAB3NzaC1w5256closdj32mZaQU   root@key-a')
808 3865ca48 Michael Hanselmann
809 3865ca48 Michael Hanselmann
    self.assertFileContent(self.tmpname,
810 3865ca48 Michael Hanselmann
      'command="/usr/bin/fooserver -t --verbose",from="198.51.100.4"'
811 3865ca48 Michael Hanselmann
      " ssh-dss AAAAB3NzaC1w520smc01ms0jfJs22 root@key-b\n")
812 3865ca48 Michael Hanselmann
813 3865ca48 Michael Hanselmann
  def testRemovingNonExistingKey(self):
814 3865ca48 Michael Hanselmann
    utils.RemoveAuthorizedKey(self.tmpname,
815 3865ca48 Michael Hanselmann
        'ssh-dss  AAAAB3Nsdfj230xxjxJjsjwjsjdjU   root@test')
816 3865ca48 Michael Hanselmann
817 3865ca48 Michael Hanselmann
    self.assertFileContent(self.tmpname,
818 3865ca48 Michael Hanselmann
      "ssh-dss AAAAB3NzaC1w5256closdj32mZaQU root@key-a\n"
819 3865ca48 Michael Hanselmann
      'command="/usr/bin/fooserver -t --verbose",from="198.51.100.4"'
820 3865ca48 Michael Hanselmann
      " ssh-dss AAAAB3NzaC1w520smc01ms0jfJs22 root@key-b\n")
821 3865ca48 Michael Hanselmann
822 3865ca48 Michael Hanselmann
823 90e234a6 Michael Hanselmann
class TestNewUUID(unittest.TestCase):
824 90e234a6 Michael Hanselmann
  """Test case for NewUUID"""
825 90e234a6 Michael Hanselmann
826 90e234a6 Michael Hanselmann
  def runTest(self):
827 90e234a6 Michael Hanselmann
    self.failUnless(utils.UUID_RE.match(utils.NewUUID()))
828 90e234a6 Michael Hanselmann
829 90e234a6 Michael Hanselmann
830 b81b3c96 René Nussbaumer
def _MockStatResult(cb, mode, uid, gid):
831 b81b3c96 René Nussbaumer
  def _fn(path):
832 b81b3c96 René Nussbaumer
    if cb:
833 b81b3c96 René Nussbaumer
      cb()
834 b81b3c96 René Nussbaumer
    return {
835 b81b3c96 René Nussbaumer
      stat.ST_MODE: mode,
836 b81b3c96 René Nussbaumer
      stat.ST_UID: uid,
837 b81b3c96 René Nussbaumer
      stat.ST_GID: gid,
838 b81b3c96 René Nussbaumer
      }
839 b81b3c96 René Nussbaumer
  return _fn
840 b81b3c96 René Nussbaumer
841 b81b3c96 René Nussbaumer
842 b81b3c96 René Nussbaumer
def _RaiseNoEntError():
843 b81b3c96 René Nussbaumer
  raise EnvironmentError(errno.ENOENT, "not found")
844 b81b3c96 René Nussbaumer
845 b81b3c96 René Nussbaumer
846 b81b3c96 René Nussbaumer
def _OtherStatRaise():
847 b81b3c96 René Nussbaumer
  raise EnvironmentError()
848 b81b3c96 René Nussbaumer
849 b81b3c96 René Nussbaumer
850 b81b3c96 René Nussbaumer
class TestPermissionEnforcements(unittest.TestCase):
851 b81b3c96 René Nussbaumer
  UID_A = 16024
852 b81b3c96 René Nussbaumer
  UID_B = 25850
853 b81b3c96 René Nussbaumer
  GID_A = 14028
854 b81b3c96 René Nussbaumer
  GID_B = 29801
855 b81b3c96 René Nussbaumer
856 b81b3c96 René Nussbaumer
  def setUp(self):
857 b81b3c96 René Nussbaumer
    self._chown_calls = []
858 b81b3c96 René Nussbaumer
    self._chmod_calls = []
859 b81b3c96 René Nussbaumer
    self._mkdir_calls = []
860 b81b3c96 René Nussbaumer
861 b81b3c96 René Nussbaumer
  def tearDown(self):
862 b81b3c96 René Nussbaumer
    self.assertRaises(IndexError, self._mkdir_calls.pop)
863 b81b3c96 René Nussbaumer
    self.assertRaises(IndexError, self._chmod_calls.pop)
864 b81b3c96 René Nussbaumer
    self.assertRaises(IndexError, self._chown_calls.pop)
865 b81b3c96 René Nussbaumer
866 b81b3c96 René Nussbaumer
  def _FakeMkdir(self, path):
867 b81b3c96 René Nussbaumer
    self._mkdir_calls.append(path)
868 b81b3c96 René Nussbaumer
869 b81b3c96 René Nussbaumer
  def _FakeChown(self, path, uid, gid):
870 b81b3c96 René Nussbaumer
    self._chown_calls.append((path, uid, gid))
871 b81b3c96 René Nussbaumer
872 b81b3c96 René Nussbaumer
  def _ChmodWrapper(self, cb):
873 b81b3c96 René Nussbaumer
    def _fn(path, mode):
874 b81b3c96 René Nussbaumer
      self._chmod_calls.append((path, mode))
875 b81b3c96 René Nussbaumer
      if cb:
876 b81b3c96 René Nussbaumer
        cb()
877 b81b3c96 René Nussbaumer
    return _fn
878 b81b3c96 René Nussbaumer
879 b81b3c96 René Nussbaumer
  def _VerifyPerm(self, path, mode, uid=-1, gid=-1):
880 b81b3c96 René Nussbaumer
    self.assertEqual(path, "/ganeti-qa-non-test")
881 b81b3c96 René Nussbaumer
    self.assertEqual(mode, 0700)
882 b81b3c96 René Nussbaumer
    self.assertEqual(uid, self.UID_A)
883 b81b3c96 René Nussbaumer
    self.assertEqual(gid, self.GID_A)
884 b81b3c96 René Nussbaumer
885 b81b3c96 René Nussbaumer
  def testMakeDirWithPerm(self):
886 b81b3c96 René Nussbaumer
    is_dir_stat = _MockStatResult(None, stat.S_IFDIR, 0, 0)
887 b81b3c96 René Nussbaumer
    utils.MakeDirWithPerm("/ganeti-qa-non-test", 0700, self.UID_A, self.GID_A,
888 b81b3c96 René Nussbaumer
                          _lstat_fn=is_dir_stat, _perm_fn=self._VerifyPerm)
889 b81b3c96 René Nussbaumer
890 b81b3c96 René Nussbaumer
  def testDirErrors(self):
891 b81b3c96 René Nussbaumer
    self.assertRaises(errors.GenericError, utils.MakeDirWithPerm,
892 b81b3c96 René Nussbaumer
                      "/ganeti-qa-non-test", 0700, 0, 0,
893 b81b3c96 René Nussbaumer
                      _lstat_fn=_MockStatResult(None, 0, 0, 0))
894 b81b3c96 René Nussbaumer
    self.assertRaises(IndexError, self._mkdir_calls.pop)
895 b81b3c96 René Nussbaumer
896 b81b3c96 René Nussbaumer
    other_stat_raise = _MockStatResult(_OtherStatRaise, stat.S_IFDIR, 0, 0)
897 b81b3c96 René Nussbaumer
    self.assertRaises(errors.GenericError, utils.MakeDirWithPerm,
898 b81b3c96 René Nussbaumer
                      "/ganeti-qa-non-test", 0700, 0, 0,
899 b81b3c96 René Nussbaumer
                      _lstat_fn=other_stat_raise)
900 b81b3c96 René Nussbaumer
    self.assertRaises(IndexError, self._mkdir_calls.pop)
901 b81b3c96 René Nussbaumer
902 b81b3c96 René Nussbaumer
    non_exist_stat = _MockStatResult(_RaiseNoEntError, stat.S_IFDIR, 0, 0)
903 b81b3c96 René Nussbaumer
    utils.MakeDirWithPerm("/ganeti-qa-non-test", 0700, self.UID_A, self.GID_A,
904 b81b3c96 René Nussbaumer
                          _lstat_fn=non_exist_stat, _mkdir_fn=self._FakeMkdir,
905 b81b3c96 René Nussbaumer
                          _perm_fn=self._VerifyPerm)
906 b81b3c96 René Nussbaumer
    self.assertEqual(self._mkdir_calls.pop(0), "/ganeti-qa-non-test")
907 b81b3c96 René Nussbaumer
908 b81b3c96 René Nussbaumer
  def testEnforcePermissionNoEnt(self):
909 b81b3c96 René Nussbaumer
    self.assertRaises(errors.GenericError, utils.EnforcePermission,
910 b81b3c96 René Nussbaumer
                      "/ganeti-qa-non-test", 0600,
911 b81b3c96 René Nussbaumer
                      _chmod_fn=NotImplemented, _chown_fn=NotImplemented,
912 b81b3c96 René Nussbaumer
                      _stat_fn=_MockStatResult(_RaiseNoEntError, 0, 0, 0))
913 b81b3c96 René Nussbaumer
914 b81b3c96 René Nussbaumer
  def testEnforcePermissionNoEntMustNotExist(self):
915 b81b3c96 René Nussbaumer
    utils.EnforcePermission("/ganeti-qa-non-test", 0600, must_exist=False,
916 b81b3c96 René Nussbaumer
                            _chmod_fn=NotImplemented,
917 b81b3c96 René Nussbaumer
                            _chown_fn=NotImplemented,
918 b81b3c96 René Nussbaumer
                            _stat_fn=_MockStatResult(_RaiseNoEntError,
919 b81b3c96 René Nussbaumer
                                                          0, 0, 0))
920 b81b3c96 René Nussbaumer
921 b81b3c96 René Nussbaumer
  def testEnforcePermissionOtherErrorMustNotExist(self):
922 b81b3c96 René Nussbaumer
    self.assertRaises(errors.GenericError, utils.EnforcePermission,
923 b81b3c96 René Nussbaumer
                      "/ganeti-qa-non-test", 0600, must_exist=False,
924 b81b3c96 René Nussbaumer
                      _chmod_fn=NotImplemented, _chown_fn=NotImplemented,
925 b81b3c96 René Nussbaumer
                      _stat_fn=_MockStatResult(_OtherStatRaise, 0, 0, 0))
926 b81b3c96 René Nussbaumer
927 b81b3c96 René Nussbaumer
  def testEnforcePermissionNoChanges(self):
928 b81b3c96 René Nussbaumer
    utils.EnforcePermission("/ganeti-qa-non-test", 0600,
929 b81b3c96 René Nussbaumer
                            _stat_fn=_MockStatResult(None, 0600, 0, 0),
930 b81b3c96 René Nussbaumer
                            _chmod_fn=self._ChmodWrapper(None),
931 b81b3c96 René Nussbaumer
                            _chown_fn=self._FakeChown)
932 b81b3c96 René Nussbaumer
933 b81b3c96 René Nussbaumer
  def testEnforcePermissionChangeMode(self):
934 b81b3c96 René Nussbaumer
    utils.EnforcePermission("/ganeti-qa-non-test", 0444,
935 b81b3c96 René Nussbaumer
                            _stat_fn=_MockStatResult(None, 0600, 0, 0),
936 b81b3c96 René Nussbaumer
                            _chmod_fn=self._ChmodWrapper(None),
937 b81b3c96 René Nussbaumer
                            _chown_fn=self._FakeChown)
938 b81b3c96 René Nussbaumer
    self.assertEqual(self._chmod_calls.pop(0), ("/ganeti-qa-non-test", 0444))
939 b81b3c96 René Nussbaumer
940 b81b3c96 René Nussbaumer
  def testEnforcePermissionSetUidGid(self):
941 b81b3c96 René Nussbaumer
    utils.EnforcePermission("/ganeti-qa-non-test", 0600,
942 b81b3c96 René Nussbaumer
                            uid=self.UID_B, gid=self.GID_B,
943 b81b3c96 René Nussbaumer
                            _stat_fn=_MockStatResult(None, 0600,
944 b81b3c96 René Nussbaumer
                                                     self.UID_A,
945 b81b3c96 René Nussbaumer
                                                     self.GID_A),
946 b81b3c96 René Nussbaumer
                            _chmod_fn=self._ChmodWrapper(None),
947 b81b3c96 René Nussbaumer
                            _chown_fn=self._FakeChown)
948 b81b3c96 René Nussbaumer
    self.assertEqual(self._chown_calls.pop(0),
949 b81b3c96 René Nussbaumer
                     ("/ganeti-qa-non-test", self.UID_B, self.GID_B))
950 b81b3c96 René Nussbaumer
951 b81b3c96 René Nussbaumer
952 3865ca48 Michael Hanselmann
if __name__ == "__main__":
953 3865ca48 Michael Hanselmann
  testutils.GanetiTestProgram()