annotate Lib/test/lock_tests.py @ 58925:eecf1bef052d 2.6

Merged revisions 78207 via svnmerge from svn+ssh://pythondev@svn.python.org/python/trunk ........ r78207 | ezio.melotti | 2010-02-17 01:26:09 +0200 (Wed, 17 Feb 2010) | 1 line #7930: fix stripid ........
author Ezio Melotti <ezio.melotti@gmail.com>
date Tue, 16 Feb 2010 23:29:44 +0000
parents 0eb56a8e6262
children b36cb4602e21
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
57159
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
1 """
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
2 Various tests for synchronization primitives.
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
3 """
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
4
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
5 import sys
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
6 import time
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
7 from thread import start_new_thread, get_ident
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
8 import threading
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
9 import unittest
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
10
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
11 from test import test_support as support
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
12
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
13
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
14 def _wait():
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
15 # A crude wait/yield function not relying on synchronization primitives.
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
16 time.sleep(0.01)
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
17
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
18 class Bunch(object):
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
19 """
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
20 A bunch of threads.
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
21 """
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
22 def __init__(self, f, n, wait_before_exit=False):
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
23 """
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
24 Construct a bunch of `n` threads running the same function `f`.
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
25 If `wait_before_exit` is True, the threads won't terminate until
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
26 do_finish() is called.
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
27 """
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
28 self.f = f
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
29 self.n = n
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
30 self.started = []
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
31 self.finished = []
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
32 self._can_exit = not wait_before_exit
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
33 def task():
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
34 tid = get_ident()
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
35 self.started.append(tid)
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
36 try:
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
37 f()
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
38 finally:
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
39 self.finished.append(tid)
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
40 while not self._can_exit:
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
41 _wait()
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
42 for i in range(n):
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
43 start_new_thread(task, ())
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
44
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
45 def wait_for_started(self):
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
46 while len(self.started) < self.n:
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
47 _wait()
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
48
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
49 def wait_for_finished(self):
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
50 while len(self.finished) < self.n:
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
51 _wait()
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
52
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
53 def do_finish(self):
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
54 self._can_exit = True
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
55
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
56
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
57 class BaseTestCase(unittest.TestCase):
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
58 def setUp(self):
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
59 self._threads = support.threading_setup()
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
60
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
61 def tearDown(self):
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
62 support.threading_cleanup(*self._threads)
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
63 support.reap_children()
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
64
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
65
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
66 class BaseLockTests(BaseTestCase):
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
67 """
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
68 Tests for both recursive and non-recursive locks.
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
69 """
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
70
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
71 def test_constructor(self):
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
72 lock = self.locktype()
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
73 del lock
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
74
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
75 def test_acquire_destroy(self):
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
76 lock = self.locktype()
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
77 lock.acquire()
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
78 del lock
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
79
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
80 def test_acquire_release(self):
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
81 lock = self.locktype()
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
82 lock.acquire()
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
83 lock.release()
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
84 del lock
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
85
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
86 def test_try_acquire(self):
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
87 lock = self.locktype()
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
88 self.assertTrue(lock.acquire(False))
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
89 lock.release()
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
90
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
91 def test_try_acquire_contended(self):
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
92 lock = self.locktype()
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
93 lock.acquire()
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
94 result = []
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
95 def f():
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
96 result.append(lock.acquire(False))
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
97 Bunch(f, 1).wait_for_finished()
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
98 self.assertFalse(result[0])
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
99 lock.release()
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
100
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
101 def test_acquire_contended(self):
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
102 lock = self.locktype()
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
103 lock.acquire()
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
104 N = 5
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
105 def f():
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
106 lock.acquire()
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
107 lock.release()
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
108
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
109 b = Bunch(f, N)
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
110 b.wait_for_started()
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
111 _wait()
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
112 self.assertEqual(len(b.finished), 0)
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
113 lock.release()
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
114 b.wait_for_finished()
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
115 self.assertEqual(len(b.finished), N)
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
116
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
117 def test_with(self):
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
118 lock = self.locktype()
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
119 def f():
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
120 lock.acquire()
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
121 lock.release()
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
122 def _with(err=None):
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
123 with lock:
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
124 if err is not None:
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
125 raise err
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
126 _with()
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
127 # Check the lock is unacquired
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
128 Bunch(f, 1).wait_for_finished()
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
129 self.assertRaises(TypeError, _with, TypeError)
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
130 # Check the lock is unacquired
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
131 Bunch(f, 1).wait_for_finished()
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
132
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
133 def test_thread_leak(self):
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
134 # The lock shouldn't leak a Thread instance when used from a foreign
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
135 # (non-threading) thread.
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
136 lock = self.locktype()
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
137 def f():
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
138 lock.acquire()
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
139 lock.release()
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
140 n = len(threading.enumerate())
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
141 # We run many threads in the hope that existing threads ids won't
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
142 # be recycled.
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
143 Bunch(f, 15).wait_for_finished()
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
144 self.assertEqual(n, len(threading.enumerate()))
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
145
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
146
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
147 class LockTests(BaseLockTests):
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
148 """
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
149 Tests for non-recursive, weak locks
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
150 (which can be acquired and released from different threads).
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
151 """
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
152 def test_reacquire(self):
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
153 # Lock needs to be released before re-acquiring.
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
154 lock = self.locktype()
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
155 phase = []
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
156 def f():
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
157 lock.acquire()
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
158 phase.append(None)
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
159 lock.acquire()
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
160 phase.append(None)
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
161 start_new_thread(f, ())
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
162 while len(phase) == 0:
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
163 _wait()
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
164 _wait()
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
165 self.assertEqual(len(phase), 1)
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
166 lock.release()
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
167 while len(phase) == 1:
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
168 _wait()
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
169 self.assertEqual(len(phase), 2)
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
170
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
171 def test_different_thread(self):
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
172 # Lock can be released from a different thread.
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
173 lock = self.locktype()
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
174 lock.acquire()
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
175 def f():
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
176 lock.release()
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
177 b = Bunch(f, 1)
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
178 b.wait_for_finished()
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
179 lock.acquire()
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
180 lock.release()
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
181
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
182
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
183 class RLockTests(BaseLockTests):
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
184 """
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
185 Tests for recursive locks.
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
186 """
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
187 def test_reacquire(self):
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
188 lock = self.locktype()
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
189 lock.acquire()
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
190 lock.acquire()
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
191 lock.release()
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
192 lock.acquire()
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
193 lock.release()
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
194 lock.release()
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
195
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
196 def test_release_unacquired(self):
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
197 # Cannot release an unacquired lock
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
198 lock = self.locktype()
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
199 self.assertRaises(RuntimeError, lock.release)
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
200 lock.acquire()
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
201 lock.acquire()
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
202 lock.release()
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
203 lock.acquire()
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
204 lock.release()
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
205 lock.release()
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
206 self.assertRaises(RuntimeError, lock.release)
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
207
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
208 def test_different_thread(self):
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
209 # Cannot release from a different thread
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
210 lock = self.locktype()
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
211 def f():
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
212 lock.acquire()
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
213 b = Bunch(f, 1, True)
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
214 try:
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
215 self.assertRaises(RuntimeError, lock.release)
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
216 finally:
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
217 b.do_finish()
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
218
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
219 def test__is_owned(self):
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
220 lock = self.locktype()
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
221 self.assertFalse(lock._is_owned())
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
222 lock.acquire()
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
223 self.assertTrue(lock._is_owned())
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
224 lock.acquire()
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
225 self.assertTrue(lock._is_owned())
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
226 result = []
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
227 def f():
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
228 result.append(lock._is_owned())
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
229 Bunch(f, 1).wait_for_finished()
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
230 self.assertFalse(result[0])
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
231 lock.release()
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
232 self.assertTrue(lock._is_owned())
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
233 lock.release()
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
234 self.assertFalse(lock._is_owned())
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
235
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
236
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
237 class EventTests(BaseTestCase):
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
238 """
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
239 Tests for Event objects.
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
240 """
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
241
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
242 def test_is_set(self):
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
243 evt = self.eventtype()
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
244 self.assertFalse(evt.is_set())
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
245 evt.set()
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
246 self.assertTrue(evt.is_set())
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
247 evt.set()
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
248 self.assertTrue(evt.is_set())
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
249 evt.clear()
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
250 self.assertFalse(evt.is_set())
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
251 evt.clear()
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
252 self.assertFalse(evt.is_set())
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
253
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
254 def _check_notify(self, evt):
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
255 # All threads get notified
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
256 N = 5
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
257 results1 = []
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
258 results2 = []
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
259 def f():
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
260 evt.wait()
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
261 results1.append(evt.is_set())
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
262 evt.wait()
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
263 results2.append(evt.is_set())
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
264 b = Bunch(f, N)
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
265 b.wait_for_started()
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
266 _wait()
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
267 self.assertEqual(len(results1), 0)
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
268 evt.set()
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
269 b.wait_for_finished()
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
270 self.assertEqual(results1, [True] * N)
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
271 self.assertEqual(results2, [True] * N)
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
272
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
273 def test_notify(self):
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
274 evt = self.eventtype()
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
275 self._check_notify(evt)
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
276 # Another time, after an explicit clear()
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
277 evt.set()
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
278 evt.clear()
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
279 self._check_notify(evt)
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
280
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
281 def test_timeout(self):
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
282 evt = self.eventtype()
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
283 results1 = []
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
284 results2 = []
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
285 N = 5
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
286 def f():
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
287 evt.wait(0.0)
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
288 results1.append(evt.is_set())
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
289 t1 = time.time()
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
290 evt.wait(0.2)
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
291 r = evt.is_set()
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
292 t2 = time.time()
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
293 results2.append((r, t2 - t1))
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
294 Bunch(f, N).wait_for_finished()
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
295 self.assertEqual(results1, [False] * N)
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
296 for r, dt in results2:
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
297 self.assertFalse(r)
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
298 self.assertTrue(dt >= 0.2, dt)
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
299 # The event is set
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
300 results1 = []
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
301 results2 = []
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
302 evt.set()
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
303 Bunch(f, N).wait_for_finished()
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
304 self.assertEqual(results1, [True] * N)
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
305 for r, dt in results2:
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
306 self.assertTrue(r)
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
307
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
308
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
309 class ConditionTests(BaseTestCase):
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
310 """
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
311 Tests for condition variables.
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
312 """
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
313
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
314 def test_acquire(self):
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
315 cond = self.condtype()
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
316 # Be default we have an RLock: the condition can be acquired multiple
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
317 # times.
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
318 cond.acquire()
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
319 cond.acquire()
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
320 cond.release()
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
321 cond.release()
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
322 lock = threading.Lock()
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
323 cond = self.condtype(lock)
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
324 cond.acquire()
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
325 self.assertFalse(lock.acquire(False))
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
326 cond.release()
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
327 self.assertTrue(lock.acquire(False))
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
328 self.assertFalse(cond.acquire(False))
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
329 lock.release()
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
330 with cond:
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
331 self.assertFalse(lock.acquire(False))
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
332
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
333 def test_unacquired_wait(self):
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
334 cond = self.condtype()
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
335 self.assertRaises(RuntimeError, cond.wait)
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
336
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
337 def test_unacquired_notify(self):
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
338 cond = self.condtype()
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
339 self.assertRaises(RuntimeError, cond.notify)
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
340
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
341 def _check_notify(self, cond):
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
342 N = 5
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
343 results1 = []
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
344 results2 = []
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
345 phase_num = 0
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
346 def f():
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
347 cond.acquire()
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
348 cond.wait()
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
349 cond.release()
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
350 results1.append(phase_num)
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
351 cond.acquire()
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
352 cond.wait()
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
353 cond.release()
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
354 results2.append(phase_num)
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
355 b = Bunch(f, N)
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
356 b.wait_for_started()
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
357 _wait()
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
358 self.assertEqual(results1, [])
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
359 # Notify 3 threads at first
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
360 cond.acquire()
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
361 cond.notify(3)
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
362 _wait()
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
363 phase_num = 1
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
364 cond.release()
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
365 while len(results1) < 3:
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
366 _wait()
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
367 self.assertEqual(results1, [1] * 3)
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
368 self.assertEqual(results2, [])
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
369 # Notify 5 threads: they might be in their first or second wait
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
370 cond.acquire()
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
371 cond.notify(5)
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
372 _wait()
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
373 phase_num = 2
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
374 cond.release()
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
375 while len(results1) + len(results2) < 8:
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
376 _wait()
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
377 self.assertEqual(results1, [1] * 3 + [2] * 2)
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
378 self.assertEqual(results2, [2] * 3)
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
379 # Notify all threads: they are all in their second wait
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
380 cond.acquire()
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
381 cond.notify_all()
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
382 _wait()
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
383 phase_num = 3
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
384 cond.release()
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
385 while len(results2) < 5:
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
386 _wait()
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
387 self.assertEqual(results1, [1] * 3 + [2] * 2)
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
388 self.assertEqual(results2, [2] * 3 + [3] * 2)
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
389 b.wait_for_finished()
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
390
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
391 def test_notify(self):
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
392 cond = self.condtype()
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
393 self._check_notify(cond)
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
394 # A second time, to check internal state is still ok.
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
395 self._check_notify(cond)
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
396
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
397 def test_timeout(self):
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
398 cond = self.condtype()
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
399 results = []
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
400 N = 5
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
401 def f():
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
402 cond.acquire()
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
403 t1 = time.time()
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
404 cond.wait(0.2)
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
405 t2 = time.time()
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
406 cond.release()
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
407 results.append(t2 - t1)
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
408 Bunch(f, N).wait_for_finished()
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
409 self.assertEqual(len(results), 5)
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
410 for dt in results:
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
411 self.assertTrue(dt >= 0.2, dt)
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
412
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
413
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
414 class BaseSemaphoreTests(BaseTestCase):
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
415 """
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
416 Common tests for {bounded, unbounded} semaphore objects.
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
417 """
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
418
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
419 def test_constructor(self):
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
420 self.assertRaises(ValueError, self.semtype, value = -1)
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
421 self.assertRaises(ValueError, self.semtype, value = -sys.maxint)
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
422
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
423 def test_acquire(self):
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
424 sem = self.semtype(1)
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
425 sem.acquire()
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
426 sem.release()
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
427 sem = self.semtype(2)
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
428 sem.acquire()
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
429 sem.acquire()
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
430 sem.release()
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
431 sem.release()
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
432
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
433 def test_acquire_destroy(self):
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
434 sem = self.semtype()
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
435 sem.acquire()
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
436 del sem
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
437
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
438 def test_acquire_contended(self):
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
439 sem = self.semtype(7)
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
440 sem.acquire()
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
441 N = 10
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
442 results1 = []
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
443 results2 = []
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
444 phase_num = 0
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
445 def f():
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
446 sem.acquire()
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
447 results1.append(phase_num)
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
448 sem.acquire()
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
449 results2.append(phase_num)
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
450 b = Bunch(f, 10)
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
451 b.wait_for_started()
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
452 while len(results1) + len(results2) < 6:
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
453 _wait()
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
454 self.assertEqual(results1 + results2, [0] * 6)
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
455 phase_num = 1
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
456 for i in range(7):
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
457 sem.release()
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
458 while len(results1) + len(results2) < 13:
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
459 _wait()
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
460 self.assertEqual(sorted(results1 + results2), [0] * 6 + [1] * 7)
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
461 phase_num = 2
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
462 for i in range(6):
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
463 sem.release()
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
464 while len(results1) + len(results2) < 19:
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
465 _wait()
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
466 self.assertEqual(sorted(results1 + results2), [0] * 6 + [1] * 7 + [2] * 6)
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
467 # The semaphore is still locked
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
468 self.assertFalse(sem.acquire(False))
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
469 # Final release, to let the last thread finish
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
470 sem.release()
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
471 b.wait_for_finished()
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
472
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
473 def test_try_acquire(self):
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
474 sem = self.semtype(2)
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
475 self.assertTrue(sem.acquire(False))
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
476 self.assertTrue(sem.acquire(False))
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
477 self.assertFalse(sem.acquire(False))
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
478 sem.release()
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
479 self.assertTrue(sem.acquire(False))
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
480
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
481 def test_try_acquire_contended(self):
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
482 sem = self.semtype(4)
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
483 sem.acquire()
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
484 results = []
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
485 def f():
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
486 results.append(sem.acquire(False))
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
487 results.append(sem.acquire(False))
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
488 Bunch(f, 5).wait_for_finished()
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
489 # There can be a thread switch between acquiring the semaphore and
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
490 # appending the result, therefore results will not necessarily be
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
491 # ordered.
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
492 self.assertEqual(sorted(results), [False] * 7 + [True] * 3 )
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
493
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
494 def test_default_value(self):
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
495 # The default initial value is 1.
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
496 sem = self.semtype()
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
497 sem.acquire()
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
498 def f():
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
499 sem.acquire()
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
500 sem.release()
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
501 b = Bunch(f, 1)
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
502 b.wait_for_started()
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
503 _wait()
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
504 self.assertFalse(b.finished)
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
505 sem.release()
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
506 b.wait_for_finished()
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
507
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
508 def test_with(self):
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
509 sem = self.semtype(2)
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
510 def _with(err=None):
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
511 with sem:
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
512 self.assertTrue(sem.acquire(False))
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
513 sem.release()
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
514 with sem:
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
515 self.assertFalse(sem.acquire(False))
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
516 if err:
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
517 raise err
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
518 _with()
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
519 self.assertTrue(sem.acquire(False))
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
520 sem.release()
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
521 self.assertRaises(TypeError, _with, TypeError)
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
522 self.assertTrue(sem.acquire(False))
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
523 sem.release()
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
524
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
525 class SemaphoreTests(BaseSemaphoreTests):
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
526 """
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
527 Tests for unbounded semaphores.
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
528 """
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
529
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
530 def test_release_unacquired(self):
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
531 # Unbounded releases are allowed and increment the semaphore's value
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
532 sem = self.semtype(1)
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
533 sem.release()
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
534 sem.acquire()
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
535 sem.acquire()
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
536 sem.release()
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
537
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
538
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
539 class BoundedSemaphoreTests(BaseSemaphoreTests):
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
540 """
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
541 Tests for bounded semaphores.
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
542 """
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
543
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
544 def test_release_unacquired(self):
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
545 # Cannot go past the initial value
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
546 sem = self.semtype()
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
547 self.assertRaises(ValueError, sem.release)
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
548 sem.acquire()
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
549 sem.release()
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
550 self.assertRaises(ValueError, sem.release)