test_multiprocessing.py revision 3bc5cb7e0db13ba3885c8ed3d51ea792738499b2
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()
10733bc5cb7e0db13ba3885c8ed3d51ea792738499b2Florent Xicluna        # Wait until all workers are alive
10743bc5cb7e0db13ba3885c8ed3d51ea792738499b2Florent Xicluna        countdown = 5
10753bc5cb7e0db13ba3885c8ed3d51ea792738499b2Florent Xicluna        while countdown and not all(w.is_alive() for w in p._pool):
10763bc5cb7e0db13ba3885c8ed3d51ea792738499b2Florent Xicluna            countdown -= 1
10773bc5cb7e0db13ba3885c8ed3d51ea792738499b2Florent Xicluna            time.sleep(DELTA)
1078654ade3e6afa2527d1f642be28d69e219bd58b71Jesse Noller        finalworkerpids = [w.pid for w in p._pool]
10793bc5cb7e0db13ba3885c8ed3d51ea792738499b2Florent Xicluna        # All pids should be assigned.  See issue #7805.
10803bc5cb7e0db13ba3885c8ed3d51ea792738499b2Florent Xicluna        self.assertNotIn(None, origworkerpids)
10813bc5cb7e0db13ba3885c8ed3d51ea792738499b2Florent Xicluna        self.assertNotIn(None, finalworkerpids)
10823bc5cb7e0db13ba3885c8ed3d51ea792738499b2Florent Xicluna        # Finally, check that the worker pids have changed
1083654ade3e6afa2527d1f642be28d69e219bd58b71Jesse Noller        self.assertNotEqual(sorted(origworkerpids), sorted(finalworkerpids))
1084654ade3e6afa2527d1f642be28d69e219bd58b71Jesse Noller        p.close()
1085654ade3e6afa2527d1f642be28d69e219bd58b71Jesse Noller        p.join()
1086654ade3e6afa2527d1f642be28d69e219bd58b71Jesse Noller
1087dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson#
1088dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# Test that manager has expected number of shared objects left
1089dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson#
1090dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1091dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonclass _TestZZZNumberOfObjects(BaseTestCase):
1092dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    # Because test cases are sorted alphabetically, this one will get
1093dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    # run after all the other tests for the manager.  It tests that
1094dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    # there have been no "reference leaks" for the manager's shared
1095dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    # objects.  Note the comment in _TestPool.test_terminate().
1096dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    ALLOWED_TYPES = ('manager',)
1097dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1098dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def test_number_of_objects(self):
1099dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        EXPECTED_NUMBER = 1                # the pool object is still alive
1100dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        multiprocessing.active_children()  # discard dead process objs
1101dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        gc.collect()                       # do garbage collection
1102dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        refs = self.manager._number_of_objects()
11037314b38168da53863136d1937059fc0ac4883a56Jesse Noller        debug_info = self.manager._debug_info()
1104dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        if refs != EXPECTED_NUMBER:
11057fb9640d57f5d96dcaa0d0e6497abc21fa85f37eJesse Noller            print self.manager._debug_info()
11067314b38168da53863136d1937059fc0ac4883a56Jesse Noller            print debug_info
1107dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1108dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(refs, EXPECTED_NUMBER)
1109dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1110dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson#
1111dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# Test of creating a customized manager class
1112dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson#
1113dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1114dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonfrom multiprocessing.managers import BaseManager, BaseProxy, RemoteError
1115dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1116dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonclass FooBar(object):
1117dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def f(self):
1118dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        return 'f()'
1119dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def g(self):
1120dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        raise ValueError
1121dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def _h(self):
1122dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        return '_h()'
1123dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1124dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersondef baz():
1125dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    for i in xrange(10):
1126dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        yield i*i
1127dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1128dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonclass IteratorProxy(BaseProxy):
1129dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    _exposed_ = ('next', '__next__')
1130dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def __iter__(self):
1131dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        return self
1132dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def next(self):
1133dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        return self._callmethod('next')
1134dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def __next__(self):
1135dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        return self._callmethod('__next__')
1136dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1137dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonclass MyManager(BaseManager):
1138dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    pass
1139dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1140dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin PetersonMyManager.register('Foo', callable=FooBar)
1141dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin PetersonMyManager.register('Bar', callable=FooBar, exposed=('f', '_h'))
1142dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin PetersonMyManager.register('baz', callable=baz, proxytype=IteratorProxy)
1143dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1144dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1145dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonclass _TestMyManager(BaseTestCase):
1146dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1147dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    ALLOWED_TYPES = ('manager',)
1148dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1149dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def test_mymanager(self):
1150dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        manager = MyManager()
1151dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        manager.start()
1152dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1153dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        foo = manager.Foo()
1154dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        bar = manager.Bar()
1155dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        baz = manager.baz()
1156dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1157dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        foo_methods = [name for name in ('f', 'g', '_h') if hasattr(foo, name)]
1158dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        bar_methods = [name for name in ('f', 'g', '_h') if hasattr(bar, name)]
1159dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1160dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(foo_methods, ['f', 'g'])
1161dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(bar_methods, ['f', '_h'])
1162dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1163dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(foo.f(), 'f()')
1164dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertRaises(ValueError, foo.g)
1165dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(foo._callmethod('f'), 'f()')
1166dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertRaises(RemoteError, foo._callmethod, '_h')
1167dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1168dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(bar.f(), 'f()')
1169dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(bar._h(), '_h()')
1170dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(bar._callmethod('f'), 'f()')
1171dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(bar._callmethod('_h'), '_h()')
1172dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1173dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(list(baz), [i*i for i in range(10)])
1174dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1175dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        manager.shutdown()
1176dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1177dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson#
1178dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# Test of connecting to a remote server and using xmlrpclib for serialization
1179dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson#
1180dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1181dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson_queue = Queue.Queue()
1182dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersondef get_queue():
1183dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    return _queue
1184dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1185dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonclass QueueManager(BaseManager):
1186dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    '''manager class used by server process'''
1187dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin PetersonQueueManager.register('get_queue', callable=get_queue)
1188dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1189dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonclass QueueManager2(BaseManager):
1190dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    '''manager class which specifies the same interface as QueueManager'''
1191dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin PetersonQueueManager2.register('get_queue')
1192dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1193dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1194dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin PetersonSERIALIZER = 'xmlrpclib'
1195dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1196dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonclass _TestRemoteManager(BaseTestCase):
1197dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1198dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    ALLOWED_TYPES = ('manager',)
1199dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1200dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def _putter(self, address, authkey):
1201dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        manager = QueueManager2(
1202dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            address=address, authkey=authkey, serializer=SERIALIZER
1203dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            )
1204dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        manager.connect()
1205dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        queue = manager.get_queue()
1206dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        queue.put(('hello world', None, True, 2.25))
1207dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1208dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def test_remote(self):
1209dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        authkey = os.urandom(32)
1210dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1211dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        manager = QueueManager(
1212dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            address=('localhost', 0), authkey=authkey, serializer=SERIALIZER
1213dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            )
1214dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        manager.start()
1215dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1216dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        p = self.Process(target=self._putter, args=(manager.address, authkey))
1217dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        p.start()
1218dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1219dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        manager2 = QueueManager2(
1220dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            address=manager.address, authkey=authkey, serializer=SERIALIZER
1221dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            )
1222dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        manager2.connect()
1223dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        queue = manager2.get_queue()
1224dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1225dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        # Note that xmlrpclib will deserialize object as a list not a tuple
1226dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(queue.get(), ['hello world', None, True, 2.25])
1227dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1228dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        # Because we are using xmlrpclib for serialization instead of
1229dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        # pickle this will cause a serialization error.
1230dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertRaises(Exception, queue.put, time.sleep)
1231dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1232dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        # Make queue finalizer run before the server is stopped
1233dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        del queue
1234dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        manager.shutdown()
1235dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1236459a6481662c62d6cb57a070d21230db3e721c56Jesse Nollerclass _TestManagerRestart(BaseTestCase):
1237459a6481662c62d6cb57a070d21230db3e721c56Jesse Noller
1238459a6481662c62d6cb57a070d21230db3e721c56Jesse Noller    def _putter(self, address, authkey):
1239459a6481662c62d6cb57a070d21230db3e721c56Jesse Noller        manager = QueueManager(
1240459a6481662c62d6cb57a070d21230db3e721c56Jesse Noller            address=address, authkey=authkey, serializer=SERIALIZER)
1241459a6481662c62d6cb57a070d21230db3e721c56Jesse Noller        manager.connect()
1242459a6481662c62d6cb57a070d21230db3e721c56Jesse Noller        queue = manager.get_queue()
1243459a6481662c62d6cb57a070d21230db3e721c56Jesse Noller        queue.put('hello world')
1244459a6481662c62d6cb57a070d21230db3e721c56Jesse Noller
1245459a6481662c62d6cb57a070d21230db3e721c56Jesse Noller    def test_rapid_restart(self):
1246459a6481662c62d6cb57a070d21230db3e721c56Jesse Noller        authkey = os.urandom(32)
1247c7298ff0fa9a4b667f206733d591966729c87337R. David Murray        port = test_support.find_unused_port()
1248459a6481662c62d6cb57a070d21230db3e721c56Jesse Noller        manager = QueueManager(
1249c7298ff0fa9a4b667f206733d591966729c87337R. David Murray            address=('localhost', port), authkey=authkey, serializer=SERIALIZER)
1250459a6481662c62d6cb57a070d21230db3e721c56Jesse Noller        manager.start()
1251459a6481662c62d6cb57a070d21230db3e721c56Jesse Noller
1252459a6481662c62d6cb57a070d21230db3e721c56Jesse Noller        p = self.Process(target=self._putter, args=(manager.address, authkey))
1253459a6481662c62d6cb57a070d21230db3e721c56Jesse Noller        p.start()
1254459a6481662c62d6cb57a070d21230db3e721c56Jesse Noller        queue = manager.get_queue()
1255459a6481662c62d6cb57a070d21230db3e721c56Jesse Noller        self.assertEqual(queue.get(), 'hello world')
1256019ce773cd25ee08d1a822f06958774b43881d00Jesse Noller        del queue
1257459a6481662c62d6cb57a070d21230db3e721c56Jesse Noller        manager.shutdown()
1258459a6481662c62d6cb57a070d21230db3e721c56Jesse Noller        manager = QueueManager(
1259c7298ff0fa9a4b667f206733d591966729c87337R. David Murray            address=('localhost', port), authkey=authkey, serializer=SERIALIZER)
1260459a6481662c62d6cb57a070d21230db3e721c56Jesse Noller        manager.start()
1261019ce773cd25ee08d1a822f06958774b43881d00Jesse Noller        manager.shutdown()
1262459a6481662c62d6cb57a070d21230db3e721c56Jesse Noller
1263dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson#
1264dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson#
1265dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson#
1266dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1267dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin PetersonSENTINEL = latin('')
1268dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1269dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonclass _TestConnection(BaseTestCase):
1270dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1271dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    ALLOWED_TYPES = ('processes', 'threads')
1272dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1273dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def _echo(self, conn):
1274dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        for msg in iter(conn.recv_bytes, SENTINEL):
1275dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            conn.send_bytes(msg)
1276dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        conn.close()
1277dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1278dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def test_connection(self):
1279dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        conn, child_conn = self.Pipe()
1280dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1281dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        p = self.Process(target=self._echo, args=(child_conn,))
12825bc9f4c09c99eb701dbee83fb9e26eed558e474fJesse Noller        p.daemon = True
1283dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        p.start()
1284dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1285dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        seq = [1, 2.25, None]
1286dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        msg = latin('hello world')
1287dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        longmsg = msg * 10
1288dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        arr = array.array('i', range(4))
1289dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1290dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        if self.TYPE == 'processes':
1291dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            self.assertEqual(type(conn.fileno()), int)
1292dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1293dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(conn.send(seq), None)
1294dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(conn.recv(), seq)
1295dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1296dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(conn.send_bytes(msg), None)
1297dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(conn.recv_bytes(), msg)
1298dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1299dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        if self.TYPE == 'processes':
1300dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            buffer = array.array('i', [0]*10)
1301dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            expected = list(arr) + [0] * (10 - len(arr))
1302dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            self.assertEqual(conn.send_bytes(arr), None)
1303dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            self.assertEqual(conn.recv_bytes_into(buffer),
1304dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson                             len(arr) * buffer.itemsize)
1305dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            self.assertEqual(list(buffer), expected)
1306dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1307dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            buffer = array.array('i', [0]*10)
1308dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            expected = [0] * 3 + list(arr) + [0] * (10 - 3 - len(arr))
1309dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            self.assertEqual(conn.send_bytes(arr), None)
1310dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            self.assertEqual(conn.recv_bytes_into(buffer, 3 * buffer.itemsize),
1311dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson                             len(arr) * buffer.itemsize)
1312dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            self.assertEqual(list(buffer), expected)
1313dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1314dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            buffer = bytearray(latin(' ' * 40))
1315dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            self.assertEqual(conn.send_bytes(longmsg), None)
1316dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            try:
1317dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson                res = conn.recv_bytes_into(buffer)
1318dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            except multiprocessing.BufferTooShort, e:
1319dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson                self.assertEqual(e.args, (longmsg,))
1320dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            else:
1321dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson                self.fail('expected BufferTooShort, got %s' % res)
1322dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1323dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        poll = TimingWrapper(conn.poll)
1324dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1325dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(poll(), False)
1326dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertTimingAlmostEqual(poll.elapsed, 0)
1327dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1328dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(poll(TIMEOUT1), False)
1329dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertTimingAlmostEqual(poll.elapsed, TIMEOUT1)
1330dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1331dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        conn.send(None)
1332dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1333dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(poll(TIMEOUT1), True)
1334dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertTimingAlmostEqual(poll.elapsed, 0)
1335dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1336dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(conn.recv(), None)
1337dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1338dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        really_big_msg = latin('X') * (1024 * 1024 * 16)   # 16Mb
1339dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        conn.send_bytes(really_big_msg)
1340dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(conn.recv_bytes(), really_big_msg)
1341dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1342dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        conn.send_bytes(SENTINEL)                          # tell child to quit
1343dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        child_conn.close()
1344dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1345dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        if self.TYPE == 'processes':
1346dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            self.assertEqual(conn.readable, True)
1347dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            self.assertEqual(conn.writable, True)
1348dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            self.assertRaises(EOFError, conn.recv)
1349dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            self.assertRaises(EOFError, conn.recv_bytes)
1350dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1351dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        p.join()
1352dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1353dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def test_duplex_false(self):
1354dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        reader, writer = self.Pipe(duplex=False)
1355dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(writer.send(1), None)
1356dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(reader.recv(), 1)
1357dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        if self.TYPE == 'processes':
1358dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            self.assertEqual(reader.readable, True)
1359dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            self.assertEqual(reader.writable, False)
1360dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            self.assertEqual(writer.readable, False)
1361dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            self.assertEqual(writer.writable, True)
1362dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            self.assertRaises(IOError, reader.send, 2)
1363dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            self.assertRaises(IOError, writer.recv)
1364dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            self.assertRaises(IOError, writer.poll)
1365dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1366dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def test_spawn_close(self):
1367dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        # We test that a pipe connection can be closed by parent
1368dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        # process immediately after child is spawned.  On Windows this
1369dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        # would have sometimes failed on old versions because
1370dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        # child_conn would be closed before the child got a chance to
1371dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        # duplicate it.
1372dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        conn, child_conn = self.Pipe()
1373dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1374dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        p = self.Process(target=self._echo, args=(child_conn,))
1375dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        p.start()
1376dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        child_conn.close()    # this might complete before child initializes
1377dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1378dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        msg = latin('hello')
1379dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        conn.send_bytes(msg)
1380dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(conn.recv_bytes(), msg)
1381dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1382dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        conn.send_bytes(SENTINEL)
1383dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        conn.close()
1384dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        p.join()
1385dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1386dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def test_sendbytes(self):
1387dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        if self.TYPE != 'processes':
1388dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            return
1389dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1390dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        msg = latin('abcdefghijklmnopqrstuvwxyz')
1391dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        a, b = self.Pipe()
1392dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1393dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        a.send_bytes(msg)
1394dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(b.recv_bytes(), msg)
1395dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1396dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        a.send_bytes(msg, 5)
1397dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(b.recv_bytes(), msg[5:])
1398dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1399dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        a.send_bytes(msg, 7, 8)
1400dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(b.recv_bytes(), msg[7:7+8])
1401dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1402dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        a.send_bytes(msg, 26)
1403dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(b.recv_bytes(), latin(''))
1404dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1405dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        a.send_bytes(msg, 26, 0)
1406dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(b.recv_bytes(), latin(''))
1407dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1408dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertRaises(ValueError, a.send_bytes, msg, 27)
1409dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1410dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertRaises(ValueError, a.send_bytes, msg, 22, 5)
1411dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1412dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertRaises(ValueError, a.send_bytes, msg, 26, 1)
1413dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1414dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertRaises(ValueError, a.send_bytes, msg, -1)
1415dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1416dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertRaises(ValueError, a.send_bytes, msg, 4, -1)
1417dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1418dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonclass _TestListenerClient(BaseTestCase):
1419dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1420dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    ALLOWED_TYPES = ('processes', 'threads')
1421dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1422dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def _test(self, address):
1423dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        conn = self.connection.Client(address)
1424dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        conn.send('hello')
1425dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        conn.close()
1426dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1427dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def test_listener_client(self):
1428dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        for family in self.connection.families:
1429dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            l = self.connection.Listener(family=family)
1430dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            p = self.Process(target=self._test, args=(l.address,))
14315bc9f4c09c99eb701dbee83fb9e26eed558e474fJesse Noller            p.daemon = True
1432dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            p.start()
1433dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            conn = l.accept()
1434dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            self.assertEqual(conn.recv(), 'hello')
1435dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            p.join()
1436dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            l.close()
1437dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson#
1438dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# Test of sending connection and socket objects between processes
1439dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson#
1440da3a1b120055855a464c2d5f5143021ae8f5dc86Benjamin Peterson"""
1441dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonclass _TestPicklingConnections(BaseTestCase):
1442dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1443dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    ALLOWED_TYPES = ('processes',)
1444dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1445dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def _listener(self, conn, families):
1446dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        for fam in families:
1447dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            l = self.connection.Listener(family=fam)
1448dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            conn.send(l.address)
1449dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            new_conn = l.accept()
1450dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            conn.send(new_conn)
1451dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1452dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        if self.TYPE == 'processes':
1453dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            l = socket.socket()
1454dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            l.bind(('localhost', 0))
1455dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            conn.send(l.getsockname())
1456dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            l.listen(1)
1457dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            new_conn, addr = l.accept()
1458dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            conn.send(new_conn)
1459dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1460dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        conn.recv()
1461dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1462dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def _remote(self, conn):
1463dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        for (address, msg) in iter(conn.recv, None):
1464dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            client = self.connection.Client(address)
1465dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            client.send(msg.upper())
1466dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            client.close()
1467dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1468dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        if self.TYPE == 'processes':
1469dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            address, msg = conn.recv()
1470dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            client = socket.socket()
1471dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            client.connect(address)
1472dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            client.sendall(msg.upper())
1473dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            client.close()
1474dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1475dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        conn.close()
1476dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1477dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def test_pickling(self):
1478dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        try:
1479dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            multiprocessing.allow_connection_pickling()
1480dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        except ImportError:
1481dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            return
1482dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1483dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        families = self.connection.families
1484dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1485dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        lconn, lconn0 = self.Pipe()
1486dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        lp = self.Process(target=self._listener, args=(lconn0, families))
1487dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        lp.start()
1488dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        lconn0.close()
1489dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1490dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        rconn, rconn0 = self.Pipe()
1491dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        rp = self.Process(target=self._remote, args=(rconn0,))
1492dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        rp.start()
1493dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        rconn0.close()
1494dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1495dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        for fam in families:
1496dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            msg = ('This connection uses family %s' % fam).encode('ascii')
1497dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            address = lconn.recv()
1498dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            rconn.send((address, msg))
1499dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            new_conn = lconn.recv()
1500dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            self.assertEqual(new_conn.recv(), msg.upper())
1501dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1502dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        rconn.send(None)
1503dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1504dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        if self.TYPE == 'processes':
1505dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            msg = latin('This connection uses a normal socket')
1506dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            address = lconn.recv()
1507dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            rconn.send((address, msg))
1508dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            if hasattr(socket, 'fromfd'):
1509dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson                new_conn = lconn.recv()
1510dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson                self.assertEqual(new_conn.recv(100), msg.upper())
1511dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            else:
1512dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson                # XXX On Windows with Py2.6 need to backport fromfd()
1513dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson                discard = lconn.recv_bytes()
1514dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1515dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        lconn.send(None)
1516dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1517dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        rconn.close()
1518dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        lconn.close()
1519dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1520dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        lp.join()
1521dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        rp.join()
1522da3a1b120055855a464c2d5f5143021ae8f5dc86Benjamin Peterson"""
1523dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson#
1524dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson#
1525dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson#
1526dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1527dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonclass _TestHeap(BaseTestCase):
1528dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1529dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    ALLOWED_TYPES = ('processes',)
1530dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1531dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def test_heap(self):
1532dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        iterations = 5000
1533dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        maxblocks = 50
1534dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        blocks = []
1535dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1536dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        # create and destroy lots of blocks of different sizes
1537dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        for i in xrange(iterations):
1538dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            size = int(random.lognormvariate(0, 1) * 1000)
1539dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            b = multiprocessing.heap.BufferWrapper(size)
1540dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            blocks.append(b)
1541dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            if len(blocks) > maxblocks:
1542dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson                i = random.randrange(maxblocks)
1543dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson                del blocks[i]
1544dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1545dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        # get the heap object
1546dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        heap = multiprocessing.heap.BufferWrapper._heap
1547dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1548dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        # verify the state of the heap
1549dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        all = []
1550dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        occupied = 0
1551dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        for L in heap._len_to_seq.values():
1552dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            for arena, start, stop in L:
1553dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson                all.append((heap._arenas.index(arena), start, stop,
1554dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson                            stop-start, 'free'))
1555dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        for arena, start, stop in heap._allocated_blocks:
1556dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            all.append((heap._arenas.index(arena), start, stop,
1557dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson                        stop-start, 'occupied'))
1558dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            occupied += (stop-start)
1559dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1560dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        all.sort()
1561dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1562dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        for i in range(len(all)-1):
1563dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            (arena, start, stop) = all[i][:3]
1564dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            (narena, nstart, nstop) = all[i+1][:3]
1565dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            self.assertTrue((arena != narena and nstart == 0) or
1566dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson                            (stop == nstart))
1567dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1568dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson#
1569dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson#
1570dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson#
1571dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1572dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersontry:
1573dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    from ctypes import Structure, Value, copy, c_int, c_double
1574dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonexcept ImportError:
1575dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    Structure = object
1576dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    c_int = c_double = None
1577dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1578dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonclass _Foo(Structure):
1579dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    _fields_ = [
1580dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        ('x', c_int),
1581dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        ('y', c_double)
1582dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        ]
1583dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1584dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonclass _TestSharedCTypes(BaseTestCase):
1585dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1586dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    ALLOWED_TYPES = ('processes',)
1587dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1588dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def _double(self, x, y, foo, arr, string):
1589dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        x.value *= 2
1590dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        y.value *= 2
1591dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        foo.x *= 2
1592dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        foo.y *= 2
1593dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        string.value *= 2
1594dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        for i in range(len(arr)):
1595dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            arr[i] *= 2
1596dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1597dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def test_sharedctypes(self, lock=False):
1598dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        if c_int is None:
1599dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            return
1600dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1601dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        x = Value('i', 7, lock=lock)
1602bd564c3c21ef4c6d6cb0070870edd9d2f7c89d11Georg Brandl        y = Value(c_double, 1.0/3.0, lock=lock)
1603dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        foo = Value(_Foo, 3, 2, lock=lock)
1604bd564c3c21ef4c6d6cb0070870edd9d2f7c89d11Georg Brandl        arr = self.Array('d', range(10), lock=lock)
1605bd564c3c21ef4c6d6cb0070870edd9d2f7c89d11Georg Brandl        string = self.Array('c', 20, lock=lock)
1606dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        string.value = 'hello'
1607dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1608dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        p = self.Process(target=self._double, args=(x, y, foo, arr, string))
1609dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        p.start()
1610dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        p.join()
1611dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1612dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(x.value, 14)
1613dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertAlmostEqual(y.value, 2.0/3.0)
1614dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(foo.x, 6)
1615dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertAlmostEqual(foo.y, 4.0)
1616dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        for i in range(10):
1617dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            self.assertAlmostEqual(arr[i], i*2)
1618dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(string.value, latin('hellohello'))
1619dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1620dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def test_synchronize(self):
1621dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.test_sharedctypes(lock=True)
1622dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1623dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def test_copy(self):
1624dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        if c_int is None:
1625dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            return
1626dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1627dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        foo = _Foo(2, 5.0)
1628dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        bar = copy(foo)
1629dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        foo.x = 0
1630dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        foo.y = 0
1631dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(bar.x, 2)
1632dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertAlmostEqual(bar.y, 5.0)
1633dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1634dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson#
1635dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson#
1636dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson#
1637dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1638dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonclass _TestFinalize(BaseTestCase):
1639dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1640dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    ALLOWED_TYPES = ('processes',)
1641dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1642dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def _test_finalize(self, conn):
1643dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        class Foo(object):
1644dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            pass
1645dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1646dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        a = Foo()
1647dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        util.Finalize(a, conn.send, args=('a',))
1648dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        del a           # triggers callback for a
1649dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1650dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        b = Foo()
1651dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        close_b = util.Finalize(b, conn.send, args=('b',))
1652dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        close_b()       # triggers callback for b
1653dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        close_b()       # does nothing because callback has already been called
1654dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        del b           # does nothing because callback has already been called
1655dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1656dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        c = Foo()
1657dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        util.Finalize(c, conn.send, args=('c',))
1658dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1659dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        d10 = Foo()
1660dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        util.Finalize(d10, conn.send, args=('d10',), exitpriority=1)
1661dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1662dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        d01 = Foo()
1663dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        util.Finalize(d01, conn.send, args=('d01',), exitpriority=0)
1664dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        d02 = Foo()
1665dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        util.Finalize(d02, conn.send, args=('d02',), exitpriority=0)
1666dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        d03 = Foo()
1667dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        util.Finalize(d03, conn.send, args=('d03',), exitpriority=0)
1668dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1669dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        util.Finalize(None, conn.send, args=('e',), exitpriority=-10)
1670dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1671dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        util.Finalize(None, conn.send, args=('STOP',), exitpriority=-100)
1672dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1673dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        # call mutliprocessing's cleanup function then exit process without
1674dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        # garbage collecting locals
1675dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        util._exit_function()
1676dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        conn.close()
1677dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        os._exit(0)
1678dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1679dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def test_finalize(self):
1680dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        conn, child_conn = self.Pipe()
1681dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1682dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        p = self.Process(target=self._test_finalize, args=(child_conn,))
1683dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        p.start()
1684dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        p.join()
1685dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1686dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        result = [obj for obj in iter(conn.recv, 'STOP')]
1687dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(result, ['a', 'b', 'd10', 'd03', 'd02', 'd01', 'e'])
1688dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1689dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson#
1690dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# Test that from ... import * works for each module
1691dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson#
1692dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1693dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonclass _TestImportStar(BaseTestCase):
1694dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1695dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    ALLOWED_TYPES = ('processes',)
1696dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1697dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def test_import(self):
1698dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        modules = (
1699dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            'multiprocessing', 'multiprocessing.connection',
1700dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            'multiprocessing.heap', 'multiprocessing.managers',
1701dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            'multiprocessing.pool', 'multiprocessing.process',
1702dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            'multiprocessing.reduction', 'multiprocessing.sharedctypes',
1703dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            'multiprocessing.synchronize', 'multiprocessing.util'
1704dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            )
1705dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1706dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        for name in modules:
1707dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            __import__(name)
1708dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            mod = sys.modules[name]
1709dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1710dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            for attr in getattr(mod, '__all__', ()):
1711dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson                self.assertTrue(
1712dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson                    hasattr(mod, attr),
1713dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson                    '%r does not have attribute %r' % (mod, attr)
1714dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson                    )
1715dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1716dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson#
1717dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# Quick test that logging works -- does not test logging output
1718dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson#
1719dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1720dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonclass _TestLogging(BaseTestCase):
1721dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1722dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    ALLOWED_TYPES = ('processes',)
1723dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1724dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def test_enable_logging(self):
1725dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        logger = multiprocessing.get_logger()
1726dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        logger.setLevel(util.SUBWARNING)
1727dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertTrue(logger is not None)
1728dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        logger.debug('this will not be printed')
1729dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        logger.info('nor will this')
1730dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        logger.setLevel(LOG_LEVEL)
1731dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1732dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def _test_level(self, conn):
1733dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        logger = multiprocessing.get_logger()
1734dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        conn.send(logger.getEffectiveLevel())
1735dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1736dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def test_level(self):
1737dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        LEVEL1 = 32
1738dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        LEVEL2 = 37
1739dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1740dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        logger = multiprocessing.get_logger()
1741dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        root_logger = logging.getLogger()
1742dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        root_level = root_logger.level
1743dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1744dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        reader, writer = multiprocessing.Pipe(duplex=False)
1745dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1746dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        logger.setLevel(LEVEL1)
1747dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.Process(target=self._test_level, args=(writer,)).start()
1748dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(LEVEL1, reader.recv())
1749dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1750dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        logger.setLevel(logging.NOTSET)
1751dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        root_logger.setLevel(LEVEL2)
1752dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.Process(target=self._test_level, args=(writer,)).start()
1753dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(LEVEL2, reader.recv())
1754dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1755dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        root_logger.setLevel(root_level)
1756dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        logger.setLevel(level=LOG_LEVEL)
1757dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1758814d02dcd1b30a98f9a34c710be35de6db82aa40Jesse Noller
17599a03f2fd03278d2c12dfe253de1bbed7c0c9c506Jesse Noller# class _TestLoggingProcessName(BaseTestCase):
17609a03f2fd03278d2c12dfe253de1bbed7c0c9c506Jesse Noller#
17619a03f2fd03278d2c12dfe253de1bbed7c0c9c506Jesse Noller#     def handle(self, record):
17629a03f2fd03278d2c12dfe253de1bbed7c0c9c506Jesse Noller#         assert record.processName == multiprocessing.current_process().name
17639a03f2fd03278d2c12dfe253de1bbed7c0c9c506Jesse Noller#         self.__handled = True
17649a03f2fd03278d2c12dfe253de1bbed7c0c9c506Jesse Noller#
17659a03f2fd03278d2c12dfe253de1bbed7c0c9c506Jesse Noller#     def test_logging(self):
17669a03f2fd03278d2c12dfe253de1bbed7c0c9c506Jesse Noller#         handler = logging.Handler()
17679a03f2fd03278d2c12dfe253de1bbed7c0c9c506Jesse Noller#         handler.handle = self.handle
17689a03f2fd03278d2c12dfe253de1bbed7c0c9c506Jesse Noller#         self.__handled = False
17699a03f2fd03278d2c12dfe253de1bbed7c0c9c506Jesse Noller#         # Bypass getLogger() and side-effects
17709a03f2fd03278d2c12dfe253de1bbed7c0c9c506Jesse Noller#         logger = logging.getLoggerClass()(
17719a03f2fd03278d2c12dfe253de1bbed7c0c9c506Jesse Noller#                 'multiprocessing.test.TestLoggingProcessName')
17729a03f2fd03278d2c12dfe253de1bbed7c0c9c506Jesse Noller#         logger.addHandler(handler)
17739a03f2fd03278d2c12dfe253de1bbed7c0c9c506Jesse Noller#         logger.propagate = False
17749a03f2fd03278d2c12dfe253de1bbed7c0c9c506Jesse Noller#
17759a03f2fd03278d2c12dfe253de1bbed7c0c9c506Jesse Noller#         logger.warn('foo')
17769a03f2fd03278d2c12dfe253de1bbed7c0c9c506Jesse Noller#         assert self.__handled
1777814d02dcd1b30a98f9a34c710be35de6db82aa40Jesse Noller
1778dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson#
17799a5b2ad38d605206f05a52fe32868d3f839e8a86Jesse Noller# Test to verify handle verification, see issue 3321
17809a5b2ad38d605206f05a52fe32868d3f839e8a86Jesse Noller#
17819a5b2ad38d605206f05a52fe32868d3f839e8a86Jesse Noller
17829a5b2ad38d605206f05a52fe32868d3f839e8a86Jesse Nollerclass TestInvalidHandle(unittest.TestCase):
17839a5b2ad38d605206f05a52fe32868d3f839e8a86Jesse Noller
17849a5b2ad38d605206f05a52fe32868d3f839e8a86Jesse Noller    def test_invalid_handles(self):
17859a5b2ad38d605206f05a52fe32868d3f839e8a86Jesse Noller        if WIN32:
17869a5b2ad38d605206f05a52fe32868d3f839e8a86Jesse Noller            return
17879a5b2ad38d605206f05a52fe32868d3f839e8a86Jesse Noller        conn = _multiprocessing.Connection(44977608)
17889a5b2ad38d605206f05a52fe32868d3f839e8a86Jesse Noller        self.assertRaises(IOError, conn.poll)
17899a5b2ad38d605206f05a52fe32868d3f839e8a86Jesse Noller        self.assertRaises(IOError, _multiprocessing.Connection, -1)
17909a5b2ad38d605206f05a52fe32868d3f839e8a86Jesse Noller#
1791dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# Functions used to create test cases from the base ones in this module
1792dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson#
1793dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1794dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersondef get_attributes(Source, names):
1795dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    d = {}
1796dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    for name in names:
1797dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        obj = getattr(Source, name)
1798dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        if type(obj) == type(get_attributes):
1799dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            obj = staticmethod(obj)
1800dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        d[name] = obj
1801dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    return d
1802dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1803dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersondef create_test_cases(Mixin, type):
1804dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    result = {}
1805dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    glob = globals()
1806dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    Type = type[0].upper() + type[1:]
1807dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1808dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    for name in glob.keys():
1809dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        if name.startswith('_Test'):
1810dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            base = glob[name]
1811dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            if type in base.ALLOWED_TYPES:
1812dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson                newname = 'With' + Type + name[1:]
1813dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson                class Temp(base, unittest.TestCase, Mixin):
1814dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson                    pass
1815dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson                result[newname] = Temp
1816dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson                Temp.__name__ = newname
1817dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson                Temp.__module__ = Mixin.__module__
1818dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    return result
1819dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1820dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson#
1821dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# Create test cases
1822dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson#
1823dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1824dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonclass ProcessesMixin(object):
1825dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    TYPE = 'processes'
1826dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    Process = multiprocessing.Process
1827dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    locals().update(get_attributes(multiprocessing, (
1828dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        'Queue', 'Lock', 'RLock', 'Semaphore', 'BoundedSemaphore',
1829dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        'Condition', 'Event', 'Value', 'Array', 'RawValue',
1830dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        'RawArray', 'current_process', 'active_children', 'Pipe',
1831dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        'connection', 'JoinableQueue'
1832dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        )))
1833dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1834dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersontestcases_processes = create_test_cases(ProcessesMixin, type='processes')
1835dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonglobals().update(testcases_processes)
1836dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1837dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1838dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonclass ManagerMixin(object):
1839dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    TYPE = 'manager'
1840dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    Process = multiprocessing.Process
1841dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    manager = object.__new__(multiprocessing.managers.SyncManager)
1842dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    locals().update(get_attributes(manager, (
1843dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        'Queue', 'Lock', 'RLock', 'Semaphore', 'BoundedSemaphore',
1844dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson       'Condition', 'Event', 'Value', 'Array', 'list', 'dict',
1845dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        'Namespace', 'JoinableQueue'
1846dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        )))
1847dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1848dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersontestcases_manager = create_test_cases(ManagerMixin, type='manager')
1849dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonglobals().update(testcases_manager)
1850dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1851dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1852dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonclass ThreadsMixin(object):
1853dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    TYPE = 'threads'
1854dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    Process = multiprocessing.dummy.Process
1855dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    locals().update(get_attributes(multiprocessing.dummy, (
1856dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        'Queue', 'Lock', 'RLock', 'Semaphore', 'BoundedSemaphore',
1857dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        'Condition', 'Event', 'Value', 'Array', 'current_process',
1858dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        'active_children', 'Pipe', 'connection', 'dict', 'list',
1859dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        'Namespace', 'JoinableQueue'
1860dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        )))
1861dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1862dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersontestcases_threads = create_test_cases(ThreadsMixin, type='threads')
1863dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonglobals().update(testcases_threads)
1864dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
18650c519b3a5e847eea0dffb51ac8df7c68891daf70Neal Norwitzclass OtherTest(unittest.TestCase):
18660c519b3a5e847eea0dffb51ac8df7c68891daf70Neal Norwitz    # TODO: add more tests for deliver/answer challenge.
18670c519b3a5e847eea0dffb51ac8df7c68891daf70Neal Norwitz    def test_deliver_challenge_auth_failure(self):
18680c519b3a5e847eea0dffb51ac8df7c68891daf70Neal Norwitz        class _FakeConnection(object):
18690c519b3a5e847eea0dffb51ac8df7c68891daf70Neal Norwitz            def recv_bytes(self, size):
18702a7767a17311cada06240a187c8896bdbcc1a4d0Neal Norwitz                return b'something bogus'
18710c519b3a5e847eea0dffb51ac8df7c68891daf70Neal Norwitz            def send_bytes(self, data):
18720c519b3a5e847eea0dffb51ac8df7c68891daf70Neal Norwitz                pass
18730c519b3a5e847eea0dffb51ac8df7c68891daf70Neal Norwitz        self.assertRaises(multiprocessing.AuthenticationError,
18740c519b3a5e847eea0dffb51ac8df7c68891daf70Neal Norwitz                          multiprocessing.connection.deliver_challenge,
18750c519b3a5e847eea0dffb51ac8df7c68891daf70Neal Norwitz                          _FakeConnection(), b'abc')
18760c519b3a5e847eea0dffb51ac8df7c68891daf70Neal Norwitz
18770c519b3a5e847eea0dffb51ac8df7c68891daf70Neal Norwitz    def test_answer_challenge_auth_failure(self):
18780c519b3a5e847eea0dffb51ac8df7c68891daf70Neal Norwitz        class _FakeConnection(object):
18790c519b3a5e847eea0dffb51ac8df7c68891daf70Neal Norwitz            def __init__(self):
18800c519b3a5e847eea0dffb51ac8df7c68891daf70Neal Norwitz                self.count = 0
18810c519b3a5e847eea0dffb51ac8df7c68891daf70Neal Norwitz            def recv_bytes(self, size):
18820c519b3a5e847eea0dffb51ac8df7c68891daf70Neal Norwitz                self.count += 1
18830c519b3a5e847eea0dffb51ac8df7c68891daf70Neal Norwitz                if self.count == 1:
18840c519b3a5e847eea0dffb51ac8df7c68891daf70Neal Norwitz                    return multiprocessing.connection.CHALLENGE
18850c519b3a5e847eea0dffb51ac8df7c68891daf70Neal Norwitz                elif self.count == 2:
18862a7767a17311cada06240a187c8896bdbcc1a4d0Neal Norwitz                    return b'something bogus'
18872a7767a17311cada06240a187c8896bdbcc1a4d0Neal Norwitz                return b''
18880c519b3a5e847eea0dffb51ac8df7c68891daf70Neal Norwitz            def send_bytes(self, data):
18890c519b3a5e847eea0dffb51ac8df7c68891daf70Neal Norwitz                pass
18900c519b3a5e847eea0dffb51ac8df7c68891daf70Neal Norwitz        self.assertRaises(multiprocessing.AuthenticationError,
18910c519b3a5e847eea0dffb51ac8df7c68891daf70Neal Norwitz                          multiprocessing.connection.answer_challenge,
18920c519b3a5e847eea0dffb51ac8df7c68891daf70Neal Norwitz                          _FakeConnection(), b'abc')
18930c519b3a5e847eea0dffb51ac8df7c68891daf70Neal Norwitz
18947152f6d9156a19a9f1b31e313d2c19d840dc089dJesse Noller#
18957152f6d9156a19a9f1b31e313d2c19d840dc089dJesse Noller# Test Manager.start()/Pool.__init__() initializer feature - see issue 5585
18967152f6d9156a19a9f1b31e313d2c19d840dc089dJesse Noller#
18977152f6d9156a19a9f1b31e313d2c19d840dc089dJesse Noller
18987152f6d9156a19a9f1b31e313d2c19d840dc089dJesse Nollerdef initializer(ns):
18997152f6d9156a19a9f1b31e313d2c19d840dc089dJesse Noller    ns.test += 1
19007152f6d9156a19a9f1b31e313d2c19d840dc089dJesse Noller
19017152f6d9156a19a9f1b31e313d2c19d840dc089dJesse Nollerclass TestInitializers(unittest.TestCase):
19027152f6d9156a19a9f1b31e313d2c19d840dc089dJesse Noller    def setUp(self):
19037152f6d9156a19a9f1b31e313d2c19d840dc089dJesse Noller        self.mgr = multiprocessing.Manager()
19047152f6d9156a19a9f1b31e313d2c19d840dc089dJesse Noller        self.ns = self.mgr.Namespace()
19057152f6d9156a19a9f1b31e313d2c19d840dc089dJesse Noller        self.ns.test = 0
19067152f6d9156a19a9f1b31e313d2c19d840dc089dJesse Noller
19077152f6d9156a19a9f1b31e313d2c19d840dc089dJesse Noller    def tearDown(self):
19087152f6d9156a19a9f1b31e313d2c19d840dc089dJesse Noller        self.mgr.shutdown()
19097152f6d9156a19a9f1b31e313d2c19d840dc089dJesse Noller
19107152f6d9156a19a9f1b31e313d2c19d840dc089dJesse Noller    def test_manager_initializer(self):
19117152f6d9156a19a9f1b31e313d2c19d840dc089dJesse Noller        m = multiprocessing.managers.SyncManager()
19127152f6d9156a19a9f1b31e313d2c19d840dc089dJesse Noller        self.assertRaises(TypeError, m.start, 1)
19137152f6d9156a19a9f1b31e313d2c19d840dc089dJesse Noller        m.start(initializer, (self.ns,))
19147152f6d9156a19a9f1b31e313d2c19d840dc089dJesse Noller        self.assertEqual(self.ns.test, 1)
19157152f6d9156a19a9f1b31e313d2c19d840dc089dJesse Noller        m.shutdown()
19167152f6d9156a19a9f1b31e313d2c19d840dc089dJesse Noller
19177152f6d9156a19a9f1b31e313d2c19d840dc089dJesse Noller    def test_pool_initializer(self):
19187152f6d9156a19a9f1b31e313d2c19d840dc089dJesse Noller        self.assertRaises(TypeError, multiprocessing.Pool, initializer=1)
19197152f6d9156a19a9f1b31e313d2c19d840dc089dJesse Noller        p = multiprocessing.Pool(1, initializer, (self.ns,))
19207152f6d9156a19a9f1b31e313d2c19d840dc089dJesse Noller        p.close()
19217152f6d9156a19a9f1b31e313d2c19d840dc089dJesse Noller        p.join()
19227152f6d9156a19a9f1b31e313d2c19d840dc089dJesse Noller        self.assertEqual(self.ns.test, 1)
19237152f6d9156a19a9f1b31e313d2c19d840dc089dJesse Noller
19241b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller#
19251b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller# Issue 5155, 5313, 5331: Test process in processes
19261b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller# Verifies os.close(sys.stdin.fileno) vs. sys.stdin.close() behavior
19271b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller#
19281b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller
19291b90efbdc5bb204fe50aea87374603dcba309227Jesse Nollerdef _ThisSubProcess(q):
19301b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller    try:
19311b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller        item = q.get(block=False)
19321b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller    except Queue.Empty:
19331b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller        pass
19341b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller
19351b90efbdc5bb204fe50aea87374603dcba309227Jesse Nollerdef _TestProcess(q):
19361b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller    queue = multiprocessing.Queue()
19371b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller    subProc = multiprocessing.Process(target=_ThisSubProcess, args=(queue,))
19381b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller    subProc.start()
19391b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller    subProc.join()
19401b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller
19411b90efbdc5bb204fe50aea87374603dcba309227Jesse Nollerdef _afunc(x):
19421b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller    return x*x
19431b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller
19441b90efbdc5bb204fe50aea87374603dcba309227Jesse Nollerdef pool_in_process():
19451b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller    pool = multiprocessing.Pool(processes=4)
19461b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller    x = pool.map(_afunc, [1, 2, 3, 4, 5, 6, 7])
19471b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller
19481b90efbdc5bb204fe50aea87374603dcba309227Jesse Nollerclass _file_like(object):
19491b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller    def __init__(self, delegate):
19501b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller        self._delegate = delegate
19511b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller        self._pid = None
19521b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller
19531b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller    @property
19541b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller    def cache(self):
19551b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller        pid = os.getpid()
19561b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller        # There are no race conditions since fork keeps only the running thread
19571b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller        if pid != self._pid:
19581b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller            self._pid = pid
19591b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller            self._cache = []
19601b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller        return self._cache
19611b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller
19621b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller    def write(self, data):
19631b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller        self.cache.append(data)
19641b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller
19651b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller    def flush(self):
19661b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller        self._delegate.write(''.join(self.cache))
19671b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller        self._cache = []
19681b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller
19691b90efbdc5bb204fe50aea87374603dcba309227Jesse Nollerclass TestStdinBadfiledescriptor(unittest.TestCase):
19701b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller
19711b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller    def test_queue_in_process(self):
19721b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller        queue = multiprocessing.Queue()
19731b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller        proc = multiprocessing.Process(target=_TestProcess, args=(queue,))
19741b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller        proc.start()
19751b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller        proc.join()
19761b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller
19771b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller    def test_pool_in_process(self):
19781b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller        p = multiprocessing.Process(target=pool_in_process)
19791b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller        p.start()
19801b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller        p.join()
19811b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller
19821b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller    def test_flushing(self):
19831b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller        sio = StringIO()
19841b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller        flike = _file_like(sio)
19851b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller        flike.write('foo')
19861b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller        proc = multiprocessing.Process(target=lambda: flike.flush())
19871b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller        flike.flush()
19881b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller        assert sio.getvalue() == 'foo'
19891b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller
19901b90efbdc5bb204fe50aea87374603dcba309227Jesse Nollertestcases_other = [OtherTest, TestInvalidHandle, TestInitializers,
19911b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller                   TestStdinBadfiledescriptor]
19920c519b3a5e847eea0dffb51ac8df7c68891daf70Neal Norwitz
1993dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson#
1994dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson#
1995dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson#
1996dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1997dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersondef test_main(run=None):
199818623825d25b0f8f3b4bf96c1d5c4c2977a94004Jesse Noller    if sys.platform.startswith("linux"):
199918623825d25b0f8f3b4bf96c1d5c4c2977a94004Jesse Noller        try:
200018623825d25b0f8f3b4bf96c1d5c4c2977a94004Jesse Noller            lock = multiprocessing.RLock()
200118623825d25b0f8f3b4bf96c1d5c4c2977a94004Jesse Noller        except OSError:
2002bec087f29d7dca0aaf8f51be7d7c135e9b84e7f1Benjamin Peterson            raise unittest.SkipTest("OSError raises on RLock creation, see issue 3111!")
2003ed77f2e143102df58212ff1f64a87f7e0c237439Benjamin Peterson
2004dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    if run is None:
2005dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        from test.test_support import run_unittest as run
2006dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
2007dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    util.get_temp_dir()     # creates temp directory for use by all processes
2008dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
2009dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    multiprocessing.get_logger().setLevel(LOG_LEVEL)
2010dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
2011146b7ab818cadccf91ad98e64cfefb77705da0caJesse Noller    ProcessesMixin.pool = multiprocessing.Pool(4)
2012146b7ab818cadccf91ad98e64cfefb77705da0caJesse Noller    ThreadsMixin.pool = multiprocessing.dummy.Pool(4)
2013146b7ab818cadccf91ad98e64cfefb77705da0caJesse Noller    ManagerMixin.manager.__init__()
2014146b7ab818cadccf91ad98e64cfefb77705da0caJesse Noller    ManagerMixin.manager.start()
2015146b7ab818cadccf91ad98e64cfefb77705da0caJesse Noller    ManagerMixin.pool = ManagerMixin.manager.Pool(4)
2016dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
2017dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    testcases = (
2018146b7ab818cadccf91ad98e64cfefb77705da0caJesse Noller        sorted(testcases_processes.values(), key=lambda tc:tc.__name__) +
2019146b7ab818cadccf91ad98e64cfefb77705da0caJesse Noller        sorted(testcases_threads.values(), key=lambda tc:tc.__name__) +
20200c519b3a5e847eea0dffb51ac8df7c68891daf70Neal Norwitz        sorted(testcases_manager.values(), key=lambda tc:tc.__name__) +
20210c519b3a5e847eea0dffb51ac8df7c68891daf70Neal Norwitz        testcases_other
2022dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        )
2023dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
2024dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    loadTestsFromTestCase = unittest.defaultTestLoader.loadTestsFromTestCase
2025dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    suite = unittest.TestSuite(loadTestsFromTestCase(tc) for tc in testcases)
2026ce8e33a095030e7af94f58f9da196b240bdf0476Senthil Kumaran    run(suite)
2027dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
2028146b7ab818cadccf91ad98e64cfefb77705da0caJesse Noller    ThreadsMixin.pool.terminate()
2029146b7ab818cadccf91ad98e64cfefb77705da0caJesse Noller    ProcessesMixin.pool.terminate()
2030146b7ab818cadccf91ad98e64cfefb77705da0caJesse Noller    ManagerMixin.pool.terminate()
2031146b7ab818cadccf91ad98e64cfefb77705da0caJesse Noller    ManagerMixin.manager.shutdown()
2032dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
2033146b7ab818cadccf91ad98e64cfefb77705da0caJesse Noller    del ProcessesMixin.pool, ThreadsMixin.pool, ManagerMixin.pool
2034dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
2035dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersondef main():
2036dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    test_main(unittest.TextTestRunner(verbosity=2).run)
2037dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
2038dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonif __name__ == '__main__':
2039dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    main()
2040