Statistics
| Branch: | Tag: | Revision:

root / test / ganeti.utils.io_unittest.py @ 6e7f0cd9

History | View | Annotate | Download (24.9 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 3865ca48 Michael Hanselmann
32 3865ca48 Michael Hanselmann
from ganeti import constants
33 3865ca48 Michael Hanselmann
from ganeti import utils
34 3865ca48 Michael Hanselmann
from ganeti import compat
35 3865ca48 Michael Hanselmann
from ganeti import errors
36 3865ca48 Michael Hanselmann
37 3865ca48 Michael Hanselmann
import testutils
38 3865ca48 Michael Hanselmann
39 3865ca48 Michael Hanselmann
40 3865ca48 Michael Hanselmann
class TestReadFile(testutils.GanetiTestCase):
41 3865ca48 Michael Hanselmann
  def testReadAll(self):
42 3865ca48 Michael Hanselmann
    data = utils.ReadFile(self._TestDataFilename("cert1.pem"))
43 3865ca48 Michael Hanselmann
    self.assertEqual(len(data), 814)
44 3865ca48 Michael Hanselmann
45 3865ca48 Michael Hanselmann
    h = compat.md5_hash()
46 3865ca48 Michael Hanselmann
    h.update(data)
47 3865ca48 Michael Hanselmann
    self.assertEqual(h.hexdigest(), "a491efb3efe56a0535f924d5f8680fd4")
48 3865ca48 Michael Hanselmann
49 3865ca48 Michael Hanselmann
  def testReadSize(self):
50 3865ca48 Michael Hanselmann
    data = utils.ReadFile(self._TestDataFilename("cert1.pem"),
51 3865ca48 Michael Hanselmann
                          size=100)
52 3865ca48 Michael Hanselmann
    self.assertEqual(len(data), 100)
53 3865ca48 Michael Hanselmann
54 3865ca48 Michael Hanselmann
    h = compat.md5_hash()
55 3865ca48 Michael Hanselmann
    h.update(data)
56 3865ca48 Michael Hanselmann
    self.assertEqual(h.hexdigest(), "893772354e4e690b9efd073eed433ce7")
57 3865ca48 Michael Hanselmann
58 3865ca48 Michael Hanselmann
  def testError(self):
59 3865ca48 Michael Hanselmann
    self.assertRaises(EnvironmentError, utils.ReadFile,
60 3865ca48 Michael Hanselmann
                      "/dev/null/does-not-exist")
61 3865ca48 Michael Hanselmann
62 3865ca48 Michael Hanselmann
63 3865ca48 Michael Hanselmann
class TestReadOneLineFile(testutils.GanetiTestCase):
64 3865ca48 Michael Hanselmann
  def setUp(self):
65 3865ca48 Michael Hanselmann
    testutils.GanetiTestCase.setUp(self)
66 3865ca48 Michael Hanselmann
67 3865ca48 Michael Hanselmann
  def testDefault(self):
68 3865ca48 Michael Hanselmann
    data = utils.ReadOneLineFile(self._TestDataFilename("cert1.pem"))
69 3865ca48 Michael Hanselmann
    self.assertEqual(len(data), 27)
70 3865ca48 Michael Hanselmann
    self.assertEqual(data, "-----BEGIN CERTIFICATE-----")
71 3865ca48 Michael Hanselmann
72 3865ca48 Michael Hanselmann
  def testNotStrict(self):
73 3865ca48 Michael Hanselmann
    data = utils.ReadOneLineFile(self._TestDataFilename("cert1.pem"),
74 3865ca48 Michael Hanselmann
                                 strict=False)
75 3865ca48 Michael Hanselmann
    self.assertEqual(len(data), 27)
76 3865ca48 Michael Hanselmann
    self.assertEqual(data, "-----BEGIN CERTIFICATE-----")
77 3865ca48 Michael Hanselmann
78 3865ca48 Michael Hanselmann
  def testStrictFailure(self):
79 3865ca48 Michael Hanselmann
    self.assertRaises(errors.GenericError, utils.ReadOneLineFile,
80 3865ca48 Michael Hanselmann
                      self._TestDataFilename("cert1.pem"), strict=True)
81 3865ca48 Michael Hanselmann
82 3865ca48 Michael Hanselmann
  def testLongLine(self):
83 3865ca48 Michael Hanselmann
    dummydata = (1024 * "Hello World! ")
84 3865ca48 Michael Hanselmann
    myfile = self._CreateTempFile()
85 3865ca48 Michael Hanselmann
    utils.WriteFile(myfile, data=dummydata)
86 3865ca48 Michael Hanselmann
    datastrict = utils.ReadOneLineFile(myfile, strict=True)
87 3865ca48 Michael Hanselmann
    datalax = utils.ReadOneLineFile(myfile, strict=False)
88 3865ca48 Michael Hanselmann
    self.assertEqual(dummydata, datastrict)
89 3865ca48 Michael Hanselmann
    self.assertEqual(dummydata, datalax)
90 3865ca48 Michael Hanselmann
91 3865ca48 Michael Hanselmann
  def testNewline(self):
92 3865ca48 Michael Hanselmann
    myfile = self._CreateTempFile()
93 3865ca48 Michael Hanselmann
    myline = "myline"
94 3865ca48 Michael Hanselmann
    for nl in ["", "\n", "\r\n"]:
95 3865ca48 Michael Hanselmann
      dummydata = "%s%s" % (myline, nl)
96 3865ca48 Michael Hanselmann
      utils.WriteFile(myfile, data=dummydata)
97 3865ca48 Michael Hanselmann
      datalax = utils.ReadOneLineFile(myfile, strict=False)
98 3865ca48 Michael Hanselmann
      self.assertEqual(myline, datalax)
99 3865ca48 Michael Hanselmann
      datastrict = utils.ReadOneLineFile(myfile, strict=True)
100 3865ca48 Michael Hanselmann
      self.assertEqual(myline, datastrict)
101 3865ca48 Michael Hanselmann
102 3865ca48 Michael Hanselmann
  def testWhitespaceAndMultipleLines(self):
103 3865ca48 Michael Hanselmann
    myfile = self._CreateTempFile()
104 3865ca48 Michael Hanselmann
    for nl in ["", "\n", "\r\n"]:
105 3865ca48 Michael Hanselmann
      for ws in [" ", "\t", "\t\t  \t", "\t "]:
106 3865ca48 Michael Hanselmann
        dummydata = (1024 * ("Foo bar baz %s%s" % (ws, nl)))
107 3865ca48 Michael Hanselmann
        utils.WriteFile(myfile, data=dummydata)
108 3865ca48 Michael Hanselmann
        datalax = utils.ReadOneLineFile(myfile, strict=False)
109 3865ca48 Michael Hanselmann
        if nl:
110 3865ca48 Michael Hanselmann
          self.assert_(set("\r\n") & set(dummydata))
111 3865ca48 Michael Hanselmann
          self.assertRaises(errors.GenericError, utils.ReadOneLineFile,
112 3865ca48 Michael Hanselmann
                            myfile, strict=True)
113 3865ca48 Michael Hanselmann
          explen = len("Foo bar baz ") + len(ws)
114 3865ca48 Michael Hanselmann
          self.assertEqual(len(datalax), explen)
115 3865ca48 Michael Hanselmann
          self.assertEqual(datalax, dummydata[:explen])
116 3865ca48 Michael Hanselmann
          self.assertFalse(set("\r\n") & set(datalax))
117 3865ca48 Michael Hanselmann
        else:
118 3865ca48 Michael Hanselmann
          datastrict = utils.ReadOneLineFile(myfile, strict=True)
119 3865ca48 Michael Hanselmann
          self.assertEqual(dummydata, datastrict)
120 3865ca48 Michael Hanselmann
          self.assertEqual(dummydata, datalax)
121 3865ca48 Michael Hanselmann
122 3865ca48 Michael Hanselmann
  def testEmptylines(self):
123 3865ca48 Michael Hanselmann
    myfile = self._CreateTempFile()
124 3865ca48 Michael Hanselmann
    myline = "myline"
125 3865ca48 Michael Hanselmann
    for nl in ["\n", "\r\n"]:
126 3865ca48 Michael Hanselmann
      for ol in ["", "otherline"]:
127 3865ca48 Michael Hanselmann
        dummydata = "%s%s%s%s%s%s" % (nl, nl, myline, nl, ol, nl)
128 3865ca48 Michael Hanselmann
        utils.WriteFile(myfile, data=dummydata)
129 3865ca48 Michael Hanselmann
        self.assert_(set("\r\n") & set(dummydata))
130 3865ca48 Michael Hanselmann
        datalax = utils.ReadOneLineFile(myfile, strict=False)
131 3865ca48 Michael Hanselmann
        self.assertEqual(myline, datalax)
132 3865ca48 Michael Hanselmann
        if ol:
133 3865ca48 Michael Hanselmann
          self.assertRaises(errors.GenericError, utils.ReadOneLineFile,
134 3865ca48 Michael Hanselmann
                            myfile, strict=True)
135 3865ca48 Michael Hanselmann
        else:
136 3865ca48 Michael Hanselmann
          datastrict = utils.ReadOneLineFile(myfile, strict=True)
137 3865ca48 Michael Hanselmann
          self.assertEqual(myline, datastrict)
138 3865ca48 Michael Hanselmann
139 3865ca48 Michael Hanselmann
  def testEmptyfile(self):
140 3865ca48 Michael Hanselmann
    myfile = self._CreateTempFile()
141 3865ca48 Michael Hanselmann
    self.assertRaises(errors.GenericError, utils.ReadOneLineFile, myfile)
142 3865ca48 Michael Hanselmann
143 3865ca48 Michael Hanselmann
144 3865ca48 Michael Hanselmann
class TestTimestampForFilename(unittest.TestCase):
145 3865ca48 Michael Hanselmann
  def test(self):
146 3865ca48 Michael Hanselmann
    self.assert_("." not in utils.TimestampForFilename())
147 3865ca48 Michael Hanselmann
    self.assert_(":" not in utils.TimestampForFilename())
148 3865ca48 Michael Hanselmann
149 3865ca48 Michael Hanselmann
150 3865ca48 Michael Hanselmann
class TestCreateBackup(testutils.GanetiTestCase):
151 3865ca48 Michael Hanselmann
  def setUp(self):
152 3865ca48 Michael Hanselmann
    testutils.GanetiTestCase.setUp(self)
153 3865ca48 Michael Hanselmann
154 3865ca48 Michael Hanselmann
    self.tmpdir = tempfile.mkdtemp()
155 3865ca48 Michael Hanselmann
156 3865ca48 Michael Hanselmann
  def tearDown(self):
157 3865ca48 Michael Hanselmann
    testutils.GanetiTestCase.tearDown(self)
158 3865ca48 Michael Hanselmann
159 3865ca48 Michael Hanselmann
    shutil.rmtree(self.tmpdir)
160 3865ca48 Michael Hanselmann
161 3865ca48 Michael Hanselmann
  def testEmpty(self):
162 3865ca48 Michael Hanselmann
    filename = utils.PathJoin(self.tmpdir, "config.data")
163 3865ca48 Michael Hanselmann
    utils.WriteFile(filename, data="")
164 3865ca48 Michael Hanselmann
    bname = utils.CreateBackup(filename)
165 3865ca48 Michael Hanselmann
    self.assertFileContent(bname, "")
166 3865ca48 Michael Hanselmann
    self.assertEqual(len(glob.glob("%s*" % filename)), 2)
167 3865ca48 Michael Hanselmann
    utils.CreateBackup(filename)
168 3865ca48 Michael Hanselmann
    self.assertEqual(len(glob.glob("%s*" % filename)), 3)
169 3865ca48 Michael Hanselmann
    utils.CreateBackup(filename)
170 3865ca48 Michael Hanselmann
    self.assertEqual(len(glob.glob("%s*" % filename)), 4)
171 3865ca48 Michael Hanselmann
172 3865ca48 Michael Hanselmann
    fifoname = utils.PathJoin(self.tmpdir, "fifo")
173 3865ca48 Michael Hanselmann
    os.mkfifo(fifoname)
174 3865ca48 Michael Hanselmann
    self.assertRaises(errors.ProgrammerError, utils.CreateBackup, fifoname)
175 3865ca48 Michael Hanselmann
176 3865ca48 Michael Hanselmann
  def testContent(self):
177 3865ca48 Michael Hanselmann
    bkpcount = 0
178 3865ca48 Michael Hanselmann
    for data in ["", "X", "Hello World!\n" * 100, "Binary data\0\x01\x02\n"]:
179 3865ca48 Michael Hanselmann
      for rep in [1, 2, 10, 127]:
180 3865ca48 Michael Hanselmann
        testdata = data * rep
181 3865ca48 Michael Hanselmann
182 3865ca48 Michael Hanselmann
        filename = utils.PathJoin(self.tmpdir, "test.data_")
183 3865ca48 Michael Hanselmann
        utils.WriteFile(filename, data=testdata)
184 3865ca48 Michael Hanselmann
        self.assertFileContent(filename, testdata)
185 3865ca48 Michael Hanselmann
186 3865ca48 Michael Hanselmann
        for _ in range(3):
187 3865ca48 Michael Hanselmann
          bname = utils.CreateBackup(filename)
188 3865ca48 Michael Hanselmann
          bkpcount += 1
189 3865ca48 Michael Hanselmann
          self.assertFileContent(bname, testdata)
190 3865ca48 Michael Hanselmann
          self.assertEqual(len(glob.glob("%s*" % filename)), 1 + bkpcount)
191 3865ca48 Michael Hanselmann
192 3865ca48 Michael Hanselmann
193 3865ca48 Michael Hanselmann
class TestListVisibleFiles(unittest.TestCase):
194 3865ca48 Michael Hanselmann
  """Test case for ListVisibleFiles"""
195 3865ca48 Michael Hanselmann
196 3865ca48 Michael Hanselmann
  def setUp(self):
197 3865ca48 Michael Hanselmann
    self.path = tempfile.mkdtemp()
198 3865ca48 Michael Hanselmann
199 3865ca48 Michael Hanselmann
  def tearDown(self):
200 3865ca48 Michael Hanselmann
    shutil.rmtree(self.path)
201 3865ca48 Michael Hanselmann
202 3865ca48 Michael Hanselmann
  def _CreateFiles(self, files):
203 3865ca48 Michael Hanselmann
    for name in files:
204 3865ca48 Michael Hanselmann
      utils.WriteFile(os.path.join(self.path, name), data="test")
205 3865ca48 Michael Hanselmann
206 3865ca48 Michael Hanselmann
  def _test(self, files, expected):
207 3865ca48 Michael Hanselmann
    self._CreateFiles(files)
208 3865ca48 Michael Hanselmann
    found = utils.ListVisibleFiles(self.path)
209 3865ca48 Michael Hanselmann
    self.assertEqual(set(found), set(expected))
210 3865ca48 Michael Hanselmann
211 3865ca48 Michael Hanselmann
  def testAllVisible(self):
212 3865ca48 Michael Hanselmann
    files = ["a", "b", "c"]
213 3865ca48 Michael Hanselmann
    expected = files
214 3865ca48 Michael Hanselmann
    self._test(files, expected)
215 3865ca48 Michael Hanselmann
216 3865ca48 Michael Hanselmann
  def testNoneVisible(self):
217 3865ca48 Michael Hanselmann
    files = [".a", ".b", ".c"]
218 3865ca48 Michael Hanselmann
    expected = []
219 3865ca48 Michael Hanselmann
    self._test(files, expected)
220 3865ca48 Michael Hanselmann
221 3865ca48 Michael Hanselmann
  def testSomeVisible(self):
222 3865ca48 Michael Hanselmann
    files = ["a", "b", ".c"]
223 3865ca48 Michael Hanselmann
    expected = ["a", "b"]
224 3865ca48 Michael Hanselmann
    self._test(files, expected)
225 3865ca48 Michael Hanselmann
226 3865ca48 Michael Hanselmann
  def testNonAbsolutePath(self):
227 3865ca48 Michael Hanselmann
    self.failUnlessRaises(errors.ProgrammerError, utils.ListVisibleFiles,
228 3865ca48 Michael Hanselmann
                          "abc")
229 3865ca48 Michael Hanselmann
230 3865ca48 Michael Hanselmann
  def testNonNormalizedPath(self):
231 3865ca48 Michael Hanselmann
    self.failUnlessRaises(errors.ProgrammerError, utils.ListVisibleFiles,
232 3865ca48 Michael Hanselmann
                          "/bin/../tmp")
233 3865ca48 Michael Hanselmann
234 3865ca48 Michael Hanselmann
235 3865ca48 Michael Hanselmann
class TestWriteFile(unittest.TestCase):
236 3865ca48 Michael Hanselmann
  def setUp(self):
237 a9d68e40 Michael Hanselmann
    self.tmpdir = None
238 3865ca48 Michael Hanselmann
    self.tfile = tempfile.NamedTemporaryFile()
239 3865ca48 Michael Hanselmann
    self.did_pre = False
240 3865ca48 Michael Hanselmann
    self.did_post = False
241 3865ca48 Michael Hanselmann
    self.did_write = False
242 3865ca48 Michael Hanselmann
243 a9d68e40 Michael Hanselmann
  def tearDown(self):
244 a9d68e40 Michael Hanselmann
    if self.tmpdir:
245 a9d68e40 Michael Hanselmann
      shutil.rmtree(self.tmpdir)
246 a9d68e40 Michael Hanselmann
247 3865ca48 Michael Hanselmann
  def markPre(self, fd):
248 3865ca48 Michael Hanselmann
    self.did_pre = True
249 3865ca48 Michael Hanselmann
250 3865ca48 Michael Hanselmann
  def markPost(self, fd):
251 3865ca48 Michael Hanselmann
    self.did_post = True
252 3865ca48 Michael Hanselmann
253 3865ca48 Michael Hanselmann
  def markWrite(self, fd):
254 3865ca48 Michael Hanselmann
    self.did_write = True
255 3865ca48 Michael Hanselmann
256 3865ca48 Michael Hanselmann
  def testWrite(self):
257 3865ca48 Michael Hanselmann
    data = "abc"
258 3865ca48 Michael Hanselmann
    utils.WriteFile(self.tfile.name, data=data)
259 3865ca48 Michael Hanselmann
    self.assertEqual(utils.ReadFile(self.tfile.name), data)
260 3865ca48 Michael Hanselmann
261 3865ca48 Michael Hanselmann
  def testErrors(self):
262 3865ca48 Michael Hanselmann
    self.assertRaises(errors.ProgrammerError, utils.WriteFile,
263 3865ca48 Michael Hanselmann
                      self.tfile.name, data="test", fn=lambda fd: None)
264 3865ca48 Michael Hanselmann
    self.assertRaises(errors.ProgrammerError, utils.WriteFile, self.tfile.name)
265 3865ca48 Michael Hanselmann
    self.assertRaises(errors.ProgrammerError, utils.WriteFile,
266 3865ca48 Michael Hanselmann
                      self.tfile.name, data="test", atime=0)
267 3865ca48 Michael Hanselmann
268 a9d68e40 Michael Hanselmann
  def testPreWrite(self):
269 a9d68e40 Michael Hanselmann
    utils.WriteFile(self.tfile.name, data="", prewrite=self.markPre)
270 3865ca48 Michael Hanselmann
    self.assertTrue(self.did_pre)
271 a9d68e40 Michael Hanselmann
    self.assertFalse(self.did_post)
272 a9d68e40 Michael Hanselmann
    self.assertFalse(self.did_write)
273 a9d68e40 Michael Hanselmann
274 a9d68e40 Michael Hanselmann
  def testPostWrite(self):
275 a9d68e40 Michael Hanselmann
    utils.WriteFile(self.tfile.name, data="", postwrite=self.markPost)
276 a9d68e40 Michael Hanselmann
    self.assertFalse(self.did_pre)
277 3865ca48 Michael Hanselmann
    self.assertTrue(self.did_post)
278 a9d68e40 Michael Hanselmann
    self.assertFalse(self.did_write)
279 a9d68e40 Michael Hanselmann
280 a9d68e40 Michael Hanselmann
  def testWriteFunction(self):
281 a9d68e40 Michael Hanselmann
    utils.WriteFile(self.tfile.name, fn=self.markWrite)
282 a9d68e40 Michael Hanselmann
    self.assertFalse(self.did_pre)
283 a9d68e40 Michael Hanselmann
    self.assertFalse(self.did_post)
284 3865ca48 Michael Hanselmann
    self.assertTrue(self.did_write)
285 3865ca48 Michael Hanselmann
286 3865ca48 Michael Hanselmann
  def testDryRun(self):
287 3865ca48 Michael Hanselmann
    orig = "abc"
288 3865ca48 Michael Hanselmann
    self.tfile.write(orig)
289 3865ca48 Michael Hanselmann
    self.tfile.flush()
290 3865ca48 Michael Hanselmann
    utils.WriteFile(self.tfile.name, data="hello", dry_run=True)
291 3865ca48 Michael Hanselmann
    self.assertEqual(utils.ReadFile(self.tfile.name), orig)
292 3865ca48 Michael Hanselmann
293 3865ca48 Michael Hanselmann
  def testTimes(self):
294 3865ca48 Michael Hanselmann
    f = self.tfile.name
295 3865ca48 Michael Hanselmann
    for at, mt in [(0, 0), (1000, 1000), (2000, 3000),
296 3865ca48 Michael Hanselmann
                   (int(time.time()), 5000)]:
297 3865ca48 Michael Hanselmann
      utils.WriteFile(f, data="hello", atime=at, mtime=mt)
298 3865ca48 Michael Hanselmann
      st = os.stat(f)
299 3865ca48 Michael Hanselmann
      self.assertEqual(st.st_atime, at)
300 3865ca48 Michael Hanselmann
      self.assertEqual(st.st_mtime, mt)
301 3865ca48 Michael Hanselmann
302 3865ca48 Michael Hanselmann
  def testNoClose(self):
303 3865ca48 Michael Hanselmann
    data = "hello"
304 3865ca48 Michael Hanselmann
    self.assertEqual(utils.WriteFile(self.tfile.name, data="abc"), None)
305 3865ca48 Michael Hanselmann
    fd = utils.WriteFile(self.tfile.name, data=data, close=False)
306 3865ca48 Michael Hanselmann
    try:
307 3865ca48 Michael Hanselmann
      os.lseek(fd, 0, 0)
308 3865ca48 Michael Hanselmann
      self.assertEqual(os.read(fd, 4096), data)
309 3865ca48 Michael Hanselmann
    finally:
310 3865ca48 Michael Hanselmann
      os.close(fd)
311 3865ca48 Michael Hanselmann
312 a9d68e40 Michael Hanselmann
  def testNoLeftovers(self):
313 a9d68e40 Michael Hanselmann
    self.tmpdir = tempfile.mkdtemp()
314 a9d68e40 Michael Hanselmann
    self.assertEqual(utils.WriteFile(utils.PathJoin(self.tmpdir, "test"),
315 a9d68e40 Michael Hanselmann
                                     data="abc"),
316 a9d68e40 Michael Hanselmann
                     None)
317 a9d68e40 Michael Hanselmann
    self.assertEqual(os.listdir(self.tmpdir), ["test"])
318 a9d68e40 Michael Hanselmann
319 a9d68e40 Michael Hanselmann
  def testFailRename(self):
320 a9d68e40 Michael Hanselmann
    self.tmpdir = tempfile.mkdtemp()
321 a9d68e40 Michael Hanselmann
    target = utils.PathJoin(self.tmpdir, "target")
322 a9d68e40 Michael Hanselmann
    os.mkdir(target)
323 a9d68e40 Michael Hanselmann
    self.assertRaises(OSError, utils.WriteFile, target, data="abc")
324 a9d68e40 Michael Hanselmann
    self.assertTrue(os.path.isdir(target))
325 a9d68e40 Michael Hanselmann
    self.assertEqual(os.listdir(self.tmpdir), ["target"])
326 a9d68e40 Michael Hanselmann
    self.assertFalse(os.listdir(target))
327 a9d68e40 Michael Hanselmann
328 a9d68e40 Michael Hanselmann
  def testFailRenameDryRun(self):
329 a9d68e40 Michael Hanselmann
    self.tmpdir = tempfile.mkdtemp()
330 a9d68e40 Michael Hanselmann
    target = utils.PathJoin(self.tmpdir, "target")
331 a9d68e40 Michael Hanselmann
    os.mkdir(target)
332 a9d68e40 Michael Hanselmann
    self.assertEqual(utils.WriteFile(target, data="abc", dry_run=True), None)
333 a9d68e40 Michael Hanselmann
    self.assertTrue(os.path.isdir(target))
334 a9d68e40 Michael Hanselmann
    self.assertEqual(os.listdir(self.tmpdir), ["target"])
335 a9d68e40 Michael Hanselmann
    self.assertFalse(os.listdir(target))
336 a9d68e40 Michael Hanselmann
337 a9d68e40 Michael Hanselmann
  def testBackup(self):
338 a9d68e40 Michael Hanselmann
    self.tmpdir = tempfile.mkdtemp()
339 a9d68e40 Michael Hanselmann
    testfile = utils.PathJoin(self.tmpdir, "test")
340 a9d68e40 Michael Hanselmann
341 a9d68e40 Michael Hanselmann
    self.assertEqual(utils.WriteFile(testfile, data="foo", backup=True), None)
342 a9d68e40 Michael Hanselmann
    self.assertEqual(utils.ReadFile(testfile), "foo")
343 a9d68e40 Michael Hanselmann
    self.assertEqual(os.listdir(self.tmpdir), ["test"])
344 a9d68e40 Michael Hanselmann
345 a9d68e40 Michael Hanselmann
    # Write again
346 a9d68e40 Michael Hanselmann
    assert os.path.isfile(testfile)
347 a9d68e40 Michael Hanselmann
    self.assertEqual(utils.WriteFile(testfile, data="bar", backup=True), None)
348 a9d68e40 Michael Hanselmann
    self.assertEqual(utils.ReadFile(testfile), "bar")
349 a9d68e40 Michael Hanselmann
    self.assertEqual(len(glob.glob("%s.backup*" % testfile)), 1)
350 a9d68e40 Michael Hanselmann
    self.assertTrue("test" in os.listdir(self.tmpdir))
351 a9d68e40 Michael Hanselmann
    self.assertEqual(len(os.listdir(self.tmpdir)), 2)
352 a9d68e40 Michael Hanselmann
353 a9d68e40 Michael Hanselmann
    # Write again as dry-run
354 a9d68e40 Michael Hanselmann
    assert os.path.isfile(testfile)
355 a9d68e40 Michael Hanselmann
    self.assertEqual(utils.WriteFile(testfile, data="000", backup=True,
356 a9d68e40 Michael Hanselmann
                                     dry_run=True),
357 a9d68e40 Michael Hanselmann
                     None)
358 a9d68e40 Michael Hanselmann
    self.assertEqual(utils.ReadFile(testfile), "bar")
359 a9d68e40 Michael Hanselmann
    self.assertEqual(len(glob.glob("%s.backup*" % testfile)), 1)
360 a9d68e40 Michael Hanselmann
    self.assertTrue("test" in os.listdir(self.tmpdir))
361 a9d68e40 Michael Hanselmann
    self.assertEqual(len(os.listdir(self.tmpdir)), 2)
362 a9d68e40 Michael Hanselmann
363 3865ca48 Michael Hanselmann
364 3865ca48 Michael Hanselmann
class TestFileID(testutils.GanetiTestCase):
365 3865ca48 Michael Hanselmann
  def testEquality(self):
366 3865ca48 Michael Hanselmann
    name = self._CreateTempFile()
367 3865ca48 Michael Hanselmann
    oldi = utils.GetFileID(path=name)
368 3865ca48 Michael Hanselmann
    self.failUnless(utils.VerifyFileID(oldi, oldi))
369 3865ca48 Michael Hanselmann
370 3865ca48 Michael Hanselmann
  def testUpdate(self):
371 3865ca48 Michael Hanselmann
    name = self._CreateTempFile()
372 3865ca48 Michael Hanselmann
    oldi = utils.GetFileID(path=name)
373 3865ca48 Michael Hanselmann
    os.utime(name, None)
374 3865ca48 Michael Hanselmann
    fd = os.open(name, os.O_RDWR)
375 3865ca48 Michael Hanselmann
    try:
376 3865ca48 Michael Hanselmann
      newi = utils.GetFileID(fd=fd)
377 3865ca48 Michael Hanselmann
      self.failUnless(utils.VerifyFileID(oldi, newi))
378 3865ca48 Michael Hanselmann
      self.failUnless(utils.VerifyFileID(newi, oldi))
379 3865ca48 Michael Hanselmann
    finally:
380 3865ca48 Michael Hanselmann
      os.close(fd)
381 3865ca48 Michael Hanselmann
382 3865ca48 Michael Hanselmann
  def testWriteFile(self):
383 3865ca48 Michael Hanselmann
    name = self._CreateTempFile()
384 3865ca48 Michael Hanselmann
    oldi = utils.GetFileID(path=name)
385 3865ca48 Michael Hanselmann
    mtime = oldi[2]
386 3865ca48 Michael Hanselmann
    os.utime(name, (mtime + 10, mtime + 10))
387 3865ca48 Michael Hanselmann
    self.assertRaises(errors.LockError, utils.SafeWriteFile, name,
388 3865ca48 Michael Hanselmann
                      oldi, data="")
389 3865ca48 Michael Hanselmann
    os.utime(name, (mtime - 10, mtime - 10))
390 3865ca48 Michael Hanselmann
    utils.SafeWriteFile(name, oldi, data="")
391 3865ca48 Michael Hanselmann
    oldi = utils.GetFileID(path=name)
392 3865ca48 Michael Hanselmann
    mtime = oldi[2]
393 3865ca48 Michael Hanselmann
    os.utime(name, (mtime + 10, mtime + 10))
394 3865ca48 Michael Hanselmann
    # this doesn't raise, since we passed None
395 3865ca48 Michael Hanselmann
    utils.SafeWriteFile(name, None, data="")
396 3865ca48 Michael Hanselmann
397 3865ca48 Michael Hanselmann
  def testError(self):
398 3865ca48 Michael Hanselmann
    t = tempfile.NamedTemporaryFile()
399 3865ca48 Michael Hanselmann
    self.assertRaises(errors.ProgrammerError, utils.GetFileID,
400 3865ca48 Michael Hanselmann
                      path=t.name, fd=t.fileno())
401 3865ca48 Michael Hanselmann
402 3865ca48 Michael Hanselmann
403 3865ca48 Michael Hanselmann
class TestRemoveFile(unittest.TestCase):
404 3865ca48 Michael Hanselmann
  """Test case for the RemoveFile function"""
405 3865ca48 Michael Hanselmann
406 3865ca48 Michael Hanselmann
  def setUp(self):
407 3865ca48 Michael Hanselmann
    """Create a temp dir and file for each case"""
408 3865ca48 Michael Hanselmann
    self.tmpdir = tempfile.mkdtemp('', 'ganeti-unittest-')
409 3865ca48 Michael Hanselmann
    fd, self.tmpfile = tempfile.mkstemp('', '', self.tmpdir)
410 3865ca48 Michael Hanselmann
    os.close(fd)
411 3865ca48 Michael Hanselmann
412 3865ca48 Michael Hanselmann
  def tearDown(self):
413 3865ca48 Michael Hanselmann
    if os.path.exists(self.tmpfile):
414 3865ca48 Michael Hanselmann
      os.unlink(self.tmpfile)
415 3865ca48 Michael Hanselmann
    os.rmdir(self.tmpdir)
416 3865ca48 Michael Hanselmann
417 3865ca48 Michael Hanselmann
  def testIgnoreDirs(self):
418 3865ca48 Michael Hanselmann
    """Test that RemoveFile() ignores directories"""
419 3865ca48 Michael Hanselmann
    self.assertEqual(None, utils.RemoveFile(self.tmpdir))
420 3865ca48 Michael Hanselmann
421 3865ca48 Michael Hanselmann
  def testIgnoreNotExisting(self):
422 3865ca48 Michael Hanselmann
    """Test that RemoveFile() ignores non-existing files"""
423 3865ca48 Michael Hanselmann
    utils.RemoveFile(self.tmpfile)
424 3865ca48 Michael Hanselmann
    utils.RemoveFile(self.tmpfile)
425 3865ca48 Michael Hanselmann
426 3865ca48 Michael Hanselmann
  def testRemoveFile(self):
427 3865ca48 Michael Hanselmann
    """Test that RemoveFile does remove a file"""
428 3865ca48 Michael Hanselmann
    utils.RemoveFile(self.tmpfile)
429 3865ca48 Michael Hanselmann
    if os.path.exists(self.tmpfile):
430 3865ca48 Michael Hanselmann
      self.fail("File '%s' not removed" % self.tmpfile)
431 3865ca48 Michael Hanselmann
432 3865ca48 Michael Hanselmann
  def testRemoveSymlink(self):
433 3865ca48 Michael Hanselmann
    """Test that RemoveFile does remove symlinks"""
434 3865ca48 Michael Hanselmann
    symlink = self.tmpdir + "/symlink"
435 3865ca48 Michael Hanselmann
    os.symlink("no-such-file", symlink)
436 3865ca48 Michael Hanselmann
    utils.RemoveFile(symlink)
437 3865ca48 Michael Hanselmann
    if os.path.exists(symlink):
438 3865ca48 Michael Hanselmann
      self.fail("File '%s' not removed" % symlink)
439 3865ca48 Michael Hanselmann
    os.symlink(self.tmpfile, symlink)
440 3865ca48 Michael Hanselmann
    utils.RemoveFile(symlink)
441 3865ca48 Michael Hanselmann
    if os.path.exists(symlink):
442 3865ca48 Michael Hanselmann
      self.fail("File '%s' not removed" % symlink)
443 3865ca48 Michael Hanselmann
444 3865ca48 Michael Hanselmann
445 3865ca48 Michael Hanselmann
class TestRemoveDir(unittest.TestCase):
446 3865ca48 Michael Hanselmann
  def setUp(self):
447 3865ca48 Michael Hanselmann
    self.tmpdir = tempfile.mkdtemp()
448 3865ca48 Michael Hanselmann
449 3865ca48 Michael Hanselmann
  def tearDown(self):
450 3865ca48 Michael Hanselmann
    try:
451 3865ca48 Michael Hanselmann
      shutil.rmtree(self.tmpdir)
452 3865ca48 Michael Hanselmann
    except EnvironmentError:
453 3865ca48 Michael Hanselmann
      pass
454 3865ca48 Michael Hanselmann
455 3865ca48 Michael Hanselmann
  def testEmptyDir(self):
456 3865ca48 Michael Hanselmann
    utils.RemoveDir(self.tmpdir)
457 3865ca48 Michael Hanselmann
    self.assertFalse(os.path.isdir(self.tmpdir))
458 3865ca48 Michael Hanselmann
459 3865ca48 Michael Hanselmann
  def testNonEmptyDir(self):
460 3865ca48 Michael Hanselmann
    self.tmpfile = os.path.join(self.tmpdir, "test1")
461 3865ca48 Michael Hanselmann
    open(self.tmpfile, "w").close()
462 3865ca48 Michael Hanselmann
    self.assertRaises(EnvironmentError, utils.RemoveDir, self.tmpdir)
463 3865ca48 Michael Hanselmann
464 3865ca48 Michael Hanselmann
465 3865ca48 Michael Hanselmann
class TestRename(unittest.TestCase):
466 3865ca48 Michael Hanselmann
  """Test case for RenameFile"""
467 3865ca48 Michael Hanselmann
468 3865ca48 Michael Hanselmann
  def setUp(self):
469 3865ca48 Michael Hanselmann
    """Create a temporary directory"""
470 3865ca48 Michael Hanselmann
    self.tmpdir = tempfile.mkdtemp()
471 3865ca48 Michael Hanselmann
    self.tmpfile = os.path.join(self.tmpdir, "test1")
472 3865ca48 Michael Hanselmann
473 3865ca48 Michael Hanselmann
    # Touch the file
474 3865ca48 Michael Hanselmann
    open(self.tmpfile, "w").close()
475 3865ca48 Michael Hanselmann
476 3865ca48 Michael Hanselmann
  def tearDown(self):
477 3865ca48 Michael Hanselmann
    """Remove temporary directory"""
478 3865ca48 Michael Hanselmann
    shutil.rmtree(self.tmpdir)
479 3865ca48 Michael Hanselmann
480 3865ca48 Michael Hanselmann
  def testSimpleRename1(self):
481 3865ca48 Michael Hanselmann
    """Simple rename 1"""
482 3865ca48 Michael Hanselmann
    utils.RenameFile(self.tmpfile, os.path.join(self.tmpdir, "xyz"))
483 3865ca48 Michael Hanselmann
    self.assert_(os.path.isfile(os.path.join(self.tmpdir, "xyz")))
484 3865ca48 Michael Hanselmann
485 3865ca48 Michael Hanselmann
  def testSimpleRename2(self):
486 3865ca48 Michael Hanselmann
    """Simple rename 2"""
487 3865ca48 Michael Hanselmann
    utils.RenameFile(self.tmpfile, os.path.join(self.tmpdir, "xyz"),
488 3865ca48 Michael Hanselmann
                     mkdir=True)
489 3865ca48 Michael Hanselmann
    self.assert_(os.path.isfile(os.path.join(self.tmpdir, "xyz")))
490 3865ca48 Michael Hanselmann
491 3865ca48 Michael Hanselmann
  def testRenameMkdir(self):
492 3865ca48 Michael Hanselmann
    """Rename with mkdir"""
493 3865ca48 Michael Hanselmann
    utils.RenameFile(self.tmpfile, os.path.join(self.tmpdir, "test/xyz"),
494 3865ca48 Michael Hanselmann
                     mkdir=True)
495 3865ca48 Michael Hanselmann
    self.assert_(os.path.isdir(os.path.join(self.tmpdir, "test")))
496 3865ca48 Michael Hanselmann
    self.assert_(os.path.isfile(os.path.join(self.tmpdir, "test/xyz")))
497 3865ca48 Michael Hanselmann
498 3865ca48 Michael Hanselmann
    utils.RenameFile(os.path.join(self.tmpdir, "test/xyz"),
499 3865ca48 Michael Hanselmann
                     os.path.join(self.tmpdir, "test/foo/bar/baz"),
500 3865ca48 Michael Hanselmann
                     mkdir=True)
501 3865ca48 Michael Hanselmann
    self.assert_(os.path.isdir(os.path.join(self.tmpdir, "test")))
502 3865ca48 Michael Hanselmann
    self.assert_(os.path.isdir(os.path.join(self.tmpdir, "test/foo/bar")))
503 3865ca48 Michael Hanselmann
    self.assert_(os.path.isfile(os.path.join(self.tmpdir, "test/foo/bar/baz")))
504 3865ca48 Michael Hanselmann
505 3865ca48 Michael Hanselmann
506 3865ca48 Michael Hanselmann
class TestMakedirs(unittest.TestCase):
507 3865ca48 Michael Hanselmann
  def setUp(self):
508 3865ca48 Michael Hanselmann
    self.tmpdir = tempfile.mkdtemp()
509 3865ca48 Michael Hanselmann
510 3865ca48 Michael Hanselmann
  def tearDown(self):
511 3865ca48 Michael Hanselmann
    shutil.rmtree(self.tmpdir)
512 3865ca48 Michael Hanselmann
513 3865ca48 Michael Hanselmann
  def testNonExisting(self):
514 3865ca48 Michael Hanselmann
    path = utils.PathJoin(self.tmpdir, "foo")
515 3865ca48 Michael Hanselmann
    utils.Makedirs(path)
516 3865ca48 Michael Hanselmann
    self.assert_(os.path.isdir(path))
517 3865ca48 Michael Hanselmann
518 3865ca48 Michael Hanselmann
  def testExisting(self):
519 3865ca48 Michael Hanselmann
    path = utils.PathJoin(self.tmpdir, "foo")
520 3865ca48 Michael Hanselmann
    os.mkdir(path)
521 3865ca48 Michael Hanselmann
    utils.Makedirs(path)
522 3865ca48 Michael Hanselmann
    self.assert_(os.path.isdir(path))
523 3865ca48 Michael Hanselmann
524 3865ca48 Michael Hanselmann
  def testRecursiveNonExisting(self):
525 3865ca48 Michael Hanselmann
    path = utils.PathJoin(self.tmpdir, "foo/bar/baz")
526 3865ca48 Michael Hanselmann
    utils.Makedirs(path)
527 3865ca48 Michael Hanselmann
    self.assert_(os.path.isdir(path))
528 3865ca48 Michael Hanselmann
529 3865ca48 Michael Hanselmann
  def testRecursiveExisting(self):
530 3865ca48 Michael Hanselmann
    path = utils.PathJoin(self.tmpdir, "B/moo/xyz")
531 3865ca48 Michael Hanselmann
    self.assertFalse(os.path.exists(path))
532 3865ca48 Michael Hanselmann
    os.mkdir(utils.PathJoin(self.tmpdir, "B"))
533 3865ca48 Michael Hanselmann
    utils.Makedirs(path)
534 3865ca48 Michael Hanselmann
    self.assert_(os.path.isdir(path))
535 3865ca48 Michael Hanselmann
536 3865ca48 Michael Hanselmann
537 3865ca48 Michael Hanselmann
class TestEnsureDirs(unittest.TestCase):
538 3865ca48 Michael Hanselmann
  """Tests for EnsureDirs"""
539 3865ca48 Michael Hanselmann
540 3865ca48 Michael Hanselmann
  def setUp(self):
541 3865ca48 Michael Hanselmann
    self.dir = tempfile.mkdtemp()
542 3865ca48 Michael Hanselmann
    self.old_umask = os.umask(0777)
543 3865ca48 Michael Hanselmann
544 3865ca48 Michael Hanselmann
  def testEnsureDirs(self):
545 3865ca48 Michael Hanselmann
    utils.EnsureDirs([
546 3865ca48 Michael Hanselmann
        (utils.PathJoin(self.dir, "foo"), 0777),
547 3865ca48 Michael Hanselmann
        (utils.PathJoin(self.dir, "bar"), 0000),
548 3865ca48 Michael Hanselmann
        ])
549 3865ca48 Michael Hanselmann
    self.assertEquals(os.stat(utils.PathJoin(self.dir, "foo"))[0] & 0777, 0777)
550 3865ca48 Michael Hanselmann
    self.assertEquals(os.stat(utils.PathJoin(self.dir, "bar"))[0] & 0777, 0000)
551 3865ca48 Michael Hanselmann
552 3865ca48 Michael Hanselmann
  def tearDown(self):
553 3865ca48 Michael Hanselmann
    os.rmdir(utils.PathJoin(self.dir, "foo"))
554 3865ca48 Michael Hanselmann
    os.rmdir(utils.PathJoin(self.dir, "bar"))
555 3865ca48 Michael Hanselmann
    os.rmdir(self.dir)
556 3865ca48 Michael Hanselmann
    os.umask(self.old_umask)
557 3865ca48 Michael Hanselmann
558 3865ca48 Michael Hanselmann
559 3865ca48 Michael Hanselmann
class TestIsNormAbsPath(unittest.TestCase):
560 3865ca48 Michael Hanselmann
  """Testing case for IsNormAbsPath"""
561 3865ca48 Michael Hanselmann
562 3865ca48 Michael Hanselmann
  def _pathTestHelper(self, path, result):
563 3865ca48 Michael Hanselmann
    if result:
564 3865ca48 Michael Hanselmann
      self.assert_(utils.IsNormAbsPath(path),
565 3865ca48 Michael Hanselmann
          "Path %s should result absolute and normalized" % path)
566 3865ca48 Michael Hanselmann
    else:
567 3865ca48 Michael Hanselmann
      self.assertFalse(utils.IsNormAbsPath(path),
568 3865ca48 Michael Hanselmann
          "Path %s should not result absolute and normalized" % path)
569 3865ca48 Michael Hanselmann
570 3865ca48 Michael Hanselmann
  def testBase(self):
571 3865ca48 Michael Hanselmann
    self._pathTestHelper("/etc", True)
572 3865ca48 Michael Hanselmann
    self._pathTestHelper("/srv", True)
573 3865ca48 Michael Hanselmann
    self._pathTestHelper("etc", False)
574 3865ca48 Michael Hanselmann
    self._pathTestHelper("/etc/../root", False)
575 3865ca48 Michael Hanselmann
    self._pathTestHelper("/etc/", False)
576 3865ca48 Michael Hanselmann
577 3865ca48 Michael Hanselmann
578 3865ca48 Michael Hanselmann
class TestPathJoin(unittest.TestCase):
579 3865ca48 Michael Hanselmann
  """Testing case for PathJoin"""
580 3865ca48 Michael Hanselmann
581 3865ca48 Michael Hanselmann
  def testBasicItems(self):
582 3865ca48 Michael Hanselmann
    mlist = ["/a", "b", "c"]
583 3865ca48 Michael Hanselmann
    self.failUnlessEqual(utils.PathJoin(*mlist), "/".join(mlist))
584 3865ca48 Michael Hanselmann
585 3865ca48 Michael Hanselmann
  def testNonAbsPrefix(self):
586 3865ca48 Michael Hanselmann
    self.failUnlessRaises(ValueError, utils.PathJoin, "a", "b")
587 3865ca48 Michael Hanselmann
588 3865ca48 Michael Hanselmann
  def testBackTrack(self):
589 3865ca48 Michael Hanselmann
    self.failUnlessRaises(ValueError, utils.PathJoin, "/a", "b/../c")
590 3865ca48 Michael Hanselmann
591 3865ca48 Michael Hanselmann
  def testMultiAbs(self):
592 3865ca48 Michael Hanselmann
    self.failUnlessRaises(ValueError, utils.PathJoin, "/a", "/b")
593 3865ca48 Michael Hanselmann
594 3865ca48 Michael Hanselmann
595 3865ca48 Michael Hanselmann
class TestTailFile(testutils.GanetiTestCase):
596 3865ca48 Michael Hanselmann
  """Test case for the TailFile function"""
597 3865ca48 Michael Hanselmann
598 3865ca48 Michael Hanselmann
  def testEmpty(self):
599 3865ca48 Michael Hanselmann
    fname = self._CreateTempFile()
600 3865ca48 Michael Hanselmann
    self.failUnlessEqual(utils.TailFile(fname), [])
601 3865ca48 Michael Hanselmann
    self.failUnlessEqual(utils.TailFile(fname, lines=25), [])
602 3865ca48 Michael Hanselmann
603 3865ca48 Michael Hanselmann
  def testAllLines(self):
604 3865ca48 Michael Hanselmann
    data = ["test %d" % i for i in range(30)]
605 3865ca48 Michael Hanselmann
    for i in range(30):
606 3865ca48 Michael Hanselmann
      fname = self._CreateTempFile()
607 3865ca48 Michael Hanselmann
      fd = open(fname, "w")
608 3865ca48 Michael Hanselmann
      fd.write("\n".join(data[:i]))
609 3865ca48 Michael Hanselmann
      if i > 0:
610 3865ca48 Michael Hanselmann
        fd.write("\n")
611 3865ca48 Michael Hanselmann
      fd.close()
612 3865ca48 Michael Hanselmann
      self.failUnlessEqual(utils.TailFile(fname, lines=i), data[:i])
613 3865ca48 Michael Hanselmann
614 3865ca48 Michael Hanselmann
  def testPartialLines(self):
615 3865ca48 Michael Hanselmann
    data = ["test %d" % i for i in range(30)]
616 3865ca48 Michael Hanselmann
    fname = self._CreateTempFile()
617 3865ca48 Michael Hanselmann
    fd = open(fname, "w")
618 3865ca48 Michael Hanselmann
    fd.write("\n".join(data))
619 3865ca48 Michael Hanselmann
    fd.write("\n")
620 3865ca48 Michael Hanselmann
    fd.close()
621 3865ca48 Michael Hanselmann
    for i in range(1, 30):
622 3865ca48 Michael Hanselmann
      self.failUnlessEqual(utils.TailFile(fname, lines=i), data[-i:])
623 3865ca48 Michael Hanselmann
624 3865ca48 Michael Hanselmann
  def testBigFile(self):
625 3865ca48 Michael Hanselmann
    data = ["test %d" % i for i in range(30)]
626 3865ca48 Michael Hanselmann
    fname = self._CreateTempFile()
627 3865ca48 Michael Hanselmann
    fd = open(fname, "w")
628 3865ca48 Michael Hanselmann
    fd.write("X" * 1048576)
629 3865ca48 Michael Hanselmann
    fd.write("\n")
630 3865ca48 Michael Hanselmann
    fd.write("\n".join(data))
631 3865ca48 Michael Hanselmann
    fd.write("\n")
632 3865ca48 Michael Hanselmann
    fd.close()
633 3865ca48 Michael Hanselmann
    for i in range(1, 30):
634 3865ca48 Michael Hanselmann
      self.failUnlessEqual(utils.TailFile(fname, lines=i), data[-i:])
635 3865ca48 Michael Hanselmann
636 3865ca48 Michael Hanselmann
637 3865ca48 Michael Hanselmann
class TestPidFileFunctions(unittest.TestCase):
638 79b60c1c Michael Hanselmann
  """Tests for WritePidFile and ReadPidFile"""
639 3865ca48 Michael Hanselmann
640 3865ca48 Michael Hanselmann
  def setUp(self):
641 3865ca48 Michael Hanselmann
    self.dir = tempfile.mkdtemp()
642 3865ca48 Michael Hanselmann
    self.f_dpn = lambda name: os.path.join(self.dir, "%s.pid" % name)
643 3865ca48 Michael Hanselmann
644 3865ca48 Michael Hanselmann
  def testPidFileFunctions(self):
645 3865ca48 Michael Hanselmann
    pid_file = self.f_dpn('test')
646 3865ca48 Michael Hanselmann
    fd = utils.WritePidFile(self.f_dpn('test'))
647 3865ca48 Michael Hanselmann
    self.failUnless(os.path.exists(pid_file),
648 3865ca48 Michael Hanselmann
                    "PID file should have been created")
649 3865ca48 Michael Hanselmann
    read_pid = utils.ReadPidFile(pid_file)
650 3865ca48 Michael Hanselmann
    self.failUnlessEqual(read_pid, os.getpid())
651 3865ca48 Michael Hanselmann
    self.failUnless(utils.IsProcessAlive(read_pid))
652 3865ca48 Michael Hanselmann
    self.failUnlessRaises(errors.LockError, utils.WritePidFile,
653 3865ca48 Michael Hanselmann
                          self.f_dpn('test'))
654 3865ca48 Michael Hanselmann
    os.close(fd)
655 79b60c1c Michael Hanselmann
    utils.RemoveFile(self.f_dpn("test"))
656 3865ca48 Michael Hanselmann
    self.failIf(os.path.exists(pid_file),
657 3865ca48 Michael Hanselmann
                "PID file should not exist anymore")
658 3865ca48 Michael Hanselmann
    self.failUnlessEqual(utils.ReadPidFile(pid_file), 0,
659 3865ca48 Michael Hanselmann
                         "ReadPidFile should return 0 for missing pid file")
660 3865ca48 Michael Hanselmann
    fh = open(pid_file, "w")
661 3865ca48 Michael Hanselmann
    fh.write("blah\n")
662 3865ca48 Michael Hanselmann
    fh.close()
663 3865ca48 Michael Hanselmann
    self.failUnlessEqual(utils.ReadPidFile(pid_file), 0,
664 3865ca48 Michael Hanselmann
                         "ReadPidFile should return 0 for invalid pid file")
665 3865ca48 Michael Hanselmann
    # but now, even with the file existing, we should be able to lock it
666 3865ca48 Michael Hanselmann
    fd = utils.WritePidFile(self.f_dpn('test'))
667 3865ca48 Michael Hanselmann
    os.close(fd)
668 79b60c1c Michael Hanselmann
    utils.RemoveFile(self.f_dpn("test"))
669 3865ca48 Michael Hanselmann
    self.failIf(os.path.exists(pid_file),
670 3865ca48 Michael Hanselmann
                "PID file should not exist anymore")
671 3865ca48 Michael Hanselmann
672 3865ca48 Michael Hanselmann
  def testKill(self):
673 3865ca48 Michael Hanselmann
    pid_file = self.f_dpn('child')
674 3865ca48 Michael Hanselmann
    r_fd, w_fd = os.pipe()
675 3865ca48 Michael Hanselmann
    new_pid = os.fork()
676 3865ca48 Michael Hanselmann
    if new_pid == 0: #child
677 3865ca48 Michael Hanselmann
      utils.WritePidFile(self.f_dpn('child'))
678 3865ca48 Michael Hanselmann
      os.write(w_fd, 'a')
679 3865ca48 Michael Hanselmann
      signal.pause()
680 3865ca48 Michael Hanselmann
      os._exit(0)
681 3865ca48 Michael Hanselmann
      return
682 3865ca48 Michael Hanselmann
    # else we are in the parent
683 3865ca48 Michael Hanselmann
    # wait until the child has written the pid file
684 3865ca48 Michael Hanselmann
    os.read(r_fd, 1)
685 3865ca48 Michael Hanselmann
    read_pid = utils.ReadPidFile(pid_file)
686 3865ca48 Michael Hanselmann
    self.failUnlessEqual(read_pid, new_pid)
687 3865ca48 Michael Hanselmann
    self.failUnless(utils.IsProcessAlive(new_pid))
688 3865ca48 Michael Hanselmann
    utils.KillProcess(new_pid, waitpid=True)
689 3865ca48 Michael Hanselmann
    self.failIf(utils.IsProcessAlive(new_pid))
690 79b60c1c Michael Hanselmann
    utils.RemoveFile(self.f_dpn('child'))
691 3865ca48 Michael Hanselmann
    self.failUnlessRaises(errors.ProgrammerError, utils.KillProcess, 0)
692 3865ca48 Michael Hanselmann
693 3865ca48 Michael Hanselmann
  def tearDown(self):
694 3865ca48 Michael Hanselmann
    shutil.rmtree(self.dir)
695 3865ca48 Michael Hanselmann
696 3865ca48 Michael Hanselmann
697 3865ca48 Michael Hanselmann
class TestSshKeys(testutils.GanetiTestCase):
698 3865ca48 Michael Hanselmann
  """Test case for the AddAuthorizedKey function"""
699 3865ca48 Michael Hanselmann
700 3865ca48 Michael Hanselmann
  KEY_A = 'ssh-dss AAAAB3NzaC1w5256closdj32mZaQU root@key-a'
701 3865ca48 Michael Hanselmann
  KEY_B = ('command="/usr/bin/fooserver -t --verbose",from="198.51.100.4" '
702 3865ca48 Michael Hanselmann
           'ssh-dss AAAAB3NzaC1w520smc01ms0jfJs22 root@key-b')
703 3865ca48 Michael Hanselmann
704 3865ca48 Michael Hanselmann
  def setUp(self):
705 3865ca48 Michael Hanselmann
    testutils.GanetiTestCase.setUp(self)
706 3865ca48 Michael Hanselmann
    self.tmpname = self._CreateTempFile()
707 3865ca48 Michael Hanselmann
    handle = open(self.tmpname, 'w')
708 3865ca48 Michael Hanselmann
    try:
709 3865ca48 Michael Hanselmann
      handle.write("%s\n" % TestSshKeys.KEY_A)
710 3865ca48 Michael Hanselmann
      handle.write("%s\n" % TestSshKeys.KEY_B)
711 3865ca48 Michael Hanselmann
    finally:
712 3865ca48 Michael Hanselmann
      handle.close()
713 3865ca48 Michael Hanselmann
714 3865ca48 Michael Hanselmann
  def testAddingNewKey(self):
715 3865ca48 Michael Hanselmann
    utils.AddAuthorizedKey(self.tmpname,
716 3865ca48 Michael Hanselmann
                           'ssh-dss AAAAB3NzaC1kc3MAAACB root@test')
717 3865ca48 Michael Hanselmann
718 3865ca48 Michael Hanselmann
    self.assertFileContent(self.tmpname,
719 3865ca48 Michael Hanselmann
      "ssh-dss AAAAB3NzaC1w5256closdj32mZaQU root@key-a\n"
720 3865ca48 Michael Hanselmann
      'command="/usr/bin/fooserver -t --verbose",from="198.51.100.4"'
721 3865ca48 Michael Hanselmann
      " ssh-dss AAAAB3NzaC1w520smc01ms0jfJs22 root@key-b\n"
722 3865ca48 Michael Hanselmann
      "ssh-dss AAAAB3NzaC1kc3MAAACB root@test\n")
723 3865ca48 Michael Hanselmann
724 3865ca48 Michael Hanselmann
  def testAddingAlmostButNotCompletelyTheSameKey(self):
725 3865ca48 Michael Hanselmann
    utils.AddAuthorizedKey(self.tmpname,
726 3865ca48 Michael Hanselmann
        'ssh-dss AAAAB3NzaC1w5256closdj32mZaQU root@test')
727 3865ca48 Michael Hanselmann
728 3865ca48 Michael Hanselmann
    self.assertFileContent(self.tmpname,
729 3865ca48 Michael Hanselmann
      "ssh-dss AAAAB3NzaC1w5256closdj32mZaQU root@key-a\n"
730 3865ca48 Michael Hanselmann
      'command="/usr/bin/fooserver -t --verbose",from="198.51.100.4"'
731 3865ca48 Michael Hanselmann
      " ssh-dss AAAAB3NzaC1w520smc01ms0jfJs22 root@key-b\n"
732 3865ca48 Michael Hanselmann
      "ssh-dss AAAAB3NzaC1w5256closdj32mZaQU root@test\n")
733 3865ca48 Michael Hanselmann
734 3865ca48 Michael Hanselmann
  def testAddingExistingKeyWithSomeMoreSpaces(self):
735 3865ca48 Michael Hanselmann
    utils.AddAuthorizedKey(self.tmpname,
736 3865ca48 Michael Hanselmann
        'ssh-dss  AAAAB3NzaC1w5256closdj32mZaQU   root@key-a')
737 3865ca48 Michael Hanselmann
738 3865ca48 Michael Hanselmann
    self.assertFileContent(self.tmpname,
739 3865ca48 Michael Hanselmann
      "ssh-dss AAAAB3NzaC1w5256closdj32mZaQU root@key-a\n"
740 3865ca48 Michael Hanselmann
      'command="/usr/bin/fooserver -t --verbose",from="198.51.100.4"'
741 3865ca48 Michael Hanselmann
      " ssh-dss AAAAB3NzaC1w520smc01ms0jfJs22 root@key-b\n")
742 3865ca48 Michael Hanselmann
743 3865ca48 Michael Hanselmann
  def testRemovingExistingKeyWithSomeMoreSpaces(self):
744 3865ca48 Michael Hanselmann
    utils.RemoveAuthorizedKey(self.tmpname,
745 3865ca48 Michael Hanselmann
        'ssh-dss  AAAAB3NzaC1w5256closdj32mZaQU   root@key-a')
746 3865ca48 Michael Hanselmann
747 3865ca48 Michael Hanselmann
    self.assertFileContent(self.tmpname,
748 3865ca48 Michael Hanselmann
      'command="/usr/bin/fooserver -t --verbose",from="198.51.100.4"'
749 3865ca48 Michael Hanselmann
      " ssh-dss AAAAB3NzaC1w520smc01ms0jfJs22 root@key-b\n")
750 3865ca48 Michael Hanselmann
751 3865ca48 Michael Hanselmann
  def testRemovingNonExistingKey(self):
752 3865ca48 Michael Hanselmann
    utils.RemoveAuthorizedKey(self.tmpname,
753 3865ca48 Michael Hanselmann
        'ssh-dss  AAAAB3Nsdfj230xxjxJjsjwjsjdjU   root@test')
754 3865ca48 Michael Hanselmann
755 3865ca48 Michael Hanselmann
    self.assertFileContent(self.tmpname,
756 3865ca48 Michael Hanselmann
      "ssh-dss AAAAB3NzaC1w5256closdj32mZaQU root@key-a\n"
757 3865ca48 Michael Hanselmann
      'command="/usr/bin/fooserver -t --verbose",from="198.51.100.4"'
758 3865ca48 Michael Hanselmann
      " ssh-dss AAAAB3NzaC1w520smc01ms0jfJs22 root@key-b\n")
759 3865ca48 Michael Hanselmann
760 3865ca48 Michael Hanselmann
761 90e234a6 Michael Hanselmann
class TestNewUUID(unittest.TestCase):
762 90e234a6 Michael Hanselmann
  """Test case for NewUUID"""
763 90e234a6 Michael Hanselmann
764 90e234a6 Michael Hanselmann
  def runTest(self):
765 90e234a6 Michael Hanselmann
    self.failUnless(utils.UUID_RE.match(utils.NewUUID()))
766 90e234a6 Michael Hanselmann
767 90e234a6 Michael Hanselmann
768 3865ca48 Michael Hanselmann
if __name__ == "__main__":
769 3865ca48 Michael Hanselmann
  testutils.GanetiTestProgram()