test_multiprocessing.py revision bd564c3c21ef4c6d6cb0070870edd9d2f7c89d11
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
20c4920e86ef7511b4e858028e870b1811437a71d0Mark Dickinsonfrom test import test_support
211b90efbdc5bb204fe50aea87374603dcba309227Jesse Nollerfrom StringIO import StringIO
22dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
2337040cdace1982772e5f35e4acfa13861d72065dJesse Noller
243db8a3432bd84b58bdc7da2c9872777c537a4d09R. David Murray_multiprocessing = test_support.import_module('_multiprocessing')
253db8a3432bd84b58bdc7da2c9872777c537a4d09R. David Murray
2637040cdace1982772e5f35e4acfa13861d72065dJesse Noller# Work around broken sem_open implementations
273db8a3432bd84b58bdc7da2c9872777c537a4d09R. David Murraytest_support.import_module('multiprocessing.synchronize')
2837040cdace1982772e5f35e4acfa13861d72065dJesse Noller
29dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonimport multiprocessing.dummy
30dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonimport multiprocessing.connection
31dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonimport multiprocessing.managers
32dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonimport multiprocessing.heap
33dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonimport multiprocessing.pool
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
48654ade3e6afa2527d1f642be28d69e219bd58b71Jesse Noller#LOG_LEVEL = logging.DEBUG
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)
135b0f5adc3f4e098b1744eeac65fc830fb1df2b8abEzio Melotti        self.assertIsInstance(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)
165aa98058cc44ba20f35c106d20918c6196b737561Ezio Melotti        self.assertNotIn(p, 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)
173aa98058cc44ba20f35c106d20918c6196b737561Ezio Melotti        self.assertIn(p, 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)
186aa98058cc44ba20f35c106d20918c6196b737561Ezio Melotti        self.assertNotIn(p, 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)
200aa98058cc44ba20f35c106d20918c6196b737561Ezio Melotti        self.assertIn(p, 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)
210aa98058cc44ba20f35c106d20918c6196b737561Ezio Melotti        self.assertNotIn(p, 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,))
229aa98058cc44ba20f35c106d20918c6196b737561Ezio Melotti        self.assertNotIn(p, self.active_children())
230dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
231dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        p.start()
232aa98058cc44ba20f35c106d20918c6196b737561Ezio Melotti        self.assertIn(p, self.active_children())
233dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
234dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        p.join()
235aa98058cc44ba20f35c106d20918c6196b737561Ezio Melotti        self.assertNotIn(p, 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
55082eb5902ce169be81110c79662b772b904cd00fcJesse Noller    def test_lock_context(self):
55182eb5902ce169be81110c79662b772b904cd00fcJesse Noller        with self.Lock():
55282eb5902ce169be81110c79662b772b904cd00fcJesse Noller            pass
55382eb5902ce169be81110c79662b772b904cd00fcJesse Noller
554dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
555dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonclass _TestSemaphore(BaseTestCase):
556dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
557dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def _test_semaphore(self, sem):
558dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertReturnsIfImplemented(2, get_value, sem)
559dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(sem.acquire(), True)
560dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertReturnsIfImplemented(1, get_value, sem)
561dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(sem.acquire(), True)
562dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertReturnsIfImplemented(0, get_value, sem)
563dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(sem.acquire(False), False)
564dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertReturnsIfImplemented(0, get_value, sem)
565dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(sem.release(), None)
566dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertReturnsIfImplemented(1, get_value, sem)
567dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(sem.release(), None)
568dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertReturnsIfImplemented(2, get_value, sem)
569dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
570dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def test_semaphore(self):
571dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        sem = self.Semaphore(2)
572dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self._test_semaphore(sem)
573dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(sem.release(), None)
574dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertReturnsIfImplemented(3, get_value, sem)
575dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(sem.release(), None)
576dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertReturnsIfImplemented(4, get_value, sem)
577dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
578dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def test_bounded_semaphore(self):
579dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        sem = self.BoundedSemaphore(2)
580dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self._test_semaphore(sem)
581dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        # Currently fails on OS/X
582dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        #if HAVE_GETVALUE:
583dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        #    self.assertRaises(ValueError, sem.release)
584dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        #    self.assertReturnsIfImplemented(2, get_value, sem)
585dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
586dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def test_timeout(self):
587dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        if self.TYPE != 'processes':
588dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            return
589dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
590dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        sem = self.Semaphore(0)
591dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        acquire = TimingWrapper(sem.acquire)
592dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
593dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(acquire(False), False)
594dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertTimingAlmostEqual(acquire.elapsed, 0.0)
595dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
596dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(acquire(False, None), False)
597dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertTimingAlmostEqual(acquire.elapsed, 0.0)
598dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
599dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(acquire(False, TIMEOUT1), False)
600dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertTimingAlmostEqual(acquire.elapsed, 0)
601dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
602dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(acquire(True, TIMEOUT2), False)
603dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertTimingAlmostEqual(acquire.elapsed, TIMEOUT2)
604dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
605dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(acquire(timeout=TIMEOUT3), False)
606dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertTimingAlmostEqual(acquire.elapsed, TIMEOUT3)
607dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
608dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
609dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonclass _TestCondition(BaseTestCase):
610dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
611dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def f(self, cond, sleeping, woken, timeout=None):
612dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        cond.acquire()
613dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        sleeping.release()
614dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        cond.wait(timeout)
615dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        woken.release()
616dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        cond.release()
617dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
618dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def check_invariant(self, cond):
619dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        # this is only supposed to succeed when there are no sleepers
620dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        if self.TYPE == 'processes':
621dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            try:
622dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson                sleepers = (cond._sleeping_count.get_value() -
623dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson                            cond._woken_count.get_value())
624dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson                self.assertEqual(sleepers, 0)
625dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson                self.assertEqual(cond._wait_semaphore.get_value(), 0)
626dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            except NotImplementedError:
627dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson                pass
628dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
629dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def test_notify(self):
630dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        cond = self.Condition()
631dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        sleeping = self.Semaphore(0)
632dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        woken = self.Semaphore(0)
633dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
634dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        p = self.Process(target=self.f, args=(cond, sleeping, woken))
6355bc9f4c09c99eb701dbee83fb9e26eed558e474fJesse Noller        p.daemon = True
636dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        p.start()
637dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
638dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        p = threading.Thread(target=self.f, args=(cond, sleeping, woken))
6395bc9f4c09c99eb701dbee83fb9e26eed558e474fJesse Noller        p.daemon = True
640dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        p.start()
641dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
642dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        # wait for both children to start sleeping
643dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        sleeping.acquire()
644dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        sleeping.acquire()
645dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
646dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        # check no process/thread has woken up
647dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        time.sleep(DELTA)
648dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertReturnsIfImplemented(0, get_value, woken)
649dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
650dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        # wake up one process/thread
651dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        cond.acquire()
652dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        cond.notify()
653dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        cond.release()
654dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
655dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        # check one process/thread has woken up
656dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        time.sleep(DELTA)
657dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertReturnsIfImplemented(1, get_value, woken)
658dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
659dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        # wake up another
660dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        cond.acquire()
661dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        cond.notify()
662dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        cond.release()
663dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
664dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        # check other has woken up
665dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        time.sleep(DELTA)
666dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertReturnsIfImplemented(2, get_value, woken)
667dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
668dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        # check state is not mucked up
669dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.check_invariant(cond)
670dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        p.join()
671dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
672dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def test_notify_all(self):
673dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        cond = self.Condition()
674dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        sleeping = self.Semaphore(0)
675dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        woken = self.Semaphore(0)
676dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
677dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        # start some threads/processes which will timeout
678dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        for i in range(3):
679dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            p = self.Process(target=self.f,
680dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson                             args=(cond, sleeping, woken, TIMEOUT1))
6815bc9f4c09c99eb701dbee83fb9e26eed558e474fJesse Noller            p.daemon = True
682dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            p.start()
683dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
684dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            t = threading.Thread(target=self.f,
685dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson                                 args=(cond, sleeping, woken, TIMEOUT1))
686a9b2222de40ed62e6ec1c79f6a89607913f4babdBenjamin Peterson            t.daemon = True
687dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            t.start()
688dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
689dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        # wait for them all to sleep
690dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        for i in xrange(6):
691dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            sleeping.acquire()
692dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
693dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        # check they have all timed out
694dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        for i in xrange(6):
695dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            woken.acquire()
696dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertReturnsIfImplemented(0, get_value, woken)
697dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
698dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        # check state is not mucked up
699dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.check_invariant(cond)
700dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
701dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        # start some more threads/processes
702dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        for i in range(3):
703dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            p = self.Process(target=self.f, args=(cond, sleeping, woken))
7045bc9f4c09c99eb701dbee83fb9e26eed558e474fJesse Noller            p.daemon = True
705dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            p.start()
706dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
707dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            t = threading.Thread(target=self.f, args=(cond, sleeping, woken))
708a9b2222de40ed62e6ec1c79f6a89607913f4babdBenjamin Peterson            t.daemon = True
709dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            t.start()
710dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
711dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        # wait for them to all sleep
712dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        for i in xrange(6):
713dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            sleeping.acquire()
714dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
715dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        # check no process/thread has woken up
716dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        time.sleep(DELTA)
717dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertReturnsIfImplemented(0, get_value, woken)
718dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
719dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        # wake them all up
720dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        cond.acquire()
721dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        cond.notify_all()
722dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        cond.release()
723dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
724dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        # check they have all woken
725dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        time.sleep(DELTA)
726dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertReturnsIfImplemented(6, get_value, woken)
727dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
728dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        # check state is not mucked up
729dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.check_invariant(cond)
730dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
731dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def test_timeout(self):
732dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        cond = self.Condition()
733dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        wait = TimingWrapper(cond.wait)
734dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        cond.acquire()
735dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        res = wait(TIMEOUT1)
736dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        cond.release()
737dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(res, None)
738dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertTimingAlmostEqual(wait.elapsed, TIMEOUT1)
739dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
740dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
741dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonclass _TestEvent(BaseTestCase):
742dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
743dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def _test_event(self, event):
744dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        time.sleep(TIMEOUT2)
745dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        event.set()
746dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
747dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def test_event(self):
748dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        event = self.Event()
749dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        wait = TimingWrapper(event.wait)
750dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
751dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        # Removed temporaily, due to API shear, this does not
752dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        # work with threading._Event objects. is_set == isSet
75302cb0eb231fc01e2a50cbe14f6da7a8df52959efJesse Noller        self.assertEqual(event.is_set(), False)
754dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
75502cb0eb231fc01e2a50cbe14f6da7a8df52959efJesse Noller        # Removed, threading.Event.wait() will return the value of the __flag
75602cb0eb231fc01e2a50cbe14f6da7a8df52959efJesse Noller        # instead of None. API Shear with the semaphore backed mp.Event
75702cb0eb231fc01e2a50cbe14f6da7a8df52959efJesse Noller        self.assertEqual(wait(0.0), False)
758dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertTimingAlmostEqual(wait.elapsed, 0.0)
75902cb0eb231fc01e2a50cbe14f6da7a8df52959efJesse Noller        self.assertEqual(wait(TIMEOUT1), False)
760dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertTimingAlmostEqual(wait.elapsed, TIMEOUT1)
761dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
762dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        event.set()
763dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
764dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        # See note above on the API differences
76502cb0eb231fc01e2a50cbe14f6da7a8df52959efJesse Noller        self.assertEqual(event.is_set(), True)
76602cb0eb231fc01e2a50cbe14f6da7a8df52959efJesse Noller        self.assertEqual(wait(), True)
767dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertTimingAlmostEqual(wait.elapsed, 0.0)
76802cb0eb231fc01e2a50cbe14f6da7a8df52959efJesse Noller        self.assertEqual(wait(TIMEOUT1), True)
769dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertTimingAlmostEqual(wait.elapsed, 0.0)
770dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        # self.assertEqual(event.is_set(), True)
771dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
772dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        event.clear()
773dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
774dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        #self.assertEqual(event.is_set(), False)
775dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
776dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.Process(target=self._test_event, args=(event,)).start()
77702cb0eb231fc01e2a50cbe14f6da7a8df52959efJesse Noller        self.assertEqual(wait(), True)
778dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
779dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson#
780dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson#
781dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson#
782dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
783dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonclass _TestValue(BaseTestCase):
784dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
785dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    codes_values = [
786dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        ('i', 4343, 24234),
787dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        ('d', 3.625, -4.25),
788dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        ('h', -232, 234),
789dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        ('c', latin('x'), latin('y'))
790dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        ]
791dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
792dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def _test(self, values):
793dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        for sv, cv in zip(values, self.codes_values):
794dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            sv.value = cv[2]
795dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
796dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
797dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def test_value(self, raw=False):
798dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        if self.TYPE != 'processes':
799dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            return
800dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
801dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        if raw:
802dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            values = [self.RawValue(code, value)
803dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson                      for code, value, _ in self.codes_values]
804dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        else:
805dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            values = [self.Value(code, value)
806dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson                      for code, value, _ in self.codes_values]
807dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
808dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        for sv, cv in zip(values, self.codes_values):
809dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            self.assertEqual(sv.value, cv[1])
810dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
811dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        proc = self.Process(target=self._test, args=(values,))
812dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        proc.start()
813dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        proc.join()
814dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
815dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        for sv, cv in zip(values, self.codes_values):
816dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            self.assertEqual(sv.value, cv[2])
817dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
818dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def test_rawvalue(self):
819dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.test_value(raw=True)
820dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
821dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def test_getobj_getlock(self):
822dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        if self.TYPE != 'processes':
823dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            return
824dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
825dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        val1 = self.Value('i', 5)
826dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        lock1 = val1.get_lock()
827dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        obj1 = val1.get_obj()
828dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
829dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        val2 = self.Value('i', 5, lock=None)
830dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        lock2 = val2.get_lock()
831dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        obj2 = val2.get_obj()
832dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
833dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        lock = self.Lock()
834dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        val3 = self.Value('i', 5, lock=lock)
835dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        lock3 = val3.get_lock()
836dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        obj3 = val3.get_obj()
837dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(lock, lock3)
838dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
8396ab22154ddabdb67bd510a1f2e0aa9c7e0ee607dJesse Noller        arr4 = self.Value('i', 5, lock=False)
840dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertFalse(hasattr(arr4, 'get_lock'))
841dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertFalse(hasattr(arr4, 'get_obj'))
842dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
8436ab22154ddabdb67bd510a1f2e0aa9c7e0ee607dJesse Noller        self.assertRaises(AttributeError, self.Value, 'i', 5, lock='navalue')
8446ab22154ddabdb67bd510a1f2e0aa9c7e0ee607dJesse Noller
8456ab22154ddabdb67bd510a1f2e0aa9c7e0ee607dJesse Noller        arr5 = self.RawValue('i', 5)
8466ab22154ddabdb67bd510a1f2e0aa9c7e0ee607dJesse Noller        self.assertFalse(hasattr(arr5, 'get_lock'))
8476ab22154ddabdb67bd510a1f2e0aa9c7e0ee607dJesse Noller        self.assertFalse(hasattr(arr5, 'get_obj'))
8486ab22154ddabdb67bd510a1f2e0aa9c7e0ee607dJesse Noller
849dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
850dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonclass _TestArray(BaseTestCase):
851dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
852dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def f(self, seq):
853dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        for i in range(1, len(seq)):
854dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            seq[i] += seq[i-1]
855dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
856dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def test_array(self, raw=False):
857dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        if self.TYPE != 'processes':
858dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            return
859dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
860dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        seq = [680, 626, 934, 821, 150, 233, 548, 982, 714, 831]
861dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        if raw:
862dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            arr = self.RawArray('i', seq)
863dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        else:
864dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            arr = self.Array('i', seq)
865dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
866dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(len(arr), len(seq))
867dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(arr[3], seq[3])
868dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(list(arr[2:7]), list(seq[2:7]))
869dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
870dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        arr[4:8] = seq[4:8] = array.array('i', [1, 2, 3, 4])
871dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
872dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(list(arr[:]), seq)
873dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
874dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.f(seq)
875dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
876dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        p = self.Process(target=self.f, args=(arr,))
877dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        p.start()
878dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        p.join()
879dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
880dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(list(arr[:]), seq)
881dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
882dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def test_rawarray(self):
883dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.test_array(raw=True)
884dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
885dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def test_getobj_getlock_obj(self):
886dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        if self.TYPE != 'processes':
887dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            return
888dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
889dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        arr1 = self.Array('i', range(10))
890dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        lock1 = arr1.get_lock()
891dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        obj1 = arr1.get_obj()
892dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
893dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        arr2 = self.Array('i', range(10), lock=None)
894dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        lock2 = arr2.get_lock()
895dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        obj2 = arr2.get_obj()
896dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
897dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        lock = self.Lock()
898dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        arr3 = self.Array('i', range(10), lock=lock)
899dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        lock3 = arr3.get_lock()
900dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        obj3 = arr3.get_obj()
901dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(lock, lock3)
902dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
9036ab22154ddabdb67bd510a1f2e0aa9c7e0ee607dJesse Noller        arr4 = self.Array('i', range(10), lock=False)
904dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertFalse(hasattr(arr4, 'get_lock'))
905dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertFalse(hasattr(arr4, 'get_obj'))
9066ab22154ddabdb67bd510a1f2e0aa9c7e0ee607dJesse Noller        self.assertRaises(AttributeError,
9076ab22154ddabdb67bd510a1f2e0aa9c7e0ee607dJesse Noller                          self.Array, 'i', range(10), lock='notalock')
9086ab22154ddabdb67bd510a1f2e0aa9c7e0ee607dJesse Noller
9096ab22154ddabdb67bd510a1f2e0aa9c7e0ee607dJesse Noller        arr5 = self.RawArray('i', range(10))
9106ab22154ddabdb67bd510a1f2e0aa9c7e0ee607dJesse Noller        self.assertFalse(hasattr(arr5, 'get_lock'))
9116ab22154ddabdb67bd510a1f2e0aa9c7e0ee607dJesse Noller        self.assertFalse(hasattr(arr5, 'get_obj'))
912dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
913dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson#
914dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson#
915dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson#
916dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
917dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonclass _TestContainers(BaseTestCase):
918dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
919dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    ALLOWED_TYPES = ('manager',)
920dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
921dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def test_list(self):
922dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        a = self.list(range(10))
923dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(a[:], range(10))
924dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
925dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        b = self.list()
926dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(b[:], [])
927dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
928dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        b.extend(range(5))
929dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(b[:], range(5))
930dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
931dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(b[2], 2)
932dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(b[2:10], [2,3,4])
933dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
934dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        b *= 2
935dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(b[:], [0, 1, 2, 3, 4, 0, 1, 2, 3, 4])
936dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
937dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(b + [5, 6], [0, 1, 2, 3, 4, 0, 1, 2, 3, 4, 5, 6])
938dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
939dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(a[:], range(10))
940dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
941dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        d = [a, b]
942dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        e = self.list(d)
943dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(
944dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            e[:],
945dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            [[0, 1, 2, 3, 4, 5, 6, 7, 8, 9], [0, 1, 2, 3, 4, 0, 1, 2, 3, 4]]
946dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            )
947dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
948dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        f = self.list([a])
949dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        a.append('hello')
950dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(f[:], [[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 'hello']])
951dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
952dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def test_dict(self):
953dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        d = self.dict()
954dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        indices = range(65, 70)
955dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        for i in indices:
956dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            d[i] = chr(i)
957dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(d.copy(), dict((i, chr(i)) for i in indices))
958dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(sorted(d.keys()), indices)
959dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(sorted(d.values()), [chr(i) for i in indices])
960dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(sorted(d.items()), [(i, chr(i)) for i in indices])
961dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
962dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def test_namespace(self):
963dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        n = self.Namespace()
964dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        n.name = 'Bob'
965dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        n.job = 'Builder'
966dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        n._hidden = 'hidden'
967dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual((n.name, n.job), ('Bob', 'Builder'))
968dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        del n.job
969dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(str(n), "Namespace(name='Bob')")
970dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertTrue(hasattr(n, 'name'))
971dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertTrue(not hasattr(n, 'job'))
972dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
973dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson#
974dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson#
975dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson#
976dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
977dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersondef sqr(x, wait=0.0):
978dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    time.sleep(wait)
979dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    return x*x
980dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonclass _TestPool(BaseTestCase):
981dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
982dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def test_apply(self):
983dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        papply = self.pool.apply
984dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(papply(sqr, (5,)), sqr(5))
985dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(papply(sqr, (), {'x':3}), sqr(x=3))
986dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
987dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def test_map(self):
988dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        pmap = self.pool.map
989dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(pmap(sqr, range(10)), map(sqr, range(10)))
990dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(pmap(sqr, range(100), chunksize=20),
991dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson                         map(sqr, range(100)))
992dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
9937530e47948446f03a79ad7dec4cc129ad3388418Jesse Noller    def test_map_chunksize(self):
9947530e47948446f03a79ad7dec4cc129ad3388418Jesse Noller        try:
9957530e47948446f03a79ad7dec4cc129ad3388418Jesse Noller            self.pool.map_async(sqr, [], chunksize=1).get(timeout=TIMEOUT1)
9967530e47948446f03a79ad7dec4cc129ad3388418Jesse Noller        except multiprocessing.TimeoutError:
9977530e47948446f03a79ad7dec4cc129ad3388418Jesse Noller            self.fail("pool.map_async with chunksize stalled on null list")
9987530e47948446f03a79ad7dec4cc129ad3388418Jesse Noller
999dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def test_async(self):
1000dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        res = self.pool.apply_async(sqr, (7, TIMEOUT1,))
1001dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        get = TimingWrapper(res.get)
1002dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(get(), 49)
1003dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertTimingAlmostEqual(get.elapsed, TIMEOUT1)
1004dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1005dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def test_async_timeout(self):
1006dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        res = self.pool.apply_async(sqr, (6, TIMEOUT2 + 0.2))
1007dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        get = TimingWrapper(res.get)
1008dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertRaises(multiprocessing.TimeoutError, get, timeout=TIMEOUT2)
1009dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertTimingAlmostEqual(get.elapsed, TIMEOUT2)
1010dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1011dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def test_imap(self):
1012dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        it = self.pool.imap(sqr, range(10))
1013dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(list(it), map(sqr, range(10)))
1014dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1015dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        it = self.pool.imap(sqr, range(10))
1016dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        for i in range(10):
1017dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            self.assertEqual(it.next(), i*i)
1018dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertRaises(StopIteration, it.next)
1019dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1020dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        it = self.pool.imap(sqr, range(1000), chunksize=100)
1021dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        for i in range(1000):
1022dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            self.assertEqual(it.next(), i*i)
1023dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertRaises(StopIteration, it.next)
1024dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1025dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def test_imap_unordered(self):
1026dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        it = self.pool.imap_unordered(sqr, range(1000))
1027dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(sorted(it), map(sqr, range(1000)))
1028dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1029dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        it = self.pool.imap_unordered(sqr, range(1000), chunksize=53)
1030dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(sorted(it), map(sqr, range(1000)))
1031dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1032dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def test_make_pool(self):
1033dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        p = multiprocessing.Pool(3)
1034dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(3, len(p._pool))
1035dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        p.close()
1036dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        p.join()
1037dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1038dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def test_terminate(self):
1039dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        if self.TYPE == 'manager':
1040dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            # On Unix a forked process increfs each shared object to
1041dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            # which its parent process held a reference.  If the
1042dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            # forked process gets terminated then there is likely to
1043dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            # be a reference leak.  So to prevent
1044dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            # _TestZZZNumberOfObjects from failing we skip this test
1045dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            # when using a manager.
1046dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            return
1047dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1048dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        result = self.pool.map_async(
1049dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            time.sleep, [0.1 for i in range(10000)], chunksize=1
1050dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            )
1051dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.pool.terminate()
1052dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        join = TimingWrapper(self.pool.join)
1053dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        join()
1054dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertTrue(join.elapsed < 0.2)
1055654ade3e6afa2527d1f642be28d69e219bd58b71Jesse Noller
1056654ade3e6afa2527d1f642be28d69e219bd58b71Jesse Nollerclass _TestPoolWorkerLifetime(BaseTestCase):
1057654ade3e6afa2527d1f642be28d69e219bd58b71Jesse Noller
1058654ade3e6afa2527d1f642be28d69e219bd58b71Jesse Noller    ALLOWED_TYPES = ('processes', )
1059654ade3e6afa2527d1f642be28d69e219bd58b71Jesse Noller    def test_pool_worker_lifetime(self):
1060654ade3e6afa2527d1f642be28d69e219bd58b71Jesse Noller        p = multiprocessing.Pool(3, maxtasksperchild=10)
1061654ade3e6afa2527d1f642be28d69e219bd58b71Jesse Noller        self.assertEqual(3, len(p._pool))
1062654ade3e6afa2527d1f642be28d69e219bd58b71Jesse Noller        origworkerpids = [w.pid for w in p._pool]
1063654ade3e6afa2527d1f642be28d69e219bd58b71Jesse Noller        # Run many tasks so each worker gets replaced (hopefully)
1064654ade3e6afa2527d1f642be28d69e219bd58b71Jesse Noller        results = []
1065654ade3e6afa2527d1f642be28d69e219bd58b71Jesse Noller        for i in range(100):
1066654ade3e6afa2527d1f642be28d69e219bd58b71Jesse Noller            results.append(p.apply_async(sqr, (i, )))
1067654ade3e6afa2527d1f642be28d69e219bd58b71Jesse Noller        # Fetch the results and verify we got the right answers,
1068654ade3e6afa2527d1f642be28d69e219bd58b71Jesse Noller        # also ensuring all the tasks have completed.
1069654ade3e6afa2527d1f642be28d69e219bd58b71Jesse Noller        for (j, res) in enumerate(results):
1070654ade3e6afa2527d1f642be28d69e219bd58b71Jesse Noller            self.assertEqual(res.get(), sqr(j))
1071654ade3e6afa2527d1f642be28d69e219bd58b71Jesse Noller        # Refill the pool
1072654ade3e6afa2527d1f642be28d69e219bd58b71Jesse Noller        p._repopulate_pool()
1073654ade3e6afa2527d1f642be28d69e219bd58b71Jesse Noller        # Finally, check that the worker pids have changed
1074654ade3e6afa2527d1f642be28d69e219bd58b71Jesse Noller        finalworkerpids = [w.pid for w in p._pool]
1075654ade3e6afa2527d1f642be28d69e219bd58b71Jesse Noller        self.assertNotEqual(sorted(origworkerpids), sorted(finalworkerpids))
1076654ade3e6afa2527d1f642be28d69e219bd58b71Jesse Noller        p.close()
1077654ade3e6afa2527d1f642be28d69e219bd58b71Jesse Noller        p.join()
1078654ade3e6afa2527d1f642be28d69e219bd58b71Jesse Noller
1079dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson#
1080dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# Test that manager has expected number of shared objects left
1081dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson#
1082dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1083dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonclass _TestZZZNumberOfObjects(BaseTestCase):
1084dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    # Because test cases are sorted alphabetically, this one will get
1085dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    # run after all the other tests for the manager.  It tests that
1086dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    # there have been no "reference leaks" for the manager's shared
1087dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    # objects.  Note the comment in _TestPool.test_terminate().
1088dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    ALLOWED_TYPES = ('manager',)
1089dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1090dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def test_number_of_objects(self):
1091dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        EXPECTED_NUMBER = 1                # the pool object is still alive
1092dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        multiprocessing.active_children()  # discard dead process objs
1093dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        gc.collect()                       # do garbage collection
1094dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        refs = self.manager._number_of_objects()
10957314b38168da53863136d1937059fc0ac4883a56Jesse Noller        debug_info = self.manager._debug_info()
1096dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        if refs != EXPECTED_NUMBER:
10977fb9640d57f5d96dcaa0d0e6497abc21fa85f37eJesse Noller            print self.manager._debug_info()
10987314b38168da53863136d1937059fc0ac4883a56Jesse Noller            print debug_info
1099dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1100dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(refs, EXPECTED_NUMBER)
1101dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1102dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson#
1103dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# Test of creating a customized manager class
1104dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson#
1105dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1106dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonfrom multiprocessing.managers import BaseManager, BaseProxy, RemoteError
1107dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1108dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonclass FooBar(object):
1109dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def f(self):
1110dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        return 'f()'
1111dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def g(self):
1112dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        raise ValueError
1113dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def _h(self):
1114dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        return '_h()'
1115dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1116dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersondef baz():
1117dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    for i in xrange(10):
1118dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        yield i*i
1119dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1120dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonclass IteratorProxy(BaseProxy):
1121dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    _exposed_ = ('next', '__next__')
1122dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def __iter__(self):
1123dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        return self
1124dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def next(self):
1125dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        return self._callmethod('next')
1126dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def __next__(self):
1127dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        return self._callmethod('__next__')
1128dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1129dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonclass MyManager(BaseManager):
1130dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    pass
1131dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1132dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin PetersonMyManager.register('Foo', callable=FooBar)
1133dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin PetersonMyManager.register('Bar', callable=FooBar, exposed=('f', '_h'))
1134dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin PetersonMyManager.register('baz', callable=baz, proxytype=IteratorProxy)
1135dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1136dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1137dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonclass _TestMyManager(BaseTestCase):
1138dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1139dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    ALLOWED_TYPES = ('manager',)
1140dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1141dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def test_mymanager(self):
1142dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        manager = MyManager()
1143dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        manager.start()
1144dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1145dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        foo = manager.Foo()
1146dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        bar = manager.Bar()
1147dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        baz = manager.baz()
1148dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1149dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        foo_methods = [name for name in ('f', 'g', '_h') if hasattr(foo, name)]
1150dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        bar_methods = [name for name in ('f', 'g', '_h') if hasattr(bar, name)]
1151dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1152dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(foo_methods, ['f', 'g'])
1153dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(bar_methods, ['f', '_h'])
1154dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1155dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(foo.f(), 'f()')
1156dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertRaises(ValueError, foo.g)
1157dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(foo._callmethod('f'), 'f()')
1158dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertRaises(RemoteError, foo._callmethod, '_h')
1159dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1160dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(bar.f(), 'f()')
1161dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(bar._h(), '_h()')
1162dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(bar._callmethod('f'), 'f()')
1163dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(bar._callmethod('_h'), '_h()')
1164dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1165dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(list(baz), [i*i for i in range(10)])
1166dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1167dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        manager.shutdown()
1168dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1169dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson#
1170dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# Test of connecting to a remote server and using xmlrpclib for serialization
1171dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson#
1172dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1173dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson_queue = Queue.Queue()
1174dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersondef get_queue():
1175dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    return _queue
1176dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1177dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonclass QueueManager(BaseManager):
1178dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    '''manager class used by server process'''
1179dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin PetersonQueueManager.register('get_queue', callable=get_queue)
1180dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1181dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonclass QueueManager2(BaseManager):
1182dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    '''manager class which specifies the same interface as QueueManager'''
1183dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin PetersonQueueManager2.register('get_queue')
1184dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1185dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1186dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin PetersonSERIALIZER = 'xmlrpclib'
1187dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1188dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonclass _TestRemoteManager(BaseTestCase):
1189dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1190dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    ALLOWED_TYPES = ('manager',)
1191dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1192dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def _putter(self, address, authkey):
1193dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        manager = QueueManager2(
1194dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            address=address, authkey=authkey, serializer=SERIALIZER
1195dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            )
1196dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        manager.connect()
1197dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        queue = manager.get_queue()
1198dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        queue.put(('hello world', None, True, 2.25))
1199dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1200dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def test_remote(self):
1201dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        authkey = os.urandom(32)
1202dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1203dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        manager = QueueManager(
1204dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            address=('localhost', 0), authkey=authkey, serializer=SERIALIZER
1205dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            )
1206dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        manager.start()
1207dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1208dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        p = self.Process(target=self._putter, args=(manager.address, authkey))
1209dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        p.start()
1210dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1211dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        manager2 = QueueManager2(
1212dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            address=manager.address, authkey=authkey, serializer=SERIALIZER
1213dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            )
1214dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        manager2.connect()
1215dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        queue = manager2.get_queue()
1216dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1217dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        # Note that xmlrpclib will deserialize object as a list not a tuple
1218dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(queue.get(), ['hello world', None, True, 2.25])
1219dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1220dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        # Because we are using xmlrpclib for serialization instead of
1221dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        # pickle this will cause a serialization error.
1222dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertRaises(Exception, queue.put, time.sleep)
1223dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1224dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        # Make queue finalizer run before the server is stopped
1225dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        del queue
1226dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        manager.shutdown()
1227dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1228459a6481662c62d6cb57a070d21230db3e721c56Jesse Nollerclass _TestManagerRestart(BaseTestCase):
1229459a6481662c62d6cb57a070d21230db3e721c56Jesse Noller
1230459a6481662c62d6cb57a070d21230db3e721c56Jesse Noller    def _putter(self, address, authkey):
1231459a6481662c62d6cb57a070d21230db3e721c56Jesse Noller        manager = QueueManager(
1232459a6481662c62d6cb57a070d21230db3e721c56Jesse Noller            address=address, authkey=authkey, serializer=SERIALIZER)
1233459a6481662c62d6cb57a070d21230db3e721c56Jesse Noller        manager.connect()
1234459a6481662c62d6cb57a070d21230db3e721c56Jesse Noller        queue = manager.get_queue()
1235459a6481662c62d6cb57a070d21230db3e721c56Jesse Noller        queue.put('hello world')
1236459a6481662c62d6cb57a070d21230db3e721c56Jesse Noller
1237459a6481662c62d6cb57a070d21230db3e721c56Jesse Noller    def test_rapid_restart(self):
1238459a6481662c62d6cb57a070d21230db3e721c56Jesse Noller        authkey = os.urandom(32)
1239c7298ff0fa9a4b667f206733d591966729c87337R. David Murray        port = test_support.find_unused_port()
1240459a6481662c62d6cb57a070d21230db3e721c56Jesse Noller        manager = QueueManager(
1241c7298ff0fa9a4b667f206733d591966729c87337R. David Murray            address=('localhost', port), authkey=authkey, serializer=SERIALIZER)
1242459a6481662c62d6cb57a070d21230db3e721c56Jesse Noller        manager.start()
1243459a6481662c62d6cb57a070d21230db3e721c56Jesse Noller
1244459a6481662c62d6cb57a070d21230db3e721c56Jesse Noller        p = self.Process(target=self._putter, args=(manager.address, authkey))
1245459a6481662c62d6cb57a070d21230db3e721c56Jesse Noller        p.start()
1246459a6481662c62d6cb57a070d21230db3e721c56Jesse Noller        queue = manager.get_queue()
1247459a6481662c62d6cb57a070d21230db3e721c56Jesse Noller        self.assertEqual(queue.get(), 'hello world')
1248019ce773cd25ee08d1a822f06958774b43881d00Jesse Noller        del queue
1249459a6481662c62d6cb57a070d21230db3e721c56Jesse Noller        manager.shutdown()
1250459a6481662c62d6cb57a070d21230db3e721c56Jesse Noller        manager = QueueManager(
1251c7298ff0fa9a4b667f206733d591966729c87337R. David Murray            address=('localhost', port), authkey=authkey, serializer=SERIALIZER)
1252459a6481662c62d6cb57a070d21230db3e721c56Jesse Noller        manager.start()
1253019ce773cd25ee08d1a822f06958774b43881d00Jesse Noller        manager.shutdown()
1254459a6481662c62d6cb57a070d21230db3e721c56Jesse Noller
1255dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson#
1256dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson#
1257dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson#
1258dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1259dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin PetersonSENTINEL = latin('')
1260dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1261dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonclass _TestConnection(BaseTestCase):
1262dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1263dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    ALLOWED_TYPES = ('processes', 'threads')
1264dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1265dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def _echo(self, conn):
1266dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        for msg in iter(conn.recv_bytes, SENTINEL):
1267dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            conn.send_bytes(msg)
1268dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        conn.close()
1269dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1270dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def test_connection(self):
1271dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        conn, child_conn = self.Pipe()
1272dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1273dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        p = self.Process(target=self._echo, args=(child_conn,))
12745bc9f4c09c99eb701dbee83fb9e26eed558e474fJesse Noller        p.daemon = True
1275dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        p.start()
1276dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1277dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        seq = [1, 2.25, None]
1278dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        msg = latin('hello world')
1279dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        longmsg = msg * 10
1280dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        arr = array.array('i', range(4))
1281dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1282dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        if self.TYPE == 'processes':
1283dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            self.assertEqual(type(conn.fileno()), int)
1284dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1285dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(conn.send(seq), None)
1286dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(conn.recv(), seq)
1287dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1288dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(conn.send_bytes(msg), None)
1289dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(conn.recv_bytes(), msg)
1290dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1291dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        if self.TYPE == 'processes':
1292dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            buffer = array.array('i', [0]*10)
1293dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            expected = list(arr) + [0] * (10 - len(arr))
1294dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            self.assertEqual(conn.send_bytes(arr), None)
1295dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            self.assertEqual(conn.recv_bytes_into(buffer),
1296dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson                             len(arr) * buffer.itemsize)
1297dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            self.assertEqual(list(buffer), expected)
1298dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1299dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            buffer = array.array('i', [0]*10)
1300dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            expected = [0] * 3 + list(arr) + [0] * (10 - 3 - len(arr))
1301dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            self.assertEqual(conn.send_bytes(arr), None)
1302dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            self.assertEqual(conn.recv_bytes_into(buffer, 3 * buffer.itemsize),
1303dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson                             len(arr) * buffer.itemsize)
1304dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            self.assertEqual(list(buffer), expected)
1305dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1306dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            buffer = bytearray(latin(' ' * 40))
1307dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            self.assertEqual(conn.send_bytes(longmsg), None)
1308dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            try:
1309dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson                res = conn.recv_bytes_into(buffer)
1310dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            except multiprocessing.BufferTooShort, e:
1311dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson                self.assertEqual(e.args, (longmsg,))
1312dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            else:
1313dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson                self.fail('expected BufferTooShort, got %s' % res)
1314dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1315dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        poll = TimingWrapper(conn.poll)
1316dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1317dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(poll(), False)
1318dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertTimingAlmostEqual(poll.elapsed, 0)
1319dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1320dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(poll(TIMEOUT1), False)
1321dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertTimingAlmostEqual(poll.elapsed, TIMEOUT1)
1322dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1323dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        conn.send(None)
1324dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1325dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(poll(TIMEOUT1), True)
1326dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertTimingAlmostEqual(poll.elapsed, 0)
1327dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1328dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(conn.recv(), None)
1329dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1330dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        really_big_msg = latin('X') * (1024 * 1024 * 16)   # 16Mb
1331dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        conn.send_bytes(really_big_msg)
1332dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(conn.recv_bytes(), really_big_msg)
1333dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1334dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        conn.send_bytes(SENTINEL)                          # tell child to quit
1335dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        child_conn.close()
1336dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1337dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        if self.TYPE == 'processes':
1338dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            self.assertEqual(conn.readable, True)
1339dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            self.assertEqual(conn.writable, True)
1340dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            self.assertRaises(EOFError, conn.recv)
1341dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            self.assertRaises(EOFError, conn.recv_bytes)
1342dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1343dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        p.join()
1344dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1345dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def test_duplex_false(self):
1346dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        reader, writer = self.Pipe(duplex=False)
1347dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(writer.send(1), None)
1348dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(reader.recv(), 1)
1349dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        if self.TYPE == 'processes':
1350dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            self.assertEqual(reader.readable, True)
1351dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            self.assertEqual(reader.writable, False)
1352dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            self.assertEqual(writer.readable, False)
1353dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            self.assertEqual(writer.writable, True)
1354dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            self.assertRaises(IOError, reader.send, 2)
1355dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            self.assertRaises(IOError, writer.recv)
1356dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            self.assertRaises(IOError, writer.poll)
1357dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1358dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def test_spawn_close(self):
1359dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        # We test that a pipe connection can be closed by parent
1360dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        # process immediately after child is spawned.  On Windows this
1361dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        # would have sometimes failed on old versions because
1362dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        # child_conn would be closed before the child got a chance to
1363dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        # duplicate it.
1364dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        conn, child_conn = self.Pipe()
1365dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1366dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        p = self.Process(target=self._echo, args=(child_conn,))
1367dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        p.start()
1368dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        child_conn.close()    # this might complete before child initializes
1369dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1370dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        msg = latin('hello')
1371dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        conn.send_bytes(msg)
1372dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(conn.recv_bytes(), msg)
1373dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1374dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        conn.send_bytes(SENTINEL)
1375dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        conn.close()
1376dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        p.join()
1377dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1378dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def test_sendbytes(self):
1379dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        if self.TYPE != 'processes':
1380dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            return
1381dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1382dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        msg = latin('abcdefghijklmnopqrstuvwxyz')
1383dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        a, b = self.Pipe()
1384dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1385dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        a.send_bytes(msg)
1386dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(b.recv_bytes(), msg)
1387dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1388dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        a.send_bytes(msg, 5)
1389dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(b.recv_bytes(), msg[5:])
1390dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1391dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        a.send_bytes(msg, 7, 8)
1392dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(b.recv_bytes(), msg[7:7+8])
1393dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1394dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        a.send_bytes(msg, 26)
1395dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(b.recv_bytes(), latin(''))
1396dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1397dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        a.send_bytes(msg, 26, 0)
1398dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(b.recv_bytes(), latin(''))
1399dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1400dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertRaises(ValueError, a.send_bytes, msg, 27)
1401dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1402dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertRaises(ValueError, a.send_bytes, msg, 22, 5)
1403dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1404dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertRaises(ValueError, a.send_bytes, msg, 26, 1)
1405dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1406dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertRaises(ValueError, a.send_bytes, msg, -1)
1407dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1408dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertRaises(ValueError, a.send_bytes, msg, 4, -1)
1409dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1410dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonclass _TestListenerClient(BaseTestCase):
1411dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1412dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    ALLOWED_TYPES = ('processes', 'threads')
1413dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1414dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def _test(self, address):
1415dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        conn = self.connection.Client(address)
1416dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        conn.send('hello')
1417dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        conn.close()
1418dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1419dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def test_listener_client(self):
1420dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        for family in self.connection.families:
1421dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            l = self.connection.Listener(family=family)
1422dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            p = self.Process(target=self._test, args=(l.address,))
14235bc9f4c09c99eb701dbee83fb9e26eed558e474fJesse Noller            p.daemon = True
1424dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            p.start()
1425dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            conn = l.accept()
1426dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            self.assertEqual(conn.recv(), 'hello')
1427dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            p.join()
1428dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            l.close()
1429dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson#
1430dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# Test of sending connection and socket objects between processes
1431dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson#
1432da3a1b120055855a464c2d5f5143021ae8f5dc86Benjamin Peterson"""
1433dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonclass _TestPicklingConnections(BaseTestCase):
1434dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1435dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    ALLOWED_TYPES = ('processes',)
1436dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1437dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def _listener(self, conn, families):
1438dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        for fam in families:
1439dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            l = self.connection.Listener(family=fam)
1440dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            conn.send(l.address)
1441dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            new_conn = l.accept()
1442dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            conn.send(new_conn)
1443dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1444dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        if self.TYPE == 'processes':
1445dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            l = socket.socket()
1446dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            l.bind(('localhost', 0))
1447dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            conn.send(l.getsockname())
1448dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            l.listen(1)
1449dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            new_conn, addr = l.accept()
1450dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            conn.send(new_conn)
1451dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1452dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        conn.recv()
1453dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1454dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def _remote(self, conn):
1455dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        for (address, msg) in iter(conn.recv, None):
1456dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            client = self.connection.Client(address)
1457dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            client.send(msg.upper())
1458dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            client.close()
1459dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1460dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        if self.TYPE == 'processes':
1461dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            address, msg = conn.recv()
1462dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            client = socket.socket()
1463dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            client.connect(address)
1464dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            client.sendall(msg.upper())
1465dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            client.close()
1466dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1467dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        conn.close()
1468dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1469dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def test_pickling(self):
1470dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        try:
1471dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            multiprocessing.allow_connection_pickling()
1472dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        except ImportError:
1473dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            return
1474dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1475dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        families = self.connection.families
1476dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1477dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        lconn, lconn0 = self.Pipe()
1478dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        lp = self.Process(target=self._listener, args=(lconn0, families))
1479dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        lp.start()
1480dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        lconn0.close()
1481dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1482dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        rconn, rconn0 = self.Pipe()
1483dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        rp = self.Process(target=self._remote, args=(rconn0,))
1484dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        rp.start()
1485dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        rconn0.close()
1486dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1487dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        for fam in families:
1488dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            msg = ('This connection uses family %s' % fam).encode('ascii')
1489dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            address = lconn.recv()
1490dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            rconn.send((address, msg))
1491dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            new_conn = lconn.recv()
1492dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            self.assertEqual(new_conn.recv(), msg.upper())
1493dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1494dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        rconn.send(None)
1495dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1496dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        if self.TYPE == 'processes':
1497dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            msg = latin('This connection uses a normal socket')
1498dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            address = lconn.recv()
1499dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            rconn.send((address, msg))
1500dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            if hasattr(socket, 'fromfd'):
1501dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson                new_conn = lconn.recv()
1502dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson                self.assertEqual(new_conn.recv(100), msg.upper())
1503dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            else:
1504dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson                # XXX On Windows with Py2.6 need to backport fromfd()
1505dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson                discard = lconn.recv_bytes()
1506dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1507dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        lconn.send(None)
1508dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1509dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        rconn.close()
1510dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        lconn.close()
1511dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1512dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        lp.join()
1513dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        rp.join()
1514da3a1b120055855a464c2d5f5143021ae8f5dc86Benjamin Peterson"""
1515dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson#
1516dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson#
1517dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson#
1518dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1519dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonclass _TestHeap(BaseTestCase):
1520dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1521dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    ALLOWED_TYPES = ('processes',)
1522dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1523dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def test_heap(self):
1524dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        iterations = 5000
1525dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        maxblocks = 50
1526dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        blocks = []
1527dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1528dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        # create and destroy lots of blocks of different sizes
1529dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        for i in xrange(iterations):
1530dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            size = int(random.lognormvariate(0, 1) * 1000)
1531dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            b = multiprocessing.heap.BufferWrapper(size)
1532dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            blocks.append(b)
1533dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            if len(blocks) > maxblocks:
1534dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson                i = random.randrange(maxblocks)
1535dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson                del blocks[i]
1536dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1537dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        # get the heap object
1538dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        heap = multiprocessing.heap.BufferWrapper._heap
1539dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1540dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        # verify the state of the heap
1541dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        all = []
1542dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        occupied = 0
1543dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        for L in heap._len_to_seq.values():
1544dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            for arena, start, stop in L:
1545dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson                all.append((heap._arenas.index(arena), start, stop,
1546dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson                            stop-start, 'free'))
1547dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        for arena, start, stop in heap._allocated_blocks:
1548dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            all.append((heap._arenas.index(arena), start, stop,
1549dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson                        stop-start, 'occupied'))
1550dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            occupied += (stop-start)
1551dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1552dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        all.sort()
1553dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1554dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        for i in range(len(all)-1):
1555dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            (arena, start, stop) = all[i][:3]
1556dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            (narena, nstart, nstop) = all[i+1][:3]
1557dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            self.assertTrue((arena != narena and nstart == 0) or
1558dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson                            (stop == nstart))
1559dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1560dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson#
1561dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson#
1562dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson#
1563dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1564dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersontry:
1565dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    from ctypes import Structure, Value, copy, c_int, c_double
1566dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonexcept ImportError:
1567dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    Structure = object
1568dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    c_int = c_double = None
1569dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1570dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonclass _Foo(Structure):
1571dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    _fields_ = [
1572dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        ('x', c_int),
1573dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        ('y', c_double)
1574dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        ]
1575dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1576dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonclass _TestSharedCTypes(BaseTestCase):
1577dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1578dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    ALLOWED_TYPES = ('processes',)
1579dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1580dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def _double(self, x, y, foo, arr, string):
1581dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        x.value *= 2
1582dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        y.value *= 2
1583dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        foo.x *= 2
1584dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        foo.y *= 2
1585dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        string.value *= 2
1586dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        for i in range(len(arr)):
1587dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            arr[i] *= 2
1588dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1589dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def test_sharedctypes(self, lock=False):
1590dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        if c_int is None:
1591dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            return
1592dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1593dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        x = Value('i', 7, lock=lock)
1594bd564c3c21ef4c6d6cb0070870edd9d2f7c89d11Georg Brandl        y = Value(c_double, 1.0/3.0, lock=lock)
1595dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        foo = Value(_Foo, 3, 2, lock=lock)
1596bd564c3c21ef4c6d6cb0070870edd9d2f7c89d11Georg Brandl        arr = self.Array('d', range(10), lock=lock)
1597bd564c3c21ef4c6d6cb0070870edd9d2f7c89d11Georg Brandl        string = self.Array('c', 20, lock=lock)
1598dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        string.value = 'hello'
1599dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1600dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        p = self.Process(target=self._double, args=(x, y, foo, arr, string))
1601dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        p.start()
1602dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        p.join()
1603dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1604dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(x.value, 14)
1605dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertAlmostEqual(y.value, 2.0/3.0)
1606dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(foo.x, 6)
1607dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertAlmostEqual(foo.y, 4.0)
1608dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        for i in range(10):
1609dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            self.assertAlmostEqual(arr[i], i*2)
1610dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(string.value, latin('hellohello'))
1611dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1612dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def test_synchronize(self):
1613dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.test_sharedctypes(lock=True)
1614dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1615dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def test_copy(self):
1616dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        if c_int is None:
1617dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            return
1618dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1619dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        foo = _Foo(2, 5.0)
1620dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        bar = copy(foo)
1621dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        foo.x = 0
1622dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        foo.y = 0
1623dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(bar.x, 2)
1624dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertAlmostEqual(bar.y, 5.0)
1625dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1626dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson#
1627dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson#
1628dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson#
1629dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1630dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonclass _TestFinalize(BaseTestCase):
1631dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1632dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    ALLOWED_TYPES = ('processes',)
1633dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1634dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def _test_finalize(self, conn):
1635dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        class Foo(object):
1636dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            pass
1637dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1638dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        a = Foo()
1639dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        util.Finalize(a, conn.send, args=('a',))
1640dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        del a           # triggers callback for a
1641dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1642dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        b = Foo()
1643dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        close_b = util.Finalize(b, conn.send, args=('b',))
1644dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        close_b()       # triggers callback for b
1645dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        close_b()       # does nothing because callback has already been called
1646dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        del b           # does nothing because callback has already been called
1647dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1648dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        c = Foo()
1649dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        util.Finalize(c, conn.send, args=('c',))
1650dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1651dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        d10 = Foo()
1652dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        util.Finalize(d10, conn.send, args=('d10',), exitpriority=1)
1653dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1654dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        d01 = Foo()
1655dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        util.Finalize(d01, conn.send, args=('d01',), exitpriority=0)
1656dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        d02 = Foo()
1657dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        util.Finalize(d02, conn.send, args=('d02',), exitpriority=0)
1658dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        d03 = Foo()
1659dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        util.Finalize(d03, conn.send, args=('d03',), exitpriority=0)
1660dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1661dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        util.Finalize(None, conn.send, args=('e',), exitpriority=-10)
1662dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1663dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        util.Finalize(None, conn.send, args=('STOP',), exitpriority=-100)
1664dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1665dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        # call mutliprocessing's cleanup function then exit process without
1666dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        # garbage collecting locals
1667dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        util._exit_function()
1668dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        conn.close()
1669dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        os._exit(0)
1670dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1671dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def test_finalize(self):
1672dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        conn, child_conn = self.Pipe()
1673dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1674dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        p = self.Process(target=self._test_finalize, args=(child_conn,))
1675dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        p.start()
1676dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        p.join()
1677dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1678dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        result = [obj for obj in iter(conn.recv, 'STOP')]
1679dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(result, ['a', 'b', 'd10', 'd03', 'd02', 'd01', 'e'])
1680dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1681dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson#
1682dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# Test that from ... import * works for each module
1683dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson#
1684dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1685dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonclass _TestImportStar(BaseTestCase):
1686dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1687dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    ALLOWED_TYPES = ('processes',)
1688dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1689dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def test_import(self):
1690dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        modules = (
1691dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            'multiprocessing', 'multiprocessing.connection',
1692dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            'multiprocessing.heap', 'multiprocessing.managers',
1693dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            'multiprocessing.pool', 'multiprocessing.process',
1694dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            'multiprocessing.reduction', 'multiprocessing.sharedctypes',
1695dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            'multiprocessing.synchronize', 'multiprocessing.util'
1696dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            )
1697dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1698dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        for name in modules:
1699dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            __import__(name)
1700dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            mod = sys.modules[name]
1701dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1702dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            for attr in getattr(mod, '__all__', ()):
1703dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson                self.assertTrue(
1704dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson                    hasattr(mod, attr),
1705dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson                    '%r does not have attribute %r' % (mod, attr)
1706dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson                    )
1707dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1708dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson#
1709dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# Quick test that logging works -- does not test logging output
1710dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson#
1711dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1712dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonclass _TestLogging(BaseTestCase):
1713dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1714dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    ALLOWED_TYPES = ('processes',)
1715dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1716dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def test_enable_logging(self):
1717dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        logger = multiprocessing.get_logger()
1718dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        logger.setLevel(util.SUBWARNING)
1719dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertTrue(logger is not None)
1720dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        logger.debug('this will not be printed')
1721dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        logger.info('nor will this')
1722dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        logger.setLevel(LOG_LEVEL)
1723dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1724dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def _test_level(self, conn):
1725dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        logger = multiprocessing.get_logger()
1726dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        conn.send(logger.getEffectiveLevel())
1727dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1728dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def test_level(self):
1729dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        LEVEL1 = 32
1730dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        LEVEL2 = 37
1731dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1732dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        logger = multiprocessing.get_logger()
1733dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        root_logger = logging.getLogger()
1734dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        root_level = root_logger.level
1735dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1736dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        reader, writer = multiprocessing.Pipe(duplex=False)
1737dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1738dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        logger.setLevel(LEVEL1)
1739dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.Process(target=self._test_level, args=(writer,)).start()
1740dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(LEVEL1, reader.recv())
1741dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1742dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        logger.setLevel(logging.NOTSET)
1743dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        root_logger.setLevel(LEVEL2)
1744dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.Process(target=self._test_level, args=(writer,)).start()
1745dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(LEVEL2, reader.recv())
1746dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1747dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        root_logger.setLevel(root_level)
1748dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        logger.setLevel(level=LOG_LEVEL)
1749dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1750814d02dcd1b30a98f9a34c710be35de6db82aa40Jesse Noller
17519a03f2fd03278d2c12dfe253de1bbed7c0c9c506Jesse Noller# class _TestLoggingProcessName(BaseTestCase):
17529a03f2fd03278d2c12dfe253de1bbed7c0c9c506Jesse Noller#
17539a03f2fd03278d2c12dfe253de1bbed7c0c9c506Jesse Noller#     def handle(self, record):
17549a03f2fd03278d2c12dfe253de1bbed7c0c9c506Jesse Noller#         assert record.processName == multiprocessing.current_process().name
17559a03f2fd03278d2c12dfe253de1bbed7c0c9c506Jesse Noller#         self.__handled = True
17569a03f2fd03278d2c12dfe253de1bbed7c0c9c506Jesse Noller#
17579a03f2fd03278d2c12dfe253de1bbed7c0c9c506Jesse Noller#     def test_logging(self):
17589a03f2fd03278d2c12dfe253de1bbed7c0c9c506Jesse Noller#         handler = logging.Handler()
17599a03f2fd03278d2c12dfe253de1bbed7c0c9c506Jesse Noller#         handler.handle = self.handle
17609a03f2fd03278d2c12dfe253de1bbed7c0c9c506Jesse Noller#         self.__handled = False
17619a03f2fd03278d2c12dfe253de1bbed7c0c9c506Jesse Noller#         # Bypass getLogger() and side-effects
17629a03f2fd03278d2c12dfe253de1bbed7c0c9c506Jesse Noller#         logger = logging.getLoggerClass()(
17639a03f2fd03278d2c12dfe253de1bbed7c0c9c506Jesse Noller#                 'multiprocessing.test.TestLoggingProcessName')
17649a03f2fd03278d2c12dfe253de1bbed7c0c9c506Jesse Noller#         logger.addHandler(handler)
17659a03f2fd03278d2c12dfe253de1bbed7c0c9c506Jesse Noller#         logger.propagate = False
17669a03f2fd03278d2c12dfe253de1bbed7c0c9c506Jesse Noller#
17679a03f2fd03278d2c12dfe253de1bbed7c0c9c506Jesse Noller#         logger.warn('foo')
17689a03f2fd03278d2c12dfe253de1bbed7c0c9c506Jesse Noller#         assert self.__handled
1769814d02dcd1b30a98f9a34c710be35de6db82aa40Jesse Noller
1770dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson#
17719a5b2ad38d605206f05a52fe32868d3f839e8a86Jesse Noller# Test to verify handle verification, see issue 3321
17729a5b2ad38d605206f05a52fe32868d3f839e8a86Jesse Noller#
17739a5b2ad38d605206f05a52fe32868d3f839e8a86Jesse Noller
17749a5b2ad38d605206f05a52fe32868d3f839e8a86Jesse Nollerclass TestInvalidHandle(unittest.TestCase):
17759a5b2ad38d605206f05a52fe32868d3f839e8a86Jesse Noller
17769a5b2ad38d605206f05a52fe32868d3f839e8a86Jesse Noller    def test_invalid_handles(self):
17779a5b2ad38d605206f05a52fe32868d3f839e8a86Jesse Noller        if WIN32:
17789a5b2ad38d605206f05a52fe32868d3f839e8a86Jesse Noller            return
17799a5b2ad38d605206f05a52fe32868d3f839e8a86Jesse Noller        conn = _multiprocessing.Connection(44977608)
17809a5b2ad38d605206f05a52fe32868d3f839e8a86Jesse Noller        self.assertRaises(IOError, conn.poll)
17819a5b2ad38d605206f05a52fe32868d3f839e8a86Jesse Noller        self.assertRaises(IOError, _multiprocessing.Connection, -1)
17829a5b2ad38d605206f05a52fe32868d3f839e8a86Jesse Noller#
1783dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# Functions used to create test cases from the base ones in this module
1784dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson#
1785dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1786dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersondef get_attributes(Source, names):
1787dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    d = {}
1788dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    for name in names:
1789dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        obj = getattr(Source, name)
1790dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        if type(obj) == type(get_attributes):
1791dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            obj = staticmethod(obj)
1792dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        d[name] = obj
1793dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    return d
1794dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1795dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersondef create_test_cases(Mixin, type):
1796dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    result = {}
1797dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    glob = globals()
1798dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    Type = type[0].upper() + type[1:]
1799dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1800dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    for name in glob.keys():
1801dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        if name.startswith('_Test'):
1802dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            base = glob[name]
1803dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            if type in base.ALLOWED_TYPES:
1804dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson                newname = 'With' + Type + name[1:]
1805dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson                class Temp(base, unittest.TestCase, Mixin):
1806dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson                    pass
1807dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson                result[newname] = Temp
1808dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson                Temp.__name__ = newname
1809dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson                Temp.__module__ = Mixin.__module__
1810dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    return result
1811dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1812dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson#
1813dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# Create test cases
1814dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson#
1815dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1816dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonclass ProcessesMixin(object):
1817dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    TYPE = 'processes'
1818dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    Process = multiprocessing.Process
1819dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    locals().update(get_attributes(multiprocessing, (
1820dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        'Queue', 'Lock', 'RLock', 'Semaphore', 'BoundedSemaphore',
1821dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        'Condition', 'Event', 'Value', 'Array', 'RawValue',
1822dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        'RawArray', 'current_process', 'active_children', 'Pipe',
1823dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        'connection', 'JoinableQueue'
1824dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        )))
1825dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1826dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersontestcases_processes = create_test_cases(ProcessesMixin, type='processes')
1827dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonglobals().update(testcases_processes)
1828dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1829dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1830dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonclass ManagerMixin(object):
1831dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    TYPE = 'manager'
1832dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    Process = multiprocessing.Process
1833dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    manager = object.__new__(multiprocessing.managers.SyncManager)
1834dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    locals().update(get_attributes(manager, (
1835dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        'Queue', 'Lock', 'RLock', 'Semaphore', 'BoundedSemaphore',
1836dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson       'Condition', 'Event', 'Value', 'Array', 'list', 'dict',
1837dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        'Namespace', 'JoinableQueue'
1838dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        )))
1839dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1840dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersontestcases_manager = create_test_cases(ManagerMixin, type='manager')
1841dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonglobals().update(testcases_manager)
1842dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1843dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1844dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonclass ThreadsMixin(object):
1845dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    TYPE = 'threads'
1846dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    Process = multiprocessing.dummy.Process
1847dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    locals().update(get_attributes(multiprocessing.dummy, (
1848dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        'Queue', 'Lock', 'RLock', 'Semaphore', 'BoundedSemaphore',
1849dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        'Condition', 'Event', 'Value', 'Array', 'current_process',
1850dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        'active_children', 'Pipe', 'connection', 'dict', 'list',
1851dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        'Namespace', 'JoinableQueue'
1852dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        )))
1853dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1854dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersontestcases_threads = create_test_cases(ThreadsMixin, type='threads')
1855dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonglobals().update(testcases_threads)
1856dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
18570c519b3a5e847eea0dffb51ac8df7c68891daf70Neal Norwitzclass OtherTest(unittest.TestCase):
18580c519b3a5e847eea0dffb51ac8df7c68891daf70Neal Norwitz    # TODO: add more tests for deliver/answer challenge.
18590c519b3a5e847eea0dffb51ac8df7c68891daf70Neal Norwitz    def test_deliver_challenge_auth_failure(self):
18600c519b3a5e847eea0dffb51ac8df7c68891daf70Neal Norwitz        class _FakeConnection(object):
18610c519b3a5e847eea0dffb51ac8df7c68891daf70Neal Norwitz            def recv_bytes(self, size):
18622a7767a17311cada06240a187c8896bdbcc1a4d0Neal Norwitz                return b'something bogus'
18630c519b3a5e847eea0dffb51ac8df7c68891daf70Neal Norwitz            def send_bytes(self, data):
18640c519b3a5e847eea0dffb51ac8df7c68891daf70Neal Norwitz                pass
18650c519b3a5e847eea0dffb51ac8df7c68891daf70Neal Norwitz        self.assertRaises(multiprocessing.AuthenticationError,
18660c519b3a5e847eea0dffb51ac8df7c68891daf70Neal Norwitz                          multiprocessing.connection.deliver_challenge,
18670c519b3a5e847eea0dffb51ac8df7c68891daf70Neal Norwitz                          _FakeConnection(), b'abc')
18680c519b3a5e847eea0dffb51ac8df7c68891daf70Neal Norwitz
18690c519b3a5e847eea0dffb51ac8df7c68891daf70Neal Norwitz    def test_answer_challenge_auth_failure(self):
18700c519b3a5e847eea0dffb51ac8df7c68891daf70Neal Norwitz        class _FakeConnection(object):
18710c519b3a5e847eea0dffb51ac8df7c68891daf70Neal Norwitz            def __init__(self):
18720c519b3a5e847eea0dffb51ac8df7c68891daf70Neal Norwitz                self.count = 0
18730c519b3a5e847eea0dffb51ac8df7c68891daf70Neal Norwitz            def recv_bytes(self, size):
18740c519b3a5e847eea0dffb51ac8df7c68891daf70Neal Norwitz                self.count += 1
18750c519b3a5e847eea0dffb51ac8df7c68891daf70Neal Norwitz                if self.count == 1:
18760c519b3a5e847eea0dffb51ac8df7c68891daf70Neal Norwitz                    return multiprocessing.connection.CHALLENGE
18770c519b3a5e847eea0dffb51ac8df7c68891daf70Neal Norwitz                elif self.count == 2:
18782a7767a17311cada06240a187c8896bdbcc1a4d0Neal Norwitz                    return b'something bogus'
18792a7767a17311cada06240a187c8896bdbcc1a4d0Neal Norwitz                return b''
18800c519b3a5e847eea0dffb51ac8df7c68891daf70Neal Norwitz            def send_bytes(self, data):
18810c519b3a5e847eea0dffb51ac8df7c68891daf70Neal Norwitz                pass
18820c519b3a5e847eea0dffb51ac8df7c68891daf70Neal Norwitz        self.assertRaises(multiprocessing.AuthenticationError,
18830c519b3a5e847eea0dffb51ac8df7c68891daf70Neal Norwitz                          multiprocessing.connection.answer_challenge,
18840c519b3a5e847eea0dffb51ac8df7c68891daf70Neal Norwitz                          _FakeConnection(), b'abc')
18850c519b3a5e847eea0dffb51ac8df7c68891daf70Neal Norwitz
18867152f6d9156a19a9f1b31e313d2c19d840dc089dJesse Noller#
18877152f6d9156a19a9f1b31e313d2c19d840dc089dJesse Noller# Test Manager.start()/Pool.__init__() initializer feature - see issue 5585
18887152f6d9156a19a9f1b31e313d2c19d840dc089dJesse Noller#
18897152f6d9156a19a9f1b31e313d2c19d840dc089dJesse Noller
18907152f6d9156a19a9f1b31e313d2c19d840dc089dJesse Nollerdef initializer(ns):
18917152f6d9156a19a9f1b31e313d2c19d840dc089dJesse Noller    ns.test += 1
18927152f6d9156a19a9f1b31e313d2c19d840dc089dJesse Noller
18937152f6d9156a19a9f1b31e313d2c19d840dc089dJesse Nollerclass TestInitializers(unittest.TestCase):
18947152f6d9156a19a9f1b31e313d2c19d840dc089dJesse Noller    def setUp(self):
18957152f6d9156a19a9f1b31e313d2c19d840dc089dJesse Noller        self.mgr = multiprocessing.Manager()
18967152f6d9156a19a9f1b31e313d2c19d840dc089dJesse Noller        self.ns = self.mgr.Namespace()
18977152f6d9156a19a9f1b31e313d2c19d840dc089dJesse Noller        self.ns.test = 0
18987152f6d9156a19a9f1b31e313d2c19d840dc089dJesse Noller
18997152f6d9156a19a9f1b31e313d2c19d840dc089dJesse Noller    def tearDown(self):
19007152f6d9156a19a9f1b31e313d2c19d840dc089dJesse Noller        self.mgr.shutdown()
19017152f6d9156a19a9f1b31e313d2c19d840dc089dJesse Noller
19027152f6d9156a19a9f1b31e313d2c19d840dc089dJesse Noller    def test_manager_initializer(self):
19037152f6d9156a19a9f1b31e313d2c19d840dc089dJesse Noller        m = multiprocessing.managers.SyncManager()
19047152f6d9156a19a9f1b31e313d2c19d840dc089dJesse Noller        self.assertRaises(TypeError, m.start, 1)
19057152f6d9156a19a9f1b31e313d2c19d840dc089dJesse Noller        m.start(initializer, (self.ns,))
19067152f6d9156a19a9f1b31e313d2c19d840dc089dJesse Noller        self.assertEqual(self.ns.test, 1)
19077152f6d9156a19a9f1b31e313d2c19d840dc089dJesse Noller        m.shutdown()
19087152f6d9156a19a9f1b31e313d2c19d840dc089dJesse Noller
19097152f6d9156a19a9f1b31e313d2c19d840dc089dJesse Noller    def test_pool_initializer(self):
19107152f6d9156a19a9f1b31e313d2c19d840dc089dJesse Noller        self.assertRaises(TypeError, multiprocessing.Pool, initializer=1)
19117152f6d9156a19a9f1b31e313d2c19d840dc089dJesse Noller        p = multiprocessing.Pool(1, initializer, (self.ns,))
19127152f6d9156a19a9f1b31e313d2c19d840dc089dJesse Noller        p.close()
19137152f6d9156a19a9f1b31e313d2c19d840dc089dJesse Noller        p.join()
19147152f6d9156a19a9f1b31e313d2c19d840dc089dJesse Noller        self.assertEqual(self.ns.test, 1)
19157152f6d9156a19a9f1b31e313d2c19d840dc089dJesse Noller
19161b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller#
19171b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller# Issue 5155, 5313, 5331: Test process in processes
19181b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller# Verifies os.close(sys.stdin.fileno) vs. sys.stdin.close() behavior
19191b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller#
19201b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller
19211b90efbdc5bb204fe50aea87374603dcba309227Jesse Nollerdef _ThisSubProcess(q):
19221b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller    try:
19231b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller        item = q.get(block=False)
19241b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller    except Queue.Empty:
19251b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller        pass
19261b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller
19271b90efbdc5bb204fe50aea87374603dcba309227Jesse Nollerdef _TestProcess(q):
19281b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller    queue = multiprocessing.Queue()
19291b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller    subProc = multiprocessing.Process(target=_ThisSubProcess, args=(queue,))
19301b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller    subProc.start()
19311b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller    subProc.join()
19321b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller
19331b90efbdc5bb204fe50aea87374603dcba309227Jesse Nollerdef _afunc(x):
19341b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller    return x*x
19351b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller
19361b90efbdc5bb204fe50aea87374603dcba309227Jesse Nollerdef pool_in_process():
19371b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller    pool = multiprocessing.Pool(processes=4)
19381b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller    x = pool.map(_afunc, [1, 2, 3, 4, 5, 6, 7])
19391b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller
19401b90efbdc5bb204fe50aea87374603dcba309227Jesse Nollerclass _file_like(object):
19411b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller    def __init__(self, delegate):
19421b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller        self._delegate = delegate
19431b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller        self._pid = None
19441b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller
19451b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller    @property
19461b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller    def cache(self):
19471b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller        pid = os.getpid()
19481b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller        # There are no race conditions since fork keeps only the running thread
19491b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller        if pid != self._pid:
19501b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller            self._pid = pid
19511b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller            self._cache = []
19521b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller        return self._cache
19531b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller
19541b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller    def write(self, data):
19551b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller        self.cache.append(data)
19561b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller
19571b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller    def flush(self):
19581b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller        self._delegate.write(''.join(self.cache))
19591b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller        self._cache = []
19601b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller
19611b90efbdc5bb204fe50aea87374603dcba309227Jesse Nollerclass TestStdinBadfiledescriptor(unittest.TestCase):
19621b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller
19631b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller    def test_queue_in_process(self):
19641b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller        queue = multiprocessing.Queue()
19651b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller        proc = multiprocessing.Process(target=_TestProcess, args=(queue,))
19661b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller        proc.start()
19671b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller        proc.join()
19681b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller
19691b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller    def test_pool_in_process(self):
19701b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller        p = multiprocessing.Process(target=pool_in_process)
19711b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller        p.start()
19721b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller        p.join()
19731b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller
19741b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller    def test_flushing(self):
19751b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller        sio = StringIO()
19761b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller        flike = _file_like(sio)
19771b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller        flike.write('foo')
19781b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller        proc = multiprocessing.Process(target=lambda: flike.flush())
19791b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller        flike.flush()
19801b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller        assert sio.getvalue() == 'foo'
19811b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller
19821b90efbdc5bb204fe50aea87374603dcba309227Jesse Nollertestcases_other = [OtherTest, TestInvalidHandle, TestInitializers,
19831b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller                   TestStdinBadfiledescriptor]
19840c519b3a5e847eea0dffb51ac8df7c68891daf70Neal Norwitz
1985dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson#
1986dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson#
1987dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson#
1988dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1989dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersondef test_main(run=None):
199018623825d25b0f8f3b4bf96c1d5c4c2977a94004Jesse Noller    if sys.platform.startswith("linux"):
199118623825d25b0f8f3b4bf96c1d5c4c2977a94004Jesse Noller        try:
199218623825d25b0f8f3b4bf96c1d5c4c2977a94004Jesse Noller            lock = multiprocessing.RLock()
199318623825d25b0f8f3b4bf96c1d5c4c2977a94004Jesse Noller        except OSError:
1994bec087f29d7dca0aaf8f51be7d7c135e9b84e7f1Benjamin Peterson            raise unittest.SkipTest("OSError raises on RLock creation, see issue 3111!")
1995ed77f2e143102df58212ff1f64a87f7e0c237439Benjamin Peterson
1996dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    if run is None:
1997dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        from test.test_support import run_unittest as run
1998dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1999dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    util.get_temp_dir()     # creates temp directory for use by all processes
2000dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
2001dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    multiprocessing.get_logger().setLevel(LOG_LEVEL)
2002dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
2003146b7ab818cadccf91ad98e64cfefb77705da0caJesse Noller    ProcessesMixin.pool = multiprocessing.Pool(4)
2004146b7ab818cadccf91ad98e64cfefb77705da0caJesse Noller    ThreadsMixin.pool = multiprocessing.dummy.Pool(4)
2005146b7ab818cadccf91ad98e64cfefb77705da0caJesse Noller    ManagerMixin.manager.__init__()
2006146b7ab818cadccf91ad98e64cfefb77705da0caJesse Noller    ManagerMixin.manager.start()
2007146b7ab818cadccf91ad98e64cfefb77705da0caJesse Noller    ManagerMixin.pool = ManagerMixin.manager.Pool(4)
2008dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
2009dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    testcases = (
2010146b7ab818cadccf91ad98e64cfefb77705da0caJesse Noller        sorted(testcases_processes.values(), key=lambda tc:tc.__name__) +
2011146b7ab818cadccf91ad98e64cfefb77705da0caJesse Noller        sorted(testcases_threads.values(), key=lambda tc:tc.__name__) +
20120c519b3a5e847eea0dffb51ac8df7c68891daf70Neal Norwitz        sorted(testcases_manager.values(), key=lambda tc:tc.__name__) +
20130c519b3a5e847eea0dffb51ac8df7c68891daf70Neal Norwitz        testcases_other
2014dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        )
2015dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
2016dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    loadTestsFromTestCase = unittest.defaultTestLoader.loadTestsFromTestCase
2017dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    suite = unittest.TestSuite(loadTestsFromTestCase(tc) for tc in testcases)
2018ce8e33a095030e7af94f58f9da196b240bdf0476Senthil Kumaran    run(suite)
2019dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
2020146b7ab818cadccf91ad98e64cfefb77705da0caJesse Noller    ThreadsMixin.pool.terminate()
2021146b7ab818cadccf91ad98e64cfefb77705da0caJesse Noller    ProcessesMixin.pool.terminate()
2022146b7ab818cadccf91ad98e64cfefb77705da0caJesse Noller    ManagerMixin.pool.terminate()
2023146b7ab818cadccf91ad98e64cfefb77705da0caJesse Noller    ManagerMixin.manager.shutdown()
2024dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
2025146b7ab818cadccf91ad98e64cfefb77705da0caJesse Noller    del ProcessesMixin.pool, ThreadsMixin.pool, ManagerMixin.pool
2026dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
2027dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersondef main():
2028dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    test_main(unittest.TextTestRunner(verbosity=2).run)
2029dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
2030dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonif __name__ == '__main__':
2031dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    main()
2032