root / test / py / ganeti.utils.filelock_unittest.py @ 688b5752
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() |