1dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson#
2dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# Unit tests for the multiprocessing package
3dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson#
4dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
5dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonimport unittest
6dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonimport Queue
7dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonimport time
8dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonimport sys
9dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonimport os
10dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonimport gc
11dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonimport signal
12dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonimport array
13dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonimport socket
14dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonimport random
15dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonimport logging
16a1a8da8bf5d6d27936702f9241c8726efd6b4b42Antoine Pitrouimport errno
17faee75c33af1e8ccbf0d4349efe62dc9637779c6Richard Oudkerkimport test.script_helper
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
35f8413b29c07babc49a2a891f8716f4fcda538489Charles-François Natalifrom multiprocessing import util
36f8413b29c07babc49a2a891f8716f4fcda538489Charles-François Natali
37f8413b29c07babc49a2a891f8716f4fcda538489Charles-François Natalitry:
38f8413b29c07babc49a2a891f8716f4fcda538489Charles-François Natali    from multiprocessing import reduction
39f8413b29c07babc49a2a891f8716f4fcda538489Charles-François Natali    HAS_REDUCTION = True
40f8413b29c07babc49a2a891f8716f4fcda538489Charles-François Nataliexcept ImportError:
41f8413b29c07babc49a2a891f8716f4fcda538489Charles-François Natali    HAS_REDUCTION = False
42dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
43a06e9b8f6b2edf4936146fa8867f12222106d0f8Brian Curtintry:
44a06e9b8f6b2edf4936146fa8867f12222106d0f8Brian Curtin    from multiprocessing.sharedctypes import Value, copy
45a06e9b8f6b2edf4936146fa8867f12222106d0f8Brian Curtin    HAS_SHAREDCTYPES = True
46a06e9b8f6b2edf4936146fa8867f12222106d0f8Brian Curtinexcept ImportError:
47a06e9b8f6b2edf4936146fa8867f12222106d0f8Brian Curtin    HAS_SHAREDCTYPES = False
48a06e9b8f6b2edf4936146fa8867f12222106d0f8Brian Curtin
49a1a8da8bf5d6d27936702f9241c8726efd6b4b42Antoine Pitroutry:
50a1a8da8bf5d6d27936702f9241c8726efd6b4b42Antoine Pitrou    import msvcrt
51a1a8da8bf5d6d27936702f9241c8726efd6b4b42Antoine Pitrouexcept ImportError:
52a1a8da8bf5d6d27936702f9241c8726efd6b4b42Antoine Pitrou    msvcrt = None
53a1a8da8bf5d6d27936702f9241c8726efd6b4b42Antoine Pitrou
54dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson#
55dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson#
56dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson#
57dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
58e79edf5f7c53f977b8e1fe8c00773e4668e35ea9Benjamin Petersonlatin = str
59dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
60dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson#
61dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# Constants
62dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson#
63dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
64dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin PetersonLOG_LEVEL = util.SUBWARNING
65654ade3e6afa2527d1f642be28d69e219bd58b71Jesse Noller#LOG_LEVEL = logging.DEBUG
66dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
67dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin PetersonDELTA = 0.1
68dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin PetersonCHECK_TIMINGS = False     # making true makes tests take a lot longer
69dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson                          # and can sometimes cause some non-serious
70dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson                          # failures because some calls block a bit
71dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson                          # longer than expected
72dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonif CHECK_TIMINGS:
73dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    TIMEOUT1, TIMEOUT2, TIMEOUT3 = 0.82, 0.35, 1.4
74dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonelse:
75dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    TIMEOUT1, TIMEOUT2, TIMEOUT3 = 0.1, 0.1, 0.1
76dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
77dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin PetersonHAVE_GETVALUE = not getattr(_multiprocessing,
78dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson                            'HAVE_BROKEN_SEM_GETVALUE', False)
79dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
809a5b2ad38d605206f05a52fe32868d3f839e8a86Jesse NollerWIN32 = (sys.platform == "win32")
819a5b2ad38d605206f05a52fe32868d3f839e8a86Jesse Noller
82a1a8da8bf5d6d27936702f9241c8726efd6b4b42Antoine Pitroutry:
83a1a8da8bf5d6d27936702f9241c8726efd6b4b42Antoine Pitrou    MAXFD = os.sysconf("SC_OPEN_MAX")
84a1a8da8bf5d6d27936702f9241c8726efd6b4b42Antoine Pitrouexcept:
85a1a8da8bf5d6d27936702f9241c8726efd6b4b42Antoine Pitrou    MAXFD = 256
86a1a8da8bf5d6d27936702f9241c8726efd6b4b42Antoine Pitrou
87dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson#
8836b9fbb803659350f9e6182b85f5bf66ca2a72a8Florent Xicluna# Some tests require ctypes
8936b9fbb803659350f9e6182b85f5bf66ca2a72a8Florent Xicluna#
9036b9fbb803659350f9e6182b85f5bf66ca2a72a8Florent Xicluna
9136b9fbb803659350f9e6182b85f5bf66ca2a72a8Florent Xiclunatry:
9213623662eac551c8575ec2507d9afc2a5fcba033Nick Coghlan    from ctypes import Structure, c_int, c_double
9336b9fbb803659350f9e6182b85f5bf66ca2a72a8Florent Xiclunaexcept ImportError:
9436b9fbb803659350f9e6182b85f5bf66ca2a72a8Florent Xicluna    Structure = object
9536b9fbb803659350f9e6182b85f5bf66ca2a72a8Florent Xicluna    c_int = c_double = None
9636b9fbb803659350f9e6182b85f5bf66ca2a72a8Florent Xicluna
976392d7f68bbc11e3ad3417f52c93f33dcc0c4cd0Charles-François Natali
986392d7f68bbc11e3ad3417f52c93f33dcc0c4cd0Charles-François Natalidef check_enough_semaphores():
996392d7f68bbc11e3ad3417f52c93f33dcc0c4cd0Charles-François Natali    """Check that the system supports enough semaphores to run the test."""
1006392d7f68bbc11e3ad3417f52c93f33dcc0c4cd0Charles-François Natali    # minimum number of semaphores available according to POSIX
1016392d7f68bbc11e3ad3417f52c93f33dcc0c4cd0Charles-François Natali    nsems_min = 256
1026392d7f68bbc11e3ad3417f52c93f33dcc0c4cd0Charles-François Natali    try:
1036392d7f68bbc11e3ad3417f52c93f33dcc0c4cd0Charles-François Natali        nsems = os.sysconf("SC_SEM_NSEMS_MAX")
1046392d7f68bbc11e3ad3417f52c93f33dcc0c4cd0Charles-François Natali    except (AttributeError, ValueError):
1056392d7f68bbc11e3ad3417f52c93f33dcc0c4cd0Charles-François Natali        # sysconf not available or setting not available
1066392d7f68bbc11e3ad3417f52c93f33dcc0c4cd0Charles-François Natali        return
1076392d7f68bbc11e3ad3417f52c93f33dcc0c4cd0Charles-François Natali    if nsems == -1 or nsems >= nsems_min:
1086392d7f68bbc11e3ad3417f52c93f33dcc0c4cd0Charles-François Natali        return
1096392d7f68bbc11e3ad3417f52c93f33dcc0c4cd0Charles-François Natali    raise unittest.SkipTest("The OS doesn't support enough semaphores "
1106392d7f68bbc11e3ad3417f52c93f33dcc0c4cd0Charles-François Natali                            "to run the test (required: %d)." % nsems_min)
1116392d7f68bbc11e3ad3417f52c93f33dcc0c4cd0Charles-François Natali
1126392d7f68bbc11e3ad3417f52c93f33dcc0c4cd0Charles-François Natali
11336b9fbb803659350f9e6182b85f5bf66ca2a72a8Florent Xicluna#
114dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# Creates a wrapper for a function which records the time it takes to finish
115dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson#
116dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
117dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonclass TimingWrapper(object):
118dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
119dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def __init__(self, func):
120dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.func = func
121dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.elapsed = None
122dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
123dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def __call__(self, *args, **kwds):
124dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        t = time.time()
125dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        try:
126dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            return self.func(*args, **kwds)
127dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        finally:
128dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            self.elapsed = time.time() - t
129dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
130dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson#
131dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# Base class for test cases
132dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson#
133dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
134dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonclass BaseTestCase(object):
135dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
136dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    ALLOWED_TYPES = ('processes', 'manager', 'threads')
137dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
138dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def assertTimingAlmostEqual(self, a, b):
139dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        if CHECK_TIMINGS:
140dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            self.assertAlmostEqual(a, b, 1)
141dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
142dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def assertReturnsIfImplemented(self, value, func, *args):
143dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        try:
144dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            res = func(*args)
145dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        except NotImplementedError:
146dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            pass
147dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        else:
148dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            return self.assertEqual(value, res)
149dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1504eb2b28553eceda5a19465534bc906929dd85243Antoine Pitrou    # For the sanity of Windows users, rather than crashing or freezing in
1514eb2b28553eceda5a19465534bc906929dd85243Antoine Pitrou    # multiple ways.
1524eb2b28553eceda5a19465534bc906929dd85243Antoine Pitrou    def __reduce__(self, *args):
1534eb2b28553eceda5a19465534bc906929dd85243Antoine Pitrou        raise NotImplementedError("shouldn't try to pickle a test case")
1544eb2b28553eceda5a19465534bc906929dd85243Antoine Pitrou
1554eb2b28553eceda5a19465534bc906929dd85243Antoine Pitrou    __reduce_ex__ = __reduce__
1564eb2b28553eceda5a19465534bc906929dd85243Antoine Pitrou
157dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson#
158dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# Return the value of a semaphore
159dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson#
160dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
161dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersondef get_value(self):
162dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    try:
163dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        return self.get_value()
164dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    except AttributeError:
165dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        try:
166dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            return self._Semaphore__value
167dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        except AttributeError:
168dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            try:
169dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson                return self._value
170dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            except AttributeError:
171dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson                raise NotImplementedError
172dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
173dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson#
174dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# Testcases
175dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson#
176dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
177dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonclass _TestProcess(BaseTestCase):
178dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
179dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    ALLOWED_TYPES = ('processes', 'threads')
180dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
181dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def test_current(self):
182dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        if self.TYPE == 'threads':
1831f70221b861a3714735251d57695b2f472d0599bZachary Ware            self.skipTest('test not appropriate for {}'.format(self.TYPE))
184dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
185dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        current = self.current_process()
1865bc9f4c09c99eb701dbee83fb9e26eed558e474fJesse Noller        authkey = current.authkey
187dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
188dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertTrue(current.is_alive())
1895bc9f4c09c99eb701dbee83fb9e26eed558e474fJesse Noller        self.assertTrue(not current.daemon)
190b0f5adc3f4e098b1744eeac65fc830fb1df2b8abEzio Melotti        self.assertIsInstance(authkey, bytes)
191dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertTrue(len(authkey) > 0)
1925bc9f4c09c99eb701dbee83fb9e26eed558e474fJesse Noller        self.assertEqual(current.ident, os.getpid())
1935bc9f4c09c99eb701dbee83fb9e26eed558e474fJesse Noller        self.assertEqual(current.exitcode, None)
194dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1954eb2b28553eceda5a19465534bc906929dd85243Antoine Pitrou    @classmethod
1964eb2b28553eceda5a19465534bc906929dd85243Antoine Pitrou    def _test(cls, q, *args, **kwds):
1974eb2b28553eceda5a19465534bc906929dd85243Antoine Pitrou        current = cls.current_process()
198dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        q.put(args)
199dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        q.put(kwds)
2005bc9f4c09c99eb701dbee83fb9e26eed558e474fJesse Noller        q.put(current.name)
2014eb2b28553eceda5a19465534bc906929dd85243Antoine Pitrou        if cls.TYPE != 'threads':
2025bc9f4c09c99eb701dbee83fb9e26eed558e474fJesse Noller            q.put(bytes(current.authkey))
203dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            q.put(current.pid)
204dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
205dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def test_process(self):
206dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        q = self.Queue(1)
207dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        e = self.Event()
208dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        args = (q, 1, 2)
209dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        kwargs = {'hello':23, 'bye':2.54}
210dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        name = 'SomeProcess'
211dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        p = self.Process(
212dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            target=self._test, args=args, kwargs=kwargs, name=name
213dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            )
2145bc9f4c09c99eb701dbee83fb9e26eed558e474fJesse Noller        p.daemon = True
215dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        current = self.current_process()
216dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
217dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        if self.TYPE != 'threads':
2182623a37852153363335956afab010cb0beb7e74eEzio Melotti            self.assertEqual(p.authkey, current.authkey)
2192623a37852153363335956afab010cb0beb7e74eEzio Melotti        self.assertEqual(p.is_alive(), False)
2202623a37852153363335956afab010cb0beb7e74eEzio Melotti        self.assertEqual(p.daemon, True)
221aa98058cc44ba20f35c106d20918c6196b737561Ezio Melotti        self.assertNotIn(p, self.active_children())
222dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertTrue(type(self.active_children()) is list)
2235bc9f4c09c99eb701dbee83fb9e26eed558e474fJesse Noller        self.assertEqual(p.exitcode, None)
224dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
225dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        p.start()
226dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
2272623a37852153363335956afab010cb0beb7e74eEzio Melotti        self.assertEqual(p.exitcode, None)
2282623a37852153363335956afab010cb0beb7e74eEzio Melotti        self.assertEqual(p.is_alive(), True)
229aa98058cc44ba20f35c106d20918c6196b737561Ezio Melotti        self.assertIn(p, self.active_children())
230dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
2312623a37852153363335956afab010cb0beb7e74eEzio Melotti        self.assertEqual(q.get(), args[1:])
2322623a37852153363335956afab010cb0beb7e74eEzio Melotti        self.assertEqual(q.get(), kwargs)
2332623a37852153363335956afab010cb0beb7e74eEzio Melotti        self.assertEqual(q.get(), p.name)
234dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        if self.TYPE != 'threads':
2352623a37852153363335956afab010cb0beb7e74eEzio Melotti            self.assertEqual(q.get(), current.authkey)
2362623a37852153363335956afab010cb0beb7e74eEzio Melotti            self.assertEqual(q.get(), p.pid)
237dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
238dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        p.join()
239dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
2402623a37852153363335956afab010cb0beb7e74eEzio Melotti        self.assertEqual(p.exitcode, 0)
2412623a37852153363335956afab010cb0beb7e74eEzio Melotti        self.assertEqual(p.is_alive(), False)
242aa98058cc44ba20f35c106d20918c6196b737561Ezio Melotti        self.assertNotIn(p, self.active_children())
243dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
2444eb2b28553eceda5a19465534bc906929dd85243Antoine Pitrou    @classmethod
2454eb2b28553eceda5a19465534bc906929dd85243Antoine Pitrou    def _test_terminate(cls):
246dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        time.sleep(1000)
247dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
248dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def test_terminate(self):
249dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        if self.TYPE == 'threads':
2501f70221b861a3714735251d57695b2f472d0599bZachary Ware            self.skipTest('test not appropriate for {}'.format(self.TYPE))
251dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
252dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        p = self.Process(target=self._test_terminate)
2535bc9f4c09c99eb701dbee83fb9e26eed558e474fJesse Noller        p.daemon = True
254dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        p.start()
255dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
256dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(p.is_alive(), True)
257aa98058cc44ba20f35c106d20918c6196b737561Ezio Melotti        self.assertIn(p, self.active_children())
2585bc9f4c09c99eb701dbee83fb9e26eed558e474fJesse Noller        self.assertEqual(p.exitcode, None)
259dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
260dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        p.terminate()
261dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
262dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        join = TimingWrapper(p.join)
263dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(join(), None)
264dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertTimingAlmostEqual(join.elapsed, 0.0)
265dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
266dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(p.is_alive(), False)
267aa98058cc44ba20f35c106d20918c6196b737561Ezio Melotti        self.assertNotIn(p, self.active_children())
268dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
269dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        p.join()
270dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
2715bc9f4c09c99eb701dbee83fb9e26eed558e474fJesse Noller        # XXX sometimes get p.exitcode == 0 on Windows ...
2725bc9f4c09c99eb701dbee83fb9e26eed558e474fJesse Noller        #self.assertEqual(p.exitcode, -signal.SIGTERM)
273dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
274dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def test_cpu_count(self):
275dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        try:
276dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            cpus = multiprocessing.cpu_count()
277dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        except NotImplementedError:
278dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            cpus = 1
279dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertTrue(type(cpus) is int)
280dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertTrue(cpus >= 1)
281dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
282dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def test_active_children(self):
283dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(type(self.active_children()), list)
284dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
285dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        p = self.Process(target=time.sleep, args=(DELTA,))
286aa98058cc44ba20f35c106d20918c6196b737561Ezio Melotti        self.assertNotIn(p, self.active_children())
287dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
2886f6016bc591305a9a99551ea7b1c467334c2b622Jesus Cea        p.daemon = True
289dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        p.start()
290aa98058cc44ba20f35c106d20918c6196b737561Ezio Melotti        self.assertIn(p, self.active_children())
291dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
292dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        p.join()
293aa98058cc44ba20f35c106d20918c6196b737561Ezio Melotti        self.assertNotIn(p, self.active_children())
294dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
2954eb2b28553eceda5a19465534bc906929dd85243Antoine Pitrou    @classmethod
2964eb2b28553eceda5a19465534bc906929dd85243Antoine Pitrou    def _test_recursion(cls, wconn, id):
297dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        from multiprocessing import forking
298dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        wconn.send(id)
299dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        if len(id) < 2:
300dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            for i in range(2):
3014eb2b28553eceda5a19465534bc906929dd85243Antoine Pitrou                p = cls.Process(
3024eb2b28553eceda5a19465534bc906929dd85243Antoine Pitrou                    target=cls._test_recursion, args=(wconn, id+[i])
303dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson                    )
304dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson                p.start()
305dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson                p.join()
306dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
307dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def test_recursion(self):
308dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        rconn, wconn = self.Pipe(duplex=False)
309dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self._test_recursion(wconn, [])
310dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
311dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        time.sleep(DELTA)
312dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        result = []
313dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        while rconn.poll():
314dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            result.append(rconn.recv())
315dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
316dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        expected = [
317dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            [],
318dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson              [0],
319dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson                [0, 0],
320dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson                [0, 1],
321dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson              [1],
322dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson                [1, 0],
323dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson                [1, 1]
324dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            ]
325dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(result, expected)
326dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
3272182e0578c21d9a89cb507300b5f2c5319dced93Richard Oudkerk    @classmethod
3282182e0578c21d9a89cb507300b5f2c5319dced93Richard Oudkerk    def _test_sys_exit(cls, reason, testfn):
3292182e0578c21d9a89cb507300b5f2c5319dced93Richard Oudkerk        sys.stderr = open(testfn, 'w')
3302182e0578c21d9a89cb507300b5f2c5319dced93Richard Oudkerk        sys.exit(reason)
3312182e0578c21d9a89cb507300b5f2c5319dced93Richard Oudkerk
3322182e0578c21d9a89cb507300b5f2c5319dced93Richard Oudkerk    def test_sys_exit(self):
3332182e0578c21d9a89cb507300b5f2c5319dced93Richard Oudkerk        # See Issue 13854
3342182e0578c21d9a89cb507300b5f2c5319dced93Richard Oudkerk        if self.TYPE == 'threads':
3351f70221b861a3714735251d57695b2f472d0599bZachary Ware            self.skipTest('test not appropriate for {}'.format(self.TYPE))
3362182e0578c21d9a89cb507300b5f2c5319dced93Richard Oudkerk
3372182e0578c21d9a89cb507300b5f2c5319dced93Richard Oudkerk        testfn = test_support.TESTFN
3382182e0578c21d9a89cb507300b5f2c5319dced93Richard Oudkerk        self.addCleanup(test_support.unlink, testfn)
3392182e0578c21d9a89cb507300b5f2c5319dced93Richard Oudkerk
3403f8376eaa258e6d39f7e2466ca214c26967eaa66Richard Oudkerk        for reason, code in (([1, 2, 3], 1), ('ignore this', 1)):
3412182e0578c21d9a89cb507300b5f2c5319dced93Richard Oudkerk            p = self.Process(target=self._test_sys_exit, args=(reason, testfn))
3422182e0578c21d9a89cb507300b5f2c5319dced93Richard Oudkerk            p.daemon = True
3432182e0578c21d9a89cb507300b5f2c5319dced93Richard Oudkerk            p.start()
3442182e0578c21d9a89cb507300b5f2c5319dced93Richard Oudkerk            p.join(5)
3452182e0578c21d9a89cb507300b5f2c5319dced93Richard Oudkerk            self.assertEqual(p.exitcode, code)
3462182e0578c21d9a89cb507300b5f2c5319dced93Richard Oudkerk
3472182e0578c21d9a89cb507300b5f2c5319dced93Richard Oudkerk            with open(testfn, 'r') as f:
3482182e0578c21d9a89cb507300b5f2c5319dced93Richard Oudkerk                self.assertEqual(f.read().rstrip(), str(reason))
3492182e0578c21d9a89cb507300b5f2c5319dced93Richard Oudkerk
3502182e0578c21d9a89cb507300b5f2c5319dced93Richard Oudkerk        for reason in (True, False, 8):
3512182e0578c21d9a89cb507300b5f2c5319dced93Richard Oudkerk            p = self.Process(target=sys.exit, args=(reason,))
3522182e0578c21d9a89cb507300b5f2c5319dced93Richard Oudkerk            p.daemon = True
3532182e0578c21d9a89cb507300b5f2c5319dced93Richard Oudkerk            p.start()
3542182e0578c21d9a89cb507300b5f2c5319dced93Richard Oudkerk            p.join(5)
3552182e0578c21d9a89cb507300b5f2c5319dced93Richard Oudkerk            self.assertEqual(p.exitcode, reason)
3562182e0578c21d9a89cb507300b5f2c5319dced93Richard Oudkerk
357dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson#
358dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson#
359dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson#
360dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
361dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonclass _UpperCaser(multiprocessing.Process):
362dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
363dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def __init__(self):
364dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        multiprocessing.Process.__init__(self)
365dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.child_conn, self.parent_conn = multiprocessing.Pipe()
366dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
367dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def run(self):
368dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.parent_conn.close()
369dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        for s in iter(self.child_conn.recv, None):
370dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            self.child_conn.send(s.upper())
371dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.child_conn.close()
372dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
373dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def submit(self, s):
374dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        assert type(s) is str
375dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.parent_conn.send(s)
376dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        return self.parent_conn.recv()
377dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
378dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def stop(self):
379dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.parent_conn.send(None)
380dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.parent_conn.close()
381dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.child_conn.close()
382dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
383dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonclass _TestSubclassingProcess(BaseTestCase):
384dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
385dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    ALLOWED_TYPES = ('processes',)
386dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
387dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def test_subclassing(self):
388dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        uppercaser = _UpperCaser()
3896f6016bc591305a9a99551ea7b1c467334c2b622Jesus Cea        uppercaser.daemon = True
390dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        uppercaser.start()
391dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(uppercaser.submit('hello'), 'HELLO')
392dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(uppercaser.submit('world'), 'WORLD')
393dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        uppercaser.stop()
394dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        uppercaser.join()
395dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
396dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson#
397dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson#
398dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson#
399dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
400dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersondef queue_empty(q):
401dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    if hasattr(q, 'empty'):
402dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        return q.empty()
403dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    else:
404dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        return q.qsize() == 0
405dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
406dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersondef queue_full(q, maxsize):
407dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    if hasattr(q, 'full'):
408dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        return q.full()
409dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    else:
410dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        return q.qsize() == maxsize
411dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
412dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
413dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonclass _TestQueue(BaseTestCase):
414dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
415dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
4164eb2b28553eceda5a19465534bc906929dd85243Antoine Pitrou    @classmethod
4174eb2b28553eceda5a19465534bc906929dd85243Antoine Pitrou    def _test_put(cls, queue, child_can_start, parent_can_continue):
418dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        child_can_start.wait()
419dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        for i in range(6):
420dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            queue.get()
421dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        parent_can_continue.set()
422dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
423dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def test_put(self):
424dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        MAXSIZE = 6
425dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        queue = self.Queue(maxsize=MAXSIZE)
426dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        child_can_start = self.Event()
427dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        parent_can_continue = self.Event()
428dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
429dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        proc = self.Process(
430dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            target=self._test_put,
431dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            args=(queue, child_can_start, parent_can_continue)
432dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            )
4335bc9f4c09c99eb701dbee83fb9e26eed558e474fJesse Noller        proc.daemon = True
434dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        proc.start()
435dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
436dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(queue_empty(queue), True)
437dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(queue_full(queue, MAXSIZE), False)
438dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
439dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        queue.put(1)
440dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        queue.put(2, True)
441dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        queue.put(3, True, None)
442dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        queue.put(4, False)
443dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        queue.put(5, False, None)
444dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        queue.put_nowait(6)
445dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
446dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        # the values may be in buffer but not yet in pipe so sleep a bit
447dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        time.sleep(DELTA)
448dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
449dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(queue_empty(queue), False)
450dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(queue_full(queue, MAXSIZE), True)
451dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
452dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        put = TimingWrapper(queue.put)
453dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        put_nowait = TimingWrapper(queue.put_nowait)
454dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
455dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertRaises(Queue.Full, put, 7, False)
456dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertTimingAlmostEqual(put.elapsed, 0)
457dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
458dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertRaises(Queue.Full, put, 7, False, None)
459dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertTimingAlmostEqual(put.elapsed, 0)
460dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
461dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertRaises(Queue.Full, put_nowait, 7)
462dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertTimingAlmostEqual(put_nowait.elapsed, 0)
463dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
464dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertRaises(Queue.Full, put, 7, True, TIMEOUT1)
465dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertTimingAlmostEqual(put.elapsed, TIMEOUT1)
466dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
467dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertRaises(Queue.Full, put, 7, False, TIMEOUT2)
468dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertTimingAlmostEqual(put.elapsed, 0)
469dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
470dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertRaises(Queue.Full, put, 7, True, timeout=TIMEOUT3)
471dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertTimingAlmostEqual(put.elapsed, TIMEOUT3)
472dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
473dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        child_can_start.set()
474dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        parent_can_continue.wait()
475dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
476dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(queue_empty(queue), True)
477dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(queue_full(queue, MAXSIZE), False)
478dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
479dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        proc.join()
480dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
4814eb2b28553eceda5a19465534bc906929dd85243Antoine Pitrou    @classmethod
4824eb2b28553eceda5a19465534bc906929dd85243Antoine Pitrou    def _test_get(cls, queue, child_can_start, parent_can_continue):
483dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        child_can_start.wait()
484da3a1b120055855a464c2d5f5143021ae8f5dc86Benjamin Peterson        #queue.put(1)
485dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        queue.put(2)
486dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        queue.put(3)
487dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        queue.put(4)
488dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        queue.put(5)
489dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        parent_can_continue.set()
490dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
491dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def test_get(self):
492dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        queue = self.Queue()
493dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        child_can_start = self.Event()
494dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        parent_can_continue = self.Event()
495dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
496dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        proc = self.Process(
497dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            target=self._test_get,
498dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            args=(queue, child_can_start, parent_can_continue)
499dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            )
5005bc9f4c09c99eb701dbee83fb9e26eed558e474fJesse Noller        proc.daemon = True
501dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        proc.start()
502dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
503dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(queue_empty(queue), True)
504dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
505dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        child_can_start.set()
506dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        parent_can_continue.wait()
507dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
508dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        time.sleep(DELTA)
509dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(queue_empty(queue), False)
510dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
511da3a1b120055855a464c2d5f5143021ae8f5dc86Benjamin Peterson        # Hangs unexpectedly, remove for now
512da3a1b120055855a464c2d5f5143021ae8f5dc86Benjamin Peterson        #self.assertEqual(queue.get(), 1)
513dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(queue.get(True, None), 2)
514dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(queue.get(True), 3)
515dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(queue.get(timeout=1), 4)
516dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(queue.get_nowait(), 5)
517dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
518dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(queue_empty(queue), True)
519dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
520dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        get = TimingWrapper(queue.get)
521dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        get_nowait = TimingWrapper(queue.get_nowait)
522dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
523dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertRaises(Queue.Empty, get, False)
524dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertTimingAlmostEqual(get.elapsed, 0)
525dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
526dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertRaises(Queue.Empty, get, False, None)
527dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertTimingAlmostEqual(get.elapsed, 0)
528dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
529dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertRaises(Queue.Empty, get_nowait)
530dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertTimingAlmostEqual(get_nowait.elapsed, 0)
531dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
532dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertRaises(Queue.Empty, get, True, TIMEOUT1)
533dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertTimingAlmostEqual(get.elapsed, TIMEOUT1)
534dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
535dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertRaises(Queue.Empty, get, False, TIMEOUT2)
536dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertTimingAlmostEqual(get.elapsed, 0)
537dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
538dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertRaises(Queue.Empty, get, timeout=TIMEOUT3)
539dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertTimingAlmostEqual(get.elapsed, TIMEOUT3)
540dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
541dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        proc.join()
542dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
5434eb2b28553eceda5a19465534bc906929dd85243Antoine Pitrou    @classmethod
5444eb2b28553eceda5a19465534bc906929dd85243Antoine Pitrou    def _test_fork(cls, queue):
545dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        for i in range(10, 20):
546dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            queue.put(i)
547dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        # note that at this point the items may only be buffered, so the
548dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        # process cannot shutdown until the feeder thread has finished
549dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        # pushing items onto the pipe.
550dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
551dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def test_fork(self):
552dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        # Old versions of Queue would fail to create a new feeder
553dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        # thread for a forked process if the original process had its
554dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        # own feeder thread.  This test checks that this no longer
555dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        # happens.
556dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
557dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        queue = self.Queue()
558dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
559dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        # put items on queue so that main process starts a feeder thread
560dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        for i in range(10):
561dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            queue.put(i)
562dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
563dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        # wait to make sure thread starts before we fork a new process
564dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        time.sleep(DELTA)
565dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
566dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        # fork process
567dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        p = self.Process(target=self._test_fork, args=(queue,))
5686f6016bc591305a9a99551ea7b1c467334c2b622Jesus Cea        p.daemon = True
569dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        p.start()
570dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
571dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        # check that all expected items are in the queue
572dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        for i in range(20):
573dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            self.assertEqual(queue.get(), i)
574dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertRaises(Queue.Empty, queue.get, False)
575dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
576dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        p.join()
577dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
578dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def test_qsize(self):
579dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        q = self.Queue()
580dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        try:
581dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            self.assertEqual(q.qsize(), 0)
582dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        except NotImplementedError:
5831f70221b861a3714735251d57695b2f472d0599bZachary Ware            self.skipTest('qsize method not implemented')
584dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        q.put(1)
585dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(q.qsize(), 1)
586dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        q.put(5)
587dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(q.qsize(), 2)
588dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        q.get()
589dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(q.qsize(), 1)
590dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        q.get()
591dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(q.qsize(), 0)
592dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
5934eb2b28553eceda5a19465534bc906929dd85243Antoine Pitrou    @classmethod
5944eb2b28553eceda5a19465534bc906929dd85243Antoine Pitrou    def _test_task_done(cls, q):
595dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        for obj in iter(q.get, None):
596dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            time.sleep(DELTA)
597dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            q.task_done()
598dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
599dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def test_task_done(self):
600dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        queue = self.JoinableQueue()
601dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
602dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        if sys.version_info < (2, 5) and not hasattr(queue, 'task_done'):
60336b9fbb803659350f9e6182b85f5bf66ca2a72a8Florent Xicluna            self.skipTest("requires 'queue.task_done()' method")
604dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
605dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        workers = [self.Process(target=self._test_task_done, args=(queue,))
606dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson                   for i in xrange(4)]
607dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
608dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        for p in workers:
6096f6016bc591305a9a99551ea7b1c467334c2b622Jesus Cea            p.daemon = True
610dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            p.start()
611dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
612dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        for i in xrange(10):
613dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            queue.put(i)
614dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
615dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        queue.join()
616dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
617dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        for p in workers:
618dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            queue.put(None)
619dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
620dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        for p in workers:
621dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            p.join()
622dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
623233e6988f4b439f160732dd5b55e9d1a06a64b47Serhiy Storchaka    def test_no_import_lock_contention(self):
624233e6988f4b439f160732dd5b55e9d1a06a64b47Serhiy Storchaka        with test_support.temp_cwd():
625233e6988f4b439f160732dd5b55e9d1a06a64b47Serhiy Storchaka            module_name = 'imported_by_an_imported_module'
626233e6988f4b439f160732dd5b55e9d1a06a64b47Serhiy Storchaka            with open(module_name + '.py', 'w') as f:
627233e6988f4b439f160732dd5b55e9d1a06a64b47Serhiy Storchaka                f.write("""if 1:
628233e6988f4b439f160732dd5b55e9d1a06a64b47Serhiy Storchaka                    import multiprocessing
629233e6988f4b439f160732dd5b55e9d1a06a64b47Serhiy Storchaka
630233e6988f4b439f160732dd5b55e9d1a06a64b47Serhiy Storchaka                    q = multiprocessing.Queue()
631233e6988f4b439f160732dd5b55e9d1a06a64b47Serhiy Storchaka                    q.put('knock knock')
632233e6988f4b439f160732dd5b55e9d1a06a64b47Serhiy Storchaka                    q.get(timeout=3)
633233e6988f4b439f160732dd5b55e9d1a06a64b47Serhiy Storchaka                    q.close()
634233e6988f4b439f160732dd5b55e9d1a06a64b47Serhiy Storchaka                """)
635233e6988f4b439f160732dd5b55e9d1a06a64b47Serhiy Storchaka
636233e6988f4b439f160732dd5b55e9d1a06a64b47Serhiy Storchaka            with test_support.DirsOnSysPath(os.getcwd()):
637233e6988f4b439f160732dd5b55e9d1a06a64b47Serhiy Storchaka                try:
638233e6988f4b439f160732dd5b55e9d1a06a64b47Serhiy Storchaka                    __import__(module_name)
639233e6988f4b439f160732dd5b55e9d1a06a64b47Serhiy Storchaka                except Queue.Empty:
640233e6988f4b439f160732dd5b55e9d1a06a64b47Serhiy Storchaka                    self.fail("Probable regression on import lock contention;"
641233e6988f4b439f160732dd5b55e9d1a06a64b47Serhiy Storchaka                              " see Issue #22853")
642233e6988f4b439f160732dd5b55e9d1a06a64b47Serhiy Storchaka
643dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson#
644dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson#
645dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson#
646dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
647dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonclass _TestLock(BaseTestCase):
648dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
649dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def test_lock(self):
650dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        lock = self.Lock()
651dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(lock.acquire(), True)
652dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(lock.acquire(False), False)
653dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(lock.release(), None)
654dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertRaises((ValueError, threading.ThreadError), lock.release)
655dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
656dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def test_rlock(self):
657dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        lock = self.RLock()
658dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(lock.acquire(), True)
659dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(lock.acquire(), True)
660dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(lock.acquire(), True)
661dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(lock.release(), None)
662dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(lock.release(), None)
663dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(lock.release(), None)
664dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertRaises((AssertionError, RuntimeError), lock.release)
665dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
66682eb5902ce169be81110c79662b772b904cd00fcJesse Noller    def test_lock_context(self):
66782eb5902ce169be81110c79662b772b904cd00fcJesse Noller        with self.Lock():
66882eb5902ce169be81110c79662b772b904cd00fcJesse Noller            pass
66982eb5902ce169be81110c79662b772b904cd00fcJesse Noller
670dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
671dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonclass _TestSemaphore(BaseTestCase):
672dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
673dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def _test_semaphore(self, sem):
674dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertReturnsIfImplemented(2, get_value, sem)
675dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(sem.acquire(), True)
676dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertReturnsIfImplemented(1, get_value, sem)
677dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(sem.acquire(), True)
678dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertReturnsIfImplemented(0, get_value, sem)
679dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(sem.acquire(False), False)
680dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertReturnsIfImplemented(0, get_value, sem)
681dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(sem.release(), None)
682dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertReturnsIfImplemented(1, get_value, sem)
683dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(sem.release(), None)
684dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertReturnsIfImplemented(2, get_value, sem)
685dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
686dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def test_semaphore(self):
687dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        sem = self.Semaphore(2)
688dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self._test_semaphore(sem)
689dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(sem.release(), None)
690dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertReturnsIfImplemented(3, get_value, sem)
691dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(sem.release(), None)
692dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertReturnsIfImplemented(4, get_value, sem)
693dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
694dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def test_bounded_semaphore(self):
695dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        sem = self.BoundedSemaphore(2)
696dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self._test_semaphore(sem)
697dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        # Currently fails on OS/X
698dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        #if HAVE_GETVALUE:
699dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        #    self.assertRaises(ValueError, sem.release)
700dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        #    self.assertReturnsIfImplemented(2, get_value, sem)
701dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
702dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def test_timeout(self):
703dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        if self.TYPE != 'processes':
7041f70221b861a3714735251d57695b2f472d0599bZachary Ware            self.skipTest('test not appropriate for {}'.format(self.TYPE))
705dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
706dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        sem = self.Semaphore(0)
707dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        acquire = TimingWrapper(sem.acquire)
708dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
709dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(acquire(False), False)
710dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertTimingAlmostEqual(acquire.elapsed, 0.0)
711dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
712dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(acquire(False, None), False)
713dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertTimingAlmostEqual(acquire.elapsed, 0.0)
714dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
715dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(acquire(False, TIMEOUT1), False)
716dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertTimingAlmostEqual(acquire.elapsed, 0)
717dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
718dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(acquire(True, TIMEOUT2), False)
719dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertTimingAlmostEqual(acquire.elapsed, TIMEOUT2)
720dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
721dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(acquire(timeout=TIMEOUT3), False)
722dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertTimingAlmostEqual(acquire.elapsed, TIMEOUT3)
723dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
724dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
725dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonclass _TestCondition(BaseTestCase):
726dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
7274eb2b28553eceda5a19465534bc906929dd85243Antoine Pitrou    @classmethod
7284eb2b28553eceda5a19465534bc906929dd85243Antoine Pitrou    def f(cls, cond, sleeping, woken, timeout=None):
729dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        cond.acquire()
730dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        sleeping.release()
731dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        cond.wait(timeout)
732dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        woken.release()
733dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        cond.release()
734dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
735dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def check_invariant(self, cond):
736dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        # this is only supposed to succeed when there are no sleepers
737dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        if self.TYPE == 'processes':
738dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            try:
739dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson                sleepers = (cond._sleeping_count.get_value() -
740dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson                            cond._woken_count.get_value())
741dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson                self.assertEqual(sleepers, 0)
742dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson                self.assertEqual(cond._wait_semaphore.get_value(), 0)
743dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            except NotImplementedError:
744dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson                pass
745dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
746dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def test_notify(self):
747dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        cond = self.Condition()
748dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        sleeping = self.Semaphore(0)
749dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        woken = self.Semaphore(0)
750dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
751dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        p = self.Process(target=self.f, args=(cond, sleeping, woken))
7525bc9f4c09c99eb701dbee83fb9e26eed558e474fJesse Noller        p.daemon = True
753dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        p.start()
754dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
755dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        p = threading.Thread(target=self.f, args=(cond, sleeping, woken))
7565bc9f4c09c99eb701dbee83fb9e26eed558e474fJesse Noller        p.daemon = True
757dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        p.start()
758dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
759dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        # wait for both children to start sleeping
760dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        sleeping.acquire()
761dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        sleeping.acquire()
762dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
763dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        # check no process/thread has woken up
764dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        time.sleep(DELTA)
765dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertReturnsIfImplemented(0, get_value, woken)
766dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
767dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        # wake up one process/thread
768dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        cond.acquire()
769dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        cond.notify()
770dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        cond.release()
771dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
772dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        # check one process/thread has woken up
773dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        time.sleep(DELTA)
774dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertReturnsIfImplemented(1, get_value, woken)
775dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
776dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        # wake up another
777dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        cond.acquire()
778dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        cond.notify()
779dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        cond.release()
780dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
781dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        # check other has woken up
782dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        time.sleep(DELTA)
783dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertReturnsIfImplemented(2, get_value, woken)
784dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
785dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        # check state is not mucked up
786dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.check_invariant(cond)
787dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        p.join()
788dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
789dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def test_notify_all(self):
790dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        cond = self.Condition()
791dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        sleeping = self.Semaphore(0)
792dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        woken = self.Semaphore(0)
793dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
794dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        # start some threads/processes which will timeout
795dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        for i in range(3):
796dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            p = self.Process(target=self.f,
797dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson                             args=(cond, sleeping, woken, TIMEOUT1))
7985bc9f4c09c99eb701dbee83fb9e26eed558e474fJesse Noller            p.daemon = True
799dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            p.start()
800dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
801dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            t = threading.Thread(target=self.f,
802dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson                                 args=(cond, sleeping, woken, TIMEOUT1))
803a9b2222de40ed62e6ec1c79f6a89607913f4babdBenjamin Peterson            t.daemon = True
804dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            t.start()
805dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
806dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        # wait for them all to sleep
807dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        for i in xrange(6):
808dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            sleeping.acquire()
809dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
810dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        # check they have all timed out
811dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        for i in xrange(6):
812dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            woken.acquire()
813dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertReturnsIfImplemented(0, get_value, woken)
814dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
815dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        # check state is not mucked up
816dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.check_invariant(cond)
817dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
818dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        # start some more threads/processes
819dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        for i in range(3):
820dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            p = self.Process(target=self.f, args=(cond, sleeping, woken))
8215bc9f4c09c99eb701dbee83fb9e26eed558e474fJesse Noller            p.daemon = True
822dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            p.start()
823dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
824dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            t = threading.Thread(target=self.f, args=(cond, sleeping, woken))
825a9b2222de40ed62e6ec1c79f6a89607913f4babdBenjamin Peterson            t.daemon = True
826dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            t.start()
827dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
828dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        # wait for them to all sleep
829dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        for i in xrange(6):
830dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            sleeping.acquire()
831dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
832dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        # check no process/thread has woken up
833dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        time.sleep(DELTA)
834dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertReturnsIfImplemented(0, get_value, woken)
835dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
836dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        # wake them all up
837dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        cond.acquire()
838dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        cond.notify_all()
839dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        cond.release()
840dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
841dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        # check they have all woken
842dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        time.sleep(DELTA)
843dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertReturnsIfImplemented(6, get_value, woken)
844dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
845dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        # check state is not mucked up
846dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.check_invariant(cond)
847dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
848dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def test_timeout(self):
849dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        cond = self.Condition()
850dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        wait = TimingWrapper(cond.wait)
851dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        cond.acquire()
852dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        res = wait(TIMEOUT1)
853dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        cond.release()
854dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(res, None)
855dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertTimingAlmostEqual(wait.elapsed, TIMEOUT1)
856dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
857dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
858dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonclass _TestEvent(BaseTestCase):
859dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
8604eb2b28553eceda5a19465534bc906929dd85243Antoine Pitrou    @classmethod
8614eb2b28553eceda5a19465534bc906929dd85243Antoine Pitrou    def _test_event(cls, event):
862dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        time.sleep(TIMEOUT2)
863dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        event.set()
864dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
865dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def test_event(self):
866dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        event = self.Event()
867dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        wait = TimingWrapper(event.wait)
868dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
869c2077b0d9b5bf99768c6f396bf7ae6c41b682465Ezio Melotti        # Removed temporarily, due to API shear, this does not
870dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        # work with threading._Event objects. is_set == isSet
87102cb0eb231fc01e2a50cbe14f6da7a8df52959efJesse Noller        self.assertEqual(event.is_set(), False)
872dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
87302cb0eb231fc01e2a50cbe14f6da7a8df52959efJesse Noller        # Removed, threading.Event.wait() will return the value of the __flag
87402cb0eb231fc01e2a50cbe14f6da7a8df52959efJesse Noller        # instead of None. API Shear with the semaphore backed mp.Event
87502cb0eb231fc01e2a50cbe14f6da7a8df52959efJesse Noller        self.assertEqual(wait(0.0), False)
876dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertTimingAlmostEqual(wait.elapsed, 0.0)
87702cb0eb231fc01e2a50cbe14f6da7a8df52959efJesse Noller        self.assertEqual(wait(TIMEOUT1), False)
878dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertTimingAlmostEqual(wait.elapsed, TIMEOUT1)
879dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
880dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        event.set()
881dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
882dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        # See note above on the API differences
88302cb0eb231fc01e2a50cbe14f6da7a8df52959efJesse Noller        self.assertEqual(event.is_set(), True)
88402cb0eb231fc01e2a50cbe14f6da7a8df52959efJesse Noller        self.assertEqual(wait(), True)
885dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertTimingAlmostEqual(wait.elapsed, 0.0)
88602cb0eb231fc01e2a50cbe14f6da7a8df52959efJesse Noller        self.assertEqual(wait(TIMEOUT1), True)
887dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertTimingAlmostEqual(wait.elapsed, 0.0)
888dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        # self.assertEqual(event.is_set(), True)
889dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
890dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        event.clear()
891dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
892dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        #self.assertEqual(event.is_set(), False)
893dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
8946f6016bc591305a9a99551ea7b1c467334c2b622Jesus Cea        p = self.Process(target=self._test_event, args=(event,))
8956f6016bc591305a9a99551ea7b1c467334c2b622Jesus Cea        p.daemon = True
8966f6016bc591305a9a99551ea7b1c467334c2b622Jesus Cea        p.start()
89702cb0eb231fc01e2a50cbe14f6da7a8df52959efJesse Noller        self.assertEqual(wait(), True)
898dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
899dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson#
900dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson#
901dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson#
902dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
903dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonclass _TestValue(BaseTestCase):
904dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
90536b9fbb803659350f9e6182b85f5bf66ca2a72a8Florent Xicluna    ALLOWED_TYPES = ('processes',)
90636b9fbb803659350f9e6182b85f5bf66ca2a72a8Florent Xicluna
907dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    codes_values = [
908dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        ('i', 4343, 24234),
909dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        ('d', 3.625, -4.25),
910dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        ('h', -232, 234),
911dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        ('c', latin('x'), latin('y'))
912dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        ]
913dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
91455d935a145710c2609c234df47b1172b52c3dcd9Antoine Pitrou    def setUp(self):
91555d935a145710c2609c234df47b1172b52c3dcd9Antoine Pitrou        if not HAS_SHAREDCTYPES:
91655d935a145710c2609c234df47b1172b52c3dcd9Antoine Pitrou            self.skipTest("requires multiprocessing.sharedctypes")
91755d935a145710c2609c234df47b1172b52c3dcd9Antoine Pitrou
9184eb2b28553eceda5a19465534bc906929dd85243Antoine Pitrou    @classmethod
9194eb2b28553eceda5a19465534bc906929dd85243Antoine Pitrou    def _test(cls, values):
9204eb2b28553eceda5a19465534bc906929dd85243Antoine Pitrou        for sv, cv in zip(values, cls.codes_values):
921dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            sv.value = cv[2]
922dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
923dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
924dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def test_value(self, raw=False):
925dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        if raw:
926dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            values = [self.RawValue(code, value)
927dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson                      for code, value, _ in self.codes_values]
928dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        else:
929dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            values = [self.Value(code, value)
930dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson                      for code, value, _ in self.codes_values]
931dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
932dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        for sv, cv in zip(values, self.codes_values):
933dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            self.assertEqual(sv.value, cv[1])
934dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
935dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        proc = self.Process(target=self._test, args=(values,))
9366f6016bc591305a9a99551ea7b1c467334c2b622Jesus Cea        proc.daemon = True
937dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        proc.start()
938dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        proc.join()
939dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
940dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        for sv, cv in zip(values, self.codes_values):
941dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            self.assertEqual(sv.value, cv[2])
942dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
943dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def test_rawvalue(self):
944dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.test_value(raw=True)
945dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
946dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def test_getobj_getlock(self):
947dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        val1 = self.Value('i', 5)
948dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        lock1 = val1.get_lock()
949dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        obj1 = val1.get_obj()
950dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
951dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        val2 = self.Value('i', 5, lock=None)
952dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        lock2 = val2.get_lock()
953dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        obj2 = val2.get_obj()
954dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
955dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        lock = self.Lock()
956dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        val3 = self.Value('i', 5, lock=lock)
957dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        lock3 = val3.get_lock()
958dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        obj3 = val3.get_obj()
959dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(lock, lock3)
960dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
9616ab22154ddabdb67bd510a1f2e0aa9c7e0ee607dJesse Noller        arr4 = self.Value('i', 5, lock=False)
962dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertFalse(hasattr(arr4, 'get_lock'))
963dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertFalse(hasattr(arr4, 'get_obj'))
964dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
9656ab22154ddabdb67bd510a1f2e0aa9c7e0ee607dJesse Noller        self.assertRaises(AttributeError, self.Value, 'i', 5, lock='navalue')
9666ab22154ddabdb67bd510a1f2e0aa9c7e0ee607dJesse Noller
9676ab22154ddabdb67bd510a1f2e0aa9c7e0ee607dJesse Noller        arr5 = self.RawValue('i', 5)
9686ab22154ddabdb67bd510a1f2e0aa9c7e0ee607dJesse Noller        self.assertFalse(hasattr(arr5, 'get_lock'))
9696ab22154ddabdb67bd510a1f2e0aa9c7e0ee607dJesse Noller        self.assertFalse(hasattr(arr5, 'get_obj'))
9706ab22154ddabdb67bd510a1f2e0aa9c7e0ee607dJesse Noller
971dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
972dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonclass _TestArray(BaseTestCase):
973dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
97436b9fbb803659350f9e6182b85f5bf66ca2a72a8Florent Xicluna    ALLOWED_TYPES = ('processes',)
97536b9fbb803659350f9e6182b85f5bf66ca2a72a8Florent Xicluna
9764eb2b28553eceda5a19465534bc906929dd85243Antoine Pitrou    @classmethod
9774eb2b28553eceda5a19465534bc906929dd85243Antoine Pitrou    def f(cls, seq):
978dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        for i in range(1, len(seq)):
979dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            seq[i] += seq[i-1]
980dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
98136b9fbb803659350f9e6182b85f5bf66ca2a72a8Florent Xicluna    @unittest.skipIf(c_int is None, "requires _ctypes")
982dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def test_array(self, raw=False):
983dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        seq = [680, 626, 934, 821, 150, 233, 548, 982, 714, 831]
984dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        if raw:
985dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            arr = self.RawArray('i', seq)
986dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        else:
987dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            arr = self.Array('i', seq)
988dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
989dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(len(arr), len(seq))
990dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(arr[3], seq[3])
991dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(list(arr[2:7]), list(seq[2:7]))
992dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
993dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        arr[4:8] = seq[4:8] = array.array('i', [1, 2, 3, 4])
994dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
995dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(list(arr[:]), seq)
996dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
997dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.f(seq)
998dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
999dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        p = self.Process(target=self.f, args=(arr,))
10006f6016bc591305a9a99551ea7b1c467334c2b622Jesus Cea        p.daemon = True
1001dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        p.start()
1002dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        p.join()
1003dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1004dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(list(arr[:]), seq)
1005dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
100636b9fbb803659350f9e6182b85f5bf66ca2a72a8Florent Xicluna    @unittest.skipIf(c_int is None, "requires _ctypes")
1007d3cb2f6e2cd837bd6a0258a8e4e6699d703cf8b4Mark Dickinson    def test_array_from_size(self):
1008d3cb2f6e2cd837bd6a0258a8e4e6699d703cf8b4Mark Dickinson        size = 10
1009d3cb2f6e2cd837bd6a0258a8e4e6699d703cf8b4Mark Dickinson        # Test for zeroing (see issue #11675).
1010d3cb2f6e2cd837bd6a0258a8e4e6699d703cf8b4Mark Dickinson        # The repetition below strengthens the test by increasing the chances
1011d3cb2f6e2cd837bd6a0258a8e4e6699d703cf8b4Mark Dickinson        # of previously allocated non-zero memory being used for the new array
1012d3cb2f6e2cd837bd6a0258a8e4e6699d703cf8b4Mark Dickinson        # on the 2nd and 3rd loops.
1013d3cb2f6e2cd837bd6a0258a8e4e6699d703cf8b4Mark Dickinson        for _ in range(3):
1014d3cb2f6e2cd837bd6a0258a8e4e6699d703cf8b4Mark Dickinson            arr = self.Array('i', size)
1015d3cb2f6e2cd837bd6a0258a8e4e6699d703cf8b4Mark Dickinson            self.assertEqual(len(arr), size)
1016d3cb2f6e2cd837bd6a0258a8e4e6699d703cf8b4Mark Dickinson            self.assertEqual(list(arr), [0] * size)
1017d3cb2f6e2cd837bd6a0258a8e4e6699d703cf8b4Mark Dickinson            arr[:] = range(10)
1018d3cb2f6e2cd837bd6a0258a8e4e6699d703cf8b4Mark Dickinson            self.assertEqual(list(arr), range(10))
1019d3cb2f6e2cd837bd6a0258a8e4e6699d703cf8b4Mark Dickinson            del arr
1020d3cb2f6e2cd837bd6a0258a8e4e6699d703cf8b4Mark Dickinson
1021d3cb2f6e2cd837bd6a0258a8e4e6699d703cf8b4Mark Dickinson    @unittest.skipIf(c_int is None, "requires _ctypes")
1022dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def test_rawarray(self):
1023dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.test_array(raw=True)
1024dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
102536b9fbb803659350f9e6182b85f5bf66ca2a72a8Florent Xicluna    @unittest.skipIf(c_int is None, "requires _ctypes")
1026f9e9a6f403af61c6aead4cfe766fb1efbb058171Mark Dickinson    def test_array_accepts_long(self):
1027f9e9a6f403af61c6aead4cfe766fb1efbb058171Mark Dickinson        arr = self.Array('i', 10L)
1028f9e9a6f403af61c6aead4cfe766fb1efbb058171Mark Dickinson        self.assertEqual(len(arr), 10)
1029f9e9a6f403af61c6aead4cfe766fb1efbb058171Mark Dickinson        raw_arr = self.RawArray('i', 10L)
1030f9e9a6f403af61c6aead4cfe766fb1efbb058171Mark Dickinson        self.assertEqual(len(raw_arr), 10)
1031f9e9a6f403af61c6aead4cfe766fb1efbb058171Mark Dickinson
1032f9e9a6f403af61c6aead4cfe766fb1efbb058171Mark Dickinson    @unittest.skipIf(c_int is None, "requires _ctypes")
1033dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def test_getobj_getlock_obj(self):
1034dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        arr1 = self.Array('i', range(10))
1035dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        lock1 = arr1.get_lock()
1036dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        obj1 = arr1.get_obj()
1037dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1038dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        arr2 = self.Array('i', range(10), lock=None)
1039dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        lock2 = arr2.get_lock()
1040dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        obj2 = arr2.get_obj()
1041dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1042dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        lock = self.Lock()
1043dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        arr3 = self.Array('i', range(10), lock=lock)
1044dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        lock3 = arr3.get_lock()
1045dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        obj3 = arr3.get_obj()
1046dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(lock, lock3)
1047dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
10486ab22154ddabdb67bd510a1f2e0aa9c7e0ee607dJesse Noller        arr4 = self.Array('i', range(10), lock=False)
1049dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertFalse(hasattr(arr4, 'get_lock'))
1050dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertFalse(hasattr(arr4, 'get_obj'))
10516ab22154ddabdb67bd510a1f2e0aa9c7e0ee607dJesse Noller        self.assertRaises(AttributeError,
10526ab22154ddabdb67bd510a1f2e0aa9c7e0ee607dJesse Noller                          self.Array, 'i', range(10), lock='notalock')
10536ab22154ddabdb67bd510a1f2e0aa9c7e0ee607dJesse Noller
10546ab22154ddabdb67bd510a1f2e0aa9c7e0ee607dJesse Noller        arr5 = self.RawArray('i', range(10))
10556ab22154ddabdb67bd510a1f2e0aa9c7e0ee607dJesse Noller        self.assertFalse(hasattr(arr5, 'get_lock'))
10566ab22154ddabdb67bd510a1f2e0aa9c7e0ee607dJesse Noller        self.assertFalse(hasattr(arr5, 'get_obj'))
1057dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1058dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson#
1059dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson#
1060dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson#
1061dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1062dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonclass _TestContainers(BaseTestCase):
1063dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1064dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    ALLOWED_TYPES = ('manager',)
1065dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1066dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def test_list(self):
1067dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        a = self.list(range(10))
1068dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(a[:], range(10))
1069dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1070dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        b = self.list()
1071dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(b[:], [])
1072dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1073dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        b.extend(range(5))
1074dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(b[:], range(5))
1075dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1076dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(b[2], 2)
1077dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(b[2:10], [2,3,4])
1078dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1079dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        b *= 2
1080dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(b[:], [0, 1, 2, 3, 4, 0, 1, 2, 3, 4])
1081dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1082dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(b + [5, 6], [0, 1, 2, 3, 4, 0, 1, 2, 3, 4, 5, 6])
1083dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1084dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(a[:], range(10))
1085dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1086dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        d = [a, b]
1087dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        e = self.list(d)
1088dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(
1089dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            e[:],
1090dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            [[0, 1, 2, 3, 4, 5, 6, 7, 8, 9], [0, 1, 2, 3, 4, 0, 1, 2, 3, 4]]
1091dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            )
1092dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1093dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        f = self.list([a])
1094dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        a.append('hello')
1095dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(f[:], [[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 'hello']])
1096dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1097dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def test_dict(self):
1098dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        d = self.dict()
1099dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        indices = range(65, 70)
1100dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        for i in indices:
1101dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            d[i] = chr(i)
1102dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(d.copy(), dict((i, chr(i)) for i in indices))
1103dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(sorted(d.keys()), indices)
1104dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(sorted(d.values()), [chr(i) for i in indices])
1105dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(sorted(d.items()), [(i, chr(i)) for i in indices])
1106dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1107dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def test_namespace(self):
1108dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        n = self.Namespace()
1109dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        n.name = 'Bob'
1110dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        n.job = 'Builder'
1111dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        n._hidden = 'hidden'
1112dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual((n.name, n.job), ('Bob', 'Builder'))
1113dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        del n.job
1114dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(str(n), "Namespace(name='Bob')")
1115dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertTrue(hasattr(n, 'name'))
1116dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertTrue(not hasattr(n, 'job'))
1117dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1118dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson#
1119dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson#
1120dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson#
1121dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1122dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersondef sqr(x, wait=0.0):
1123dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    time.sleep(wait)
1124dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    return x*x
11257c26be5b18d71c1c9863d81f1f478bb803e8bd5cSerhiy Storchaka
11267c26be5b18d71c1c9863d81f1f478bb803e8bd5cSerhiy Storchakaclass SayWhenError(ValueError): pass
11277c26be5b18d71c1c9863d81f1f478bb803e8bd5cSerhiy Storchaka
11287c26be5b18d71c1c9863d81f1f478bb803e8bd5cSerhiy Storchakadef exception_throwing_generator(total, when):
11297c26be5b18d71c1c9863d81f1f478bb803e8bd5cSerhiy Storchaka    for i in range(total):
11307c26be5b18d71c1c9863d81f1f478bb803e8bd5cSerhiy Storchaka        if i == when:
11317c26be5b18d71c1c9863d81f1f478bb803e8bd5cSerhiy Storchaka            raise SayWhenError("Somebody said when")
11327c26be5b18d71c1c9863d81f1f478bb803e8bd5cSerhiy Storchaka        yield i
11337c26be5b18d71c1c9863d81f1f478bb803e8bd5cSerhiy Storchaka
1134dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonclass _TestPool(BaseTestCase):
1135dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1136dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def test_apply(self):
1137dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        papply = self.pool.apply
1138dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(papply(sqr, (5,)), sqr(5))
1139dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(papply(sqr, (), {'x':3}), sqr(x=3))
1140dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1141dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def test_map(self):
1142dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        pmap = self.pool.map
1143dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(pmap(sqr, range(10)), map(sqr, range(10)))
1144dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(pmap(sqr, range(100), chunksize=20),
1145dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson                         map(sqr, range(100)))
1146dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
114721aad9792f4f7ebaac76ca552851e937de2e1538Richard Oudkerk    def test_map_unplicklable(self):
114821aad9792f4f7ebaac76ca552851e937de2e1538Richard Oudkerk        # Issue #19425 -- failure to pickle should not cause a hang
114921aad9792f4f7ebaac76ca552851e937de2e1538Richard Oudkerk        if self.TYPE == 'threads':
11501f70221b861a3714735251d57695b2f472d0599bZachary Ware            self.skipTest('test not appropriate for {}'.format(self.TYPE))
115121aad9792f4f7ebaac76ca552851e937de2e1538Richard Oudkerk        class A(object):
115221aad9792f4f7ebaac76ca552851e937de2e1538Richard Oudkerk            def __reduce__(self):
115321aad9792f4f7ebaac76ca552851e937de2e1538Richard Oudkerk                raise RuntimeError('cannot pickle')
115421aad9792f4f7ebaac76ca552851e937de2e1538Richard Oudkerk        with self.assertRaises(RuntimeError):
115521aad9792f4f7ebaac76ca552851e937de2e1538Richard Oudkerk            self.pool.map(sqr, [A()]*10)
115621aad9792f4f7ebaac76ca552851e937de2e1538Richard Oudkerk
11577530e47948446f03a79ad7dec4cc129ad3388418Jesse Noller    def test_map_chunksize(self):
11587530e47948446f03a79ad7dec4cc129ad3388418Jesse Noller        try:
11597530e47948446f03a79ad7dec4cc129ad3388418Jesse Noller            self.pool.map_async(sqr, [], chunksize=1).get(timeout=TIMEOUT1)
11607530e47948446f03a79ad7dec4cc129ad3388418Jesse Noller        except multiprocessing.TimeoutError:
11617530e47948446f03a79ad7dec4cc129ad3388418Jesse Noller            self.fail("pool.map_async with chunksize stalled on null list")
11627530e47948446f03a79ad7dec4cc129ad3388418Jesse Noller
1163dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def test_async(self):
1164dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        res = self.pool.apply_async(sqr, (7, TIMEOUT1,))
1165dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        get = TimingWrapper(res.get)
1166dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(get(), 49)
1167dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertTimingAlmostEqual(get.elapsed, TIMEOUT1)
1168dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1169dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def test_async_timeout(self):
117065162a7ccacb12801121fa7369fd0d406e8c6f64Richard Oudkerk        res = self.pool.apply_async(sqr, (6, TIMEOUT2 + 1.0))
1171dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        get = TimingWrapper(res.get)
1172dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertRaises(multiprocessing.TimeoutError, get, timeout=TIMEOUT2)
1173dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertTimingAlmostEqual(get.elapsed, TIMEOUT2)
1174dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1175dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def test_imap(self):
1176dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        it = self.pool.imap(sqr, range(10))
1177dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(list(it), map(sqr, range(10)))
1178dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1179dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        it = self.pool.imap(sqr, range(10))
1180dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        for i in range(10):
1181dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            self.assertEqual(it.next(), i*i)
1182dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertRaises(StopIteration, it.next)
1183dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1184dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        it = self.pool.imap(sqr, range(1000), chunksize=100)
1185dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        for i in range(1000):
1186dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            self.assertEqual(it.next(), i*i)
1187dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertRaises(StopIteration, it.next)
1188dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
11897c26be5b18d71c1c9863d81f1f478bb803e8bd5cSerhiy Storchaka    def test_imap_handle_iterable_exception(self):
11907c26be5b18d71c1c9863d81f1f478bb803e8bd5cSerhiy Storchaka        if self.TYPE == 'manager':
11917c26be5b18d71c1c9863d81f1f478bb803e8bd5cSerhiy Storchaka            self.skipTest('test not appropriate for {}'.format(self.TYPE))
11927c26be5b18d71c1c9863d81f1f478bb803e8bd5cSerhiy Storchaka
11937c26be5b18d71c1c9863d81f1f478bb803e8bd5cSerhiy Storchaka        it = self.pool.imap(sqr, exception_throwing_generator(10, 3), 1)
11947c26be5b18d71c1c9863d81f1f478bb803e8bd5cSerhiy Storchaka        for i in range(3):
11957c26be5b18d71c1c9863d81f1f478bb803e8bd5cSerhiy Storchaka            self.assertEqual(next(it), i*i)
11967c26be5b18d71c1c9863d81f1f478bb803e8bd5cSerhiy Storchaka        self.assertRaises(SayWhenError, it.next)
11977c26be5b18d71c1c9863d81f1f478bb803e8bd5cSerhiy Storchaka
11987c26be5b18d71c1c9863d81f1f478bb803e8bd5cSerhiy Storchaka        # SayWhenError seen at start of problematic chunk's results
11997c26be5b18d71c1c9863d81f1f478bb803e8bd5cSerhiy Storchaka        it = self.pool.imap(sqr, exception_throwing_generator(20, 7), 2)
12007c26be5b18d71c1c9863d81f1f478bb803e8bd5cSerhiy Storchaka        for i in range(6):
12017c26be5b18d71c1c9863d81f1f478bb803e8bd5cSerhiy Storchaka            self.assertEqual(next(it), i*i)
12027c26be5b18d71c1c9863d81f1f478bb803e8bd5cSerhiy Storchaka        self.assertRaises(SayWhenError, it.next)
12037c26be5b18d71c1c9863d81f1f478bb803e8bd5cSerhiy Storchaka        it = self.pool.imap(sqr, exception_throwing_generator(20, 7), 4)
12047c26be5b18d71c1c9863d81f1f478bb803e8bd5cSerhiy Storchaka        for i in range(4):
12057c26be5b18d71c1c9863d81f1f478bb803e8bd5cSerhiy Storchaka            self.assertEqual(next(it), i*i)
12067c26be5b18d71c1c9863d81f1f478bb803e8bd5cSerhiy Storchaka        self.assertRaises(SayWhenError, it.next)
12077c26be5b18d71c1c9863d81f1f478bb803e8bd5cSerhiy Storchaka
1208dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def test_imap_unordered(self):
1209dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        it = self.pool.imap_unordered(sqr, range(1000))
1210dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(sorted(it), map(sqr, range(1000)))
1211dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1212dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        it = self.pool.imap_unordered(sqr, range(1000), chunksize=53)
1213dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(sorted(it), map(sqr, range(1000)))
1214dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
12157c26be5b18d71c1c9863d81f1f478bb803e8bd5cSerhiy Storchaka    def test_imap_unordered_handle_iterable_exception(self):
12167c26be5b18d71c1c9863d81f1f478bb803e8bd5cSerhiy Storchaka        if self.TYPE == 'manager':
12177c26be5b18d71c1c9863d81f1f478bb803e8bd5cSerhiy Storchaka            self.skipTest('test not appropriate for {}'.format(self.TYPE))
12187c26be5b18d71c1c9863d81f1f478bb803e8bd5cSerhiy Storchaka
12197c26be5b18d71c1c9863d81f1f478bb803e8bd5cSerhiy Storchaka        it = self.pool.imap_unordered(sqr,
12207c26be5b18d71c1c9863d81f1f478bb803e8bd5cSerhiy Storchaka                                      exception_throwing_generator(10, 3),
12217c26be5b18d71c1c9863d81f1f478bb803e8bd5cSerhiy Storchaka                                      1)
122289c3b8e480146b260006097201f0627fa23e4b57Serhiy Storchaka        expected_values = map(sqr, range(10))
12237c26be5b18d71c1c9863d81f1f478bb803e8bd5cSerhiy Storchaka        with self.assertRaises(SayWhenError):
12247c26be5b18d71c1c9863d81f1f478bb803e8bd5cSerhiy Storchaka            # imap_unordered makes it difficult to anticipate the SayWhenError
12257c26be5b18d71c1c9863d81f1f478bb803e8bd5cSerhiy Storchaka            for i in range(10):
122689c3b8e480146b260006097201f0627fa23e4b57Serhiy Storchaka                value = next(it)
122789c3b8e480146b260006097201f0627fa23e4b57Serhiy Storchaka                self.assertIn(value, expected_values)
122889c3b8e480146b260006097201f0627fa23e4b57Serhiy Storchaka                expected_values.remove(value)
12297c26be5b18d71c1c9863d81f1f478bb803e8bd5cSerhiy Storchaka
12307c26be5b18d71c1c9863d81f1f478bb803e8bd5cSerhiy Storchaka        it = self.pool.imap_unordered(sqr,
12317c26be5b18d71c1c9863d81f1f478bb803e8bd5cSerhiy Storchaka                                      exception_throwing_generator(20, 7),
12327c26be5b18d71c1c9863d81f1f478bb803e8bd5cSerhiy Storchaka                                      2)
123389c3b8e480146b260006097201f0627fa23e4b57Serhiy Storchaka        expected_values = map(sqr, range(20))
12347c26be5b18d71c1c9863d81f1f478bb803e8bd5cSerhiy Storchaka        with self.assertRaises(SayWhenError):
12357c26be5b18d71c1c9863d81f1f478bb803e8bd5cSerhiy Storchaka            for i in range(20):
123689c3b8e480146b260006097201f0627fa23e4b57Serhiy Storchaka                value = next(it)
123789c3b8e480146b260006097201f0627fa23e4b57Serhiy Storchaka                self.assertIn(value, expected_values)
123889c3b8e480146b260006097201f0627fa23e4b57Serhiy Storchaka                expected_values.remove(value)
12397c26be5b18d71c1c9863d81f1f478bb803e8bd5cSerhiy Storchaka
1240dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def test_make_pool(self):
1241f64a0cffca141fa0a8f1138b5f069ea0da446c9fVictor Stinner        self.assertRaises(ValueError, multiprocessing.Pool, -1)
1242f64a0cffca141fa0a8f1138b5f069ea0da446c9fVictor Stinner        self.assertRaises(ValueError, multiprocessing.Pool, 0)
1243f64a0cffca141fa0a8f1138b5f069ea0da446c9fVictor Stinner
1244dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        p = multiprocessing.Pool(3)
1245dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(3, len(p._pool))
1246dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        p.close()
1247dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        p.join()
1248dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1249dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def test_terminate(self):
12506d24a6e0bbd1e073ce183d15463066d6ae59dbd4Richard Oudkerk        p = self.Pool(4)
12516d24a6e0bbd1e073ce183d15463066d6ae59dbd4Richard Oudkerk        result = p.map_async(
1252dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            time.sleep, [0.1 for i in range(10000)], chunksize=1
1253dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            )
12546d24a6e0bbd1e073ce183d15463066d6ae59dbd4Richard Oudkerk        p.terminate()
12556d24a6e0bbd1e073ce183d15463066d6ae59dbd4Richard Oudkerk        join = TimingWrapper(p.join)
1256dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        join()
1257dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertTrue(join.elapsed < 0.2)
1258654ade3e6afa2527d1f642be28d69e219bd58b71Jesse Noller
1259d44a4a27a6968558c3a78dbf2578ac7dcbd2ee08Richard Oudkerk    def test_empty_iterable(self):
1260d44a4a27a6968558c3a78dbf2578ac7dcbd2ee08Richard Oudkerk        # See Issue 12157
1261d44a4a27a6968558c3a78dbf2578ac7dcbd2ee08Richard Oudkerk        p = self.Pool(1)
1262d44a4a27a6968558c3a78dbf2578ac7dcbd2ee08Richard Oudkerk
1263d44a4a27a6968558c3a78dbf2578ac7dcbd2ee08Richard Oudkerk        self.assertEqual(p.map(sqr, []), [])
1264d44a4a27a6968558c3a78dbf2578ac7dcbd2ee08Richard Oudkerk        self.assertEqual(list(p.imap(sqr, [])), [])
1265d44a4a27a6968558c3a78dbf2578ac7dcbd2ee08Richard Oudkerk        self.assertEqual(list(p.imap_unordered(sqr, [])), [])
1266d44a4a27a6968558c3a78dbf2578ac7dcbd2ee08Richard Oudkerk        self.assertEqual(p.map_async(sqr, []).get(), [])
1267d44a4a27a6968558c3a78dbf2578ac7dcbd2ee08Richard Oudkerk
1268d44a4a27a6968558c3a78dbf2578ac7dcbd2ee08Richard Oudkerk        p.close()
1269d44a4a27a6968558c3a78dbf2578ac7dcbd2ee08Richard Oudkerk        p.join()
1270d44a4a27a6968558c3a78dbf2578ac7dcbd2ee08Richard Oudkerk
12710c200c282b460d84e0f8ddd56ce10cc79dfb3600Richard Oudkerkdef unpickleable_result():
12720c200c282b460d84e0f8ddd56ce10cc79dfb3600Richard Oudkerk    return lambda: 42
12730c200c282b460d84e0f8ddd56ce10cc79dfb3600Richard Oudkerk
12740c200c282b460d84e0f8ddd56ce10cc79dfb3600Richard Oudkerkclass _TestPoolWorkerErrors(BaseTestCase):
12750c200c282b460d84e0f8ddd56ce10cc79dfb3600Richard Oudkerk    ALLOWED_TYPES = ('processes', )
12760c200c282b460d84e0f8ddd56ce10cc79dfb3600Richard Oudkerk
12770c200c282b460d84e0f8ddd56ce10cc79dfb3600Richard Oudkerk    def test_unpickleable_result(self):
12780c200c282b460d84e0f8ddd56ce10cc79dfb3600Richard Oudkerk        from multiprocessing.pool import MaybeEncodingError
12790c200c282b460d84e0f8ddd56ce10cc79dfb3600Richard Oudkerk        p = multiprocessing.Pool(2)
12800c200c282b460d84e0f8ddd56ce10cc79dfb3600Richard Oudkerk
12810c200c282b460d84e0f8ddd56ce10cc79dfb3600Richard Oudkerk        # Make sure we don't lose pool processes because of encoding errors.
12820c200c282b460d84e0f8ddd56ce10cc79dfb3600Richard Oudkerk        for iteration in range(20):
12830c200c282b460d84e0f8ddd56ce10cc79dfb3600Richard Oudkerk            res = p.apply_async(unpickleable_result)
12840c200c282b460d84e0f8ddd56ce10cc79dfb3600Richard Oudkerk            self.assertRaises(MaybeEncodingError, res.get)
12850c200c282b460d84e0f8ddd56ce10cc79dfb3600Richard Oudkerk
12860c200c282b460d84e0f8ddd56ce10cc79dfb3600Richard Oudkerk        p.close()
12870c200c282b460d84e0f8ddd56ce10cc79dfb3600Richard Oudkerk        p.join()
12880c200c282b460d84e0f8ddd56ce10cc79dfb3600Richard Oudkerk
1289654ade3e6afa2527d1f642be28d69e219bd58b71Jesse Nollerclass _TestPoolWorkerLifetime(BaseTestCase):
1290654ade3e6afa2527d1f642be28d69e219bd58b71Jesse Noller
1291654ade3e6afa2527d1f642be28d69e219bd58b71Jesse Noller    ALLOWED_TYPES = ('processes', )
1292654ade3e6afa2527d1f642be28d69e219bd58b71Jesse Noller    def test_pool_worker_lifetime(self):
1293654ade3e6afa2527d1f642be28d69e219bd58b71Jesse Noller        p = multiprocessing.Pool(3, maxtasksperchild=10)
1294654ade3e6afa2527d1f642be28d69e219bd58b71Jesse Noller        self.assertEqual(3, len(p._pool))
1295654ade3e6afa2527d1f642be28d69e219bd58b71Jesse Noller        origworkerpids = [w.pid for w in p._pool]
1296654ade3e6afa2527d1f642be28d69e219bd58b71Jesse Noller        # Run many tasks so each worker gets replaced (hopefully)
1297654ade3e6afa2527d1f642be28d69e219bd58b71Jesse Noller        results = []
1298654ade3e6afa2527d1f642be28d69e219bd58b71Jesse Noller        for i in range(100):
1299654ade3e6afa2527d1f642be28d69e219bd58b71Jesse Noller            results.append(p.apply_async(sqr, (i, )))
1300654ade3e6afa2527d1f642be28d69e219bd58b71Jesse Noller        # Fetch the results and verify we got the right answers,
1301654ade3e6afa2527d1f642be28d69e219bd58b71Jesse Noller        # also ensuring all the tasks have completed.
1302654ade3e6afa2527d1f642be28d69e219bd58b71Jesse Noller        for (j, res) in enumerate(results):
1303654ade3e6afa2527d1f642be28d69e219bd58b71Jesse Noller            self.assertEqual(res.get(), sqr(j))
1304654ade3e6afa2527d1f642be28d69e219bd58b71Jesse Noller        # Refill the pool
1305654ade3e6afa2527d1f642be28d69e219bd58b71Jesse Noller        p._repopulate_pool()
13063bc5cb7e0db13ba3885c8ed3d51ea792738499b2Florent Xicluna        # Wait until all workers are alive
1307c2b0d76bf3387cd4841acde40f232051d4ddf23fAntoine Pitrou        # (countdown * DELTA = 5 seconds max startup process time)
1308c2b0d76bf3387cd4841acde40f232051d4ddf23fAntoine Pitrou        countdown = 50
13093bc5cb7e0db13ba3885c8ed3d51ea792738499b2Florent Xicluna        while countdown and not all(w.is_alive() for w in p._pool):
13103bc5cb7e0db13ba3885c8ed3d51ea792738499b2Florent Xicluna            countdown -= 1
13113bc5cb7e0db13ba3885c8ed3d51ea792738499b2Florent Xicluna            time.sleep(DELTA)
1312654ade3e6afa2527d1f642be28d69e219bd58b71Jesse Noller        finalworkerpids = [w.pid for w in p._pool]
13133bc5cb7e0db13ba3885c8ed3d51ea792738499b2Florent Xicluna        # All pids should be assigned.  See issue #7805.
13143bc5cb7e0db13ba3885c8ed3d51ea792738499b2Florent Xicluna        self.assertNotIn(None, origworkerpids)
13153bc5cb7e0db13ba3885c8ed3d51ea792738499b2Florent Xicluna        self.assertNotIn(None, finalworkerpids)
13163bc5cb7e0db13ba3885c8ed3d51ea792738499b2Florent Xicluna        # Finally, check that the worker pids have changed
1317654ade3e6afa2527d1f642be28d69e219bd58b71Jesse Noller        self.assertNotEqual(sorted(origworkerpids), sorted(finalworkerpids))
1318654ade3e6afa2527d1f642be28d69e219bd58b71Jesse Noller        p.close()
1319654ade3e6afa2527d1f642be28d69e219bd58b71Jesse Noller        p.join()
1320654ade3e6afa2527d1f642be28d69e219bd58b71Jesse Noller
132146f990e58cb462bbf98fef88a3ba41ffa4a4e35dCharles-François Natali    def test_pool_worker_lifetime_early_close(self):
132246f990e58cb462bbf98fef88a3ba41ffa4a4e35dCharles-François Natali        # Issue #10332: closing a pool whose workers have limited lifetimes
132346f990e58cb462bbf98fef88a3ba41ffa4a4e35dCharles-François Natali        # before all the tasks completed would make join() hang.
132446f990e58cb462bbf98fef88a3ba41ffa4a4e35dCharles-François Natali        p = multiprocessing.Pool(3, maxtasksperchild=1)
132546f990e58cb462bbf98fef88a3ba41ffa4a4e35dCharles-François Natali        results = []
132646f990e58cb462bbf98fef88a3ba41ffa4a4e35dCharles-François Natali        for i in range(6):
132746f990e58cb462bbf98fef88a3ba41ffa4a4e35dCharles-François Natali            results.append(p.apply_async(sqr, (i, 0.3)))
132846f990e58cb462bbf98fef88a3ba41ffa4a4e35dCharles-François Natali        p.close()
132946f990e58cb462bbf98fef88a3ba41ffa4a4e35dCharles-François Natali        p.join()
133046f990e58cb462bbf98fef88a3ba41ffa4a4e35dCharles-François Natali        # check the results
133146f990e58cb462bbf98fef88a3ba41ffa4a4e35dCharles-François Natali        for (j, res) in enumerate(results):
133246f990e58cb462bbf98fef88a3ba41ffa4a4e35dCharles-François Natali            self.assertEqual(res.get(), sqr(j))
133346f990e58cb462bbf98fef88a3ba41ffa4a4e35dCharles-François Natali
133446f990e58cb462bbf98fef88a3ba41ffa4a4e35dCharles-François Natali
1335dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson#
1336dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# Test that manager has expected number of shared objects left
1337dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson#
1338dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1339dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonclass _TestZZZNumberOfObjects(BaseTestCase):
1340dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    # Because test cases are sorted alphabetically, this one will get
1341dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    # run after all the other tests for the manager.  It tests that
1342dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    # there have been no "reference leaks" for the manager's shared
1343dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    # objects.  Note the comment in _TestPool.test_terminate().
1344dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    ALLOWED_TYPES = ('manager',)
1345dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1346dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def test_number_of_objects(self):
1347dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        EXPECTED_NUMBER = 1                # the pool object is still alive
1348dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        multiprocessing.active_children()  # discard dead process objs
1349dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        gc.collect()                       # do garbage collection
1350dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        refs = self.manager._number_of_objects()
13517314b38168da53863136d1937059fc0ac4883a56Jesse Noller        debug_info = self.manager._debug_info()
1352dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        if refs != EXPECTED_NUMBER:
13537fb9640d57f5d96dcaa0d0e6497abc21fa85f37eJesse Noller            print self.manager._debug_info()
13547314b38168da53863136d1937059fc0ac4883a56Jesse Noller            print debug_info
1355dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1356dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(refs, EXPECTED_NUMBER)
1357dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1358dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson#
1359dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# Test of creating a customized manager class
1360dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson#
1361dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1362dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonfrom multiprocessing.managers import BaseManager, BaseProxy, RemoteError
1363dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1364dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonclass FooBar(object):
1365dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def f(self):
1366dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        return 'f()'
1367dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def g(self):
1368dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        raise ValueError
1369dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def _h(self):
1370dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        return '_h()'
1371dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1372dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersondef baz():
1373dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    for i in xrange(10):
1374dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        yield i*i
1375dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1376dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonclass IteratorProxy(BaseProxy):
1377dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    _exposed_ = ('next', '__next__')
1378dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def __iter__(self):
1379dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        return self
1380dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def next(self):
1381dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        return self._callmethod('next')
1382dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def __next__(self):
1383dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        return self._callmethod('__next__')
1384dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1385dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonclass MyManager(BaseManager):
1386dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    pass
1387dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1388dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin PetersonMyManager.register('Foo', callable=FooBar)
1389dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin PetersonMyManager.register('Bar', callable=FooBar, exposed=('f', '_h'))
1390dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin PetersonMyManager.register('baz', callable=baz, proxytype=IteratorProxy)
1391dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1392dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1393dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonclass _TestMyManager(BaseTestCase):
1394dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1395dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    ALLOWED_TYPES = ('manager',)
1396dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1397dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def test_mymanager(self):
1398dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        manager = MyManager()
1399dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        manager.start()
1400dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1401dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        foo = manager.Foo()
1402dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        bar = manager.Bar()
1403dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        baz = manager.baz()
1404dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1405dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        foo_methods = [name for name in ('f', 'g', '_h') if hasattr(foo, name)]
1406dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        bar_methods = [name for name in ('f', 'g', '_h') if hasattr(bar, name)]
1407dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1408dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(foo_methods, ['f', 'g'])
1409dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(bar_methods, ['f', '_h'])
1410dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1411dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(foo.f(), 'f()')
1412dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertRaises(ValueError, foo.g)
1413dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(foo._callmethod('f'), 'f()')
1414dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertRaises(RemoteError, foo._callmethod, '_h')
1415dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1416dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(bar.f(), 'f()')
1417dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(bar._h(), '_h()')
1418dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(bar._callmethod('f'), 'f()')
1419dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(bar._callmethod('_h'), '_h()')
1420dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1421dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(list(baz), [i*i for i in range(10)])
1422dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1423dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        manager.shutdown()
1424dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1425dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson#
1426dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# Test of connecting to a remote server and using xmlrpclib for serialization
1427dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson#
1428dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1429dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson_queue = Queue.Queue()
1430dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersondef get_queue():
1431dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    return _queue
1432dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1433dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonclass QueueManager(BaseManager):
1434dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    '''manager class used by server process'''
1435dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin PetersonQueueManager.register('get_queue', callable=get_queue)
1436dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1437dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonclass QueueManager2(BaseManager):
1438dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    '''manager class which specifies the same interface as QueueManager'''
1439dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin PetersonQueueManager2.register('get_queue')
1440dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1441dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1442dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin PetersonSERIALIZER = 'xmlrpclib'
1443dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1444dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonclass _TestRemoteManager(BaseTestCase):
1445dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1446dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    ALLOWED_TYPES = ('manager',)
14477fe04f1dca5820c43416145789f4cc2b94e918b8Serhiy Storchaka    values = ['hello world', None, True, 2.25,
14487fe04f1dca5820c43416145789f4cc2b94e918b8Serhiy Storchaka              #'hall\xc3\xa5 v\xc3\xa4rlden'] # UTF-8
14497fe04f1dca5820c43416145789f4cc2b94e918b8Serhiy Storchaka              ]
14507fe04f1dca5820c43416145789f4cc2b94e918b8Serhiy Storchaka    result = values[:]
14517fe04f1dca5820c43416145789f4cc2b94e918b8Serhiy Storchaka    if test_support.have_unicode:
14527fe04f1dca5820c43416145789f4cc2b94e918b8Serhiy Storchaka        #result[-1] = u'hall\xe5 v\xe4rlden'
14537fe04f1dca5820c43416145789f4cc2b94e918b8Serhiy Storchaka        uvalue = test_support.u(r'\u043f\u0440\u0438\u0432\u0456\u0442 '
14547fe04f1dca5820c43416145789f4cc2b94e918b8Serhiy Storchaka                                r'\u0441\u0432\u0456\u0442')
14557fe04f1dca5820c43416145789f4cc2b94e918b8Serhiy Storchaka        values.append(uvalue)
14567fe04f1dca5820c43416145789f4cc2b94e918b8Serhiy Storchaka        result.append(uvalue)
1457dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
14584eb2b28553eceda5a19465534bc906929dd85243Antoine Pitrou    @classmethod
14594eb2b28553eceda5a19465534bc906929dd85243Antoine Pitrou    def _putter(cls, address, authkey):
1460dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        manager = QueueManager2(
1461dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            address=address, authkey=authkey, serializer=SERIALIZER
1462dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            )
1463dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        manager.connect()
1464dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        queue = manager.get_queue()
14657fe04f1dca5820c43416145789f4cc2b94e918b8Serhiy Storchaka        # Note that xmlrpclib will deserialize object as a list not a tuple
14667fe04f1dca5820c43416145789f4cc2b94e918b8Serhiy Storchaka        queue.put(tuple(cls.values))
1467dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1468dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def test_remote(self):
1469dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        authkey = os.urandom(32)
1470dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1471dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        manager = QueueManager(
147278254dc6fc71d28f70c52dd70c0bc3e14ae7d0c2Antoine Pitrou            address=(test.test_support.HOST, 0), authkey=authkey, serializer=SERIALIZER
1473dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            )
1474dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        manager.start()
1475dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1476dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        p = self.Process(target=self._putter, args=(manager.address, authkey))
14776f6016bc591305a9a99551ea7b1c467334c2b622Jesus Cea        p.daemon = True
1478dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        p.start()
1479dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1480dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        manager2 = QueueManager2(
1481dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            address=manager.address, authkey=authkey, serializer=SERIALIZER
1482dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            )
1483dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        manager2.connect()
1484dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        queue = manager2.get_queue()
1485dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
14867fe04f1dca5820c43416145789f4cc2b94e918b8Serhiy Storchaka        self.assertEqual(queue.get(), self.result)
1487dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1488dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        # Because we are using xmlrpclib for serialization instead of
1489dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        # pickle this will cause a serialization error.
1490dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertRaises(Exception, queue.put, time.sleep)
1491dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1492dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        # Make queue finalizer run before the server is stopped
1493dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        del queue
1494dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        manager.shutdown()
1495dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1496459a6481662c62d6cb57a070d21230db3e721c56Jesse Nollerclass _TestManagerRestart(BaseTestCase):
1497459a6481662c62d6cb57a070d21230db3e721c56Jesse Noller
14984eb2b28553eceda5a19465534bc906929dd85243Antoine Pitrou    @classmethod
14994eb2b28553eceda5a19465534bc906929dd85243Antoine Pitrou    def _putter(cls, address, authkey):
1500459a6481662c62d6cb57a070d21230db3e721c56Jesse Noller        manager = QueueManager(
1501459a6481662c62d6cb57a070d21230db3e721c56Jesse Noller            address=address, authkey=authkey, serializer=SERIALIZER)
1502459a6481662c62d6cb57a070d21230db3e721c56Jesse Noller        manager.connect()
1503459a6481662c62d6cb57a070d21230db3e721c56Jesse Noller        queue = manager.get_queue()
1504459a6481662c62d6cb57a070d21230db3e721c56Jesse Noller        queue.put('hello world')
1505459a6481662c62d6cb57a070d21230db3e721c56Jesse Noller
1506459a6481662c62d6cb57a070d21230db3e721c56Jesse Noller    def test_rapid_restart(self):
1507459a6481662c62d6cb57a070d21230db3e721c56Jesse Noller        authkey = os.urandom(32)
1508459a6481662c62d6cb57a070d21230db3e721c56Jesse Noller        manager = QueueManager(
150978254dc6fc71d28f70c52dd70c0bc3e14ae7d0c2Antoine Pitrou            address=(test.test_support.HOST, 0), authkey=authkey, serializer=SERIALIZER)
151087d86e09b5ef3fc7e007c8a6f5f0bc54e003b089Brian Curtin        srvr = manager.get_server()
151187d86e09b5ef3fc7e007c8a6f5f0bc54e003b089Brian Curtin        addr = srvr.address
151287d86e09b5ef3fc7e007c8a6f5f0bc54e003b089Brian Curtin        # Close the connection.Listener socket which gets opened as a part
151387d86e09b5ef3fc7e007c8a6f5f0bc54e003b089Brian Curtin        # of manager.get_server(). It's not needed for the test.
151487d86e09b5ef3fc7e007c8a6f5f0bc54e003b089Brian Curtin        srvr.listener.close()
1515459a6481662c62d6cb57a070d21230db3e721c56Jesse Noller        manager.start()
1516459a6481662c62d6cb57a070d21230db3e721c56Jesse Noller
1517459a6481662c62d6cb57a070d21230db3e721c56Jesse Noller        p = self.Process(target=self._putter, args=(manager.address, authkey))
15186f6016bc591305a9a99551ea7b1c467334c2b622Jesus Cea        p.daemon = True
1519459a6481662c62d6cb57a070d21230db3e721c56Jesse Noller        p.start()
1520459a6481662c62d6cb57a070d21230db3e721c56Jesse Noller        queue = manager.get_queue()
1521459a6481662c62d6cb57a070d21230db3e721c56Jesse Noller        self.assertEqual(queue.get(), 'hello world')
1522019ce773cd25ee08d1a822f06958774b43881d00Jesse Noller        del queue
1523459a6481662c62d6cb57a070d21230db3e721c56Jesse Noller        manager.shutdown()
1524459a6481662c62d6cb57a070d21230db3e721c56Jesse Noller        manager = QueueManager(
152554f9f83e5cd417267b29a38f3364716523e69b28Antoine Pitrou            address=addr, authkey=authkey, serializer=SERIALIZER)
1526459a6481662c62d6cb57a070d21230db3e721c56Jesse Noller        manager.start()
1527019ce773cd25ee08d1a822f06958774b43881d00Jesse Noller        manager.shutdown()
1528459a6481662c62d6cb57a070d21230db3e721c56Jesse Noller
1529dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson#
1530dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson#
1531dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson#
1532dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1533dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin PetersonSENTINEL = latin('')
1534dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1535dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonclass _TestConnection(BaseTestCase):
1536dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1537dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    ALLOWED_TYPES = ('processes', 'threads')
1538dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
15394eb2b28553eceda5a19465534bc906929dd85243Antoine Pitrou    @classmethod
15404eb2b28553eceda5a19465534bc906929dd85243Antoine Pitrou    def _echo(cls, conn):
1541dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        for msg in iter(conn.recv_bytes, SENTINEL):
1542dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            conn.send_bytes(msg)
1543dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        conn.close()
1544dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1545dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def test_connection(self):
1546dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        conn, child_conn = self.Pipe()
1547dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1548dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        p = self.Process(target=self._echo, args=(child_conn,))
15495bc9f4c09c99eb701dbee83fb9e26eed558e474fJesse Noller        p.daemon = True
1550dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        p.start()
1551dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1552dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        seq = [1, 2.25, None]
1553dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        msg = latin('hello world')
1554dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        longmsg = msg * 10
1555dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        arr = array.array('i', range(4))
1556dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1557dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        if self.TYPE == 'processes':
1558dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            self.assertEqual(type(conn.fileno()), int)
1559dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1560dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(conn.send(seq), None)
1561dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(conn.recv(), seq)
1562dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1563dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(conn.send_bytes(msg), None)
1564dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(conn.recv_bytes(), msg)
1565dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1566dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        if self.TYPE == 'processes':
1567dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            buffer = array.array('i', [0]*10)
1568dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            expected = list(arr) + [0] * (10 - len(arr))
1569dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            self.assertEqual(conn.send_bytes(arr), None)
1570dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            self.assertEqual(conn.recv_bytes_into(buffer),
1571dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson                             len(arr) * buffer.itemsize)
1572dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            self.assertEqual(list(buffer), expected)
1573dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1574dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            buffer = array.array('i', [0]*10)
1575dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            expected = [0] * 3 + list(arr) + [0] * (10 - 3 - len(arr))
1576dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            self.assertEqual(conn.send_bytes(arr), None)
1577dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            self.assertEqual(conn.recv_bytes_into(buffer, 3 * buffer.itemsize),
1578dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson                             len(arr) * buffer.itemsize)
1579dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            self.assertEqual(list(buffer), expected)
1580dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1581dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            buffer = bytearray(latin(' ' * 40))
1582dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            self.assertEqual(conn.send_bytes(longmsg), None)
1583dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            try:
1584dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson                res = conn.recv_bytes_into(buffer)
1585dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            except multiprocessing.BufferTooShort, e:
1586dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson                self.assertEqual(e.args, (longmsg,))
1587dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            else:
1588dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson                self.fail('expected BufferTooShort, got %s' % res)
1589dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1590dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        poll = TimingWrapper(conn.poll)
1591dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1592dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(poll(), False)
1593dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertTimingAlmostEqual(poll.elapsed, 0)
1594dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1595dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(poll(TIMEOUT1), False)
1596dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertTimingAlmostEqual(poll.elapsed, TIMEOUT1)
1597dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1598dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        conn.send(None)
1599cef2006eaff86f843b8f0fc21fc7b652415b96edGiampaolo Rodola'        time.sleep(.1)
1600dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1601dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(poll(TIMEOUT1), True)
1602dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertTimingAlmostEqual(poll.elapsed, 0)
1603dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1604dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(conn.recv(), None)
1605dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1606dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        really_big_msg = latin('X') * (1024 * 1024 * 16)   # 16Mb
1607dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        conn.send_bytes(really_big_msg)
1608dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(conn.recv_bytes(), really_big_msg)
1609dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1610dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        conn.send_bytes(SENTINEL)                          # tell child to quit
1611dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        child_conn.close()
1612dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1613dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        if self.TYPE == 'processes':
1614dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            self.assertEqual(conn.readable, True)
1615dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            self.assertEqual(conn.writable, True)
1616dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            self.assertRaises(EOFError, conn.recv)
1617dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            self.assertRaises(EOFError, conn.recv_bytes)
1618dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1619dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        p.join()
1620dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1621dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def test_duplex_false(self):
1622dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        reader, writer = self.Pipe(duplex=False)
1623dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(writer.send(1), None)
1624dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(reader.recv(), 1)
1625dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        if self.TYPE == 'processes':
1626dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            self.assertEqual(reader.readable, True)
1627dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            self.assertEqual(reader.writable, False)
1628dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            self.assertEqual(writer.readable, False)
1629dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            self.assertEqual(writer.writable, True)
1630dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            self.assertRaises(IOError, reader.send, 2)
1631dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            self.assertRaises(IOError, writer.recv)
1632dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            self.assertRaises(IOError, writer.poll)
1633dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1634dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def test_spawn_close(self):
1635dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        # We test that a pipe connection can be closed by parent
1636dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        # process immediately after child is spawned.  On Windows this
1637dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        # would have sometimes failed on old versions because
1638dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        # child_conn would be closed before the child got a chance to
1639dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        # duplicate it.
1640dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        conn, child_conn = self.Pipe()
1641dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1642dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        p = self.Process(target=self._echo, args=(child_conn,))
16436f6016bc591305a9a99551ea7b1c467334c2b622Jesus Cea        p.daemon = True
1644dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        p.start()
1645dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        child_conn.close()    # this might complete before child initializes
1646dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1647dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        msg = latin('hello')
1648dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        conn.send_bytes(msg)
1649dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(conn.recv_bytes(), msg)
1650dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1651dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        conn.send_bytes(SENTINEL)
1652dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        conn.close()
1653dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        p.join()
1654dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1655dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def test_sendbytes(self):
1656dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        if self.TYPE != 'processes':
16571f70221b861a3714735251d57695b2f472d0599bZachary Ware            self.skipTest('test not appropriate for {}'.format(self.TYPE))
1658dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1659dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        msg = latin('abcdefghijklmnopqrstuvwxyz')
1660dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        a, b = self.Pipe()
1661dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1662dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        a.send_bytes(msg)
1663dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(b.recv_bytes(), msg)
1664dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1665dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        a.send_bytes(msg, 5)
1666dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(b.recv_bytes(), msg[5:])
1667dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1668dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        a.send_bytes(msg, 7, 8)
1669dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(b.recv_bytes(), msg[7:7+8])
1670dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1671dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        a.send_bytes(msg, 26)
1672dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(b.recv_bytes(), latin(''))
1673dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1674dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        a.send_bytes(msg, 26, 0)
1675dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(b.recv_bytes(), latin(''))
1676dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1677dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertRaises(ValueError, a.send_bytes, msg, 27)
1678dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1679dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertRaises(ValueError, a.send_bytes, msg, 22, 5)
1680dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1681dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertRaises(ValueError, a.send_bytes, msg, 26, 1)
1682dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1683dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertRaises(ValueError, a.send_bytes, msg, -1)
1684dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1685dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertRaises(ValueError, a.send_bytes, msg, 4, -1)
1686dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1687a1a8da8bf5d6d27936702f9241c8726efd6b4b42Antoine Pitrou    @classmethod
1688a1a8da8bf5d6d27936702f9241c8726efd6b4b42Antoine Pitrou    def _is_fd_assigned(cls, fd):
1689a1a8da8bf5d6d27936702f9241c8726efd6b4b42Antoine Pitrou        try:
1690a1a8da8bf5d6d27936702f9241c8726efd6b4b42Antoine Pitrou            os.fstat(fd)
1691a1a8da8bf5d6d27936702f9241c8726efd6b4b42Antoine Pitrou        except OSError as e:
1692a1a8da8bf5d6d27936702f9241c8726efd6b4b42Antoine Pitrou            if e.errno == errno.EBADF:
1693a1a8da8bf5d6d27936702f9241c8726efd6b4b42Antoine Pitrou                return False
1694a1a8da8bf5d6d27936702f9241c8726efd6b4b42Antoine Pitrou            raise
1695a1a8da8bf5d6d27936702f9241c8726efd6b4b42Antoine Pitrou        else:
1696a1a8da8bf5d6d27936702f9241c8726efd6b4b42Antoine Pitrou            return True
1697a1a8da8bf5d6d27936702f9241c8726efd6b4b42Antoine Pitrou
1698a1a8da8bf5d6d27936702f9241c8726efd6b4b42Antoine Pitrou    @classmethod
1699a1a8da8bf5d6d27936702f9241c8726efd6b4b42Antoine Pitrou    def _writefd(cls, conn, data, create_dummy_fds=False):
1700a1a8da8bf5d6d27936702f9241c8726efd6b4b42Antoine Pitrou        if create_dummy_fds:
1701a1a8da8bf5d6d27936702f9241c8726efd6b4b42Antoine Pitrou            for i in range(0, 256):
1702a1a8da8bf5d6d27936702f9241c8726efd6b4b42Antoine Pitrou                if not cls._is_fd_assigned(i):
1703a1a8da8bf5d6d27936702f9241c8726efd6b4b42Antoine Pitrou                    os.dup2(conn.fileno(), i)
1704a1a8da8bf5d6d27936702f9241c8726efd6b4b42Antoine Pitrou        fd = reduction.recv_handle(conn)
1705a1a8da8bf5d6d27936702f9241c8726efd6b4b42Antoine Pitrou        if msvcrt:
1706a1a8da8bf5d6d27936702f9241c8726efd6b4b42Antoine Pitrou            fd = msvcrt.open_osfhandle(fd, os.O_WRONLY)
1707a1a8da8bf5d6d27936702f9241c8726efd6b4b42Antoine Pitrou        os.write(fd, data)
1708a1a8da8bf5d6d27936702f9241c8726efd6b4b42Antoine Pitrou        os.close(fd)
1709a1a8da8bf5d6d27936702f9241c8726efd6b4b42Antoine Pitrou
1710f8413b29c07babc49a2a891f8716f4fcda538489Charles-François Natali    @unittest.skipUnless(HAS_REDUCTION, "test needs multiprocessing.reduction")
1711a1a8da8bf5d6d27936702f9241c8726efd6b4b42Antoine Pitrou    def test_fd_transfer(self):
1712a1a8da8bf5d6d27936702f9241c8726efd6b4b42Antoine Pitrou        if self.TYPE != 'processes':
1713a1a8da8bf5d6d27936702f9241c8726efd6b4b42Antoine Pitrou            self.skipTest("only makes sense with processes")
1714a1a8da8bf5d6d27936702f9241c8726efd6b4b42Antoine Pitrou        conn, child_conn = self.Pipe(duplex=True)
1715a1a8da8bf5d6d27936702f9241c8726efd6b4b42Antoine Pitrou
1716a1a8da8bf5d6d27936702f9241c8726efd6b4b42Antoine Pitrou        p = self.Process(target=self._writefd, args=(child_conn, b"foo"))
17176f6016bc591305a9a99551ea7b1c467334c2b622Jesus Cea        p.daemon = True
1718a1a8da8bf5d6d27936702f9241c8726efd6b4b42Antoine Pitrou        p.start()
1719a1a8da8bf5d6d27936702f9241c8726efd6b4b42Antoine Pitrou        with open(test_support.TESTFN, "wb") as f:
1720a1a8da8bf5d6d27936702f9241c8726efd6b4b42Antoine Pitrou            fd = f.fileno()
1721a1a8da8bf5d6d27936702f9241c8726efd6b4b42Antoine Pitrou            if msvcrt:
1722a1a8da8bf5d6d27936702f9241c8726efd6b4b42Antoine Pitrou                fd = msvcrt.get_osfhandle(fd)
1723a1a8da8bf5d6d27936702f9241c8726efd6b4b42Antoine Pitrou            reduction.send_handle(conn, fd, p.pid)
1724a1a8da8bf5d6d27936702f9241c8726efd6b4b42Antoine Pitrou        p.join()
1725a1a8da8bf5d6d27936702f9241c8726efd6b4b42Antoine Pitrou        with open(test_support.TESTFN, "rb") as f:
1726a1a8da8bf5d6d27936702f9241c8726efd6b4b42Antoine Pitrou            self.assertEqual(f.read(), b"foo")
1727a1a8da8bf5d6d27936702f9241c8726efd6b4b42Antoine Pitrou
1728f8413b29c07babc49a2a891f8716f4fcda538489Charles-François Natali    @unittest.skipUnless(HAS_REDUCTION, "test needs multiprocessing.reduction")
1729a1a8da8bf5d6d27936702f9241c8726efd6b4b42Antoine Pitrou    @unittest.skipIf(sys.platform == "win32",
1730a1a8da8bf5d6d27936702f9241c8726efd6b4b42Antoine Pitrou                     "test semantics don't make sense on Windows")
1731a1a8da8bf5d6d27936702f9241c8726efd6b4b42Antoine Pitrou    @unittest.skipIf(MAXFD <= 256,
1732a1a8da8bf5d6d27936702f9241c8726efd6b4b42Antoine Pitrou                     "largest assignable fd number is too small")
1733a1a8da8bf5d6d27936702f9241c8726efd6b4b42Antoine Pitrou    @unittest.skipUnless(hasattr(os, "dup2"),
1734a1a8da8bf5d6d27936702f9241c8726efd6b4b42Antoine Pitrou                         "test needs os.dup2()")
1735a1a8da8bf5d6d27936702f9241c8726efd6b4b42Antoine Pitrou    def test_large_fd_transfer(self):
1736a1a8da8bf5d6d27936702f9241c8726efd6b4b42Antoine Pitrou        # With fd > 256 (issue #11657)
1737a1a8da8bf5d6d27936702f9241c8726efd6b4b42Antoine Pitrou        if self.TYPE != 'processes':
1738a1a8da8bf5d6d27936702f9241c8726efd6b4b42Antoine Pitrou            self.skipTest("only makes sense with processes")
1739a1a8da8bf5d6d27936702f9241c8726efd6b4b42Antoine Pitrou        conn, child_conn = self.Pipe(duplex=True)
1740a1a8da8bf5d6d27936702f9241c8726efd6b4b42Antoine Pitrou
1741a1a8da8bf5d6d27936702f9241c8726efd6b4b42Antoine Pitrou        p = self.Process(target=self._writefd, args=(child_conn, b"bar", True))
17426f6016bc591305a9a99551ea7b1c467334c2b622Jesus Cea        p.daemon = True
1743a1a8da8bf5d6d27936702f9241c8726efd6b4b42Antoine Pitrou        p.start()
1744a1a8da8bf5d6d27936702f9241c8726efd6b4b42Antoine Pitrou        with open(test_support.TESTFN, "wb") as f:
1745a1a8da8bf5d6d27936702f9241c8726efd6b4b42Antoine Pitrou            fd = f.fileno()
1746a1a8da8bf5d6d27936702f9241c8726efd6b4b42Antoine Pitrou            for newfd in range(256, MAXFD):
1747a1a8da8bf5d6d27936702f9241c8726efd6b4b42Antoine Pitrou                if not self._is_fd_assigned(newfd):
1748a1a8da8bf5d6d27936702f9241c8726efd6b4b42Antoine Pitrou                    break
1749a1a8da8bf5d6d27936702f9241c8726efd6b4b42Antoine Pitrou            else:
1750a1a8da8bf5d6d27936702f9241c8726efd6b4b42Antoine Pitrou                self.fail("could not find an unassigned large file descriptor")
1751a1a8da8bf5d6d27936702f9241c8726efd6b4b42Antoine Pitrou            os.dup2(fd, newfd)
1752a1a8da8bf5d6d27936702f9241c8726efd6b4b42Antoine Pitrou            try:
1753a1a8da8bf5d6d27936702f9241c8726efd6b4b42Antoine Pitrou                reduction.send_handle(conn, newfd, p.pid)
1754a1a8da8bf5d6d27936702f9241c8726efd6b4b42Antoine Pitrou            finally:
1755a1a8da8bf5d6d27936702f9241c8726efd6b4b42Antoine Pitrou                os.close(newfd)
1756a1a8da8bf5d6d27936702f9241c8726efd6b4b42Antoine Pitrou        p.join()
1757a1a8da8bf5d6d27936702f9241c8726efd6b4b42Antoine Pitrou        with open(test_support.TESTFN, "rb") as f:
1758a1a8da8bf5d6d27936702f9241c8726efd6b4b42Antoine Pitrou            self.assertEqual(f.read(), b"bar")
1759a1a8da8bf5d6d27936702f9241c8726efd6b4b42Antoine Pitrou
1760c23484b21f8b62ec7c62a6e2253cf5f656e2ef06Jesus Cea    @classmethod
1761c23484b21f8b62ec7c62a6e2253cf5f656e2ef06Jesus Cea    def _send_data_without_fd(self, conn):
1762c23484b21f8b62ec7c62a6e2253cf5f656e2ef06Jesus Cea        os.write(conn.fileno(), b"\0")
1763c23484b21f8b62ec7c62a6e2253cf5f656e2ef06Jesus Cea
1764f8413b29c07babc49a2a891f8716f4fcda538489Charles-François Natali    @unittest.skipUnless(HAS_REDUCTION, "test needs multiprocessing.reduction")
1765c23484b21f8b62ec7c62a6e2253cf5f656e2ef06Jesus Cea    @unittest.skipIf(sys.platform == "win32", "doesn't make sense on Windows")
1766c23484b21f8b62ec7c62a6e2253cf5f656e2ef06Jesus Cea    def test_missing_fd_transfer(self):
1767c23484b21f8b62ec7c62a6e2253cf5f656e2ef06Jesus Cea        # Check that exception is raised when received data is not
1768c23484b21f8b62ec7c62a6e2253cf5f656e2ef06Jesus Cea        # accompanied by a file descriptor in ancillary data.
1769c23484b21f8b62ec7c62a6e2253cf5f656e2ef06Jesus Cea        if self.TYPE != 'processes':
1770c23484b21f8b62ec7c62a6e2253cf5f656e2ef06Jesus Cea            self.skipTest("only makes sense with processes")
1771c23484b21f8b62ec7c62a6e2253cf5f656e2ef06Jesus Cea        conn, child_conn = self.Pipe(duplex=True)
1772c23484b21f8b62ec7c62a6e2253cf5f656e2ef06Jesus Cea
1773c23484b21f8b62ec7c62a6e2253cf5f656e2ef06Jesus Cea        p = self.Process(target=self._send_data_without_fd, args=(child_conn,))
1774c23484b21f8b62ec7c62a6e2253cf5f656e2ef06Jesus Cea        p.daemon = True
1775c23484b21f8b62ec7c62a6e2253cf5f656e2ef06Jesus Cea        p.start()
1776c23484b21f8b62ec7c62a6e2253cf5f656e2ef06Jesus Cea        self.assertRaises(RuntimeError, reduction.recv_handle, conn)
1777c23484b21f8b62ec7c62a6e2253cf5f656e2ef06Jesus Cea        p.join()
1778a1a8da8bf5d6d27936702f9241c8726efd6b4b42Antoine Pitrou
1779dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonclass _TestListenerClient(BaseTestCase):
1780dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1781dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    ALLOWED_TYPES = ('processes', 'threads')
1782dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
17834eb2b28553eceda5a19465534bc906929dd85243Antoine Pitrou    @classmethod
17844eb2b28553eceda5a19465534bc906929dd85243Antoine Pitrou    def _test(cls, address):
17854eb2b28553eceda5a19465534bc906929dd85243Antoine Pitrou        conn = cls.connection.Client(address)
1786dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        conn.send('hello')
1787dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        conn.close()
1788dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1789dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def test_listener_client(self):
1790dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        for family in self.connection.families:
1791dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            l = self.connection.Listener(family=family)
1792dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            p = self.Process(target=self._test, args=(l.address,))
17935bc9f4c09c99eb701dbee83fb9e26eed558e474fJesse Noller            p.daemon = True
1794dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            p.start()
1795dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            conn = l.accept()
1796dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            self.assertEqual(conn.recv(), 'hello')
1797dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            p.join()
1798dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            l.close()
17999a16fa69dda64ed01b2239a732c0445f22babb57Richard Oudkerk
18009a16fa69dda64ed01b2239a732c0445f22babb57Richard Oudkerk    def test_issue14725(self):
18019a16fa69dda64ed01b2239a732c0445f22babb57Richard Oudkerk        l = self.connection.Listener()
18029a16fa69dda64ed01b2239a732c0445f22babb57Richard Oudkerk        p = self.Process(target=self._test, args=(l.address,))
18039a16fa69dda64ed01b2239a732c0445f22babb57Richard Oudkerk        p.daemon = True
18049a16fa69dda64ed01b2239a732c0445f22babb57Richard Oudkerk        p.start()
18059a16fa69dda64ed01b2239a732c0445f22babb57Richard Oudkerk        time.sleep(1)
18069a16fa69dda64ed01b2239a732c0445f22babb57Richard Oudkerk        # On Windows the client process should by now have connected,
18079a16fa69dda64ed01b2239a732c0445f22babb57Richard Oudkerk        # written data and closed the pipe handle by now.  This causes
18089a16fa69dda64ed01b2239a732c0445f22babb57Richard Oudkerk        # ConnectNamdedPipe() to fail with ERROR_NO_DATA.  See Issue
18099a16fa69dda64ed01b2239a732c0445f22babb57Richard Oudkerk        # 14725.
18109a16fa69dda64ed01b2239a732c0445f22babb57Richard Oudkerk        conn = l.accept()
18119a16fa69dda64ed01b2239a732c0445f22babb57Richard Oudkerk        self.assertEqual(conn.recv(), 'hello')
18129a16fa69dda64ed01b2239a732c0445f22babb57Richard Oudkerk        conn.close()
18139a16fa69dda64ed01b2239a732c0445f22babb57Richard Oudkerk        p.join()
18149a16fa69dda64ed01b2239a732c0445f22babb57Richard Oudkerk        l.close()
18159a16fa69dda64ed01b2239a732c0445f22babb57Richard Oudkerk
1816dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson#
1817dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# Test of sending connection and socket objects between processes
1818dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson#
1819da3a1b120055855a464c2d5f5143021ae8f5dc86Benjamin Peterson"""
1820dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonclass _TestPicklingConnections(BaseTestCase):
1821dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1822dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    ALLOWED_TYPES = ('processes',)
1823dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1824dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def _listener(self, conn, families):
1825dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        for fam in families:
1826dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            l = self.connection.Listener(family=fam)
1827dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            conn.send(l.address)
1828dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            new_conn = l.accept()
1829dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            conn.send(new_conn)
1830dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1831dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        if self.TYPE == 'processes':
1832dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            l = socket.socket()
1833dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            l.bind(('localhost', 0))
1834dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            conn.send(l.getsockname())
1835dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            l.listen(1)
1836dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            new_conn, addr = l.accept()
1837dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            conn.send(new_conn)
1838dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1839dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        conn.recv()
1840dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1841dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def _remote(self, conn):
1842dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        for (address, msg) in iter(conn.recv, None):
1843dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            client = self.connection.Client(address)
1844dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            client.send(msg.upper())
1845dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            client.close()
1846dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1847dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        if self.TYPE == 'processes':
1848dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            address, msg = conn.recv()
1849dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            client = socket.socket()
1850dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            client.connect(address)
1851dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            client.sendall(msg.upper())
1852dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            client.close()
1853dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1854dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        conn.close()
1855dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1856dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def test_pickling(self):
1857dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        try:
1858dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            multiprocessing.allow_connection_pickling()
1859dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        except ImportError:
1860dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            return
1861dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1862dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        families = self.connection.families
1863dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1864dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        lconn, lconn0 = self.Pipe()
1865dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        lp = self.Process(target=self._listener, args=(lconn0, families))
18666f6016bc591305a9a99551ea7b1c467334c2b622Jesus Cea        lp.daemon = True
1867dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        lp.start()
1868dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        lconn0.close()
1869dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1870dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        rconn, rconn0 = self.Pipe()
1871dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        rp = self.Process(target=self._remote, args=(rconn0,))
18726f6016bc591305a9a99551ea7b1c467334c2b622Jesus Cea        rp.daemon = True
1873dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        rp.start()
1874dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        rconn0.close()
1875dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1876dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        for fam in families:
1877dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            msg = ('This connection uses family %s' % fam).encode('ascii')
1878dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            address = lconn.recv()
1879dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            rconn.send((address, msg))
1880dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            new_conn = lconn.recv()
1881dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            self.assertEqual(new_conn.recv(), msg.upper())
1882dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1883dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        rconn.send(None)
1884dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1885dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        if self.TYPE == 'processes':
1886dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            msg = latin('This connection uses a normal socket')
1887dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            address = lconn.recv()
1888dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            rconn.send((address, msg))
1889dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            if hasattr(socket, 'fromfd'):
1890dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson                new_conn = lconn.recv()
1891dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson                self.assertEqual(new_conn.recv(100), msg.upper())
1892dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            else:
1893dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson                # XXX On Windows with Py2.6 need to backport fromfd()
1894dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson                discard = lconn.recv_bytes()
1895dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1896dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        lconn.send(None)
1897dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1898dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        rconn.close()
1899dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        lconn.close()
1900dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1901dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        lp.join()
1902dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        rp.join()
1903da3a1b120055855a464c2d5f5143021ae8f5dc86Benjamin Peterson"""
1904dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson#
1905dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson#
1906dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson#
1907dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1908dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonclass _TestHeap(BaseTestCase):
1909dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1910dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    ALLOWED_TYPES = ('processes',)
1911dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1912dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def test_heap(self):
1913dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        iterations = 5000
1914dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        maxblocks = 50
1915dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        blocks = []
1916dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1917dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        # create and destroy lots of blocks of different sizes
1918dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        for i in xrange(iterations):
1919dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            size = int(random.lognormvariate(0, 1) * 1000)
1920dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            b = multiprocessing.heap.BufferWrapper(size)
1921dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            blocks.append(b)
1922dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            if len(blocks) > maxblocks:
1923dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson                i = random.randrange(maxblocks)
1924dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson                del blocks[i]
1925dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1926dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        # get the heap object
1927dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        heap = multiprocessing.heap.BufferWrapper._heap
1928dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1929dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        # verify the state of the heap
1930dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        all = []
1931dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        occupied = 0
1932414d0faedced1b7cb3585e76e0bdfff1795e15f3Charles-François Natali        heap._lock.acquire()
1933414d0faedced1b7cb3585e76e0bdfff1795e15f3Charles-François Natali        self.addCleanup(heap._lock.release)
1934dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        for L in heap._len_to_seq.values():
1935dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            for arena, start, stop in L:
1936dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson                all.append((heap._arenas.index(arena), start, stop,
1937dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson                            stop-start, 'free'))
1938dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        for arena, start, stop in heap._allocated_blocks:
1939dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            all.append((heap._arenas.index(arena), start, stop,
1940dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson                        stop-start, 'occupied'))
1941dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            occupied += (stop-start)
1942dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1943dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        all.sort()
1944dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1945dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        for i in range(len(all)-1):
1946dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            (arena, start, stop) = all[i][:3]
1947dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            (narena, nstart, nstop) = all[i+1][:3]
1948dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            self.assertTrue((arena != narena and nstart == 0) or
1949dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson                            (stop == nstart))
1950dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1951414d0faedced1b7cb3585e76e0bdfff1795e15f3Charles-François Natali    def test_free_from_gc(self):
1952414d0faedced1b7cb3585e76e0bdfff1795e15f3Charles-François Natali        # Check that freeing of blocks by the garbage collector doesn't deadlock
1953414d0faedced1b7cb3585e76e0bdfff1795e15f3Charles-François Natali        # (issue #12352).
1954414d0faedced1b7cb3585e76e0bdfff1795e15f3Charles-François Natali        # Make sure the GC is enabled, and set lower collection thresholds to
1955414d0faedced1b7cb3585e76e0bdfff1795e15f3Charles-François Natali        # make collections more frequent (and increase the probability of
1956414d0faedced1b7cb3585e76e0bdfff1795e15f3Charles-François Natali        # deadlock).
19577c20ad32fd79dfd5383b3cd75f433cdf0bacbd52Charles-François Natali        if not gc.isenabled():
1958414d0faedced1b7cb3585e76e0bdfff1795e15f3Charles-François Natali            gc.enable()
1959414d0faedced1b7cb3585e76e0bdfff1795e15f3Charles-François Natali            self.addCleanup(gc.disable)
19607c20ad32fd79dfd5383b3cd75f433cdf0bacbd52Charles-François Natali        thresholds = gc.get_threshold()
19617c20ad32fd79dfd5383b3cd75f433cdf0bacbd52Charles-François Natali        self.addCleanup(gc.set_threshold, *thresholds)
1962414d0faedced1b7cb3585e76e0bdfff1795e15f3Charles-François Natali        gc.set_threshold(10)
1963414d0faedced1b7cb3585e76e0bdfff1795e15f3Charles-François Natali
1964414d0faedced1b7cb3585e76e0bdfff1795e15f3Charles-François Natali        # perform numerous block allocations, with cyclic references to make
1965414d0faedced1b7cb3585e76e0bdfff1795e15f3Charles-François Natali        # sure objects are collected asynchronously by the gc
1966414d0faedced1b7cb3585e76e0bdfff1795e15f3Charles-François Natali        for i in range(5000):
1967414d0faedced1b7cb3585e76e0bdfff1795e15f3Charles-François Natali            a = multiprocessing.heap.BufferWrapper(1)
1968414d0faedced1b7cb3585e76e0bdfff1795e15f3Charles-François Natali            b = multiprocessing.heap.BufferWrapper(1)
1969414d0faedced1b7cb3585e76e0bdfff1795e15f3Charles-François Natali            # circular references
1970414d0faedced1b7cb3585e76e0bdfff1795e15f3Charles-François Natali            a.buddy = b
1971414d0faedced1b7cb3585e76e0bdfff1795e15f3Charles-François Natali            b.buddy = a
1972414d0faedced1b7cb3585e76e0bdfff1795e15f3Charles-François Natali
1973dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson#
1974dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson#
1975dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson#
1976dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1977dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonclass _Foo(Structure):
1978dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    _fields_ = [
1979dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        ('x', c_int),
1980dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        ('y', c_double)
1981dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        ]
1982dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1983dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonclass _TestSharedCTypes(BaseTestCase):
1984dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1985dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    ALLOWED_TYPES = ('processes',)
1986dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
198755d935a145710c2609c234df47b1172b52c3dcd9Antoine Pitrou    def setUp(self):
198855d935a145710c2609c234df47b1172b52c3dcd9Antoine Pitrou        if not HAS_SHAREDCTYPES:
198955d935a145710c2609c234df47b1172b52c3dcd9Antoine Pitrou            self.skipTest("requires multiprocessing.sharedctypes")
199055d935a145710c2609c234df47b1172b52c3dcd9Antoine Pitrou
19914eb2b28553eceda5a19465534bc906929dd85243Antoine Pitrou    @classmethod
19924eb2b28553eceda5a19465534bc906929dd85243Antoine Pitrou    def _double(cls, x, y, foo, arr, string):
1993dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        x.value *= 2
1994dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        y.value *= 2
1995dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        foo.x *= 2
1996dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        foo.y *= 2
1997dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        string.value *= 2
1998dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        for i in range(len(arr)):
1999dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            arr[i] *= 2
2000dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
2001dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def test_sharedctypes(self, lock=False):
2002dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        x = Value('i', 7, lock=lock)
2003bd564c3c21ef4c6d6cb0070870edd9d2f7c89d11Georg Brandl        y = Value(c_double, 1.0/3.0, lock=lock)
2004dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        foo = Value(_Foo, 3, 2, lock=lock)
2005bd564c3c21ef4c6d6cb0070870edd9d2f7c89d11Georg Brandl        arr = self.Array('d', range(10), lock=lock)
2006bd564c3c21ef4c6d6cb0070870edd9d2f7c89d11Georg Brandl        string = self.Array('c', 20, lock=lock)
2007a06e9b8f6b2edf4936146fa8867f12222106d0f8Brian Curtin        string.value = latin('hello')
2008dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
2009dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        p = self.Process(target=self._double, args=(x, y, foo, arr, string))
20106f6016bc591305a9a99551ea7b1c467334c2b622Jesus Cea        p.daemon = True
2011dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        p.start()
2012dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        p.join()
2013dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
2014dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(x.value, 14)
2015dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertAlmostEqual(y.value, 2.0/3.0)
2016dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(foo.x, 6)
2017dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertAlmostEqual(foo.y, 4.0)
2018dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        for i in range(10):
2019dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            self.assertAlmostEqual(arr[i], i*2)
2020dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(string.value, latin('hellohello'))
2021dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
2022dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def test_synchronize(self):
2023dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.test_sharedctypes(lock=True)
2024dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
2025dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def test_copy(self):
2026dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        foo = _Foo(2, 5.0)
2027a06e9b8f6b2edf4936146fa8867f12222106d0f8Brian Curtin        bar = copy(foo)
2028dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        foo.x = 0
2029dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        foo.y = 0
2030dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(bar.x, 2)
2031dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertAlmostEqual(bar.y, 5.0)
2032dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
2033dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson#
2034dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson#
2035dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson#
2036dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
2037dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonclass _TestFinalize(BaseTestCase):
2038dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
2039dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    ALLOWED_TYPES = ('processes',)
2040dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
20414eb2b28553eceda5a19465534bc906929dd85243Antoine Pitrou    @classmethod
20424eb2b28553eceda5a19465534bc906929dd85243Antoine Pitrou    def _test_finalize(cls, conn):
2043dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        class Foo(object):
2044dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            pass
2045dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
2046dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        a = Foo()
2047dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        util.Finalize(a, conn.send, args=('a',))
2048dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        del a           # triggers callback for a
2049dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
2050dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        b = Foo()
2051dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        close_b = util.Finalize(b, conn.send, args=('b',))
2052dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        close_b()       # triggers callback for b
2053dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        close_b()       # does nothing because callback has already been called
2054dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        del b           # does nothing because callback has already been called
2055dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
2056dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        c = Foo()
2057dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        util.Finalize(c, conn.send, args=('c',))
2058dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
2059dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        d10 = Foo()
2060dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        util.Finalize(d10, conn.send, args=('d10',), exitpriority=1)
2061dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
2062dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        d01 = Foo()
2063dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        util.Finalize(d01, conn.send, args=('d01',), exitpriority=0)
2064dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        d02 = Foo()
2065dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        util.Finalize(d02, conn.send, args=('d02',), exitpriority=0)
2066dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        d03 = Foo()
2067dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        util.Finalize(d03, conn.send, args=('d03',), exitpriority=0)
2068dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
2069dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        util.Finalize(None, conn.send, args=('e',), exitpriority=-10)
2070dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
2071dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        util.Finalize(None, conn.send, args=('STOP',), exitpriority=-100)
2072dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
2073c2077b0d9b5bf99768c6f396bf7ae6c41b682465Ezio Melotti        # call multiprocessing's cleanup function then exit process without
2074dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        # garbage collecting locals
2075dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        util._exit_function()
2076dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        conn.close()
2077dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        os._exit(0)
2078dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
2079dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def test_finalize(self):
2080dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        conn, child_conn = self.Pipe()
2081dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
2082dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        p = self.Process(target=self._test_finalize, args=(child_conn,))
20836f6016bc591305a9a99551ea7b1c467334c2b622Jesus Cea        p.daemon = True
2084dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        p.start()
2085dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        p.join()
2086dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
2087dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        result = [obj for obj in iter(conn.recv, 'STOP')]
2088dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(result, ['a', 'b', 'd10', 'd03', 'd02', 'd01', 'e'])
2089dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
2090dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson#
2091dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# Test that from ... import * works for each module
2092dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson#
2093dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
2094dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonclass _TestImportStar(BaseTestCase):
2095dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
2096dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    ALLOWED_TYPES = ('processes',)
2097dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
2098dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def test_import(self):
209936b9fbb803659350f9e6182b85f5bf66ca2a72a8Florent Xicluna        modules = [
2100dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            'multiprocessing', 'multiprocessing.connection',
2101dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            'multiprocessing.heap', 'multiprocessing.managers',
2102dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            'multiprocessing.pool', 'multiprocessing.process',
2103dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            'multiprocessing.synchronize', 'multiprocessing.util'
210436b9fbb803659350f9e6182b85f5bf66ca2a72a8Florent Xicluna            ]
210536b9fbb803659350f9e6182b85f5bf66ca2a72a8Florent Xicluna
2106f8413b29c07babc49a2a891f8716f4fcda538489Charles-François Natali        if HAS_REDUCTION:
2107f8413b29c07babc49a2a891f8716f4fcda538489Charles-François Natali            modules.append('multiprocessing.reduction')
2108f8413b29c07babc49a2a891f8716f4fcda538489Charles-François Natali
210936b9fbb803659350f9e6182b85f5bf66ca2a72a8Florent Xicluna        if c_int is not None:
211036b9fbb803659350f9e6182b85f5bf66ca2a72a8Florent Xicluna            # This module requires _ctypes
211136b9fbb803659350f9e6182b85f5bf66ca2a72a8Florent Xicluna            modules.append('multiprocessing.sharedctypes')
2112dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
2113dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        for name in modules:
2114dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            __import__(name)
2115dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            mod = sys.modules[name]
2116dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
2117dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            for attr in getattr(mod, '__all__', ()):
2118dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson                self.assertTrue(
2119dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson                    hasattr(mod, attr),
2120dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson                    '%r does not have attribute %r' % (mod, attr)
2121dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson                    )
2122dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
2123dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson#
2124dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# Quick test that logging works -- does not test logging output
2125dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson#
2126dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
2127dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonclass _TestLogging(BaseTestCase):
2128dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
2129dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    ALLOWED_TYPES = ('processes',)
2130dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
2131dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def test_enable_logging(self):
2132dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        logger = multiprocessing.get_logger()
2133dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        logger.setLevel(util.SUBWARNING)
2134dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertTrue(logger is not None)
2135dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        logger.debug('this will not be printed')
2136dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        logger.info('nor will this')
2137dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        logger.setLevel(LOG_LEVEL)
2138dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
21394eb2b28553eceda5a19465534bc906929dd85243Antoine Pitrou    @classmethod
21404eb2b28553eceda5a19465534bc906929dd85243Antoine Pitrou    def _test_level(cls, conn):
2141dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        logger = multiprocessing.get_logger()
2142dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        conn.send(logger.getEffectiveLevel())
2143dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
2144dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def test_level(self):
2145dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        LEVEL1 = 32
2146dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        LEVEL2 = 37
2147dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
2148dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        logger = multiprocessing.get_logger()
2149dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        root_logger = logging.getLogger()
2150dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        root_level = root_logger.level
2151dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
2152dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        reader, writer = multiprocessing.Pipe(duplex=False)
2153dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
2154dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        logger.setLevel(LEVEL1)
21556f6016bc591305a9a99551ea7b1c467334c2b622Jesus Cea        p = self.Process(target=self._test_level, args=(writer,))
21566f6016bc591305a9a99551ea7b1c467334c2b622Jesus Cea        p.daemon = True
21576f6016bc591305a9a99551ea7b1c467334c2b622Jesus Cea        p.start()
2158dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(LEVEL1, reader.recv())
2159dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
2160dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        logger.setLevel(logging.NOTSET)
2161dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        root_logger.setLevel(LEVEL2)
21626f6016bc591305a9a99551ea7b1c467334c2b622Jesus Cea        p = self.Process(target=self._test_level, args=(writer,))
21636f6016bc591305a9a99551ea7b1c467334c2b622Jesus Cea        p.daemon = True
21646f6016bc591305a9a99551ea7b1c467334c2b622Jesus Cea        p.start()
2165dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(LEVEL2, reader.recv())
2166dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
2167dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        root_logger.setLevel(root_level)
2168dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        logger.setLevel(level=LOG_LEVEL)
2169dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
2170814d02dcd1b30a98f9a34c710be35de6db82aa40Jesse Noller
21719a03f2fd03278d2c12dfe253de1bbed7c0c9c506Jesse Noller# class _TestLoggingProcessName(BaseTestCase):
21729a03f2fd03278d2c12dfe253de1bbed7c0c9c506Jesse Noller#
21739a03f2fd03278d2c12dfe253de1bbed7c0c9c506Jesse Noller#     def handle(self, record):
21749a03f2fd03278d2c12dfe253de1bbed7c0c9c506Jesse Noller#         assert record.processName == multiprocessing.current_process().name
21759a03f2fd03278d2c12dfe253de1bbed7c0c9c506Jesse Noller#         self.__handled = True
21769a03f2fd03278d2c12dfe253de1bbed7c0c9c506Jesse Noller#
21779a03f2fd03278d2c12dfe253de1bbed7c0c9c506Jesse Noller#     def test_logging(self):
21789a03f2fd03278d2c12dfe253de1bbed7c0c9c506Jesse Noller#         handler = logging.Handler()
21799a03f2fd03278d2c12dfe253de1bbed7c0c9c506Jesse Noller#         handler.handle = self.handle
21809a03f2fd03278d2c12dfe253de1bbed7c0c9c506Jesse Noller#         self.__handled = False
21819a03f2fd03278d2c12dfe253de1bbed7c0c9c506Jesse Noller#         # Bypass getLogger() and side-effects
21829a03f2fd03278d2c12dfe253de1bbed7c0c9c506Jesse Noller#         logger = logging.getLoggerClass()(
21839a03f2fd03278d2c12dfe253de1bbed7c0c9c506Jesse Noller#                 'multiprocessing.test.TestLoggingProcessName')
21849a03f2fd03278d2c12dfe253de1bbed7c0c9c506Jesse Noller#         logger.addHandler(handler)
21859a03f2fd03278d2c12dfe253de1bbed7c0c9c506Jesse Noller#         logger.propagate = False
21869a03f2fd03278d2c12dfe253de1bbed7c0c9c506Jesse Noller#
21879a03f2fd03278d2c12dfe253de1bbed7c0c9c506Jesse Noller#         logger.warn('foo')
21889a03f2fd03278d2c12dfe253de1bbed7c0c9c506Jesse Noller#         assert self.__handled
2189814d02dcd1b30a98f9a34c710be35de6db82aa40Jesse Noller
2190dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson#
2191ba48264bce265a70157181dbd499f99a50ec0931Richard Oudkerk# Check that Process.join() retries if os.waitpid() fails with EINTR
2192ba48264bce265a70157181dbd499f99a50ec0931Richard Oudkerk#
2193ba48264bce265a70157181dbd499f99a50ec0931Richard Oudkerk
2194ba48264bce265a70157181dbd499f99a50ec0931Richard Oudkerkclass _TestPollEintr(BaseTestCase):
2195ba48264bce265a70157181dbd499f99a50ec0931Richard Oudkerk
2196ba48264bce265a70157181dbd499f99a50ec0931Richard Oudkerk    ALLOWED_TYPES = ('processes',)
2197ba48264bce265a70157181dbd499f99a50ec0931Richard Oudkerk
2198ba48264bce265a70157181dbd499f99a50ec0931Richard Oudkerk    @classmethod
2199ba48264bce265a70157181dbd499f99a50ec0931Richard Oudkerk    def _killer(cls, pid):
2200ba48264bce265a70157181dbd499f99a50ec0931Richard Oudkerk        time.sleep(0.5)
2201ba48264bce265a70157181dbd499f99a50ec0931Richard Oudkerk        os.kill(pid, signal.SIGUSR1)
2202ba48264bce265a70157181dbd499f99a50ec0931Richard Oudkerk
2203ba48264bce265a70157181dbd499f99a50ec0931Richard Oudkerk    @unittest.skipUnless(hasattr(signal, 'SIGUSR1'), 'requires SIGUSR1')
2204ba48264bce265a70157181dbd499f99a50ec0931Richard Oudkerk    def test_poll_eintr(self):
2205ba48264bce265a70157181dbd499f99a50ec0931Richard Oudkerk        got_signal = [False]
2206ba48264bce265a70157181dbd499f99a50ec0931Richard Oudkerk        def record(*args):
2207ba48264bce265a70157181dbd499f99a50ec0931Richard Oudkerk            got_signal[0] = True
2208ba48264bce265a70157181dbd499f99a50ec0931Richard Oudkerk        pid = os.getpid()
2209ba48264bce265a70157181dbd499f99a50ec0931Richard Oudkerk        oldhandler = signal.signal(signal.SIGUSR1, record)
2210ba48264bce265a70157181dbd499f99a50ec0931Richard Oudkerk        try:
2211ba48264bce265a70157181dbd499f99a50ec0931Richard Oudkerk            killer = self.Process(target=self._killer, args=(pid,))
2212ba48264bce265a70157181dbd499f99a50ec0931Richard Oudkerk            killer.start()
2213ba48264bce265a70157181dbd499f99a50ec0931Richard Oudkerk            p = self.Process(target=time.sleep, args=(1,))
2214ba48264bce265a70157181dbd499f99a50ec0931Richard Oudkerk            p.start()
2215ba48264bce265a70157181dbd499f99a50ec0931Richard Oudkerk            p.join()
2216ba48264bce265a70157181dbd499f99a50ec0931Richard Oudkerk            self.assertTrue(got_signal[0])
2217ba48264bce265a70157181dbd499f99a50ec0931Richard Oudkerk            self.assertEqual(p.exitcode, 0)
2218ba48264bce265a70157181dbd499f99a50ec0931Richard Oudkerk            killer.join()
2219ba48264bce265a70157181dbd499f99a50ec0931Richard Oudkerk        finally:
2220ba48264bce265a70157181dbd499f99a50ec0931Richard Oudkerk            signal.signal(signal.SIGUSR1, oldhandler)
2221ba48264bce265a70157181dbd499f99a50ec0931Richard Oudkerk
2222ba48264bce265a70157181dbd499f99a50ec0931Richard Oudkerk#
22239a5b2ad38d605206f05a52fe32868d3f839e8a86Jesse Noller# Test to verify handle verification, see issue 3321
22249a5b2ad38d605206f05a52fe32868d3f839e8a86Jesse Noller#
22259a5b2ad38d605206f05a52fe32868d3f839e8a86Jesse Noller
22269a5b2ad38d605206f05a52fe32868d3f839e8a86Jesse Nollerclass TestInvalidHandle(unittest.TestCase):
22279a5b2ad38d605206f05a52fe32868d3f839e8a86Jesse Noller
222836b9fbb803659350f9e6182b85f5bf66ca2a72a8Florent Xicluna    @unittest.skipIf(WIN32, "skipped on Windows")
22299a5b2ad38d605206f05a52fe32868d3f839e8a86Jesse Noller    def test_invalid_handles(self):
22309a5b2ad38d605206f05a52fe32868d3f839e8a86Jesse Noller        conn = _multiprocessing.Connection(44977608)
22319a5b2ad38d605206f05a52fe32868d3f839e8a86Jesse Noller        self.assertRaises(IOError, conn.poll)
22329a5b2ad38d605206f05a52fe32868d3f839e8a86Jesse Noller        self.assertRaises(IOError, _multiprocessing.Connection, -1)
223336b9fbb803659350f9e6182b85f5bf66ca2a72a8Florent Xicluna
22349a5b2ad38d605206f05a52fe32868d3f839e8a86Jesse Noller#
2235dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# Functions used to create test cases from the base ones in this module
2236dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson#
2237dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
2238dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersondef get_attributes(Source, names):
2239dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    d = {}
2240dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    for name in names:
2241dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        obj = getattr(Source, name)
2242dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        if type(obj) == type(get_attributes):
2243dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            obj = staticmethod(obj)
2244dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        d[name] = obj
2245dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    return d
2246dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
2247dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersondef create_test_cases(Mixin, type):
2248dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    result = {}
2249dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    glob = globals()
225036b9fbb803659350f9e6182b85f5bf66ca2a72a8Florent Xicluna    Type = type.capitalize()
2251dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
2252dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    for name in glob.keys():
2253dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        if name.startswith('_Test'):
2254dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            base = glob[name]
2255dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            if type in base.ALLOWED_TYPES:
2256dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson                newname = 'With' + Type + name[1:]
2257dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson                class Temp(base, unittest.TestCase, Mixin):
2258dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson                    pass
2259dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson                result[newname] = Temp
2260dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson                Temp.__name__ = newname
2261dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson                Temp.__module__ = Mixin.__module__
2262dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    return result
2263dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
2264dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson#
2265dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# Create test cases
2266dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson#
2267dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
2268dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonclass ProcessesMixin(object):
2269dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    TYPE = 'processes'
2270dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    Process = multiprocessing.Process
2271dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    locals().update(get_attributes(multiprocessing, (
2272dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        'Queue', 'Lock', 'RLock', 'Semaphore', 'BoundedSemaphore',
2273dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        'Condition', 'Event', 'Value', 'Array', 'RawValue',
2274dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        'RawArray', 'current_process', 'active_children', 'Pipe',
2275d44a4a27a6968558c3a78dbf2578ac7dcbd2ee08Richard Oudkerk        'connection', 'JoinableQueue', 'Pool'
2276dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        )))
2277dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
2278dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersontestcases_processes = create_test_cases(ProcessesMixin, type='processes')
2279dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonglobals().update(testcases_processes)
2280dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
2281dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
2282dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonclass ManagerMixin(object):
2283dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    TYPE = 'manager'
2284dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    Process = multiprocessing.Process
2285dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    manager = object.__new__(multiprocessing.managers.SyncManager)
2286dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    locals().update(get_attributes(manager, (
2287dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        'Queue', 'Lock', 'RLock', 'Semaphore', 'BoundedSemaphore',
2288dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson       'Condition', 'Event', 'Value', 'Array', 'list', 'dict',
2289d44a4a27a6968558c3a78dbf2578ac7dcbd2ee08Richard Oudkerk        'Namespace', 'JoinableQueue', 'Pool'
2290dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        )))
2291dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
2292dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersontestcases_manager = create_test_cases(ManagerMixin, type='manager')
2293dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonglobals().update(testcases_manager)
2294dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
2295dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
2296dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonclass ThreadsMixin(object):
2297dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    TYPE = 'threads'
2298dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    Process = multiprocessing.dummy.Process
2299dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    locals().update(get_attributes(multiprocessing.dummy, (
2300dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        'Queue', 'Lock', 'RLock', 'Semaphore', 'BoundedSemaphore',
2301dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        'Condition', 'Event', 'Value', 'Array', 'current_process',
2302dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        'active_children', 'Pipe', 'connection', 'dict', 'list',
2303d44a4a27a6968558c3a78dbf2578ac7dcbd2ee08Richard Oudkerk        'Namespace', 'JoinableQueue', 'Pool'
2304dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        )))
2305dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
2306dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersontestcases_threads = create_test_cases(ThreadsMixin, type='threads')
2307dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonglobals().update(testcases_threads)
2308dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
23090c519b3a5e847eea0dffb51ac8df7c68891daf70Neal Norwitzclass OtherTest(unittest.TestCase):
23100c519b3a5e847eea0dffb51ac8df7c68891daf70Neal Norwitz    # TODO: add more tests for deliver/answer challenge.
23110c519b3a5e847eea0dffb51ac8df7c68891daf70Neal Norwitz    def test_deliver_challenge_auth_failure(self):
23120c519b3a5e847eea0dffb51ac8df7c68891daf70Neal Norwitz        class _FakeConnection(object):
23130c519b3a5e847eea0dffb51ac8df7c68891daf70Neal Norwitz            def recv_bytes(self, size):
23142a7767a17311cada06240a187c8896bdbcc1a4d0Neal Norwitz                return b'something bogus'
23150c519b3a5e847eea0dffb51ac8df7c68891daf70Neal Norwitz            def send_bytes(self, data):
23160c519b3a5e847eea0dffb51ac8df7c68891daf70Neal Norwitz                pass
23170c519b3a5e847eea0dffb51ac8df7c68891daf70Neal Norwitz        self.assertRaises(multiprocessing.AuthenticationError,
23180c519b3a5e847eea0dffb51ac8df7c68891daf70Neal Norwitz                          multiprocessing.connection.deliver_challenge,
23190c519b3a5e847eea0dffb51ac8df7c68891daf70Neal Norwitz                          _FakeConnection(), b'abc')
23200c519b3a5e847eea0dffb51ac8df7c68891daf70Neal Norwitz
23210c519b3a5e847eea0dffb51ac8df7c68891daf70Neal Norwitz    def test_answer_challenge_auth_failure(self):
23220c519b3a5e847eea0dffb51ac8df7c68891daf70Neal Norwitz        class _FakeConnection(object):
23230c519b3a5e847eea0dffb51ac8df7c68891daf70Neal Norwitz            def __init__(self):
23240c519b3a5e847eea0dffb51ac8df7c68891daf70Neal Norwitz                self.count = 0
23250c519b3a5e847eea0dffb51ac8df7c68891daf70Neal Norwitz            def recv_bytes(self, size):
23260c519b3a5e847eea0dffb51ac8df7c68891daf70Neal Norwitz                self.count += 1
23270c519b3a5e847eea0dffb51ac8df7c68891daf70Neal Norwitz                if self.count == 1:
23280c519b3a5e847eea0dffb51ac8df7c68891daf70Neal Norwitz                    return multiprocessing.connection.CHALLENGE
23290c519b3a5e847eea0dffb51ac8df7c68891daf70Neal Norwitz                elif self.count == 2:
23302a7767a17311cada06240a187c8896bdbcc1a4d0Neal Norwitz                    return b'something bogus'
23312a7767a17311cada06240a187c8896bdbcc1a4d0Neal Norwitz                return b''
23320c519b3a5e847eea0dffb51ac8df7c68891daf70Neal Norwitz            def send_bytes(self, data):
23330c519b3a5e847eea0dffb51ac8df7c68891daf70Neal Norwitz                pass
23340c519b3a5e847eea0dffb51ac8df7c68891daf70Neal Norwitz        self.assertRaises(multiprocessing.AuthenticationError,
23350c519b3a5e847eea0dffb51ac8df7c68891daf70Neal Norwitz                          multiprocessing.connection.answer_challenge,
23360c519b3a5e847eea0dffb51ac8df7c68891daf70Neal Norwitz                          _FakeConnection(), b'abc')
23370c519b3a5e847eea0dffb51ac8df7c68891daf70Neal Norwitz
23387152f6d9156a19a9f1b31e313d2c19d840dc089dJesse Noller#
23397152f6d9156a19a9f1b31e313d2c19d840dc089dJesse Noller# Test Manager.start()/Pool.__init__() initializer feature - see issue 5585
23407152f6d9156a19a9f1b31e313d2c19d840dc089dJesse Noller#
23417152f6d9156a19a9f1b31e313d2c19d840dc089dJesse Noller
23427152f6d9156a19a9f1b31e313d2c19d840dc089dJesse Nollerdef initializer(ns):
23437152f6d9156a19a9f1b31e313d2c19d840dc089dJesse Noller    ns.test += 1
23447152f6d9156a19a9f1b31e313d2c19d840dc089dJesse Noller
23457152f6d9156a19a9f1b31e313d2c19d840dc089dJesse Nollerclass TestInitializers(unittest.TestCase):
23467152f6d9156a19a9f1b31e313d2c19d840dc089dJesse Noller    def setUp(self):
23477152f6d9156a19a9f1b31e313d2c19d840dc089dJesse Noller        self.mgr = multiprocessing.Manager()
23487152f6d9156a19a9f1b31e313d2c19d840dc089dJesse Noller        self.ns = self.mgr.Namespace()
23497152f6d9156a19a9f1b31e313d2c19d840dc089dJesse Noller        self.ns.test = 0
23507152f6d9156a19a9f1b31e313d2c19d840dc089dJesse Noller
23517152f6d9156a19a9f1b31e313d2c19d840dc089dJesse Noller    def tearDown(self):
23527152f6d9156a19a9f1b31e313d2c19d840dc089dJesse Noller        self.mgr.shutdown()
23537152f6d9156a19a9f1b31e313d2c19d840dc089dJesse Noller
23547152f6d9156a19a9f1b31e313d2c19d840dc089dJesse Noller    def test_manager_initializer(self):
23557152f6d9156a19a9f1b31e313d2c19d840dc089dJesse Noller        m = multiprocessing.managers.SyncManager()
23567152f6d9156a19a9f1b31e313d2c19d840dc089dJesse Noller        self.assertRaises(TypeError, m.start, 1)
23577152f6d9156a19a9f1b31e313d2c19d840dc089dJesse Noller        m.start(initializer, (self.ns,))
23587152f6d9156a19a9f1b31e313d2c19d840dc089dJesse Noller        self.assertEqual(self.ns.test, 1)
23597152f6d9156a19a9f1b31e313d2c19d840dc089dJesse Noller        m.shutdown()
23607152f6d9156a19a9f1b31e313d2c19d840dc089dJesse Noller
23617152f6d9156a19a9f1b31e313d2c19d840dc089dJesse Noller    def test_pool_initializer(self):
23627152f6d9156a19a9f1b31e313d2c19d840dc089dJesse Noller        self.assertRaises(TypeError, multiprocessing.Pool, initializer=1)
23637152f6d9156a19a9f1b31e313d2c19d840dc089dJesse Noller        p = multiprocessing.Pool(1, initializer, (self.ns,))
23647152f6d9156a19a9f1b31e313d2c19d840dc089dJesse Noller        p.close()
23657152f6d9156a19a9f1b31e313d2c19d840dc089dJesse Noller        p.join()
23667152f6d9156a19a9f1b31e313d2c19d840dc089dJesse Noller        self.assertEqual(self.ns.test, 1)
23677152f6d9156a19a9f1b31e313d2c19d840dc089dJesse Noller
23681b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller#
23691b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller# Issue 5155, 5313, 5331: Test process in processes
23701b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller# Verifies os.close(sys.stdin.fileno) vs. sys.stdin.close() behavior
23711b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller#
23721b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller
2373c54960723faf89f5222cd695015f8aa4791031c6Richard Oudkerkdef _this_sub_process(q):
23741b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller    try:
23751b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller        item = q.get(block=False)
23761b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller    except Queue.Empty:
23771b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller        pass
23781b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller
2379c54960723faf89f5222cd695015f8aa4791031c6Richard Oudkerkdef _test_process(q):
2380c54960723faf89f5222cd695015f8aa4791031c6Richard Oudkerk    queue = multiprocessing.Queue()
2381c54960723faf89f5222cd695015f8aa4791031c6Richard Oudkerk    subProc = multiprocessing.Process(target=_this_sub_process, args=(queue,))
2382c54960723faf89f5222cd695015f8aa4791031c6Richard Oudkerk    subProc.daemon = True
2383c54960723faf89f5222cd695015f8aa4791031c6Richard Oudkerk    subProc.start()
2384c54960723faf89f5222cd695015f8aa4791031c6Richard Oudkerk    subProc.join()
2385c54960723faf89f5222cd695015f8aa4791031c6Richard Oudkerk
23861b90efbdc5bb204fe50aea87374603dcba309227Jesse Nollerdef _afunc(x):
23871b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller    return x*x
23881b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller
23891b90efbdc5bb204fe50aea87374603dcba309227Jesse Nollerdef pool_in_process():
23901b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller    pool = multiprocessing.Pool(processes=4)
23911b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller    x = pool.map(_afunc, [1, 2, 3, 4, 5, 6, 7])
23921b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller
23931b90efbdc5bb204fe50aea87374603dcba309227Jesse Nollerclass _file_like(object):
23941b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller    def __init__(self, delegate):
23951b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller        self._delegate = delegate
23961b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller        self._pid = None
23971b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller
23981b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller    @property
23991b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller    def cache(self):
24001b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller        pid = os.getpid()
24011b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller        # There are no race conditions since fork keeps only the running thread
24021b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller        if pid != self._pid:
24031b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller            self._pid = pid
24041b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller            self._cache = []
24051b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller        return self._cache
24061b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller
24071b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller    def write(self, data):
24081b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller        self.cache.append(data)
24091b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller
24101b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller    def flush(self):
24111b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller        self._delegate.write(''.join(self.cache))
24121b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller        self._cache = []
24131b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller
24141b90efbdc5bb204fe50aea87374603dcba309227Jesse Nollerclass TestStdinBadfiledescriptor(unittest.TestCase):
24151b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller
24161b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller    def test_queue_in_process(self):
24171b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller        queue = multiprocessing.Queue()
2418c54960723faf89f5222cd695015f8aa4791031c6Richard Oudkerk        proc = multiprocessing.Process(target=_test_process, args=(queue,))
24191b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller        proc.start()
24201b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller        proc.join()
24211b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller
24221b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller    def test_pool_in_process(self):
24231b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller        p = multiprocessing.Process(target=pool_in_process)
24241b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller        p.start()
24251b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller        p.join()
24261b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller
24271b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller    def test_flushing(self):
24281b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller        sio = StringIO()
24291b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller        flike = _file_like(sio)
24301b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller        flike.write('foo')
24311b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller        proc = multiprocessing.Process(target=lambda: flike.flush())
24321b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller        flike.flush()
24331b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller        assert sio.getvalue() == 'foo'
24341b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller
2435e4b9938d77950811a47fb673ecb4d4554a4efec1Richard Oudkerk#
2436e4b9938d77950811a47fb673ecb4d4554a4efec1Richard Oudkerk# Test interaction with socket timeouts - see Issue #6056
2437e4b9938d77950811a47fb673ecb4d4554a4efec1Richard Oudkerk#
2438e4b9938d77950811a47fb673ecb4d4554a4efec1Richard Oudkerk
2439e4b9938d77950811a47fb673ecb4d4554a4efec1Richard Oudkerkclass TestTimeouts(unittest.TestCase):
2440e4b9938d77950811a47fb673ecb4d4554a4efec1Richard Oudkerk    @classmethod
2441e4b9938d77950811a47fb673ecb4d4554a4efec1Richard Oudkerk    def _test_timeout(cls, child, address):
2442e4b9938d77950811a47fb673ecb4d4554a4efec1Richard Oudkerk        time.sleep(1)
2443e4b9938d77950811a47fb673ecb4d4554a4efec1Richard Oudkerk        child.send(123)
2444e4b9938d77950811a47fb673ecb4d4554a4efec1Richard Oudkerk        child.close()
2445e4b9938d77950811a47fb673ecb4d4554a4efec1Richard Oudkerk        conn = multiprocessing.connection.Client(address)
2446e4b9938d77950811a47fb673ecb4d4554a4efec1Richard Oudkerk        conn.send(456)
2447e4b9938d77950811a47fb673ecb4d4554a4efec1Richard Oudkerk        conn.close()
2448e4b9938d77950811a47fb673ecb4d4554a4efec1Richard Oudkerk
2449e4b9938d77950811a47fb673ecb4d4554a4efec1Richard Oudkerk    def test_timeout(self):
2450e4b9938d77950811a47fb673ecb4d4554a4efec1Richard Oudkerk        old_timeout = socket.getdefaulttimeout()
2451e4b9938d77950811a47fb673ecb4d4554a4efec1Richard Oudkerk        try:
2452e4b9938d77950811a47fb673ecb4d4554a4efec1Richard Oudkerk            socket.setdefaulttimeout(0.1)
2453e4b9938d77950811a47fb673ecb4d4554a4efec1Richard Oudkerk            parent, child = multiprocessing.Pipe(duplex=True)
2454e4b9938d77950811a47fb673ecb4d4554a4efec1Richard Oudkerk            l = multiprocessing.connection.Listener(family='AF_INET')
2455e4b9938d77950811a47fb673ecb4d4554a4efec1Richard Oudkerk            p = multiprocessing.Process(target=self._test_timeout,
2456e4b9938d77950811a47fb673ecb4d4554a4efec1Richard Oudkerk                                        args=(child, l.address))
2457e4b9938d77950811a47fb673ecb4d4554a4efec1Richard Oudkerk            p.start()
2458e4b9938d77950811a47fb673ecb4d4554a4efec1Richard Oudkerk            child.close()
2459e4b9938d77950811a47fb673ecb4d4554a4efec1Richard Oudkerk            self.assertEqual(parent.recv(), 123)
2460e4b9938d77950811a47fb673ecb4d4554a4efec1Richard Oudkerk            parent.close()
2461e4b9938d77950811a47fb673ecb4d4554a4efec1Richard Oudkerk            conn = l.accept()
2462e4b9938d77950811a47fb673ecb4d4554a4efec1Richard Oudkerk            self.assertEqual(conn.recv(), 456)
2463e4b9938d77950811a47fb673ecb4d4554a4efec1Richard Oudkerk            conn.close()
2464e4b9938d77950811a47fb673ecb4d4554a4efec1Richard Oudkerk            l.close()
2465e4b9938d77950811a47fb673ecb4d4554a4efec1Richard Oudkerk            p.join(10)
2466e4b9938d77950811a47fb673ecb4d4554a4efec1Richard Oudkerk        finally:
2467e4b9938d77950811a47fb673ecb4d4554a4efec1Richard Oudkerk            socket.setdefaulttimeout(old_timeout)
2468e4b9938d77950811a47fb673ecb4d4554a4efec1Richard Oudkerk
2469faee75c33af1e8ccbf0d4349efe62dc9637779c6Richard Oudkerk#
2470faee75c33af1e8ccbf0d4349efe62dc9637779c6Richard Oudkerk# Test what happens with no "if __name__ == '__main__'"
2471faee75c33af1e8ccbf0d4349efe62dc9637779c6Richard Oudkerk#
2472faee75c33af1e8ccbf0d4349efe62dc9637779c6Richard Oudkerk
2473faee75c33af1e8ccbf0d4349efe62dc9637779c6Richard Oudkerkclass TestNoForkBomb(unittest.TestCase):
2474faee75c33af1e8ccbf0d4349efe62dc9637779c6Richard Oudkerk    def test_noforkbomb(self):
2475faee75c33af1e8ccbf0d4349efe62dc9637779c6Richard Oudkerk        name = os.path.join(os.path.dirname(__file__), 'mp_fork_bomb.py')
2476faee75c33af1e8ccbf0d4349efe62dc9637779c6Richard Oudkerk        if WIN32:
2477faee75c33af1e8ccbf0d4349efe62dc9637779c6Richard Oudkerk            rc, out, err = test.script_helper.assert_python_failure(name)
24787fe04f1dca5820c43416145789f4cc2b94e918b8Serhiy Storchaka            self.assertEqual(out, '')
24797fe04f1dca5820c43416145789f4cc2b94e918b8Serhiy Storchaka            self.assertIn('RuntimeError', err)
2480faee75c33af1e8ccbf0d4349efe62dc9637779c6Richard Oudkerk        else:
2481faee75c33af1e8ccbf0d4349efe62dc9637779c6Richard Oudkerk            rc, out, err = test.script_helper.assert_python_ok(name)
24827fe04f1dca5820c43416145789f4cc2b94e918b8Serhiy Storchaka            self.assertEqual(out.rstrip(), '123')
24837fe04f1dca5820c43416145789f4cc2b94e918b8Serhiy Storchaka            self.assertEqual(err, '')
2484faee75c33af1e8ccbf0d4349efe62dc9637779c6Richard Oudkerk
2485faee75c33af1e8ccbf0d4349efe62dc9637779c6Richard Oudkerk#
24868927e8f4211dc50b87a6365ed7281452a1931ebfKristján Valur Jónsson# Issue 12098: check sys.flags of child matches that for parent
24878927e8f4211dc50b87a6365ed7281452a1931ebfKristján Valur Jónsson#
24888927e8f4211dc50b87a6365ed7281452a1931ebfKristján Valur Jónsson
24898927e8f4211dc50b87a6365ed7281452a1931ebfKristján Valur Jónssonclass TestFlags(unittest.TestCase):
24908927e8f4211dc50b87a6365ed7281452a1931ebfKristján Valur Jónsson    @classmethod
24918927e8f4211dc50b87a6365ed7281452a1931ebfKristján Valur Jónsson    def run_in_grandchild(cls, conn):
24928927e8f4211dc50b87a6365ed7281452a1931ebfKristján Valur Jónsson        conn.send(tuple(sys.flags))
24938927e8f4211dc50b87a6365ed7281452a1931ebfKristján Valur Jónsson
24948927e8f4211dc50b87a6365ed7281452a1931ebfKristján Valur Jónsson    @classmethod
24958927e8f4211dc50b87a6365ed7281452a1931ebfKristján Valur Jónsson    def run_in_child(cls):
24968927e8f4211dc50b87a6365ed7281452a1931ebfKristján Valur Jónsson        import json
24978927e8f4211dc50b87a6365ed7281452a1931ebfKristján Valur Jónsson        r, w = multiprocessing.Pipe(duplex=False)
24988927e8f4211dc50b87a6365ed7281452a1931ebfKristján Valur Jónsson        p = multiprocessing.Process(target=cls.run_in_grandchild, args=(w,))
24998927e8f4211dc50b87a6365ed7281452a1931ebfKristján Valur Jónsson        p.start()
25008927e8f4211dc50b87a6365ed7281452a1931ebfKristján Valur Jónsson        grandchild_flags = r.recv()
25018927e8f4211dc50b87a6365ed7281452a1931ebfKristján Valur Jónsson        p.join()
25028927e8f4211dc50b87a6365ed7281452a1931ebfKristján Valur Jónsson        r.close()
25038927e8f4211dc50b87a6365ed7281452a1931ebfKristján Valur Jónsson        w.close()
25048927e8f4211dc50b87a6365ed7281452a1931ebfKristján Valur Jónsson        flags = (tuple(sys.flags), grandchild_flags)
25058927e8f4211dc50b87a6365ed7281452a1931ebfKristján Valur Jónsson        print(json.dumps(flags))
25068927e8f4211dc50b87a6365ed7281452a1931ebfKristján Valur Jónsson
25077fe04f1dca5820c43416145789f4cc2b94e918b8Serhiy Storchaka    @test_support.requires_unicode  # XXX json needs unicode support
25088927e8f4211dc50b87a6365ed7281452a1931ebfKristján Valur Jónsson    def test_flags(self):
25098927e8f4211dc50b87a6365ed7281452a1931ebfKristján Valur Jónsson        import json, subprocess
25108927e8f4211dc50b87a6365ed7281452a1931ebfKristján Valur Jónsson        # start child process using unusual flags
25118927e8f4211dc50b87a6365ed7281452a1931ebfKristján Valur Jónsson        prog = ('from test.test_multiprocessing import TestFlags; ' +
25128927e8f4211dc50b87a6365ed7281452a1931ebfKristján Valur Jónsson                'TestFlags.run_in_child()')
25138927e8f4211dc50b87a6365ed7281452a1931ebfKristján Valur Jónsson        data = subprocess.check_output(
2514625af8e13ea3bdd83fd46cbd6d0bc44d97df9355Benjamin Peterson            [sys.executable, '-E', '-B', '-O', '-c', prog])
25158927e8f4211dc50b87a6365ed7281452a1931ebfKristján Valur Jónsson        child_flags, grandchild_flags = json.loads(data.decode('ascii'))
25168927e8f4211dc50b87a6365ed7281452a1931ebfKristján Valur Jónsson        self.assertEqual(child_flags, grandchild_flags)
25177bdd93c20e2751420a4a51d019f6887e972d783eRichard Oudkerk
25187bdd93c20e2751420a4a51d019f6887e972d783eRichard Oudkerk#
25197bdd93c20e2751420a4a51d019f6887e972d783eRichard Oudkerk# Issue #17555: ForkAwareThreadLock
25207bdd93c20e2751420a4a51d019f6887e972d783eRichard Oudkerk#
25217bdd93c20e2751420a4a51d019f6887e972d783eRichard Oudkerk
25227bdd93c20e2751420a4a51d019f6887e972d783eRichard Oudkerkclass TestForkAwareThreadLock(unittest.TestCase):
25237bdd93c20e2751420a4a51d019f6887e972d783eRichard Oudkerk    # We recurisvely start processes.  Issue #17555 meant that the
25247bdd93c20e2751420a4a51d019f6887e972d783eRichard Oudkerk    # after fork registry would get duplicate entries for the same
25257bdd93c20e2751420a4a51d019f6887e972d783eRichard Oudkerk    # lock.  The size of the registry at generation n was ~2**n.
25267bdd93c20e2751420a4a51d019f6887e972d783eRichard Oudkerk
25277bdd93c20e2751420a4a51d019f6887e972d783eRichard Oudkerk    @classmethod
25287bdd93c20e2751420a4a51d019f6887e972d783eRichard Oudkerk    def child(cls, n, conn):
25297bdd93c20e2751420a4a51d019f6887e972d783eRichard Oudkerk        if n > 1:
25307bdd93c20e2751420a4a51d019f6887e972d783eRichard Oudkerk            p = multiprocessing.Process(target=cls.child, args=(n-1, conn))
25317bdd93c20e2751420a4a51d019f6887e972d783eRichard Oudkerk            p.start()
25327bdd93c20e2751420a4a51d019f6887e972d783eRichard Oudkerk            p.join()
25337bdd93c20e2751420a4a51d019f6887e972d783eRichard Oudkerk        else:
25347bdd93c20e2751420a4a51d019f6887e972d783eRichard Oudkerk            conn.send(len(util._afterfork_registry))
25357bdd93c20e2751420a4a51d019f6887e972d783eRichard Oudkerk        conn.close()
25367bdd93c20e2751420a4a51d019f6887e972d783eRichard Oudkerk
25377bdd93c20e2751420a4a51d019f6887e972d783eRichard Oudkerk    def test_lock(self):
25387bdd93c20e2751420a4a51d019f6887e972d783eRichard Oudkerk        r, w = multiprocessing.Pipe(False)
25397bdd93c20e2751420a4a51d019f6887e972d783eRichard Oudkerk        l = util.ForkAwareThreadLock()
25407bdd93c20e2751420a4a51d019f6887e972d783eRichard Oudkerk        old_size = len(util._afterfork_registry)
25417bdd93c20e2751420a4a51d019f6887e972d783eRichard Oudkerk        p = multiprocessing.Process(target=self.child, args=(5, w))
25427bdd93c20e2751420a4a51d019f6887e972d783eRichard Oudkerk        p.start()
25437bdd93c20e2751420a4a51d019f6887e972d783eRichard Oudkerk        new_size = r.recv()
25447bdd93c20e2751420a4a51d019f6887e972d783eRichard Oudkerk        p.join()
25457bdd93c20e2751420a4a51d019f6887e972d783eRichard Oudkerk        self.assertLessEqual(new_size, old_size)
25467bdd93c20e2751420a4a51d019f6887e972d783eRichard Oudkerk
25478927e8f4211dc50b87a6365ed7281452a1931ebfKristján Valur Jónsson#
254841072db7099def8bcd26b5d64cb52f8fb6315adbRichard Oudkerk# Issue #17097: EINTR should be ignored by recv(), send(), accept() etc
254941072db7099def8bcd26b5d64cb52f8fb6315adbRichard Oudkerk#
255041072db7099def8bcd26b5d64cb52f8fb6315adbRichard Oudkerk
255141072db7099def8bcd26b5d64cb52f8fb6315adbRichard Oudkerkclass TestIgnoreEINTR(unittest.TestCase):
255241072db7099def8bcd26b5d64cb52f8fb6315adbRichard Oudkerk
255341072db7099def8bcd26b5d64cb52f8fb6315adbRichard Oudkerk    @classmethod
255441072db7099def8bcd26b5d64cb52f8fb6315adbRichard Oudkerk    def _test_ignore(cls, conn):
255541072db7099def8bcd26b5d64cb52f8fb6315adbRichard Oudkerk        def handler(signum, frame):
255641072db7099def8bcd26b5d64cb52f8fb6315adbRichard Oudkerk            pass
255741072db7099def8bcd26b5d64cb52f8fb6315adbRichard Oudkerk        signal.signal(signal.SIGUSR1, handler)
255841072db7099def8bcd26b5d64cb52f8fb6315adbRichard Oudkerk        conn.send('ready')
255941072db7099def8bcd26b5d64cb52f8fb6315adbRichard Oudkerk        x = conn.recv()
256041072db7099def8bcd26b5d64cb52f8fb6315adbRichard Oudkerk        conn.send(x)
256141072db7099def8bcd26b5d64cb52f8fb6315adbRichard Oudkerk        conn.send_bytes(b'x'*(1024*1024))   # sending 1 MB should block
256241072db7099def8bcd26b5d64cb52f8fb6315adbRichard Oudkerk
256341072db7099def8bcd26b5d64cb52f8fb6315adbRichard Oudkerk    @unittest.skipUnless(hasattr(signal, 'SIGUSR1'), 'requires SIGUSR1')
256441072db7099def8bcd26b5d64cb52f8fb6315adbRichard Oudkerk    def test_ignore(self):
256541072db7099def8bcd26b5d64cb52f8fb6315adbRichard Oudkerk        conn, child_conn = multiprocessing.Pipe()
256641072db7099def8bcd26b5d64cb52f8fb6315adbRichard Oudkerk        try:
256741072db7099def8bcd26b5d64cb52f8fb6315adbRichard Oudkerk            p = multiprocessing.Process(target=self._test_ignore,
256841072db7099def8bcd26b5d64cb52f8fb6315adbRichard Oudkerk                                        args=(child_conn,))
256941072db7099def8bcd26b5d64cb52f8fb6315adbRichard Oudkerk            p.daemon = True
257041072db7099def8bcd26b5d64cb52f8fb6315adbRichard Oudkerk            p.start()
257141072db7099def8bcd26b5d64cb52f8fb6315adbRichard Oudkerk            child_conn.close()
257241072db7099def8bcd26b5d64cb52f8fb6315adbRichard Oudkerk            self.assertEqual(conn.recv(), 'ready')
257341072db7099def8bcd26b5d64cb52f8fb6315adbRichard Oudkerk            time.sleep(0.1)
257441072db7099def8bcd26b5d64cb52f8fb6315adbRichard Oudkerk            os.kill(p.pid, signal.SIGUSR1)
257541072db7099def8bcd26b5d64cb52f8fb6315adbRichard Oudkerk            time.sleep(0.1)
257641072db7099def8bcd26b5d64cb52f8fb6315adbRichard Oudkerk            conn.send(1234)
257741072db7099def8bcd26b5d64cb52f8fb6315adbRichard Oudkerk            self.assertEqual(conn.recv(), 1234)
257841072db7099def8bcd26b5d64cb52f8fb6315adbRichard Oudkerk            time.sleep(0.1)
257941072db7099def8bcd26b5d64cb52f8fb6315adbRichard Oudkerk            os.kill(p.pid, signal.SIGUSR1)
258041072db7099def8bcd26b5d64cb52f8fb6315adbRichard Oudkerk            self.assertEqual(conn.recv_bytes(), b'x'*(1024*1024))
258141072db7099def8bcd26b5d64cb52f8fb6315adbRichard Oudkerk            time.sleep(0.1)
258241072db7099def8bcd26b5d64cb52f8fb6315adbRichard Oudkerk            p.join()
258341072db7099def8bcd26b5d64cb52f8fb6315adbRichard Oudkerk        finally:
258441072db7099def8bcd26b5d64cb52f8fb6315adbRichard Oudkerk            conn.close()
258541072db7099def8bcd26b5d64cb52f8fb6315adbRichard Oudkerk
258641072db7099def8bcd26b5d64cb52f8fb6315adbRichard Oudkerk    @classmethod
258741072db7099def8bcd26b5d64cb52f8fb6315adbRichard Oudkerk    def _test_ignore_listener(cls, conn):
258841072db7099def8bcd26b5d64cb52f8fb6315adbRichard Oudkerk        def handler(signum, frame):
258941072db7099def8bcd26b5d64cb52f8fb6315adbRichard Oudkerk            pass
259041072db7099def8bcd26b5d64cb52f8fb6315adbRichard Oudkerk        signal.signal(signal.SIGUSR1, handler)
259141072db7099def8bcd26b5d64cb52f8fb6315adbRichard Oudkerk        l = multiprocessing.connection.Listener()
259241072db7099def8bcd26b5d64cb52f8fb6315adbRichard Oudkerk        conn.send(l.address)
259341072db7099def8bcd26b5d64cb52f8fb6315adbRichard Oudkerk        a = l.accept()
259441072db7099def8bcd26b5d64cb52f8fb6315adbRichard Oudkerk        a.send('welcome')
259541072db7099def8bcd26b5d64cb52f8fb6315adbRichard Oudkerk
259641072db7099def8bcd26b5d64cb52f8fb6315adbRichard Oudkerk    @unittest.skipUnless(hasattr(signal, 'SIGUSR1'), 'requires SIGUSR1')
259741072db7099def8bcd26b5d64cb52f8fb6315adbRichard Oudkerk    def test_ignore_listener(self):
259841072db7099def8bcd26b5d64cb52f8fb6315adbRichard Oudkerk        conn, child_conn = multiprocessing.Pipe()
259941072db7099def8bcd26b5d64cb52f8fb6315adbRichard Oudkerk        try:
260041072db7099def8bcd26b5d64cb52f8fb6315adbRichard Oudkerk            p = multiprocessing.Process(target=self._test_ignore_listener,
260141072db7099def8bcd26b5d64cb52f8fb6315adbRichard Oudkerk                                        args=(child_conn,))
260241072db7099def8bcd26b5d64cb52f8fb6315adbRichard Oudkerk            p.daemon = True
260341072db7099def8bcd26b5d64cb52f8fb6315adbRichard Oudkerk            p.start()
260441072db7099def8bcd26b5d64cb52f8fb6315adbRichard Oudkerk            child_conn.close()
260541072db7099def8bcd26b5d64cb52f8fb6315adbRichard Oudkerk            address = conn.recv()
260641072db7099def8bcd26b5d64cb52f8fb6315adbRichard Oudkerk            time.sleep(0.1)
260741072db7099def8bcd26b5d64cb52f8fb6315adbRichard Oudkerk            os.kill(p.pid, signal.SIGUSR1)
260841072db7099def8bcd26b5d64cb52f8fb6315adbRichard Oudkerk            time.sleep(0.1)
260941072db7099def8bcd26b5d64cb52f8fb6315adbRichard Oudkerk            client = multiprocessing.connection.Client(address)
261041072db7099def8bcd26b5d64cb52f8fb6315adbRichard Oudkerk            self.assertEqual(client.recv(), 'welcome')
261141072db7099def8bcd26b5d64cb52f8fb6315adbRichard Oudkerk            p.join()
261241072db7099def8bcd26b5d64cb52f8fb6315adbRichard Oudkerk        finally:
261341072db7099def8bcd26b5d64cb52f8fb6315adbRichard Oudkerk            conn.close()
261441072db7099def8bcd26b5d64cb52f8fb6315adbRichard Oudkerk
261541072db7099def8bcd26b5d64cb52f8fb6315adbRichard Oudkerk#
2616faee75c33af1e8ccbf0d4349efe62dc9637779c6Richard Oudkerk#
2617faee75c33af1e8ccbf0d4349efe62dc9637779c6Richard Oudkerk#
2618faee75c33af1e8ccbf0d4349efe62dc9637779c6Richard Oudkerk
26191b90efbdc5bb204fe50aea87374603dcba309227Jesse Nollertestcases_other = [OtherTest, TestInvalidHandle, TestInitializers,
26208927e8f4211dc50b87a6365ed7281452a1931ebfKristján Valur Jónsson                   TestStdinBadfiledescriptor, TestTimeouts, TestNoForkBomb,
262141072db7099def8bcd26b5d64cb52f8fb6315adbRichard Oudkerk                   TestFlags, TestForkAwareThreadLock, TestIgnoreEINTR]
26220c519b3a5e847eea0dffb51ac8df7c68891daf70Neal Norwitz
2623dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson#
2624dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson#
2625dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson#
2626dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
2627dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersondef test_main(run=None):
262818623825d25b0f8f3b4bf96c1d5c4c2977a94004Jesse Noller    if sys.platform.startswith("linux"):
262918623825d25b0f8f3b4bf96c1d5c4c2977a94004Jesse Noller        try:
263018623825d25b0f8f3b4bf96c1d5c4c2977a94004Jesse Noller            lock = multiprocessing.RLock()
263118623825d25b0f8f3b4bf96c1d5c4c2977a94004Jesse Noller        except OSError:
2632bec087f29d7dca0aaf8f51be7d7c135e9b84e7f1Benjamin Peterson            raise unittest.SkipTest("OSError raises on RLock creation, see issue 3111!")
2633ed77f2e143102df58212ff1f64a87f7e0c237439Benjamin Peterson
26346392d7f68bbc11e3ad3417f52c93f33dcc0c4cd0Charles-François Natali    check_enough_semaphores()
26356392d7f68bbc11e3ad3417f52c93f33dcc0c4cd0Charles-François Natali
2636dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    if run is None:
2637dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        from test.test_support import run_unittest as run
2638dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
2639dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    util.get_temp_dir()     # creates temp directory for use by all processes
2640dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
2641dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    multiprocessing.get_logger().setLevel(LOG_LEVEL)
2642dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
2643146b7ab818cadccf91ad98e64cfefb77705da0caJesse Noller    ProcessesMixin.pool = multiprocessing.Pool(4)
2644146b7ab818cadccf91ad98e64cfefb77705da0caJesse Noller    ThreadsMixin.pool = multiprocessing.dummy.Pool(4)
2645146b7ab818cadccf91ad98e64cfefb77705da0caJesse Noller    ManagerMixin.manager.__init__()
2646146b7ab818cadccf91ad98e64cfefb77705da0caJesse Noller    ManagerMixin.manager.start()
2647146b7ab818cadccf91ad98e64cfefb77705da0caJesse Noller    ManagerMixin.pool = ManagerMixin.manager.Pool(4)
2648dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
2649dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    testcases = (
2650146b7ab818cadccf91ad98e64cfefb77705da0caJesse Noller        sorted(testcases_processes.values(), key=lambda tc:tc.__name__) +
2651146b7ab818cadccf91ad98e64cfefb77705da0caJesse Noller        sorted(testcases_threads.values(), key=lambda tc:tc.__name__) +
26520c519b3a5e847eea0dffb51ac8df7c68891daf70Neal Norwitz        sorted(testcases_manager.values(), key=lambda tc:tc.__name__) +
26530c519b3a5e847eea0dffb51ac8df7c68891daf70Neal Norwitz        testcases_other
2654dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        )
2655dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
2656dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    loadTestsFromTestCase = unittest.defaultTestLoader.loadTestsFromTestCase
2657dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    suite = unittest.TestSuite(loadTestsFromTestCase(tc) for tc in testcases)
265813623662eac551c8575ec2507d9afc2a5fcba033Nick Coghlan    # (ncoghlan): Whether or not sys.exc_clear is executed by the threading
265913623662eac551c8575ec2507d9afc2a5fcba033Nick Coghlan    # module during these tests is at least platform dependent and possibly
266014459d5b1b800854ef8f1bbadf019682a6413a32Nick Coghlan    # non-deterministic on any given platform. So we don't mind if the listed
266113623662eac551c8575ec2507d9afc2a5fcba033Nick Coghlan    # warnings aren't actually raised.
266207627880813ffaad8d9b90bfe8791ccf588b031bFlorent Xicluna    with test_support.check_py3k_warnings(
266313623662eac551c8575ec2507d9afc2a5fcba033Nick Coghlan            (".+__(get|set)slice__ has been removed", DeprecationWarning),
266413623662eac551c8575ec2507d9afc2a5fcba033Nick Coghlan            (r"sys.exc_clear\(\) not supported", DeprecationWarning),
266513623662eac551c8575ec2507d9afc2a5fcba033Nick Coghlan            quiet=True):
266607627880813ffaad8d9b90bfe8791ccf588b031bFlorent Xicluna        run(suite)
2667dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
2668146b7ab818cadccf91ad98e64cfefb77705da0caJesse Noller    ThreadsMixin.pool.terminate()
2669146b7ab818cadccf91ad98e64cfefb77705da0caJesse Noller    ProcessesMixin.pool.terminate()
2670146b7ab818cadccf91ad98e64cfefb77705da0caJesse Noller    ManagerMixin.pool.terminate()
2671146b7ab818cadccf91ad98e64cfefb77705da0caJesse Noller    ManagerMixin.manager.shutdown()
2672dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
2673146b7ab818cadccf91ad98e64cfefb77705da0caJesse Noller    del ProcessesMixin.pool, ThreadsMixin.pool, ManagerMixin.pool
2674dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
2675dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersondef main():
2676dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    test_main(unittest.TextTestRunner(verbosity=2).run)
2677dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
2678dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonif __name__ == '__main__':
2679dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    main()
2680