Statistics
| Branch: | Tag: | Revision:

root / test / ganeti.utils.io_unittest.py @ 3ce9a5e7

History | View | Annotate | Download (25.1 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 1d39e245 Iustin Pop
  def testWriteSimpleUnicode(self):
262 1d39e245 Iustin Pop
    data = u"abc"
263 1d39e245 Iustin Pop
    utils.WriteFile(self.tfile.name, data=data)
264 1d39e245 Iustin Pop
    self.assertEqual(utils.ReadFile(self.tfile.name), data)
265 1d39e245 Iustin Pop
266 3865ca48 Michael Hanselmann
  def testErrors(self):
267 3865ca48 Michael Hanselmann
    self.assertRaises(errors.ProgrammerError, utils.WriteFile,
268 3865ca48 Michael Hanselmann
                      self.tfile.name, data="test", fn=lambda fd: None)
269 3865ca48 Michael Hanselmann
    self.assertRaises(errors.ProgrammerError, utils.WriteFile, self.tfile.name)
270 3865ca48 Michael Hanselmann
    self.assertRaises(errors.ProgrammerError, utils.WriteFile,
271 3865ca48 Michael Hanselmann
                      self.tfile.name, data="test", atime=0)
272 3865ca48 Michael Hanselmann
273 a9d68e40 Michael Hanselmann
  def testPreWrite(self):
274 a9d68e40 Michael Hanselmann
    utils.WriteFile(self.tfile.name, data="", prewrite=self.markPre)
275 3865ca48 Michael Hanselmann
    self.assertTrue(self.did_pre)
276 a9d68e40 Michael Hanselmann
    self.assertFalse(self.did_post)
277 a9d68e40 Michael Hanselmann
    self.assertFalse(self.did_write)
278 a9d68e40 Michael Hanselmann
279 a9d68e40 Michael Hanselmann
  def testPostWrite(self):
280 a9d68e40 Michael Hanselmann
    utils.WriteFile(self.tfile.name, data="", postwrite=self.markPost)
281 a9d68e40 Michael Hanselmann
    self.assertFalse(self.did_pre)
282 3865ca48 Michael Hanselmann
    self.assertTrue(self.did_post)
283 a9d68e40 Michael Hanselmann
    self.assertFalse(self.did_write)
284 a9d68e40 Michael Hanselmann
285 a9d68e40 Michael Hanselmann
  def testWriteFunction(self):
286 a9d68e40 Michael Hanselmann
    utils.WriteFile(self.tfile.name, fn=self.markWrite)
287 a9d68e40 Michael Hanselmann
    self.assertFalse(self.did_pre)
288 a9d68e40 Michael Hanselmann
    self.assertFalse(self.did_post)
289 3865ca48 Michael Hanselmann
    self.assertTrue(self.did_write)
290 3865ca48 Michael Hanselmann
291 3865ca48 Michael Hanselmann
  def testDryRun(self):
292 3865ca48 Michael Hanselmann
    orig = "abc"
293 3865ca48 Michael Hanselmann
    self.tfile.write(orig)
294 3865ca48 Michael Hanselmann
    self.tfile.flush()
295 3865ca48 Michael Hanselmann
    utils.WriteFile(self.tfile.name, data="hello", dry_run=True)
296 3865ca48 Michael Hanselmann
    self.assertEqual(utils.ReadFile(self.tfile.name), orig)
297 3865ca48 Michael Hanselmann
298 3865ca48 Michael Hanselmann
  def testTimes(self):
299 3865ca48 Michael Hanselmann
    f = self.tfile.name
300 3865ca48 Michael Hanselmann
    for at, mt in [(0, 0), (1000, 1000), (2000, 3000),
301 3865ca48 Michael Hanselmann
                   (int(time.time()), 5000)]:
302 3865ca48 Michael Hanselmann
      utils.WriteFile(f, data="hello", atime=at, mtime=mt)
303 3865ca48 Michael Hanselmann
      st = os.stat(f)
304 3865ca48 Michael Hanselmann
      self.assertEqual(st.st_atime, at)
305 3865ca48 Michael Hanselmann
      self.assertEqual(st.st_mtime, mt)
306 3865ca48 Michael Hanselmann
307 3865ca48 Michael Hanselmann
  def testNoClose(self):
308 3865ca48 Michael Hanselmann
    data = "hello"
309 3865ca48 Michael Hanselmann
    self.assertEqual(utils.WriteFile(self.tfile.name, data="abc"), None)
310 3865ca48 Michael Hanselmann
    fd = utils.WriteFile(self.tfile.name, data=data, close=False)
311 3865ca48 Michael Hanselmann
    try:
312 3865ca48 Michael Hanselmann
      os.lseek(fd, 0, 0)
313 3865ca48 Michael Hanselmann
      self.assertEqual(os.read(fd, 4096), data)
314 3865ca48 Michael Hanselmann
    finally:
315 3865ca48 Michael Hanselmann
      os.close(fd)
316 3865ca48 Michael Hanselmann
317 a9d68e40 Michael Hanselmann
  def testNoLeftovers(self):
318 a9d68e40 Michael Hanselmann
    self.tmpdir = tempfile.mkdtemp()
319 a9d68e40 Michael Hanselmann
    self.assertEqual(utils.WriteFile(utils.PathJoin(self.tmpdir, "test"),
320 a9d68e40 Michael Hanselmann
                                     data="abc"),
321 a9d68e40 Michael Hanselmann
                     None)
322 a9d68e40 Michael Hanselmann
    self.assertEqual(os.listdir(self.tmpdir), ["test"])
323 a9d68e40 Michael Hanselmann
324 a9d68e40 Michael Hanselmann
  def testFailRename(self):
325 a9d68e40 Michael Hanselmann
    self.tmpdir = tempfile.mkdtemp()
326 a9d68e40 Michael Hanselmann
    target = utils.PathJoin(self.tmpdir, "target")
327 a9d68e40 Michael Hanselmann
    os.mkdir(target)
328 a9d68e40 Michael Hanselmann
    self.assertRaises(OSError, utils.WriteFile, target, data="abc")
329 a9d68e40 Michael Hanselmann
    self.assertTrue(os.path.isdir(target))
330 a9d68e40 Michael Hanselmann
    self.assertEqual(os.listdir(self.tmpdir), ["target"])
331 a9d68e40 Michael Hanselmann
    self.assertFalse(os.listdir(target))
332 a9d68e40 Michael Hanselmann
333 a9d68e40 Michael Hanselmann
  def testFailRenameDryRun(self):
334 a9d68e40 Michael Hanselmann
    self.tmpdir = tempfile.mkdtemp()
335 a9d68e40 Michael Hanselmann
    target = utils.PathJoin(self.tmpdir, "target")
336 a9d68e40 Michael Hanselmann
    os.mkdir(target)
337 a9d68e40 Michael Hanselmann
    self.assertEqual(utils.WriteFile(target, data="abc", dry_run=True), None)
338 a9d68e40 Michael Hanselmann
    self.assertTrue(os.path.isdir(target))
339 a9d68e40 Michael Hanselmann
    self.assertEqual(os.listdir(self.tmpdir), ["target"])
340 a9d68e40 Michael Hanselmann
    self.assertFalse(os.listdir(target))
341 a9d68e40 Michael Hanselmann
342 a9d68e40 Michael Hanselmann
  def testBackup(self):
343 a9d68e40 Michael Hanselmann
    self.tmpdir = tempfile.mkdtemp()
344 a9d68e40 Michael Hanselmann
    testfile = utils.PathJoin(self.tmpdir, "test")
345 a9d68e40 Michael Hanselmann
346 a9d68e40 Michael Hanselmann
    self.assertEqual(utils.WriteFile(testfile, data="foo", backup=True), None)
347 a9d68e40 Michael Hanselmann
    self.assertEqual(utils.ReadFile(testfile), "foo")
348 a9d68e40 Michael Hanselmann
    self.assertEqual(os.listdir(self.tmpdir), ["test"])
349 a9d68e40 Michael Hanselmann
350 a9d68e40 Michael Hanselmann
    # Write again
351 a9d68e40 Michael Hanselmann
    assert os.path.isfile(testfile)
352 a9d68e40 Michael Hanselmann
    self.assertEqual(utils.WriteFile(testfile, data="bar", backup=True), None)
353 a9d68e40 Michael Hanselmann
    self.assertEqual(utils.ReadFile(testfile), "bar")
354 a9d68e40 Michael Hanselmann
    self.assertEqual(len(glob.glob("%s.backup*" % testfile)), 1)
355 a9d68e40 Michael Hanselmann
    self.assertTrue("test" in os.listdir(self.tmpdir))
356 a9d68e40 Michael Hanselmann
    self.assertEqual(len(os.listdir(self.tmpdir)), 2)
357 a9d68e40 Michael Hanselmann
358 a9d68e40 Michael Hanselmann
    # Write again as dry-run
359 a9d68e40 Michael Hanselmann
    assert os.path.isfile(testfile)
360 a9d68e40 Michael Hanselmann
    self.assertEqual(utils.WriteFile(testfile, data="000", backup=True,
361 a9d68e40 Michael Hanselmann
                                     dry_run=True),
362 a9d68e40 Michael Hanselmann
                     None)
363 a9d68e40 Michael Hanselmann
    self.assertEqual(utils.ReadFile(testfile), "bar")
364 a9d68e40 Michael Hanselmann
    self.assertEqual(len(glob.glob("%s.backup*" % testfile)), 1)
365 a9d68e40 Michael Hanselmann
    self.assertTrue("test" in os.listdir(self.tmpdir))
366 a9d68e40 Michael Hanselmann
    self.assertEqual(len(os.listdir(self.tmpdir)), 2)
367 a9d68e40 Michael Hanselmann
368 3865ca48 Michael Hanselmann
369 3865ca48 Michael Hanselmann
class TestFileID(testutils.GanetiTestCase):
370 3865ca48 Michael Hanselmann
  def testEquality(self):
371 3865ca48 Michael Hanselmann
    name = self._CreateTempFile()
372 3865ca48 Michael Hanselmann
    oldi = utils.GetFileID(path=name)
373 3865ca48 Michael Hanselmann
    self.failUnless(utils.VerifyFileID(oldi, oldi))
374 3865ca48 Michael Hanselmann
375 3865ca48 Michael Hanselmann
  def testUpdate(self):
376 3865ca48 Michael Hanselmann
    name = self._CreateTempFile()
377 3865ca48 Michael Hanselmann
    oldi = utils.GetFileID(path=name)
378 3865ca48 Michael Hanselmann
    os.utime(name, None)
379 3865ca48 Michael Hanselmann
    fd = os.open(name, os.O_RDWR)
380 3865ca48 Michael Hanselmann
    try:
381 3865ca48 Michael Hanselmann
      newi = utils.GetFileID(fd=fd)
382 3865ca48 Michael Hanselmann
      self.failUnless(utils.VerifyFileID(oldi, newi))
383 3865ca48 Michael Hanselmann
      self.failUnless(utils.VerifyFileID(newi, oldi))
384 3865ca48 Michael Hanselmann
    finally:
385 3865ca48 Michael Hanselmann
      os.close(fd)
386 3865ca48 Michael Hanselmann
387 3865ca48 Michael Hanselmann
  def testWriteFile(self):
388 3865ca48 Michael Hanselmann
    name = self._CreateTempFile()
389 3865ca48 Michael Hanselmann
    oldi = utils.GetFileID(path=name)
390 3865ca48 Michael Hanselmann
    mtime = oldi[2]
391 3865ca48 Michael Hanselmann
    os.utime(name, (mtime + 10, mtime + 10))
392 3865ca48 Michael Hanselmann
    self.assertRaises(errors.LockError, utils.SafeWriteFile, name,
393 3865ca48 Michael Hanselmann
                      oldi, data="")
394 3865ca48 Michael Hanselmann
    os.utime(name, (mtime - 10, mtime - 10))
395 3865ca48 Michael Hanselmann
    utils.SafeWriteFile(name, oldi, data="")
396 3865ca48 Michael Hanselmann
    oldi = utils.GetFileID(path=name)
397 3865ca48 Michael Hanselmann
    mtime = oldi[2]
398 3865ca48 Michael Hanselmann
    os.utime(name, (mtime + 10, mtime + 10))
399 3865ca48 Michael Hanselmann
    # this doesn't raise, since we passed None
400 3865ca48 Michael Hanselmann
    utils.SafeWriteFile(name, None, data="")
401 3865ca48 Michael Hanselmann
402 3865ca48 Michael Hanselmann
  def testError(self):
403 3865ca48 Michael Hanselmann
    t = tempfile.NamedTemporaryFile()
404 3865ca48 Michael Hanselmann
    self.assertRaises(errors.ProgrammerError, utils.GetFileID,
405 3865ca48 Michael Hanselmann
                      path=t.name, fd=t.fileno())
406 3865ca48 Michael Hanselmann
407 3865ca48 Michael Hanselmann
408 3865ca48 Michael Hanselmann
class TestRemoveFile(unittest.TestCase):
409 3865ca48 Michael Hanselmann
  """Test case for the RemoveFile function"""
410 3865ca48 Michael Hanselmann
411 3865ca48 Michael Hanselmann
  def setUp(self):
412 3865ca48 Michael Hanselmann
    """Create a temp dir and file for each case"""
413 3865ca48 Michael Hanselmann
    self.tmpdir = tempfile.mkdtemp('', 'ganeti-unittest-')
414 3865ca48 Michael Hanselmann
    fd, self.tmpfile = tempfile.mkstemp('', '', self.tmpdir)
415 3865ca48 Michael Hanselmann
    os.close(fd)
416 3865ca48 Michael Hanselmann
417 3865ca48 Michael Hanselmann
  def tearDown(self):
418 3865ca48 Michael Hanselmann
    if os.path.exists(self.tmpfile):
419 3865ca48 Michael Hanselmann
      os.unlink(self.tmpfile)
420 3865ca48 Michael Hanselmann
    os.rmdir(self.tmpdir)
421 3865ca48 Michael Hanselmann
422 3865ca48 Michael Hanselmann
  def testIgnoreDirs(self):
423 3865ca48 Michael Hanselmann
    """Test that RemoveFile() ignores directories"""
424 3865ca48 Michael Hanselmann
    self.assertEqual(None, utils.RemoveFile(self.tmpdir))
425 3865ca48 Michael Hanselmann
426 3865ca48 Michael Hanselmann
  def testIgnoreNotExisting(self):
427 3865ca48 Michael Hanselmann
    """Test that RemoveFile() ignores non-existing files"""
428 3865ca48 Michael Hanselmann
    utils.RemoveFile(self.tmpfile)
429 3865ca48 Michael Hanselmann
    utils.RemoveFile(self.tmpfile)
430 3865ca48 Michael Hanselmann
431 3865ca48 Michael Hanselmann
  def testRemoveFile(self):
432 3865ca48 Michael Hanselmann
    """Test that RemoveFile does remove a file"""
433 3865ca48 Michael Hanselmann
    utils.RemoveFile(self.tmpfile)
434 3865ca48 Michael Hanselmann
    if os.path.exists(self.tmpfile):
435 3865ca48 Michael Hanselmann
      self.fail("File '%s' not removed" % self.tmpfile)
436 3865ca48 Michael Hanselmann
437 3865ca48 Michael Hanselmann
  def testRemoveSymlink(self):
438 3865ca48 Michael Hanselmann
    """Test that RemoveFile does remove symlinks"""
439 3865ca48 Michael Hanselmann
    symlink = self.tmpdir + "/symlink"
440 3865ca48 Michael Hanselmann
    os.symlink("no-such-file", symlink)
441 3865ca48 Michael Hanselmann
    utils.RemoveFile(symlink)
442 3865ca48 Michael Hanselmann
    if os.path.exists(symlink):
443 3865ca48 Michael Hanselmann
      self.fail("File '%s' not removed" % symlink)
444 3865ca48 Michael Hanselmann
    os.symlink(self.tmpfile, symlink)
445 3865ca48 Michael Hanselmann
    utils.RemoveFile(symlink)
446 3865ca48 Michael Hanselmann
    if os.path.exists(symlink):
447 3865ca48 Michael Hanselmann
      self.fail("File '%s' not removed" % symlink)
448 3865ca48 Michael Hanselmann
449 3865ca48 Michael Hanselmann
450 3865ca48 Michael Hanselmann
class TestRemoveDir(unittest.TestCase):
451 3865ca48 Michael Hanselmann
  def setUp(self):
452 3865ca48 Michael Hanselmann
    self.tmpdir = tempfile.mkdtemp()
453 3865ca48 Michael Hanselmann
454 3865ca48 Michael Hanselmann
  def tearDown(self):
455 3865ca48 Michael Hanselmann
    try:
456 3865ca48 Michael Hanselmann
      shutil.rmtree(self.tmpdir)
457 3865ca48 Michael Hanselmann
    except EnvironmentError:
458 3865ca48 Michael Hanselmann
      pass
459 3865ca48 Michael Hanselmann
460 3865ca48 Michael Hanselmann
  def testEmptyDir(self):
461 3865ca48 Michael Hanselmann
    utils.RemoveDir(self.tmpdir)
462 3865ca48 Michael Hanselmann
    self.assertFalse(os.path.isdir(self.tmpdir))
463 3865ca48 Michael Hanselmann
464 3865ca48 Michael Hanselmann
  def testNonEmptyDir(self):
465 3865ca48 Michael Hanselmann
    self.tmpfile = os.path.join(self.tmpdir, "test1")
466 3865ca48 Michael Hanselmann
    open(self.tmpfile, "w").close()
467 3865ca48 Michael Hanselmann
    self.assertRaises(EnvironmentError, utils.RemoveDir, self.tmpdir)
468 3865ca48 Michael Hanselmann
469 3865ca48 Michael Hanselmann
470 3865ca48 Michael Hanselmann
class TestRename(unittest.TestCase):
471 3865ca48 Michael Hanselmann
  """Test case for RenameFile"""
472 3865ca48 Michael Hanselmann
473 3865ca48 Michael Hanselmann
  def setUp(self):
474 3865ca48 Michael Hanselmann
    """Create a temporary directory"""
475 3865ca48 Michael Hanselmann
    self.tmpdir = tempfile.mkdtemp()
476 3865ca48 Michael Hanselmann
    self.tmpfile = os.path.join(self.tmpdir, "test1")
477 3865ca48 Michael Hanselmann
478 3865ca48 Michael Hanselmann
    # Touch the file
479 3865ca48 Michael Hanselmann
    open(self.tmpfile, "w").close()
480 3865ca48 Michael Hanselmann
481 3865ca48 Michael Hanselmann
  def tearDown(self):
482 3865ca48 Michael Hanselmann
    """Remove temporary directory"""
483 3865ca48 Michael Hanselmann
    shutil.rmtree(self.tmpdir)
484 3865ca48 Michael Hanselmann
485 3865ca48 Michael Hanselmann
  def testSimpleRename1(self):
486 3865ca48 Michael Hanselmann
    """Simple rename 1"""
487 3865ca48 Michael Hanselmann
    utils.RenameFile(self.tmpfile, os.path.join(self.tmpdir, "xyz"))
488 3865ca48 Michael Hanselmann
    self.assert_(os.path.isfile(os.path.join(self.tmpdir, "xyz")))
489 3865ca48 Michael Hanselmann
490 3865ca48 Michael Hanselmann
  def testSimpleRename2(self):
491 3865ca48 Michael Hanselmann
    """Simple rename 2"""
492 3865ca48 Michael Hanselmann
    utils.RenameFile(self.tmpfile, os.path.join(self.tmpdir, "xyz"),
493 3865ca48 Michael Hanselmann
                     mkdir=True)
494 3865ca48 Michael Hanselmann
    self.assert_(os.path.isfile(os.path.join(self.tmpdir, "xyz")))
495 3865ca48 Michael Hanselmann
496 3865ca48 Michael Hanselmann
  def testRenameMkdir(self):
497 3865ca48 Michael Hanselmann
    """Rename with mkdir"""
498 3865ca48 Michael Hanselmann
    utils.RenameFile(self.tmpfile, os.path.join(self.tmpdir, "test/xyz"),
499 3865ca48 Michael Hanselmann
                     mkdir=True)
500 3865ca48 Michael Hanselmann
    self.assert_(os.path.isdir(os.path.join(self.tmpdir, "test")))
501 3865ca48 Michael Hanselmann
    self.assert_(os.path.isfile(os.path.join(self.tmpdir, "test/xyz")))
502 3865ca48 Michael Hanselmann
503 3865ca48 Michael Hanselmann
    utils.RenameFile(os.path.join(self.tmpdir, "test/xyz"),
504 3865ca48 Michael Hanselmann
                     os.path.join(self.tmpdir, "test/foo/bar/baz"),
505 3865ca48 Michael Hanselmann
                     mkdir=True)
506 3865ca48 Michael Hanselmann
    self.assert_(os.path.isdir(os.path.join(self.tmpdir, "test")))
507 3865ca48 Michael Hanselmann
    self.assert_(os.path.isdir(os.path.join(self.tmpdir, "test/foo/bar")))
508 3865ca48 Michael Hanselmann
    self.assert_(os.path.isfile(os.path.join(self.tmpdir, "test/foo/bar/baz")))
509 3865ca48 Michael Hanselmann
510 3865ca48 Michael Hanselmann
511 3865ca48 Michael Hanselmann
class TestMakedirs(unittest.TestCase):
512 3865ca48 Michael Hanselmann
  def setUp(self):
513 3865ca48 Michael Hanselmann
    self.tmpdir = tempfile.mkdtemp()
514 3865ca48 Michael Hanselmann
515 3865ca48 Michael Hanselmann
  def tearDown(self):
516 3865ca48 Michael Hanselmann
    shutil.rmtree(self.tmpdir)
517 3865ca48 Michael Hanselmann
518 3865ca48 Michael Hanselmann
  def testNonExisting(self):
519 3865ca48 Michael Hanselmann
    path = utils.PathJoin(self.tmpdir, "foo")
520 3865ca48 Michael Hanselmann
    utils.Makedirs(path)
521 3865ca48 Michael Hanselmann
    self.assert_(os.path.isdir(path))
522 3865ca48 Michael Hanselmann
523 3865ca48 Michael Hanselmann
  def testExisting(self):
524 3865ca48 Michael Hanselmann
    path = utils.PathJoin(self.tmpdir, "foo")
525 3865ca48 Michael Hanselmann
    os.mkdir(path)
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 testRecursiveNonExisting(self):
530 3865ca48 Michael Hanselmann
    path = utils.PathJoin(self.tmpdir, "foo/bar/baz")
531 3865ca48 Michael Hanselmann
    utils.Makedirs(path)
532 3865ca48 Michael Hanselmann
    self.assert_(os.path.isdir(path))
533 3865ca48 Michael Hanselmann
534 3865ca48 Michael Hanselmann
  def testRecursiveExisting(self):
535 3865ca48 Michael Hanselmann
    path = utils.PathJoin(self.tmpdir, "B/moo/xyz")
536 3865ca48 Michael Hanselmann
    self.assertFalse(os.path.exists(path))
537 3865ca48 Michael Hanselmann
    os.mkdir(utils.PathJoin(self.tmpdir, "B"))
538 3865ca48 Michael Hanselmann
    utils.Makedirs(path)
539 3865ca48 Michael Hanselmann
    self.assert_(os.path.isdir(path))
540 3865ca48 Michael Hanselmann
541 3865ca48 Michael Hanselmann
542 3865ca48 Michael Hanselmann
class TestEnsureDirs(unittest.TestCase):
543 3865ca48 Michael Hanselmann
  """Tests for EnsureDirs"""
544 3865ca48 Michael Hanselmann
545 3865ca48 Michael Hanselmann
  def setUp(self):
546 3865ca48 Michael Hanselmann
    self.dir = tempfile.mkdtemp()
547 3865ca48 Michael Hanselmann
    self.old_umask = os.umask(0777)
548 3865ca48 Michael Hanselmann
549 3865ca48 Michael Hanselmann
  def testEnsureDirs(self):
550 3865ca48 Michael Hanselmann
    utils.EnsureDirs([
551 3865ca48 Michael Hanselmann
        (utils.PathJoin(self.dir, "foo"), 0777),
552 3865ca48 Michael Hanselmann
        (utils.PathJoin(self.dir, "bar"), 0000),
553 3865ca48 Michael Hanselmann
        ])
554 3865ca48 Michael Hanselmann
    self.assertEquals(os.stat(utils.PathJoin(self.dir, "foo"))[0] & 0777, 0777)
555 3865ca48 Michael Hanselmann
    self.assertEquals(os.stat(utils.PathJoin(self.dir, "bar"))[0] & 0777, 0000)
556 3865ca48 Michael Hanselmann
557 3865ca48 Michael Hanselmann
  def tearDown(self):
558 3865ca48 Michael Hanselmann
    os.rmdir(utils.PathJoin(self.dir, "foo"))
559 3865ca48 Michael Hanselmann
    os.rmdir(utils.PathJoin(self.dir, "bar"))
560 3865ca48 Michael Hanselmann
    os.rmdir(self.dir)
561 3865ca48 Michael Hanselmann
    os.umask(self.old_umask)
562 3865ca48 Michael Hanselmann
563 3865ca48 Michael Hanselmann
564 3865ca48 Michael Hanselmann
class TestIsNormAbsPath(unittest.TestCase):
565 3865ca48 Michael Hanselmann
  """Testing case for IsNormAbsPath"""
566 3865ca48 Michael Hanselmann
567 3865ca48 Michael Hanselmann
  def _pathTestHelper(self, path, result):
568 3865ca48 Michael Hanselmann
    if result:
569 3865ca48 Michael Hanselmann
      self.assert_(utils.IsNormAbsPath(path),
570 3865ca48 Michael Hanselmann
          "Path %s should result absolute and normalized" % path)
571 3865ca48 Michael Hanselmann
    else:
572 3865ca48 Michael Hanselmann
      self.assertFalse(utils.IsNormAbsPath(path),
573 3865ca48 Michael Hanselmann
          "Path %s should not result absolute and normalized" % path)
574 3865ca48 Michael Hanselmann
575 3865ca48 Michael Hanselmann
  def testBase(self):
576 3865ca48 Michael Hanselmann
    self._pathTestHelper("/etc", True)
577 3865ca48 Michael Hanselmann
    self._pathTestHelper("/srv", True)
578 3865ca48 Michael Hanselmann
    self._pathTestHelper("etc", False)
579 3865ca48 Michael Hanselmann
    self._pathTestHelper("/etc/../root", False)
580 3865ca48 Michael Hanselmann
    self._pathTestHelper("/etc/", False)
581 3865ca48 Michael Hanselmann
582 3865ca48 Michael Hanselmann
583 3865ca48 Michael Hanselmann
class TestPathJoin(unittest.TestCase):
584 3865ca48 Michael Hanselmann
  """Testing case for PathJoin"""
585 3865ca48 Michael Hanselmann
586 3865ca48 Michael Hanselmann
  def testBasicItems(self):
587 3865ca48 Michael Hanselmann
    mlist = ["/a", "b", "c"]
588 3865ca48 Michael Hanselmann
    self.failUnlessEqual(utils.PathJoin(*mlist), "/".join(mlist))
589 3865ca48 Michael Hanselmann
590 3865ca48 Michael Hanselmann
  def testNonAbsPrefix(self):
591 3865ca48 Michael Hanselmann
    self.failUnlessRaises(ValueError, utils.PathJoin, "a", "b")
592 3865ca48 Michael Hanselmann
593 3865ca48 Michael Hanselmann
  def testBackTrack(self):
594 3865ca48 Michael Hanselmann
    self.failUnlessRaises(ValueError, utils.PathJoin, "/a", "b/../c")
595 3865ca48 Michael Hanselmann
596 3865ca48 Michael Hanselmann
  def testMultiAbs(self):
597 3865ca48 Michael Hanselmann
    self.failUnlessRaises(ValueError, utils.PathJoin, "/a", "/b")
598 3865ca48 Michael Hanselmann
599 3865ca48 Michael Hanselmann
600 3865ca48 Michael Hanselmann
class TestTailFile(testutils.GanetiTestCase):
601 3865ca48 Michael Hanselmann
  """Test case for the TailFile function"""
602 3865ca48 Michael Hanselmann
603 3865ca48 Michael Hanselmann
  def testEmpty(self):
604 3865ca48 Michael Hanselmann
    fname = self._CreateTempFile()
605 3865ca48 Michael Hanselmann
    self.failUnlessEqual(utils.TailFile(fname), [])
606 3865ca48 Michael Hanselmann
    self.failUnlessEqual(utils.TailFile(fname, lines=25), [])
607 3865ca48 Michael Hanselmann
608 3865ca48 Michael Hanselmann
  def testAllLines(self):
609 3865ca48 Michael Hanselmann
    data = ["test %d" % i for i in range(30)]
610 3865ca48 Michael Hanselmann
    for i in range(30):
611 3865ca48 Michael Hanselmann
      fname = self._CreateTempFile()
612 3865ca48 Michael Hanselmann
      fd = open(fname, "w")
613 3865ca48 Michael Hanselmann
      fd.write("\n".join(data[:i]))
614 3865ca48 Michael Hanselmann
      if i > 0:
615 3865ca48 Michael Hanselmann
        fd.write("\n")
616 3865ca48 Michael Hanselmann
      fd.close()
617 3865ca48 Michael Hanselmann
      self.failUnlessEqual(utils.TailFile(fname, lines=i), data[:i])
618 3865ca48 Michael Hanselmann
619 3865ca48 Michael Hanselmann
  def testPartialLines(self):
620 3865ca48 Michael Hanselmann
    data = ["test %d" % i for i in range(30)]
621 3865ca48 Michael Hanselmann
    fname = self._CreateTempFile()
622 3865ca48 Michael Hanselmann
    fd = open(fname, "w")
623 3865ca48 Michael Hanselmann
    fd.write("\n".join(data))
624 3865ca48 Michael Hanselmann
    fd.write("\n")
625 3865ca48 Michael Hanselmann
    fd.close()
626 3865ca48 Michael Hanselmann
    for i in range(1, 30):
627 3865ca48 Michael Hanselmann
      self.failUnlessEqual(utils.TailFile(fname, lines=i), data[-i:])
628 3865ca48 Michael Hanselmann
629 3865ca48 Michael Hanselmann
  def testBigFile(self):
630 3865ca48 Michael Hanselmann
    data = ["test %d" % i for i in range(30)]
631 3865ca48 Michael Hanselmann
    fname = self._CreateTempFile()
632 3865ca48 Michael Hanselmann
    fd = open(fname, "w")
633 3865ca48 Michael Hanselmann
    fd.write("X" * 1048576)
634 3865ca48 Michael Hanselmann
    fd.write("\n")
635 3865ca48 Michael Hanselmann
    fd.write("\n".join(data))
636 3865ca48 Michael Hanselmann
    fd.write("\n")
637 3865ca48 Michael Hanselmann
    fd.close()
638 3865ca48 Michael Hanselmann
    for i in range(1, 30):
639 3865ca48 Michael Hanselmann
      self.failUnlessEqual(utils.TailFile(fname, lines=i), data[-i:])
640 3865ca48 Michael Hanselmann
641 3865ca48 Michael Hanselmann
642 3865ca48 Michael Hanselmann
class TestPidFileFunctions(unittest.TestCase):
643 79b60c1c Michael Hanselmann
  """Tests for WritePidFile and ReadPidFile"""
644 3865ca48 Michael Hanselmann
645 3865ca48 Michael Hanselmann
  def setUp(self):
646 3865ca48 Michael Hanselmann
    self.dir = tempfile.mkdtemp()
647 3865ca48 Michael Hanselmann
    self.f_dpn = lambda name: os.path.join(self.dir, "%s.pid" % name)
648 3865ca48 Michael Hanselmann
649 3865ca48 Michael Hanselmann
  def testPidFileFunctions(self):
650 3865ca48 Michael Hanselmann
    pid_file = self.f_dpn('test')
651 3865ca48 Michael Hanselmann
    fd = utils.WritePidFile(self.f_dpn('test'))
652 3865ca48 Michael Hanselmann
    self.failUnless(os.path.exists(pid_file),
653 3865ca48 Michael Hanselmann
                    "PID file should have been created")
654 3865ca48 Michael Hanselmann
    read_pid = utils.ReadPidFile(pid_file)
655 3865ca48 Michael Hanselmann
    self.failUnlessEqual(read_pid, os.getpid())
656 3865ca48 Michael Hanselmann
    self.failUnless(utils.IsProcessAlive(read_pid))
657 3865ca48 Michael Hanselmann
    self.failUnlessRaises(errors.LockError, utils.WritePidFile,
658 3865ca48 Michael Hanselmann
                          self.f_dpn('test'))
659 3865ca48 Michael Hanselmann
    os.close(fd)
660 79b60c1c Michael Hanselmann
    utils.RemoveFile(self.f_dpn("test"))
661 3865ca48 Michael Hanselmann
    self.failIf(os.path.exists(pid_file),
662 3865ca48 Michael Hanselmann
                "PID file should not exist anymore")
663 3865ca48 Michael Hanselmann
    self.failUnlessEqual(utils.ReadPidFile(pid_file), 0,
664 3865ca48 Michael Hanselmann
                         "ReadPidFile should return 0 for missing pid file")
665 3865ca48 Michael Hanselmann
    fh = open(pid_file, "w")
666 3865ca48 Michael Hanselmann
    fh.write("blah\n")
667 3865ca48 Michael Hanselmann
    fh.close()
668 3865ca48 Michael Hanselmann
    self.failUnlessEqual(utils.ReadPidFile(pid_file), 0,
669 3865ca48 Michael Hanselmann
                         "ReadPidFile should return 0 for invalid pid file")
670 3865ca48 Michael Hanselmann
    # but now, even with the file existing, we should be able to lock it
671 3865ca48 Michael Hanselmann
    fd = utils.WritePidFile(self.f_dpn('test'))
672 3865ca48 Michael Hanselmann
    os.close(fd)
673 79b60c1c Michael Hanselmann
    utils.RemoveFile(self.f_dpn("test"))
674 3865ca48 Michael Hanselmann
    self.failIf(os.path.exists(pid_file),
675 3865ca48 Michael Hanselmann
                "PID file should not exist anymore")
676 3865ca48 Michael Hanselmann
677 3865ca48 Michael Hanselmann
  def testKill(self):
678 3865ca48 Michael Hanselmann
    pid_file = self.f_dpn('child')
679 3865ca48 Michael Hanselmann
    r_fd, w_fd = os.pipe()
680 3865ca48 Michael Hanselmann
    new_pid = os.fork()
681 3865ca48 Michael Hanselmann
    if new_pid == 0: #child
682 3865ca48 Michael Hanselmann
      utils.WritePidFile(self.f_dpn('child'))
683 3865ca48 Michael Hanselmann
      os.write(w_fd, 'a')
684 3865ca48 Michael Hanselmann
      signal.pause()
685 3865ca48 Michael Hanselmann
      os._exit(0)
686 3865ca48 Michael Hanselmann
      return
687 3865ca48 Michael Hanselmann
    # else we are in the parent
688 3865ca48 Michael Hanselmann
    # wait until the child has written the pid file
689 3865ca48 Michael Hanselmann
    os.read(r_fd, 1)
690 3865ca48 Michael Hanselmann
    read_pid = utils.ReadPidFile(pid_file)
691 3865ca48 Michael Hanselmann
    self.failUnlessEqual(read_pid, new_pid)
692 3865ca48 Michael Hanselmann
    self.failUnless(utils.IsProcessAlive(new_pid))
693 3865ca48 Michael Hanselmann
    utils.KillProcess(new_pid, waitpid=True)
694 3865ca48 Michael Hanselmann
    self.failIf(utils.IsProcessAlive(new_pid))
695 79b60c1c Michael Hanselmann
    utils.RemoveFile(self.f_dpn('child'))
696 3865ca48 Michael Hanselmann
    self.failUnlessRaises(errors.ProgrammerError, utils.KillProcess, 0)
697 3865ca48 Michael Hanselmann
698 3865ca48 Michael Hanselmann
  def tearDown(self):
699 3865ca48 Michael Hanselmann
    shutil.rmtree(self.dir)
700 3865ca48 Michael Hanselmann
701 3865ca48 Michael Hanselmann
702 3865ca48 Michael Hanselmann
class TestSshKeys(testutils.GanetiTestCase):
703 3865ca48 Michael Hanselmann
  """Test case for the AddAuthorizedKey function"""
704 3865ca48 Michael Hanselmann
705 3865ca48 Michael Hanselmann
  KEY_A = 'ssh-dss AAAAB3NzaC1w5256closdj32mZaQU root@key-a'
706 3865ca48 Michael Hanselmann
  KEY_B = ('command="/usr/bin/fooserver -t --verbose",from="198.51.100.4" '
707 3865ca48 Michael Hanselmann
           'ssh-dss AAAAB3NzaC1w520smc01ms0jfJs22 root@key-b')
708 3865ca48 Michael Hanselmann
709 3865ca48 Michael Hanselmann
  def setUp(self):
710 3865ca48 Michael Hanselmann
    testutils.GanetiTestCase.setUp(self)
711 3865ca48 Michael Hanselmann
    self.tmpname = self._CreateTempFile()
712 3865ca48 Michael Hanselmann
    handle = open(self.tmpname, 'w')
713 3865ca48 Michael Hanselmann
    try:
714 3865ca48 Michael Hanselmann
      handle.write("%s\n" % TestSshKeys.KEY_A)
715 3865ca48 Michael Hanselmann
      handle.write("%s\n" % TestSshKeys.KEY_B)
716 3865ca48 Michael Hanselmann
    finally:
717 3865ca48 Michael Hanselmann
      handle.close()
718 3865ca48 Michael Hanselmann
719 3865ca48 Michael Hanselmann
  def testAddingNewKey(self):
720 3865ca48 Michael Hanselmann
    utils.AddAuthorizedKey(self.tmpname,
721 3865ca48 Michael Hanselmann
                           'ssh-dss AAAAB3NzaC1kc3MAAACB root@test')
722 3865ca48 Michael Hanselmann
723 3865ca48 Michael Hanselmann
    self.assertFileContent(self.tmpname,
724 3865ca48 Michael Hanselmann
      "ssh-dss AAAAB3NzaC1w5256closdj32mZaQU root@key-a\n"
725 3865ca48 Michael Hanselmann
      'command="/usr/bin/fooserver -t --verbose",from="198.51.100.4"'
726 3865ca48 Michael Hanselmann
      " ssh-dss AAAAB3NzaC1w520smc01ms0jfJs22 root@key-b\n"
727 3865ca48 Michael Hanselmann
      "ssh-dss AAAAB3NzaC1kc3MAAACB root@test\n")
728 3865ca48 Michael Hanselmann
729 3865ca48 Michael Hanselmann
  def testAddingAlmostButNotCompletelyTheSameKey(self):
730 3865ca48 Michael Hanselmann
    utils.AddAuthorizedKey(self.tmpname,
731 3865ca48 Michael Hanselmann
        'ssh-dss AAAAB3NzaC1w5256closdj32mZaQU root@test')
732 3865ca48 Michael Hanselmann
733 3865ca48 Michael Hanselmann
    self.assertFileContent(self.tmpname,
734 3865ca48 Michael Hanselmann
      "ssh-dss AAAAB3NzaC1w5256closdj32mZaQU root@key-a\n"
735 3865ca48 Michael Hanselmann
      'command="/usr/bin/fooserver -t --verbose",from="198.51.100.4"'
736 3865ca48 Michael Hanselmann
      " ssh-dss AAAAB3NzaC1w520smc01ms0jfJs22 root@key-b\n"
737 3865ca48 Michael Hanselmann
      "ssh-dss AAAAB3NzaC1w5256closdj32mZaQU root@test\n")
738 3865ca48 Michael Hanselmann
739 3865ca48 Michael Hanselmann
  def testAddingExistingKeyWithSomeMoreSpaces(self):
740 3865ca48 Michael Hanselmann
    utils.AddAuthorizedKey(self.tmpname,
741 3865ca48 Michael Hanselmann
        'ssh-dss  AAAAB3NzaC1w5256closdj32mZaQU   root@key-a')
742 3865ca48 Michael Hanselmann
743 3865ca48 Michael Hanselmann
    self.assertFileContent(self.tmpname,
744 3865ca48 Michael Hanselmann
      "ssh-dss AAAAB3NzaC1w5256closdj32mZaQU root@key-a\n"
745 3865ca48 Michael Hanselmann
      'command="/usr/bin/fooserver -t --verbose",from="198.51.100.4"'
746 3865ca48 Michael Hanselmann
      " ssh-dss AAAAB3NzaC1w520smc01ms0jfJs22 root@key-b\n")
747 3865ca48 Michael Hanselmann
748 3865ca48 Michael Hanselmann
  def testRemovingExistingKeyWithSomeMoreSpaces(self):
749 3865ca48 Michael Hanselmann
    utils.RemoveAuthorizedKey(self.tmpname,
750 3865ca48 Michael Hanselmann
        'ssh-dss  AAAAB3NzaC1w5256closdj32mZaQU   root@key-a')
751 3865ca48 Michael Hanselmann
752 3865ca48 Michael Hanselmann
    self.assertFileContent(self.tmpname,
753 3865ca48 Michael Hanselmann
      'command="/usr/bin/fooserver -t --verbose",from="198.51.100.4"'
754 3865ca48 Michael Hanselmann
      " ssh-dss AAAAB3NzaC1w520smc01ms0jfJs22 root@key-b\n")
755 3865ca48 Michael Hanselmann
756 3865ca48 Michael Hanselmann
  def testRemovingNonExistingKey(self):
757 3865ca48 Michael Hanselmann
    utils.RemoveAuthorizedKey(self.tmpname,
758 3865ca48 Michael Hanselmann
        'ssh-dss  AAAAB3Nsdfj230xxjxJjsjwjsjdjU   root@test')
759 3865ca48 Michael Hanselmann
760 3865ca48 Michael Hanselmann
    self.assertFileContent(self.tmpname,
761 3865ca48 Michael Hanselmann
      "ssh-dss AAAAB3NzaC1w5256closdj32mZaQU root@key-a\n"
762 3865ca48 Michael Hanselmann
      'command="/usr/bin/fooserver -t --verbose",from="198.51.100.4"'
763 3865ca48 Michael Hanselmann
      " ssh-dss AAAAB3NzaC1w520smc01ms0jfJs22 root@key-b\n")
764 3865ca48 Michael Hanselmann
765 3865ca48 Michael Hanselmann
766 90e234a6 Michael Hanselmann
class TestNewUUID(unittest.TestCase):
767 90e234a6 Michael Hanselmann
  """Test case for NewUUID"""
768 90e234a6 Michael Hanselmann
769 90e234a6 Michael Hanselmann
  def runTest(self):
770 90e234a6 Michael Hanselmann
    self.failUnless(utils.UUID_RE.match(utils.NewUUID()))
771 90e234a6 Michael Hanselmann
772 90e234a6 Michael Hanselmann
773 3865ca48 Michael Hanselmann
if __name__ == "__main__":
774 3865ca48 Michael Hanselmann
  testutils.GanetiTestProgram()