test_multiprocessing.py revision 459a6481662c62d6cb57a070d21230db3e721c56
176cf55f49965f485633ac78bb34890ad6f77a876Jesse Noller#!/usr/bin/env python
276cf55f49965f485633ac78bb34890ad6f77a876Jesse Noller
3dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson#
4dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# Unit tests for the multiprocessing package
5dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson#
6dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
7dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonimport unittest
8dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonimport threading
9dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonimport Queue
10dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonimport time
11dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonimport sys
12dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonimport os
13dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonimport gc
14dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonimport signal
15dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonimport array
16dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonimport copy
17dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonimport socket
18dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonimport random
19dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonimport logging
20dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
2137040cdace1982772e5f35e4acfa13861d72065dJesse Noller
2237040cdace1982772e5f35e4acfa13861d72065dJesse Noller# Work around broken sem_open implementations
2337040cdace1982772e5f35e4acfa13861d72065dJesse Nollertry:
2437040cdace1982772e5f35e4acfa13861d72065dJesse Noller    import multiprocessing.synchronize
2537040cdace1982772e5f35e4acfa13861d72065dJesse Nollerexcept ImportError, e:
26bec087f29d7dca0aaf8f51be7d7c135e9b84e7f1Benjamin Peterson    raise unittest.SkipTest(e)
2737040cdace1982772e5f35e4acfa13861d72065dJesse Noller
28dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonimport multiprocessing.dummy
29dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonimport multiprocessing.connection
30dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonimport multiprocessing.managers
31dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonimport multiprocessing.heap
32dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonimport multiprocessing.pool
33dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonimport _multiprocessing
34dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
35dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonfrom multiprocessing import util
36dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
37dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson#
38dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson#
39dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson#
40dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
41e79edf5f7c53f977b8e1fe8c00773e4668e35ea9Benjamin Petersonlatin = str
42dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
43dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson#
44dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# Constants
45dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson#
46dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
47dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin PetersonLOG_LEVEL = util.SUBWARNING
48dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson#LOG_LEVEL = logging.WARNING
49dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
50dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin PetersonDELTA = 0.1
51dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin PetersonCHECK_TIMINGS = False     # making true makes tests take a lot longer
52dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson                          # and can sometimes cause some non-serious
53dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson                          # failures because some calls block a bit
54dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson                          # longer than expected
55dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonif CHECK_TIMINGS:
56dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    TIMEOUT1, TIMEOUT2, TIMEOUT3 = 0.82, 0.35, 1.4
57dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonelse:
58dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    TIMEOUT1, TIMEOUT2, TIMEOUT3 = 0.1, 0.1, 0.1
59dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
60dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin PetersonHAVE_GETVALUE = not getattr(_multiprocessing,
61dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson                            'HAVE_BROKEN_SEM_GETVALUE', False)
62dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
639a5b2ad38d605206f05a52fe32868d3f839e8a86Jesse NollerWIN32 = (sys.platform == "win32")
649a5b2ad38d605206f05a52fe32868d3f839e8a86Jesse Noller
65dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson#
66dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# Creates a wrapper for a function which records the time it takes to finish
67dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson#
68dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
69dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonclass TimingWrapper(object):
70dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
71dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def __init__(self, func):
72dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.func = func
73dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.elapsed = None
74dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
75dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def __call__(self, *args, **kwds):
76dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        t = time.time()
77dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        try:
78dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            return self.func(*args, **kwds)
79dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        finally:
80dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            self.elapsed = time.time() - t
81dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
82dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson#
83dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# Base class for test cases
84dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson#
85dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
86dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonclass BaseTestCase(object):
87dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
88dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    ALLOWED_TYPES = ('processes', 'manager', 'threads')
89dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
90dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def assertTimingAlmostEqual(self, a, b):
91dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        if CHECK_TIMINGS:
92dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            self.assertAlmostEqual(a, b, 1)
93dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
94dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def assertReturnsIfImplemented(self, value, func, *args):
95dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        try:
96dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            res = func(*args)
97dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        except NotImplementedError:
98dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            pass
99dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        else:
100dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            return self.assertEqual(value, res)
101dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
102dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson#
103dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# Return the value of a semaphore
104dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson#
105dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
106dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersondef get_value(self):
107dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    try:
108dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        return self.get_value()
109dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    except AttributeError:
110dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        try:
111dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            return self._Semaphore__value
112dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        except AttributeError:
113dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            try:
114dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson                return self._value
115dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            except AttributeError:
116dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson                raise NotImplementedError
117dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
118dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson#
119dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# Testcases
120dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson#
121dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
122dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonclass _TestProcess(BaseTestCase):
123dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
124dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    ALLOWED_TYPES = ('processes', 'threads')
125dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
126dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def test_current(self):
127dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        if self.TYPE == 'threads':
128dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            return
129dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
130dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        current = self.current_process()
1315bc9f4c09c99eb701dbee83fb9e26eed558e474fJesse Noller        authkey = current.authkey
132dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
133dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertTrue(current.is_alive())
1345bc9f4c09c99eb701dbee83fb9e26eed558e474fJesse Noller        self.assertTrue(not current.daemon)
135dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertTrue(isinstance(authkey, bytes))
136dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertTrue(len(authkey) > 0)
1375bc9f4c09c99eb701dbee83fb9e26eed558e474fJesse Noller        self.assertEqual(current.ident, os.getpid())
1385bc9f4c09c99eb701dbee83fb9e26eed558e474fJesse Noller        self.assertEqual(current.exitcode, None)
139dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
140dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def _test(self, q, *args, **kwds):
141dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        current = self.current_process()
142dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        q.put(args)
143dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        q.put(kwds)
1445bc9f4c09c99eb701dbee83fb9e26eed558e474fJesse Noller        q.put(current.name)
145dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        if self.TYPE != 'threads':
1465bc9f4c09c99eb701dbee83fb9e26eed558e474fJesse Noller            q.put(bytes(current.authkey))
147dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            q.put(current.pid)
148dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
149dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def test_process(self):
150dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        q = self.Queue(1)
151dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        e = self.Event()
152dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        args = (q, 1, 2)
153dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        kwargs = {'hello':23, 'bye':2.54}
154dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        name = 'SomeProcess'
155dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        p = self.Process(
156dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            target=self._test, args=args, kwargs=kwargs, name=name
157dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            )
1585bc9f4c09c99eb701dbee83fb9e26eed558e474fJesse Noller        p.daemon = True
159dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        current = self.current_process()
160dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
161dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        if self.TYPE != 'threads':
1625bc9f4c09c99eb701dbee83fb9e26eed558e474fJesse Noller            self.assertEquals(p.authkey, current.authkey)
163dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEquals(p.is_alive(), False)
1645bc9f4c09c99eb701dbee83fb9e26eed558e474fJesse Noller        self.assertEquals(p.daemon, True)
165dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertTrue(p not in self.active_children())
166dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertTrue(type(self.active_children()) is list)
1675bc9f4c09c99eb701dbee83fb9e26eed558e474fJesse Noller        self.assertEqual(p.exitcode, None)
168dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
169dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        p.start()
170dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1715bc9f4c09c99eb701dbee83fb9e26eed558e474fJesse Noller        self.assertEquals(p.exitcode, None)
172dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEquals(p.is_alive(), True)
173dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertTrue(p in self.active_children())
174dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
175dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEquals(q.get(), args[1:])
176dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEquals(q.get(), kwargs)
1775bc9f4c09c99eb701dbee83fb9e26eed558e474fJesse Noller        self.assertEquals(q.get(), p.name)
178dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        if self.TYPE != 'threads':
1795bc9f4c09c99eb701dbee83fb9e26eed558e474fJesse Noller            self.assertEquals(q.get(), current.authkey)
180dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            self.assertEquals(q.get(), p.pid)
181dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
182dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        p.join()
183dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1845bc9f4c09c99eb701dbee83fb9e26eed558e474fJesse Noller        self.assertEquals(p.exitcode, 0)
185dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEquals(p.is_alive(), False)
186dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertTrue(p not in self.active_children())
187dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
188dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def _test_terminate(self):
189dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        time.sleep(1000)
190dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
191dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def test_terminate(self):
192dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        if self.TYPE == 'threads':
193dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            return
194dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
195dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        p = self.Process(target=self._test_terminate)
1965bc9f4c09c99eb701dbee83fb9e26eed558e474fJesse Noller        p.daemon = True
197dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        p.start()
198dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
199dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(p.is_alive(), True)
200dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertTrue(p in self.active_children())
2015bc9f4c09c99eb701dbee83fb9e26eed558e474fJesse Noller        self.assertEqual(p.exitcode, None)
202dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
203dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        p.terminate()
204dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
205dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        join = TimingWrapper(p.join)
206dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(join(), None)
207dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertTimingAlmostEqual(join.elapsed, 0.0)
208dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
209dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(p.is_alive(), False)
210dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertTrue(p not in self.active_children())
211dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
212dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        p.join()
213dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
2145bc9f4c09c99eb701dbee83fb9e26eed558e474fJesse Noller        # XXX sometimes get p.exitcode == 0 on Windows ...
2155bc9f4c09c99eb701dbee83fb9e26eed558e474fJesse Noller        #self.assertEqual(p.exitcode, -signal.SIGTERM)
216dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
217dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def test_cpu_count(self):
218dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        try:
219dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            cpus = multiprocessing.cpu_count()
220dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        except NotImplementedError:
221dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            cpus = 1
222dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertTrue(type(cpus) is int)
223dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertTrue(cpus >= 1)
224dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
225dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def test_active_children(self):
226dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(type(self.active_children()), list)
227dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
228dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        p = self.Process(target=time.sleep, args=(DELTA,))
229dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertTrue(p not in self.active_children())
230dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
231dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        p.start()
232dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertTrue(p in self.active_children())
233dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
234dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        p.join()
235dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertTrue(p not in self.active_children())
236dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
237dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def _test_recursion(self, wconn, id):
238dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        from multiprocessing import forking
239dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        wconn.send(id)
240dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        if len(id) < 2:
241dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            for i in range(2):
242dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson                p = self.Process(
243dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson                    target=self._test_recursion, args=(wconn, id+[i])
244dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson                    )
245dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson                p.start()
246dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson                p.join()
247dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
248dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def test_recursion(self):
249dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        rconn, wconn = self.Pipe(duplex=False)
250dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self._test_recursion(wconn, [])
251dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
252dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        time.sleep(DELTA)
253dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        result = []
254dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        while rconn.poll():
255dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            result.append(rconn.recv())
256dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
257dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        expected = [
258dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            [],
259dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson              [0],
260dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson                [0, 0],
261dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson                [0, 1],
262dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson              [1],
263dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson                [1, 0],
264dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson                [1, 1]
265dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            ]
266dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(result, expected)
267dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
268dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson#
269dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson#
270dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson#
271dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
272dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonclass _UpperCaser(multiprocessing.Process):
273dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
274dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def __init__(self):
275dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        multiprocessing.Process.__init__(self)
276dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.child_conn, self.parent_conn = multiprocessing.Pipe()
277dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
278dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def run(self):
279dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.parent_conn.close()
280dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        for s in iter(self.child_conn.recv, None):
281dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            self.child_conn.send(s.upper())
282dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.child_conn.close()
283dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
284dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def submit(self, s):
285dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        assert type(s) is str
286dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.parent_conn.send(s)
287dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        return self.parent_conn.recv()
288dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
289dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def stop(self):
290dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.parent_conn.send(None)
291dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.parent_conn.close()
292dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.child_conn.close()
293dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
294dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonclass _TestSubclassingProcess(BaseTestCase):
295dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
296dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    ALLOWED_TYPES = ('processes',)
297dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
298dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def test_subclassing(self):
299dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        uppercaser = _UpperCaser()
300dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        uppercaser.start()
301dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(uppercaser.submit('hello'), 'HELLO')
302dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(uppercaser.submit('world'), 'WORLD')
303dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        uppercaser.stop()
304dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        uppercaser.join()
305dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
306dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson#
307dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson#
308dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson#
309dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
310dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersondef queue_empty(q):
311dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    if hasattr(q, 'empty'):
312dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        return q.empty()
313dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    else:
314dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        return q.qsize() == 0
315dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
316dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersondef queue_full(q, maxsize):
317dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    if hasattr(q, 'full'):
318dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        return q.full()
319dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    else:
320dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        return q.qsize() == maxsize
321dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
322dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
323dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonclass _TestQueue(BaseTestCase):
324dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
325dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
326dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def _test_put(self, queue, child_can_start, parent_can_continue):
327dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        child_can_start.wait()
328dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        for i in range(6):
329dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            queue.get()
330dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        parent_can_continue.set()
331dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
332dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def test_put(self):
333dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        MAXSIZE = 6
334dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        queue = self.Queue(maxsize=MAXSIZE)
335dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        child_can_start = self.Event()
336dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        parent_can_continue = self.Event()
337dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
338dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        proc = self.Process(
339dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            target=self._test_put,
340dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            args=(queue, child_can_start, parent_can_continue)
341dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            )
3425bc9f4c09c99eb701dbee83fb9e26eed558e474fJesse Noller        proc.daemon = True
343dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        proc.start()
344dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
345dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(queue_empty(queue), True)
346dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(queue_full(queue, MAXSIZE), False)
347dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
348dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        queue.put(1)
349dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        queue.put(2, True)
350dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        queue.put(3, True, None)
351dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        queue.put(4, False)
352dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        queue.put(5, False, None)
353dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        queue.put_nowait(6)
354dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
355dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        # the values may be in buffer but not yet in pipe so sleep a bit
356dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        time.sleep(DELTA)
357dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
358dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(queue_empty(queue), False)
359dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(queue_full(queue, MAXSIZE), True)
360dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
361dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        put = TimingWrapper(queue.put)
362dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        put_nowait = TimingWrapper(queue.put_nowait)
363dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
364dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertRaises(Queue.Full, put, 7, False)
365dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertTimingAlmostEqual(put.elapsed, 0)
366dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
367dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertRaises(Queue.Full, put, 7, False, None)
368dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertTimingAlmostEqual(put.elapsed, 0)
369dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
370dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertRaises(Queue.Full, put_nowait, 7)
371dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertTimingAlmostEqual(put_nowait.elapsed, 0)
372dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
373dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertRaises(Queue.Full, put, 7, True, TIMEOUT1)
374dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertTimingAlmostEqual(put.elapsed, TIMEOUT1)
375dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
376dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertRaises(Queue.Full, put, 7, False, TIMEOUT2)
377dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertTimingAlmostEqual(put.elapsed, 0)
378dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
379dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertRaises(Queue.Full, put, 7, True, timeout=TIMEOUT3)
380dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertTimingAlmostEqual(put.elapsed, TIMEOUT3)
381dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
382dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        child_can_start.set()
383dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        parent_can_continue.wait()
384dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
385dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(queue_empty(queue), True)
386dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(queue_full(queue, MAXSIZE), False)
387dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
388dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        proc.join()
389dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
390dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def _test_get(self, queue, child_can_start, parent_can_continue):
391dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        child_can_start.wait()
392da3a1b120055855a464c2d5f5143021ae8f5dc86Benjamin Peterson        #queue.put(1)
393dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        queue.put(2)
394dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        queue.put(3)
395dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        queue.put(4)
396dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        queue.put(5)
397dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        parent_can_continue.set()
398dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
399dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def test_get(self):
400dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        queue = self.Queue()
401dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        child_can_start = self.Event()
402dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        parent_can_continue = self.Event()
403dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
404dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        proc = self.Process(
405dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            target=self._test_get,
406dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            args=(queue, child_can_start, parent_can_continue)
407dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            )
4085bc9f4c09c99eb701dbee83fb9e26eed558e474fJesse Noller        proc.daemon = True
409dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        proc.start()
410dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
411dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(queue_empty(queue), True)
412dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
413dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        child_can_start.set()
414dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        parent_can_continue.wait()
415dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
416dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        time.sleep(DELTA)
417dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(queue_empty(queue), False)
418dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
419da3a1b120055855a464c2d5f5143021ae8f5dc86Benjamin Peterson        # Hangs unexpectedly, remove for now
420da3a1b120055855a464c2d5f5143021ae8f5dc86Benjamin Peterson        #self.assertEqual(queue.get(), 1)
421dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(queue.get(True, None), 2)
422dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(queue.get(True), 3)
423dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(queue.get(timeout=1), 4)
424dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(queue.get_nowait(), 5)
425dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
426dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(queue_empty(queue), True)
427dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
428dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        get = TimingWrapper(queue.get)
429dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        get_nowait = TimingWrapper(queue.get_nowait)
430dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
431dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertRaises(Queue.Empty, get, False)
432dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertTimingAlmostEqual(get.elapsed, 0)
433dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
434dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertRaises(Queue.Empty, get, False, None)
435dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertTimingAlmostEqual(get.elapsed, 0)
436dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
437dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertRaises(Queue.Empty, get_nowait)
438dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertTimingAlmostEqual(get_nowait.elapsed, 0)
439dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
440dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertRaises(Queue.Empty, get, True, TIMEOUT1)
441dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertTimingAlmostEqual(get.elapsed, TIMEOUT1)
442dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
443dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertRaises(Queue.Empty, get, False, TIMEOUT2)
444dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertTimingAlmostEqual(get.elapsed, 0)
445dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
446dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertRaises(Queue.Empty, get, timeout=TIMEOUT3)
447dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertTimingAlmostEqual(get.elapsed, TIMEOUT3)
448dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
449dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        proc.join()
450dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
451dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def _test_fork(self, queue):
452dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        for i in range(10, 20):
453dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            queue.put(i)
454dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        # note that at this point the items may only be buffered, so the
455dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        # process cannot shutdown until the feeder thread has finished
456dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        # pushing items onto the pipe.
457dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
458dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def test_fork(self):
459dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        # Old versions of Queue would fail to create a new feeder
460dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        # thread for a forked process if the original process had its
461dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        # own feeder thread.  This test checks that this no longer
462dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        # happens.
463dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
464dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        queue = self.Queue()
465dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
466dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        # put items on queue so that main process starts a feeder thread
467dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        for i in range(10):
468dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            queue.put(i)
469dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
470dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        # wait to make sure thread starts before we fork a new process
471dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        time.sleep(DELTA)
472dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
473dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        # fork process
474dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        p = self.Process(target=self._test_fork, args=(queue,))
475dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        p.start()
476dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
477dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        # check that all expected items are in the queue
478dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        for i in range(20):
479dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            self.assertEqual(queue.get(), i)
480dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertRaises(Queue.Empty, queue.get, False)
481dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
482dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        p.join()
483dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
484dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def test_qsize(self):
485dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        q = self.Queue()
486dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        try:
487dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            self.assertEqual(q.qsize(), 0)
488dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        except NotImplementedError:
489dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            return
490dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        q.put(1)
491dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(q.qsize(), 1)
492dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        q.put(5)
493dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(q.qsize(), 2)
494dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        q.get()
495dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(q.qsize(), 1)
496dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        q.get()
497dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(q.qsize(), 0)
498dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
499dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def _test_task_done(self, q):
500dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        for obj in iter(q.get, None):
501dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            time.sleep(DELTA)
502dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            q.task_done()
503dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
504dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def test_task_done(self):
505dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        queue = self.JoinableQueue()
506dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
507dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        if sys.version_info < (2, 5) and not hasattr(queue, 'task_done'):
508dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            return
509dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
510dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        workers = [self.Process(target=self._test_task_done, args=(queue,))
511dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson                   for i in xrange(4)]
512dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
513dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        for p in workers:
514dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            p.start()
515dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
516dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        for i in xrange(10):
517dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            queue.put(i)
518dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
519dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        queue.join()
520dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
521dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        for p in workers:
522dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            queue.put(None)
523dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
524dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        for p in workers:
525dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            p.join()
526dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
527dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson#
528dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson#
529dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson#
530dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
531dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonclass _TestLock(BaseTestCase):
532dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
533dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def test_lock(self):
534dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        lock = self.Lock()
535dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(lock.acquire(), True)
536dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(lock.acquire(False), False)
537dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(lock.release(), None)
538dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertRaises((ValueError, threading.ThreadError), lock.release)
539dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
540dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def test_rlock(self):
541dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        lock = self.RLock()
542dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(lock.acquire(), True)
543dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(lock.acquire(), True)
544dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(lock.acquire(), True)
545dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(lock.release(), None)
546dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(lock.release(), None)
547dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(lock.release(), None)
548dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertRaises((AssertionError, RuntimeError), lock.release)
549dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
550dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
551dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonclass _TestSemaphore(BaseTestCase):
552dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
553dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def _test_semaphore(self, sem):
554dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertReturnsIfImplemented(2, get_value, sem)
555dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(sem.acquire(), True)
556dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertReturnsIfImplemented(1, get_value, sem)
557dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(sem.acquire(), True)
558dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertReturnsIfImplemented(0, get_value, sem)
559dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(sem.acquire(False), False)
560dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertReturnsIfImplemented(0, get_value, sem)
561dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(sem.release(), None)
562dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertReturnsIfImplemented(1, get_value, sem)
563dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(sem.release(), None)
564dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertReturnsIfImplemented(2, get_value, sem)
565dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
566dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def test_semaphore(self):
567dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        sem = self.Semaphore(2)
568dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self._test_semaphore(sem)
569dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(sem.release(), None)
570dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertReturnsIfImplemented(3, get_value, sem)
571dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(sem.release(), None)
572dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertReturnsIfImplemented(4, get_value, sem)
573dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
574dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def test_bounded_semaphore(self):
575dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        sem = self.BoundedSemaphore(2)
576dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self._test_semaphore(sem)
577dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        # Currently fails on OS/X
578dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        #if HAVE_GETVALUE:
579dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        #    self.assertRaises(ValueError, sem.release)
580dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        #    self.assertReturnsIfImplemented(2, get_value, sem)
581dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
582dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def test_timeout(self):
583dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        if self.TYPE != 'processes':
584dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            return
585dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
586dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        sem = self.Semaphore(0)
587dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        acquire = TimingWrapper(sem.acquire)
588dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
589dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(acquire(False), False)
590dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertTimingAlmostEqual(acquire.elapsed, 0.0)
591dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
592dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(acquire(False, None), False)
593dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertTimingAlmostEqual(acquire.elapsed, 0.0)
594dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
595dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(acquire(False, TIMEOUT1), False)
596dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertTimingAlmostEqual(acquire.elapsed, 0)
597dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
598dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(acquire(True, TIMEOUT2), False)
599dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertTimingAlmostEqual(acquire.elapsed, TIMEOUT2)
600dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
601dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(acquire(timeout=TIMEOUT3), False)
602dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertTimingAlmostEqual(acquire.elapsed, TIMEOUT3)
603dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
604dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
605dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonclass _TestCondition(BaseTestCase):
606dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
607dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def f(self, cond, sleeping, woken, timeout=None):
608dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        cond.acquire()
609dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        sleeping.release()
610dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        cond.wait(timeout)
611dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        woken.release()
612dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        cond.release()
613dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
614dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def check_invariant(self, cond):
615dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        # this is only supposed to succeed when there are no sleepers
616dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        if self.TYPE == 'processes':
617dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            try:
618dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson                sleepers = (cond._sleeping_count.get_value() -
619dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson                            cond._woken_count.get_value())
620dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson                self.assertEqual(sleepers, 0)
621dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson                self.assertEqual(cond._wait_semaphore.get_value(), 0)
622dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            except NotImplementedError:
623dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson                pass
624dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
625dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def test_notify(self):
626dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        cond = self.Condition()
627dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        sleeping = self.Semaphore(0)
628dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        woken = self.Semaphore(0)
629dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
630dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        p = self.Process(target=self.f, args=(cond, sleeping, woken))
6315bc9f4c09c99eb701dbee83fb9e26eed558e474fJesse Noller        p.daemon = True
632dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        p.start()
633dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
634dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        p = threading.Thread(target=self.f, args=(cond, sleeping, woken))
6355bc9f4c09c99eb701dbee83fb9e26eed558e474fJesse Noller        p.daemon = True
636dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        p.start()
637dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
638dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        # wait for both children to start sleeping
639dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        sleeping.acquire()
640dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        sleeping.acquire()
641dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
642dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        # check no process/thread has woken up
643dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        time.sleep(DELTA)
644dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertReturnsIfImplemented(0, get_value, woken)
645dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
646dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        # wake up one process/thread
647dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        cond.acquire()
648dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        cond.notify()
649dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        cond.release()
650dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
651dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        # check one process/thread has woken up
652dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        time.sleep(DELTA)
653dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertReturnsIfImplemented(1, get_value, woken)
654dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
655dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        # wake up another
656dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        cond.acquire()
657dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        cond.notify()
658dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        cond.release()
659dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
660dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        # check other has woken up
661dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        time.sleep(DELTA)
662dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertReturnsIfImplemented(2, get_value, woken)
663dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
664dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        # check state is not mucked up
665dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.check_invariant(cond)
666dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        p.join()
667dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
668dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def test_notify_all(self):
669dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        cond = self.Condition()
670dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        sleeping = self.Semaphore(0)
671dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        woken = self.Semaphore(0)
672dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
673dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        # start some threads/processes which will timeout
674dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        for i in range(3):
675dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            p = self.Process(target=self.f,
676dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson                             args=(cond, sleeping, woken, TIMEOUT1))
6775bc9f4c09c99eb701dbee83fb9e26eed558e474fJesse Noller            p.daemon = True
678dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            p.start()
679dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
680dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            t = threading.Thread(target=self.f,
681dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson                                 args=(cond, sleeping, woken, TIMEOUT1))
682a9b2222de40ed62e6ec1c79f6a89607913f4babdBenjamin Peterson            t.daemon = True
683dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            t.start()
684dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
685dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        # wait for them all to sleep
686dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        for i in xrange(6):
687dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            sleeping.acquire()
688dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
689dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        # check they have all timed out
690dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        for i in xrange(6):
691dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            woken.acquire()
692dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertReturnsIfImplemented(0, get_value, woken)
693dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
694dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        # check state is not mucked up
695dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.check_invariant(cond)
696dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
697dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        # start some more threads/processes
698dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        for i in range(3):
699dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            p = self.Process(target=self.f, args=(cond, sleeping, woken))
7005bc9f4c09c99eb701dbee83fb9e26eed558e474fJesse Noller            p.daemon = True
701dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            p.start()
702dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
703dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            t = threading.Thread(target=self.f, args=(cond, sleeping, woken))
704a9b2222de40ed62e6ec1c79f6a89607913f4babdBenjamin Peterson            t.daemon = True
705dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            t.start()
706dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
707dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        # wait for them to all sleep
708dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        for i in xrange(6):
709dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            sleeping.acquire()
710dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
711dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        # check no process/thread has woken up
712dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        time.sleep(DELTA)
713dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertReturnsIfImplemented(0, get_value, woken)
714dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
715dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        # wake them all up
716dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        cond.acquire()
717dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        cond.notify_all()
718dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        cond.release()
719dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
720dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        # check they have all woken
721dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        time.sleep(DELTA)
722dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertReturnsIfImplemented(6, get_value, woken)
723dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
724dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        # check state is not mucked up
725dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.check_invariant(cond)
726dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
727dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def test_timeout(self):
728dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        cond = self.Condition()
729dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        wait = TimingWrapper(cond.wait)
730dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        cond.acquire()
731dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        res = wait(TIMEOUT1)
732dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        cond.release()
733dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(res, None)
734dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertTimingAlmostEqual(wait.elapsed, TIMEOUT1)
735dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
736dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
737dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonclass _TestEvent(BaseTestCase):
738dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
739dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def _test_event(self, event):
740dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        time.sleep(TIMEOUT2)
741dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        event.set()
742dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
743dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def test_event(self):
744dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        event = self.Event()
745dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        wait = TimingWrapper(event.wait)
746dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
747dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        # Removed temporaily, due to API shear, this does not
748dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        # work with threading._Event objects. is_set == isSet
749dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        #self.assertEqual(event.is_set(), False)
750dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
751dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(wait(0.0), None)
752dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertTimingAlmostEqual(wait.elapsed, 0.0)
753dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(wait(TIMEOUT1), None)
754dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertTimingAlmostEqual(wait.elapsed, TIMEOUT1)
755dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
756dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        event.set()
757dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
758dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        # See note above on the API differences
759dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        # self.assertEqual(event.is_set(), True)
760dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(wait(), None)
761dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertTimingAlmostEqual(wait.elapsed, 0.0)
762dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(wait(TIMEOUT1), None)
763dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertTimingAlmostEqual(wait.elapsed, 0.0)
764dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        # self.assertEqual(event.is_set(), True)
765dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
766dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        event.clear()
767dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
768dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        #self.assertEqual(event.is_set(), False)
769dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
770dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.Process(target=self._test_event, args=(event,)).start()
771dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(wait(), None)
772dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
773dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson#
774dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson#
775dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson#
776dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
777dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonclass _TestValue(BaseTestCase):
778dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
779dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    codes_values = [
780dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        ('i', 4343, 24234),
781dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        ('d', 3.625, -4.25),
782dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        ('h', -232, 234),
783dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        ('c', latin('x'), latin('y'))
784dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        ]
785dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
786dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def _test(self, values):
787dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        for sv, cv in zip(values, self.codes_values):
788dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            sv.value = cv[2]
789dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
790dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
791dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def test_value(self, raw=False):
792dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        if self.TYPE != 'processes':
793dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            return
794dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
795dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        if raw:
796dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            values = [self.RawValue(code, value)
797dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson                      for code, value, _ in self.codes_values]
798dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        else:
799dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            values = [self.Value(code, value)
800dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson                      for code, value, _ in self.codes_values]
801dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
802dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        for sv, cv in zip(values, self.codes_values):
803dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            self.assertEqual(sv.value, cv[1])
804dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
805dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        proc = self.Process(target=self._test, args=(values,))
806dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        proc.start()
807dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        proc.join()
808dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
809dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        for sv, cv in zip(values, self.codes_values):
810dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            self.assertEqual(sv.value, cv[2])
811dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
812dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def test_rawvalue(self):
813dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.test_value(raw=True)
814dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
815dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def test_getobj_getlock(self):
816dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        if self.TYPE != 'processes':
817dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            return
818dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
819dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        val1 = self.Value('i', 5)
820dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        lock1 = val1.get_lock()
821dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        obj1 = val1.get_obj()
822dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
823dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        val2 = self.Value('i', 5, lock=None)
824dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        lock2 = val2.get_lock()
825dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        obj2 = val2.get_obj()
826dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
827dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        lock = self.Lock()
828dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        val3 = self.Value('i', 5, lock=lock)
829dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        lock3 = val3.get_lock()
830dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        obj3 = val3.get_obj()
831dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(lock, lock3)
832dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
8336ab22154ddabdb67bd510a1f2e0aa9c7e0ee607dJesse Noller        arr4 = self.Value('i', 5, lock=False)
834dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertFalse(hasattr(arr4, 'get_lock'))
835dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertFalse(hasattr(arr4, 'get_obj'))
836dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
8376ab22154ddabdb67bd510a1f2e0aa9c7e0ee607dJesse Noller        self.assertRaises(AttributeError, self.Value, 'i', 5, lock='navalue')
8386ab22154ddabdb67bd510a1f2e0aa9c7e0ee607dJesse Noller
8396ab22154ddabdb67bd510a1f2e0aa9c7e0ee607dJesse Noller        arr5 = self.RawValue('i', 5)
8406ab22154ddabdb67bd510a1f2e0aa9c7e0ee607dJesse Noller        self.assertFalse(hasattr(arr5, 'get_lock'))
8416ab22154ddabdb67bd510a1f2e0aa9c7e0ee607dJesse Noller        self.assertFalse(hasattr(arr5, 'get_obj'))
8426ab22154ddabdb67bd510a1f2e0aa9c7e0ee607dJesse Noller
843dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
844dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonclass _TestArray(BaseTestCase):
845dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
846dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def f(self, seq):
847dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        for i in range(1, len(seq)):
848dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            seq[i] += seq[i-1]
849dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
850dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def test_array(self, raw=False):
851dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        if self.TYPE != 'processes':
852dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            return
853dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
854dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        seq = [680, 626, 934, 821, 150, 233, 548, 982, 714, 831]
855dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        if raw:
856dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            arr = self.RawArray('i', seq)
857dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        else:
858dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            arr = self.Array('i', seq)
859dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
860dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(len(arr), len(seq))
861dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(arr[3], seq[3])
862dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(list(arr[2:7]), list(seq[2:7]))
863dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
864dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        arr[4:8] = seq[4:8] = array.array('i', [1, 2, 3, 4])
865dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
866dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(list(arr[:]), seq)
867dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
868dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.f(seq)
869dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
870dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        p = self.Process(target=self.f, args=(arr,))
871dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        p.start()
872dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        p.join()
873dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
874dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(list(arr[:]), seq)
875dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
876dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def test_rawarray(self):
877dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.test_array(raw=True)
878dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
879dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def test_getobj_getlock_obj(self):
880dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        if self.TYPE != 'processes':
881dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            return
882dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
883dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        arr1 = self.Array('i', range(10))
884dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        lock1 = arr1.get_lock()
885dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        obj1 = arr1.get_obj()
886dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
887dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        arr2 = self.Array('i', range(10), lock=None)
888dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        lock2 = arr2.get_lock()
889dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        obj2 = arr2.get_obj()
890dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
891dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        lock = self.Lock()
892dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        arr3 = self.Array('i', range(10), lock=lock)
893dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        lock3 = arr3.get_lock()
894dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        obj3 = arr3.get_obj()
895dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(lock, lock3)
896dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
8976ab22154ddabdb67bd510a1f2e0aa9c7e0ee607dJesse Noller        arr4 = self.Array('i', range(10), lock=False)
898dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertFalse(hasattr(arr4, 'get_lock'))
899dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertFalse(hasattr(arr4, 'get_obj'))
9006ab22154ddabdb67bd510a1f2e0aa9c7e0ee607dJesse Noller        self.assertRaises(AttributeError,
9016ab22154ddabdb67bd510a1f2e0aa9c7e0ee607dJesse Noller                          self.Array, 'i', range(10), lock='notalock')
9026ab22154ddabdb67bd510a1f2e0aa9c7e0ee607dJesse Noller
9036ab22154ddabdb67bd510a1f2e0aa9c7e0ee607dJesse Noller        arr5 = self.RawArray('i', range(10))
9046ab22154ddabdb67bd510a1f2e0aa9c7e0ee607dJesse Noller        self.assertFalse(hasattr(arr5, 'get_lock'))
9056ab22154ddabdb67bd510a1f2e0aa9c7e0ee607dJesse Noller        self.assertFalse(hasattr(arr5, 'get_obj'))
906dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
907dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson#
908dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson#
909dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson#
910dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
911dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonclass _TestContainers(BaseTestCase):
912dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
913dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    ALLOWED_TYPES = ('manager',)
914dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
915dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def test_list(self):
916dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        a = self.list(range(10))
917dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(a[:], range(10))
918dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
919dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        b = self.list()
920dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(b[:], [])
921dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
922dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        b.extend(range(5))
923dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(b[:], range(5))
924dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
925dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(b[2], 2)
926dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(b[2:10], [2,3,4])
927dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
928dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        b *= 2
929dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(b[:], [0, 1, 2, 3, 4, 0, 1, 2, 3, 4])
930dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
931dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(b + [5, 6], [0, 1, 2, 3, 4, 0, 1, 2, 3, 4, 5, 6])
932dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
933dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(a[:], range(10))
934dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
935dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        d = [a, b]
936dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        e = self.list(d)
937dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(
938dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            e[:],
939dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            [[0, 1, 2, 3, 4, 5, 6, 7, 8, 9], [0, 1, 2, 3, 4, 0, 1, 2, 3, 4]]
940dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            )
941dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
942dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        f = self.list([a])
943dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        a.append('hello')
944dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(f[:], [[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 'hello']])
945dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
946dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def test_dict(self):
947dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        d = self.dict()
948dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        indices = range(65, 70)
949dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        for i in indices:
950dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            d[i] = chr(i)
951dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(d.copy(), dict((i, chr(i)) for i in indices))
952dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(sorted(d.keys()), indices)
953dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(sorted(d.values()), [chr(i) for i in indices])
954dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(sorted(d.items()), [(i, chr(i)) for i in indices])
955dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
956dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def test_namespace(self):
957dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        n = self.Namespace()
958dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        n.name = 'Bob'
959dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        n.job = 'Builder'
960dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        n._hidden = 'hidden'
961dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual((n.name, n.job), ('Bob', 'Builder'))
962dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        del n.job
963dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(str(n), "Namespace(name='Bob')")
964dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertTrue(hasattr(n, 'name'))
965dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertTrue(not hasattr(n, 'job'))
966dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
967dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson#
968dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson#
969dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson#
970dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
971dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersondef sqr(x, wait=0.0):
972dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    time.sleep(wait)
973dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    return x*x
974dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonclass _TestPool(BaseTestCase):
975dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
976dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def test_apply(self):
977dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        papply = self.pool.apply
978dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(papply(sqr, (5,)), sqr(5))
979dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(papply(sqr, (), {'x':3}), sqr(x=3))
980dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
981dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def test_map(self):
982dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        pmap = self.pool.map
983dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(pmap(sqr, range(10)), map(sqr, range(10)))
984dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(pmap(sqr, range(100), chunksize=20),
985dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson                         map(sqr, range(100)))
986dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
987dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def test_async(self):
988dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        res = self.pool.apply_async(sqr, (7, TIMEOUT1,))
989dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        get = TimingWrapper(res.get)
990dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(get(), 49)
991dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertTimingAlmostEqual(get.elapsed, TIMEOUT1)
992dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
993dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def test_async_timeout(self):
994dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        res = self.pool.apply_async(sqr, (6, TIMEOUT2 + 0.2))
995dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        get = TimingWrapper(res.get)
996dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertRaises(multiprocessing.TimeoutError, get, timeout=TIMEOUT2)
997dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertTimingAlmostEqual(get.elapsed, TIMEOUT2)
998dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
999dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def test_imap(self):
1000dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        it = self.pool.imap(sqr, range(10))
1001dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(list(it), map(sqr, range(10)))
1002dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1003dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        it = self.pool.imap(sqr, range(10))
1004dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        for i in range(10):
1005dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            self.assertEqual(it.next(), i*i)
1006dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertRaises(StopIteration, it.next)
1007dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1008dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        it = self.pool.imap(sqr, range(1000), chunksize=100)
1009dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        for i in range(1000):
1010dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            self.assertEqual(it.next(), i*i)
1011dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertRaises(StopIteration, it.next)
1012dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1013dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def test_imap_unordered(self):
1014dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        it = self.pool.imap_unordered(sqr, range(1000))
1015dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(sorted(it), map(sqr, range(1000)))
1016dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1017dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        it = self.pool.imap_unordered(sqr, range(1000), chunksize=53)
1018dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(sorted(it), map(sqr, range(1000)))
1019dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1020dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def test_make_pool(self):
1021dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        p = multiprocessing.Pool(3)
1022dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(3, len(p._pool))
1023dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        p.close()
1024dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        p.join()
1025dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1026dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def test_terminate(self):
1027dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        if self.TYPE == 'manager':
1028dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            # On Unix a forked process increfs each shared object to
1029dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            # which its parent process held a reference.  If the
1030dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            # forked process gets terminated then there is likely to
1031dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            # be a reference leak.  So to prevent
1032dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            # _TestZZZNumberOfObjects from failing we skip this test
1033dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            # when using a manager.
1034dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            return
1035dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1036dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        result = self.pool.map_async(
1037dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            time.sleep, [0.1 for i in range(10000)], chunksize=1
1038dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            )
1039dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.pool.terminate()
1040dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        join = TimingWrapper(self.pool.join)
1041dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        join()
1042dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertTrue(join.elapsed < 0.2)
1043dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson#
1044dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# Test that manager has expected number of shared objects left
1045dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson#
1046dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1047dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonclass _TestZZZNumberOfObjects(BaseTestCase):
1048dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    # Because test cases are sorted alphabetically, this one will get
1049dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    # run after all the other tests for the manager.  It tests that
1050dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    # there have been no "reference leaks" for the manager's shared
1051dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    # objects.  Note the comment in _TestPool.test_terminate().
1052dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    ALLOWED_TYPES = ('manager',)
1053dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1054dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def test_number_of_objects(self):
1055dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        EXPECTED_NUMBER = 1                # the pool object is still alive
1056dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        multiprocessing.active_children()  # discard dead process objs
1057dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        gc.collect()                       # do garbage collection
1058dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        refs = self.manager._number_of_objects()
10597314b38168da53863136d1937059fc0ac4883a56Jesse Noller        debug_info = self.manager._debug_info()
1060dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        if refs != EXPECTED_NUMBER:
10617fb9640d57f5d96dcaa0d0e6497abc21fa85f37eJesse Noller            print self.manager._debug_info()
10627314b38168da53863136d1937059fc0ac4883a56Jesse Noller            print debug_info
1063dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1064dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(refs, EXPECTED_NUMBER)
1065dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1066dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson#
1067dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# Test of creating a customized manager class
1068dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson#
1069dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1070dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonfrom multiprocessing.managers import BaseManager, BaseProxy, RemoteError
1071dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1072dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonclass FooBar(object):
1073dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def f(self):
1074dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        return 'f()'
1075dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def g(self):
1076dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        raise ValueError
1077dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def _h(self):
1078dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        return '_h()'
1079dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1080dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersondef baz():
1081dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    for i in xrange(10):
1082dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        yield i*i
1083dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1084dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonclass IteratorProxy(BaseProxy):
1085dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    _exposed_ = ('next', '__next__')
1086dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def __iter__(self):
1087dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        return self
1088dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def next(self):
1089dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        return self._callmethod('next')
1090dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def __next__(self):
1091dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        return self._callmethod('__next__')
1092dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1093dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonclass MyManager(BaseManager):
1094dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    pass
1095dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1096dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin PetersonMyManager.register('Foo', callable=FooBar)
1097dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin PetersonMyManager.register('Bar', callable=FooBar, exposed=('f', '_h'))
1098dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin PetersonMyManager.register('baz', callable=baz, proxytype=IteratorProxy)
1099dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1100dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1101dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonclass _TestMyManager(BaseTestCase):
1102dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1103dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    ALLOWED_TYPES = ('manager',)
1104dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1105dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def test_mymanager(self):
1106dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        manager = MyManager()
1107dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        manager.start()
1108dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1109dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        foo = manager.Foo()
1110dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        bar = manager.Bar()
1111dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        baz = manager.baz()
1112dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1113dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        foo_methods = [name for name in ('f', 'g', '_h') if hasattr(foo, name)]
1114dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        bar_methods = [name for name in ('f', 'g', '_h') if hasattr(bar, name)]
1115dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1116dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(foo_methods, ['f', 'g'])
1117dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(bar_methods, ['f', '_h'])
1118dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1119dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(foo.f(), 'f()')
1120dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertRaises(ValueError, foo.g)
1121dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(foo._callmethod('f'), 'f()')
1122dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertRaises(RemoteError, foo._callmethod, '_h')
1123dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1124dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(bar.f(), 'f()')
1125dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(bar._h(), '_h()')
1126dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(bar._callmethod('f'), 'f()')
1127dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(bar._callmethod('_h'), '_h()')
1128dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1129dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(list(baz), [i*i for i in range(10)])
1130dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1131dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        manager.shutdown()
1132dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1133dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson#
1134dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# Test of connecting to a remote server and using xmlrpclib for serialization
1135dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson#
1136dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1137dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson_queue = Queue.Queue()
1138dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersondef get_queue():
1139dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    return _queue
1140dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1141dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonclass QueueManager(BaseManager):
1142dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    '''manager class used by server process'''
1143dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin PetersonQueueManager.register('get_queue', callable=get_queue)
1144dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1145dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonclass QueueManager2(BaseManager):
1146dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    '''manager class which specifies the same interface as QueueManager'''
1147dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin PetersonQueueManager2.register('get_queue')
1148dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1149dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1150dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin PetersonSERIALIZER = 'xmlrpclib'
1151dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1152dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonclass _TestRemoteManager(BaseTestCase):
1153dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1154dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    ALLOWED_TYPES = ('manager',)
1155dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1156dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def _putter(self, address, authkey):
1157dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        manager = QueueManager2(
1158dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            address=address, authkey=authkey, serializer=SERIALIZER
1159dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            )
1160dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        manager.connect()
1161dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        queue = manager.get_queue()
1162dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        queue.put(('hello world', None, True, 2.25))
1163dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1164dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def test_remote(self):
1165dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        authkey = os.urandom(32)
1166dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1167dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        manager = QueueManager(
1168dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            address=('localhost', 0), authkey=authkey, serializer=SERIALIZER
1169dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            )
1170dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        manager.start()
1171dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1172dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        p = self.Process(target=self._putter, args=(manager.address, authkey))
1173dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        p.start()
1174dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1175dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        manager2 = QueueManager2(
1176dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            address=manager.address, authkey=authkey, serializer=SERIALIZER
1177dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            )
1178dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        manager2.connect()
1179dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        queue = manager2.get_queue()
1180dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1181dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        # Note that xmlrpclib will deserialize object as a list not a tuple
1182dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(queue.get(), ['hello world', None, True, 2.25])
1183dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1184dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        # Because we are using xmlrpclib for serialization instead of
1185dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        # pickle this will cause a serialization error.
1186dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertRaises(Exception, queue.put, time.sleep)
1187dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1188dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        # Make queue finalizer run before the server is stopped
1189dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        del queue
1190dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        manager.shutdown()
1191dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1192459a6481662c62d6cb57a070d21230db3e721c56Jesse Nollerclass _TestManagerRestart(BaseTestCase):
1193459a6481662c62d6cb57a070d21230db3e721c56Jesse Noller
1194459a6481662c62d6cb57a070d21230db3e721c56Jesse Noller    def _putter(self, address, authkey):
1195459a6481662c62d6cb57a070d21230db3e721c56Jesse Noller        manager = QueueManager(
1196459a6481662c62d6cb57a070d21230db3e721c56Jesse Noller            address=address, authkey=authkey, serializer=SERIALIZER)
1197459a6481662c62d6cb57a070d21230db3e721c56Jesse Noller        manager.connect()
1198459a6481662c62d6cb57a070d21230db3e721c56Jesse Noller        queue = manager.get_queue()
1199459a6481662c62d6cb57a070d21230db3e721c56Jesse Noller        queue.put('hello world')
1200459a6481662c62d6cb57a070d21230db3e721c56Jesse Noller
1201459a6481662c62d6cb57a070d21230db3e721c56Jesse Noller    def test_rapid_restart(self):
1202459a6481662c62d6cb57a070d21230db3e721c56Jesse Noller        authkey = os.urandom(32)
1203459a6481662c62d6cb57a070d21230db3e721c56Jesse Noller        manager = QueueManager(
1204459a6481662c62d6cb57a070d21230db3e721c56Jesse Noller            address=('localhost', 9999), authkey=authkey, serializer=SERIALIZER)
1205459a6481662c62d6cb57a070d21230db3e721c56Jesse Noller        manager.start()
1206459a6481662c62d6cb57a070d21230db3e721c56Jesse Noller
1207459a6481662c62d6cb57a070d21230db3e721c56Jesse Noller        p = self.Process(target=self._putter, args=(manager.address, authkey))
1208459a6481662c62d6cb57a070d21230db3e721c56Jesse Noller        p.start()
1209459a6481662c62d6cb57a070d21230db3e721c56Jesse Noller        queue = manager.get_queue()
1210459a6481662c62d6cb57a070d21230db3e721c56Jesse Noller        self.assertEqual(queue.get(), 'hello world')
1211459a6481662c62d6cb57a070d21230db3e721c56Jesse Noller        manager.shutdown()
1212459a6481662c62d6cb57a070d21230db3e721c56Jesse Noller        manager = QueueManager(
1213459a6481662c62d6cb57a070d21230db3e721c56Jesse Noller            address=('localhost', 9999), authkey=authkey, serializer=SERIALIZER)
1214459a6481662c62d6cb57a070d21230db3e721c56Jesse Noller        manager.start()
1215459a6481662c62d6cb57a070d21230db3e721c56Jesse Noller
1216dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson#
1217dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson#
1218dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson#
1219dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1220dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin PetersonSENTINEL = latin('')
1221dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1222dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonclass _TestConnection(BaseTestCase):
1223dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1224dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    ALLOWED_TYPES = ('processes', 'threads')
1225dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1226dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def _echo(self, conn):
1227dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        for msg in iter(conn.recv_bytes, SENTINEL):
1228dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            conn.send_bytes(msg)
1229dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        conn.close()
1230dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1231dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def test_connection(self):
1232dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        conn, child_conn = self.Pipe()
1233dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1234dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        p = self.Process(target=self._echo, args=(child_conn,))
12355bc9f4c09c99eb701dbee83fb9e26eed558e474fJesse Noller        p.daemon = True
1236dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        p.start()
1237dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1238dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        seq = [1, 2.25, None]
1239dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        msg = latin('hello world')
1240dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        longmsg = msg * 10
1241dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        arr = array.array('i', range(4))
1242dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1243dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        if self.TYPE == 'processes':
1244dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            self.assertEqual(type(conn.fileno()), int)
1245dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1246dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(conn.send(seq), None)
1247dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(conn.recv(), seq)
1248dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1249dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(conn.send_bytes(msg), None)
1250dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(conn.recv_bytes(), msg)
1251dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1252dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        if self.TYPE == 'processes':
1253dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            buffer = array.array('i', [0]*10)
1254dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            expected = list(arr) + [0] * (10 - len(arr))
1255dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            self.assertEqual(conn.send_bytes(arr), None)
1256dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            self.assertEqual(conn.recv_bytes_into(buffer),
1257dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson                             len(arr) * buffer.itemsize)
1258dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            self.assertEqual(list(buffer), expected)
1259dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1260dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            buffer = array.array('i', [0]*10)
1261dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            expected = [0] * 3 + list(arr) + [0] * (10 - 3 - len(arr))
1262dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            self.assertEqual(conn.send_bytes(arr), None)
1263dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            self.assertEqual(conn.recv_bytes_into(buffer, 3 * buffer.itemsize),
1264dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson                             len(arr) * buffer.itemsize)
1265dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            self.assertEqual(list(buffer), expected)
1266dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1267dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            buffer = bytearray(latin(' ' * 40))
1268dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            self.assertEqual(conn.send_bytes(longmsg), None)
1269dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            try:
1270dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson                res = conn.recv_bytes_into(buffer)
1271dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            except multiprocessing.BufferTooShort, e:
1272dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson                self.assertEqual(e.args, (longmsg,))
1273dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            else:
1274dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson                self.fail('expected BufferTooShort, got %s' % res)
1275dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1276dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        poll = TimingWrapper(conn.poll)
1277dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1278dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(poll(), False)
1279dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertTimingAlmostEqual(poll.elapsed, 0)
1280dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1281dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(poll(TIMEOUT1), False)
1282dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertTimingAlmostEqual(poll.elapsed, TIMEOUT1)
1283dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1284dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        conn.send(None)
1285dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1286dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(poll(TIMEOUT1), True)
1287dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertTimingAlmostEqual(poll.elapsed, 0)
1288dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1289dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(conn.recv(), None)
1290dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1291dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        really_big_msg = latin('X') * (1024 * 1024 * 16)   # 16Mb
1292dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        conn.send_bytes(really_big_msg)
1293dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(conn.recv_bytes(), really_big_msg)
1294dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1295dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        conn.send_bytes(SENTINEL)                          # tell child to quit
1296dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        child_conn.close()
1297dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1298dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        if self.TYPE == 'processes':
1299dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            self.assertEqual(conn.readable, True)
1300dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            self.assertEqual(conn.writable, True)
1301dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            self.assertRaises(EOFError, conn.recv)
1302dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            self.assertRaises(EOFError, conn.recv_bytes)
1303dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1304dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        p.join()
1305dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1306dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def test_duplex_false(self):
1307dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        reader, writer = self.Pipe(duplex=False)
1308dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(writer.send(1), None)
1309dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(reader.recv(), 1)
1310dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        if self.TYPE == 'processes':
1311dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            self.assertEqual(reader.readable, True)
1312dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            self.assertEqual(reader.writable, False)
1313dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            self.assertEqual(writer.readable, False)
1314dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            self.assertEqual(writer.writable, True)
1315dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            self.assertRaises(IOError, reader.send, 2)
1316dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            self.assertRaises(IOError, writer.recv)
1317dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            self.assertRaises(IOError, writer.poll)
1318dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1319dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def test_spawn_close(self):
1320dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        # We test that a pipe connection can be closed by parent
1321dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        # process immediately after child is spawned.  On Windows this
1322dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        # would have sometimes failed on old versions because
1323dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        # child_conn would be closed before the child got a chance to
1324dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        # duplicate it.
1325dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        conn, child_conn = self.Pipe()
1326dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1327dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        p = self.Process(target=self._echo, args=(child_conn,))
1328dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        p.start()
1329dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        child_conn.close()    # this might complete before child initializes
1330dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1331dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        msg = latin('hello')
1332dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        conn.send_bytes(msg)
1333dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(conn.recv_bytes(), msg)
1334dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1335dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        conn.send_bytes(SENTINEL)
1336dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        conn.close()
1337dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        p.join()
1338dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1339dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def test_sendbytes(self):
1340dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        if self.TYPE != 'processes':
1341dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            return
1342dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1343dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        msg = latin('abcdefghijklmnopqrstuvwxyz')
1344dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        a, b = self.Pipe()
1345dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1346dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        a.send_bytes(msg)
1347dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(b.recv_bytes(), msg)
1348dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1349dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        a.send_bytes(msg, 5)
1350dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(b.recv_bytes(), msg[5:])
1351dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1352dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        a.send_bytes(msg, 7, 8)
1353dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(b.recv_bytes(), msg[7:7+8])
1354dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1355dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        a.send_bytes(msg, 26)
1356dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(b.recv_bytes(), latin(''))
1357dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1358dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        a.send_bytes(msg, 26, 0)
1359dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(b.recv_bytes(), latin(''))
1360dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1361dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertRaises(ValueError, a.send_bytes, msg, 27)
1362dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1363dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertRaises(ValueError, a.send_bytes, msg, 22, 5)
1364dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1365dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertRaises(ValueError, a.send_bytes, msg, 26, 1)
1366dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1367dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertRaises(ValueError, a.send_bytes, msg, -1)
1368dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1369dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertRaises(ValueError, a.send_bytes, msg, 4, -1)
1370dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1371dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonclass _TestListenerClient(BaseTestCase):
1372dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1373dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    ALLOWED_TYPES = ('processes', 'threads')
1374dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1375dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def _test(self, address):
1376dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        conn = self.connection.Client(address)
1377dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        conn.send('hello')
1378dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        conn.close()
1379dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1380dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def test_listener_client(self):
1381dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        for family in self.connection.families:
1382dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            l = self.connection.Listener(family=family)
1383dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            p = self.Process(target=self._test, args=(l.address,))
13845bc9f4c09c99eb701dbee83fb9e26eed558e474fJesse Noller            p.daemon = True
1385dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            p.start()
1386dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            conn = l.accept()
1387dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            self.assertEqual(conn.recv(), 'hello')
1388dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            p.join()
1389dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            l.close()
1390dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson#
1391dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# Test of sending connection and socket objects between processes
1392dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson#
1393da3a1b120055855a464c2d5f5143021ae8f5dc86Benjamin Peterson"""
1394dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonclass _TestPicklingConnections(BaseTestCase):
1395dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1396dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    ALLOWED_TYPES = ('processes',)
1397dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1398dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def _listener(self, conn, families):
1399dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        for fam in families:
1400dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            l = self.connection.Listener(family=fam)
1401dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            conn.send(l.address)
1402dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            new_conn = l.accept()
1403dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            conn.send(new_conn)
1404dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1405dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        if self.TYPE == 'processes':
1406dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            l = socket.socket()
1407dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            l.bind(('localhost', 0))
1408dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            conn.send(l.getsockname())
1409dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            l.listen(1)
1410dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            new_conn, addr = l.accept()
1411dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            conn.send(new_conn)
1412dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1413dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        conn.recv()
1414dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1415dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def _remote(self, conn):
1416dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        for (address, msg) in iter(conn.recv, None):
1417dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            client = self.connection.Client(address)
1418dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            client.send(msg.upper())
1419dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            client.close()
1420dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1421dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        if self.TYPE == 'processes':
1422dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            address, msg = conn.recv()
1423dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            client = socket.socket()
1424dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            client.connect(address)
1425dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            client.sendall(msg.upper())
1426dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            client.close()
1427dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1428dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        conn.close()
1429dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1430dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def test_pickling(self):
1431dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        try:
1432dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            multiprocessing.allow_connection_pickling()
1433dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        except ImportError:
1434dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            return
1435dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1436dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        families = self.connection.families
1437dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1438dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        lconn, lconn0 = self.Pipe()
1439dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        lp = self.Process(target=self._listener, args=(lconn0, families))
1440dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        lp.start()
1441dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        lconn0.close()
1442dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1443dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        rconn, rconn0 = self.Pipe()
1444dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        rp = self.Process(target=self._remote, args=(rconn0,))
1445dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        rp.start()
1446dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        rconn0.close()
1447dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1448dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        for fam in families:
1449dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            msg = ('This connection uses family %s' % fam).encode('ascii')
1450dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            address = lconn.recv()
1451dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            rconn.send((address, msg))
1452dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            new_conn = lconn.recv()
1453dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            self.assertEqual(new_conn.recv(), msg.upper())
1454dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1455dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        rconn.send(None)
1456dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1457dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        if self.TYPE == 'processes':
1458dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            msg = latin('This connection uses a normal socket')
1459dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            address = lconn.recv()
1460dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            rconn.send((address, msg))
1461dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            if hasattr(socket, 'fromfd'):
1462dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson                new_conn = lconn.recv()
1463dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson                self.assertEqual(new_conn.recv(100), msg.upper())
1464dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            else:
1465dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson                # XXX On Windows with Py2.6 need to backport fromfd()
1466dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson                discard = lconn.recv_bytes()
1467dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1468dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        lconn.send(None)
1469dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1470dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        rconn.close()
1471dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        lconn.close()
1472dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1473dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        lp.join()
1474dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        rp.join()
1475da3a1b120055855a464c2d5f5143021ae8f5dc86Benjamin Peterson"""
1476dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson#
1477dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson#
1478dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson#
1479dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1480dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonclass _TestHeap(BaseTestCase):
1481dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1482dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    ALLOWED_TYPES = ('processes',)
1483dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1484dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def test_heap(self):
1485dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        iterations = 5000
1486dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        maxblocks = 50
1487dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        blocks = []
1488dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1489dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        # create and destroy lots of blocks of different sizes
1490dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        for i in xrange(iterations):
1491dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            size = int(random.lognormvariate(0, 1) * 1000)
1492dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            b = multiprocessing.heap.BufferWrapper(size)
1493dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            blocks.append(b)
1494dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            if len(blocks) > maxblocks:
1495dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson                i = random.randrange(maxblocks)
1496dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson                del blocks[i]
1497dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1498dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        # get the heap object
1499dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        heap = multiprocessing.heap.BufferWrapper._heap
1500dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1501dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        # verify the state of the heap
1502dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        all = []
1503dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        occupied = 0
1504dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        for L in heap._len_to_seq.values():
1505dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            for arena, start, stop in L:
1506dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson                all.append((heap._arenas.index(arena), start, stop,
1507dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson                            stop-start, 'free'))
1508dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        for arena, start, stop in heap._allocated_blocks:
1509dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            all.append((heap._arenas.index(arena), start, stop,
1510dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson                        stop-start, 'occupied'))
1511dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            occupied += (stop-start)
1512dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1513dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        all.sort()
1514dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1515dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        for i in range(len(all)-1):
1516dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            (arena, start, stop) = all[i][:3]
1517dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            (narena, nstart, nstop) = all[i+1][:3]
1518dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            self.assertTrue((arena != narena and nstart == 0) or
1519dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson                            (stop == nstart))
1520dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1521dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson#
1522dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson#
1523dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson#
1524dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1525dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersontry:
1526dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    from ctypes import Structure, Value, copy, c_int, c_double
1527dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonexcept ImportError:
1528dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    Structure = object
1529dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    c_int = c_double = None
1530dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1531dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonclass _Foo(Structure):
1532dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    _fields_ = [
1533dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        ('x', c_int),
1534dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        ('y', c_double)
1535dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        ]
1536dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1537dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonclass _TestSharedCTypes(BaseTestCase):
1538dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1539dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    ALLOWED_TYPES = ('processes',)
1540dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1541dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def _double(self, x, y, foo, arr, string):
1542dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        x.value *= 2
1543dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        y.value *= 2
1544dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        foo.x *= 2
1545dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        foo.y *= 2
1546dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        string.value *= 2
1547dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        for i in range(len(arr)):
1548dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            arr[i] *= 2
1549dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1550dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def test_sharedctypes(self, lock=False):
1551dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        if c_int is None:
1552dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            return
1553dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1554dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        x = Value('i', 7, lock=lock)
1555dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        y = Value(ctypes.c_double, 1.0/3.0, lock=lock)
1556dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        foo = Value(_Foo, 3, 2, lock=lock)
1557dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        arr = Array('d', range(10), lock=lock)
1558dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        string = Array('c', 20, lock=lock)
1559dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        string.value = 'hello'
1560dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1561dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        p = self.Process(target=self._double, args=(x, y, foo, arr, string))
1562dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        p.start()
1563dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        p.join()
1564dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1565dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(x.value, 14)
1566dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertAlmostEqual(y.value, 2.0/3.0)
1567dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(foo.x, 6)
1568dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertAlmostEqual(foo.y, 4.0)
1569dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        for i in range(10):
1570dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            self.assertAlmostEqual(arr[i], i*2)
1571dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(string.value, latin('hellohello'))
1572dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1573dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def test_synchronize(self):
1574dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.test_sharedctypes(lock=True)
1575dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1576dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def test_copy(self):
1577dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        if c_int is None:
1578dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            return
1579dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1580dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        foo = _Foo(2, 5.0)
1581dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        bar = copy(foo)
1582dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        foo.x = 0
1583dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        foo.y = 0
1584dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(bar.x, 2)
1585dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertAlmostEqual(bar.y, 5.0)
1586dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1587dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson#
1588dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson#
1589dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson#
1590dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1591dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonclass _TestFinalize(BaseTestCase):
1592dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1593dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    ALLOWED_TYPES = ('processes',)
1594dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1595dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def _test_finalize(self, conn):
1596dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        class Foo(object):
1597dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            pass
1598dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1599dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        a = Foo()
1600dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        util.Finalize(a, conn.send, args=('a',))
1601dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        del a           # triggers callback for a
1602dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1603dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        b = Foo()
1604dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        close_b = util.Finalize(b, conn.send, args=('b',))
1605dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        close_b()       # triggers callback for b
1606dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        close_b()       # does nothing because callback has already been called
1607dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        del b           # does nothing because callback has already been called
1608dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1609dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        c = Foo()
1610dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        util.Finalize(c, conn.send, args=('c',))
1611dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1612dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        d10 = Foo()
1613dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        util.Finalize(d10, conn.send, args=('d10',), exitpriority=1)
1614dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1615dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        d01 = Foo()
1616dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        util.Finalize(d01, conn.send, args=('d01',), exitpriority=0)
1617dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        d02 = Foo()
1618dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        util.Finalize(d02, conn.send, args=('d02',), exitpriority=0)
1619dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        d03 = Foo()
1620dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        util.Finalize(d03, conn.send, args=('d03',), exitpriority=0)
1621dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1622dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        util.Finalize(None, conn.send, args=('e',), exitpriority=-10)
1623dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1624dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        util.Finalize(None, conn.send, args=('STOP',), exitpriority=-100)
1625dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1626dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        # call mutliprocessing's cleanup function then exit process without
1627dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        # garbage collecting locals
1628dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        util._exit_function()
1629dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        conn.close()
1630dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        os._exit(0)
1631dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1632dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def test_finalize(self):
1633dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        conn, child_conn = self.Pipe()
1634dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1635dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        p = self.Process(target=self._test_finalize, args=(child_conn,))
1636dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        p.start()
1637dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        p.join()
1638dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1639dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        result = [obj for obj in iter(conn.recv, 'STOP')]
1640dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(result, ['a', 'b', 'd10', 'd03', 'd02', 'd01', 'e'])
1641dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1642dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson#
1643dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# Test that from ... import * works for each module
1644dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson#
1645dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1646dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonclass _TestImportStar(BaseTestCase):
1647dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1648dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    ALLOWED_TYPES = ('processes',)
1649dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1650dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def test_import(self):
1651dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        modules = (
1652dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            'multiprocessing', 'multiprocessing.connection',
1653dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            'multiprocessing.heap', 'multiprocessing.managers',
1654dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            'multiprocessing.pool', 'multiprocessing.process',
1655dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            'multiprocessing.reduction', 'multiprocessing.sharedctypes',
1656dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            'multiprocessing.synchronize', 'multiprocessing.util'
1657dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            )
1658dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1659dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        for name in modules:
1660dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            __import__(name)
1661dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            mod = sys.modules[name]
1662dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1663dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            for attr in getattr(mod, '__all__', ()):
1664dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson                self.assertTrue(
1665dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson                    hasattr(mod, attr),
1666dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson                    '%r does not have attribute %r' % (mod, attr)
1667dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson                    )
1668dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1669dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson#
1670dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# Quick test that logging works -- does not test logging output
1671dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson#
1672dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1673dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonclass _TestLogging(BaseTestCase):
1674dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1675dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    ALLOWED_TYPES = ('processes',)
1676dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1677dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def test_enable_logging(self):
1678dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        logger = multiprocessing.get_logger()
1679dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        logger.setLevel(util.SUBWARNING)
1680dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertTrue(logger is not None)
1681dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        logger.debug('this will not be printed')
1682dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        logger.info('nor will this')
1683dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        logger.setLevel(LOG_LEVEL)
1684dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1685dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def _test_level(self, conn):
1686dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        logger = multiprocessing.get_logger()
1687dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        conn.send(logger.getEffectiveLevel())
1688dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1689dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def test_level(self):
1690dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        LEVEL1 = 32
1691dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        LEVEL2 = 37
1692dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1693dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        logger = multiprocessing.get_logger()
1694dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        root_logger = logging.getLogger()
1695dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        root_level = root_logger.level
1696dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1697dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        reader, writer = multiprocessing.Pipe(duplex=False)
1698dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1699dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        logger.setLevel(LEVEL1)
1700dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.Process(target=self._test_level, args=(writer,)).start()
1701dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(LEVEL1, reader.recv())
1702dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1703dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        logger.setLevel(logging.NOTSET)
1704dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        root_logger.setLevel(LEVEL2)
1705dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.Process(target=self._test_level, args=(writer,)).start()
1706dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(LEVEL2, reader.recv())
1707dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1708dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        root_logger.setLevel(root_level)
1709dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        logger.setLevel(level=LOG_LEVEL)
1710dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1711dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson#
17129a5b2ad38d605206f05a52fe32868d3f839e8a86Jesse Noller# Test to verify handle verification, see issue 3321
17139a5b2ad38d605206f05a52fe32868d3f839e8a86Jesse Noller#
17149a5b2ad38d605206f05a52fe32868d3f839e8a86Jesse Noller
17159a5b2ad38d605206f05a52fe32868d3f839e8a86Jesse Nollerclass TestInvalidHandle(unittest.TestCase):
17169a5b2ad38d605206f05a52fe32868d3f839e8a86Jesse Noller
17179a5b2ad38d605206f05a52fe32868d3f839e8a86Jesse Noller    def test_invalid_handles(self):
17189a5b2ad38d605206f05a52fe32868d3f839e8a86Jesse Noller        if WIN32:
17199a5b2ad38d605206f05a52fe32868d3f839e8a86Jesse Noller            return
17209a5b2ad38d605206f05a52fe32868d3f839e8a86Jesse Noller        conn = _multiprocessing.Connection(44977608)
17219a5b2ad38d605206f05a52fe32868d3f839e8a86Jesse Noller        self.assertRaises(IOError, conn.poll)
17229a5b2ad38d605206f05a52fe32868d3f839e8a86Jesse Noller        self.assertRaises(IOError, _multiprocessing.Connection, -1)
17239a5b2ad38d605206f05a52fe32868d3f839e8a86Jesse Noller#
1724dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# Functions used to create test cases from the base ones in this module
1725dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson#
1726dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1727dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersondef get_attributes(Source, names):
1728dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    d = {}
1729dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    for name in names:
1730dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        obj = getattr(Source, name)
1731dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        if type(obj) == type(get_attributes):
1732dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            obj = staticmethod(obj)
1733dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        d[name] = obj
1734dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    return d
1735dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1736dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersondef create_test_cases(Mixin, type):
1737dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    result = {}
1738dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    glob = globals()
1739dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    Type = type[0].upper() + type[1:]
1740dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1741dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    for name in glob.keys():
1742dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        if name.startswith('_Test'):
1743dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            base = glob[name]
1744dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            if type in base.ALLOWED_TYPES:
1745dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson                newname = 'With' + Type + name[1:]
1746dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson                class Temp(base, unittest.TestCase, Mixin):
1747dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson                    pass
1748dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson                result[newname] = Temp
1749dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson                Temp.__name__ = newname
1750dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson                Temp.__module__ = Mixin.__module__
1751dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    return result
1752dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1753dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson#
1754dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# Create test cases
1755dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson#
1756dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1757dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonclass ProcessesMixin(object):
1758dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    TYPE = 'processes'
1759dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    Process = multiprocessing.Process
1760dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    locals().update(get_attributes(multiprocessing, (
1761dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        'Queue', 'Lock', 'RLock', 'Semaphore', 'BoundedSemaphore',
1762dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        'Condition', 'Event', 'Value', 'Array', 'RawValue',
1763dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        'RawArray', 'current_process', 'active_children', 'Pipe',
1764dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        'connection', 'JoinableQueue'
1765dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        )))
1766dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1767dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersontestcases_processes = create_test_cases(ProcessesMixin, type='processes')
1768dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonglobals().update(testcases_processes)
1769dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1770dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1771dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonclass ManagerMixin(object):
1772dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    TYPE = 'manager'
1773dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    Process = multiprocessing.Process
1774dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    manager = object.__new__(multiprocessing.managers.SyncManager)
1775dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    locals().update(get_attributes(manager, (
1776dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        'Queue', 'Lock', 'RLock', 'Semaphore', 'BoundedSemaphore',
1777dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson       'Condition', 'Event', 'Value', 'Array', 'list', 'dict',
1778dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        'Namespace', 'JoinableQueue'
1779dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        )))
1780dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1781dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersontestcases_manager = create_test_cases(ManagerMixin, type='manager')
1782dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonglobals().update(testcases_manager)
1783dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1784dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1785dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonclass ThreadsMixin(object):
1786dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    TYPE = 'threads'
1787dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    Process = multiprocessing.dummy.Process
1788dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    locals().update(get_attributes(multiprocessing.dummy, (
1789dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        'Queue', 'Lock', 'RLock', 'Semaphore', 'BoundedSemaphore',
1790dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        'Condition', 'Event', 'Value', 'Array', 'current_process',
1791dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        'active_children', 'Pipe', 'connection', 'dict', 'list',
1792dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        'Namespace', 'JoinableQueue'
1793dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        )))
1794dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1795dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersontestcases_threads = create_test_cases(ThreadsMixin, type='threads')
1796dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonglobals().update(testcases_threads)
1797dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
17980c519b3a5e847eea0dffb51ac8df7c68891daf70Neal Norwitzclass OtherTest(unittest.TestCase):
17990c519b3a5e847eea0dffb51ac8df7c68891daf70Neal Norwitz    # TODO: add more tests for deliver/answer challenge.
18000c519b3a5e847eea0dffb51ac8df7c68891daf70Neal Norwitz    def test_deliver_challenge_auth_failure(self):
18010c519b3a5e847eea0dffb51ac8df7c68891daf70Neal Norwitz        class _FakeConnection(object):
18020c519b3a5e847eea0dffb51ac8df7c68891daf70Neal Norwitz            def recv_bytes(self, size):
18032a7767a17311cada06240a187c8896bdbcc1a4d0Neal Norwitz                return b'something bogus'
18040c519b3a5e847eea0dffb51ac8df7c68891daf70Neal Norwitz            def send_bytes(self, data):
18050c519b3a5e847eea0dffb51ac8df7c68891daf70Neal Norwitz                pass
18060c519b3a5e847eea0dffb51ac8df7c68891daf70Neal Norwitz        self.assertRaises(multiprocessing.AuthenticationError,
18070c519b3a5e847eea0dffb51ac8df7c68891daf70Neal Norwitz                          multiprocessing.connection.deliver_challenge,
18080c519b3a5e847eea0dffb51ac8df7c68891daf70Neal Norwitz                          _FakeConnection(), b'abc')
18090c519b3a5e847eea0dffb51ac8df7c68891daf70Neal Norwitz
18100c519b3a5e847eea0dffb51ac8df7c68891daf70Neal Norwitz    def test_answer_challenge_auth_failure(self):
18110c519b3a5e847eea0dffb51ac8df7c68891daf70Neal Norwitz        class _FakeConnection(object):
18120c519b3a5e847eea0dffb51ac8df7c68891daf70Neal Norwitz            def __init__(self):
18130c519b3a5e847eea0dffb51ac8df7c68891daf70Neal Norwitz                self.count = 0
18140c519b3a5e847eea0dffb51ac8df7c68891daf70Neal Norwitz            def recv_bytes(self, size):
18150c519b3a5e847eea0dffb51ac8df7c68891daf70Neal Norwitz                self.count += 1
18160c519b3a5e847eea0dffb51ac8df7c68891daf70Neal Norwitz                if self.count == 1:
18170c519b3a5e847eea0dffb51ac8df7c68891daf70Neal Norwitz                    return multiprocessing.connection.CHALLENGE
18180c519b3a5e847eea0dffb51ac8df7c68891daf70Neal Norwitz                elif self.count == 2:
18192a7767a17311cada06240a187c8896bdbcc1a4d0Neal Norwitz                    return b'something bogus'
18202a7767a17311cada06240a187c8896bdbcc1a4d0Neal Norwitz                return b''
18210c519b3a5e847eea0dffb51ac8df7c68891daf70Neal Norwitz            def send_bytes(self, data):
18220c519b3a5e847eea0dffb51ac8df7c68891daf70Neal Norwitz                pass
18230c519b3a5e847eea0dffb51ac8df7c68891daf70Neal Norwitz        self.assertRaises(multiprocessing.AuthenticationError,
18240c519b3a5e847eea0dffb51ac8df7c68891daf70Neal Norwitz                          multiprocessing.connection.answer_challenge,
18250c519b3a5e847eea0dffb51ac8df7c68891daf70Neal Norwitz                          _FakeConnection(), b'abc')
18260c519b3a5e847eea0dffb51ac8df7c68891daf70Neal Norwitz
18279a5b2ad38d605206f05a52fe32868d3f839e8a86Jesse Nollertestcases_other = [OtherTest, TestInvalidHandle]
18280c519b3a5e847eea0dffb51ac8df7c68891daf70Neal Norwitz
1829dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson#
1830dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson#
1831dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson#
1832dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1833dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersondef test_main(run=None):
183418623825d25b0f8f3b4bf96c1d5c4c2977a94004Jesse Noller    if sys.platform.startswith("linux"):
183518623825d25b0f8f3b4bf96c1d5c4c2977a94004Jesse Noller        try:
183618623825d25b0f8f3b4bf96c1d5c4c2977a94004Jesse Noller            lock = multiprocessing.RLock()
183718623825d25b0f8f3b4bf96c1d5c4c2977a94004Jesse Noller        except OSError:
1838888a39b54c4f47ee25d53b157e2c50402627cd0bBenjamin Peterson            from test.test_support import SkipTest
1839bec087f29d7dca0aaf8f51be7d7c135e9b84e7f1Benjamin Peterson            raise unittest.SkipTest("OSError raises on RLock creation, see issue 3111!")
1840ed77f2e143102df58212ff1f64a87f7e0c237439Benjamin Peterson
1841dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    if run is None:
1842dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        from test.test_support import run_unittest as run
1843dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1844dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    util.get_temp_dir()     # creates temp directory for use by all processes
1845dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1846dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    multiprocessing.get_logger().setLevel(LOG_LEVEL)
1847dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1848146b7ab818cadccf91ad98e64cfefb77705da0caJesse Noller    ProcessesMixin.pool = multiprocessing.Pool(4)
1849146b7ab818cadccf91ad98e64cfefb77705da0caJesse Noller    ThreadsMixin.pool = multiprocessing.dummy.Pool(4)
1850146b7ab818cadccf91ad98e64cfefb77705da0caJesse Noller    ManagerMixin.manager.__init__()
1851146b7ab818cadccf91ad98e64cfefb77705da0caJesse Noller    ManagerMixin.manager.start()
1852146b7ab818cadccf91ad98e64cfefb77705da0caJesse Noller    ManagerMixin.pool = ManagerMixin.manager.Pool(4)
1853dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1854dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    testcases = (
1855146b7ab818cadccf91ad98e64cfefb77705da0caJesse Noller        sorted(testcases_processes.values(), key=lambda tc:tc.__name__) +
1856146b7ab818cadccf91ad98e64cfefb77705da0caJesse Noller        sorted(testcases_threads.values(), key=lambda tc:tc.__name__) +
18570c519b3a5e847eea0dffb51ac8df7c68891daf70Neal Norwitz        sorted(testcases_manager.values(), key=lambda tc:tc.__name__) +
18580c519b3a5e847eea0dffb51ac8df7c68891daf70Neal Norwitz        testcases_other
1859dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        )
1860dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1861dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    loadTestsFromTestCase = unittest.defaultTestLoader.loadTestsFromTestCase
1862dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    suite = unittest.TestSuite(loadTestsFromTestCase(tc) for tc in testcases)
1863dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    run(suite)
1864dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1865146b7ab818cadccf91ad98e64cfefb77705da0caJesse Noller    ThreadsMixin.pool.terminate()
1866146b7ab818cadccf91ad98e64cfefb77705da0caJesse Noller    ProcessesMixin.pool.terminate()
1867146b7ab818cadccf91ad98e64cfefb77705da0caJesse Noller    ManagerMixin.pool.terminate()
1868146b7ab818cadccf91ad98e64cfefb77705da0caJesse Noller    ManagerMixin.manager.shutdown()
1869dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1870146b7ab818cadccf91ad98e64cfefb77705da0caJesse Noller    del ProcessesMixin.pool, ThreadsMixin.pool, ManagerMixin.pool
1871dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1872dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersondef main():
1873dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    test_main(unittest.TextTestRunner(verbosity=2).run)
1874dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1875dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonif __name__ == '__main__':
1876dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    main()
1877