Statistics
| Branch: | Tag: | Revision:

root / test / ganeti.utils.filelock_unittest.py @ 415feb2e

History | View | Annotate | Download (4.3 kB)

1 9d1b963f Michael Hanselmann
#!/usr/bin/python
2 9d1b963f Michael Hanselmann
#
3 9d1b963f Michael Hanselmann
4 9d1b963f Michael Hanselmann
# Copyright (C) 2006, 2007, 2010, 2011 Google Inc.
5 9d1b963f Michael Hanselmann
#
6 9d1b963f Michael Hanselmann
# This program is free software; you can redistribute it and/or modify
7 9d1b963f Michael Hanselmann
# it under the terms of the GNU General Public License as published by
8 9d1b963f Michael Hanselmann
# the Free Software Foundation; either version 2 of the License, or
9 9d1b963f Michael Hanselmann
# (at your option) any later version.
10 9d1b963f Michael Hanselmann
#
11 9d1b963f Michael Hanselmann
# This program is distributed in the hope that it will be useful, but
12 9d1b963f Michael Hanselmann
# WITHOUT ANY WARRANTY; without even the implied warranty of
13 9d1b963f Michael Hanselmann
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14 9d1b963f Michael Hanselmann
# General Public License for more details.
15 9d1b963f Michael Hanselmann
#
16 9d1b963f Michael Hanselmann
# You should have received a copy of the GNU General Public License
17 9d1b963f Michael Hanselmann
# along with this program; if not, write to the Free Software
18 9d1b963f Michael Hanselmann
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
19 9d1b963f Michael Hanselmann
# 02110-1301, USA.
20 9d1b963f Michael Hanselmann
21 9d1b963f Michael Hanselmann
22 9d1b963f Michael Hanselmann
"""Script for testing ganeti.utils.filelock"""
23 9d1b963f Michael Hanselmann
24 9d1b963f Michael Hanselmann
import os
25 9d1b963f Michael Hanselmann
import tempfile
26 9d1b963f Michael Hanselmann
import unittest
27 9d1b963f Michael Hanselmann
28 9d1b963f Michael Hanselmann
from ganeti import constants
29 9d1b963f Michael Hanselmann
from ganeti import utils
30 9d1b963f Michael Hanselmann
from ganeti import errors
31 9d1b963f Michael Hanselmann
32 9d1b963f Michael Hanselmann
import testutils
33 9d1b963f Michael Hanselmann
34 9d1b963f Michael Hanselmann
35 9d1b963f Michael Hanselmann
class _BaseFileLockTest:
36 9d1b963f Michael Hanselmann
  """Test case for the FileLock class"""
37 9d1b963f Michael Hanselmann
38 9d1b963f Michael Hanselmann
  def testSharedNonblocking(self):
39 9d1b963f Michael Hanselmann
    self.lock.Shared(blocking=False)
40 9d1b963f Michael Hanselmann
    self.lock.Close()
41 9d1b963f Michael Hanselmann
42 9d1b963f Michael Hanselmann
  def testExclusiveNonblocking(self):
43 9d1b963f Michael Hanselmann
    self.lock.Exclusive(blocking=False)
44 9d1b963f Michael Hanselmann
    self.lock.Close()
45 9d1b963f Michael Hanselmann
46 9d1b963f Michael Hanselmann
  def testUnlockNonblocking(self):
47 9d1b963f Michael Hanselmann
    self.lock.Unlock(blocking=False)
48 9d1b963f Michael Hanselmann
    self.lock.Close()
49 9d1b963f Michael Hanselmann
50 9d1b963f Michael Hanselmann
  def testSharedBlocking(self):
51 9d1b963f Michael Hanselmann
    self.lock.Shared(blocking=True)
52 9d1b963f Michael Hanselmann
    self.lock.Close()
53 9d1b963f Michael Hanselmann
54 9d1b963f Michael Hanselmann
  def testExclusiveBlocking(self):
55 9d1b963f Michael Hanselmann
    self.lock.Exclusive(blocking=True)
56 9d1b963f Michael Hanselmann
    self.lock.Close()
57 9d1b963f Michael Hanselmann
58 9d1b963f Michael Hanselmann
  def testUnlockBlocking(self):
59 9d1b963f Michael Hanselmann
    self.lock.Unlock(blocking=True)
60 9d1b963f Michael Hanselmann
    self.lock.Close()
61 9d1b963f Michael Hanselmann
62 9d1b963f Michael Hanselmann
  def testSharedExclusiveUnlock(self):
63 9d1b963f Michael Hanselmann
    self.lock.Shared(blocking=False)
64 9d1b963f Michael Hanselmann
    self.lock.Exclusive(blocking=False)
65 9d1b963f Michael Hanselmann
    self.lock.Unlock(blocking=False)
66 9d1b963f Michael Hanselmann
    self.lock.Close()
67 9d1b963f Michael Hanselmann
68 9d1b963f Michael Hanselmann
  def testExclusiveSharedUnlock(self):
69 9d1b963f Michael Hanselmann
    self.lock.Exclusive(blocking=False)
70 9d1b963f Michael Hanselmann
    self.lock.Shared(blocking=False)
71 9d1b963f Michael Hanselmann
    self.lock.Unlock(blocking=False)
72 9d1b963f Michael Hanselmann
    self.lock.Close()
73 9d1b963f Michael Hanselmann
74 9d1b963f Michael Hanselmann
  def testSimpleTimeout(self):
75 9d1b963f Michael Hanselmann
    # These will succeed on the first attempt, hence a short timeout
76 9d1b963f Michael Hanselmann
    self.lock.Shared(blocking=True, timeout=10.0)
77 9d1b963f Michael Hanselmann
    self.lock.Exclusive(blocking=False, timeout=10.0)
78 9d1b963f Michael Hanselmann
    self.lock.Unlock(blocking=True, timeout=10.0)
79 9d1b963f Michael Hanselmann
    self.lock.Close()
80 9d1b963f Michael Hanselmann
81 9d1b963f Michael Hanselmann
  @staticmethod
82 9d1b963f Michael Hanselmann
  def _TryLockInner(filename, shared, blocking):
83 9d1b963f Michael Hanselmann
    lock = utils.FileLock.Open(filename)
84 9d1b963f Michael Hanselmann
85 9d1b963f Michael Hanselmann
    if shared:
86 9d1b963f Michael Hanselmann
      fn = lock.Shared
87 9d1b963f Michael Hanselmann
    else:
88 9d1b963f Michael Hanselmann
      fn = lock.Exclusive
89 9d1b963f Michael Hanselmann
90 9d1b963f Michael Hanselmann
    try:
91 9d1b963f Michael Hanselmann
      # The timeout doesn't really matter as the parent process waits for us to
92 9d1b963f Michael Hanselmann
      # finish anyway.
93 9d1b963f Michael Hanselmann
      fn(blocking=blocking, timeout=0.01)
94 9d1b963f Michael Hanselmann
    except errors.LockError, err:
95 9d1b963f Michael Hanselmann
      return False
96 9d1b963f Michael Hanselmann
97 9d1b963f Michael Hanselmann
    return True
98 9d1b963f Michael Hanselmann
99 9d1b963f Michael Hanselmann
  def _TryLock(self, *args):
100 9d1b963f Michael Hanselmann
    return utils.RunInSeparateProcess(self._TryLockInner, self.tmpfile.name,
101 9d1b963f Michael Hanselmann
                                      *args)
102 9d1b963f Michael Hanselmann
103 9d1b963f Michael Hanselmann
  def testTimeout(self):
104 9d1b963f Michael Hanselmann
    for blocking in [True, False]:
105 9d1b963f Michael Hanselmann
      self.lock.Exclusive(blocking=True)
106 9d1b963f Michael Hanselmann
      self.failIf(self._TryLock(False, blocking))
107 9d1b963f Michael Hanselmann
      self.failIf(self._TryLock(True, blocking))
108 9d1b963f Michael Hanselmann
109 9d1b963f Michael Hanselmann
      self.lock.Shared(blocking=True)
110 9d1b963f Michael Hanselmann
      self.assert_(self._TryLock(True, blocking))
111 9d1b963f Michael Hanselmann
      self.failIf(self._TryLock(False, blocking))
112 9d1b963f Michael Hanselmann
113 9d1b963f Michael Hanselmann
  def testCloseShared(self):
114 9d1b963f Michael Hanselmann
    self.lock.Close()
115 9d1b963f Michael Hanselmann
    self.assertRaises(AssertionError, self.lock.Shared, blocking=False)
116 9d1b963f Michael Hanselmann
117 9d1b963f Michael Hanselmann
  def testCloseExclusive(self):
118 9d1b963f Michael Hanselmann
    self.lock.Close()
119 9d1b963f Michael Hanselmann
    self.assertRaises(AssertionError, self.lock.Exclusive, blocking=False)
120 9d1b963f Michael Hanselmann
121 9d1b963f Michael Hanselmann
  def testCloseUnlock(self):
122 9d1b963f Michael Hanselmann
    self.lock.Close()
123 9d1b963f Michael Hanselmann
    self.assertRaises(AssertionError, self.lock.Unlock, blocking=False)
124 9d1b963f Michael Hanselmann
125 9d1b963f Michael Hanselmann
126 9d1b963f Michael Hanselmann
class TestFileLockWithFilename(testutils.GanetiTestCase, _BaseFileLockTest):
127 9d1b963f Michael Hanselmann
  TESTDATA = "Hello World\n" * 10
128 9d1b963f Michael Hanselmann
129 9d1b963f Michael Hanselmann
  def setUp(self):
130 9d1b963f Michael Hanselmann
    testutils.GanetiTestCase.setUp(self)
131 9d1b963f Michael Hanselmann
132 9d1b963f Michael Hanselmann
    self.tmpfile = tempfile.NamedTemporaryFile()
133 9d1b963f Michael Hanselmann
    utils.WriteFile(self.tmpfile.name, data=self.TESTDATA)
134 9d1b963f Michael Hanselmann
    self.lock = utils.FileLock.Open(self.tmpfile.name)
135 9d1b963f Michael Hanselmann
136 9d1b963f Michael Hanselmann
    # Ensure "Open" didn't truncate file
137 9d1b963f Michael Hanselmann
    self.assertFileContent(self.tmpfile.name, self.TESTDATA)
138 9d1b963f Michael Hanselmann
139 9d1b963f Michael Hanselmann
  def tearDown(self):
140 9d1b963f Michael Hanselmann
    self.assertFileContent(self.tmpfile.name, self.TESTDATA)
141 9d1b963f Michael Hanselmann
142 9d1b963f Michael Hanselmann
    testutils.GanetiTestCase.tearDown(self)
143 9d1b963f Michael Hanselmann
144 9d1b963f Michael Hanselmann
145 9d1b963f Michael Hanselmann
class TestFileLockWithFileObject(unittest.TestCase, _BaseFileLockTest):
146 9d1b963f Michael Hanselmann
  def setUp(self):
147 9d1b963f Michael Hanselmann
    self.tmpfile = tempfile.NamedTemporaryFile()
148 9d1b963f Michael Hanselmann
    self.lock = utils.FileLock(open(self.tmpfile.name, "w"), self.tmpfile.name)
149 9d1b963f Michael Hanselmann
150 9d1b963f Michael Hanselmann
151 9d1b963f Michael Hanselmann
if __name__ == "__main__":
152 9d1b963f Michael Hanselmann
  testutils.GanetiTestProgram()