test_multiprocessing.py revision a06e9b8f6b2edf4936146fa8867f12222106d0f8
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 Queue
9dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonimport time
10dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonimport sys
11dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonimport os
12dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonimport gc
13dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonimport signal
14dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonimport array
15dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonimport socket
16dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonimport random
17dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonimport logging
18c4920e86ef7511b4e858028e870b1811437a71d0Mark Dickinsonfrom test import test_support
191b90efbdc5bb204fe50aea87374603dcba309227Jesse Nollerfrom StringIO import StringIO
203db8a3432bd84b58bdc7da2c9872777c537a4d09R. David Murray_multiprocessing = test_support.import_module('_multiprocessing')
21613b4cf28337902a586f259c6144083771fc06e5Victor Stinner# import threading after _multiprocessing to raise a more revelant error
22613b4cf28337902a586f259c6144083771fc06e5Victor Stinner# message: "No module named _multiprocessing". _multiprocessing is not compiled
23613b4cf28337902a586f259c6144083771fc06e5Victor Stinner# without thread support.
24613b4cf28337902a586f259c6144083771fc06e5Victor Stinnerimport threading
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
37a06e9b8f6b2edf4936146fa8867f12222106d0f8Brian Curtintry:
38a06e9b8f6b2edf4936146fa8867f12222106d0f8Brian Curtin    from multiprocessing.sharedctypes import Value, copy
39a06e9b8f6b2edf4936146fa8867f12222106d0f8Brian Curtin    HAS_SHAREDCTYPES = True
40a06e9b8f6b2edf4936146fa8867f12222106d0f8Brian Curtinexcept ImportError:
41a06e9b8f6b2edf4936146fa8867f12222106d0f8Brian Curtin    HAS_SHAREDCTYPES = False
42a06e9b8f6b2edf4936146fa8867f12222106d0f8Brian Curtin
43dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson#
44dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson#
45dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson#
46dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
47e79edf5f7c53f977b8e1fe8c00773e4668e35ea9Benjamin Petersonlatin = str
48dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
49dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson#
50dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# Constants
51dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson#
52dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
53dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin PetersonLOG_LEVEL = util.SUBWARNING
54654ade3e6afa2527d1f642be28d69e219bd58b71Jesse Noller#LOG_LEVEL = logging.DEBUG
55dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
56dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin PetersonDELTA = 0.1
57dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin PetersonCHECK_TIMINGS = False     # making true makes tests take a lot longer
58dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson                          # and can sometimes cause some non-serious
59dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson                          # failures because some calls block a bit
60dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson                          # longer than expected
61dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonif CHECK_TIMINGS:
62dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    TIMEOUT1, TIMEOUT2, TIMEOUT3 = 0.82, 0.35, 1.4
63dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonelse:
64dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    TIMEOUT1, TIMEOUT2, TIMEOUT3 = 0.1, 0.1, 0.1
65dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
66dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin PetersonHAVE_GETVALUE = not getattr(_multiprocessing,
67dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson                            'HAVE_BROKEN_SEM_GETVALUE', False)
68dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
699a5b2ad38d605206f05a52fe32868d3f839e8a86Jesse NollerWIN32 = (sys.platform == "win32")
709a5b2ad38d605206f05a52fe32868d3f839e8a86Jesse Noller
71dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson#
7236b9fbb803659350f9e6182b85f5bf66ca2a72a8Florent Xicluna# Some tests require ctypes
7336b9fbb803659350f9e6182b85f5bf66ca2a72a8Florent Xicluna#
7436b9fbb803659350f9e6182b85f5bf66ca2a72a8Florent Xicluna
7536b9fbb803659350f9e6182b85f5bf66ca2a72a8Florent Xiclunatry:
7613623662eac551c8575ec2507d9afc2a5fcba033Nick Coghlan    from ctypes import Structure, c_int, c_double
7736b9fbb803659350f9e6182b85f5bf66ca2a72a8Florent Xiclunaexcept ImportError:
7836b9fbb803659350f9e6182b85f5bf66ca2a72a8Florent Xicluna    Structure = object
7936b9fbb803659350f9e6182b85f5bf66ca2a72a8Florent Xicluna    c_int = c_double = None
8036b9fbb803659350f9e6182b85f5bf66ca2a72a8Florent Xicluna
8136b9fbb803659350f9e6182b85f5bf66ca2a72a8Florent Xicluna#
82dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# Creates a wrapper for a function which records the time it takes to finish
83dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson#
84dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
85dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonclass TimingWrapper(object):
86dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
87dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def __init__(self, func):
88dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.func = func
89dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.elapsed = None
90dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
91dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def __call__(self, *args, **kwds):
92dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        t = time.time()
93dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        try:
94dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            return self.func(*args, **kwds)
95dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        finally:
96dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            self.elapsed = time.time() - t
97dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
98dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson#
99dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# Base class for test cases
100dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson#
101dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
102dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonclass BaseTestCase(object):
103dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
104dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    ALLOWED_TYPES = ('processes', 'manager', 'threads')
105dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
106dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def assertTimingAlmostEqual(self, a, b):
107dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        if CHECK_TIMINGS:
108dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            self.assertAlmostEqual(a, b, 1)
109dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
110dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def assertReturnsIfImplemented(self, value, func, *args):
111dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        try:
112dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            res = func(*args)
113dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        except NotImplementedError:
114dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            pass
115dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        else:
116dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            return self.assertEqual(value, res)
117dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
118dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson#
119dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# Return the value of a semaphore
120dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson#
121dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
122dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersondef get_value(self):
123dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    try:
124dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        return self.get_value()
125dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    except AttributeError:
126dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        try:
127dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            return self._Semaphore__value
128dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        except AttributeError:
129dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            try:
130dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson                return self._value
131dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            except AttributeError:
132dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson                raise NotImplementedError
133dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
134dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson#
135dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# Testcases
136dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson#
137dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
138dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonclass _TestProcess(BaseTestCase):
139dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
140dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    ALLOWED_TYPES = ('processes', 'threads')
141dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
142dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def test_current(self):
143dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        if self.TYPE == 'threads':
144dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            return
145dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
146dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        current = self.current_process()
1475bc9f4c09c99eb701dbee83fb9e26eed558e474fJesse Noller        authkey = current.authkey
148dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
149dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertTrue(current.is_alive())
1505bc9f4c09c99eb701dbee83fb9e26eed558e474fJesse Noller        self.assertTrue(not current.daemon)
151b0f5adc3f4e098b1744eeac65fc830fb1df2b8abEzio Melotti        self.assertIsInstance(authkey, bytes)
152dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertTrue(len(authkey) > 0)
1535bc9f4c09c99eb701dbee83fb9e26eed558e474fJesse Noller        self.assertEqual(current.ident, os.getpid())
1545bc9f4c09c99eb701dbee83fb9e26eed558e474fJesse Noller        self.assertEqual(current.exitcode, None)
155dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
156dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def _test(self, q, *args, **kwds):
157dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        current = self.current_process()
158dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        q.put(args)
159dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        q.put(kwds)
1605bc9f4c09c99eb701dbee83fb9e26eed558e474fJesse Noller        q.put(current.name)
161dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        if self.TYPE != 'threads':
1625bc9f4c09c99eb701dbee83fb9e26eed558e474fJesse Noller            q.put(bytes(current.authkey))
163dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            q.put(current.pid)
164dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
165dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def test_process(self):
166dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        q = self.Queue(1)
167dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        e = self.Event()
168dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        args = (q, 1, 2)
169dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        kwargs = {'hello':23, 'bye':2.54}
170dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        name = 'SomeProcess'
171dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        p = self.Process(
172dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            target=self._test, args=args, kwargs=kwargs, name=name
173dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            )
1745bc9f4c09c99eb701dbee83fb9e26eed558e474fJesse Noller        p.daemon = True
175dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        current = self.current_process()
176dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
177dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        if self.TYPE != 'threads':
1785bc9f4c09c99eb701dbee83fb9e26eed558e474fJesse Noller            self.assertEquals(p.authkey, current.authkey)
179dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEquals(p.is_alive(), False)
1805bc9f4c09c99eb701dbee83fb9e26eed558e474fJesse Noller        self.assertEquals(p.daemon, True)
181aa98058cc44ba20f35c106d20918c6196b737561Ezio Melotti        self.assertNotIn(p, self.active_children())
182dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertTrue(type(self.active_children()) is list)
1835bc9f4c09c99eb701dbee83fb9e26eed558e474fJesse Noller        self.assertEqual(p.exitcode, None)
184dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
185dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        p.start()
186dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1875bc9f4c09c99eb701dbee83fb9e26eed558e474fJesse Noller        self.assertEquals(p.exitcode, None)
188dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEquals(p.is_alive(), True)
189aa98058cc44ba20f35c106d20918c6196b737561Ezio Melotti        self.assertIn(p, self.active_children())
190dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
191dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEquals(q.get(), args[1:])
192dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEquals(q.get(), kwargs)
1935bc9f4c09c99eb701dbee83fb9e26eed558e474fJesse Noller        self.assertEquals(q.get(), p.name)
194dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        if self.TYPE != 'threads':
1955bc9f4c09c99eb701dbee83fb9e26eed558e474fJesse Noller            self.assertEquals(q.get(), current.authkey)
196dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            self.assertEquals(q.get(), p.pid)
197dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
198dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        p.join()
199dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
2005bc9f4c09c99eb701dbee83fb9e26eed558e474fJesse Noller        self.assertEquals(p.exitcode, 0)
201dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEquals(p.is_alive(), False)
202aa98058cc44ba20f35c106d20918c6196b737561Ezio Melotti        self.assertNotIn(p, self.active_children())
203dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
204dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def _test_terminate(self):
205dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        time.sleep(1000)
206dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
207dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def test_terminate(self):
208dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        if self.TYPE == 'threads':
209dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            return
210dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
211dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        p = self.Process(target=self._test_terminate)
2125bc9f4c09c99eb701dbee83fb9e26eed558e474fJesse Noller        p.daemon = True
213dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        p.start()
214dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
215dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(p.is_alive(), True)
216aa98058cc44ba20f35c106d20918c6196b737561Ezio Melotti        self.assertIn(p, self.active_children())
2175bc9f4c09c99eb701dbee83fb9e26eed558e474fJesse Noller        self.assertEqual(p.exitcode, None)
218dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
219dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        p.terminate()
220dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
221dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        join = TimingWrapper(p.join)
222dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(join(), None)
223dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertTimingAlmostEqual(join.elapsed, 0.0)
224dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
225dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(p.is_alive(), False)
226aa98058cc44ba20f35c106d20918c6196b737561Ezio Melotti        self.assertNotIn(p, self.active_children())
227dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
228dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        p.join()
229dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
2305bc9f4c09c99eb701dbee83fb9e26eed558e474fJesse Noller        # XXX sometimes get p.exitcode == 0 on Windows ...
2315bc9f4c09c99eb701dbee83fb9e26eed558e474fJesse Noller        #self.assertEqual(p.exitcode, -signal.SIGTERM)
232dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
233dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def test_cpu_count(self):
234dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        try:
235dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            cpus = multiprocessing.cpu_count()
236dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        except NotImplementedError:
237dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            cpus = 1
238dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertTrue(type(cpus) is int)
239dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertTrue(cpus >= 1)
240dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
241dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def test_active_children(self):
242dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(type(self.active_children()), list)
243dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
244dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        p = self.Process(target=time.sleep, args=(DELTA,))
245aa98058cc44ba20f35c106d20918c6196b737561Ezio Melotti        self.assertNotIn(p, self.active_children())
246dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
247dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        p.start()
248aa98058cc44ba20f35c106d20918c6196b737561Ezio Melotti        self.assertIn(p, self.active_children())
249dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
250dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        p.join()
251aa98058cc44ba20f35c106d20918c6196b737561Ezio Melotti        self.assertNotIn(p, self.active_children())
252dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
253dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def _test_recursion(self, wconn, id):
254dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        from multiprocessing import forking
255dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        wconn.send(id)
256dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        if len(id) < 2:
257dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            for i in range(2):
258dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson                p = self.Process(
259dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson                    target=self._test_recursion, args=(wconn, id+[i])
260dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson                    )
261dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson                p.start()
262dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson                p.join()
263dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
264dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def test_recursion(self):
265dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        rconn, wconn = self.Pipe(duplex=False)
266dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self._test_recursion(wconn, [])
267dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
268dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        time.sleep(DELTA)
269dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        result = []
270dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        while rconn.poll():
271dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            result.append(rconn.recv())
272dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
273dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        expected = [
274dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            [],
275dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson              [0],
276dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson                [0, 0],
277dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson                [0, 1],
278dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson              [1],
279dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson                [1, 0],
280dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson                [1, 1]
281dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            ]
282dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(result, expected)
283dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
284dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson#
285dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson#
286dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson#
287dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
288dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonclass _UpperCaser(multiprocessing.Process):
289dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
290dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def __init__(self):
291dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        multiprocessing.Process.__init__(self)
292dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.child_conn, self.parent_conn = multiprocessing.Pipe()
293dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
294dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def run(self):
295dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.parent_conn.close()
296dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        for s in iter(self.child_conn.recv, None):
297dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            self.child_conn.send(s.upper())
298dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.child_conn.close()
299dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
300dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def submit(self, s):
301dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        assert type(s) is str
302dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.parent_conn.send(s)
303dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        return self.parent_conn.recv()
304dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
305dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def stop(self):
306dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.parent_conn.send(None)
307dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.parent_conn.close()
308dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.child_conn.close()
309dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
310dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonclass _TestSubclassingProcess(BaseTestCase):
311dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
312dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    ALLOWED_TYPES = ('processes',)
313dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
314dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def test_subclassing(self):
315dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        uppercaser = _UpperCaser()
316dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        uppercaser.start()
317dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(uppercaser.submit('hello'), 'HELLO')
318dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(uppercaser.submit('world'), 'WORLD')
319dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        uppercaser.stop()
320dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        uppercaser.join()
321dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
322dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson#
323dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson#
324dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson#
325dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
326dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersondef queue_empty(q):
327dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    if hasattr(q, 'empty'):
328dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        return q.empty()
329dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    else:
330dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        return q.qsize() == 0
331dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
332dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersondef queue_full(q, maxsize):
333dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    if hasattr(q, 'full'):
334dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        return q.full()
335dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    else:
336dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        return q.qsize() == maxsize
337dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
338dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
339dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonclass _TestQueue(BaseTestCase):
340dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
341dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
342dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def _test_put(self, queue, child_can_start, parent_can_continue):
343dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        child_can_start.wait()
344dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        for i in range(6):
345dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            queue.get()
346dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        parent_can_continue.set()
347dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
348dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def test_put(self):
349dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        MAXSIZE = 6
350dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        queue = self.Queue(maxsize=MAXSIZE)
351dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        child_can_start = self.Event()
352dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        parent_can_continue = self.Event()
353dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
354dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        proc = self.Process(
355dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            target=self._test_put,
356dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            args=(queue, child_can_start, parent_can_continue)
357dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            )
3585bc9f4c09c99eb701dbee83fb9e26eed558e474fJesse Noller        proc.daemon = True
359dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        proc.start()
360dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
361dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(queue_empty(queue), True)
362dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(queue_full(queue, MAXSIZE), False)
363dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
364dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        queue.put(1)
365dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        queue.put(2, True)
366dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        queue.put(3, True, None)
367dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        queue.put(4, False)
368dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        queue.put(5, False, None)
369dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        queue.put_nowait(6)
370dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
371dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        # the values may be in buffer but not yet in pipe so sleep a bit
372dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        time.sleep(DELTA)
373dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
374dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(queue_empty(queue), False)
375dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(queue_full(queue, MAXSIZE), True)
376dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
377dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        put = TimingWrapper(queue.put)
378dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        put_nowait = TimingWrapper(queue.put_nowait)
379dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
380dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertRaises(Queue.Full, put, 7, False)
381dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertTimingAlmostEqual(put.elapsed, 0)
382dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
383dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertRaises(Queue.Full, put, 7, False, None)
384dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertTimingAlmostEqual(put.elapsed, 0)
385dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
386dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertRaises(Queue.Full, put_nowait, 7)
387dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertTimingAlmostEqual(put_nowait.elapsed, 0)
388dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
389dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertRaises(Queue.Full, put, 7, True, TIMEOUT1)
390dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertTimingAlmostEqual(put.elapsed, TIMEOUT1)
391dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
392dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertRaises(Queue.Full, put, 7, False, TIMEOUT2)
393dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertTimingAlmostEqual(put.elapsed, 0)
394dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
395dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertRaises(Queue.Full, put, 7, True, timeout=TIMEOUT3)
396dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertTimingAlmostEqual(put.elapsed, TIMEOUT3)
397dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
398dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        child_can_start.set()
399dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        parent_can_continue.wait()
400dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
401dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(queue_empty(queue), True)
402dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(queue_full(queue, MAXSIZE), False)
403dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
404dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        proc.join()
405dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
406dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def _test_get(self, queue, child_can_start, parent_can_continue):
407dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        child_can_start.wait()
408da3a1b120055855a464c2d5f5143021ae8f5dc86Benjamin Peterson        #queue.put(1)
409dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        queue.put(2)
410dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        queue.put(3)
411dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        queue.put(4)
412dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        queue.put(5)
413dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        parent_can_continue.set()
414dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
415dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def test_get(self):
416dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        queue = self.Queue()
417dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        child_can_start = self.Event()
418dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        parent_can_continue = self.Event()
419dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
420dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        proc = self.Process(
421dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            target=self._test_get,
422dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            args=(queue, child_can_start, parent_can_continue)
423dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            )
4245bc9f4c09c99eb701dbee83fb9e26eed558e474fJesse Noller        proc.daemon = True
425dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        proc.start()
426dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
427dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(queue_empty(queue), True)
428dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
429dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        child_can_start.set()
430dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        parent_can_continue.wait()
431dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
432dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        time.sleep(DELTA)
433dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(queue_empty(queue), False)
434dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
435da3a1b120055855a464c2d5f5143021ae8f5dc86Benjamin Peterson        # Hangs unexpectedly, remove for now
436da3a1b120055855a464c2d5f5143021ae8f5dc86Benjamin Peterson        #self.assertEqual(queue.get(), 1)
437dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(queue.get(True, None), 2)
438dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(queue.get(True), 3)
439dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(queue.get(timeout=1), 4)
440dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(queue.get_nowait(), 5)
441dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
442dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(queue_empty(queue), True)
443dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
444dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        get = TimingWrapper(queue.get)
445dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        get_nowait = TimingWrapper(queue.get_nowait)
446dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
447dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertRaises(Queue.Empty, get, False)
448dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertTimingAlmostEqual(get.elapsed, 0)
449dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
450dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertRaises(Queue.Empty, get, False, None)
451dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertTimingAlmostEqual(get.elapsed, 0)
452dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
453dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertRaises(Queue.Empty, get_nowait)
454dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertTimingAlmostEqual(get_nowait.elapsed, 0)
455dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
456dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertRaises(Queue.Empty, get, True, TIMEOUT1)
457dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertTimingAlmostEqual(get.elapsed, TIMEOUT1)
458dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
459dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertRaises(Queue.Empty, get, False, TIMEOUT2)
460dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertTimingAlmostEqual(get.elapsed, 0)
461dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
462dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertRaises(Queue.Empty, get, timeout=TIMEOUT3)
463dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertTimingAlmostEqual(get.elapsed, TIMEOUT3)
464dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
465dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        proc.join()
466dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
467dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def _test_fork(self, queue):
468dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        for i in range(10, 20):
469dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            queue.put(i)
470dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        # note that at this point the items may only be buffered, so the
471dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        # process cannot shutdown until the feeder thread has finished
472dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        # pushing items onto the pipe.
473dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
474dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def test_fork(self):
475dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        # Old versions of Queue would fail to create a new feeder
476dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        # thread for a forked process if the original process had its
477dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        # own feeder thread.  This test checks that this no longer
478dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        # happens.
479dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
480dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        queue = self.Queue()
481dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
482dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        # put items on queue so that main process starts a feeder thread
483dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        for i in range(10):
484dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            queue.put(i)
485dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
486dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        # wait to make sure thread starts before we fork a new process
487dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        time.sleep(DELTA)
488dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
489dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        # fork process
490dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        p = self.Process(target=self._test_fork, args=(queue,))
491dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        p.start()
492dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
493dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        # check that all expected items are in the queue
494dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        for i in range(20):
495dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            self.assertEqual(queue.get(), i)
496dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertRaises(Queue.Empty, queue.get, False)
497dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
498dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        p.join()
499dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
500dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def test_qsize(self):
501dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        q = self.Queue()
502dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        try:
503dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            self.assertEqual(q.qsize(), 0)
504dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        except NotImplementedError:
505dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            return
506dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        q.put(1)
507dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(q.qsize(), 1)
508dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        q.put(5)
509dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(q.qsize(), 2)
510dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        q.get()
511dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(q.qsize(), 1)
512dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        q.get()
513dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(q.qsize(), 0)
514dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
515dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def _test_task_done(self, q):
516dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        for obj in iter(q.get, None):
517dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            time.sleep(DELTA)
518dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            q.task_done()
519dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
520dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def test_task_done(self):
521dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        queue = self.JoinableQueue()
522dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
523dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        if sys.version_info < (2, 5) and not hasattr(queue, 'task_done'):
52436b9fbb803659350f9e6182b85f5bf66ca2a72a8Florent Xicluna            self.skipTest("requires 'queue.task_done()' method")
525dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
526dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        workers = [self.Process(target=self._test_task_done, args=(queue,))
527dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson                   for i in xrange(4)]
528dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
529dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        for p in workers:
530dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            p.start()
531dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
532dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        for i in xrange(10):
533dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            queue.put(i)
534dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
535dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        queue.join()
536dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
537dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        for p in workers:
538dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            queue.put(None)
539dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
540dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        for p in workers:
541dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            p.join()
542dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
543dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson#
544dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson#
545dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson#
546dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
547dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonclass _TestLock(BaseTestCase):
548dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
549dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def test_lock(self):
550dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        lock = self.Lock()
551dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(lock.acquire(), True)
552dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(lock.acquire(False), False)
553dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(lock.release(), None)
554dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertRaises((ValueError, threading.ThreadError), lock.release)
555dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
556dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def test_rlock(self):
557dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        lock = self.RLock()
558dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(lock.acquire(), True)
559dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(lock.acquire(), True)
560dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(lock.acquire(), True)
561dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(lock.release(), None)
562dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(lock.release(), None)
563dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(lock.release(), None)
564dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertRaises((AssertionError, RuntimeError), lock.release)
565dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
56682eb5902ce169be81110c79662b772b904cd00fcJesse Noller    def test_lock_context(self):
56782eb5902ce169be81110c79662b772b904cd00fcJesse Noller        with self.Lock():
56882eb5902ce169be81110c79662b772b904cd00fcJesse Noller            pass
56982eb5902ce169be81110c79662b772b904cd00fcJesse Noller
570dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
571dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonclass _TestSemaphore(BaseTestCase):
572dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
573dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def _test_semaphore(self, sem):
574dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertReturnsIfImplemented(2, get_value, sem)
575dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(sem.acquire(), True)
576dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertReturnsIfImplemented(1, get_value, sem)
577dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(sem.acquire(), True)
578dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertReturnsIfImplemented(0, get_value, sem)
579dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(sem.acquire(False), False)
580dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertReturnsIfImplemented(0, get_value, sem)
581dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(sem.release(), None)
582dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertReturnsIfImplemented(1, get_value, sem)
583dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(sem.release(), None)
584dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertReturnsIfImplemented(2, get_value, sem)
585dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
586dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def test_semaphore(self):
587dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        sem = self.Semaphore(2)
588dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self._test_semaphore(sem)
589dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(sem.release(), None)
590dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertReturnsIfImplemented(3, get_value, sem)
591dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(sem.release(), None)
592dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertReturnsIfImplemented(4, get_value, sem)
593dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
594dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def test_bounded_semaphore(self):
595dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        sem = self.BoundedSemaphore(2)
596dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self._test_semaphore(sem)
597dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        # Currently fails on OS/X
598dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        #if HAVE_GETVALUE:
599dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        #    self.assertRaises(ValueError, sem.release)
600dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        #    self.assertReturnsIfImplemented(2, get_value, sem)
601dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
602dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def test_timeout(self):
603dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        if self.TYPE != 'processes':
604dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            return
605dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
606dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        sem = self.Semaphore(0)
607dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        acquire = TimingWrapper(sem.acquire)
608dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
609dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(acquire(False), False)
610dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertTimingAlmostEqual(acquire.elapsed, 0.0)
611dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
612dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(acquire(False, None), False)
613dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertTimingAlmostEqual(acquire.elapsed, 0.0)
614dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
615dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(acquire(False, TIMEOUT1), False)
616dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertTimingAlmostEqual(acquire.elapsed, 0)
617dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
618dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(acquire(True, TIMEOUT2), False)
619dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertTimingAlmostEqual(acquire.elapsed, TIMEOUT2)
620dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
621dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(acquire(timeout=TIMEOUT3), False)
622dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertTimingAlmostEqual(acquire.elapsed, TIMEOUT3)
623dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
624dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
625dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonclass _TestCondition(BaseTestCase):
626dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
627dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def f(self, cond, sleeping, woken, timeout=None):
628dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        cond.acquire()
629dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        sleeping.release()
630dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        cond.wait(timeout)
631dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        woken.release()
632dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        cond.release()
633dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
634dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def check_invariant(self, cond):
635dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        # this is only supposed to succeed when there are no sleepers
636dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        if self.TYPE == 'processes':
637dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            try:
638dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson                sleepers = (cond._sleeping_count.get_value() -
639dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson                            cond._woken_count.get_value())
640dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson                self.assertEqual(sleepers, 0)
641dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson                self.assertEqual(cond._wait_semaphore.get_value(), 0)
642dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            except NotImplementedError:
643dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson                pass
644dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
645dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def test_notify(self):
646dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        cond = self.Condition()
647dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        sleeping = self.Semaphore(0)
648dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        woken = self.Semaphore(0)
649dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
650dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        p = self.Process(target=self.f, args=(cond, sleeping, woken))
6515bc9f4c09c99eb701dbee83fb9e26eed558e474fJesse Noller        p.daemon = True
652dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        p.start()
653dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
654dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        p = threading.Thread(target=self.f, args=(cond, sleeping, woken))
6555bc9f4c09c99eb701dbee83fb9e26eed558e474fJesse Noller        p.daemon = True
656dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        p.start()
657dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
658dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        # wait for both children to start sleeping
659dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        sleeping.acquire()
660dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        sleeping.acquire()
661dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
662dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        # check no process/thread has woken up
663dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        time.sleep(DELTA)
664dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertReturnsIfImplemented(0, get_value, woken)
665dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
666dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        # wake up one process/thread
667dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        cond.acquire()
668dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        cond.notify()
669dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        cond.release()
670dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
671dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        # check one process/thread has woken up
672dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        time.sleep(DELTA)
673dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertReturnsIfImplemented(1, get_value, woken)
674dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
675dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        # wake up another
676dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        cond.acquire()
677dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        cond.notify()
678dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        cond.release()
679dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
680dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        # check other has woken up
681dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        time.sleep(DELTA)
682dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertReturnsIfImplemented(2, get_value, woken)
683dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
684dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        # check state is not mucked up
685dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.check_invariant(cond)
686dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        p.join()
687dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
688dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def test_notify_all(self):
689dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        cond = self.Condition()
690dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        sleeping = self.Semaphore(0)
691dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        woken = self.Semaphore(0)
692dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
693dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        # start some threads/processes which will timeout
694dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        for i in range(3):
695dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            p = self.Process(target=self.f,
696dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson                             args=(cond, sleeping, woken, TIMEOUT1))
6975bc9f4c09c99eb701dbee83fb9e26eed558e474fJesse Noller            p.daemon = True
698dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            p.start()
699dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
700dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            t = threading.Thread(target=self.f,
701dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson                                 args=(cond, sleeping, woken, TIMEOUT1))
702a9b2222de40ed62e6ec1c79f6a89607913f4babdBenjamin Peterson            t.daemon = True
703dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            t.start()
704dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
705dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        # wait for them all to sleep
706dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        for i in xrange(6):
707dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            sleeping.acquire()
708dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
709dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        # check they have all timed out
710dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        for i in xrange(6):
711dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            woken.acquire()
712dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertReturnsIfImplemented(0, get_value, woken)
713dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
714dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        # check state is not mucked up
715dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.check_invariant(cond)
716dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
717dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        # start some more threads/processes
718dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        for i in range(3):
719dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            p = self.Process(target=self.f, args=(cond, sleeping, woken))
7205bc9f4c09c99eb701dbee83fb9e26eed558e474fJesse Noller            p.daemon = True
721dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            p.start()
722dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
723dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            t = threading.Thread(target=self.f, args=(cond, sleeping, woken))
724a9b2222de40ed62e6ec1c79f6a89607913f4babdBenjamin Peterson            t.daemon = True
725dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            t.start()
726dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
727dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        # wait for them to all sleep
728dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        for i in xrange(6):
729dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            sleeping.acquire()
730dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
731dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        # check no process/thread has woken up
732dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        time.sleep(DELTA)
733dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertReturnsIfImplemented(0, get_value, woken)
734dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
735dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        # wake them all up
736dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        cond.acquire()
737dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        cond.notify_all()
738dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        cond.release()
739dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
740dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        # check they have all woken
741dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        time.sleep(DELTA)
742dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertReturnsIfImplemented(6, get_value, woken)
743dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
744dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        # check state is not mucked up
745dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.check_invariant(cond)
746dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
747dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def test_timeout(self):
748dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        cond = self.Condition()
749dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        wait = TimingWrapper(cond.wait)
750dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        cond.acquire()
751dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        res = wait(TIMEOUT1)
752dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        cond.release()
753dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(res, None)
754dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertTimingAlmostEqual(wait.elapsed, TIMEOUT1)
755dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
756dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
757dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonclass _TestEvent(BaseTestCase):
758dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
759dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def _test_event(self, event):
760dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        time.sleep(TIMEOUT2)
761dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        event.set()
762dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
763dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def test_event(self):
764dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        event = self.Event()
765dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        wait = TimingWrapper(event.wait)
766dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
767dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        # Removed temporaily, due to API shear, this does not
768dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        # work with threading._Event objects. is_set == isSet
76902cb0eb231fc01e2a50cbe14f6da7a8df52959efJesse Noller        self.assertEqual(event.is_set(), False)
770dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
77102cb0eb231fc01e2a50cbe14f6da7a8df52959efJesse Noller        # Removed, threading.Event.wait() will return the value of the __flag
77202cb0eb231fc01e2a50cbe14f6da7a8df52959efJesse Noller        # instead of None. API Shear with the semaphore backed mp.Event
77302cb0eb231fc01e2a50cbe14f6da7a8df52959efJesse Noller        self.assertEqual(wait(0.0), False)
774dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertTimingAlmostEqual(wait.elapsed, 0.0)
77502cb0eb231fc01e2a50cbe14f6da7a8df52959efJesse Noller        self.assertEqual(wait(TIMEOUT1), False)
776dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertTimingAlmostEqual(wait.elapsed, TIMEOUT1)
777dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
778dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        event.set()
779dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
780dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        # See note above on the API differences
78102cb0eb231fc01e2a50cbe14f6da7a8df52959efJesse Noller        self.assertEqual(event.is_set(), True)
78202cb0eb231fc01e2a50cbe14f6da7a8df52959efJesse Noller        self.assertEqual(wait(), True)
783dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertTimingAlmostEqual(wait.elapsed, 0.0)
78402cb0eb231fc01e2a50cbe14f6da7a8df52959efJesse Noller        self.assertEqual(wait(TIMEOUT1), True)
785dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertTimingAlmostEqual(wait.elapsed, 0.0)
786dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        # self.assertEqual(event.is_set(), True)
787dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
788dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        event.clear()
789dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
790dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        #self.assertEqual(event.is_set(), False)
791dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
792dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.Process(target=self._test_event, args=(event,)).start()
79302cb0eb231fc01e2a50cbe14f6da7a8df52959efJesse Noller        self.assertEqual(wait(), True)
794dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
795dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson#
796dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson#
797dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson#
798dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
799a06e9b8f6b2edf4936146fa8867f12222106d0f8Brian Curtin@unittest.skipUnless(HAS_SHAREDCTYPES,
800a06e9b8f6b2edf4936146fa8867f12222106d0f8Brian Curtin                     "requires multiprocessing.sharedctypes")
801dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonclass _TestValue(BaseTestCase):
802dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
80336b9fbb803659350f9e6182b85f5bf66ca2a72a8Florent Xicluna    ALLOWED_TYPES = ('processes',)
80436b9fbb803659350f9e6182b85f5bf66ca2a72a8Florent Xicluna
805dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    codes_values = [
806dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        ('i', 4343, 24234),
807dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        ('d', 3.625, -4.25),
808dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        ('h', -232, 234),
809dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        ('c', latin('x'), latin('y'))
810dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        ]
811dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
812dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def _test(self, values):
813dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        for sv, cv in zip(values, self.codes_values):
814dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            sv.value = cv[2]
815dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
816dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
817dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def test_value(self, raw=False):
818dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        if raw:
819dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            values = [self.RawValue(code, value)
820dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson                      for code, value, _ in self.codes_values]
821dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        else:
822dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            values = [self.Value(code, value)
823dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson                      for code, value, _ in self.codes_values]
824dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
825dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        for sv, cv in zip(values, self.codes_values):
826dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            self.assertEqual(sv.value, cv[1])
827dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
828dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        proc = self.Process(target=self._test, args=(values,))
829dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        proc.start()
830dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        proc.join()
831dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
832dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        for sv, cv in zip(values, self.codes_values):
833dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            self.assertEqual(sv.value, cv[2])
834dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
835dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def test_rawvalue(self):
836dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.test_value(raw=True)
837dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
838dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def test_getobj_getlock(self):
839dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        val1 = self.Value('i', 5)
840dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        lock1 = val1.get_lock()
841dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        obj1 = val1.get_obj()
842dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
843dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        val2 = self.Value('i', 5, lock=None)
844dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        lock2 = val2.get_lock()
845dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        obj2 = val2.get_obj()
846dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
847dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        lock = self.Lock()
848dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        val3 = self.Value('i', 5, lock=lock)
849dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        lock3 = val3.get_lock()
850dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        obj3 = val3.get_obj()
851dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(lock, lock3)
852dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
8536ab22154ddabdb67bd510a1f2e0aa9c7e0ee607dJesse Noller        arr4 = self.Value('i', 5, lock=False)
854dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertFalse(hasattr(arr4, 'get_lock'))
855dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertFalse(hasattr(arr4, 'get_obj'))
856dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
8576ab22154ddabdb67bd510a1f2e0aa9c7e0ee607dJesse Noller        self.assertRaises(AttributeError, self.Value, 'i', 5, lock='navalue')
8586ab22154ddabdb67bd510a1f2e0aa9c7e0ee607dJesse Noller
8596ab22154ddabdb67bd510a1f2e0aa9c7e0ee607dJesse Noller        arr5 = self.RawValue('i', 5)
8606ab22154ddabdb67bd510a1f2e0aa9c7e0ee607dJesse Noller        self.assertFalse(hasattr(arr5, 'get_lock'))
8616ab22154ddabdb67bd510a1f2e0aa9c7e0ee607dJesse Noller        self.assertFalse(hasattr(arr5, 'get_obj'))
8626ab22154ddabdb67bd510a1f2e0aa9c7e0ee607dJesse Noller
863dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
864dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonclass _TestArray(BaseTestCase):
865dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
86636b9fbb803659350f9e6182b85f5bf66ca2a72a8Florent Xicluna    ALLOWED_TYPES = ('processes',)
86736b9fbb803659350f9e6182b85f5bf66ca2a72a8Florent Xicluna
868dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def f(self, seq):
869dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        for i in range(1, len(seq)):
870dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            seq[i] += seq[i-1]
871dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
87236b9fbb803659350f9e6182b85f5bf66ca2a72a8Florent Xicluna    @unittest.skipIf(c_int is None, "requires _ctypes")
873dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def test_array(self, raw=False):
874dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        seq = [680, 626, 934, 821, 150, 233, 548, 982, 714, 831]
875dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        if raw:
876dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            arr = self.RawArray('i', seq)
877dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        else:
878dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            arr = self.Array('i', seq)
879dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
880dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(len(arr), len(seq))
881dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(arr[3], seq[3])
882dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(list(arr[2:7]), list(seq[2:7]))
883dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
884dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        arr[4:8] = seq[4:8] = array.array('i', [1, 2, 3, 4])
885dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
886dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(list(arr[:]), seq)
887dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
888dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.f(seq)
889dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
890dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        p = self.Process(target=self.f, args=(arr,))
891dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        p.start()
892dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        p.join()
893dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
894dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(list(arr[:]), seq)
895dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
89636b9fbb803659350f9e6182b85f5bf66ca2a72a8Florent Xicluna    @unittest.skipIf(c_int is None, "requires _ctypes")
897dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def test_rawarray(self):
898dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.test_array(raw=True)
899dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
90036b9fbb803659350f9e6182b85f5bf66ca2a72a8Florent Xicluna    @unittest.skipIf(c_int is None, "requires _ctypes")
901dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def test_getobj_getlock_obj(self):
902dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        arr1 = self.Array('i', range(10))
903dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        lock1 = arr1.get_lock()
904dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        obj1 = arr1.get_obj()
905dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
906dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        arr2 = self.Array('i', range(10), lock=None)
907dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        lock2 = arr2.get_lock()
908dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        obj2 = arr2.get_obj()
909dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
910dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        lock = self.Lock()
911dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        arr3 = self.Array('i', range(10), lock=lock)
912dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        lock3 = arr3.get_lock()
913dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        obj3 = arr3.get_obj()
914dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(lock, lock3)
915dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
9166ab22154ddabdb67bd510a1f2e0aa9c7e0ee607dJesse Noller        arr4 = self.Array('i', range(10), lock=False)
917dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertFalse(hasattr(arr4, 'get_lock'))
918dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertFalse(hasattr(arr4, 'get_obj'))
9196ab22154ddabdb67bd510a1f2e0aa9c7e0ee607dJesse Noller        self.assertRaises(AttributeError,
9206ab22154ddabdb67bd510a1f2e0aa9c7e0ee607dJesse Noller                          self.Array, 'i', range(10), lock='notalock')
9216ab22154ddabdb67bd510a1f2e0aa9c7e0ee607dJesse Noller
9226ab22154ddabdb67bd510a1f2e0aa9c7e0ee607dJesse Noller        arr5 = self.RawArray('i', range(10))
9236ab22154ddabdb67bd510a1f2e0aa9c7e0ee607dJesse Noller        self.assertFalse(hasattr(arr5, 'get_lock'))
9246ab22154ddabdb67bd510a1f2e0aa9c7e0ee607dJesse Noller        self.assertFalse(hasattr(arr5, 'get_obj'))
925dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
926dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson#
927dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson#
928dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson#
929dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
930dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonclass _TestContainers(BaseTestCase):
931dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
932dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    ALLOWED_TYPES = ('manager',)
933dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
934dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def test_list(self):
935dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        a = self.list(range(10))
936dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(a[:], range(10))
937dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
938dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        b = self.list()
939dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(b[:], [])
940dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
941dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        b.extend(range(5))
942dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(b[:], range(5))
943dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
944dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(b[2], 2)
945dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(b[2:10], [2,3,4])
946dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
947dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        b *= 2
948dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(b[:], [0, 1, 2, 3, 4, 0, 1, 2, 3, 4])
949dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
950dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(b + [5, 6], [0, 1, 2, 3, 4, 0, 1, 2, 3, 4, 5, 6])
951dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
952dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(a[:], range(10))
953dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
954dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        d = [a, b]
955dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        e = self.list(d)
956dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(
957dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            e[:],
958dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            [[0, 1, 2, 3, 4, 5, 6, 7, 8, 9], [0, 1, 2, 3, 4, 0, 1, 2, 3, 4]]
959dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            )
960dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
961dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        f = self.list([a])
962dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        a.append('hello')
963dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(f[:], [[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 'hello']])
964dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
965dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def test_dict(self):
966dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        d = self.dict()
967dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        indices = range(65, 70)
968dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        for i in indices:
969dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            d[i] = chr(i)
970dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(d.copy(), dict((i, chr(i)) for i in indices))
971dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(sorted(d.keys()), indices)
972dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(sorted(d.values()), [chr(i) for i in indices])
973dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(sorted(d.items()), [(i, chr(i)) for i in indices])
974dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
975dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def test_namespace(self):
976dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        n = self.Namespace()
977dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        n.name = 'Bob'
978dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        n.job = 'Builder'
979dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        n._hidden = 'hidden'
980dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual((n.name, n.job), ('Bob', 'Builder'))
981dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        del n.job
982dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(str(n), "Namespace(name='Bob')")
983dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertTrue(hasattr(n, 'name'))
984dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertTrue(not hasattr(n, 'job'))
985dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
986dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson#
987dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson#
988dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson#
989dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
990dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersondef sqr(x, wait=0.0):
991dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    time.sleep(wait)
992dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    return x*x
993dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonclass _TestPool(BaseTestCase):
994dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
995dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def test_apply(self):
996dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        papply = self.pool.apply
997dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(papply(sqr, (5,)), sqr(5))
998dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(papply(sqr, (), {'x':3}), sqr(x=3))
999dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1000dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def test_map(self):
1001dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        pmap = self.pool.map
1002dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(pmap(sqr, range(10)), map(sqr, range(10)))
1003dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(pmap(sqr, range(100), chunksize=20),
1004dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson                         map(sqr, range(100)))
1005dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
10067530e47948446f03a79ad7dec4cc129ad3388418Jesse Noller    def test_map_chunksize(self):
10077530e47948446f03a79ad7dec4cc129ad3388418Jesse Noller        try:
10087530e47948446f03a79ad7dec4cc129ad3388418Jesse Noller            self.pool.map_async(sqr, [], chunksize=1).get(timeout=TIMEOUT1)
10097530e47948446f03a79ad7dec4cc129ad3388418Jesse Noller        except multiprocessing.TimeoutError:
10107530e47948446f03a79ad7dec4cc129ad3388418Jesse Noller            self.fail("pool.map_async with chunksize stalled on null list")
10117530e47948446f03a79ad7dec4cc129ad3388418Jesse Noller
1012dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def test_async(self):
1013dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        res = self.pool.apply_async(sqr, (7, TIMEOUT1,))
1014dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        get = TimingWrapper(res.get)
1015dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(get(), 49)
1016dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertTimingAlmostEqual(get.elapsed, TIMEOUT1)
1017dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1018dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def test_async_timeout(self):
1019dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        res = self.pool.apply_async(sqr, (6, TIMEOUT2 + 0.2))
1020dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        get = TimingWrapper(res.get)
1021dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertRaises(multiprocessing.TimeoutError, get, timeout=TIMEOUT2)
1022dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertTimingAlmostEqual(get.elapsed, TIMEOUT2)
1023dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1024dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def test_imap(self):
1025dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        it = self.pool.imap(sqr, range(10))
1026dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(list(it), map(sqr, range(10)))
1027dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1028dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        it = self.pool.imap(sqr, range(10))
1029dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        for i in range(10):
1030dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            self.assertEqual(it.next(), i*i)
1031dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertRaises(StopIteration, it.next)
1032dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1033dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        it = self.pool.imap(sqr, range(1000), chunksize=100)
1034dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        for i in range(1000):
1035dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            self.assertEqual(it.next(), i*i)
1036dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertRaises(StopIteration, it.next)
1037dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1038dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def test_imap_unordered(self):
1039dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        it = self.pool.imap_unordered(sqr, range(1000))
1040dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(sorted(it), map(sqr, range(1000)))
1041dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1042dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        it = self.pool.imap_unordered(sqr, range(1000), chunksize=53)
1043dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(sorted(it), map(sqr, range(1000)))
1044dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1045dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def test_make_pool(self):
1046dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        p = multiprocessing.Pool(3)
1047dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(3, len(p._pool))
1048dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        p.close()
1049dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        p.join()
1050dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1051dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def test_terminate(self):
1052dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        if self.TYPE == 'manager':
1053dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            # On Unix a forked process increfs each shared object to
1054dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            # which its parent process held a reference.  If the
1055dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            # forked process gets terminated then there is likely to
1056dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            # be a reference leak.  So to prevent
1057dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            # _TestZZZNumberOfObjects from failing we skip this test
1058dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            # when using a manager.
1059dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            return
1060dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1061dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        result = self.pool.map_async(
1062dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            time.sleep, [0.1 for i in range(10000)], chunksize=1
1063dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            )
1064dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.pool.terminate()
1065dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        join = TimingWrapper(self.pool.join)
1066dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        join()
1067dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertTrue(join.elapsed < 0.2)
1068654ade3e6afa2527d1f642be28d69e219bd58b71Jesse Noller
1069654ade3e6afa2527d1f642be28d69e219bd58b71Jesse Nollerclass _TestPoolWorkerLifetime(BaseTestCase):
1070654ade3e6afa2527d1f642be28d69e219bd58b71Jesse Noller
1071654ade3e6afa2527d1f642be28d69e219bd58b71Jesse Noller    ALLOWED_TYPES = ('processes', )
1072654ade3e6afa2527d1f642be28d69e219bd58b71Jesse Noller    def test_pool_worker_lifetime(self):
1073654ade3e6afa2527d1f642be28d69e219bd58b71Jesse Noller        p = multiprocessing.Pool(3, maxtasksperchild=10)
1074654ade3e6afa2527d1f642be28d69e219bd58b71Jesse Noller        self.assertEqual(3, len(p._pool))
1075654ade3e6afa2527d1f642be28d69e219bd58b71Jesse Noller        origworkerpids = [w.pid for w in p._pool]
1076654ade3e6afa2527d1f642be28d69e219bd58b71Jesse Noller        # Run many tasks so each worker gets replaced (hopefully)
1077654ade3e6afa2527d1f642be28d69e219bd58b71Jesse Noller        results = []
1078654ade3e6afa2527d1f642be28d69e219bd58b71Jesse Noller        for i in range(100):
1079654ade3e6afa2527d1f642be28d69e219bd58b71Jesse Noller            results.append(p.apply_async(sqr, (i, )))
1080654ade3e6afa2527d1f642be28d69e219bd58b71Jesse Noller        # Fetch the results and verify we got the right answers,
1081654ade3e6afa2527d1f642be28d69e219bd58b71Jesse Noller        # also ensuring all the tasks have completed.
1082654ade3e6afa2527d1f642be28d69e219bd58b71Jesse Noller        for (j, res) in enumerate(results):
1083654ade3e6afa2527d1f642be28d69e219bd58b71Jesse Noller            self.assertEqual(res.get(), sqr(j))
1084654ade3e6afa2527d1f642be28d69e219bd58b71Jesse Noller        # Refill the pool
1085654ade3e6afa2527d1f642be28d69e219bd58b71Jesse Noller        p._repopulate_pool()
10863bc5cb7e0db13ba3885c8ed3d51ea792738499b2Florent Xicluna        # Wait until all workers are alive
10873bc5cb7e0db13ba3885c8ed3d51ea792738499b2Florent Xicluna        countdown = 5
10883bc5cb7e0db13ba3885c8ed3d51ea792738499b2Florent Xicluna        while countdown and not all(w.is_alive() for w in p._pool):
10893bc5cb7e0db13ba3885c8ed3d51ea792738499b2Florent Xicluna            countdown -= 1
10903bc5cb7e0db13ba3885c8ed3d51ea792738499b2Florent Xicluna            time.sleep(DELTA)
1091654ade3e6afa2527d1f642be28d69e219bd58b71Jesse Noller        finalworkerpids = [w.pid for w in p._pool]
10923bc5cb7e0db13ba3885c8ed3d51ea792738499b2Florent Xicluna        # All pids should be assigned.  See issue #7805.
10933bc5cb7e0db13ba3885c8ed3d51ea792738499b2Florent Xicluna        self.assertNotIn(None, origworkerpids)
10943bc5cb7e0db13ba3885c8ed3d51ea792738499b2Florent Xicluna        self.assertNotIn(None, finalworkerpids)
10953bc5cb7e0db13ba3885c8ed3d51ea792738499b2Florent Xicluna        # Finally, check that the worker pids have changed
1096654ade3e6afa2527d1f642be28d69e219bd58b71Jesse Noller        self.assertNotEqual(sorted(origworkerpids), sorted(finalworkerpids))
1097654ade3e6afa2527d1f642be28d69e219bd58b71Jesse Noller        p.close()
1098654ade3e6afa2527d1f642be28d69e219bd58b71Jesse Noller        p.join()
1099654ade3e6afa2527d1f642be28d69e219bd58b71Jesse Noller
1100dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson#
1101dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# Test that manager has expected number of shared objects left
1102dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson#
1103dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1104dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonclass _TestZZZNumberOfObjects(BaseTestCase):
1105dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    # Because test cases are sorted alphabetically, this one will get
1106dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    # run after all the other tests for the manager.  It tests that
1107dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    # there have been no "reference leaks" for the manager's shared
1108dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    # objects.  Note the comment in _TestPool.test_terminate().
1109dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    ALLOWED_TYPES = ('manager',)
1110dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1111dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def test_number_of_objects(self):
1112dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        EXPECTED_NUMBER = 1                # the pool object is still alive
1113dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        multiprocessing.active_children()  # discard dead process objs
1114dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        gc.collect()                       # do garbage collection
1115dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        refs = self.manager._number_of_objects()
11167314b38168da53863136d1937059fc0ac4883a56Jesse Noller        debug_info = self.manager._debug_info()
1117dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        if refs != EXPECTED_NUMBER:
11187fb9640d57f5d96dcaa0d0e6497abc21fa85f37eJesse Noller            print self.manager._debug_info()
11197314b38168da53863136d1937059fc0ac4883a56Jesse Noller            print debug_info
1120dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1121dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(refs, EXPECTED_NUMBER)
1122dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1123dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson#
1124dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# Test of creating a customized manager class
1125dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson#
1126dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1127dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonfrom multiprocessing.managers import BaseManager, BaseProxy, RemoteError
1128dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1129dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonclass FooBar(object):
1130dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def f(self):
1131dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        return 'f()'
1132dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def g(self):
1133dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        raise ValueError
1134dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def _h(self):
1135dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        return '_h()'
1136dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1137dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersondef baz():
1138dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    for i in xrange(10):
1139dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        yield i*i
1140dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1141dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonclass IteratorProxy(BaseProxy):
1142dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    _exposed_ = ('next', '__next__')
1143dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def __iter__(self):
1144dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        return self
1145dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def next(self):
1146dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        return self._callmethod('next')
1147dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def __next__(self):
1148dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        return self._callmethod('__next__')
1149dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1150dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonclass MyManager(BaseManager):
1151dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    pass
1152dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1153dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin PetersonMyManager.register('Foo', callable=FooBar)
1154dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin PetersonMyManager.register('Bar', callable=FooBar, exposed=('f', '_h'))
1155dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin PetersonMyManager.register('baz', callable=baz, proxytype=IteratorProxy)
1156dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1157dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1158dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonclass _TestMyManager(BaseTestCase):
1159dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1160dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    ALLOWED_TYPES = ('manager',)
1161dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1162dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def test_mymanager(self):
1163dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        manager = MyManager()
1164dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        manager.start()
1165dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1166dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        foo = manager.Foo()
1167dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        bar = manager.Bar()
1168dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        baz = manager.baz()
1169dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1170dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        foo_methods = [name for name in ('f', 'g', '_h') if hasattr(foo, name)]
1171dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        bar_methods = [name for name in ('f', 'g', '_h') if hasattr(bar, name)]
1172dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1173dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(foo_methods, ['f', 'g'])
1174dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(bar_methods, ['f', '_h'])
1175dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1176dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(foo.f(), 'f()')
1177dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertRaises(ValueError, foo.g)
1178dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(foo._callmethod('f'), 'f()')
1179dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertRaises(RemoteError, foo._callmethod, '_h')
1180dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1181dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(bar.f(), 'f()')
1182dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(bar._h(), '_h()')
1183dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(bar._callmethod('f'), 'f()')
1184dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(bar._callmethod('_h'), '_h()')
1185dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1186dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(list(baz), [i*i for i in range(10)])
1187dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1188dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        manager.shutdown()
1189dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1190dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson#
1191dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# Test of connecting to a remote server and using xmlrpclib for serialization
1192dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson#
1193dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1194dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson_queue = Queue.Queue()
1195dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersondef get_queue():
1196dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    return _queue
1197dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1198dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonclass QueueManager(BaseManager):
1199dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    '''manager class used by server process'''
1200dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin PetersonQueueManager.register('get_queue', callable=get_queue)
1201dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1202dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonclass QueueManager2(BaseManager):
1203dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    '''manager class which specifies the same interface as QueueManager'''
1204dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin PetersonQueueManager2.register('get_queue')
1205dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1206dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1207dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin PetersonSERIALIZER = 'xmlrpclib'
1208dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1209dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonclass _TestRemoteManager(BaseTestCase):
1210dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1211dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    ALLOWED_TYPES = ('manager',)
1212dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1213dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def _putter(self, address, authkey):
1214dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        manager = QueueManager2(
1215dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            address=address, authkey=authkey, serializer=SERIALIZER
1216dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            )
1217dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        manager.connect()
1218dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        queue = manager.get_queue()
1219dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        queue.put(('hello world', None, True, 2.25))
1220dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1221dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def test_remote(self):
1222dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        authkey = os.urandom(32)
1223dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1224dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        manager = QueueManager(
1225dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            address=('localhost', 0), authkey=authkey, serializer=SERIALIZER
1226dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            )
1227dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        manager.start()
1228dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1229dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        p = self.Process(target=self._putter, args=(manager.address, authkey))
1230dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        p.start()
1231dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1232dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        manager2 = QueueManager2(
1233dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            address=manager.address, authkey=authkey, serializer=SERIALIZER
1234dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            )
1235dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        manager2.connect()
1236dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        queue = manager2.get_queue()
1237dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1238dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        # Note that xmlrpclib will deserialize object as a list not a tuple
1239dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(queue.get(), ['hello world', None, True, 2.25])
1240dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1241dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        # Because we are using xmlrpclib for serialization instead of
1242dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        # pickle this will cause a serialization error.
1243dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertRaises(Exception, queue.put, time.sleep)
1244dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1245dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        # Make queue finalizer run before the server is stopped
1246dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        del queue
1247dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        manager.shutdown()
1248dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1249459a6481662c62d6cb57a070d21230db3e721c56Jesse Nollerclass _TestManagerRestart(BaseTestCase):
1250459a6481662c62d6cb57a070d21230db3e721c56Jesse Noller
1251459a6481662c62d6cb57a070d21230db3e721c56Jesse Noller    def _putter(self, address, authkey):
1252459a6481662c62d6cb57a070d21230db3e721c56Jesse Noller        manager = QueueManager(
1253459a6481662c62d6cb57a070d21230db3e721c56Jesse Noller            address=address, authkey=authkey, serializer=SERIALIZER)
1254459a6481662c62d6cb57a070d21230db3e721c56Jesse Noller        manager.connect()
1255459a6481662c62d6cb57a070d21230db3e721c56Jesse Noller        queue = manager.get_queue()
1256459a6481662c62d6cb57a070d21230db3e721c56Jesse Noller        queue.put('hello world')
1257459a6481662c62d6cb57a070d21230db3e721c56Jesse Noller
1258459a6481662c62d6cb57a070d21230db3e721c56Jesse Noller    def test_rapid_restart(self):
1259459a6481662c62d6cb57a070d21230db3e721c56Jesse Noller        authkey = os.urandom(32)
1260459a6481662c62d6cb57a070d21230db3e721c56Jesse Noller        manager = QueueManager(
126154f9f83e5cd417267b29a38f3364716523e69b28Antoine Pitrou            address=('localhost', 0), authkey=authkey, serializer=SERIALIZER)
126254f9f83e5cd417267b29a38f3364716523e69b28Antoine Pitrou        addr = manager.get_server().address
1263459a6481662c62d6cb57a070d21230db3e721c56Jesse Noller        manager.start()
1264459a6481662c62d6cb57a070d21230db3e721c56Jesse Noller
1265459a6481662c62d6cb57a070d21230db3e721c56Jesse Noller        p = self.Process(target=self._putter, args=(manager.address, authkey))
1266459a6481662c62d6cb57a070d21230db3e721c56Jesse Noller        p.start()
1267459a6481662c62d6cb57a070d21230db3e721c56Jesse Noller        queue = manager.get_queue()
1268459a6481662c62d6cb57a070d21230db3e721c56Jesse Noller        self.assertEqual(queue.get(), 'hello world')
1269019ce773cd25ee08d1a822f06958774b43881d00Jesse Noller        del queue
1270459a6481662c62d6cb57a070d21230db3e721c56Jesse Noller        manager.shutdown()
1271459a6481662c62d6cb57a070d21230db3e721c56Jesse Noller        manager = QueueManager(
127254f9f83e5cd417267b29a38f3364716523e69b28Antoine Pitrou            address=addr, authkey=authkey, serializer=SERIALIZER)
1273459a6481662c62d6cb57a070d21230db3e721c56Jesse Noller        manager.start()
1274019ce773cd25ee08d1a822f06958774b43881d00Jesse Noller        manager.shutdown()
1275459a6481662c62d6cb57a070d21230db3e721c56Jesse Noller
1276dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson#
1277dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson#
1278dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson#
1279dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1280dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin PetersonSENTINEL = latin('')
1281dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1282dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonclass _TestConnection(BaseTestCase):
1283dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1284dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    ALLOWED_TYPES = ('processes', 'threads')
1285dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1286dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def _echo(self, conn):
1287dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        for msg in iter(conn.recv_bytes, SENTINEL):
1288dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            conn.send_bytes(msg)
1289dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        conn.close()
1290dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1291dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def test_connection(self):
1292dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        conn, child_conn = self.Pipe()
1293dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1294dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        p = self.Process(target=self._echo, args=(child_conn,))
12955bc9f4c09c99eb701dbee83fb9e26eed558e474fJesse Noller        p.daemon = True
1296dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        p.start()
1297dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1298dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        seq = [1, 2.25, None]
1299dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        msg = latin('hello world')
1300dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        longmsg = msg * 10
1301dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        arr = array.array('i', range(4))
1302dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1303dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        if self.TYPE == 'processes':
1304dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            self.assertEqual(type(conn.fileno()), int)
1305dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1306dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(conn.send(seq), None)
1307dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(conn.recv(), seq)
1308dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1309dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(conn.send_bytes(msg), None)
1310dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(conn.recv_bytes(), msg)
1311dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1312dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        if self.TYPE == 'processes':
1313dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            buffer = array.array('i', [0]*10)
1314dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            expected = list(arr) + [0] * (10 - len(arr))
1315dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            self.assertEqual(conn.send_bytes(arr), None)
1316dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            self.assertEqual(conn.recv_bytes_into(buffer),
1317dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson                             len(arr) * buffer.itemsize)
1318dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            self.assertEqual(list(buffer), expected)
1319dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1320dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            buffer = array.array('i', [0]*10)
1321dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            expected = [0] * 3 + list(arr) + [0] * (10 - 3 - len(arr))
1322dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            self.assertEqual(conn.send_bytes(arr), None)
1323dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            self.assertEqual(conn.recv_bytes_into(buffer, 3 * buffer.itemsize),
1324dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson                             len(arr) * buffer.itemsize)
1325dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            self.assertEqual(list(buffer), expected)
1326dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1327dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            buffer = bytearray(latin(' ' * 40))
1328dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            self.assertEqual(conn.send_bytes(longmsg), None)
1329dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            try:
1330dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson                res = conn.recv_bytes_into(buffer)
1331dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            except multiprocessing.BufferTooShort, e:
1332dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson                self.assertEqual(e.args, (longmsg,))
1333dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            else:
1334dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson                self.fail('expected BufferTooShort, got %s' % res)
1335dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1336dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        poll = TimingWrapper(conn.poll)
1337dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1338dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(poll(), False)
1339dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertTimingAlmostEqual(poll.elapsed, 0)
1340dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1341dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(poll(TIMEOUT1), False)
1342dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertTimingAlmostEqual(poll.elapsed, TIMEOUT1)
1343dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1344dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        conn.send(None)
1345dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1346dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(poll(TIMEOUT1), True)
1347dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertTimingAlmostEqual(poll.elapsed, 0)
1348dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1349dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(conn.recv(), None)
1350dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1351dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        really_big_msg = latin('X') * (1024 * 1024 * 16)   # 16Mb
1352dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        conn.send_bytes(really_big_msg)
1353dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(conn.recv_bytes(), really_big_msg)
1354dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1355dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        conn.send_bytes(SENTINEL)                          # tell child to quit
1356dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        child_conn.close()
1357dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1358dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        if self.TYPE == 'processes':
1359dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            self.assertEqual(conn.readable, True)
1360dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            self.assertEqual(conn.writable, True)
1361dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            self.assertRaises(EOFError, conn.recv)
1362dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            self.assertRaises(EOFError, conn.recv_bytes)
1363dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1364dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        p.join()
1365dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1366dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def test_duplex_false(self):
1367dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        reader, writer = self.Pipe(duplex=False)
1368dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(writer.send(1), None)
1369dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(reader.recv(), 1)
1370dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        if self.TYPE == 'processes':
1371dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            self.assertEqual(reader.readable, True)
1372dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            self.assertEqual(reader.writable, False)
1373dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            self.assertEqual(writer.readable, False)
1374dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            self.assertEqual(writer.writable, True)
1375dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            self.assertRaises(IOError, reader.send, 2)
1376dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            self.assertRaises(IOError, writer.recv)
1377dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            self.assertRaises(IOError, writer.poll)
1378dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1379dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def test_spawn_close(self):
1380dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        # We test that a pipe connection can be closed by parent
1381dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        # process immediately after child is spawned.  On Windows this
1382dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        # would have sometimes failed on old versions because
1383dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        # child_conn would be closed before the child got a chance to
1384dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        # duplicate it.
1385dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        conn, child_conn = self.Pipe()
1386dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1387dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        p = self.Process(target=self._echo, args=(child_conn,))
1388dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        p.start()
1389dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        child_conn.close()    # this might complete before child initializes
1390dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1391dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        msg = latin('hello')
1392dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        conn.send_bytes(msg)
1393dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(conn.recv_bytes(), msg)
1394dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1395dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        conn.send_bytes(SENTINEL)
1396dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        conn.close()
1397dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        p.join()
1398dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1399dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def test_sendbytes(self):
1400dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        if self.TYPE != 'processes':
1401dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            return
1402dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1403dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        msg = latin('abcdefghijklmnopqrstuvwxyz')
1404dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        a, b = self.Pipe()
1405dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1406dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        a.send_bytes(msg)
1407dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(b.recv_bytes(), msg)
1408dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1409dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        a.send_bytes(msg, 5)
1410dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(b.recv_bytes(), msg[5:])
1411dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1412dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        a.send_bytes(msg, 7, 8)
1413dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(b.recv_bytes(), msg[7:7+8])
1414dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1415dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        a.send_bytes(msg, 26)
1416dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(b.recv_bytes(), latin(''))
1417dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1418dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        a.send_bytes(msg, 26, 0)
1419dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(b.recv_bytes(), latin(''))
1420dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1421dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertRaises(ValueError, a.send_bytes, msg, 27)
1422dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1423dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertRaises(ValueError, a.send_bytes, msg, 22, 5)
1424dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1425dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertRaises(ValueError, a.send_bytes, msg, 26, 1)
1426dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1427dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertRaises(ValueError, a.send_bytes, msg, -1)
1428dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1429dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertRaises(ValueError, a.send_bytes, msg, 4, -1)
1430dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1431dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonclass _TestListenerClient(BaseTestCase):
1432dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1433dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    ALLOWED_TYPES = ('processes', 'threads')
1434dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1435dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def _test(self, address):
1436dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        conn = self.connection.Client(address)
1437dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        conn.send('hello')
1438dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        conn.close()
1439dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1440dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def test_listener_client(self):
1441dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        for family in self.connection.families:
1442dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            l = self.connection.Listener(family=family)
1443dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            p = self.Process(target=self._test, args=(l.address,))
14445bc9f4c09c99eb701dbee83fb9e26eed558e474fJesse Noller            p.daemon = True
1445dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            p.start()
1446dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            conn = l.accept()
1447dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            self.assertEqual(conn.recv(), 'hello')
1448dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            p.join()
1449dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            l.close()
1450dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson#
1451dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# Test of sending connection and socket objects between processes
1452dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson#
1453da3a1b120055855a464c2d5f5143021ae8f5dc86Benjamin Peterson"""
1454dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonclass _TestPicklingConnections(BaseTestCase):
1455dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1456dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    ALLOWED_TYPES = ('processes',)
1457dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1458dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def _listener(self, conn, families):
1459dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        for fam in families:
1460dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            l = self.connection.Listener(family=fam)
1461dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            conn.send(l.address)
1462dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            new_conn = l.accept()
1463dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            conn.send(new_conn)
1464dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1465dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        if self.TYPE == 'processes':
1466dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            l = socket.socket()
1467dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            l.bind(('localhost', 0))
1468dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            conn.send(l.getsockname())
1469dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            l.listen(1)
1470dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            new_conn, addr = l.accept()
1471dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            conn.send(new_conn)
1472dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1473dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        conn.recv()
1474dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1475dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def _remote(self, conn):
1476dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        for (address, msg) in iter(conn.recv, None):
1477dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            client = self.connection.Client(address)
1478dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            client.send(msg.upper())
1479dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            client.close()
1480dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1481dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        if self.TYPE == 'processes':
1482dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            address, msg = conn.recv()
1483dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            client = socket.socket()
1484dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            client.connect(address)
1485dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            client.sendall(msg.upper())
1486dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            client.close()
1487dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1488dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        conn.close()
1489dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1490dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def test_pickling(self):
1491dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        try:
1492dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            multiprocessing.allow_connection_pickling()
1493dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        except ImportError:
1494dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            return
1495dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1496dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        families = self.connection.families
1497dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1498dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        lconn, lconn0 = self.Pipe()
1499dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        lp = self.Process(target=self._listener, args=(lconn0, families))
1500dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        lp.start()
1501dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        lconn0.close()
1502dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1503dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        rconn, rconn0 = self.Pipe()
1504dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        rp = self.Process(target=self._remote, args=(rconn0,))
1505dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        rp.start()
1506dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        rconn0.close()
1507dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1508dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        for fam in families:
1509dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            msg = ('This connection uses family %s' % fam).encode('ascii')
1510dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            address = lconn.recv()
1511dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            rconn.send((address, msg))
1512dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            new_conn = lconn.recv()
1513dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            self.assertEqual(new_conn.recv(), msg.upper())
1514dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1515dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        rconn.send(None)
1516dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1517dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        if self.TYPE == 'processes':
1518dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            msg = latin('This connection uses a normal socket')
1519dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            address = lconn.recv()
1520dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            rconn.send((address, msg))
1521dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            if hasattr(socket, 'fromfd'):
1522dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson                new_conn = lconn.recv()
1523dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson                self.assertEqual(new_conn.recv(100), msg.upper())
1524dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            else:
1525dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson                # XXX On Windows with Py2.6 need to backport fromfd()
1526dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson                discard = lconn.recv_bytes()
1527dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1528dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        lconn.send(None)
1529dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1530dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        rconn.close()
1531dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        lconn.close()
1532dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1533dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        lp.join()
1534dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        rp.join()
1535da3a1b120055855a464c2d5f5143021ae8f5dc86Benjamin Peterson"""
1536dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson#
1537dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson#
1538dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson#
1539dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1540dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonclass _TestHeap(BaseTestCase):
1541dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1542dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    ALLOWED_TYPES = ('processes',)
1543dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1544dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def test_heap(self):
1545dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        iterations = 5000
1546dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        maxblocks = 50
1547dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        blocks = []
1548dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1549dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        # create and destroy lots of blocks of different sizes
1550dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        for i in xrange(iterations):
1551dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            size = int(random.lognormvariate(0, 1) * 1000)
1552dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            b = multiprocessing.heap.BufferWrapper(size)
1553dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            blocks.append(b)
1554dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            if len(blocks) > maxblocks:
1555dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson                i = random.randrange(maxblocks)
1556dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson                del blocks[i]
1557dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1558dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        # get the heap object
1559dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        heap = multiprocessing.heap.BufferWrapper._heap
1560dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1561dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        # verify the state of the heap
1562dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        all = []
1563dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        occupied = 0
1564dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        for L in heap._len_to_seq.values():
1565dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            for arena, start, stop in L:
1566dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson                all.append((heap._arenas.index(arena), start, stop,
1567dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson                            stop-start, 'free'))
1568dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        for arena, start, stop in heap._allocated_blocks:
1569dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            all.append((heap._arenas.index(arena), start, stop,
1570dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson                        stop-start, 'occupied'))
1571dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            occupied += (stop-start)
1572dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1573dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        all.sort()
1574dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1575dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        for i in range(len(all)-1):
1576dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            (arena, start, stop) = all[i][:3]
1577dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            (narena, nstart, nstop) = all[i+1][:3]
1578dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            self.assertTrue((arena != narena and nstart == 0) or
1579dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson                            (stop == nstart))
1580dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1581dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson#
1582dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson#
1583dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson#
1584dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1585dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonclass _Foo(Structure):
1586dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    _fields_ = [
1587dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        ('x', c_int),
1588dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        ('y', c_double)
1589dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        ]
1590dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1591a06e9b8f6b2edf4936146fa8867f12222106d0f8Brian Curtin@unittest.skipUnless(HAS_SHAREDCTYPES,
1592a06e9b8f6b2edf4936146fa8867f12222106d0f8Brian Curtin                     "requires multiprocessing.sharedctypes")
1593dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonclass _TestSharedCTypes(BaseTestCase):
1594dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1595dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    ALLOWED_TYPES = ('processes',)
1596dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1597dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def _double(self, x, y, foo, arr, string):
1598dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        x.value *= 2
1599dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        y.value *= 2
1600dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        foo.x *= 2
1601dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        foo.y *= 2
1602dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        string.value *= 2
1603dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        for i in range(len(arr)):
1604dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            arr[i] *= 2
1605dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1606dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def test_sharedctypes(self, lock=False):
1607dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        x = Value('i', 7, lock=lock)
1608bd564c3c21ef4c6d6cb0070870edd9d2f7c89d11Georg Brandl        y = Value(c_double, 1.0/3.0, lock=lock)
1609dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        foo = Value(_Foo, 3, 2, lock=lock)
1610bd564c3c21ef4c6d6cb0070870edd9d2f7c89d11Georg Brandl        arr = self.Array('d', range(10), lock=lock)
1611bd564c3c21ef4c6d6cb0070870edd9d2f7c89d11Georg Brandl        string = self.Array('c', 20, lock=lock)
1612a06e9b8f6b2edf4936146fa8867f12222106d0f8Brian Curtin        string.value = latin('hello')
1613dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1614dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        p = self.Process(target=self._double, args=(x, y, foo, arr, string))
1615dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        p.start()
1616dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        p.join()
1617dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1618dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(x.value, 14)
1619dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertAlmostEqual(y.value, 2.0/3.0)
1620dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(foo.x, 6)
1621dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertAlmostEqual(foo.y, 4.0)
1622dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        for i in range(10):
1623dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            self.assertAlmostEqual(arr[i], i*2)
1624dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(string.value, latin('hellohello'))
1625dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1626dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def test_synchronize(self):
1627dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.test_sharedctypes(lock=True)
1628dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1629dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def test_copy(self):
1630dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        foo = _Foo(2, 5.0)
1631a06e9b8f6b2edf4936146fa8867f12222106d0f8Brian Curtin        bar = copy(foo)
1632dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        foo.x = 0
1633dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        foo.y = 0
1634dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(bar.x, 2)
1635dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertAlmostEqual(bar.y, 5.0)
1636dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1637dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson#
1638dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson#
1639dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson#
1640dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1641dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonclass _TestFinalize(BaseTestCase):
1642dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1643dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    ALLOWED_TYPES = ('processes',)
1644dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1645dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def _test_finalize(self, conn):
1646dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        class Foo(object):
1647dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            pass
1648dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1649dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        a = Foo()
1650dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        util.Finalize(a, conn.send, args=('a',))
1651dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        del a           # triggers callback for a
1652dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1653dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        b = Foo()
1654dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        close_b = util.Finalize(b, conn.send, args=('b',))
1655dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        close_b()       # triggers callback for b
1656dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        close_b()       # does nothing because callback has already been called
1657dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        del b           # does nothing because callback has already been called
1658dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1659dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        c = Foo()
1660dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        util.Finalize(c, conn.send, args=('c',))
1661dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1662dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        d10 = Foo()
1663dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        util.Finalize(d10, conn.send, args=('d10',), exitpriority=1)
1664dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1665dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        d01 = Foo()
1666dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        util.Finalize(d01, conn.send, args=('d01',), exitpriority=0)
1667dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        d02 = Foo()
1668dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        util.Finalize(d02, conn.send, args=('d02',), exitpriority=0)
1669dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        d03 = Foo()
1670dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        util.Finalize(d03, conn.send, args=('d03',), exitpriority=0)
1671dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1672dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        util.Finalize(None, conn.send, args=('e',), exitpriority=-10)
1673dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1674dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        util.Finalize(None, conn.send, args=('STOP',), exitpriority=-100)
1675dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1676dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        # call mutliprocessing's cleanup function then exit process without
1677dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        # garbage collecting locals
1678dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        util._exit_function()
1679dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        conn.close()
1680dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        os._exit(0)
1681dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1682dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def test_finalize(self):
1683dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        conn, child_conn = self.Pipe()
1684dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1685dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        p = self.Process(target=self._test_finalize, args=(child_conn,))
1686dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        p.start()
1687dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        p.join()
1688dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1689dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        result = [obj for obj in iter(conn.recv, 'STOP')]
1690dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(result, ['a', 'b', 'd10', 'd03', 'd02', 'd01', 'e'])
1691dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1692dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson#
1693dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# Test that from ... import * works for each module
1694dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson#
1695dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1696dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonclass _TestImportStar(BaseTestCase):
1697dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1698dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    ALLOWED_TYPES = ('processes',)
1699dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1700dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def test_import(self):
170136b9fbb803659350f9e6182b85f5bf66ca2a72a8Florent Xicluna        modules = [
1702dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            'multiprocessing', 'multiprocessing.connection',
1703dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            'multiprocessing.heap', 'multiprocessing.managers',
1704dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            'multiprocessing.pool', 'multiprocessing.process',
170536b9fbb803659350f9e6182b85f5bf66ca2a72a8Florent Xicluna            'multiprocessing.reduction',
1706dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            'multiprocessing.synchronize', 'multiprocessing.util'
170736b9fbb803659350f9e6182b85f5bf66ca2a72a8Florent Xicluna            ]
170836b9fbb803659350f9e6182b85f5bf66ca2a72a8Florent Xicluna
170936b9fbb803659350f9e6182b85f5bf66ca2a72a8Florent Xicluna        if c_int is not None:
171036b9fbb803659350f9e6182b85f5bf66ca2a72a8Florent Xicluna            # This module requires _ctypes
171136b9fbb803659350f9e6182b85f5bf66ca2a72a8Florent Xicluna            modules.append('multiprocessing.sharedctypes')
1712dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1713dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        for name in modules:
1714dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            __import__(name)
1715dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            mod = sys.modules[name]
1716dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1717dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            for attr in getattr(mod, '__all__', ()):
1718dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson                self.assertTrue(
1719dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson                    hasattr(mod, attr),
1720dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson                    '%r does not have attribute %r' % (mod, attr)
1721dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson                    )
1722dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1723dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson#
1724dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# Quick test that logging works -- does not test logging output
1725dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson#
1726dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1727dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonclass _TestLogging(BaseTestCase):
1728dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1729dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    ALLOWED_TYPES = ('processes',)
1730dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1731dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def test_enable_logging(self):
1732dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        logger = multiprocessing.get_logger()
1733dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        logger.setLevel(util.SUBWARNING)
1734dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertTrue(logger is not None)
1735dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        logger.debug('this will not be printed')
1736dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        logger.info('nor will this')
1737dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        logger.setLevel(LOG_LEVEL)
1738dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1739dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def _test_level(self, conn):
1740dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        logger = multiprocessing.get_logger()
1741dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        conn.send(logger.getEffectiveLevel())
1742dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1743dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def test_level(self):
1744dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        LEVEL1 = 32
1745dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        LEVEL2 = 37
1746dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1747dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        logger = multiprocessing.get_logger()
1748dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        root_logger = logging.getLogger()
1749dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        root_level = root_logger.level
1750dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1751dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        reader, writer = multiprocessing.Pipe(duplex=False)
1752dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1753dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        logger.setLevel(LEVEL1)
1754dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.Process(target=self._test_level, args=(writer,)).start()
1755dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(LEVEL1, reader.recv())
1756dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1757dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        logger.setLevel(logging.NOTSET)
1758dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        root_logger.setLevel(LEVEL2)
1759dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.Process(target=self._test_level, args=(writer,)).start()
1760dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(LEVEL2, reader.recv())
1761dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1762dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        root_logger.setLevel(root_level)
1763dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        logger.setLevel(level=LOG_LEVEL)
1764dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1765814d02dcd1b30a98f9a34c710be35de6db82aa40Jesse Noller
17669a03f2fd03278d2c12dfe253de1bbed7c0c9c506Jesse Noller# class _TestLoggingProcessName(BaseTestCase):
17679a03f2fd03278d2c12dfe253de1bbed7c0c9c506Jesse Noller#
17689a03f2fd03278d2c12dfe253de1bbed7c0c9c506Jesse Noller#     def handle(self, record):
17699a03f2fd03278d2c12dfe253de1bbed7c0c9c506Jesse Noller#         assert record.processName == multiprocessing.current_process().name
17709a03f2fd03278d2c12dfe253de1bbed7c0c9c506Jesse Noller#         self.__handled = True
17719a03f2fd03278d2c12dfe253de1bbed7c0c9c506Jesse Noller#
17729a03f2fd03278d2c12dfe253de1bbed7c0c9c506Jesse Noller#     def test_logging(self):
17739a03f2fd03278d2c12dfe253de1bbed7c0c9c506Jesse Noller#         handler = logging.Handler()
17749a03f2fd03278d2c12dfe253de1bbed7c0c9c506Jesse Noller#         handler.handle = self.handle
17759a03f2fd03278d2c12dfe253de1bbed7c0c9c506Jesse Noller#         self.__handled = False
17769a03f2fd03278d2c12dfe253de1bbed7c0c9c506Jesse Noller#         # Bypass getLogger() and side-effects
17779a03f2fd03278d2c12dfe253de1bbed7c0c9c506Jesse Noller#         logger = logging.getLoggerClass()(
17789a03f2fd03278d2c12dfe253de1bbed7c0c9c506Jesse Noller#                 'multiprocessing.test.TestLoggingProcessName')
17799a03f2fd03278d2c12dfe253de1bbed7c0c9c506Jesse Noller#         logger.addHandler(handler)
17809a03f2fd03278d2c12dfe253de1bbed7c0c9c506Jesse Noller#         logger.propagate = False
17819a03f2fd03278d2c12dfe253de1bbed7c0c9c506Jesse Noller#
17829a03f2fd03278d2c12dfe253de1bbed7c0c9c506Jesse Noller#         logger.warn('foo')
17839a03f2fd03278d2c12dfe253de1bbed7c0c9c506Jesse Noller#         assert self.__handled
1784814d02dcd1b30a98f9a34c710be35de6db82aa40Jesse Noller
1785dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson#
17869a5b2ad38d605206f05a52fe32868d3f839e8a86Jesse Noller# Test to verify handle verification, see issue 3321
17879a5b2ad38d605206f05a52fe32868d3f839e8a86Jesse Noller#
17889a5b2ad38d605206f05a52fe32868d3f839e8a86Jesse Noller
17899a5b2ad38d605206f05a52fe32868d3f839e8a86Jesse Nollerclass TestInvalidHandle(unittest.TestCase):
17909a5b2ad38d605206f05a52fe32868d3f839e8a86Jesse Noller
179136b9fbb803659350f9e6182b85f5bf66ca2a72a8Florent Xicluna    @unittest.skipIf(WIN32, "skipped on Windows")
17929a5b2ad38d605206f05a52fe32868d3f839e8a86Jesse Noller    def test_invalid_handles(self):
17939a5b2ad38d605206f05a52fe32868d3f839e8a86Jesse Noller        conn = _multiprocessing.Connection(44977608)
17949a5b2ad38d605206f05a52fe32868d3f839e8a86Jesse Noller        self.assertRaises(IOError, conn.poll)
17959a5b2ad38d605206f05a52fe32868d3f839e8a86Jesse Noller        self.assertRaises(IOError, _multiprocessing.Connection, -1)
179636b9fbb803659350f9e6182b85f5bf66ca2a72a8Florent Xicluna
17979a5b2ad38d605206f05a52fe32868d3f839e8a86Jesse Noller#
1798dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# Functions used to create test cases from the base ones in this module
1799dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson#
1800dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1801dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersondef get_attributes(Source, names):
1802dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    d = {}
1803dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    for name in names:
1804dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        obj = getattr(Source, name)
1805dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        if type(obj) == type(get_attributes):
1806dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            obj = staticmethod(obj)
1807dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        d[name] = obj
1808dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    return d
1809dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1810dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersondef create_test_cases(Mixin, type):
1811dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    result = {}
1812dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    glob = globals()
181336b9fbb803659350f9e6182b85f5bf66ca2a72a8Florent Xicluna    Type = type.capitalize()
1814dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1815dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    for name in glob.keys():
1816dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        if name.startswith('_Test'):
1817dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            base = glob[name]
1818dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            if type in base.ALLOWED_TYPES:
1819dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson                newname = 'With' + Type + name[1:]
1820dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson                class Temp(base, unittest.TestCase, Mixin):
1821dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson                    pass
1822dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson                result[newname] = Temp
1823dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson                Temp.__name__ = newname
1824dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson                Temp.__module__ = Mixin.__module__
1825dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    return result
1826dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1827dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson#
1828dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# Create test cases
1829dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson#
1830dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1831dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonclass ProcessesMixin(object):
1832dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    TYPE = 'processes'
1833dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    Process = multiprocessing.Process
1834dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    locals().update(get_attributes(multiprocessing, (
1835dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        'Queue', 'Lock', 'RLock', 'Semaphore', 'BoundedSemaphore',
1836dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        'Condition', 'Event', 'Value', 'Array', 'RawValue',
1837dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        'RawArray', 'current_process', 'active_children', 'Pipe',
1838dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        'connection', 'JoinableQueue'
1839dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        )))
1840dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1841dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersontestcases_processes = create_test_cases(ProcessesMixin, type='processes')
1842dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonglobals().update(testcases_processes)
1843dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1844dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1845dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonclass ManagerMixin(object):
1846dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    TYPE = 'manager'
1847dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    Process = multiprocessing.Process
1848dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    manager = object.__new__(multiprocessing.managers.SyncManager)
1849dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    locals().update(get_attributes(manager, (
1850dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        'Queue', 'Lock', 'RLock', 'Semaphore', 'BoundedSemaphore',
1851dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson       'Condition', 'Event', 'Value', 'Array', 'list', 'dict',
1852dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        'Namespace', 'JoinableQueue'
1853dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        )))
1854dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1855dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersontestcases_manager = create_test_cases(ManagerMixin, type='manager')
1856dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonglobals().update(testcases_manager)
1857dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1858dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1859dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonclass ThreadsMixin(object):
1860dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    TYPE = 'threads'
1861dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    Process = multiprocessing.dummy.Process
1862dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    locals().update(get_attributes(multiprocessing.dummy, (
1863dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        'Queue', 'Lock', 'RLock', 'Semaphore', 'BoundedSemaphore',
1864dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        'Condition', 'Event', 'Value', 'Array', 'current_process',
1865dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        'active_children', 'Pipe', 'connection', 'dict', 'list',
1866dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        'Namespace', 'JoinableQueue'
1867dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        )))
1868dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1869dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersontestcases_threads = create_test_cases(ThreadsMixin, type='threads')
1870dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonglobals().update(testcases_threads)
1871dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
18720c519b3a5e847eea0dffb51ac8df7c68891daf70Neal Norwitzclass OtherTest(unittest.TestCase):
18730c519b3a5e847eea0dffb51ac8df7c68891daf70Neal Norwitz    # TODO: add more tests for deliver/answer challenge.
18740c519b3a5e847eea0dffb51ac8df7c68891daf70Neal Norwitz    def test_deliver_challenge_auth_failure(self):
18750c519b3a5e847eea0dffb51ac8df7c68891daf70Neal Norwitz        class _FakeConnection(object):
18760c519b3a5e847eea0dffb51ac8df7c68891daf70Neal Norwitz            def recv_bytes(self, size):
18772a7767a17311cada06240a187c8896bdbcc1a4d0Neal Norwitz                return b'something bogus'
18780c519b3a5e847eea0dffb51ac8df7c68891daf70Neal Norwitz            def send_bytes(self, data):
18790c519b3a5e847eea0dffb51ac8df7c68891daf70Neal Norwitz                pass
18800c519b3a5e847eea0dffb51ac8df7c68891daf70Neal Norwitz        self.assertRaises(multiprocessing.AuthenticationError,
18810c519b3a5e847eea0dffb51ac8df7c68891daf70Neal Norwitz                          multiprocessing.connection.deliver_challenge,
18820c519b3a5e847eea0dffb51ac8df7c68891daf70Neal Norwitz                          _FakeConnection(), b'abc')
18830c519b3a5e847eea0dffb51ac8df7c68891daf70Neal Norwitz
18840c519b3a5e847eea0dffb51ac8df7c68891daf70Neal Norwitz    def test_answer_challenge_auth_failure(self):
18850c519b3a5e847eea0dffb51ac8df7c68891daf70Neal Norwitz        class _FakeConnection(object):
18860c519b3a5e847eea0dffb51ac8df7c68891daf70Neal Norwitz            def __init__(self):
18870c519b3a5e847eea0dffb51ac8df7c68891daf70Neal Norwitz                self.count = 0
18880c519b3a5e847eea0dffb51ac8df7c68891daf70Neal Norwitz            def recv_bytes(self, size):
18890c519b3a5e847eea0dffb51ac8df7c68891daf70Neal Norwitz                self.count += 1
18900c519b3a5e847eea0dffb51ac8df7c68891daf70Neal Norwitz                if self.count == 1:
18910c519b3a5e847eea0dffb51ac8df7c68891daf70Neal Norwitz                    return multiprocessing.connection.CHALLENGE
18920c519b3a5e847eea0dffb51ac8df7c68891daf70Neal Norwitz                elif self.count == 2:
18932a7767a17311cada06240a187c8896bdbcc1a4d0Neal Norwitz                    return b'something bogus'
18942a7767a17311cada06240a187c8896bdbcc1a4d0Neal Norwitz                return b''
18950c519b3a5e847eea0dffb51ac8df7c68891daf70Neal Norwitz            def send_bytes(self, data):
18960c519b3a5e847eea0dffb51ac8df7c68891daf70Neal Norwitz                pass
18970c519b3a5e847eea0dffb51ac8df7c68891daf70Neal Norwitz        self.assertRaises(multiprocessing.AuthenticationError,
18980c519b3a5e847eea0dffb51ac8df7c68891daf70Neal Norwitz                          multiprocessing.connection.answer_challenge,
18990c519b3a5e847eea0dffb51ac8df7c68891daf70Neal Norwitz                          _FakeConnection(), b'abc')
19000c519b3a5e847eea0dffb51ac8df7c68891daf70Neal Norwitz
19017152f6d9156a19a9f1b31e313d2c19d840dc089dJesse Noller#
19027152f6d9156a19a9f1b31e313d2c19d840dc089dJesse Noller# Test Manager.start()/Pool.__init__() initializer feature - see issue 5585
19037152f6d9156a19a9f1b31e313d2c19d840dc089dJesse Noller#
19047152f6d9156a19a9f1b31e313d2c19d840dc089dJesse Noller
19057152f6d9156a19a9f1b31e313d2c19d840dc089dJesse Nollerdef initializer(ns):
19067152f6d9156a19a9f1b31e313d2c19d840dc089dJesse Noller    ns.test += 1
19077152f6d9156a19a9f1b31e313d2c19d840dc089dJesse Noller
19087152f6d9156a19a9f1b31e313d2c19d840dc089dJesse Nollerclass TestInitializers(unittest.TestCase):
19097152f6d9156a19a9f1b31e313d2c19d840dc089dJesse Noller    def setUp(self):
19107152f6d9156a19a9f1b31e313d2c19d840dc089dJesse Noller        self.mgr = multiprocessing.Manager()
19117152f6d9156a19a9f1b31e313d2c19d840dc089dJesse Noller        self.ns = self.mgr.Namespace()
19127152f6d9156a19a9f1b31e313d2c19d840dc089dJesse Noller        self.ns.test = 0
19137152f6d9156a19a9f1b31e313d2c19d840dc089dJesse Noller
19147152f6d9156a19a9f1b31e313d2c19d840dc089dJesse Noller    def tearDown(self):
19157152f6d9156a19a9f1b31e313d2c19d840dc089dJesse Noller        self.mgr.shutdown()
19167152f6d9156a19a9f1b31e313d2c19d840dc089dJesse Noller
19177152f6d9156a19a9f1b31e313d2c19d840dc089dJesse Noller    def test_manager_initializer(self):
19187152f6d9156a19a9f1b31e313d2c19d840dc089dJesse Noller        m = multiprocessing.managers.SyncManager()
19197152f6d9156a19a9f1b31e313d2c19d840dc089dJesse Noller        self.assertRaises(TypeError, m.start, 1)
19207152f6d9156a19a9f1b31e313d2c19d840dc089dJesse Noller        m.start(initializer, (self.ns,))
19217152f6d9156a19a9f1b31e313d2c19d840dc089dJesse Noller        self.assertEqual(self.ns.test, 1)
19227152f6d9156a19a9f1b31e313d2c19d840dc089dJesse Noller        m.shutdown()
19237152f6d9156a19a9f1b31e313d2c19d840dc089dJesse Noller
19247152f6d9156a19a9f1b31e313d2c19d840dc089dJesse Noller    def test_pool_initializer(self):
19257152f6d9156a19a9f1b31e313d2c19d840dc089dJesse Noller        self.assertRaises(TypeError, multiprocessing.Pool, initializer=1)
19267152f6d9156a19a9f1b31e313d2c19d840dc089dJesse Noller        p = multiprocessing.Pool(1, initializer, (self.ns,))
19277152f6d9156a19a9f1b31e313d2c19d840dc089dJesse Noller        p.close()
19287152f6d9156a19a9f1b31e313d2c19d840dc089dJesse Noller        p.join()
19297152f6d9156a19a9f1b31e313d2c19d840dc089dJesse Noller        self.assertEqual(self.ns.test, 1)
19307152f6d9156a19a9f1b31e313d2c19d840dc089dJesse Noller
19311b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller#
19321b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller# Issue 5155, 5313, 5331: Test process in processes
19331b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller# Verifies os.close(sys.stdin.fileno) vs. sys.stdin.close() behavior
19341b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller#
19351b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller
19361b90efbdc5bb204fe50aea87374603dcba309227Jesse Nollerdef _ThisSubProcess(q):
19371b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller    try:
19381b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller        item = q.get(block=False)
19391b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller    except Queue.Empty:
19401b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller        pass
19411b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller
19421b90efbdc5bb204fe50aea87374603dcba309227Jesse Nollerdef _TestProcess(q):
19431b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller    queue = multiprocessing.Queue()
19441b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller    subProc = multiprocessing.Process(target=_ThisSubProcess, args=(queue,))
19451b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller    subProc.start()
19461b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller    subProc.join()
19471b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller
19481b90efbdc5bb204fe50aea87374603dcba309227Jesse Nollerdef _afunc(x):
19491b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller    return x*x
19501b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller
19511b90efbdc5bb204fe50aea87374603dcba309227Jesse Nollerdef pool_in_process():
19521b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller    pool = multiprocessing.Pool(processes=4)
19531b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller    x = pool.map(_afunc, [1, 2, 3, 4, 5, 6, 7])
19541b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller
19551b90efbdc5bb204fe50aea87374603dcba309227Jesse Nollerclass _file_like(object):
19561b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller    def __init__(self, delegate):
19571b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller        self._delegate = delegate
19581b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller        self._pid = None
19591b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller
19601b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller    @property
19611b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller    def cache(self):
19621b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller        pid = os.getpid()
19631b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller        # There are no race conditions since fork keeps only the running thread
19641b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller        if pid != self._pid:
19651b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller            self._pid = pid
19661b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller            self._cache = []
19671b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller        return self._cache
19681b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller
19691b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller    def write(self, data):
19701b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller        self.cache.append(data)
19711b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller
19721b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller    def flush(self):
19731b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller        self._delegate.write(''.join(self.cache))
19741b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller        self._cache = []
19751b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller
19761b90efbdc5bb204fe50aea87374603dcba309227Jesse Nollerclass TestStdinBadfiledescriptor(unittest.TestCase):
19771b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller
19781b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller    def test_queue_in_process(self):
19791b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller        queue = multiprocessing.Queue()
19801b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller        proc = multiprocessing.Process(target=_TestProcess, args=(queue,))
19811b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller        proc.start()
19821b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller        proc.join()
19831b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller
19841b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller    def test_pool_in_process(self):
19851b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller        p = multiprocessing.Process(target=pool_in_process)
19861b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller        p.start()
19871b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller        p.join()
19881b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller
19891b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller    def test_flushing(self):
19901b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller        sio = StringIO()
19911b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller        flike = _file_like(sio)
19921b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller        flike.write('foo')
19931b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller        proc = multiprocessing.Process(target=lambda: flike.flush())
19941b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller        flike.flush()
19951b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller        assert sio.getvalue() == 'foo'
19961b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller
19971b90efbdc5bb204fe50aea87374603dcba309227Jesse Nollertestcases_other = [OtherTest, TestInvalidHandle, TestInitializers,
19981b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller                   TestStdinBadfiledescriptor]
19990c519b3a5e847eea0dffb51ac8df7c68891daf70Neal Norwitz
2000dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson#
2001dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson#
2002dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson#
2003dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
2004dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersondef test_main(run=None):
200518623825d25b0f8f3b4bf96c1d5c4c2977a94004Jesse Noller    if sys.platform.startswith("linux"):
200618623825d25b0f8f3b4bf96c1d5c4c2977a94004Jesse Noller        try:
200718623825d25b0f8f3b4bf96c1d5c4c2977a94004Jesse Noller            lock = multiprocessing.RLock()
200818623825d25b0f8f3b4bf96c1d5c4c2977a94004Jesse Noller        except OSError:
2009bec087f29d7dca0aaf8f51be7d7c135e9b84e7f1Benjamin Peterson            raise unittest.SkipTest("OSError raises on RLock creation, see issue 3111!")
2010ed77f2e143102df58212ff1f64a87f7e0c237439Benjamin Peterson
2011dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    if run is None:
2012dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        from test.test_support import run_unittest as run
2013dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
2014dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    util.get_temp_dir()     # creates temp directory for use by all processes
2015dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
2016dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    multiprocessing.get_logger().setLevel(LOG_LEVEL)
2017dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
2018146b7ab818cadccf91ad98e64cfefb77705da0caJesse Noller    ProcessesMixin.pool = multiprocessing.Pool(4)
2019146b7ab818cadccf91ad98e64cfefb77705da0caJesse Noller    ThreadsMixin.pool = multiprocessing.dummy.Pool(4)
2020146b7ab818cadccf91ad98e64cfefb77705da0caJesse Noller    ManagerMixin.manager.__init__()
2021146b7ab818cadccf91ad98e64cfefb77705da0caJesse Noller    ManagerMixin.manager.start()
2022146b7ab818cadccf91ad98e64cfefb77705da0caJesse Noller    ManagerMixin.pool = ManagerMixin.manager.Pool(4)
2023dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
2024dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    testcases = (
2025146b7ab818cadccf91ad98e64cfefb77705da0caJesse Noller        sorted(testcases_processes.values(), key=lambda tc:tc.__name__) +
2026146b7ab818cadccf91ad98e64cfefb77705da0caJesse Noller        sorted(testcases_threads.values(), key=lambda tc:tc.__name__) +
20270c519b3a5e847eea0dffb51ac8df7c68891daf70Neal Norwitz        sorted(testcases_manager.values(), key=lambda tc:tc.__name__) +
20280c519b3a5e847eea0dffb51ac8df7c68891daf70Neal Norwitz        testcases_other
2029dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        )
2030dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
2031dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    loadTestsFromTestCase = unittest.defaultTestLoader.loadTestsFromTestCase
2032dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    suite = unittest.TestSuite(loadTestsFromTestCase(tc) for tc in testcases)
203313623662eac551c8575ec2507d9afc2a5fcba033Nick Coghlan    # (ncoghlan): Whether or not sys.exc_clear is executed by the threading
203413623662eac551c8575ec2507d9afc2a5fcba033Nick Coghlan    # module during these tests is at least platform dependent and possibly
203514459d5b1b800854ef8f1bbadf019682a6413a32Nick Coghlan    # non-deterministic on any given platform. So we don't mind if the listed
203613623662eac551c8575ec2507d9afc2a5fcba033Nick Coghlan    # warnings aren't actually raised.
203707627880813ffaad8d9b90bfe8791ccf588b031bFlorent Xicluna    with test_support.check_py3k_warnings(
203813623662eac551c8575ec2507d9afc2a5fcba033Nick Coghlan            (".+__(get|set)slice__ has been removed", DeprecationWarning),
203913623662eac551c8575ec2507d9afc2a5fcba033Nick Coghlan            (r"sys.exc_clear\(\) not supported", DeprecationWarning),
204013623662eac551c8575ec2507d9afc2a5fcba033Nick Coghlan            quiet=True):
204107627880813ffaad8d9b90bfe8791ccf588b031bFlorent Xicluna        run(suite)
2042dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
2043146b7ab818cadccf91ad98e64cfefb77705da0caJesse Noller    ThreadsMixin.pool.terminate()
2044146b7ab818cadccf91ad98e64cfefb77705da0caJesse Noller    ProcessesMixin.pool.terminate()
2045146b7ab818cadccf91ad98e64cfefb77705da0caJesse Noller    ManagerMixin.pool.terminate()
2046146b7ab818cadccf91ad98e64cfefb77705da0caJesse Noller    ManagerMixin.manager.shutdown()
2047dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
2048146b7ab818cadccf91ad98e64cfefb77705da0caJesse Noller    del ProcessesMixin.pool, ThreadsMixin.pool, ManagerMixin.pool
2049dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
2050dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersondef main():
2051dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    test_main(unittest.TextTestRunner(verbosity=2).run)
2052dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
2053dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonif __name__ == '__main__':
2054dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    main()
2055