Revision a95fd5d7 test/ganeti.locking_unittest.py
b/test/ganeti.locking_unittest.py | ||
---|---|---|
28 | 28 |
import Queue |
29 | 29 |
|
30 | 30 |
from ganeti import locking |
31 |
from ganeti import errors |
|
31 | 32 |
from threading import Thread |
32 | 33 |
|
33 | 34 |
|
... | ... | |
86 | 87 |
# helper functions: called in a separate thread they acquire the lock, send |
87 | 88 |
# their identifier on the done queue, then release it. |
88 | 89 |
def _doItSharer(self): |
89 |
self.sl.acquire(shared=1) |
|
90 |
self.done.put('SHR') |
|
91 |
self.sl.release() |
|
90 |
try: |
|
91 |
self.sl.acquire(shared=1) |
|
92 |
self.done.put('SHR') |
|
93 |
self.sl.release() |
|
94 |
except errors.LockError: |
|
95 |
self.done.put('ERR') |
|
92 | 96 |
|
93 | 97 |
def _doItExclusive(self): |
94 |
self.sl.acquire() |
|
95 |
self.done.put('EXC') |
|
96 |
self.sl.release() |
|
98 |
try: |
|
99 |
self.sl.acquire() |
|
100 |
self.done.put('EXC') |
|
101 |
self.sl.release() |
|
102 |
except errors.LockError: |
|
103 |
self.done.put('ERR') |
|
104 |
|
|
105 |
def _doItDelete(self): |
|
106 |
try: |
|
107 |
self.sl.acquire() |
|
108 |
self.done.put('DEL') |
|
109 |
self.sl.release() |
|
110 |
except errors.LockError: |
|
111 |
self.done.put('ERR') |
|
97 | 112 |
|
98 | 113 |
def testSharersCanCoexist(self): |
99 | 114 |
self.sl.acquire(shared=1) |
... | ... | |
109 | 124 |
self.sl.release() |
110 | 125 |
self.assert_(self.done.get(True, 1)) |
111 | 126 |
|
127 |
def testExclusiveBlocksDelete(self): |
|
128 |
self.sl.acquire() |
|
129 |
Thread(target=self._doItDelete).start() |
|
130 |
# give it a bit of time to check that it's not actually doing anything |
|
131 |
self.assertRaises(Queue.Empty, self.done.get, True, 0.2) |
|
132 |
self.sl.release() |
|
133 |
self.assert_(self.done.get(True, 1)) |
|
134 |
|
|
112 | 135 |
def testExclusiveBlocksSharer(self): |
113 | 136 |
self.sl.acquire() |
114 | 137 |
Thread(target=self._doItSharer).start() |
... | ... | |
125 | 148 |
self.sl.release() |
126 | 149 |
self.assert_(self.done.get(True, 1)) |
127 | 150 |
|
151 |
def testSharerBlocksDelete(self): |
|
152 |
self.sl.acquire(shared=1) |
|
153 |
Thread(target=self._doItDelete).start() |
|
154 |
time.sleep(0.05) |
|
155 |
self.assertRaises(Queue.Empty, self.done.get, True, 0.2) |
|
156 |
self.sl.release() |
|
157 |
self.assert_(self.done.get(True, 1)) |
|
158 |
|
|
128 | 159 |
def testWaitingExclusiveBlocksSharer(self): |
129 | 160 |
self.sl.acquire(shared=1) |
130 | 161 |
# the lock is acquired in shared mode... |
... | ... | |
153 | 184 |
self.assertEqual(self.done.get(True, 1), 'SHR') |
154 | 185 |
self.assertEqual(self.done.get(True, 1), 'EXC') |
155 | 186 |
|
187 |
def testNoNonBlocking(self): |
|
188 |
self.assertRaises(NotImplementedError, self.sl.acquire, blocking=0) |
|
189 |
self.assertRaises(NotImplementedError, self.sl.delete, blocking=0) |
|
190 |
self.sl.acquire() |
|
191 |
self.sl.delete(blocking=0) # Fine, because the lock is already acquired |
|
192 |
|
|
193 |
def testDelete(self): |
|
194 |
self.sl.delete() |
|
195 |
self.assertRaises(errors.LockError, self.sl.acquire) |
|
196 |
self.assertRaises(errors.LockError, self.sl.delete) |
|
197 |
|
|
198 |
def testDeletePendingSharersExclusiveDelete(self): |
|
199 |
self.sl.acquire() |
|
200 |
Thread(target=self._doItSharer).start() |
|
201 |
Thread(target=self._doItSharer).start() |
|
202 |
time.sleep(0.05) |
|
203 |
Thread(target=self._doItExclusive).start() |
|
204 |
Thread(target=self._doItDelete).start() |
|
205 |
time.sleep(0.05) |
|
206 |
self.sl.delete() |
|
207 |
# The two threads who were pending return both ERR |
|
208 |
self.assertEqual(self.done.get(True, 1), 'ERR') |
|
209 |
self.assertEqual(self.done.get(True, 1), 'ERR') |
|
210 |
self.assertEqual(self.done.get(True, 1), 'ERR') |
|
211 |
self.assertEqual(self.done.get(True, 1), 'ERR') |
|
212 |
|
|
213 |
def testDeletePendingDeleteExclusiveSharers(self): |
|
214 |
self.sl.acquire() |
|
215 |
Thread(target=self._doItDelete).start() |
|
216 |
Thread(target=self._doItExclusive).start() |
|
217 |
time.sleep(0.05) |
|
218 |
Thread(target=self._doItSharer).start() |
|
219 |
Thread(target=self._doItSharer).start() |
|
220 |
time.sleep(0.05) |
|
221 |
self.sl.delete() |
|
222 |
# The two threads who were pending return both ERR |
|
223 |
self.assertEqual(self.done.get(True, 1), 'ERR') |
|
224 |
self.assertEqual(self.done.get(True, 1), 'ERR') |
|
225 |
self.assertEqual(self.done.get(True, 1), 'ERR') |
|
226 |
self.assertEqual(self.done.get(True, 1), 'ERR') |
|
227 |
|
|
156 | 228 |
|
157 | 229 |
if __name__ == '__main__': |
158 | 230 |
unittest.main() |
Also available in: Unified diff