test_multiprocessing.py revision f9e9a6f403af61c6aead4cfe766fb1efbb058171
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')
21c2077b0d9b5bf99768c6f396bf7ae6c41b682465Ezio Melotti# import threading after _multiprocessing to raise a more relevant 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
1184eb2b28553eceda5a19465534bc906929dd85243Antoine Pitrou    # For the sanity of Windows users, rather than crashing or freezing in
1194eb2b28553eceda5a19465534bc906929dd85243Antoine Pitrou    # multiple ways.
1204eb2b28553eceda5a19465534bc906929dd85243Antoine Pitrou    def __reduce__(self, *args):
1214eb2b28553eceda5a19465534bc906929dd85243Antoine Pitrou        raise NotImplementedError("shouldn't try to pickle a test case")
1224eb2b28553eceda5a19465534bc906929dd85243Antoine Pitrou
1234eb2b28553eceda5a19465534bc906929dd85243Antoine Pitrou    __reduce_ex__ = __reduce__
1244eb2b28553eceda5a19465534bc906929dd85243Antoine Pitrou
125dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson#
126dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# Return the value of a semaphore
127dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson#
128dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
129dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersondef get_value(self):
130dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    try:
131dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        return self.get_value()
132dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    except AttributeError:
133dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        try:
134dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            return self._Semaphore__value
135dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        except AttributeError:
136dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            try:
137dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson                return self._value
138dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            except AttributeError:
139dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson                raise NotImplementedError
140dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
141dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson#
142dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# Testcases
143dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson#
144dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
145dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonclass _TestProcess(BaseTestCase):
146dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
147dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    ALLOWED_TYPES = ('processes', 'threads')
148dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
149dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def test_current(self):
150dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        if self.TYPE == 'threads':
151dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            return
152dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
153dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        current = self.current_process()
1545bc9f4c09c99eb701dbee83fb9e26eed558e474fJesse Noller        authkey = current.authkey
155dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
156dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertTrue(current.is_alive())
1575bc9f4c09c99eb701dbee83fb9e26eed558e474fJesse Noller        self.assertTrue(not current.daemon)
158b0f5adc3f4e098b1744eeac65fc830fb1df2b8abEzio Melotti        self.assertIsInstance(authkey, bytes)
159dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertTrue(len(authkey) > 0)
1605bc9f4c09c99eb701dbee83fb9e26eed558e474fJesse Noller        self.assertEqual(current.ident, os.getpid())
1615bc9f4c09c99eb701dbee83fb9e26eed558e474fJesse Noller        self.assertEqual(current.exitcode, None)
162dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1634eb2b28553eceda5a19465534bc906929dd85243Antoine Pitrou    @classmethod
1644eb2b28553eceda5a19465534bc906929dd85243Antoine Pitrou    def _test(cls, q, *args, **kwds):
1654eb2b28553eceda5a19465534bc906929dd85243Antoine Pitrou        current = cls.current_process()
166dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        q.put(args)
167dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        q.put(kwds)
1685bc9f4c09c99eb701dbee83fb9e26eed558e474fJesse Noller        q.put(current.name)
1694eb2b28553eceda5a19465534bc906929dd85243Antoine Pitrou        if cls.TYPE != 'threads':
1705bc9f4c09c99eb701dbee83fb9e26eed558e474fJesse Noller            q.put(bytes(current.authkey))
171dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            q.put(current.pid)
172dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
173dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def test_process(self):
174dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        q = self.Queue(1)
175dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        e = self.Event()
176dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        args = (q, 1, 2)
177dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        kwargs = {'hello':23, 'bye':2.54}
178dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        name = 'SomeProcess'
179dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        p = self.Process(
180dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            target=self._test, args=args, kwargs=kwargs, name=name
181dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            )
1825bc9f4c09c99eb701dbee83fb9e26eed558e474fJesse Noller        p.daemon = True
183dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        current = self.current_process()
184dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
185dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        if self.TYPE != 'threads':
1862623a37852153363335956afab010cb0beb7e74eEzio Melotti            self.assertEqual(p.authkey, current.authkey)
1872623a37852153363335956afab010cb0beb7e74eEzio Melotti        self.assertEqual(p.is_alive(), False)
1882623a37852153363335956afab010cb0beb7e74eEzio Melotti        self.assertEqual(p.daemon, True)
189aa98058cc44ba20f35c106d20918c6196b737561Ezio Melotti        self.assertNotIn(p, self.active_children())
190dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertTrue(type(self.active_children()) is list)
1915bc9f4c09c99eb701dbee83fb9e26eed558e474fJesse Noller        self.assertEqual(p.exitcode, None)
192dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
193dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        p.start()
194dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1952623a37852153363335956afab010cb0beb7e74eEzio Melotti        self.assertEqual(p.exitcode, None)
1962623a37852153363335956afab010cb0beb7e74eEzio Melotti        self.assertEqual(p.is_alive(), True)
197aa98058cc44ba20f35c106d20918c6196b737561Ezio Melotti        self.assertIn(p, self.active_children())
198dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1992623a37852153363335956afab010cb0beb7e74eEzio Melotti        self.assertEqual(q.get(), args[1:])
2002623a37852153363335956afab010cb0beb7e74eEzio Melotti        self.assertEqual(q.get(), kwargs)
2012623a37852153363335956afab010cb0beb7e74eEzio Melotti        self.assertEqual(q.get(), p.name)
202dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        if self.TYPE != 'threads':
2032623a37852153363335956afab010cb0beb7e74eEzio Melotti            self.assertEqual(q.get(), current.authkey)
2042623a37852153363335956afab010cb0beb7e74eEzio Melotti            self.assertEqual(q.get(), p.pid)
205dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
206dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        p.join()
207dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
2082623a37852153363335956afab010cb0beb7e74eEzio Melotti        self.assertEqual(p.exitcode, 0)
2092623a37852153363335956afab010cb0beb7e74eEzio Melotti        self.assertEqual(p.is_alive(), False)
210aa98058cc44ba20f35c106d20918c6196b737561Ezio Melotti        self.assertNotIn(p, self.active_children())
211dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
2124eb2b28553eceda5a19465534bc906929dd85243Antoine Pitrou    @classmethod
2134eb2b28553eceda5a19465534bc906929dd85243Antoine Pitrou    def _test_terminate(cls):
214dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        time.sleep(1000)
215dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
216dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def test_terminate(self):
217dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        if self.TYPE == 'threads':
218dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            return
219dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
220dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        p = self.Process(target=self._test_terminate)
2215bc9f4c09c99eb701dbee83fb9e26eed558e474fJesse Noller        p.daemon = True
222dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        p.start()
223dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
224dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(p.is_alive(), True)
225aa98058cc44ba20f35c106d20918c6196b737561Ezio Melotti        self.assertIn(p, self.active_children())
2265bc9f4c09c99eb701dbee83fb9e26eed558e474fJesse Noller        self.assertEqual(p.exitcode, None)
227dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
228dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        p.terminate()
229dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
230dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        join = TimingWrapper(p.join)
231dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(join(), None)
232dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertTimingAlmostEqual(join.elapsed, 0.0)
233dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
234dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(p.is_alive(), False)
235aa98058cc44ba20f35c106d20918c6196b737561Ezio Melotti        self.assertNotIn(p, self.active_children())
236dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
237dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        p.join()
238dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
2395bc9f4c09c99eb701dbee83fb9e26eed558e474fJesse Noller        # XXX sometimes get p.exitcode == 0 on Windows ...
2405bc9f4c09c99eb701dbee83fb9e26eed558e474fJesse Noller        #self.assertEqual(p.exitcode, -signal.SIGTERM)
241dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
242dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def test_cpu_count(self):
243dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        try:
244dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            cpus = multiprocessing.cpu_count()
245dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        except NotImplementedError:
246dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            cpus = 1
247dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertTrue(type(cpus) is int)
248dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertTrue(cpus >= 1)
249dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
250dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def test_active_children(self):
251dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(type(self.active_children()), list)
252dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
253dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        p = self.Process(target=time.sleep, args=(DELTA,))
254aa98058cc44ba20f35c106d20918c6196b737561Ezio Melotti        self.assertNotIn(p, self.active_children())
255dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
256dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        p.start()
257aa98058cc44ba20f35c106d20918c6196b737561Ezio Melotti        self.assertIn(p, self.active_children())
258dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
259dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        p.join()
260aa98058cc44ba20f35c106d20918c6196b737561Ezio Melotti        self.assertNotIn(p, self.active_children())
261dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
2624eb2b28553eceda5a19465534bc906929dd85243Antoine Pitrou    @classmethod
2634eb2b28553eceda5a19465534bc906929dd85243Antoine Pitrou    def _test_recursion(cls, wconn, id):
264dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        from multiprocessing import forking
265dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        wconn.send(id)
266dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        if len(id) < 2:
267dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            for i in range(2):
2684eb2b28553eceda5a19465534bc906929dd85243Antoine Pitrou                p = cls.Process(
2694eb2b28553eceda5a19465534bc906929dd85243Antoine Pitrou                    target=cls._test_recursion, args=(wconn, id+[i])
270dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson                    )
271dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson                p.start()
272dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson                p.join()
273dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
274dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def test_recursion(self):
275dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        rconn, wconn = self.Pipe(duplex=False)
276dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self._test_recursion(wconn, [])
277dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
278dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        time.sleep(DELTA)
279dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        result = []
280dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        while rconn.poll():
281dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            result.append(rconn.recv())
282dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
283dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        expected = [
284dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            [],
285dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson              [0],
286dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson                [0, 0],
287dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson                [0, 1],
288dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson              [1],
289dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson                [1, 0],
290dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson                [1, 1]
291dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            ]
292dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(result, expected)
293dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
294dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson#
295dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson#
296dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson#
297dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
298dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonclass _UpperCaser(multiprocessing.Process):
299dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
300dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def __init__(self):
301dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        multiprocessing.Process.__init__(self)
302dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.child_conn, self.parent_conn = multiprocessing.Pipe()
303dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
304dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def run(self):
305dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.parent_conn.close()
306dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        for s in iter(self.child_conn.recv, None):
307dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            self.child_conn.send(s.upper())
308dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.child_conn.close()
309dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
310dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def submit(self, s):
311dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        assert type(s) is str
312dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.parent_conn.send(s)
313dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        return self.parent_conn.recv()
314dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
315dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def stop(self):
316dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.parent_conn.send(None)
317dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.parent_conn.close()
318dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.child_conn.close()
319dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
320dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonclass _TestSubclassingProcess(BaseTestCase):
321dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
322dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    ALLOWED_TYPES = ('processes',)
323dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
324dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def test_subclassing(self):
325dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        uppercaser = _UpperCaser()
326dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        uppercaser.start()
327dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(uppercaser.submit('hello'), 'HELLO')
328dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(uppercaser.submit('world'), 'WORLD')
329dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        uppercaser.stop()
330dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        uppercaser.join()
331dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
332dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson#
333dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson#
334dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson#
335dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
336dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersondef queue_empty(q):
337dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    if hasattr(q, 'empty'):
338dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        return q.empty()
339dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    else:
340dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        return q.qsize() == 0
341dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
342dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersondef queue_full(q, maxsize):
343dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    if hasattr(q, 'full'):
344dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        return q.full()
345dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    else:
346dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        return q.qsize() == maxsize
347dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
348dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
349dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonclass _TestQueue(BaseTestCase):
350dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
351dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
3524eb2b28553eceda5a19465534bc906929dd85243Antoine Pitrou    @classmethod
3534eb2b28553eceda5a19465534bc906929dd85243Antoine Pitrou    def _test_put(cls, queue, child_can_start, parent_can_continue):
354dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        child_can_start.wait()
355dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        for i in range(6):
356dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            queue.get()
357dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        parent_can_continue.set()
358dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
359dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def test_put(self):
360dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        MAXSIZE = 6
361dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        queue = self.Queue(maxsize=MAXSIZE)
362dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        child_can_start = self.Event()
363dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        parent_can_continue = self.Event()
364dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
365dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        proc = self.Process(
366dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            target=self._test_put,
367dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            args=(queue, child_can_start, parent_can_continue)
368dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            )
3695bc9f4c09c99eb701dbee83fb9e26eed558e474fJesse Noller        proc.daemon = True
370dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        proc.start()
371dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
372dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(queue_empty(queue), True)
373dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(queue_full(queue, MAXSIZE), False)
374dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
375dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        queue.put(1)
376dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        queue.put(2, True)
377dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        queue.put(3, True, None)
378dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        queue.put(4, False)
379dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        queue.put(5, False, None)
380dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        queue.put_nowait(6)
381dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
382dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        # the values may be in buffer but not yet in pipe so sleep a bit
383dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        time.sleep(DELTA)
384dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
385dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(queue_empty(queue), False)
386dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(queue_full(queue, MAXSIZE), True)
387dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
388dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        put = TimingWrapper(queue.put)
389dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        put_nowait = TimingWrapper(queue.put_nowait)
390dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
391dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertRaises(Queue.Full, put, 7, False)
392dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertTimingAlmostEqual(put.elapsed, 0)
393dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
394dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertRaises(Queue.Full, put, 7, False, None)
395dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertTimingAlmostEqual(put.elapsed, 0)
396dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
397dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertRaises(Queue.Full, put_nowait, 7)
398dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertTimingAlmostEqual(put_nowait.elapsed, 0)
399dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
400dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertRaises(Queue.Full, put, 7, True, TIMEOUT1)
401dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertTimingAlmostEqual(put.elapsed, TIMEOUT1)
402dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
403dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertRaises(Queue.Full, put, 7, False, TIMEOUT2)
404dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertTimingAlmostEqual(put.elapsed, 0)
405dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
406dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertRaises(Queue.Full, put, 7, True, timeout=TIMEOUT3)
407dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertTimingAlmostEqual(put.elapsed, TIMEOUT3)
408dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
409dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        child_can_start.set()
410dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        parent_can_continue.wait()
411dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
412dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(queue_empty(queue), True)
413dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(queue_full(queue, MAXSIZE), False)
414dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
415dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        proc.join()
416dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
4174eb2b28553eceda5a19465534bc906929dd85243Antoine Pitrou    @classmethod
4184eb2b28553eceda5a19465534bc906929dd85243Antoine Pitrou    def _test_get(cls, queue, child_can_start, parent_can_continue):
419dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        child_can_start.wait()
420da3a1b120055855a464c2d5f5143021ae8f5dc86Benjamin Peterson        #queue.put(1)
421dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        queue.put(2)
422dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        queue.put(3)
423dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        queue.put(4)
424dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        queue.put(5)
425dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        parent_can_continue.set()
426dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
427dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def test_get(self):
428dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        queue = self.Queue()
429dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        child_can_start = self.Event()
430dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        parent_can_continue = self.Event()
431dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
432dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        proc = self.Process(
433dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            target=self._test_get,
434dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            args=(queue, child_can_start, parent_can_continue)
435dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            )
4365bc9f4c09c99eb701dbee83fb9e26eed558e474fJesse Noller        proc.daemon = True
437dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        proc.start()
438dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
439dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(queue_empty(queue), True)
440dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
441dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        child_can_start.set()
442dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        parent_can_continue.wait()
443dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
444dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        time.sleep(DELTA)
445dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(queue_empty(queue), False)
446dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
447da3a1b120055855a464c2d5f5143021ae8f5dc86Benjamin Peterson        # Hangs unexpectedly, remove for now
448da3a1b120055855a464c2d5f5143021ae8f5dc86Benjamin Peterson        #self.assertEqual(queue.get(), 1)
449dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(queue.get(True, None), 2)
450dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(queue.get(True), 3)
451dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(queue.get(timeout=1), 4)
452dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(queue.get_nowait(), 5)
453dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
454dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(queue_empty(queue), True)
455dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
456dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        get = TimingWrapper(queue.get)
457dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        get_nowait = TimingWrapper(queue.get_nowait)
458dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
459dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertRaises(Queue.Empty, get, False)
460dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertTimingAlmostEqual(get.elapsed, 0)
461dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
462dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertRaises(Queue.Empty, get, False, None)
463dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertTimingAlmostEqual(get.elapsed, 0)
464dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
465dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertRaises(Queue.Empty, get_nowait)
466dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertTimingAlmostEqual(get_nowait.elapsed, 0)
467dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
468dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertRaises(Queue.Empty, get, True, TIMEOUT1)
469dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertTimingAlmostEqual(get.elapsed, TIMEOUT1)
470dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
471dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertRaises(Queue.Empty, get, False, TIMEOUT2)
472dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertTimingAlmostEqual(get.elapsed, 0)
473dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
474dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertRaises(Queue.Empty, get, timeout=TIMEOUT3)
475dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertTimingAlmostEqual(get.elapsed, TIMEOUT3)
476dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
477dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        proc.join()
478dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
4794eb2b28553eceda5a19465534bc906929dd85243Antoine Pitrou    @classmethod
4804eb2b28553eceda5a19465534bc906929dd85243Antoine Pitrou    def _test_fork(cls, queue):
481dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        for i in range(10, 20):
482dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            queue.put(i)
483dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        # note that at this point the items may only be buffered, so the
484dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        # process cannot shutdown until the feeder thread has finished
485dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        # pushing items onto the pipe.
486dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
487dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def test_fork(self):
488dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        # Old versions of Queue would fail to create a new feeder
489dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        # thread for a forked process if the original process had its
490dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        # own feeder thread.  This test checks that this no longer
491dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        # happens.
492dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
493dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        queue = self.Queue()
494dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
495dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        # put items on queue so that main process starts a feeder thread
496dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        for i in range(10):
497dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            queue.put(i)
498dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
499dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        # wait to make sure thread starts before we fork a new process
500dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        time.sleep(DELTA)
501dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
502dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        # fork process
503dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        p = self.Process(target=self._test_fork, args=(queue,))
504dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        p.start()
505dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
506dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        # check that all expected items are in the queue
507dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        for i in range(20):
508dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            self.assertEqual(queue.get(), i)
509dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertRaises(Queue.Empty, queue.get, False)
510dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
511dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        p.join()
512dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
513dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def test_qsize(self):
514dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        q = self.Queue()
515dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        try:
516dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            self.assertEqual(q.qsize(), 0)
517dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        except NotImplementedError:
518dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            return
519dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        q.put(1)
520dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(q.qsize(), 1)
521dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        q.put(5)
522dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(q.qsize(), 2)
523dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        q.get()
524dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(q.qsize(), 1)
525dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        q.get()
526dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(q.qsize(), 0)
527dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
5284eb2b28553eceda5a19465534bc906929dd85243Antoine Pitrou    @classmethod
5294eb2b28553eceda5a19465534bc906929dd85243Antoine Pitrou    def _test_task_done(cls, q):
530dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        for obj in iter(q.get, None):
531dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            time.sleep(DELTA)
532dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            q.task_done()
533dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
534dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def test_task_done(self):
535dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        queue = self.JoinableQueue()
536dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
537dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        if sys.version_info < (2, 5) and not hasattr(queue, 'task_done'):
53836b9fbb803659350f9e6182b85f5bf66ca2a72a8Florent Xicluna            self.skipTest("requires 'queue.task_done()' method")
539dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
540dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        workers = [self.Process(target=self._test_task_done, args=(queue,))
541dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson                   for i in xrange(4)]
542dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
543dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        for p in workers:
544dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            p.start()
545dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
546dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        for i in xrange(10):
547dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            queue.put(i)
548dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
549dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        queue.join()
550dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
551dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        for p in workers:
552dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            queue.put(None)
553dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
554dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        for p in workers:
555dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            p.join()
556dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
557dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson#
558dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson#
559dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson#
560dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
561dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonclass _TestLock(BaseTestCase):
562dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
563dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def test_lock(self):
564dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        lock = self.Lock()
565dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(lock.acquire(), True)
566dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(lock.acquire(False), False)
567dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(lock.release(), None)
568dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertRaises((ValueError, threading.ThreadError), lock.release)
569dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
570dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def test_rlock(self):
571dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        lock = self.RLock()
572dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(lock.acquire(), True)
573dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(lock.acquire(), True)
574dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(lock.acquire(), True)
575dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(lock.release(), None)
576dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(lock.release(), None)
577dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(lock.release(), None)
578dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertRaises((AssertionError, RuntimeError), lock.release)
579dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
58082eb5902ce169be81110c79662b772b904cd00fcJesse Noller    def test_lock_context(self):
58182eb5902ce169be81110c79662b772b904cd00fcJesse Noller        with self.Lock():
58282eb5902ce169be81110c79662b772b904cd00fcJesse Noller            pass
58382eb5902ce169be81110c79662b772b904cd00fcJesse Noller
584dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
585dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonclass _TestSemaphore(BaseTestCase):
586dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
587dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def _test_semaphore(self, sem):
588dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertReturnsIfImplemented(2, get_value, sem)
589dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(sem.acquire(), True)
590dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertReturnsIfImplemented(1, get_value, sem)
591dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(sem.acquire(), True)
592dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertReturnsIfImplemented(0, get_value, sem)
593dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(sem.acquire(False), False)
594dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertReturnsIfImplemented(0, get_value, sem)
595dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(sem.release(), None)
596dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertReturnsIfImplemented(1, get_value, sem)
597dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(sem.release(), None)
598dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertReturnsIfImplemented(2, get_value, sem)
599dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
600dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def test_semaphore(self):
601dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        sem = self.Semaphore(2)
602dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self._test_semaphore(sem)
603dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(sem.release(), None)
604dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertReturnsIfImplemented(3, get_value, sem)
605dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(sem.release(), None)
606dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertReturnsIfImplemented(4, get_value, sem)
607dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
608dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def test_bounded_semaphore(self):
609dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        sem = self.BoundedSemaphore(2)
610dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self._test_semaphore(sem)
611dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        # Currently fails on OS/X
612dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        #if HAVE_GETVALUE:
613dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        #    self.assertRaises(ValueError, sem.release)
614dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        #    self.assertReturnsIfImplemented(2, get_value, sem)
615dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
616dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def test_timeout(self):
617dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        if self.TYPE != 'processes':
618dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            return
619dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
620dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        sem = self.Semaphore(0)
621dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        acquire = TimingWrapper(sem.acquire)
622dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
623dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(acquire(False), False)
624dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertTimingAlmostEqual(acquire.elapsed, 0.0)
625dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
626dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(acquire(False, None), False)
627dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertTimingAlmostEqual(acquire.elapsed, 0.0)
628dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
629dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(acquire(False, TIMEOUT1), False)
630dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertTimingAlmostEqual(acquire.elapsed, 0)
631dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
632dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(acquire(True, TIMEOUT2), False)
633dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertTimingAlmostEqual(acquire.elapsed, TIMEOUT2)
634dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
635dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(acquire(timeout=TIMEOUT3), False)
636dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertTimingAlmostEqual(acquire.elapsed, TIMEOUT3)
637dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
638dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
639dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonclass _TestCondition(BaseTestCase):
640dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
6414eb2b28553eceda5a19465534bc906929dd85243Antoine Pitrou    @classmethod
6424eb2b28553eceda5a19465534bc906929dd85243Antoine Pitrou    def f(cls, cond, sleeping, woken, timeout=None):
643dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        cond.acquire()
644dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        sleeping.release()
645dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        cond.wait(timeout)
646dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        woken.release()
647dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        cond.release()
648dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
649dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def check_invariant(self, cond):
650dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        # this is only supposed to succeed when there are no sleepers
651dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        if self.TYPE == 'processes':
652dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            try:
653dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson                sleepers = (cond._sleeping_count.get_value() -
654dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson                            cond._woken_count.get_value())
655dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson                self.assertEqual(sleepers, 0)
656dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson                self.assertEqual(cond._wait_semaphore.get_value(), 0)
657dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            except NotImplementedError:
658dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson                pass
659dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
660dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def test_notify(self):
661dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        cond = self.Condition()
662dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        sleeping = self.Semaphore(0)
663dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        woken = self.Semaphore(0)
664dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
665dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        p = self.Process(target=self.f, args=(cond, sleeping, woken))
6665bc9f4c09c99eb701dbee83fb9e26eed558e474fJesse Noller        p.daemon = True
667dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        p.start()
668dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
669dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        p = threading.Thread(target=self.f, args=(cond, sleeping, woken))
6705bc9f4c09c99eb701dbee83fb9e26eed558e474fJesse Noller        p.daemon = True
671dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        p.start()
672dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
673dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        # wait for both children to start sleeping
674dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        sleeping.acquire()
675dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        sleeping.acquire()
676dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
677dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        # check no process/thread has woken up
678dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        time.sleep(DELTA)
679dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertReturnsIfImplemented(0, get_value, woken)
680dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
681dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        # wake up one process/thread
682dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        cond.acquire()
683dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        cond.notify()
684dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        cond.release()
685dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
686dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        # check one process/thread has woken up
687dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        time.sleep(DELTA)
688dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertReturnsIfImplemented(1, get_value, woken)
689dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
690dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        # wake up another
691dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        cond.acquire()
692dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        cond.notify()
693dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        cond.release()
694dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
695dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        # check other has woken up
696dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        time.sleep(DELTA)
697dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertReturnsIfImplemented(2, get_value, woken)
698dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
699dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        # check state is not mucked up
700dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.check_invariant(cond)
701dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        p.join()
702dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
703dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def test_notify_all(self):
704dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        cond = self.Condition()
705dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        sleeping = self.Semaphore(0)
706dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        woken = self.Semaphore(0)
707dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
708dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        # start some threads/processes which will timeout
709dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        for i in range(3):
710dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            p = self.Process(target=self.f,
711dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson                             args=(cond, sleeping, woken, TIMEOUT1))
7125bc9f4c09c99eb701dbee83fb9e26eed558e474fJesse Noller            p.daemon = True
713dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            p.start()
714dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
715dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            t = threading.Thread(target=self.f,
716dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson                                 args=(cond, sleeping, woken, TIMEOUT1))
717a9b2222de40ed62e6ec1c79f6a89607913f4babdBenjamin Peterson            t.daemon = True
718dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            t.start()
719dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
720dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        # wait for them all to sleep
721dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        for i in xrange(6):
722dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            sleeping.acquire()
723dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
724dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        # check they have all timed out
725dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        for i in xrange(6):
726dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            woken.acquire()
727dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertReturnsIfImplemented(0, get_value, woken)
728dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
729dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        # check state is not mucked up
730dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.check_invariant(cond)
731dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
732dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        # start some more threads/processes
733dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        for i in range(3):
734dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            p = self.Process(target=self.f, args=(cond, sleeping, woken))
7355bc9f4c09c99eb701dbee83fb9e26eed558e474fJesse Noller            p.daemon = True
736dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            p.start()
737dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
738dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            t = threading.Thread(target=self.f, args=(cond, sleeping, woken))
739a9b2222de40ed62e6ec1c79f6a89607913f4babdBenjamin Peterson            t.daemon = True
740dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            t.start()
741dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
742dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        # wait for them to all sleep
743dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        for i in xrange(6):
744dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            sleeping.acquire()
745dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
746dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        # check no process/thread has woken up
747dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        time.sleep(DELTA)
748dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertReturnsIfImplemented(0, get_value, woken)
749dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
750dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        # wake them all up
751dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        cond.acquire()
752dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        cond.notify_all()
753dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        cond.release()
754dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
755dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        # check they have all woken
756dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        time.sleep(DELTA)
757dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertReturnsIfImplemented(6, get_value, woken)
758dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
759dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        # check state is not mucked up
760dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.check_invariant(cond)
761dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
762dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def test_timeout(self):
763dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        cond = self.Condition()
764dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        wait = TimingWrapper(cond.wait)
765dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        cond.acquire()
766dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        res = wait(TIMEOUT1)
767dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        cond.release()
768dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(res, None)
769dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertTimingAlmostEqual(wait.elapsed, TIMEOUT1)
770dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
771dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
772dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonclass _TestEvent(BaseTestCase):
773dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
7744eb2b28553eceda5a19465534bc906929dd85243Antoine Pitrou    @classmethod
7754eb2b28553eceda5a19465534bc906929dd85243Antoine Pitrou    def _test_event(cls, event):
776dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        time.sleep(TIMEOUT2)
777dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        event.set()
778dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
779dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def test_event(self):
780dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        event = self.Event()
781dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        wait = TimingWrapper(event.wait)
782dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
783c2077b0d9b5bf99768c6f396bf7ae6c41b682465Ezio Melotti        # Removed temporarily, due to API shear, this does not
784dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        # work with threading._Event objects. is_set == isSet
78502cb0eb231fc01e2a50cbe14f6da7a8df52959efJesse Noller        self.assertEqual(event.is_set(), False)
786dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
78702cb0eb231fc01e2a50cbe14f6da7a8df52959efJesse Noller        # Removed, threading.Event.wait() will return the value of the __flag
78802cb0eb231fc01e2a50cbe14f6da7a8df52959efJesse Noller        # instead of None. API Shear with the semaphore backed mp.Event
78902cb0eb231fc01e2a50cbe14f6da7a8df52959efJesse Noller        self.assertEqual(wait(0.0), False)
790dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertTimingAlmostEqual(wait.elapsed, 0.0)
79102cb0eb231fc01e2a50cbe14f6da7a8df52959efJesse Noller        self.assertEqual(wait(TIMEOUT1), False)
792dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertTimingAlmostEqual(wait.elapsed, TIMEOUT1)
793dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
794dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        event.set()
795dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
796dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        # See note above on the API differences
79702cb0eb231fc01e2a50cbe14f6da7a8df52959efJesse Noller        self.assertEqual(event.is_set(), True)
79802cb0eb231fc01e2a50cbe14f6da7a8df52959efJesse Noller        self.assertEqual(wait(), True)
799dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertTimingAlmostEqual(wait.elapsed, 0.0)
80002cb0eb231fc01e2a50cbe14f6da7a8df52959efJesse Noller        self.assertEqual(wait(TIMEOUT1), True)
801dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertTimingAlmostEqual(wait.elapsed, 0.0)
802dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        # self.assertEqual(event.is_set(), True)
803dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
804dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        event.clear()
805dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
806dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        #self.assertEqual(event.is_set(), False)
807dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
808dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.Process(target=self._test_event, args=(event,)).start()
80902cb0eb231fc01e2a50cbe14f6da7a8df52959efJesse Noller        self.assertEqual(wait(), True)
810dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
811dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson#
812dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson#
813dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson#
814dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
815dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonclass _TestValue(BaseTestCase):
816dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
81736b9fbb803659350f9e6182b85f5bf66ca2a72a8Florent Xicluna    ALLOWED_TYPES = ('processes',)
81836b9fbb803659350f9e6182b85f5bf66ca2a72a8Florent Xicluna
819dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    codes_values = [
820dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        ('i', 4343, 24234),
821dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        ('d', 3.625, -4.25),
822dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        ('h', -232, 234),
823dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        ('c', latin('x'), latin('y'))
824dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        ]
825dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
82655d935a145710c2609c234df47b1172b52c3dcd9Antoine Pitrou    def setUp(self):
82755d935a145710c2609c234df47b1172b52c3dcd9Antoine Pitrou        if not HAS_SHAREDCTYPES:
82855d935a145710c2609c234df47b1172b52c3dcd9Antoine Pitrou            self.skipTest("requires multiprocessing.sharedctypes")
82955d935a145710c2609c234df47b1172b52c3dcd9Antoine Pitrou
8304eb2b28553eceda5a19465534bc906929dd85243Antoine Pitrou    @classmethod
8314eb2b28553eceda5a19465534bc906929dd85243Antoine Pitrou    def _test(cls, values):
8324eb2b28553eceda5a19465534bc906929dd85243Antoine Pitrou        for sv, cv in zip(values, cls.codes_values):
833dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            sv.value = cv[2]
834dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
835dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
836dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def test_value(self, raw=False):
837dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        if raw:
838dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            values = [self.RawValue(code, value)
839dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson                      for code, value, _ in self.codes_values]
840dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        else:
841dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            values = [self.Value(code, value)
842dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson                      for code, value, _ in self.codes_values]
843dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
844dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        for sv, cv in zip(values, self.codes_values):
845dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            self.assertEqual(sv.value, cv[1])
846dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
847dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        proc = self.Process(target=self._test, args=(values,))
848dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        proc.start()
849dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        proc.join()
850dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
851dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        for sv, cv in zip(values, self.codes_values):
852dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            self.assertEqual(sv.value, cv[2])
853dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
854dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def test_rawvalue(self):
855dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.test_value(raw=True)
856dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
857dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def test_getobj_getlock(self):
858dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        val1 = self.Value('i', 5)
859dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        lock1 = val1.get_lock()
860dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        obj1 = val1.get_obj()
861dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
862dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        val2 = self.Value('i', 5, lock=None)
863dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        lock2 = val2.get_lock()
864dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        obj2 = val2.get_obj()
865dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
866dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        lock = self.Lock()
867dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        val3 = self.Value('i', 5, lock=lock)
868dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        lock3 = val3.get_lock()
869dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        obj3 = val3.get_obj()
870dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(lock, lock3)
871dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
8726ab22154ddabdb67bd510a1f2e0aa9c7e0ee607dJesse Noller        arr4 = self.Value('i', 5, lock=False)
873dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertFalse(hasattr(arr4, 'get_lock'))
874dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertFalse(hasattr(arr4, 'get_obj'))
875dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
8766ab22154ddabdb67bd510a1f2e0aa9c7e0ee607dJesse Noller        self.assertRaises(AttributeError, self.Value, 'i', 5, lock='navalue')
8776ab22154ddabdb67bd510a1f2e0aa9c7e0ee607dJesse Noller
8786ab22154ddabdb67bd510a1f2e0aa9c7e0ee607dJesse Noller        arr5 = self.RawValue('i', 5)
8796ab22154ddabdb67bd510a1f2e0aa9c7e0ee607dJesse Noller        self.assertFalse(hasattr(arr5, 'get_lock'))
8806ab22154ddabdb67bd510a1f2e0aa9c7e0ee607dJesse Noller        self.assertFalse(hasattr(arr5, 'get_obj'))
8816ab22154ddabdb67bd510a1f2e0aa9c7e0ee607dJesse Noller
882dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
883dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonclass _TestArray(BaseTestCase):
884dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
88536b9fbb803659350f9e6182b85f5bf66ca2a72a8Florent Xicluna    ALLOWED_TYPES = ('processes',)
88636b9fbb803659350f9e6182b85f5bf66ca2a72a8Florent Xicluna
8874eb2b28553eceda5a19465534bc906929dd85243Antoine Pitrou    @classmethod
8884eb2b28553eceda5a19465534bc906929dd85243Antoine Pitrou    def f(cls, seq):
889dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        for i in range(1, len(seq)):
890dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            seq[i] += seq[i-1]
891dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
89236b9fbb803659350f9e6182b85f5bf66ca2a72a8Florent Xicluna    @unittest.skipIf(c_int is None, "requires _ctypes")
893dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def test_array(self, raw=False):
894dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        seq = [680, 626, 934, 821, 150, 233, 548, 982, 714, 831]
895dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        if raw:
896dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            arr = self.RawArray('i', seq)
897dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        else:
898dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            arr = self.Array('i', seq)
899dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
900dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(len(arr), len(seq))
901dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(arr[3], seq[3])
902dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(list(arr[2:7]), list(seq[2:7]))
903dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
904dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        arr[4:8] = seq[4:8] = array.array('i', [1, 2, 3, 4])
905dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
906dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(list(arr[:]), seq)
907dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
908dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.f(seq)
909dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
910dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        p = self.Process(target=self.f, args=(arr,))
911dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        p.start()
912dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        p.join()
913dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
914dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(list(arr[:]), seq)
915dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
91636b9fbb803659350f9e6182b85f5bf66ca2a72a8Florent Xicluna    @unittest.skipIf(c_int is None, "requires _ctypes")
917dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def test_rawarray(self):
918dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.test_array(raw=True)
919dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
92036b9fbb803659350f9e6182b85f5bf66ca2a72a8Florent Xicluna    @unittest.skipIf(c_int is None, "requires _ctypes")
921f9e9a6f403af61c6aead4cfe766fb1efbb058171Mark Dickinson    def test_array_accepts_long(self):
922f9e9a6f403af61c6aead4cfe766fb1efbb058171Mark Dickinson        arr = self.Array('i', 10L)
923f9e9a6f403af61c6aead4cfe766fb1efbb058171Mark Dickinson        self.assertEqual(len(arr), 10)
924f9e9a6f403af61c6aead4cfe766fb1efbb058171Mark Dickinson        raw_arr = self.RawArray('i', 10L)
925f9e9a6f403af61c6aead4cfe766fb1efbb058171Mark Dickinson        self.assertEqual(len(raw_arr), 10)
926f9e9a6f403af61c6aead4cfe766fb1efbb058171Mark Dickinson
927f9e9a6f403af61c6aead4cfe766fb1efbb058171Mark Dickinson    @unittest.skipIf(c_int is None, "requires _ctypes")
928dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def test_getobj_getlock_obj(self):
929dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        arr1 = self.Array('i', range(10))
930dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        lock1 = arr1.get_lock()
931dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        obj1 = arr1.get_obj()
932dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
933dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        arr2 = self.Array('i', range(10), lock=None)
934dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        lock2 = arr2.get_lock()
935dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        obj2 = arr2.get_obj()
936dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
937dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        lock = self.Lock()
938dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        arr3 = self.Array('i', range(10), lock=lock)
939dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        lock3 = arr3.get_lock()
940dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        obj3 = arr3.get_obj()
941dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(lock, lock3)
942dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
9436ab22154ddabdb67bd510a1f2e0aa9c7e0ee607dJesse Noller        arr4 = self.Array('i', range(10), lock=False)
944dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertFalse(hasattr(arr4, 'get_lock'))
945dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertFalse(hasattr(arr4, 'get_obj'))
9466ab22154ddabdb67bd510a1f2e0aa9c7e0ee607dJesse Noller        self.assertRaises(AttributeError,
9476ab22154ddabdb67bd510a1f2e0aa9c7e0ee607dJesse Noller                          self.Array, 'i', range(10), lock='notalock')
9486ab22154ddabdb67bd510a1f2e0aa9c7e0ee607dJesse Noller
9496ab22154ddabdb67bd510a1f2e0aa9c7e0ee607dJesse Noller        arr5 = self.RawArray('i', range(10))
9506ab22154ddabdb67bd510a1f2e0aa9c7e0ee607dJesse Noller        self.assertFalse(hasattr(arr5, 'get_lock'))
9516ab22154ddabdb67bd510a1f2e0aa9c7e0ee607dJesse Noller        self.assertFalse(hasattr(arr5, 'get_obj'))
952dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
953dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson#
954dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson#
955dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson#
956dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
957dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonclass _TestContainers(BaseTestCase):
958dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
959dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    ALLOWED_TYPES = ('manager',)
960dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
961dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def test_list(self):
962dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        a = self.list(range(10))
963dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(a[:], range(10))
964dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
965dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        b = self.list()
966dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(b[:], [])
967dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
968dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        b.extend(range(5))
969dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(b[:], range(5))
970dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
971dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(b[2], 2)
972dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(b[2:10], [2,3,4])
973dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
974dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        b *= 2
975dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(b[:], [0, 1, 2, 3, 4, 0, 1, 2, 3, 4])
976dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
977dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(b + [5, 6], [0, 1, 2, 3, 4, 0, 1, 2, 3, 4, 5, 6])
978dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
979dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(a[:], range(10))
980dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
981dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        d = [a, b]
982dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        e = self.list(d)
983dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(
984dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            e[:],
985dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            [[0, 1, 2, 3, 4, 5, 6, 7, 8, 9], [0, 1, 2, 3, 4, 0, 1, 2, 3, 4]]
986dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            )
987dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
988dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        f = self.list([a])
989dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        a.append('hello')
990dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(f[:], [[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 'hello']])
991dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
992dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def test_dict(self):
993dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        d = self.dict()
994dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        indices = range(65, 70)
995dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        for i in indices:
996dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            d[i] = chr(i)
997dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(d.copy(), dict((i, chr(i)) for i in indices))
998dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(sorted(d.keys()), indices)
999dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(sorted(d.values()), [chr(i) for i in indices])
1000dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(sorted(d.items()), [(i, chr(i)) for i in indices])
1001dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1002dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def test_namespace(self):
1003dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        n = self.Namespace()
1004dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        n.name = 'Bob'
1005dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        n.job = 'Builder'
1006dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        n._hidden = 'hidden'
1007dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual((n.name, n.job), ('Bob', 'Builder'))
1008dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        del n.job
1009dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(str(n), "Namespace(name='Bob')")
1010dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertTrue(hasattr(n, 'name'))
1011dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertTrue(not hasattr(n, 'job'))
1012dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1013dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson#
1014dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson#
1015dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson#
1016dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1017dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersondef sqr(x, wait=0.0):
1018dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    time.sleep(wait)
1019dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    return x*x
1020dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonclass _TestPool(BaseTestCase):
1021dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1022dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def test_apply(self):
1023dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        papply = self.pool.apply
1024dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(papply(sqr, (5,)), sqr(5))
1025dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(papply(sqr, (), {'x':3}), sqr(x=3))
1026dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1027dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def test_map(self):
1028dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        pmap = self.pool.map
1029dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(pmap(sqr, range(10)), map(sqr, range(10)))
1030dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(pmap(sqr, range(100), chunksize=20),
1031dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson                         map(sqr, range(100)))
1032dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
10337530e47948446f03a79ad7dec4cc129ad3388418Jesse Noller    def test_map_chunksize(self):
10347530e47948446f03a79ad7dec4cc129ad3388418Jesse Noller        try:
10357530e47948446f03a79ad7dec4cc129ad3388418Jesse Noller            self.pool.map_async(sqr, [], chunksize=1).get(timeout=TIMEOUT1)
10367530e47948446f03a79ad7dec4cc129ad3388418Jesse Noller        except multiprocessing.TimeoutError:
10377530e47948446f03a79ad7dec4cc129ad3388418Jesse Noller            self.fail("pool.map_async with chunksize stalled on null list")
10387530e47948446f03a79ad7dec4cc129ad3388418Jesse Noller
1039dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def test_async(self):
1040dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        res = self.pool.apply_async(sqr, (7, TIMEOUT1,))
1041dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        get = TimingWrapper(res.get)
1042dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(get(), 49)
1043dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertTimingAlmostEqual(get.elapsed, TIMEOUT1)
1044dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1045dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def test_async_timeout(self):
1046dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        res = self.pool.apply_async(sqr, (6, TIMEOUT2 + 0.2))
1047dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        get = TimingWrapper(res.get)
1048dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertRaises(multiprocessing.TimeoutError, get, timeout=TIMEOUT2)
1049dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertTimingAlmostEqual(get.elapsed, TIMEOUT2)
1050dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1051dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def test_imap(self):
1052dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        it = self.pool.imap(sqr, range(10))
1053dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(list(it), map(sqr, range(10)))
1054dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1055dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        it = self.pool.imap(sqr, range(10))
1056dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        for i in range(10):
1057dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            self.assertEqual(it.next(), i*i)
1058dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertRaises(StopIteration, it.next)
1059dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1060dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        it = self.pool.imap(sqr, range(1000), chunksize=100)
1061dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        for i in range(1000):
1062dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            self.assertEqual(it.next(), i*i)
1063dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertRaises(StopIteration, it.next)
1064dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1065dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def test_imap_unordered(self):
1066dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        it = self.pool.imap_unordered(sqr, range(1000))
1067dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(sorted(it), map(sqr, range(1000)))
1068dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1069dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        it = self.pool.imap_unordered(sqr, range(1000), chunksize=53)
1070dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(sorted(it), map(sqr, range(1000)))
1071dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1072dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def test_make_pool(self):
1073dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        p = multiprocessing.Pool(3)
1074dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(3, len(p._pool))
1075dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        p.close()
1076dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        p.join()
1077dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1078dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def test_terminate(self):
1079dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        if self.TYPE == 'manager':
1080dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            # On Unix a forked process increfs each shared object to
1081dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            # which its parent process held a reference.  If the
1082dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            # forked process gets terminated then there is likely to
1083dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            # be a reference leak.  So to prevent
1084dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            # _TestZZZNumberOfObjects from failing we skip this test
1085dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            # when using a manager.
1086dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            return
1087dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1088dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        result = self.pool.map_async(
1089dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            time.sleep, [0.1 for i in range(10000)], chunksize=1
1090dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            )
1091dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.pool.terminate()
1092dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        join = TimingWrapper(self.pool.join)
1093dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        join()
1094dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertTrue(join.elapsed < 0.2)
1095654ade3e6afa2527d1f642be28d69e219bd58b71Jesse Noller
1096654ade3e6afa2527d1f642be28d69e219bd58b71Jesse Nollerclass _TestPoolWorkerLifetime(BaseTestCase):
1097654ade3e6afa2527d1f642be28d69e219bd58b71Jesse Noller
1098654ade3e6afa2527d1f642be28d69e219bd58b71Jesse Noller    ALLOWED_TYPES = ('processes', )
1099654ade3e6afa2527d1f642be28d69e219bd58b71Jesse Noller    def test_pool_worker_lifetime(self):
1100654ade3e6afa2527d1f642be28d69e219bd58b71Jesse Noller        p = multiprocessing.Pool(3, maxtasksperchild=10)
1101654ade3e6afa2527d1f642be28d69e219bd58b71Jesse Noller        self.assertEqual(3, len(p._pool))
1102654ade3e6afa2527d1f642be28d69e219bd58b71Jesse Noller        origworkerpids = [w.pid for w in p._pool]
1103654ade3e6afa2527d1f642be28d69e219bd58b71Jesse Noller        # Run many tasks so each worker gets replaced (hopefully)
1104654ade3e6afa2527d1f642be28d69e219bd58b71Jesse Noller        results = []
1105654ade3e6afa2527d1f642be28d69e219bd58b71Jesse Noller        for i in range(100):
1106654ade3e6afa2527d1f642be28d69e219bd58b71Jesse Noller            results.append(p.apply_async(sqr, (i, )))
1107654ade3e6afa2527d1f642be28d69e219bd58b71Jesse Noller        # Fetch the results and verify we got the right answers,
1108654ade3e6afa2527d1f642be28d69e219bd58b71Jesse Noller        # also ensuring all the tasks have completed.
1109654ade3e6afa2527d1f642be28d69e219bd58b71Jesse Noller        for (j, res) in enumerate(results):
1110654ade3e6afa2527d1f642be28d69e219bd58b71Jesse Noller            self.assertEqual(res.get(), sqr(j))
1111654ade3e6afa2527d1f642be28d69e219bd58b71Jesse Noller        # Refill the pool
1112654ade3e6afa2527d1f642be28d69e219bd58b71Jesse Noller        p._repopulate_pool()
11133bc5cb7e0db13ba3885c8ed3d51ea792738499b2Florent Xicluna        # Wait until all workers are alive
11143bc5cb7e0db13ba3885c8ed3d51ea792738499b2Florent Xicluna        countdown = 5
11153bc5cb7e0db13ba3885c8ed3d51ea792738499b2Florent Xicluna        while countdown and not all(w.is_alive() for w in p._pool):
11163bc5cb7e0db13ba3885c8ed3d51ea792738499b2Florent Xicluna            countdown -= 1
11173bc5cb7e0db13ba3885c8ed3d51ea792738499b2Florent Xicluna            time.sleep(DELTA)
1118654ade3e6afa2527d1f642be28d69e219bd58b71Jesse Noller        finalworkerpids = [w.pid for w in p._pool]
11193bc5cb7e0db13ba3885c8ed3d51ea792738499b2Florent Xicluna        # All pids should be assigned.  See issue #7805.
11203bc5cb7e0db13ba3885c8ed3d51ea792738499b2Florent Xicluna        self.assertNotIn(None, origworkerpids)
11213bc5cb7e0db13ba3885c8ed3d51ea792738499b2Florent Xicluna        self.assertNotIn(None, finalworkerpids)
11223bc5cb7e0db13ba3885c8ed3d51ea792738499b2Florent Xicluna        # Finally, check that the worker pids have changed
1123654ade3e6afa2527d1f642be28d69e219bd58b71Jesse Noller        self.assertNotEqual(sorted(origworkerpids), sorted(finalworkerpids))
1124654ade3e6afa2527d1f642be28d69e219bd58b71Jesse Noller        p.close()
1125654ade3e6afa2527d1f642be28d69e219bd58b71Jesse Noller        p.join()
1126654ade3e6afa2527d1f642be28d69e219bd58b71Jesse Noller
1127dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson#
1128dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# Test that manager has expected number of shared objects left
1129dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson#
1130dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1131dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonclass _TestZZZNumberOfObjects(BaseTestCase):
1132dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    # Because test cases are sorted alphabetically, this one will get
1133dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    # run after all the other tests for the manager.  It tests that
1134dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    # there have been no "reference leaks" for the manager's shared
1135dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    # objects.  Note the comment in _TestPool.test_terminate().
1136dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    ALLOWED_TYPES = ('manager',)
1137dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1138dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def test_number_of_objects(self):
1139dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        EXPECTED_NUMBER = 1                # the pool object is still alive
1140dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        multiprocessing.active_children()  # discard dead process objs
1141dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        gc.collect()                       # do garbage collection
1142dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        refs = self.manager._number_of_objects()
11437314b38168da53863136d1937059fc0ac4883a56Jesse Noller        debug_info = self.manager._debug_info()
1144dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        if refs != EXPECTED_NUMBER:
11457fb9640d57f5d96dcaa0d0e6497abc21fa85f37eJesse Noller            print self.manager._debug_info()
11467314b38168da53863136d1937059fc0ac4883a56Jesse Noller            print debug_info
1147dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1148dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(refs, EXPECTED_NUMBER)
1149dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1150dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson#
1151dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# Test of creating a customized manager class
1152dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson#
1153dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1154dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonfrom multiprocessing.managers import BaseManager, BaseProxy, RemoteError
1155dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1156dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonclass FooBar(object):
1157dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def f(self):
1158dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        return 'f()'
1159dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def g(self):
1160dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        raise ValueError
1161dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def _h(self):
1162dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        return '_h()'
1163dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1164dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersondef baz():
1165dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    for i in xrange(10):
1166dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        yield i*i
1167dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1168dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonclass IteratorProxy(BaseProxy):
1169dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    _exposed_ = ('next', '__next__')
1170dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def __iter__(self):
1171dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        return self
1172dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def next(self):
1173dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        return self._callmethod('next')
1174dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def __next__(self):
1175dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        return self._callmethod('__next__')
1176dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1177dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonclass MyManager(BaseManager):
1178dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    pass
1179dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1180dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin PetersonMyManager.register('Foo', callable=FooBar)
1181dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin PetersonMyManager.register('Bar', callable=FooBar, exposed=('f', '_h'))
1182dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin PetersonMyManager.register('baz', callable=baz, proxytype=IteratorProxy)
1183dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1184dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1185dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonclass _TestMyManager(BaseTestCase):
1186dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1187dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    ALLOWED_TYPES = ('manager',)
1188dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1189dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def test_mymanager(self):
1190dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        manager = MyManager()
1191dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        manager.start()
1192dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1193dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        foo = manager.Foo()
1194dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        bar = manager.Bar()
1195dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        baz = manager.baz()
1196dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1197dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        foo_methods = [name for name in ('f', 'g', '_h') if hasattr(foo, name)]
1198dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        bar_methods = [name for name in ('f', 'g', '_h') if hasattr(bar, name)]
1199dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1200dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(foo_methods, ['f', 'g'])
1201dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(bar_methods, ['f', '_h'])
1202dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1203dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(foo.f(), 'f()')
1204dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertRaises(ValueError, foo.g)
1205dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(foo._callmethod('f'), 'f()')
1206dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertRaises(RemoteError, foo._callmethod, '_h')
1207dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1208dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(bar.f(), 'f()')
1209dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(bar._h(), '_h()')
1210dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(bar._callmethod('f'), 'f()')
1211dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(bar._callmethod('_h'), '_h()')
1212dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1213dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(list(baz), [i*i for i in range(10)])
1214dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1215dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        manager.shutdown()
1216dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1217dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson#
1218dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# Test of connecting to a remote server and using xmlrpclib for serialization
1219dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson#
1220dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1221dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson_queue = Queue.Queue()
1222dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersondef get_queue():
1223dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    return _queue
1224dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1225dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonclass QueueManager(BaseManager):
1226dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    '''manager class used by server process'''
1227dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin PetersonQueueManager.register('get_queue', callable=get_queue)
1228dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1229dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonclass QueueManager2(BaseManager):
1230dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    '''manager class which specifies the same interface as QueueManager'''
1231dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin PetersonQueueManager2.register('get_queue')
1232dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1233dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1234dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin PetersonSERIALIZER = 'xmlrpclib'
1235dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1236dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonclass _TestRemoteManager(BaseTestCase):
1237dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1238dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    ALLOWED_TYPES = ('manager',)
1239dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
12404eb2b28553eceda5a19465534bc906929dd85243Antoine Pitrou    @classmethod
12414eb2b28553eceda5a19465534bc906929dd85243Antoine Pitrou    def _putter(cls, address, authkey):
1242dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        manager = QueueManager2(
1243dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            address=address, authkey=authkey, serializer=SERIALIZER
1244dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            )
1245dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        manager.connect()
1246dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        queue = manager.get_queue()
1247dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        queue.put(('hello world', None, True, 2.25))
1248dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1249dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def test_remote(self):
1250dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        authkey = os.urandom(32)
1251dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1252dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        manager = QueueManager(
1253dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            address=('localhost', 0), authkey=authkey, serializer=SERIALIZER
1254dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            )
1255dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        manager.start()
1256dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1257dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        p = self.Process(target=self._putter, args=(manager.address, authkey))
1258dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        p.start()
1259dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1260dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        manager2 = QueueManager2(
1261dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            address=manager.address, authkey=authkey, serializer=SERIALIZER
1262dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            )
1263dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        manager2.connect()
1264dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        queue = manager2.get_queue()
1265dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1266dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        # Note that xmlrpclib will deserialize object as a list not a tuple
1267dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(queue.get(), ['hello world', None, True, 2.25])
1268dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1269dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        # Because we are using xmlrpclib for serialization instead of
1270dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        # pickle this will cause a serialization error.
1271dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertRaises(Exception, queue.put, time.sleep)
1272dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1273dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        # Make queue finalizer run before the server is stopped
1274dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        del queue
1275dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        manager.shutdown()
1276dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1277459a6481662c62d6cb57a070d21230db3e721c56Jesse Nollerclass _TestManagerRestart(BaseTestCase):
1278459a6481662c62d6cb57a070d21230db3e721c56Jesse Noller
12794eb2b28553eceda5a19465534bc906929dd85243Antoine Pitrou    @classmethod
12804eb2b28553eceda5a19465534bc906929dd85243Antoine Pitrou    def _putter(cls, address, authkey):
1281459a6481662c62d6cb57a070d21230db3e721c56Jesse Noller        manager = QueueManager(
1282459a6481662c62d6cb57a070d21230db3e721c56Jesse Noller            address=address, authkey=authkey, serializer=SERIALIZER)
1283459a6481662c62d6cb57a070d21230db3e721c56Jesse Noller        manager.connect()
1284459a6481662c62d6cb57a070d21230db3e721c56Jesse Noller        queue = manager.get_queue()
1285459a6481662c62d6cb57a070d21230db3e721c56Jesse Noller        queue.put('hello world')
1286459a6481662c62d6cb57a070d21230db3e721c56Jesse Noller
1287459a6481662c62d6cb57a070d21230db3e721c56Jesse Noller    def test_rapid_restart(self):
1288459a6481662c62d6cb57a070d21230db3e721c56Jesse Noller        authkey = os.urandom(32)
1289459a6481662c62d6cb57a070d21230db3e721c56Jesse Noller        manager = QueueManager(
129054f9f83e5cd417267b29a38f3364716523e69b28Antoine Pitrou            address=('localhost', 0), authkey=authkey, serializer=SERIALIZER)
129187d86e09b5ef3fc7e007c8a6f5f0bc54e003b089Brian Curtin        srvr = manager.get_server()
129287d86e09b5ef3fc7e007c8a6f5f0bc54e003b089Brian Curtin        addr = srvr.address
129387d86e09b5ef3fc7e007c8a6f5f0bc54e003b089Brian Curtin        # Close the connection.Listener socket which gets opened as a part
129487d86e09b5ef3fc7e007c8a6f5f0bc54e003b089Brian Curtin        # of manager.get_server(). It's not needed for the test.
129587d86e09b5ef3fc7e007c8a6f5f0bc54e003b089Brian Curtin        srvr.listener.close()
1296459a6481662c62d6cb57a070d21230db3e721c56Jesse Noller        manager.start()
1297459a6481662c62d6cb57a070d21230db3e721c56Jesse Noller
1298459a6481662c62d6cb57a070d21230db3e721c56Jesse Noller        p = self.Process(target=self._putter, args=(manager.address, authkey))
1299459a6481662c62d6cb57a070d21230db3e721c56Jesse Noller        p.start()
1300459a6481662c62d6cb57a070d21230db3e721c56Jesse Noller        queue = manager.get_queue()
1301459a6481662c62d6cb57a070d21230db3e721c56Jesse Noller        self.assertEqual(queue.get(), 'hello world')
1302019ce773cd25ee08d1a822f06958774b43881d00Jesse Noller        del queue
1303459a6481662c62d6cb57a070d21230db3e721c56Jesse Noller        manager.shutdown()
1304459a6481662c62d6cb57a070d21230db3e721c56Jesse Noller        manager = QueueManager(
130554f9f83e5cd417267b29a38f3364716523e69b28Antoine Pitrou            address=addr, authkey=authkey, serializer=SERIALIZER)
1306459a6481662c62d6cb57a070d21230db3e721c56Jesse Noller        manager.start()
1307019ce773cd25ee08d1a822f06958774b43881d00Jesse Noller        manager.shutdown()
1308459a6481662c62d6cb57a070d21230db3e721c56Jesse Noller
1309dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson#
1310dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson#
1311dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson#
1312dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1313dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin PetersonSENTINEL = latin('')
1314dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1315dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonclass _TestConnection(BaseTestCase):
1316dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1317dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    ALLOWED_TYPES = ('processes', 'threads')
1318dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
13194eb2b28553eceda5a19465534bc906929dd85243Antoine Pitrou    @classmethod
13204eb2b28553eceda5a19465534bc906929dd85243Antoine Pitrou    def _echo(cls, conn):
1321dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        for msg in iter(conn.recv_bytes, SENTINEL):
1322dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            conn.send_bytes(msg)
1323dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        conn.close()
1324dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1325dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def test_connection(self):
1326dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        conn, child_conn = self.Pipe()
1327dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1328dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        p = self.Process(target=self._echo, args=(child_conn,))
13295bc9f4c09c99eb701dbee83fb9e26eed558e474fJesse Noller        p.daemon = True
1330dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        p.start()
1331dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1332dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        seq = [1, 2.25, None]
1333dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        msg = latin('hello world')
1334dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        longmsg = msg * 10
1335dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        arr = array.array('i', range(4))
1336dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1337dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        if self.TYPE == 'processes':
1338dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            self.assertEqual(type(conn.fileno()), int)
1339dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1340dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(conn.send(seq), None)
1341dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(conn.recv(), seq)
1342dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1343dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(conn.send_bytes(msg), None)
1344dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(conn.recv_bytes(), msg)
1345dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1346dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        if self.TYPE == 'processes':
1347dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            buffer = array.array('i', [0]*10)
1348dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            expected = list(arr) + [0] * (10 - len(arr))
1349dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            self.assertEqual(conn.send_bytes(arr), None)
1350dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            self.assertEqual(conn.recv_bytes_into(buffer),
1351dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson                             len(arr) * buffer.itemsize)
1352dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            self.assertEqual(list(buffer), expected)
1353dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1354dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            buffer = array.array('i', [0]*10)
1355dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            expected = [0] * 3 + list(arr) + [0] * (10 - 3 - len(arr))
1356dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            self.assertEqual(conn.send_bytes(arr), None)
1357dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            self.assertEqual(conn.recv_bytes_into(buffer, 3 * buffer.itemsize),
1358dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson                             len(arr) * buffer.itemsize)
1359dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            self.assertEqual(list(buffer), expected)
1360dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1361dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            buffer = bytearray(latin(' ' * 40))
1362dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            self.assertEqual(conn.send_bytes(longmsg), None)
1363dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            try:
1364dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson                res = conn.recv_bytes_into(buffer)
1365dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            except multiprocessing.BufferTooShort, e:
1366dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson                self.assertEqual(e.args, (longmsg,))
1367dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            else:
1368dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson                self.fail('expected BufferTooShort, got %s' % res)
1369dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1370dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        poll = TimingWrapper(conn.poll)
1371dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1372dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(poll(), False)
1373dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertTimingAlmostEqual(poll.elapsed, 0)
1374dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1375dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(poll(TIMEOUT1), False)
1376dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertTimingAlmostEqual(poll.elapsed, TIMEOUT1)
1377dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1378dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        conn.send(None)
1379dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1380dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(poll(TIMEOUT1), True)
1381dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertTimingAlmostEqual(poll.elapsed, 0)
1382dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1383dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(conn.recv(), None)
1384dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1385dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        really_big_msg = latin('X') * (1024 * 1024 * 16)   # 16Mb
1386dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        conn.send_bytes(really_big_msg)
1387dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(conn.recv_bytes(), really_big_msg)
1388dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1389dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        conn.send_bytes(SENTINEL)                          # tell child to quit
1390dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        child_conn.close()
1391dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1392dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        if self.TYPE == 'processes':
1393dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            self.assertEqual(conn.readable, True)
1394dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            self.assertEqual(conn.writable, True)
1395dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            self.assertRaises(EOFError, conn.recv)
1396dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            self.assertRaises(EOFError, conn.recv_bytes)
1397dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1398dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        p.join()
1399dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1400dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def test_duplex_false(self):
1401dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        reader, writer = self.Pipe(duplex=False)
1402dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(writer.send(1), None)
1403dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(reader.recv(), 1)
1404dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        if self.TYPE == 'processes':
1405dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            self.assertEqual(reader.readable, True)
1406dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            self.assertEqual(reader.writable, False)
1407dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            self.assertEqual(writer.readable, False)
1408dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            self.assertEqual(writer.writable, True)
1409dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            self.assertRaises(IOError, reader.send, 2)
1410dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            self.assertRaises(IOError, writer.recv)
1411dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            self.assertRaises(IOError, writer.poll)
1412dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1413dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def test_spawn_close(self):
1414dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        # We test that a pipe connection can be closed by parent
1415dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        # process immediately after child is spawned.  On Windows this
1416dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        # would have sometimes failed on old versions because
1417dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        # child_conn would be closed before the child got a chance to
1418dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        # duplicate it.
1419dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        conn, child_conn = self.Pipe()
1420dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1421dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        p = self.Process(target=self._echo, args=(child_conn,))
1422dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        p.start()
1423dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        child_conn.close()    # this might complete before child initializes
1424dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1425dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        msg = latin('hello')
1426dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        conn.send_bytes(msg)
1427dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(conn.recv_bytes(), msg)
1428dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1429dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        conn.send_bytes(SENTINEL)
1430dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        conn.close()
1431dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        p.join()
1432dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1433dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def test_sendbytes(self):
1434dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        if self.TYPE != 'processes':
1435dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            return
1436dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1437dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        msg = latin('abcdefghijklmnopqrstuvwxyz')
1438dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        a, b = self.Pipe()
1439dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1440dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        a.send_bytes(msg)
1441dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(b.recv_bytes(), msg)
1442dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1443dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        a.send_bytes(msg, 5)
1444dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(b.recv_bytes(), msg[5:])
1445dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1446dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        a.send_bytes(msg, 7, 8)
1447dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(b.recv_bytes(), msg[7:7+8])
1448dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1449dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        a.send_bytes(msg, 26)
1450dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(b.recv_bytes(), latin(''))
1451dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1452dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        a.send_bytes(msg, 26, 0)
1453dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(b.recv_bytes(), latin(''))
1454dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1455dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertRaises(ValueError, a.send_bytes, msg, 27)
1456dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1457dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertRaises(ValueError, a.send_bytes, msg, 22, 5)
1458dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1459dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertRaises(ValueError, a.send_bytes, msg, 26, 1)
1460dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1461dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertRaises(ValueError, a.send_bytes, msg, -1)
1462dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1463dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertRaises(ValueError, a.send_bytes, msg, 4, -1)
1464dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1465dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonclass _TestListenerClient(BaseTestCase):
1466dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1467dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    ALLOWED_TYPES = ('processes', 'threads')
1468dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
14694eb2b28553eceda5a19465534bc906929dd85243Antoine Pitrou    @classmethod
14704eb2b28553eceda5a19465534bc906929dd85243Antoine Pitrou    def _test(cls, address):
14714eb2b28553eceda5a19465534bc906929dd85243Antoine Pitrou        conn = cls.connection.Client(address)
1472dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        conn.send('hello')
1473dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        conn.close()
1474dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1475dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def test_listener_client(self):
1476dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        for family in self.connection.families:
1477dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            l = self.connection.Listener(family=family)
1478dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            p = self.Process(target=self._test, args=(l.address,))
14795bc9f4c09c99eb701dbee83fb9e26eed558e474fJesse Noller            p.daemon = True
1480dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            p.start()
1481dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            conn = l.accept()
1482dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            self.assertEqual(conn.recv(), 'hello')
1483dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            p.join()
1484dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            l.close()
1485dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson#
1486dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# Test of sending connection and socket objects between processes
1487dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson#
1488da3a1b120055855a464c2d5f5143021ae8f5dc86Benjamin Peterson"""
1489dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonclass _TestPicklingConnections(BaseTestCase):
1490dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1491dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    ALLOWED_TYPES = ('processes',)
1492dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1493dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def _listener(self, conn, families):
1494dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        for fam in families:
1495dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            l = self.connection.Listener(family=fam)
1496dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            conn.send(l.address)
1497dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            new_conn = l.accept()
1498dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            conn.send(new_conn)
1499dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1500dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        if self.TYPE == 'processes':
1501dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            l = socket.socket()
1502dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            l.bind(('localhost', 0))
1503dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            conn.send(l.getsockname())
1504dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            l.listen(1)
1505dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            new_conn, addr = l.accept()
1506dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            conn.send(new_conn)
1507dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1508dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        conn.recv()
1509dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1510dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def _remote(self, conn):
1511dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        for (address, msg) in iter(conn.recv, None):
1512dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            client = self.connection.Client(address)
1513dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            client.send(msg.upper())
1514dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            client.close()
1515dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1516dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        if self.TYPE == 'processes':
1517dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            address, msg = conn.recv()
1518dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            client = socket.socket()
1519dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            client.connect(address)
1520dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            client.sendall(msg.upper())
1521dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            client.close()
1522dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1523dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        conn.close()
1524dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1525dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def test_pickling(self):
1526dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        try:
1527dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            multiprocessing.allow_connection_pickling()
1528dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        except ImportError:
1529dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            return
1530dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1531dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        families = self.connection.families
1532dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1533dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        lconn, lconn0 = self.Pipe()
1534dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        lp = self.Process(target=self._listener, args=(lconn0, families))
1535dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        lp.start()
1536dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        lconn0.close()
1537dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1538dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        rconn, rconn0 = self.Pipe()
1539dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        rp = self.Process(target=self._remote, args=(rconn0,))
1540dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        rp.start()
1541dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        rconn0.close()
1542dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1543dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        for fam in families:
1544dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            msg = ('This connection uses family %s' % fam).encode('ascii')
1545dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            address = lconn.recv()
1546dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            rconn.send((address, msg))
1547dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            new_conn = lconn.recv()
1548dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            self.assertEqual(new_conn.recv(), msg.upper())
1549dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1550dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        rconn.send(None)
1551dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1552dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        if self.TYPE == 'processes':
1553dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            msg = latin('This connection uses a normal socket')
1554dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            address = lconn.recv()
1555dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            rconn.send((address, msg))
1556dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            if hasattr(socket, 'fromfd'):
1557dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson                new_conn = lconn.recv()
1558dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson                self.assertEqual(new_conn.recv(100), msg.upper())
1559dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            else:
1560dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson                # XXX On Windows with Py2.6 need to backport fromfd()
1561dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson                discard = lconn.recv_bytes()
1562dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1563dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        lconn.send(None)
1564dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1565dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        rconn.close()
1566dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        lconn.close()
1567dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1568dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        lp.join()
1569dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        rp.join()
1570da3a1b120055855a464c2d5f5143021ae8f5dc86Benjamin Peterson"""
1571dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson#
1572dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson#
1573dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson#
1574dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1575dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonclass _TestHeap(BaseTestCase):
1576dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1577dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    ALLOWED_TYPES = ('processes',)
1578dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1579dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def test_heap(self):
1580dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        iterations = 5000
1581dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        maxblocks = 50
1582dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        blocks = []
1583dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1584dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        # create and destroy lots of blocks of different sizes
1585dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        for i in xrange(iterations):
1586dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            size = int(random.lognormvariate(0, 1) * 1000)
1587dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            b = multiprocessing.heap.BufferWrapper(size)
1588dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            blocks.append(b)
1589dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            if len(blocks) > maxblocks:
1590dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson                i = random.randrange(maxblocks)
1591dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson                del blocks[i]
1592dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1593dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        # get the heap object
1594dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        heap = multiprocessing.heap.BufferWrapper._heap
1595dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1596dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        # verify the state of the heap
1597dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        all = []
1598dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        occupied = 0
1599dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        for L in heap._len_to_seq.values():
1600dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            for arena, start, stop in L:
1601dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson                all.append((heap._arenas.index(arena), start, stop,
1602dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson                            stop-start, 'free'))
1603dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        for arena, start, stop in heap._allocated_blocks:
1604dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            all.append((heap._arenas.index(arena), start, stop,
1605dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson                        stop-start, 'occupied'))
1606dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            occupied += (stop-start)
1607dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1608dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        all.sort()
1609dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1610dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        for i in range(len(all)-1):
1611dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            (arena, start, stop) = all[i][:3]
1612dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            (narena, nstart, nstop) = all[i+1][:3]
1613dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            self.assertTrue((arena != narena and nstart == 0) or
1614dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson                            (stop == nstart))
1615dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1616dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson#
1617dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson#
1618dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson#
1619dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1620dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonclass _Foo(Structure):
1621dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    _fields_ = [
1622dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        ('x', c_int),
1623dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        ('y', c_double)
1624dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        ]
1625dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1626dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonclass _TestSharedCTypes(BaseTestCase):
1627dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1628dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    ALLOWED_TYPES = ('processes',)
1629dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
163055d935a145710c2609c234df47b1172b52c3dcd9Antoine Pitrou    def setUp(self):
163155d935a145710c2609c234df47b1172b52c3dcd9Antoine Pitrou        if not HAS_SHAREDCTYPES:
163255d935a145710c2609c234df47b1172b52c3dcd9Antoine Pitrou            self.skipTest("requires multiprocessing.sharedctypes")
163355d935a145710c2609c234df47b1172b52c3dcd9Antoine Pitrou
16344eb2b28553eceda5a19465534bc906929dd85243Antoine Pitrou    @classmethod
16354eb2b28553eceda5a19465534bc906929dd85243Antoine Pitrou    def _double(cls, x, y, foo, arr, string):
1636dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        x.value *= 2
1637dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        y.value *= 2
1638dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        foo.x *= 2
1639dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        foo.y *= 2
1640dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        string.value *= 2
1641dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        for i in range(len(arr)):
1642dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            arr[i] *= 2
1643dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1644dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def test_sharedctypes(self, lock=False):
1645dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        x = Value('i', 7, lock=lock)
1646bd564c3c21ef4c6d6cb0070870edd9d2f7c89d11Georg Brandl        y = Value(c_double, 1.0/3.0, lock=lock)
1647dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        foo = Value(_Foo, 3, 2, lock=lock)
1648bd564c3c21ef4c6d6cb0070870edd9d2f7c89d11Georg Brandl        arr = self.Array('d', range(10), lock=lock)
1649bd564c3c21ef4c6d6cb0070870edd9d2f7c89d11Georg Brandl        string = self.Array('c', 20, lock=lock)
1650a06e9b8f6b2edf4936146fa8867f12222106d0f8Brian Curtin        string.value = latin('hello')
1651dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1652dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        p = self.Process(target=self._double, args=(x, y, foo, arr, string))
1653dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        p.start()
1654dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        p.join()
1655dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1656dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(x.value, 14)
1657dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertAlmostEqual(y.value, 2.0/3.0)
1658dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(foo.x, 6)
1659dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertAlmostEqual(foo.y, 4.0)
1660dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        for i in range(10):
1661dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            self.assertAlmostEqual(arr[i], i*2)
1662dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(string.value, latin('hellohello'))
1663dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1664dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def test_synchronize(self):
1665dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.test_sharedctypes(lock=True)
1666dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1667dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def test_copy(self):
1668dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        foo = _Foo(2, 5.0)
1669a06e9b8f6b2edf4936146fa8867f12222106d0f8Brian Curtin        bar = copy(foo)
1670dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        foo.x = 0
1671dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        foo.y = 0
1672dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(bar.x, 2)
1673dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertAlmostEqual(bar.y, 5.0)
1674dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1675dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson#
1676dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson#
1677dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson#
1678dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1679dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonclass _TestFinalize(BaseTestCase):
1680dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1681dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    ALLOWED_TYPES = ('processes',)
1682dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
16834eb2b28553eceda5a19465534bc906929dd85243Antoine Pitrou    @classmethod
16844eb2b28553eceda5a19465534bc906929dd85243Antoine Pitrou    def _test_finalize(cls, conn):
1685dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        class Foo(object):
1686dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            pass
1687dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1688dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        a = Foo()
1689dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        util.Finalize(a, conn.send, args=('a',))
1690dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        del a           # triggers callback for a
1691dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1692dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        b = Foo()
1693dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        close_b = util.Finalize(b, conn.send, args=('b',))
1694dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        close_b()       # triggers callback for b
1695dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        close_b()       # does nothing because callback has already been called
1696dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        del b           # does nothing because callback has already been called
1697dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1698dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        c = Foo()
1699dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        util.Finalize(c, conn.send, args=('c',))
1700dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1701dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        d10 = Foo()
1702dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        util.Finalize(d10, conn.send, args=('d10',), exitpriority=1)
1703dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1704dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        d01 = Foo()
1705dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        util.Finalize(d01, conn.send, args=('d01',), exitpriority=0)
1706dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        d02 = Foo()
1707dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        util.Finalize(d02, conn.send, args=('d02',), exitpriority=0)
1708dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        d03 = Foo()
1709dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        util.Finalize(d03, conn.send, args=('d03',), exitpriority=0)
1710dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1711dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        util.Finalize(None, conn.send, args=('e',), exitpriority=-10)
1712dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1713dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        util.Finalize(None, conn.send, args=('STOP',), exitpriority=-100)
1714dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1715c2077b0d9b5bf99768c6f396bf7ae6c41b682465Ezio Melotti        # call multiprocessing's cleanup function then exit process without
1716dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        # garbage collecting locals
1717dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        util._exit_function()
1718dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        conn.close()
1719dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        os._exit(0)
1720dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1721dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def test_finalize(self):
1722dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        conn, child_conn = self.Pipe()
1723dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1724dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        p = self.Process(target=self._test_finalize, args=(child_conn,))
1725dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        p.start()
1726dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        p.join()
1727dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1728dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        result = [obj for obj in iter(conn.recv, 'STOP')]
1729dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(result, ['a', 'b', 'd10', 'd03', 'd02', 'd01', 'e'])
1730dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1731dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson#
1732dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# Test that from ... import * works for each module
1733dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson#
1734dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1735dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonclass _TestImportStar(BaseTestCase):
1736dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1737dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    ALLOWED_TYPES = ('processes',)
1738dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1739dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def test_import(self):
174036b9fbb803659350f9e6182b85f5bf66ca2a72a8Florent Xicluna        modules = [
1741dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            'multiprocessing', 'multiprocessing.connection',
1742dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            'multiprocessing.heap', 'multiprocessing.managers',
1743dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            'multiprocessing.pool', 'multiprocessing.process',
174436b9fbb803659350f9e6182b85f5bf66ca2a72a8Florent Xicluna            'multiprocessing.reduction',
1745dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            'multiprocessing.synchronize', 'multiprocessing.util'
174636b9fbb803659350f9e6182b85f5bf66ca2a72a8Florent Xicluna            ]
174736b9fbb803659350f9e6182b85f5bf66ca2a72a8Florent Xicluna
174836b9fbb803659350f9e6182b85f5bf66ca2a72a8Florent Xicluna        if c_int is not None:
174936b9fbb803659350f9e6182b85f5bf66ca2a72a8Florent Xicluna            # This module requires _ctypes
175036b9fbb803659350f9e6182b85f5bf66ca2a72a8Florent Xicluna            modules.append('multiprocessing.sharedctypes')
1751dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1752dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        for name in modules:
1753dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            __import__(name)
1754dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            mod = sys.modules[name]
1755dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1756dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            for attr in getattr(mod, '__all__', ()):
1757dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson                self.assertTrue(
1758dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson                    hasattr(mod, attr),
1759dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson                    '%r does not have attribute %r' % (mod, attr)
1760dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson                    )
1761dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1762dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson#
1763dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# Quick test that logging works -- does not test logging output
1764dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson#
1765dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1766dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonclass _TestLogging(BaseTestCase):
1767dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1768dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    ALLOWED_TYPES = ('processes',)
1769dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1770dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def test_enable_logging(self):
1771dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        logger = multiprocessing.get_logger()
1772dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        logger.setLevel(util.SUBWARNING)
1773dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertTrue(logger is not None)
1774dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        logger.debug('this will not be printed')
1775dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        logger.info('nor will this')
1776dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        logger.setLevel(LOG_LEVEL)
1777dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
17784eb2b28553eceda5a19465534bc906929dd85243Antoine Pitrou    @classmethod
17794eb2b28553eceda5a19465534bc906929dd85243Antoine Pitrou    def _test_level(cls, conn):
1780dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        logger = multiprocessing.get_logger()
1781dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        conn.send(logger.getEffectiveLevel())
1782dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1783dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def test_level(self):
1784dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        LEVEL1 = 32
1785dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        LEVEL2 = 37
1786dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1787dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        logger = multiprocessing.get_logger()
1788dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        root_logger = logging.getLogger()
1789dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        root_level = root_logger.level
1790dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1791dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        reader, writer = multiprocessing.Pipe(duplex=False)
1792dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1793dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        logger.setLevel(LEVEL1)
1794dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.Process(target=self._test_level, args=(writer,)).start()
1795dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(LEVEL1, reader.recv())
1796dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1797dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        logger.setLevel(logging.NOTSET)
1798dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        root_logger.setLevel(LEVEL2)
1799dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.Process(target=self._test_level, args=(writer,)).start()
1800dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(LEVEL2, reader.recv())
1801dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1802dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        root_logger.setLevel(root_level)
1803dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        logger.setLevel(level=LOG_LEVEL)
1804dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1805814d02dcd1b30a98f9a34c710be35de6db82aa40Jesse Noller
18069a03f2fd03278d2c12dfe253de1bbed7c0c9c506Jesse Noller# class _TestLoggingProcessName(BaseTestCase):
18079a03f2fd03278d2c12dfe253de1bbed7c0c9c506Jesse Noller#
18089a03f2fd03278d2c12dfe253de1bbed7c0c9c506Jesse Noller#     def handle(self, record):
18099a03f2fd03278d2c12dfe253de1bbed7c0c9c506Jesse Noller#         assert record.processName == multiprocessing.current_process().name
18109a03f2fd03278d2c12dfe253de1bbed7c0c9c506Jesse Noller#         self.__handled = True
18119a03f2fd03278d2c12dfe253de1bbed7c0c9c506Jesse Noller#
18129a03f2fd03278d2c12dfe253de1bbed7c0c9c506Jesse Noller#     def test_logging(self):
18139a03f2fd03278d2c12dfe253de1bbed7c0c9c506Jesse Noller#         handler = logging.Handler()
18149a03f2fd03278d2c12dfe253de1bbed7c0c9c506Jesse Noller#         handler.handle = self.handle
18159a03f2fd03278d2c12dfe253de1bbed7c0c9c506Jesse Noller#         self.__handled = False
18169a03f2fd03278d2c12dfe253de1bbed7c0c9c506Jesse Noller#         # Bypass getLogger() and side-effects
18179a03f2fd03278d2c12dfe253de1bbed7c0c9c506Jesse Noller#         logger = logging.getLoggerClass()(
18189a03f2fd03278d2c12dfe253de1bbed7c0c9c506Jesse Noller#                 'multiprocessing.test.TestLoggingProcessName')
18199a03f2fd03278d2c12dfe253de1bbed7c0c9c506Jesse Noller#         logger.addHandler(handler)
18209a03f2fd03278d2c12dfe253de1bbed7c0c9c506Jesse Noller#         logger.propagate = False
18219a03f2fd03278d2c12dfe253de1bbed7c0c9c506Jesse Noller#
18229a03f2fd03278d2c12dfe253de1bbed7c0c9c506Jesse Noller#         logger.warn('foo')
18239a03f2fd03278d2c12dfe253de1bbed7c0c9c506Jesse Noller#         assert self.__handled
1824814d02dcd1b30a98f9a34c710be35de6db82aa40Jesse Noller
1825dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson#
18269a5b2ad38d605206f05a52fe32868d3f839e8a86Jesse Noller# Test to verify handle verification, see issue 3321
18279a5b2ad38d605206f05a52fe32868d3f839e8a86Jesse Noller#
18289a5b2ad38d605206f05a52fe32868d3f839e8a86Jesse Noller
18299a5b2ad38d605206f05a52fe32868d3f839e8a86Jesse Nollerclass TestInvalidHandle(unittest.TestCase):
18309a5b2ad38d605206f05a52fe32868d3f839e8a86Jesse Noller
183136b9fbb803659350f9e6182b85f5bf66ca2a72a8Florent Xicluna    @unittest.skipIf(WIN32, "skipped on Windows")
18329a5b2ad38d605206f05a52fe32868d3f839e8a86Jesse Noller    def test_invalid_handles(self):
18339a5b2ad38d605206f05a52fe32868d3f839e8a86Jesse Noller        conn = _multiprocessing.Connection(44977608)
18349a5b2ad38d605206f05a52fe32868d3f839e8a86Jesse Noller        self.assertRaises(IOError, conn.poll)
18359a5b2ad38d605206f05a52fe32868d3f839e8a86Jesse Noller        self.assertRaises(IOError, _multiprocessing.Connection, -1)
183636b9fbb803659350f9e6182b85f5bf66ca2a72a8Florent Xicluna
18379a5b2ad38d605206f05a52fe32868d3f839e8a86Jesse Noller#
1838dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# Functions used to create test cases from the base ones in this module
1839dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson#
1840dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1841dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersondef get_attributes(Source, names):
1842dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    d = {}
1843dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    for name in names:
1844dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        obj = getattr(Source, name)
1845dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        if type(obj) == type(get_attributes):
1846dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            obj = staticmethod(obj)
1847dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        d[name] = obj
1848dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    return d
1849dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1850dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersondef create_test_cases(Mixin, type):
1851dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    result = {}
1852dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    glob = globals()
185336b9fbb803659350f9e6182b85f5bf66ca2a72a8Florent Xicluna    Type = type.capitalize()
1854dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1855dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    for name in glob.keys():
1856dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        if name.startswith('_Test'):
1857dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            base = glob[name]
1858dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            if type in base.ALLOWED_TYPES:
1859dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson                newname = 'With' + Type + name[1:]
1860dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson                class Temp(base, unittest.TestCase, Mixin):
1861dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson                    pass
1862dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson                result[newname] = Temp
1863dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson                Temp.__name__ = newname
1864dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson                Temp.__module__ = Mixin.__module__
1865dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    return result
1866dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1867dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson#
1868dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# Create test cases
1869dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson#
1870dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1871dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonclass ProcessesMixin(object):
1872dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    TYPE = 'processes'
1873dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    Process = multiprocessing.Process
1874dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    locals().update(get_attributes(multiprocessing, (
1875dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        'Queue', 'Lock', 'RLock', 'Semaphore', 'BoundedSemaphore',
1876dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        'Condition', 'Event', 'Value', 'Array', 'RawValue',
1877dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        'RawArray', 'current_process', 'active_children', 'Pipe',
1878dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        'connection', 'JoinableQueue'
1879dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        )))
1880dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1881dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersontestcases_processes = create_test_cases(ProcessesMixin, type='processes')
1882dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonglobals().update(testcases_processes)
1883dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1884dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1885dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonclass ManagerMixin(object):
1886dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    TYPE = 'manager'
1887dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    Process = multiprocessing.Process
1888dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    manager = object.__new__(multiprocessing.managers.SyncManager)
1889dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    locals().update(get_attributes(manager, (
1890dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        'Queue', 'Lock', 'RLock', 'Semaphore', 'BoundedSemaphore',
1891dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson       'Condition', 'Event', 'Value', 'Array', 'list', 'dict',
1892dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        'Namespace', 'JoinableQueue'
1893dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        )))
1894dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1895dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersontestcases_manager = create_test_cases(ManagerMixin, type='manager')
1896dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonglobals().update(testcases_manager)
1897dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1898dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1899dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonclass ThreadsMixin(object):
1900dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    TYPE = 'threads'
1901dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    Process = multiprocessing.dummy.Process
1902dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    locals().update(get_attributes(multiprocessing.dummy, (
1903dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        'Queue', 'Lock', 'RLock', 'Semaphore', 'BoundedSemaphore',
1904dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        'Condition', 'Event', 'Value', 'Array', 'current_process',
1905dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        'active_children', 'Pipe', 'connection', 'dict', 'list',
1906dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        'Namespace', 'JoinableQueue'
1907dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        )))
1908dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1909dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersontestcases_threads = create_test_cases(ThreadsMixin, type='threads')
1910dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonglobals().update(testcases_threads)
1911dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
19120c519b3a5e847eea0dffb51ac8df7c68891daf70Neal Norwitzclass OtherTest(unittest.TestCase):
19130c519b3a5e847eea0dffb51ac8df7c68891daf70Neal Norwitz    # TODO: add more tests for deliver/answer challenge.
19140c519b3a5e847eea0dffb51ac8df7c68891daf70Neal Norwitz    def test_deliver_challenge_auth_failure(self):
19150c519b3a5e847eea0dffb51ac8df7c68891daf70Neal Norwitz        class _FakeConnection(object):
19160c519b3a5e847eea0dffb51ac8df7c68891daf70Neal Norwitz            def recv_bytes(self, size):
19172a7767a17311cada06240a187c8896bdbcc1a4d0Neal Norwitz                return b'something bogus'
19180c519b3a5e847eea0dffb51ac8df7c68891daf70Neal Norwitz            def send_bytes(self, data):
19190c519b3a5e847eea0dffb51ac8df7c68891daf70Neal Norwitz                pass
19200c519b3a5e847eea0dffb51ac8df7c68891daf70Neal Norwitz        self.assertRaises(multiprocessing.AuthenticationError,
19210c519b3a5e847eea0dffb51ac8df7c68891daf70Neal Norwitz                          multiprocessing.connection.deliver_challenge,
19220c519b3a5e847eea0dffb51ac8df7c68891daf70Neal Norwitz                          _FakeConnection(), b'abc')
19230c519b3a5e847eea0dffb51ac8df7c68891daf70Neal Norwitz
19240c519b3a5e847eea0dffb51ac8df7c68891daf70Neal Norwitz    def test_answer_challenge_auth_failure(self):
19250c519b3a5e847eea0dffb51ac8df7c68891daf70Neal Norwitz        class _FakeConnection(object):
19260c519b3a5e847eea0dffb51ac8df7c68891daf70Neal Norwitz            def __init__(self):
19270c519b3a5e847eea0dffb51ac8df7c68891daf70Neal Norwitz                self.count = 0
19280c519b3a5e847eea0dffb51ac8df7c68891daf70Neal Norwitz            def recv_bytes(self, size):
19290c519b3a5e847eea0dffb51ac8df7c68891daf70Neal Norwitz                self.count += 1
19300c519b3a5e847eea0dffb51ac8df7c68891daf70Neal Norwitz                if self.count == 1:
19310c519b3a5e847eea0dffb51ac8df7c68891daf70Neal Norwitz                    return multiprocessing.connection.CHALLENGE
19320c519b3a5e847eea0dffb51ac8df7c68891daf70Neal Norwitz                elif self.count == 2:
19332a7767a17311cada06240a187c8896bdbcc1a4d0Neal Norwitz                    return b'something bogus'
19342a7767a17311cada06240a187c8896bdbcc1a4d0Neal Norwitz                return b''
19350c519b3a5e847eea0dffb51ac8df7c68891daf70Neal Norwitz            def send_bytes(self, data):
19360c519b3a5e847eea0dffb51ac8df7c68891daf70Neal Norwitz                pass
19370c519b3a5e847eea0dffb51ac8df7c68891daf70Neal Norwitz        self.assertRaises(multiprocessing.AuthenticationError,
19380c519b3a5e847eea0dffb51ac8df7c68891daf70Neal Norwitz                          multiprocessing.connection.answer_challenge,
19390c519b3a5e847eea0dffb51ac8df7c68891daf70Neal Norwitz                          _FakeConnection(), b'abc')
19400c519b3a5e847eea0dffb51ac8df7c68891daf70Neal Norwitz
19417152f6d9156a19a9f1b31e313d2c19d840dc089dJesse Noller#
19427152f6d9156a19a9f1b31e313d2c19d840dc089dJesse Noller# Test Manager.start()/Pool.__init__() initializer feature - see issue 5585
19437152f6d9156a19a9f1b31e313d2c19d840dc089dJesse Noller#
19447152f6d9156a19a9f1b31e313d2c19d840dc089dJesse Noller
19457152f6d9156a19a9f1b31e313d2c19d840dc089dJesse Nollerdef initializer(ns):
19467152f6d9156a19a9f1b31e313d2c19d840dc089dJesse Noller    ns.test += 1
19477152f6d9156a19a9f1b31e313d2c19d840dc089dJesse Noller
19487152f6d9156a19a9f1b31e313d2c19d840dc089dJesse Nollerclass TestInitializers(unittest.TestCase):
19497152f6d9156a19a9f1b31e313d2c19d840dc089dJesse Noller    def setUp(self):
19507152f6d9156a19a9f1b31e313d2c19d840dc089dJesse Noller        self.mgr = multiprocessing.Manager()
19517152f6d9156a19a9f1b31e313d2c19d840dc089dJesse Noller        self.ns = self.mgr.Namespace()
19527152f6d9156a19a9f1b31e313d2c19d840dc089dJesse Noller        self.ns.test = 0
19537152f6d9156a19a9f1b31e313d2c19d840dc089dJesse Noller
19547152f6d9156a19a9f1b31e313d2c19d840dc089dJesse Noller    def tearDown(self):
19557152f6d9156a19a9f1b31e313d2c19d840dc089dJesse Noller        self.mgr.shutdown()
19567152f6d9156a19a9f1b31e313d2c19d840dc089dJesse Noller
19577152f6d9156a19a9f1b31e313d2c19d840dc089dJesse Noller    def test_manager_initializer(self):
19587152f6d9156a19a9f1b31e313d2c19d840dc089dJesse Noller        m = multiprocessing.managers.SyncManager()
19597152f6d9156a19a9f1b31e313d2c19d840dc089dJesse Noller        self.assertRaises(TypeError, m.start, 1)
19607152f6d9156a19a9f1b31e313d2c19d840dc089dJesse Noller        m.start(initializer, (self.ns,))
19617152f6d9156a19a9f1b31e313d2c19d840dc089dJesse Noller        self.assertEqual(self.ns.test, 1)
19627152f6d9156a19a9f1b31e313d2c19d840dc089dJesse Noller        m.shutdown()
19637152f6d9156a19a9f1b31e313d2c19d840dc089dJesse Noller
19647152f6d9156a19a9f1b31e313d2c19d840dc089dJesse Noller    def test_pool_initializer(self):
19657152f6d9156a19a9f1b31e313d2c19d840dc089dJesse Noller        self.assertRaises(TypeError, multiprocessing.Pool, initializer=1)
19667152f6d9156a19a9f1b31e313d2c19d840dc089dJesse Noller        p = multiprocessing.Pool(1, initializer, (self.ns,))
19677152f6d9156a19a9f1b31e313d2c19d840dc089dJesse Noller        p.close()
19687152f6d9156a19a9f1b31e313d2c19d840dc089dJesse Noller        p.join()
19697152f6d9156a19a9f1b31e313d2c19d840dc089dJesse Noller        self.assertEqual(self.ns.test, 1)
19707152f6d9156a19a9f1b31e313d2c19d840dc089dJesse Noller
19711b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller#
19721b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller# Issue 5155, 5313, 5331: Test process in processes
19731b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller# Verifies os.close(sys.stdin.fileno) vs. sys.stdin.close() behavior
19741b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller#
19751b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller
19761b90efbdc5bb204fe50aea87374603dcba309227Jesse Nollerdef _ThisSubProcess(q):
19771b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller    try:
19781b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller        item = q.get(block=False)
19791b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller    except Queue.Empty:
19801b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller        pass
19811b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller
19821b90efbdc5bb204fe50aea87374603dcba309227Jesse Nollerdef _TestProcess(q):
19831b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller    queue = multiprocessing.Queue()
19841b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller    subProc = multiprocessing.Process(target=_ThisSubProcess, args=(queue,))
19851b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller    subProc.start()
19861b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller    subProc.join()
19871b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller
19881b90efbdc5bb204fe50aea87374603dcba309227Jesse Nollerdef _afunc(x):
19891b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller    return x*x
19901b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller
19911b90efbdc5bb204fe50aea87374603dcba309227Jesse Nollerdef pool_in_process():
19921b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller    pool = multiprocessing.Pool(processes=4)
19931b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller    x = pool.map(_afunc, [1, 2, 3, 4, 5, 6, 7])
19941b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller
19951b90efbdc5bb204fe50aea87374603dcba309227Jesse Nollerclass _file_like(object):
19961b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller    def __init__(self, delegate):
19971b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller        self._delegate = delegate
19981b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller        self._pid = None
19991b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller
20001b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller    @property
20011b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller    def cache(self):
20021b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller        pid = os.getpid()
20031b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller        # There are no race conditions since fork keeps only the running thread
20041b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller        if pid != self._pid:
20051b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller            self._pid = pid
20061b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller            self._cache = []
20071b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller        return self._cache
20081b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller
20091b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller    def write(self, data):
20101b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller        self.cache.append(data)
20111b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller
20121b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller    def flush(self):
20131b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller        self._delegate.write(''.join(self.cache))
20141b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller        self._cache = []
20151b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller
20161b90efbdc5bb204fe50aea87374603dcba309227Jesse Nollerclass TestStdinBadfiledescriptor(unittest.TestCase):
20171b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller
20181b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller    def test_queue_in_process(self):
20191b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller        queue = multiprocessing.Queue()
20201b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller        proc = multiprocessing.Process(target=_TestProcess, args=(queue,))
20211b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller        proc.start()
20221b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller        proc.join()
20231b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller
20241b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller    def test_pool_in_process(self):
20251b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller        p = multiprocessing.Process(target=pool_in_process)
20261b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller        p.start()
20271b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller        p.join()
20281b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller
20291b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller    def test_flushing(self):
20301b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller        sio = StringIO()
20311b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller        flike = _file_like(sio)
20321b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller        flike.write('foo')
20331b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller        proc = multiprocessing.Process(target=lambda: flike.flush())
20341b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller        flike.flush()
20351b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller        assert sio.getvalue() == 'foo'
20361b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller
20371b90efbdc5bb204fe50aea87374603dcba309227Jesse Nollertestcases_other = [OtherTest, TestInvalidHandle, TestInitializers,
20381b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller                   TestStdinBadfiledescriptor]
20390c519b3a5e847eea0dffb51ac8df7c68891daf70Neal Norwitz
2040dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson#
2041dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson#
2042dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson#
2043dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
2044dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersondef test_main(run=None):
204518623825d25b0f8f3b4bf96c1d5c4c2977a94004Jesse Noller    if sys.platform.startswith("linux"):
204618623825d25b0f8f3b4bf96c1d5c4c2977a94004Jesse Noller        try:
204718623825d25b0f8f3b4bf96c1d5c4c2977a94004Jesse Noller            lock = multiprocessing.RLock()
204818623825d25b0f8f3b4bf96c1d5c4c2977a94004Jesse Noller        except OSError:
2049bec087f29d7dca0aaf8f51be7d7c135e9b84e7f1Benjamin Peterson            raise unittest.SkipTest("OSError raises on RLock creation, see issue 3111!")
2050ed77f2e143102df58212ff1f64a87f7e0c237439Benjamin Peterson
2051dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    if run is None:
2052dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        from test.test_support import run_unittest as run
2053dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
2054dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    util.get_temp_dir()     # creates temp directory for use by all processes
2055dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
2056dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    multiprocessing.get_logger().setLevel(LOG_LEVEL)
2057dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
2058146b7ab818cadccf91ad98e64cfefb77705da0caJesse Noller    ProcessesMixin.pool = multiprocessing.Pool(4)
2059146b7ab818cadccf91ad98e64cfefb77705da0caJesse Noller    ThreadsMixin.pool = multiprocessing.dummy.Pool(4)
2060146b7ab818cadccf91ad98e64cfefb77705da0caJesse Noller    ManagerMixin.manager.__init__()
2061146b7ab818cadccf91ad98e64cfefb77705da0caJesse Noller    ManagerMixin.manager.start()
2062146b7ab818cadccf91ad98e64cfefb77705da0caJesse Noller    ManagerMixin.pool = ManagerMixin.manager.Pool(4)
2063dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
2064dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    testcases = (
2065146b7ab818cadccf91ad98e64cfefb77705da0caJesse Noller        sorted(testcases_processes.values(), key=lambda tc:tc.__name__) +
2066146b7ab818cadccf91ad98e64cfefb77705da0caJesse Noller        sorted(testcases_threads.values(), key=lambda tc:tc.__name__) +
20670c519b3a5e847eea0dffb51ac8df7c68891daf70Neal Norwitz        sorted(testcases_manager.values(), key=lambda tc:tc.__name__) +
20680c519b3a5e847eea0dffb51ac8df7c68891daf70Neal Norwitz        testcases_other
2069dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        )
2070dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
2071dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    loadTestsFromTestCase = unittest.defaultTestLoader.loadTestsFromTestCase
2072dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    suite = unittest.TestSuite(loadTestsFromTestCase(tc) for tc in testcases)
207313623662eac551c8575ec2507d9afc2a5fcba033Nick Coghlan    # (ncoghlan): Whether or not sys.exc_clear is executed by the threading
207413623662eac551c8575ec2507d9afc2a5fcba033Nick Coghlan    # module during these tests is at least platform dependent and possibly
207514459d5b1b800854ef8f1bbadf019682a6413a32Nick Coghlan    # non-deterministic on any given platform. So we don't mind if the listed
207613623662eac551c8575ec2507d9afc2a5fcba033Nick Coghlan    # warnings aren't actually raised.
207707627880813ffaad8d9b90bfe8791ccf588b031bFlorent Xicluna    with test_support.check_py3k_warnings(
207813623662eac551c8575ec2507d9afc2a5fcba033Nick Coghlan            (".+__(get|set)slice__ has been removed", DeprecationWarning),
207913623662eac551c8575ec2507d9afc2a5fcba033Nick Coghlan            (r"sys.exc_clear\(\) not supported", DeprecationWarning),
208013623662eac551c8575ec2507d9afc2a5fcba033Nick Coghlan            quiet=True):
208107627880813ffaad8d9b90bfe8791ccf588b031bFlorent Xicluna        run(suite)
2082dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
2083146b7ab818cadccf91ad98e64cfefb77705da0caJesse Noller    ThreadsMixin.pool.terminate()
2084146b7ab818cadccf91ad98e64cfefb77705da0caJesse Noller    ProcessesMixin.pool.terminate()
2085146b7ab818cadccf91ad98e64cfefb77705da0caJesse Noller    ManagerMixin.pool.terminate()
2086146b7ab818cadccf91ad98e64cfefb77705da0caJesse Noller    ManagerMixin.manager.shutdown()
2087dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
2088146b7ab818cadccf91ad98e64cfefb77705da0caJesse Noller    del ProcessesMixin.pool, ThreadsMixin.pool, ManagerMixin.pool
2089dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
2090dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersondef main():
2091dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    test_main(unittest.TextTestRunner(verbosity=2).run)
2092dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
2093dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonif __name__ == '__main__':
2094dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    main()
2095