test_multiprocessing.py revision cef2006eaff86f843b8f0fc21fc7b652415b96ed
176cf55f49965f485633ac78bb34890ad6f77a876Jesse Noller#!/usr/bin/env python
276cf55f49965f485633ac78bb34890ad6f77a876Jesse Noller
3dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson#
4dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# Unit tests for the multiprocessing package
5dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson#
6dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
7dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonimport unittest
8dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonimport Queue
9dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonimport time
10dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonimport sys
11dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonimport os
12dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonimport gc
13dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonimport signal
14dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonimport array
15dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonimport socket
16dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonimport random
17dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonimport logging
18a1a8da8bf5d6d27936702f9241c8726efd6b4b42Antoine Pitrouimport errno
19faee75c33af1e8ccbf0d4349efe62dc9637779c6Richard Oudkerkimport test.script_helper
20c4920e86ef7511b4e858028e870b1811437a71d0Mark Dickinsonfrom test import test_support
211b90efbdc5bb204fe50aea87374603dcba309227Jesse Nollerfrom StringIO import StringIO
223db8a3432bd84b58bdc7da2c9872777c537a4d09R. David Murray_multiprocessing = test_support.import_module('_multiprocessing')
23c2077b0d9b5bf99768c6f396bf7ae6c41b682465Ezio Melotti# import threading after _multiprocessing to raise a more relevant error
24613b4cf28337902a586f259c6144083771fc06e5Victor Stinner# message: "No module named _multiprocessing". _multiprocessing is not compiled
25613b4cf28337902a586f259c6144083771fc06e5Victor Stinner# without thread support.
26613b4cf28337902a586f259c6144083771fc06e5Victor Stinnerimport threading
273db8a3432bd84b58bdc7da2c9872777c537a4d09R. David Murray
2837040cdace1982772e5f35e4acfa13861d72065dJesse Noller# Work around broken sem_open implementations
293db8a3432bd84b58bdc7da2c9872777c537a4d09R. David Murraytest_support.import_module('multiprocessing.synchronize')
3037040cdace1982772e5f35e4acfa13861d72065dJesse Noller
31dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonimport multiprocessing.dummy
32dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonimport multiprocessing.connection
33dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonimport multiprocessing.managers
34dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonimport multiprocessing.heap
35dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonimport multiprocessing.pool
36dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
37f8413b29c07babc49a2a891f8716f4fcda538489Charles-François Natalifrom multiprocessing import util
38f8413b29c07babc49a2a891f8716f4fcda538489Charles-François Natali
39f8413b29c07babc49a2a891f8716f4fcda538489Charles-François Natalitry:
40f8413b29c07babc49a2a891f8716f4fcda538489Charles-François Natali    from multiprocessing import reduction
41f8413b29c07babc49a2a891f8716f4fcda538489Charles-François Natali    HAS_REDUCTION = True
42f8413b29c07babc49a2a891f8716f4fcda538489Charles-François Nataliexcept ImportError:
43f8413b29c07babc49a2a891f8716f4fcda538489Charles-François Natali    HAS_REDUCTION = False
44dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
45a06e9b8f6b2edf4936146fa8867f12222106d0f8Brian Curtintry:
46a06e9b8f6b2edf4936146fa8867f12222106d0f8Brian Curtin    from multiprocessing.sharedctypes import Value, copy
47a06e9b8f6b2edf4936146fa8867f12222106d0f8Brian Curtin    HAS_SHAREDCTYPES = True
48a06e9b8f6b2edf4936146fa8867f12222106d0f8Brian Curtinexcept ImportError:
49a06e9b8f6b2edf4936146fa8867f12222106d0f8Brian Curtin    HAS_SHAREDCTYPES = False
50a06e9b8f6b2edf4936146fa8867f12222106d0f8Brian Curtin
51a1a8da8bf5d6d27936702f9241c8726efd6b4b42Antoine Pitroutry:
52a1a8da8bf5d6d27936702f9241c8726efd6b4b42Antoine Pitrou    import msvcrt
53a1a8da8bf5d6d27936702f9241c8726efd6b4b42Antoine Pitrouexcept ImportError:
54a1a8da8bf5d6d27936702f9241c8726efd6b4b42Antoine Pitrou    msvcrt = None
55a1a8da8bf5d6d27936702f9241c8726efd6b4b42Antoine Pitrou
56dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson#
57dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson#
58dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson#
59dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
60e79edf5f7c53f977b8e1fe8c00773e4668e35ea9Benjamin Petersonlatin = str
61dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
62dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson#
63dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# Constants
64dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson#
65dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
66dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin PetersonLOG_LEVEL = util.SUBWARNING
67654ade3e6afa2527d1f642be28d69e219bd58b71Jesse Noller#LOG_LEVEL = logging.DEBUG
68dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
69dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin PetersonDELTA = 0.1
70dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin PetersonCHECK_TIMINGS = False     # making true makes tests take a lot longer
71dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson                          # and can sometimes cause some non-serious
72dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson                          # failures because some calls block a bit
73dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson                          # longer than expected
74dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonif CHECK_TIMINGS:
75dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    TIMEOUT1, TIMEOUT2, TIMEOUT3 = 0.82, 0.35, 1.4
76dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonelse:
77dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    TIMEOUT1, TIMEOUT2, TIMEOUT3 = 0.1, 0.1, 0.1
78dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
79dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin PetersonHAVE_GETVALUE = not getattr(_multiprocessing,
80dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson                            'HAVE_BROKEN_SEM_GETVALUE', False)
81dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
829a5b2ad38d605206f05a52fe32868d3f839e8a86Jesse NollerWIN32 = (sys.platform == "win32")
839a5b2ad38d605206f05a52fe32868d3f839e8a86Jesse Noller
84a1a8da8bf5d6d27936702f9241c8726efd6b4b42Antoine Pitroutry:
85a1a8da8bf5d6d27936702f9241c8726efd6b4b42Antoine Pitrou    MAXFD = os.sysconf("SC_OPEN_MAX")
86a1a8da8bf5d6d27936702f9241c8726efd6b4b42Antoine Pitrouexcept:
87a1a8da8bf5d6d27936702f9241c8726efd6b4b42Antoine Pitrou    MAXFD = 256
88a1a8da8bf5d6d27936702f9241c8726efd6b4b42Antoine Pitrou
89dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson#
9036b9fbb803659350f9e6182b85f5bf66ca2a72a8Florent Xicluna# Some tests require ctypes
9136b9fbb803659350f9e6182b85f5bf66ca2a72a8Florent Xicluna#
9236b9fbb803659350f9e6182b85f5bf66ca2a72a8Florent Xicluna
9336b9fbb803659350f9e6182b85f5bf66ca2a72a8Florent Xiclunatry:
9413623662eac551c8575ec2507d9afc2a5fcba033Nick Coghlan    from ctypes import Structure, c_int, c_double
9536b9fbb803659350f9e6182b85f5bf66ca2a72a8Florent Xiclunaexcept ImportError:
9636b9fbb803659350f9e6182b85f5bf66ca2a72a8Florent Xicluna    Structure = object
9736b9fbb803659350f9e6182b85f5bf66ca2a72a8Florent Xicluna    c_int = c_double = None
9836b9fbb803659350f9e6182b85f5bf66ca2a72a8Florent Xicluna
996392d7f68bbc11e3ad3417f52c93f33dcc0c4cd0Charles-François Natali
1006392d7f68bbc11e3ad3417f52c93f33dcc0c4cd0Charles-François Natalidef check_enough_semaphores():
1016392d7f68bbc11e3ad3417f52c93f33dcc0c4cd0Charles-François Natali    """Check that the system supports enough semaphores to run the test."""
1026392d7f68bbc11e3ad3417f52c93f33dcc0c4cd0Charles-François Natali    # minimum number of semaphores available according to POSIX
1036392d7f68bbc11e3ad3417f52c93f33dcc0c4cd0Charles-François Natali    nsems_min = 256
1046392d7f68bbc11e3ad3417f52c93f33dcc0c4cd0Charles-François Natali    try:
1056392d7f68bbc11e3ad3417f52c93f33dcc0c4cd0Charles-François Natali        nsems = os.sysconf("SC_SEM_NSEMS_MAX")
1066392d7f68bbc11e3ad3417f52c93f33dcc0c4cd0Charles-François Natali    except (AttributeError, ValueError):
1076392d7f68bbc11e3ad3417f52c93f33dcc0c4cd0Charles-François Natali        # sysconf not available or setting not available
1086392d7f68bbc11e3ad3417f52c93f33dcc0c4cd0Charles-François Natali        return
1096392d7f68bbc11e3ad3417f52c93f33dcc0c4cd0Charles-François Natali    if nsems == -1 or nsems >= nsems_min:
1106392d7f68bbc11e3ad3417f52c93f33dcc0c4cd0Charles-François Natali        return
1116392d7f68bbc11e3ad3417f52c93f33dcc0c4cd0Charles-François Natali    raise unittest.SkipTest("The OS doesn't support enough semaphores "
1126392d7f68bbc11e3ad3417f52c93f33dcc0c4cd0Charles-François Natali                            "to run the test (required: %d)." % nsems_min)
1136392d7f68bbc11e3ad3417f52c93f33dcc0c4cd0Charles-François Natali
1146392d7f68bbc11e3ad3417f52c93f33dcc0c4cd0Charles-François Natali
11536b9fbb803659350f9e6182b85f5bf66ca2a72a8Florent Xicluna#
116dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# Creates a wrapper for a function which records the time it takes to finish
117dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson#
118dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
119dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonclass TimingWrapper(object):
120dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
121dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def __init__(self, func):
122dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.func = func
123dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.elapsed = None
124dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
125dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def __call__(self, *args, **kwds):
126dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        t = time.time()
127dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        try:
128dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            return self.func(*args, **kwds)
129dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        finally:
130dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            self.elapsed = time.time() - t
131dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
132dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson#
133dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# Base class for test cases
134dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson#
135dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
136dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonclass BaseTestCase(object):
137dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
138dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    ALLOWED_TYPES = ('processes', 'manager', 'threads')
139dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
140dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def assertTimingAlmostEqual(self, a, b):
141dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        if CHECK_TIMINGS:
142dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            self.assertAlmostEqual(a, b, 1)
143dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
144dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def assertReturnsIfImplemented(self, value, func, *args):
145dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        try:
146dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            res = func(*args)
147dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        except NotImplementedError:
148dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            pass
149dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        else:
150dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            return self.assertEqual(value, res)
151dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1524eb2b28553eceda5a19465534bc906929dd85243Antoine Pitrou    # For the sanity of Windows users, rather than crashing or freezing in
1534eb2b28553eceda5a19465534bc906929dd85243Antoine Pitrou    # multiple ways.
1544eb2b28553eceda5a19465534bc906929dd85243Antoine Pitrou    def __reduce__(self, *args):
1554eb2b28553eceda5a19465534bc906929dd85243Antoine Pitrou        raise NotImplementedError("shouldn't try to pickle a test case")
1564eb2b28553eceda5a19465534bc906929dd85243Antoine Pitrou
1574eb2b28553eceda5a19465534bc906929dd85243Antoine Pitrou    __reduce_ex__ = __reduce__
1584eb2b28553eceda5a19465534bc906929dd85243Antoine Pitrou
159dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson#
160dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# Return the value of a semaphore
161dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson#
162dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
163dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersondef get_value(self):
164dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    try:
165dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        return self.get_value()
166dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    except AttributeError:
167dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        try:
168dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            return self._Semaphore__value
169dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        except AttributeError:
170dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            try:
171dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson                return self._value
172dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            except AttributeError:
173dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson                raise NotImplementedError
174dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
175dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson#
176dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# Testcases
177dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson#
178dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
179dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonclass _TestProcess(BaseTestCase):
180dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
181dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    ALLOWED_TYPES = ('processes', 'threads')
182dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
183dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def test_current(self):
184dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        if self.TYPE == 'threads':
185dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            return
186dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
187dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        current = self.current_process()
1885bc9f4c09c99eb701dbee83fb9e26eed558e474fJesse Noller        authkey = current.authkey
189dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
190dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertTrue(current.is_alive())
1915bc9f4c09c99eb701dbee83fb9e26eed558e474fJesse Noller        self.assertTrue(not current.daemon)
192b0f5adc3f4e098b1744eeac65fc830fb1df2b8abEzio Melotti        self.assertIsInstance(authkey, bytes)
193dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertTrue(len(authkey) > 0)
1945bc9f4c09c99eb701dbee83fb9e26eed558e474fJesse Noller        self.assertEqual(current.ident, os.getpid())
1955bc9f4c09c99eb701dbee83fb9e26eed558e474fJesse Noller        self.assertEqual(current.exitcode, None)
196dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1974eb2b28553eceda5a19465534bc906929dd85243Antoine Pitrou    @classmethod
1984eb2b28553eceda5a19465534bc906929dd85243Antoine Pitrou    def _test(cls, q, *args, **kwds):
1994eb2b28553eceda5a19465534bc906929dd85243Antoine Pitrou        current = cls.current_process()
200dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        q.put(args)
201dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        q.put(kwds)
2025bc9f4c09c99eb701dbee83fb9e26eed558e474fJesse Noller        q.put(current.name)
2034eb2b28553eceda5a19465534bc906929dd85243Antoine Pitrou        if cls.TYPE != 'threads':
2045bc9f4c09c99eb701dbee83fb9e26eed558e474fJesse Noller            q.put(bytes(current.authkey))
205dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            q.put(current.pid)
206dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
207dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def test_process(self):
208dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        q = self.Queue(1)
209dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        e = self.Event()
210dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        args = (q, 1, 2)
211dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        kwargs = {'hello':23, 'bye':2.54}
212dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        name = 'SomeProcess'
213dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        p = self.Process(
214dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            target=self._test, args=args, kwargs=kwargs, name=name
215dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            )
2165bc9f4c09c99eb701dbee83fb9e26eed558e474fJesse Noller        p.daemon = True
217dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        current = self.current_process()
218dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
219dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        if self.TYPE != 'threads':
2202623a37852153363335956afab010cb0beb7e74eEzio Melotti            self.assertEqual(p.authkey, current.authkey)
2212623a37852153363335956afab010cb0beb7e74eEzio Melotti        self.assertEqual(p.is_alive(), False)
2222623a37852153363335956afab010cb0beb7e74eEzio Melotti        self.assertEqual(p.daemon, True)
223aa98058cc44ba20f35c106d20918c6196b737561Ezio Melotti        self.assertNotIn(p, self.active_children())
224dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertTrue(type(self.active_children()) is list)
2255bc9f4c09c99eb701dbee83fb9e26eed558e474fJesse Noller        self.assertEqual(p.exitcode, None)
226dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
227dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        p.start()
228dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
2292623a37852153363335956afab010cb0beb7e74eEzio Melotti        self.assertEqual(p.exitcode, None)
2302623a37852153363335956afab010cb0beb7e74eEzio Melotti        self.assertEqual(p.is_alive(), True)
231aa98058cc44ba20f35c106d20918c6196b737561Ezio Melotti        self.assertIn(p, self.active_children())
232dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
2332623a37852153363335956afab010cb0beb7e74eEzio Melotti        self.assertEqual(q.get(), args[1:])
2342623a37852153363335956afab010cb0beb7e74eEzio Melotti        self.assertEqual(q.get(), kwargs)
2352623a37852153363335956afab010cb0beb7e74eEzio Melotti        self.assertEqual(q.get(), p.name)
236dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        if self.TYPE != 'threads':
2372623a37852153363335956afab010cb0beb7e74eEzio Melotti            self.assertEqual(q.get(), current.authkey)
2382623a37852153363335956afab010cb0beb7e74eEzio Melotti            self.assertEqual(q.get(), p.pid)
239dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
240dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        p.join()
241dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
2422623a37852153363335956afab010cb0beb7e74eEzio Melotti        self.assertEqual(p.exitcode, 0)
2432623a37852153363335956afab010cb0beb7e74eEzio Melotti        self.assertEqual(p.is_alive(), False)
244aa98058cc44ba20f35c106d20918c6196b737561Ezio Melotti        self.assertNotIn(p, self.active_children())
245dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
2464eb2b28553eceda5a19465534bc906929dd85243Antoine Pitrou    @classmethod
2474eb2b28553eceda5a19465534bc906929dd85243Antoine Pitrou    def _test_terminate(cls):
248dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        time.sleep(1000)
249dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
250dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def test_terminate(self):
251dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        if self.TYPE == 'threads':
252dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            return
253dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
254dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        p = self.Process(target=self._test_terminate)
2555bc9f4c09c99eb701dbee83fb9e26eed558e474fJesse Noller        p.daemon = True
256dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        p.start()
257dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
258dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(p.is_alive(), True)
259aa98058cc44ba20f35c106d20918c6196b737561Ezio Melotti        self.assertIn(p, self.active_children())
2605bc9f4c09c99eb701dbee83fb9e26eed558e474fJesse Noller        self.assertEqual(p.exitcode, None)
261dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
262dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        p.terminate()
263dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
264dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        join = TimingWrapper(p.join)
265dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(join(), None)
266dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertTimingAlmostEqual(join.elapsed, 0.0)
267dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
268dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(p.is_alive(), False)
269aa98058cc44ba20f35c106d20918c6196b737561Ezio Melotti        self.assertNotIn(p, self.active_children())
270dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
271dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        p.join()
272dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
2735bc9f4c09c99eb701dbee83fb9e26eed558e474fJesse Noller        # XXX sometimes get p.exitcode == 0 on Windows ...
2745bc9f4c09c99eb701dbee83fb9e26eed558e474fJesse Noller        #self.assertEqual(p.exitcode, -signal.SIGTERM)
275dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
276dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def test_cpu_count(self):
277dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        try:
278dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            cpus = multiprocessing.cpu_count()
279dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        except NotImplementedError:
280dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            cpus = 1
281dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertTrue(type(cpus) is int)
282dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertTrue(cpus >= 1)
283dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
284dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def test_active_children(self):
285dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(type(self.active_children()), list)
286dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
287dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        p = self.Process(target=time.sleep, args=(DELTA,))
288aa98058cc44ba20f35c106d20918c6196b737561Ezio Melotti        self.assertNotIn(p, self.active_children())
289dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
2906f6016bc591305a9a99551ea7b1c467334c2b622Jesus Cea        p.daemon = True
291dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        p.start()
292aa98058cc44ba20f35c106d20918c6196b737561Ezio Melotti        self.assertIn(p, self.active_children())
293dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
294dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        p.join()
295aa98058cc44ba20f35c106d20918c6196b737561Ezio Melotti        self.assertNotIn(p, self.active_children())
296dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
2974eb2b28553eceda5a19465534bc906929dd85243Antoine Pitrou    @classmethod
2984eb2b28553eceda5a19465534bc906929dd85243Antoine Pitrou    def _test_recursion(cls, wconn, id):
299dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        from multiprocessing import forking
300dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        wconn.send(id)
301dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        if len(id) < 2:
302dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            for i in range(2):
3034eb2b28553eceda5a19465534bc906929dd85243Antoine Pitrou                p = cls.Process(
3044eb2b28553eceda5a19465534bc906929dd85243Antoine Pitrou                    target=cls._test_recursion, args=(wconn, id+[i])
305dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson                    )
306dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson                p.start()
307dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson                p.join()
308dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
309dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def test_recursion(self):
310dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        rconn, wconn = self.Pipe(duplex=False)
311dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self._test_recursion(wconn, [])
312dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
313dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        time.sleep(DELTA)
314dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        result = []
315dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        while rconn.poll():
316dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            result.append(rconn.recv())
317dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
318dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        expected = [
319dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            [],
320dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson              [0],
321dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson                [0, 0],
322dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson                [0, 1],
323dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson              [1],
324dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson                [1, 0],
325dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson                [1, 1]
326dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            ]
327dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(result, expected)
328dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
3292182e0578c21d9a89cb507300b5f2c5319dced93Richard Oudkerk    @classmethod
3302182e0578c21d9a89cb507300b5f2c5319dced93Richard Oudkerk    def _test_sys_exit(cls, reason, testfn):
3312182e0578c21d9a89cb507300b5f2c5319dced93Richard Oudkerk        sys.stderr = open(testfn, 'w')
3322182e0578c21d9a89cb507300b5f2c5319dced93Richard Oudkerk        sys.exit(reason)
3332182e0578c21d9a89cb507300b5f2c5319dced93Richard Oudkerk
3342182e0578c21d9a89cb507300b5f2c5319dced93Richard Oudkerk    def test_sys_exit(self):
3352182e0578c21d9a89cb507300b5f2c5319dced93Richard Oudkerk        # See Issue 13854
3362182e0578c21d9a89cb507300b5f2c5319dced93Richard Oudkerk        if self.TYPE == 'threads':
3372182e0578c21d9a89cb507300b5f2c5319dced93Richard Oudkerk            return
3382182e0578c21d9a89cb507300b5f2c5319dced93Richard Oudkerk
3392182e0578c21d9a89cb507300b5f2c5319dced93Richard Oudkerk        testfn = test_support.TESTFN
3402182e0578c21d9a89cb507300b5f2c5319dced93Richard Oudkerk        self.addCleanup(test_support.unlink, testfn)
3412182e0578c21d9a89cb507300b5f2c5319dced93Richard Oudkerk
3422182e0578c21d9a89cb507300b5f2c5319dced93Richard Oudkerk        for reason, code in (([1, 2, 3], 1), ('ignore this', 0)):
3432182e0578c21d9a89cb507300b5f2c5319dced93Richard Oudkerk            p = self.Process(target=self._test_sys_exit, args=(reason, testfn))
3442182e0578c21d9a89cb507300b5f2c5319dced93Richard Oudkerk            p.daemon = True
3452182e0578c21d9a89cb507300b5f2c5319dced93Richard Oudkerk            p.start()
3462182e0578c21d9a89cb507300b5f2c5319dced93Richard Oudkerk            p.join(5)
3472182e0578c21d9a89cb507300b5f2c5319dced93Richard Oudkerk            self.assertEqual(p.exitcode, code)
3482182e0578c21d9a89cb507300b5f2c5319dced93Richard Oudkerk
3492182e0578c21d9a89cb507300b5f2c5319dced93Richard Oudkerk            with open(testfn, 'r') as f:
3502182e0578c21d9a89cb507300b5f2c5319dced93Richard Oudkerk                self.assertEqual(f.read().rstrip(), str(reason))
3512182e0578c21d9a89cb507300b5f2c5319dced93Richard Oudkerk
3522182e0578c21d9a89cb507300b5f2c5319dced93Richard Oudkerk        for reason in (True, False, 8):
3532182e0578c21d9a89cb507300b5f2c5319dced93Richard Oudkerk            p = self.Process(target=sys.exit, args=(reason,))
3542182e0578c21d9a89cb507300b5f2c5319dced93Richard Oudkerk            p.daemon = True
3552182e0578c21d9a89cb507300b5f2c5319dced93Richard Oudkerk            p.start()
3562182e0578c21d9a89cb507300b5f2c5319dced93Richard Oudkerk            p.join(5)
3572182e0578c21d9a89cb507300b5f2c5319dced93Richard Oudkerk            self.assertEqual(p.exitcode, reason)
3582182e0578c21d9a89cb507300b5f2c5319dced93Richard Oudkerk
359dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson#
360dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson#
361dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson#
362dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
363dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonclass _UpperCaser(multiprocessing.Process):
364dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
365dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def __init__(self):
366dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        multiprocessing.Process.__init__(self)
367dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.child_conn, self.parent_conn = multiprocessing.Pipe()
368dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
369dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def run(self):
370dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.parent_conn.close()
371dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        for s in iter(self.child_conn.recv, None):
372dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            self.child_conn.send(s.upper())
373dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.child_conn.close()
374dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
375dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def submit(self, s):
376dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        assert type(s) is str
377dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.parent_conn.send(s)
378dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        return self.parent_conn.recv()
379dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
380dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def stop(self):
381dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.parent_conn.send(None)
382dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.parent_conn.close()
383dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.child_conn.close()
384dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
385dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonclass _TestSubclassingProcess(BaseTestCase):
386dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
387dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    ALLOWED_TYPES = ('processes',)
388dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
389dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def test_subclassing(self):
390dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        uppercaser = _UpperCaser()
3916f6016bc591305a9a99551ea7b1c467334c2b622Jesus Cea        uppercaser.daemon = True
392dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        uppercaser.start()
393dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(uppercaser.submit('hello'), 'HELLO')
394dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(uppercaser.submit('world'), 'WORLD')
395dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        uppercaser.stop()
396dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        uppercaser.join()
397dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
398dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson#
399dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson#
400dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson#
401dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
402dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersondef queue_empty(q):
403dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    if hasattr(q, 'empty'):
404dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        return q.empty()
405dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    else:
406dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        return q.qsize() == 0
407dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
408dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersondef queue_full(q, maxsize):
409dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    if hasattr(q, 'full'):
410dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        return q.full()
411dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    else:
412dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        return q.qsize() == maxsize
413dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
414dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
415dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonclass _TestQueue(BaseTestCase):
416dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
417dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
4184eb2b28553eceda5a19465534bc906929dd85243Antoine Pitrou    @classmethod
4194eb2b28553eceda5a19465534bc906929dd85243Antoine Pitrou    def _test_put(cls, queue, child_can_start, parent_can_continue):
420dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        child_can_start.wait()
421dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        for i in range(6):
422dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            queue.get()
423dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        parent_can_continue.set()
424dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
425dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def test_put(self):
426dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        MAXSIZE = 6
427dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        queue = self.Queue(maxsize=MAXSIZE)
428dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        child_can_start = self.Event()
429dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        parent_can_continue = self.Event()
430dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
431dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        proc = self.Process(
432dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            target=self._test_put,
433dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            args=(queue, child_can_start, parent_can_continue)
434dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            )
4355bc9f4c09c99eb701dbee83fb9e26eed558e474fJesse Noller        proc.daemon = True
436dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        proc.start()
437dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
438dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(queue_empty(queue), True)
439dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(queue_full(queue, MAXSIZE), False)
440dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
441dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        queue.put(1)
442dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        queue.put(2, True)
443dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        queue.put(3, True, None)
444dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        queue.put(4, False)
445dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        queue.put(5, False, None)
446dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        queue.put_nowait(6)
447dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
448dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        # the values may be in buffer but not yet in pipe so sleep a bit
449dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        time.sleep(DELTA)
450dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
451dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(queue_empty(queue), False)
452dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(queue_full(queue, MAXSIZE), True)
453dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
454dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        put = TimingWrapper(queue.put)
455dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        put_nowait = TimingWrapper(queue.put_nowait)
456dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
457dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertRaises(Queue.Full, put, 7, False)
458dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertTimingAlmostEqual(put.elapsed, 0)
459dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
460dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertRaises(Queue.Full, put, 7, False, None)
461dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertTimingAlmostEqual(put.elapsed, 0)
462dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
463dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertRaises(Queue.Full, put_nowait, 7)
464dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertTimingAlmostEqual(put_nowait.elapsed, 0)
465dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
466dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertRaises(Queue.Full, put, 7, True, TIMEOUT1)
467dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertTimingAlmostEqual(put.elapsed, TIMEOUT1)
468dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
469dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertRaises(Queue.Full, put, 7, False, TIMEOUT2)
470dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertTimingAlmostEqual(put.elapsed, 0)
471dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
472dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertRaises(Queue.Full, put, 7, True, timeout=TIMEOUT3)
473dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertTimingAlmostEqual(put.elapsed, TIMEOUT3)
474dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
475dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        child_can_start.set()
476dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        parent_can_continue.wait()
477dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
478dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(queue_empty(queue), True)
479dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(queue_full(queue, MAXSIZE), False)
480dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
481dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        proc.join()
482dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
4834eb2b28553eceda5a19465534bc906929dd85243Antoine Pitrou    @classmethod
4844eb2b28553eceda5a19465534bc906929dd85243Antoine Pitrou    def _test_get(cls, queue, child_can_start, parent_can_continue):
485dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        child_can_start.wait()
486da3a1b120055855a464c2d5f5143021ae8f5dc86Benjamin Peterson        #queue.put(1)
487dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        queue.put(2)
488dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        queue.put(3)
489dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        queue.put(4)
490dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        queue.put(5)
491dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        parent_can_continue.set()
492dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
493dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def test_get(self):
494dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        queue = self.Queue()
495dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        child_can_start = self.Event()
496dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        parent_can_continue = self.Event()
497dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
498dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        proc = self.Process(
499dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            target=self._test_get,
500dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            args=(queue, child_can_start, parent_can_continue)
501dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            )
5025bc9f4c09c99eb701dbee83fb9e26eed558e474fJesse Noller        proc.daemon = True
503dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        proc.start()
504dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
505dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(queue_empty(queue), True)
506dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
507dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        child_can_start.set()
508dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        parent_can_continue.wait()
509dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
510dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        time.sleep(DELTA)
511dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(queue_empty(queue), False)
512dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
513da3a1b120055855a464c2d5f5143021ae8f5dc86Benjamin Peterson        # Hangs unexpectedly, remove for now
514da3a1b120055855a464c2d5f5143021ae8f5dc86Benjamin Peterson        #self.assertEqual(queue.get(), 1)
515dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(queue.get(True, None), 2)
516dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(queue.get(True), 3)
517dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(queue.get(timeout=1), 4)
518dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(queue.get_nowait(), 5)
519dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
520dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(queue_empty(queue), True)
521dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
522dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        get = TimingWrapper(queue.get)
523dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        get_nowait = TimingWrapper(queue.get_nowait)
524dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
525dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertRaises(Queue.Empty, get, False)
526dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertTimingAlmostEqual(get.elapsed, 0)
527dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
528dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertRaises(Queue.Empty, get, False, None)
529dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertTimingAlmostEqual(get.elapsed, 0)
530dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
531dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertRaises(Queue.Empty, get_nowait)
532dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertTimingAlmostEqual(get_nowait.elapsed, 0)
533dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
534dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertRaises(Queue.Empty, get, True, TIMEOUT1)
535dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertTimingAlmostEqual(get.elapsed, TIMEOUT1)
536dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
537dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertRaises(Queue.Empty, get, False, TIMEOUT2)
538dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertTimingAlmostEqual(get.elapsed, 0)
539dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
540dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertRaises(Queue.Empty, get, timeout=TIMEOUT3)
541dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertTimingAlmostEqual(get.elapsed, TIMEOUT3)
542dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
543dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        proc.join()
544dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
5454eb2b28553eceda5a19465534bc906929dd85243Antoine Pitrou    @classmethod
5464eb2b28553eceda5a19465534bc906929dd85243Antoine Pitrou    def _test_fork(cls, queue):
547dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        for i in range(10, 20):
548dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            queue.put(i)
549dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        # note that at this point the items may only be buffered, so the
550dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        # process cannot shutdown until the feeder thread has finished
551dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        # pushing items onto the pipe.
552dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
553dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def test_fork(self):
554dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        # Old versions of Queue would fail to create a new feeder
555dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        # thread for a forked process if the original process had its
556dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        # own feeder thread.  This test checks that this no longer
557dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        # happens.
558dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
559dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        queue = self.Queue()
560dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
561dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        # put items on queue so that main process starts a feeder thread
562dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        for i in range(10):
563dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            queue.put(i)
564dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
565dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        # wait to make sure thread starts before we fork a new process
566dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        time.sleep(DELTA)
567dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
568dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        # fork process
569dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        p = self.Process(target=self._test_fork, args=(queue,))
5706f6016bc591305a9a99551ea7b1c467334c2b622Jesus Cea        p.daemon = True
571dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        p.start()
572dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
573dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        # check that all expected items are in the queue
574dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        for i in range(20):
575dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            self.assertEqual(queue.get(), i)
576dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertRaises(Queue.Empty, queue.get, False)
577dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
578dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        p.join()
579dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
580dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def test_qsize(self):
581dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        q = self.Queue()
582dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        try:
583dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            self.assertEqual(q.qsize(), 0)
584dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        except NotImplementedError:
585dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            return
586dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        q.put(1)
587dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(q.qsize(), 1)
588dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        q.put(5)
589dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(q.qsize(), 2)
590dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        q.get()
591dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(q.qsize(), 1)
592dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        q.get()
593dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(q.qsize(), 0)
594dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
5954eb2b28553eceda5a19465534bc906929dd85243Antoine Pitrou    @classmethod
5964eb2b28553eceda5a19465534bc906929dd85243Antoine Pitrou    def _test_task_done(cls, q):
597dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        for obj in iter(q.get, None):
598dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            time.sleep(DELTA)
599dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            q.task_done()
600dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
601dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def test_task_done(self):
602dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        queue = self.JoinableQueue()
603dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
604dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        if sys.version_info < (2, 5) and not hasattr(queue, 'task_done'):
60536b9fbb803659350f9e6182b85f5bf66ca2a72a8Florent Xicluna            self.skipTest("requires 'queue.task_done()' method")
606dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
607dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        workers = [self.Process(target=self._test_task_done, args=(queue,))
608dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson                   for i in xrange(4)]
609dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
610dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        for p in workers:
6116f6016bc591305a9a99551ea7b1c467334c2b622Jesus Cea            p.daemon = True
612dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            p.start()
613dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
614dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        for i in xrange(10):
615dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            queue.put(i)
616dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
617dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        queue.join()
618dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
619dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        for p in workers:
620dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            queue.put(None)
621dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
622dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        for p in workers:
623dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            p.join()
624dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
625dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson#
626dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson#
627dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson#
628dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
629dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonclass _TestLock(BaseTestCase):
630dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
631dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def test_lock(self):
632dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        lock = self.Lock()
633dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(lock.acquire(), True)
634dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(lock.acquire(False), False)
635dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(lock.release(), None)
636dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertRaises((ValueError, threading.ThreadError), lock.release)
637dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
638dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def test_rlock(self):
639dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        lock = self.RLock()
640dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(lock.acquire(), True)
641dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(lock.acquire(), True)
642dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(lock.acquire(), True)
643dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(lock.release(), None)
644dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(lock.release(), None)
645dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(lock.release(), None)
646dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertRaises((AssertionError, RuntimeError), lock.release)
647dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
64882eb5902ce169be81110c79662b772b904cd00fcJesse Noller    def test_lock_context(self):
64982eb5902ce169be81110c79662b772b904cd00fcJesse Noller        with self.Lock():
65082eb5902ce169be81110c79662b772b904cd00fcJesse Noller            pass
65182eb5902ce169be81110c79662b772b904cd00fcJesse Noller
652dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
653dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonclass _TestSemaphore(BaseTestCase):
654dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
655dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def _test_semaphore(self, sem):
656dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertReturnsIfImplemented(2, get_value, sem)
657dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(sem.acquire(), True)
658dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertReturnsIfImplemented(1, get_value, sem)
659dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(sem.acquire(), True)
660dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertReturnsIfImplemented(0, get_value, sem)
661dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(sem.acquire(False), False)
662dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertReturnsIfImplemented(0, get_value, sem)
663dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(sem.release(), None)
664dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertReturnsIfImplemented(1, get_value, sem)
665dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(sem.release(), None)
666dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertReturnsIfImplemented(2, get_value, sem)
667dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
668dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def test_semaphore(self):
669dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        sem = self.Semaphore(2)
670dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self._test_semaphore(sem)
671dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(sem.release(), None)
672dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertReturnsIfImplemented(3, get_value, sem)
673dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(sem.release(), None)
674dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertReturnsIfImplemented(4, get_value, sem)
675dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
676dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def test_bounded_semaphore(self):
677dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        sem = self.BoundedSemaphore(2)
678dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self._test_semaphore(sem)
679dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        # Currently fails on OS/X
680dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        #if HAVE_GETVALUE:
681dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        #    self.assertRaises(ValueError, sem.release)
682dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        #    self.assertReturnsIfImplemented(2, get_value, sem)
683dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
684dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def test_timeout(self):
685dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        if self.TYPE != 'processes':
686dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            return
687dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
688dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        sem = self.Semaphore(0)
689dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        acquire = TimingWrapper(sem.acquire)
690dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
691dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(acquire(False), False)
692dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertTimingAlmostEqual(acquire.elapsed, 0.0)
693dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
694dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(acquire(False, None), False)
695dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertTimingAlmostEqual(acquire.elapsed, 0.0)
696dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
697dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(acquire(False, TIMEOUT1), False)
698dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertTimingAlmostEqual(acquire.elapsed, 0)
699dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
700dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(acquire(True, TIMEOUT2), False)
701dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertTimingAlmostEqual(acquire.elapsed, TIMEOUT2)
702dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
703dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(acquire(timeout=TIMEOUT3), False)
704dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertTimingAlmostEqual(acquire.elapsed, TIMEOUT3)
705dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
706dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
707dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonclass _TestCondition(BaseTestCase):
708dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
7094eb2b28553eceda5a19465534bc906929dd85243Antoine Pitrou    @classmethod
7104eb2b28553eceda5a19465534bc906929dd85243Antoine Pitrou    def f(cls, cond, sleeping, woken, timeout=None):
711dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        cond.acquire()
712dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        sleeping.release()
713dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        cond.wait(timeout)
714dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        woken.release()
715dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        cond.release()
716dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
717dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def check_invariant(self, cond):
718dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        # this is only supposed to succeed when there are no sleepers
719dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        if self.TYPE == 'processes':
720dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            try:
721dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson                sleepers = (cond._sleeping_count.get_value() -
722dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson                            cond._woken_count.get_value())
723dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson                self.assertEqual(sleepers, 0)
724dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson                self.assertEqual(cond._wait_semaphore.get_value(), 0)
725dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            except NotImplementedError:
726dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson                pass
727dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
728dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def test_notify(self):
729dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        cond = self.Condition()
730dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        sleeping = self.Semaphore(0)
731dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        woken = self.Semaphore(0)
732dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
733dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        p = self.Process(target=self.f, args=(cond, sleeping, woken))
7345bc9f4c09c99eb701dbee83fb9e26eed558e474fJesse Noller        p.daemon = True
735dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        p.start()
736dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
737dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        p = threading.Thread(target=self.f, args=(cond, sleeping, woken))
7385bc9f4c09c99eb701dbee83fb9e26eed558e474fJesse Noller        p.daemon = True
739dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        p.start()
740dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
741dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        # wait for both children to start sleeping
742dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        sleeping.acquire()
743dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        sleeping.acquire()
744dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
745dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        # check no process/thread has woken up
746dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        time.sleep(DELTA)
747dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertReturnsIfImplemented(0, get_value, woken)
748dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
749dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        # wake up one process/thread
750dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        cond.acquire()
751dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        cond.notify()
752dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        cond.release()
753dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
754dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        # check one process/thread has woken up
755dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        time.sleep(DELTA)
756dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertReturnsIfImplemented(1, get_value, woken)
757dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
758dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        # wake up another
759dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        cond.acquire()
760dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        cond.notify()
761dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        cond.release()
762dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
763dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        # check other has woken up
764dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        time.sleep(DELTA)
765dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertReturnsIfImplemented(2, get_value, woken)
766dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
767dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        # check state is not mucked up
768dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.check_invariant(cond)
769dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        p.join()
770dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
771dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def test_notify_all(self):
772dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        cond = self.Condition()
773dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        sleeping = self.Semaphore(0)
774dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        woken = self.Semaphore(0)
775dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
776dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        # start some threads/processes which will timeout
777dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        for i in range(3):
778dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            p = self.Process(target=self.f,
779dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson                             args=(cond, sleeping, woken, TIMEOUT1))
7805bc9f4c09c99eb701dbee83fb9e26eed558e474fJesse Noller            p.daemon = True
781dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            p.start()
782dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
783dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            t = threading.Thread(target=self.f,
784dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson                                 args=(cond, sleeping, woken, TIMEOUT1))
785a9b2222de40ed62e6ec1c79f6a89607913f4babdBenjamin Peterson            t.daemon = True
786dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            t.start()
787dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
788dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        # wait for them all to sleep
789dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        for i in xrange(6):
790dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            sleeping.acquire()
791dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
792dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        # check they have all timed out
793dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        for i in xrange(6):
794dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            woken.acquire()
795dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertReturnsIfImplemented(0, get_value, woken)
796dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
797dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        # check state is not mucked up
798dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.check_invariant(cond)
799dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
800dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        # start some more threads/processes
801dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        for i in range(3):
802dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            p = self.Process(target=self.f, args=(cond, sleeping, woken))
8035bc9f4c09c99eb701dbee83fb9e26eed558e474fJesse Noller            p.daemon = True
804dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            p.start()
805dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
806dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            t = threading.Thread(target=self.f, args=(cond, sleeping, woken))
807a9b2222de40ed62e6ec1c79f6a89607913f4babdBenjamin Peterson            t.daemon = True
808dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            t.start()
809dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
810dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        # wait for them to all sleep
811dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        for i in xrange(6):
812dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            sleeping.acquire()
813dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
814dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        # check no process/thread has woken up
815dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        time.sleep(DELTA)
816dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertReturnsIfImplemented(0, get_value, woken)
817dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
818dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        # wake them all up
819dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        cond.acquire()
820dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        cond.notify_all()
821dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        cond.release()
822dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
823dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        # check they have all woken
824dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        time.sleep(DELTA)
825dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertReturnsIfImplemented(6, get_value, woken)
826dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
827dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        # check state is not mucked up
828dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.check_invariant(cond)
829dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
830dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def test_timeout(self):
831dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        cond = self.Condition()
832dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        wait = TimingWrapper(cond.wait)
833dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        cond.acquire()
834dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        res = wait(TIMEOUT1)
835dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        cond.release()
836dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(res, None)
837dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertTimingAlmostEqual(wait.elapsed, TIMEOUT1)
838dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
839dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
840dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonclass _TestEvent(BaseTestCase):
841dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
8424eb2b28553eceda5a19465534bc906929dd85243Antoine Pitrou    @classmethod
8434eb2b28553eceda5a19465534bc906929dd85243Antoine Pitrou    def _test_event(cls, event):
844dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        time.sleep(TIMEOUT2)
845dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        event.set()
846dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
847dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def test_event(self):
848dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        event = self.Event()
849dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        wait = TimingWrapper(event.wait)
850dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
851c2077b0d9b5bf99768c6f396bf7ae6c41b682465Ezio Melotti        # Removed temporarily, due to API shear, this does not
852dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        # work with threading._Event objects. is_set == isSet
85302cb0eb231fc01e2a50cbe14f6da7a8df52959efJesse Noller        self.assertEqual(event.is_set(), False)
854dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
85502cb0eb231fc01e2a50cbe14f6da7a8df52959efJesse Noller        # Removed, threading.Event.wait() will return the value of the __flag
85602cb0eb231fc01e2a50cbe14f6da7a8df52959efJesse Noller        # instead of None. API Shear with the semaphore backed mp.Event
85702cb0eb231fc01e2a50cbe14f6da7a8df52959efJesse Noller        self.assertEqual(wait(0.0), False)
858dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertTimingAlmostEqual(wait.elapsed, 0.0)
85902cb0eb231fc01e2a50cbe14f6da7a8df52959efJesse Noller        self.assertEqual(wait(TIMEOUT1), False)
860dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertTimingAlmostEqual(wait.elapsed, TIMEOUT1)
861dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
862dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        event.set()
863dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
864dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        # See note above on the API differences
86502cb0eb231fc01e2a50cbe14f6da7a8df52959efJesse Noller        self.assertEqual(event.is_set(), True)
86602cb0eb231fc01e2a50cbe14f6da7a8df52959efJesse Noller        self.assertEqual(wait(), True)
867dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertTimingAlmostEqual(wait.elapsed, 0.0)
86802cb0eb231fc01e2a50cbe14f6da7a8df52959efJesse Noller        self.assertEqual(wait(TIMEOUT1), True)
869dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertTimingAlmostEqual(wait.elapsed, 0.0)
870dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        # self.assertEqual(event.is_set(), True)
871dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
872dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        event.clear()
873dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
874dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        #self.assertEqual(event.is_set(), False)
875dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
8766f6016bc591305a9a99551ea7b1c467334c2b622Jesus Cea        p = self.Process(target=self._test_event, args=(event,))
8776f6016bc591305a9a99551ea7b1c467334c2b622Jesus Cea        p.daemon = True
8786f6016bc591305a9a99551ea7b1c467334c2b622Jesus Cea        p.start()
87902cb0eb231fc01e2a50cbe14f6da7a8df52959efJesse Noller        self.assertEqual(wait(), True)
880dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
881dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson#
882dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson#
883dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson#
884dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
885dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonclass _TestValue(BaseTestCase):
886dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
88736b9fbb803659350f9e6182b85f5bf66ca2a72a8Florent Xicluna    ALLOWED_TYPES = ('processes',)
88836b9fbb803659350f9e6182b85f5bf66ca2a72a8Florent Xicluna
889dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    codes_values = [
890dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        ('i', 4343, 24234),
891dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        ('d', 3.625, -4.25),
892dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        ('h', -232, 234),
893dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        ('c', latin('x'), latin('y'))
894dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        ]
895dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
89655d935a145710c2609c234df47b1172b52c3dcd9Antoine Pitrou    def setUp(self):
89755d935a145710c2609c234df47b1172b52c3dcd9Antoine Pitrou        if not HAS_SHAREDCTYPES:
89855d935a145710c2609c234df47b1172b52c3dcd9Antoine Pitrou            self.skipTest("requires multiprocessing.sharedctypes")
89955d935a145710c2609c234df47b1172b52c3dcd9Antoine Pitrou
9004eb2b28553eceda5a19465534bc906929dd85243Antoine Pitrou    @classmethod
9014eb2b28553eceda5a19465534bc906929dd85243Antoine Pitrou    def _test(cls, values):
9024eb2b28553eceda5a19465534bc906929dd85243Antoine Pitrou        for sv, cv in zip(values, cls.codes_values):
903dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            sv.value = cv[2]
904dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
905dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
906dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def test_value(self, raw=False):
907dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        if raw:
908dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            values = [self.RawValue(code, value)
909dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson                      for code, value, _ in self.codes_values]
910dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        else:
911dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            values = [self.Value(code, value)
912dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson                      for code, value, _ in self.codes_values]
913dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
914dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        for sv, cv in zip(values, self.codes_values):
915dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            self.assertEqual(sv.value, cv[1])
916dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
917dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        proc = self.Process(target=self._test, args=(values,))
9186f6016bc591305a9a99551ea7b1c467334c2b622Jesus Cea        proc.daemon = True
919dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        proc.start()
920dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        proc.join()
921dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
922dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        for sv, cv in zip(values, self.codes_values):
923dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            self.assertEqual(sv.value, cv[2])
924dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
925dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def test_rawvalue(self):
926dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.test_value(raw=True)
927dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
928dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def test_getobj_getlock(self):
929dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        val1 = self.Value('i', 5)
930dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        lock1 = val1.get_lock()
931dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        obj1 = val1.get_obj()
932dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
933dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        val2 = self.Value('i', 5, lock=None)
934dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        lock2 = val2.get_lock()
935dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        obj2 = val2.get_obj()
936dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
937dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        lock = self.Lock()
938dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        val3 = self.Value('i', 5, lock=lock)
939dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        lock3 = val3.get_lock()
940dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        obj3 = val3.get_obj()
941dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(lock, lock3)
942dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
9436ab22154ddabdb67bd510a1f2e0aa9c7e0ee607dJesse Noller        arr4 = self.Value('i', 5, lock=False)
944dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertFalse(hasattr(arr4, 'get_lock'))
945dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertFalse(hasattr(arr4, 'get_obj'))
946dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
9476ab22154ddabdb67bd510a1f2e0aa9c7e0ee607dJesse Noller        self.assertRaises(AttributeError, self.Value, 'i', 5, lock='navalue')
9486ab22154ddabdb67bd510a1f2e0aa9c7e0ee607dJesse Noller
9496ab22154ddabdb67bd510a1f2e0aa9c7e0ee607dJesse Noller        arr5 = self.RawValue('i', 5)
9506ab22154ddabdb67bd510a1f2e0aa9c7e0ee607dJesse Noller        self.assertFalse(hasattr(arr5, 'get_lock'))
9516ab22154ddabdb67bd510a1f2e0aa9c7e0ee607dJesse Noller        self.assertFalse(hasattr(arr5, 'get_obj'))
9526ab22154ddabdb67bd510a1f2e0aa9c7e0ee607dJesse Noller
953dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
954dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonclass _TestArray(BaseTestCase):
955dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
95636b9fbb803659350f9e6182b85f5bf66ca2a72a8Florent Xicluna    ALLOWED_TYPES = ('processes',)
95736b9fbb803659350f9e6182b85f5bf66ca2a72a8Florent Xicluna
9584eb2b28553eceda5a19465534bc906929dd85243Antoine Pitrou    @classmethod
9594eb2b28553eceda5a19465534bc906929dd85243Antoine Pitrou    def f(cls, seq):
960dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        for i in range(1, len(seq)):
961dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            seq[i] += seq[i-1]
962dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
96336b9fbb803659350f9e6182b85f5bf66ca2a72a8Florent Xicluna    @unittest.skipIf(c_int is None, "requires _ctypes")
964dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def test_array(self, raw=False):
965dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        seq = [680, 626, 934, 821, 150, 233, 548, 982, 714, 831]
966dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        if raw:
967dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            arr = self.RawArray('i', seq)
968dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        else:
969dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            arr = self.Array('i', seq)
970dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
971dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(len(arr), len(seq))
972dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(arr[3], seq[3])
973dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(list(arr[2:7]), list(seq[2:7]))
974dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
975dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        arr[4:8] = seq[4:8] = array.array('i', [1, 2, 3, 4])
976dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
977dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(list(arr[:]), seq)
978dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
979dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.f(seq)
980dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
981dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        p = self.Process(target=self.f, args=(arr,))
9826f6016bc591305a9a99551ea7b1c467334c2b622Jesus Cea        p.daemon = True
983dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        p.start()
984dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        p.join()
985dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
986dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(list(arr[:]), seq)
987dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
98836b9fbb803659350f9e6182b85f5bf66ca2a72a8Florent Xicluna    @unittest.skipIf(c_int is None, "requires _ctypes")
989d3cb2f6e2cd837bd6a0258a8e4e6699d703cf8b4Mark Dickinson    def test_array_from_size(self):
990d3cb2f6e2cd837bd6a0258a8e4e6699d703cf8b4Mark Dickinson        size = 10
991d3cb2f6e2cd837bd6a0258a8e4e6699d703cf8b4Mark Dickinson        # Test for zeroing (see issue #11675).
992d3cb2f6e2cd837bd6a0258a8e4e6699d703cf8b4Mark Dickinson        # The repetition below strengthens the test by increasing the chances
993d3cb2f6e2cd837bd6a0258a8e4e6699d703cf8b4Mark Dickinson        # of previously allocated non-zero memory being used for the new array
994d3cb2f6e2cd837bd6a0258a8e4e6699d703cf8b4Mark Dickinson        # on the 2nd and 3rd loops.
995d3cb2f6e2cd837bd6a0258a8e4e6699d703cf8b4Mark Dickinson        for _ in range(3):
996d3cb2f6e2cd837bd6a0258a8e4e6699d703cf8b4Mark Dickinson            arr = self.Array('i', size)
997d3cb2f6e2cd837bd6a0258a8e4e6699d703cf8b4Mark Dickinson            self.assertEqual(len(arr), size)
998d3cb2f6e2cd837bd6a0258a8e4e6699d703cf8b4Mark Dickinson            self.assertEqual(list(arr), [0] * size)
999d3cb2f6e2cd837bd6a0258a8e4e6699d703cf8b4Mark Dickinson            arr[:] = range(10)
1000d3cb2f6e2cd837bd6a0258a8e4e6699d703cf8b4Mark Dickinson            self.assertEqual(list(arr), range(10))
1001d3cb2f6e2cd837bd6a0258a8e4e6699d703cf8b4Mark Dickinson            del arr
1002d3cb2f6e2cd837bd6a0258a8e4e6699d703cf8b4Mark Dickinson
1003d3cb2f6e2cd837bd6a0258a8e4e6699d703cf8b4Mark Dickinson    @unittest.skipIf(c_int is None, "requires _ctypes")
1004dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def test_rawarray(self):
1005dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.test_array(raw=True)
1006dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
100736b9fbb803659350f9e6182b85f5bf66ca2a72a8Florent Xicluna    @unittest.skipIf(c_int is None, "requires _ctypes")
1008f9e9a6f403af61c6aead4cfe766fb1efbb058171Mark Dickinson    def test_array_accepts_long(self):
1009f9e9a6f403af61c6aead4cfe766fb1efbb058171Mark Dickinson        arr = self.Array('i', 10L)
1010f9e9a6f403af61c6aead4cfe766fb1efbb058171Mark Dickinson        self.assertEqual(len(arr), 10)
1011f9e9a6f403af61c6aead4cfe766fb1efbb058171Mark Dickinson        raw_arr = self.RawArray('i', 10L)
1012f9e9a6f403af61c6aead4cfe766fb1efbb058171Mark Dickinson        self.assertEqual(len(raw_arr), 10)
1013f9e9a6f403af61c6aead4cfe766fb1efbb058171Mark Dickinson
1014f9e9a6f403af61c6aead4cfe766fb1efbb058171Mark Dickinson    @unittest.skipIf(c_int is None, "requires _ctypes")
1015dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def test_getobj_getlock_obj(self):
1016dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        arr1 = self.Array('i', range(10))
1017dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        lock1 = arr1.get_lock()
1018dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        obj1 = arr1.get_obj()
1019dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1020dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        arr2 = self.Array('i', range(10), lock=None)
1021dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        lock2 = arr2.get_lock()
1022dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        obj2 = arr2.get_obj()
1023dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1024dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        lock = self.Lock()
1025dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        arr3 = self.Array('i', range(10), lock=lock)
1026dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        lock3 = arr3.get_lock()
1027dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        obj3 = arr3.get_obj()
1028dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(lock, lock3)
1029dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
10306ab22154ddabdb67bd510a1f2e0aa9c7e0ee607dJesse Noller        arr4 = self.Array('i', range(10), lock=False)
1031dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertFalse(hasattr(arr4, 'get_lock'))
1032dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertFalse(hasattr(arr4, 'get_obj'))
10336ab22154ddabdb67bd510a1f2e0aa9c7e0ee607dJesse Noller        self.assertRaises(AttributeError,
10346ab22154ddabdb67bd510a1f2e0aa9c7e0ee607dJesse Noller                          self.Array, 'i', range(10), lock='notalock')
10356ab22154ddabdb67bd510a1f2e0aa9c7e0ee607dJesse Noller
10366ab22154ddabdb67bd510a1f2e0aa9c7e0ee607dJesse Noller        arr5 = self.RawArray('i', range(10))
10376ab22154ddabdb67bd510a1f2e0aa9c7e0ee607dJesse Noller        self.assertFalse(hasattr(arr5, 'get_lock'))
10386ab22154ddabdb67bd510a1f2e0aa9c7e0ee607dJesse Noller        self.assertFalse(hasattr(arr5, 'get_obj'))
1039dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1040dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson#
1041dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson#
1042dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson#
1043dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1044dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonclass _TestContainers(BaseTestCase):
1045dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1046dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    ALLOWED_TYPES = ('manager',)
1047dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1048dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def test_list(self):
1049dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        a = self.list(range(10))
1050dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(a[:], range(10))
1051dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1052dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        b = self.list()
1053dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(b[:], [])
1054dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1055dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        b.extend(range(5))
1056dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(b[:], range(5))
1057dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1058dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(b[2], 2)
1059dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(b[2:10], [2,3,4])
1060dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1061dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        b *= 2
1062dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(b[:], [0, 1, 2, 3, 4, 0, 1, 2, 3, 4])
1063dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1064dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(b + [5, 6], [0, 1, 2, 3, 4, 0, 1, 2, 3, 4, 5, 6])
1065dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1066dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(a[:], range(10))
1067dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1068dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        d = [a, b]
1069dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        e = self.list(d)
1070dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(
1071dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            e[:],
1072dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            [[0, 1, 2, 3, 4, 5, 6, 7, 8, 9], [0, 1, 2, 3, 4, 0, 1, 2, 3, 4]]
1073dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            )
1074dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1075dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        f = self.list([a])
1076dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        a.append('hello')
1077dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(f[:], [[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 'hello']])
1078dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1079dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def test_dict(self):
1080dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        d = self.dict()
1081dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        indices = range(65, 70)
1082dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        for i in indices:
1083dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            d[i] = chr(i)
1084dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(d.copy(), dict((i, chr(i)) for i in indices))
1085dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(sorted(d.keys()), indices)
1086dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(sorted(d.values()), [chr(i) for i in indices])
1087dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(sorted(d.items()), [(i, chr(i)) for i in indices])
1088dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1089dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def test_namespace(self):
1090dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        n = self.Namespace()
1091dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        n.name = 'Bob'
1092dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        n.job = 'Builder'
1093dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        n._hidden = 'hidden'
1094dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual((n.name, n.job), ('Bob', 'Builder'))
1095dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        del n.job
1096dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(str(n), "Namespace(name='Bob')")
1097dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertTrue(hasattr(n, 'name'))
1098dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertTrue(not hasattr(n, 'job'))
1099dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1100dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson#
1101dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson#
1102dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson#
1103dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1104dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersondef sqr(x, wait=0.0):
1105dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    time.sleep(wait)
1106dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    return x*x
1107dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonclass _TestPool(BaseTestCase):
1108dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1109dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def test_apply(self):
1110dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        papply = self.pool.apply
1111dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(papply(sqr, (5,)), sqr(5))
1112dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(papply(sqr, (), {'x':3}), sqr(x=3))
1113dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1114dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def test_map(self):
1115dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        pmap = self.pool.map
1116dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(pmap(sqr, range(10)), map(sqr, range(10)))
1117dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(pmap(sqr, range(100), chunksize=20),
1118dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson                         map(sqr, range(100)))
1119dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
11207530e47948446f03a79ad7dec4cc129ad3388418Jesse Noller    def test_map_chunksize(self):
11217530e47948446f03a79ad7dec4cc129ad3388418Jesse Noller        try:
11227530e47948446f03a79ad7dec4cc129ad3388418Jesse Noller            self.pool.map_async(sqr, [], chunksize=1).get(timeout=TIMEOUT1)
11237530e47948446f03a79ad7dec4cc129ad3388418Jesse Noller        except multiprocessing.TimeoutError:
11247530e47948446f03a79ad7dec4cc129ad3388418Jesse Noller            self.fail("pool.map_async with chunksize stalled on null list")
11257530e47948446f03a79ad7dec4cc129ad3388418Jesse Noller
1126dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def test_async(self):
1127dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        res = self.pool.apply_async(sqr, (7, TIMEOUT1,))
1128dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        get = TimingWrapper(res.get)
1129dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(get(), 49)
1130dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertTimingAlmostEqual(get.elapsed, TIMEOUT1)
1131dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1132dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def test_async_timeout(self):
1133dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        res = self.pool.apply_async(sqr, (6, TIMEOUT2 + 0.2))
1134dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        get = TimingWrapper(res.get)
1135dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertRaises(multiprocessing.TimeoutError, get, timeout=TIMEOUT2)
1136dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertTimingAlmostEqual(get.elapsed, TIMEOUT2)
1137dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1138dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def test_imap(self):
1139dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        it = self.pool.imap(sqr, range(10))
1140dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(list(it), map(sqr, range(10)))
1141dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1142dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        it = self.pool.imap(sqr, range(10))
1143dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        for i in range(10):
1144dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            self.assertEqual(it.next(), i*i)
1145dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertRaises(StopIteration, it.next)
1146dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1147dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        it = self.pool.imap(sqr, range(1000), chunksize=100)
1148dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        for i in range(1000):
1149dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            self.assertEqual(it.next(), i*i)
1150dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertRaises(StopIteration, it.next)
1151dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1152dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def test_imap_unordered(self):
1153dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        it = self.pool.imap_unordered(sqr, range(1000))
1154dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(sorted(it), map(sqr, range(1000)))
1155dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1156dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        it = self.pool.imap_unordered(sqr, range(1000), chunksize=53)
1157dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(sorted(it), map(sqr, range(1000)))
1158dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1159dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def test_make_pool(self):
1160f64a0cffca141fa0a8f1138b5f069ea0da446c9fVictor Stinner        self.assertRaises(ValueError, multiprocessing.Pool, -1)
1161f64a0cffca141fa0a8f1138b5f069ea0da446c9fVictor Stinner        self.assertRaises(ValueError, multiprocessing.Pool, 0)
1162f64a0cffca141fa0a8f1138b5f069ea0da446c9fVictor Stinner
1163dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        p = multiprocessing.Pool(3)
1164dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(3, len(p._pool))
1165dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        p.close()
1166dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        p.join()
1167dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1168dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def test_terminate(self):
1169dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        if self.TYPE == 'manager':
1170dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            # On Unix a forked process increfs each shared object to
1171dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            # which its parent process held a reference.  If the
1172dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            # forked process gets terminated then there is likely to
1173dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            # be a reference leak.  So to prevent
1174dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            # _TestZZZNumberOfObjects from failing we skip this test
1175dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            # when using a manager.
1176dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            return
1177dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1178dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        result = self.pool.map_async(
1179dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            time.sleep, [0.1 for i in range(10000)], chunksize=1
1180dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            )
1181dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.pool.terminate()
1182dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        join = TimingWrapper(self.pool.join)
1183dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        join()
1184dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertTrue(join.elapsed < 0.2)
1185654ade3e6afa2527d1f642be28d69e219bd58b71Jesse Noller
1186d44a4a27a6968558c3a78dbf2578ac7dcbd2ee08Richard Oudkerk    def test_empty_iterable(self):
1187d44a4a27a6968558c3a78dbf2578ac7dcbd2ee08Richard Oudkerk        # See Issue 12157
1188d44a4a27a6968558c3a78dbf2578ac7dcbd2ee08Richard Oudkerk        p = self.Pool(1)
1189d44a4a27a6968558c3a78dbf2578ac7dcbd2ee08Richard Oudkerk
1190d44a4a27a6968558c3a78dbf2578ac7dcbd2ee08Richard Oudkerk        self.assertEqual(p.map(sqr, []), [])
1191d44a4a27a6968558c3a78dbf2578ac7dcbd2ee08Richard Oudkerk        self.assertEqual(list(p.imap(sqr, [])), [])
1192d44a4a27a6968558c3a78dbf2578ac7dcbd2ee08Richard Oudkerk        self.assertEqual(list(p.imap_unordered(sqr, [])), [])
1193d44a4a27a6968558c3a78dbf2578ac7dcbd2ee08Richard Oudkerk        self.assertEqual(p.map_async(sqr, []).get(), [])
1194d44a4a27a6968558c3a78dbf2578ac7dcbd2ee08Richard Oudkerk
1195d44a4a27a6968558c3a78dbf2578ac7dcbd2ee08Richard Oudkerk        p.close()
1196d44a4a27a6968558c3a78dbf2578ac7dcbd2ee08Richard Oudkerk        p.join()
1197d44a4a27a6968558c3a78dbf2578ac7dcbd2ee08Richard Oudkerk
11980c200c282b460d84e0f8ddd56ce10cc79dfb3600Richard Oudkerkdef unpickleable_result():
11990c200c282b460d84e0f8ddd56ce10cc79dfb3600Richard Oudkerk    return lambda: 42
12000c200c282b460d84e0f8ddd56ce10cc79dfb3600Richard Oudkerk
12010c200c282b460d84e0f8ddd56ce10cc79dfb3600Richard Oudkerkclass _TestPoolWorkerErrors(BaseTestCase):
12020c200c282b460d84e0f8ddd56ce10cc79dfb3600Richard Oudkerk    ALLOWED_TYPES = ('processes', )
12030c200c282b460d84e0f8ddd56ce10cc79dfb3600Richard Oudkerk
12040c200c282b460d84e0f8ddd56ce10cc79dfb3600Richard Oudkerk    def test_unpickleable_result(self):
12050c200c282b460d84e0f8ddd56ce10cc79dfb3600Richard Oudkerk        from multiprocessing.pool import MaybeEncodingError
12060c200c282b460d84e0f8ddd56ce10cc79dfb3600Richard Oudkerk        p = multiprocessing.Pool(2)
12070c200c282b460d84e0f8ddd56ce10cc79dfb3600Richard Oudkerk
12080c200c282b460d84e0f8ddd56ce10cc79dfb3600Richard Oudkerk        # Make sure we don't lose pool processes because of encoding errors.
12090c200c282b460d84e0f8ddd56ce10cc79dfb3600Richard Oudkerk        for iteration in range(20):
12100c200c282b460d84e0f8ddd56ce10cc79dfb3600Richard Oudkerk            res = p.apply_async(unpickleable_result)
12110c200c282b460d84e0f8ddd56ce10cc79dfb3600Richard Oudkerk            self.assertRaises(MaybeEncodingError, res.get)
12120c200c282b460d84e0f8ddd56ce10cc79dfb3600Richard Oudkerk
12130c200c282b460d84e0f8ddd56ce10cc79dfb3600Richard Oudkerk        p.close()
12140c200c282b460d84e0f8ddd56ce10cc79dfb3600Richard Oudkerk        p.join()
12150c200c282b460d84e0f8ddd56ce10cc79dfb3600Richard Oudkerk
1216654ade3e6afa2527d1f642be28d69e219bd58b71Jesse Nollerclass _TestPoolWorkerLifetime(BaseTestCase):
1217654ade3e6afa2527d1f642be28d69e219bd58b71Jesse Noller
1218654ade3e6afa2527d1f642be28d69e219bd58b71Jesse Noller    ALLOWED_TYPES = ('processes', )
1219654ade3e6afa2527d1f642be28d69e219bd58b71Jesse Noller    def test_pool_worker_lifetime(self):
1220654ade3e6afa2527d1f642be28d69e219bd58b71Jesse Noller        p = multiprocessing.Pool(3, maxtasksperchild=10)
1221654ade3e6afa2527d1f642be28d69e219bd58b71Jesse Noller        self.assertEqual(3, len(p._pool))
1222654ade3e6afa2527d1f642be28d69e219bd58b71Jesse Noller        origworkerpids = [w.pid for w in p._pool]
1223654ade3e6afa2527d1f642be28d69e219bd58b71Jesse Noller        # Run many tasks so each worker gets replaced (hopefully)
1224654ade3e6afa2527d1f642be28d69e219bd58b71Jesse Noller        results = []
1225654ade3e6afa2527d1f642be28d69e219bd58b71Jesse Noller        for i in range(100):
1226654ade3e6afa2527d1f642be28d69e219bd58b71Jesse Noller            results.append(p.apply_async(sqr, (i, )))
1227654ade3e6afa2527d1f642be28d69e219bd58b71Jesse Noller        # Fetch the results and verify we got the right answers,
1228654ade3e6afa2527d1f642be28d69e219bd58b71Jesse Noller        # also ensuring all the tasks have completed.
1229654ade3e6afa2527d1f642be28d69e219bd58b71Jesse Noller        for (j, res) in enumerate(results):
1230654ade3e6afa2527d1f642be28d69e219bd58b71Jesse Noller            self.assertEqual(res.get(), sqr(j))
1231654ade3e6afa2527d1f642be28d69e219bd58b71Jesse Noller        # Refill the pool
1232654ade3e6afa2527d1f642be28d69e219bd58b71Jesse Noller        p._repopulate_pool()
12333bc5cb7e0db13ba3885c8ed3d51ea792738499b2Florent Xicluna        # Wait until all workers are alive
1234c2b0d76bf3387cd4841acde40f232051d4ddf23fAntoine Pitrou        # (countdown * DELTA = 5 seconds max startup process time)
1235c2b0d76bf3387cd4841acde40f232051d4ddf23fAntoine Pitrou        countdown = 50
12363bc5cb7e0db13ba3885c8ed3d51ea792738499b2Florent Xicluna        while countdown and not all(w.is_alive() for w in p._pool):
12373bc5cb7e0db13ba3885c8ed3d51ea792738499b2Florent Xicluna            countdown -= 1
12383bc5cb7e0db13ba3885c8ed3d51ea792738499b2Florent Xicluna            time.sleep(DELTA)
1239654ade3e6afa2527d1f642be28d69e219bd58b71Jesse Noller        finalworkerpids = [w.pid for w in p._pool]
12403bc5cb7e0db13ba3885c8ed3d51ea792738499b2Florent Xicluna        # All pids should be assigned.  See issue #7805.
12413bc5cb7e0db13ba3885c8ed3d51ea792738499b2Florent Xicluna        self.assertNotIn(None, origworkerpids)
12423bc5cb7e0db13ba3885c8ed3d51ea792738499b2Florent Xicluna        self.assertNotIn(None, finalworkerpids)
12433bc5cb7e0db13ba3885c8ed3d51ea792738499b2Florent Xicluna        # Finally, check that the worker pids have changed
1244654ade3e6afa2527d1f642be28d69e219bd58b71Jesse Noller        self.assertNotEqual(sorted(origworkerpids), sorted(finalworkerpids))
1245654ade3e6afa2527d1f642be28d69e219bd58b71Jesse Noller        p.close()
1246654ade3e6afa2527d1f642be28d69e219bd58b71Jesse Noller        p.join()
1247654ade3e6afa2527d1f642be28d69e219bd58b71Jesse Noller
124846f990e58cb462bbf98fef88a3ba41ffa4a4e35dCharles-François Natali    def test_pool_worker_lifetime_early_close(self):
124946f990e58cb462bbf98fef88a3ba41ffa4a4e35dCharles-François Natali        # Issue #10332: closing a pool whose workers have limited lifetimes
125046f990e58cb462bbf98fef88a3ba41ffa4a4e35dCharles-François Natali        # before all the tasks completed would make join() hang.
125146f990e58cb462bbf98fef88a3ba41ffa4a4e35dCharles-François Natali        p = multiprocessing.Pool(3, maxtasksperchild=1)
125246f990e58cb462bbf98fef88a3ba41ffa4a4e35dCharles-François Natali        results = []
125346f990e58cb462bbf98fef88a3ba41ffa4a4e35dCharles-François Natali        for i in range(6):
125446f990e58cb462bbf98fef88a3ba41ffa4a4e35dCharles-François Natali            results.append(p.apply_async(sqr, (i, 0.3)))
125546f990e58cb462bbf98fef88a3ba41ffa4a4e35dCharles-François Natali        p.close()
125646f990e58cb462bbf98fef88a3ba41ffa4a4e35dCharles-François Natali        p.join()
125746f990e58cb462bbf98fef88a3ba41ffa4a4e35dCharles-François Natali        # check the results
125846f990e58cb462bbf98fef88a3ba41ffa4a4e35dCharles-François Natali        for (j, res) in enumerate(results):
125946f990e58cb462bbf98fef88a3ba41ffa4a4e35dCharles-François Natali            self.assertEqual(res.get(), sqr(j))
126046f990e58cb462bbf98fef88a3ba41ffa4a4e35dCharles-François Natali
126146f990e58cb462bbf98fef88a3ba41ffa4a4e35dCharles-François Natali
1262dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson#
1263dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# Test that manager has expected number of shared objects left
1264dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson#
1265dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1266dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonclass _TestZZZNumberOfObjects(BaseTestCase):
1267dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    # Because test cases are sorted alphabetically, this one will get
1268dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    # run after all the other tests for the manager.  It tests that
1269dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    # there have been no "reference leaks" for the manager's shared
1270dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    # objects.  Note the comment in _TestPool.test_terminate().
1271dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    ALLOWED_TYPES = ('manager',)
1272dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1273dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def test_number_of_objects(self):
1274dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        EXPECTED_NUMBER = 1                # the pool object is still alive
1275dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        multiprocessing.active_children()  # discard dead process objs
1276dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        gc.collect()                       # do garbage collection
1277dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        refs = self.manager._number_of_objects()
12787314b38168da53863136d1937059fc0ac4883a56Jesse Noller        debug_info = self.manager._debug_info()
1279dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        if refs != EXPECTED_NUMBER:
12807fb9640d57f5d96dcaa0d0e6497abc21fa85f37eJesse Noller            print self.manager._debug_info()
12817314b38168da53863136d1937059fc0ac4883a56Jesse Noller            print debug_info
1282dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1283dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(refs, EXPECTED_NUMBER)
1284dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1285dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson#
1286dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# Test of creating a customized manager class
1287dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson#
1288dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1289dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonfrom multiprocessing.managers import BaseManager, BaseProxy, RemoteError
1290dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1291dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonclass FooBar(object):
1292dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def f(self):
1293dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        return 'f()'
1294dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def g(self):
1295dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        raise ValueError
1296dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def _h(self):
1297dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        return '_h()'
1298dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1299dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersondef baz():
1300dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    for i in xrange(10):
1301dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        yield i*i
1302dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1303dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonclass IteratorProxy(BaseProxy):
1304dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    _exposed_ = ('next', '__next__')
1305dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def __iter__(self):
1306dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        return self
1307dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def next(self):
1308dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        return self._callmethod('next')
1309dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def __next__(self):
1310dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        return self._callmethod('__next__')
1311dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1312dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonclass MyManager(BaseManager):
1313dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    pass
1314dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1315dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin PetersonMyManager.register('Foo', callable=FooBar)
1316dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin PetersonMyManager.register('Bar', callable=FooBar, exposed=('f', '_h'))
1317dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin PetersonMyManager.register('baz', callable=baz, proxytype=IteratorProxy)
1318dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1319dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1320dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonclass _TestMyManager(BaseTestCase):
1321dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1322dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    ALLOWED_TYPES = ('manager',)
1323dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1324dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def test_mymanager(self):
1325dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        manager = MyManager()
1326dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        manager.start()
1327dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1328dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        foo = manager.Foo()
1329dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        bar = manager.Bar()
1330dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        baz = manager.baz()
1331dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1332dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        foo_methods = [name for name in ('f', 'g', '_h') if hasattr(foo, name)]
1333dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        bar_methods = [name for name in ('f', 'g', '_h') if hasattr(bar, name)]
1334dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1335dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(foo_methods, ['f', 'g'])
1336dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(bar_methods, ['f', '_h'])
1337dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1338dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(foo.f(), 'f()')
1339dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertRaises(ValueError, foo.g)
1340dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(foo._callmethod('f'), 'f()')
1341dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertRaises(RemoteError, foo._callmethod, '_h')
1342dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1343dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(bar.f(), 'f()')
1344dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(bar._h(), '_h()')
1345dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(bar._callmethod('f'), 'f()')
1346dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(bar._callmethod('_h'), '_h()')
1347dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1348dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(list(baz), [i*i for i in range(10)])
1349dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1350dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        manager.shutdown()
1351dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1352dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson#
1353dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# Test of connecting to a remote server and using xmlrpclib for serialization
1354dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson#
1355dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1356dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson_queue = Queue.Queue()
1357dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersondef get_queue():
1358dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    return _queue
1359dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1360dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonclass QueueManager(BaseManager):
1361dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    '''manager class used by server process'''
1362dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin PetersonQueueManager.register('get_queue', callable=get_queue)
1363dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1364dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonclass QueueManager2(BaseManager):
1365dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    '''manager class which specifies the same interface as QueueManager'''
1366dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin PetersonQueueManager2.register('get_queue')
1367dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1368dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1369dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin PetersonSERIALIZER = 'xmlrpclib'
1370dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1371dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonclass _TestRemoteManager(BaseTestCase):
1372dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1373dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    ALLOWED_TYPES = ('manager',)
1374dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
13754eb2b28553eceda5a19465534bc906929dd85243Antoine Pitrou    @classmethod
13764eb2b28553eceda5a19465534bc906929dd85243Antoine Pitrou    def _putter(cls, address, authkey):
1377dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        manager = QueueManager2(
1378dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            address=address, authkey=authkey, serializer=SERIALIZER
1379dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            )
1380dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        manager.connect()
1381dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        queue = manager.get_queue()
1382dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        queue.put(('hello world', None, True, 2.25))
1383dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1384dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def test_remote(self):
1385dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        authkey = os.urandom(32)
1386dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1387dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        manager = QueueManager(
1388dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            address=('localhost', 0), authkey=authkey, serializer=SERIALIZER
1389dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            )
1390dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        manager.start()
1391dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1392dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        p = self.Process(target=self._putter, args=(manager.address, authkey))
13936f6016bc591305a9a99551ea7b1c467334c2b622Jesus Cea        p.daemon = True
1394dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        p.start()
1395dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1396dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        manager2 = QueueManager2(
1397dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            address=manager.address, authkey=authkey, serializer=SERIALIZER
1398dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            )
1399dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        manager2.connect()
1400dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        queue = manager2.get_queue()
1401dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1402dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        # Note that xmlrpclib will deserialize object as a list not a tuple
1403dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(queue.get(), ['hello world', None, True, 2.25])
1404dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1405dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        # Because we are using xmlrpclib for serialization instead of
1406dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        # pickle this will cause a serialization error.
1407dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertRaises(Exception, queue.put, time.sleep)
1408dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1409dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        # Make queue finalizer run before the server is stopped
1410dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        del queue
1411dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        manager.shutdown()
1412dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1413459a6481662c62d6cb57a070d21230db3e721c56Jesse Nollerclass _TestManagerRestart(BaseTestCase):
1414459a6481662c62d6cb57a070d21230db3e721c56Jesse Noller
14154eb2b28553eceda5a19465534bc906929dd85243Antoine Pitrou    @classmethod
14164eb2b28553eceda5a19465534bc906929dd85243Antoine Pitrou    def _putter(cls, address, authkey):
1417459a6481662c62d6cb57a070d21230db3e721c56Jesse Noller        manager = QueueManager(
1418459a6481662c62d6cb57a070d21230db3e721c56Jesse Noller            address=address, authkey=authkey, serializer=SERIALIZER)
1419459a6481662c62d6cb57a070d21230db3e721c56Jesse Noller        manager.connect()
1420459a6481662c62d6cb57a070d21230db3e721c56Jesse Noller        queue = manager.get_queue()
1421459a6481662c62d6cb57a070d21230db3e721c56Jesse Noller        queue.put('hello world')
1422459a6481662c62d6cb57a070d21230db3e721c56Jesse Noller
1423459a6481662c62d6cb57a070d21230db3e721c56Jesse Noller    def test_rapid_restart(self):
1424459a6481662c62d6cb57a070d21230db3e721c56Jesse Noller        authkey = os.urandom(32)
1425459a6481662c62d6cb57a070d21230db3e721c56Jesse Noller        manager = QueueManager(
142654f9f83e5cd417267b29a38f3364716523e69b28Antoine Pitrou            address=('localhost', 0), authkey=authkey, serializer=SERIALIZER)
142787d86e09b5ef3fc7e007c8a6f5f0bc54e003b089Brian Curtin        srvr = manager.get_server()
142887d86e09b5ef3fc7e007c8a6f5f0bc54e003b089Brian Curtin        addr = srvr.address
142987d86e09b5ef3fc7e007c8a6f5f0bc54e003b089Brian Curtin        # Close the connection.Listener socket which gets opened as a part
143087d86e09b5ef3fc7e007c8a6f5f0bc54e003b089Brian Curtin        # of manager.get_server(). It's not needed for the test.
143187d86e09b5ef3fc7e007c8a6f5f0bc54e003b089Brian Curtin        srvr.listener.close()
1432459a6481662c62d6cb57a070d21230db3e721c56Jesse Noller        manager.start()
1433459a6481662c62d6cb57a070d21230db3e721c56Jesse Noller
1434459a6481662c62d6cb57a070d21230db3e721c56Jesse Noller        p = self.Process(target=self._putter, args=(manager.address, authkey))
14356f6016bc591305a9a99551ea7b1c467334c2b622Jesus Cea        p.daemon = True
1436459a6481662c62d6cb57a070d21230db3e721c56Jesse Noller        p.start()
1437459a6481662c62d6cb57a070d21230db3e721c56Jesse Noller        queue = manager.get_queue()
1438459a6481662c62d6cb57a070d21230db3e721c56Jesse Noller        self.assertEqual(queue.get(), 'hello world')
1439019ce773cd25ee08d1a822f06958774b43881d00Jesse Noller        del queue
1440459a6481662c62d6cb57a070d21230db3e721c56Jesse Noller        manager.shutdown()
1441459a6481662c62d6cb57a070d21230db3e721c56Jesse Noller        manager = QueueManager(
144254f9f83e5cd417267b29a38f3364716523e69b28Antoine Pitrou            address=addr, authkey=authkey, serializer=SERIALIZER)
1443459a6481662c62d6cb57a070d21230db3e721c56Jesse Noller        manager.start()
1444019ce773cd25ee08d1a822f06958774b43881d00Jesse Noller        manager.shutdown()
1445459a6481662c62d6cb57a070d21230db3e721c56Jesse Noller
1446dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson#
1447dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson#
1448dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson#
1449dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1450dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin PetersonSENTINEL = latin('')
1451dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1452dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonclass _TestConnection(BaseTestCase):
1453dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1454dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    ALLOWED_TYPES = ('processes', 'threads')
1455dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
14564eb2b28553eceda5a19465534bc906929dd85243Antoine Pitrou    @classmethod
14574eb2b28553eceda5a19465534bc906929dd85243Antoine Pitrou    def _echo(cls, conn):
1458dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        for msg in iter(conn.recv_bytes, SENTINEL):
1459dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            conn.send_bytes(msg)
1460dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        conn.close()
1461dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1462dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def test_connection(self):
1463dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        conn, child_conn = self.Pipe()
1464dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1465dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        p = self.Process(target=self._echo, args=(child_conn,))
14665bc9f4c09c99eb701dbee83fb9e26eed558e474fJesse Noller        p.daemon = True
1467dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        p.start()
1468dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1469dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        seq = [1, 2.25, None]
1470dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        msg = latin('hello world')
1471dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        longmsg = msg * 10
1472dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        arr = array.array('i', range(4))
1473dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1474dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        if self.TYPE == 'processes':
1475dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            self.assertEqual(type(conn.fileno()), int)
1476dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1477dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(conn.send(seq), None)
1478dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(conn.recv(), seq)
1479dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1480dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(conn.send_bytes(msg), None)
1481dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(conn.recv_bytes(), msg)
1482dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1483dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        if self.TYPE == 'processes':
1484dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            buffer = array.array('i', [0]*10)
1485dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            expected = list(arr) + [0] * (10 - len(arr))
1486dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            self.assertEqual(conn.send_bytes(arr), None)
1487dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            self.assertEqual(conn.recv_bytes_into(buffer),
1488dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson                             len(arr) * buffer.itemsize)
1489dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            self.assertEqual(list(buffer), expected)
1490dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1491dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            buffer = array.array('i', [0]*10)
1492dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            expected = [0] * 3 + list(arr) + [0] * (10 - 3 - len(arr))
1493dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            self.assertEqual(conn.send_bytes(arr), None)
1494dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            self.assertEqual(conn.recv_bytes_into(buffer, 3 * buffer.itemsize),
1495dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson                             len(arr) * buffer.itemsize)
1496dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            self.assertEqual(list(buffer), expected)
1497dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1498dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            buffer = bytearray(latin(' ' * 40))
1499dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            self.assertEqual(conn.send_bytes(longmsg), None)
1500dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            try:
1501dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson                res = conn.recv_bytes_into(buffer)
1502dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            except multiprocessing.BufferTooShort, e:
1503dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson                self.assertEqual(e.args, (longmsg,))
1504dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            else:
1505dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson                self.fail('expected BufferTooShort, got %s' % res)
1506dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1507dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        poll = TimingWrapper(conn.poll)
1508dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1509dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(poll(), False)
1510dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertTimingAlmostEqual(poll.elapsed, 0)
1511dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1512dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(poll(TIMEOUT1), False)
1513dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertTimingAlmostEqual(poll.elapsed, TIMEOUT1)
1514dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1515dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        conn.send(None)
1516cef2006eaff86f843b8f0fc21fc7b652415b96edGiampaolo Rodola'        time.sleep(.1)
1517dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1518dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(poll(TIMEOUT1), True)
1519dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertTimingAlmostEqual(poll.elapsed, 0)
1520dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1521dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(conn.recv(), None)
1522dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1523dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        really_big_msg = latin('X') * (1024 * 1024 * 16)   # 16Mb
1524dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        conn.send_bytes(really_big_msg)
1525dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(conn.recv_bytes(), really_big_msg)
1526dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1527dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        conn.send_bytes(SENTINEL)                          # tell child to quit
1528dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        child_conn.close()
1529dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1530dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        if self.TYPE == 'processes':
1531dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            self.assertEqual(conn.readable, True)
1532dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            self.assertEqual(conn.writable, True)
1533dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            self.assertRaises(EOFError, conn.recv)
1534dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            self.assertRaises(EOFError, conn.recv_bytes)
1535dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1536dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        p.join()
1537dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1538dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def test_duplex_false(self):
1539dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        reader, writer = self.Pipe(duplex=False)
1540dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(writer.send(1), None)
1541dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(reader.recv(), 1)
1542dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        if self.TYPE == 'processes':
1543dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            self.assertEqual(reader.readable, True)
1544dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            self.assertEqual(reader.writable, False)
1545dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            self.assertEqual(writer.readable, False)
1546dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            self.assertEqual(writer.writable, True)
1547dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            self.assertRaises(IOError, reader.send, 2)
1548dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            self.assertRaises(IOError, writer.recv)
1549dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            self.assertRaises(IOError, writer.poll)
1550dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1551dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def test_spawn_close(self):
1552dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        # We test that a pipe connection can be closed by parent
1553dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        # process immediately after child is spawned.  On Windows this
1554dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        # would have sometimes failed on old versions because
1555dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        # child_conn would be closed before the child got a chance to
1556dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        # duplicate it.
1557dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        conn, child_conn = self.Pipe()
1558dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1559dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        p = self.Process(target=self._echo, args=(child_conn,))
15606f6016bc591305a9a99551ea7b1c467334c2b622Jesus Cea        p.daemon = True
1561dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        p.start()
1562dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        child_conn.close()    # this might complete before child initializes
1563dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1564dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        msg = latin('hello')
1565dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        conn.send_bytes(msg)
1566dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(conn.recv_bytes(), msg)
1567dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1568dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        conn.send_bytes(SENTINEL)
1569dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        conn.close()
1570dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        p.join()
1571dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1572dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def test_sendbytes(self):
1573dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        if self.TYPE != 'processes':
1574dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            return
1575dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1576dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        msg = latin('abcdefghijklmnopqrstuvwxyz')
1577dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        a, b = self.Pipe()
1578dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1579dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        a.send_bytes(msg)
1580dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(b.recv_bytes(), msg)
1581dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1582dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        a.send_bytes(msg, 5)
1583dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(b.recv_bytes(), msg[5:])
1584dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1585dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        a.send_bytes(msg, 7, 8)
1586dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(b.recv_bytes(), msg[7:7+8])
1587dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1588dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        a.send_bytes(msg, 26)
1589dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(b.recv_bytes(), latin(''))
1590dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1591dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        a.send_bytes(msg, 26, 0)
1592dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(b.recv_bytes(), latin(''))
1593dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1594dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertRaises(ValueError, a.send_bytes, msg, 27)
1595dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1596dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertRaises(ValueError, a.send_bytes, msg, 22, 5)
1597dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1598dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertRaises(ValueError, a.send_bytes, msg, 26, 1)
1599dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1600dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertRaises(ValueError, a.send_bytes, msg, -1)
1601dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1602dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertRaises(ValueError, a.send_bytes, msg, 4, -1)
1603dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1604a1a8da8bf5d6d27936702f9241c8726efd6b4b42Antoine Pitrou    @classmethod
1605a1a8da8bf5d6d27936702f9241c8726efd6b4b42Antoine Pitrou    def _is_fd_assigned(cls, fd):
1606a1a8da8bf5d6d27936702f9241c8726efd6b4b42Antoine Pitrou        try:
1607a1a8da8bf5d6d27936702f9241c8726efd6b4b42Antoine Pitrou            os.fstat(fd)
1608a1a8da8bf5d6d27936702f9241c8726efd6b4b42Antoine Pitrou        except OSError as e:
1609a1a8da8bf5d6d27936702f9241c8726efd6b4b42Antoine Pitrou            if e.errno == errno.EBADF:
1610a1a8da8bf5d6d27936702f9241c8726efd6b4b42Antoine Pitrou                return False
1611a1a8da8bf5d6d27936702f9241c8726efd6b4b42Antoine Pitrou            raise
1612a1a8da8bf5d6d27936702f9241c8726efd6b4b42Antoine Pitrou        else:
1613a1a8da8bf5d6d27936702f9241c8726efd6b4b42Antoine Pitrou            return True
1614a1a8da8bf5d6d27936702f9241c8726efd6b4b42Antoine Pitrou
1615a1a8da8bf5d6d27936702f9241c8726efd6b4b42Antoine Pitrou    @classmethod
1616a1a8da8bf5d6d27936702f9241c8726efd6b4b42Antoine Pitrou    def _writefd(cls, conn, data, create_dummy_fds=False):
1617a1a8da8bf5d6d27936702f9241c8726efd6b4b42Antoine Pitrou        if create_dummy_fds:
1618a1a8da8bf5d6d27936702f9241c8726efd6b4b42Antoine Pitrou            for i in range(0, 256):
1619a1a8da8bf5d6d27936702f9241c8726efd6b4b42Antoine Pitrou                if not cls._is_fd_assigned(i):
1620a1a8da8bf5d6d27936702f9241c8726efd6b4b42Antoine Pitrou                    os.dup2(conn.fileno(), i)
1621a1a8da8bf5d6d27936702f9241c8726efd6b4b42Antoine Pitrou        fd = reduction.recv_handle(conn)
1622a1a8da8bf5d6d27936702f9241c8726efd6b4b42Antoine Pitrou        if msvcrt:
1623a1a8da8bf5d6d27936702f9241c8726efd6b4b42Antoine Pitrou            fd = msvcrt.open_osfhandle(fd, os.O_WRONLY)
1624a1a8da8bf5d6d27936702f9241c8726efd6b4b42Antoine Pitrou        os.write(fd, data)
1625a1a8da8bf5d6d27936702f9241c8726efd6b4b42Antoine Pitrou        os.close(fd)
1626a1a8da8bf5d6d27936702f9241c8726efd6b4b42Antoine Pitrou
1627f8413b29c07babc49a2a891f8716f4fcda538489Charles-François Natali    @unittest.skipUnless(HAS_REDUCTION, "test needs multiprocessing.reduction")
1628a1a8da8bf5d6d27936702f9241c8726efd6b4b42Antoine Pitrou    def test_fd_transfer(self):
1629a1a8da8bf5d6d27936702f9241c8726efd6b4b42Antoine Pitrou        if self.TYPE != 'processes':
1630a1a8da8bf5d6d27936702f9241c8726efd6b4b42Antoine Pitrou            self.skipTest("only makes sense with processes")
1631a1a8da8bf5d6d27936702f9241c8726efd6b4b42Antoine Pitrou        conn, child_conn = self.Pipe(duplex=True)
1632a1a8da8bf5d6d27936702f9241c8726efd6b4b42Antoine Pitrou
1633a1a8da8bf5d6d27936702f9241c8726efd6b4b42Antoine Pitrou        p = self.Process(target=self._writefd, args=(child_conn, b"foo"))
16346f6016bc591305a9a99551ea7b1c467334c2b622Jesus Cea        p.daemon = True
1635a1a8da8bf5d6d27936702f9241c8726efd6b4b42Antoine Pitrou        p.start()
1636a1a8da8bf5d6d27936702f9241c8726efd6b4b42Antoine Pitrou        with open(test_support.TESTFN, "wb") as f:
1637a1a8da8bf5d6d27936702f9241c8726efd6b4b42Antoine Pitrou            fd = f.fileno()
1638a1a8da8bf5d6d27936702f9241c8726efd6b4b42Antoine Pitrou            if msvcrt:
1639a1a8da8bf5d6d27936702f9241c8726efd6b4b42Antoine Pitrou                fd = msvcrt.get_osfhandle(fd)
1640a1a8da8bf5d6d27936702f9241c8726efd6b4b42Antoine Pitrou            reduction.send_handle(conn, fd, p.pid)
1641a1a8da8bf5d6d27936702f9241c8726efd6b4b42Antoine Pitrou        p.join()
1642a1a8da8bf5d6d27936702f9241c8726efd6b4b42Antoine Pitrou        with open(test_support.TESTFN, "rb") as f:
1643a1a8da8bf5d6d27936702f9241c8726efd6b4b42Antoine Pitrou            self.assertEqual(f.read(), b"foo")
1644a1a8da8bf5d6d27936702f9241c8726efd6b4b42Antoine Pitrou
1645f8413b29c07babc49a2a891f8716f4fcda538489Charles-François Natali    @unittest.skipUnless(HAS_REDUCTION, "test needs multiprocessing.reduction")
1646a1a8da8bf5d6d27936702f9241c8726efd6b4b42Antoine Pitrou    @unittest.skipIf(sys.platform == "win32",
1647a1a8da8bf5d6d27936702f9241c8726efd6b4b42Antoine Pitrou                     "test semantics don't make sense on Windows")
1648a1a8da8bf5d6d27936702f9241c8726efd6b4b42Antoine Pitrou    @unittest.skipIf(MAXFD <= 256,
1649a1a8da8bf5d6d27936702f9241c8726efd6b4b42Antoine Pitrou                     "largest assignable fd number is too small")
1650a1a8da8bf5d6d27936702f9241c8726efd6b4b42Antoine Pitrou    @unittest.skipUnless(hasattr(os, "dup2"),
1651a1a8da8bf5d6d27936702f9241c8726efd6b4b42Antoine Pitrou                         "test needs os.dup2()")
1652a1a8da8bf5d6d27936702f9241c8726efd6b4b42Antoine Pitrou    def test_large_fd_transfer(self):
1653a1a8da8bf5d6d27936702f9241c8726efd6b4b42Antoine Pitrou        # With fd > 256 (issue #11657)
1654a1a8da8bf5d6d27936702f9241c8726efd6b4b42Antoine Pitrou        if self.TYPE != 'processes':
1655a1a8da8bf5d6d27936702f9241c8726efd6b4b42Antoine Pitrou            self.skipTest("only makes sense with processes")
1656a1a8da8bf5d6d27936702f9241c8726efd6b4b42Antoine Pitrou        conn, child_conn = self.Pipe(duplex=True)
1657a1a8da8bf5d6d27936702f9241c8726efd6b4b42Antoine Pitrou
1658a1a8da8bf5d6d27936702f9241c8726efd6b4b42Antoine Pitrou        p = self.Process(target=self._writefd, args=(child_conn, b"bar", True))
16596f6016bc591305a9a99551ea7b1c467334c2b622Jesus Cea        p.daemon = True
1660a1a8da8bf5d6d27936702f9241c8726efd6b4b42Antoine Pitrou        p.start()
1661a1a8da8bf5d6d27936702f9241c8726efd6b4b42Antoine Pitrou        with open(test_support.TESTFN, "wb") as f:
1662a1a8da8bf5d6d27936702f9241c8726efd6b4b42Antoine Pitrou            fd = f.fileno()
1663a1a8da8bf5d6d27936702f9241c8726efd6b4b42Antoine Pitrou            for newfd in range(256, MAXFD):
1664a1a8da8bf5d6d27936702f9241c8726efd6b4b42Antoine Pitrou                if not self._is_fd_assigned(newfd):
1665a1a8da8bf5d6d27936702f9241c8726efd6b4b42Antoine Pitrou                    break
1666a1a8da8bf5d6d27936702f9241c8726efd6b4b42Antoine Pitrou            else:
1667a1a8da8bf5d6d27936702f9241c8726efd6b4b42Antoine Pitrou                self.fail("could not find an unassigned large file descriptor")
1668a1a8da8bf5d6d27936702f9241c8726efd6b4b42Antoine Pitrou            os.dup2(fd, newfd)
1669a1a8da8bf5d6d27936702f9241c8726efd6b4b42Antoine Pitrou            try:
1670a1a8da8bf5d6d27936702f9241c8726efd6b4b42Antoine Pitrou                reduction.send_handle(conn, newfd, p.pid)
1671a1a8da8bf5d6d27936702f9241c8726efd6b4b42Antoine Pitrou            finally:
1672a1a8da8bf5d6d27936702f9241c8726efd6b4b42Antoine Pitrou                os.close(newfd)
1673a1a8da8bf5d6d27936702f9241c8726efd6b4b42Antoine Pitrou        p.join()
1674a1a8da8bf5d6d27936702f9241c8726efd6b4b42Antoine Pitrou        with open(test_support.TESTFN, "rb") as f:
1675a1a8da8bf5d6d27936702f9241c8726efd6b4b42Antoine Pitrou            self.assertEqual(f.read(), b"bar")
1676a1a8da8bf5d6d27936702f9241c8726efd6b4b42Antoine Pitrou
1677c23484b21f8b62ec7c62a6e2253cf5f656e2ef06Jesus Cea    @classmethod
1678c23484b21f8b62ec7c62a6e2253cf5f656e2ef06Jesus Cea    def _send_data_without_fd(self, conn):
1679c23484b21f8b62ec7c62a6e2253cf5f656e2ef06Jesus Cea        os.write(conn.fileno(), b"\0")
1680c23484b21f8b62ec7c62a6e2253cf5f656e2ef06Jesus Cea
1681f8413b29c07babc49a2a891f8716f4fcda538489Charles-François Natali    @unittest.skipUnless(HAS_REDUCTION, "test needs multiprocessing.reduction")
1682c23484b21f8b62ec7c62a6e2253cf5f656e2ef06Jesus Cea    @unittest.skipIf(sys.platform == "win32", "doesn't make sense on Windows")
1683c23484b21f8b62ec7c62a6e2253cf5f656e2ef06Jesus Cea    def test_missing_fd_transfer(self):
1684c23484b21f8b62ec7c62a6e2253cf5f656e2ef06Jesus Cea        # Check that exception is raised when received data is not
1685c23484b21f8b62ec7c62a6e2253cf5f656e2ef06Jesus Cea        # accompanied by a file descriptor in ancillary data.
1686c23484b21f8b62ec7c62a6e2253cf5f656e2ef06Jesus Cea        if self.TYPE != 'processes':
1687c23484b21f8b62ec7c62a6e2253cf5f656e2ef06Jesus Cea            self.skipTest("only makes sense with processes")
1688c23484b21f8b62ec7c62a6e2253cf5f656e2ef06Jesus Cea        conn, child_conn = self.Pipe(duplex=True)
1689c23484b21f8b62ec7c62a6e2253cf5f656e2ef06Jesus Cea
1690c23484b21f8b62ec7c62a6e2253cf5f656e2ef06Jesus Cea        p = self.Process(target=self._send_data_without_fd, args=(child_conn,))
1691c23484b21f8b62ec7c62a6e2253cf5f656e2ef06Jesus Cea        p.daemon = True
1692c23484b21f8b62ec7c62a6e2253cf5f656e2ef06Jesus Cea        p.start()
1693c23484b21f8b62ec7c62a6e2253cf5f656e2ef06Jesus Cea        self.assertRaises(RuntimeError, reduction.recv_handle, conn)
1694c23484b21f8b62ec7c62a6e2253cf5f656e2ef06Jesus Cea        p.join()
1695a1a8da8bf5d6d27936702f9241c8726efd6b4b42Antoine Pitrou
1696dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonclass _TestListenerClient(BaseTestCase):
1697dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1698dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    ALLOWED_TYPES = ('processes', 'threads')
1699dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
17004eb2b28553eceda5a19465534bc906929dd85243Antoine Pitrou    @classmethod
17014eb2b28553eceda5a19465534bc906929dd85243Antoine Pitrou    def _test(cls, address):
17024eb2b28553eceda5a19465534bc906929dd85243Antoine Pitrou        conn = cls.connection.Client(address)
1703dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        conn.send('hello')
1704dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        conn.close()
1705dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1706dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def test_listener_client(self):
1707dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        for family in self.connection.families:
1708dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            l = self.connection.Listener(family=family)
1709dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            p = self.Process(target=self._test, args=(l.address,))
17105bc9f4c09c99eb701dbee83fb9e26eed558e474fJesse Noller            p.daemon = True
1711dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            p.start()
1712dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            conn = l.accept()
1713dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            self.assertEqual(conn.recv(), 'hello')
1714dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            p.join()
1715dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            l.close()
17169a16fa69dda64ed01b2239a732c0445f22babb57Richard Oudkerk
17179a16fa69dda64ed01b2239a732c0445f22babb57Richard Oudkerk    def test_issue14725(self):
17189a16fa69dda64ed01b2239a732c0445f22babb57Richard Oudkerk        l = self.connection.Listener()
17199a16fa69dda64ed01b2239a732c0445f22babb57Richard Oudkerk        p = self.Process(target=self._test, args=(l.address,))
17209a16fa69dda64ed01b2239a732c0445f22babb57Richard Oudkerk        p.daemon = True
17219a16fa69dda64ed01b2239a732c0445f22babb57Richard Oudkerk        p.start()
17229a16fa69dda64ed01b2239a732c0445f22babb57Richard Oudkerk        time.sleep(1)
17239a16fa69dda64ed01b2239a732c0445f22babb57Richard Oudkerk        # On Windows the client process should by now have connected,
17249a16fa69dda64ed01b2239a732c0445f22babb57Richard Oudkerk        # written data and closed the pipe handle by now.  This causes
17259a16fa69dda64ed01b2239a732c0445f22babb57Richard Oudkerk        # ConnectNamdedPipe() to fail with ERROR_NO_DATA.  See Issue
17269a16fa69dda64ed01b2239a732c0445f22babb57Richard Oudkerk        # 14725.
17279a16fa69dda64ed01b2239a732c0445f22babb57Richard Oudkerk        conn = l.accept()
17289a16fa69dda64ed01b2239a732c0445f22babb57Richard Oudkerk        self.assertEqual(conn.recv(), 'hello')
17299a16fa69dda64ed01b2239a732c0445f22babb57Richard Oudkerk        conn.close()
17309a16fa69dda64ed01b2239a732c0445f22babb57Richard Oudkerk        p.join()
17319a16fa69dda64ed01b2239a732c0445f22babb57Richard Oudkerk        l.close()
17329a16fa69dda64ed01b2239a732c0445f22babb57Richard Oudkerk
1733dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson#
1734dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# Test of sending connection and socket objects between processes
1735dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson#
1736da3a1b120055855a464c2d5f5143021ae8f5dc86Benjamin Peterson"""
1737dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonclass _TestPicklingConnections(BaseTestCase):
1738dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1739dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    ALLOWED_TYPES = ('processes',)
1740dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1741dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def _listener(self, conn, families):
1742dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        for fam in families:
1743dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            l = self.connection.Listener(family=fam)
1744dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            conn.send(l.address)
1745dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            new_conn = l.accept()
1746dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            conn.send(new_conn)
1747dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1748dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        if self.TYPE == 'processes':
1749dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            l = socket.socket()
1750dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            l.bind(('localhost', 0))
1751dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            conn.send(l.getsockname())
1752dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            l.listen(1)
1753dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            new_conn, addr = l.accept()
1754dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            conn.send(new_conn)
1755dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1756dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        conn.recv()
1757dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1758dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def _remote(self, conn):
1759dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        for (address, msg) in iter(conn.recv, None):
1760dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            client = self.connection.Client(address)
1761dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            client.send(msg.upper())
1762dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            client.close()
1763dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1764dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        if self.TYPE == 'processes':
1765dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            address, msg = conn.recv()
1766dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            client = socket.socket()
1767dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            client.connect(address)
1768dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            client.sendall(msg.upper())
1769dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            client.close()
1770dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1771dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        conn.close()
1772dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1773dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def test_pickling(self):
1774dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        try:
1775dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            multiprocessing.allow_connection_pickling()
1776dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        except ImportError:
1777dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            return
1778dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1779dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        families = self.connection.families
1780dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1781dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        lconn, lconn0 = self.Pipe()
1782dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        lp = self.Process(target=self._listener, args=(lconn0, families))
17836f6016bc591305a9a99551ea7b1c467334c2b622Jesus Cea        lp.daemon = True
1784dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        lp.start()
1785dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        lconn0.close()
1786dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1787dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        rconn, rconn0 = self.Pipe()
1788dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        rp = self.Process(target=self._remote, args=(rconn0,))
17896f6016bc591305a9a99551ea7b1c467334c2b622Jesus Cea        rp.daemon = True
1790dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        rp.start()
1791dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        rconn0.close()
1792dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1793dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        for fam in families:
1794dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            msg = ('This connection uses family %s' % fam).encode('ascii')
1795dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            address = lconn.recv()
1796dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            rconn.send((address, msg))
1797dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            new_conn = lconn.recv()
1798dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            self.assertEqual(new_conn.recv(), msg.upper())
1799dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1800dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        rconn.send(None)
1801dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1802dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        if self.TYPE == 'processes':
1803dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            msg = latin('This connection uses a normal socket')
1804dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            address = lconn.recv()
1805dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            rconn.send((address, msg))
1806dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            if hasattr(socket, 'fromfd'):
1807dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson                new_conn = lconn.recv()
1808dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson                self.assertEqual(new_conn.recv(100), msg.upper())
1809dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            else:
1810dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson                # XXX On Windows with Py2.6 need to backport fromfd()
1811dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson                discard = lconn.recv_bytes()
1812dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1813dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        lconn.send(None)
1814dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1815dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        rconn.close()
1816dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        lconn.close()
1817dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1818dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        lp.join()
1819dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        rp.join()
1820da3a1b120055855a464c2d5f5143021ae8f5dc86Benjamin Peterson"""
1821dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson#
1822dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson#
1823dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson#
1824dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1825dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonclass _TestHeap(BaseTestCase):
1826dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1827dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    ALLOWED_TYPES = ('processes',)
1828dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1829dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def test_heap(self):
1830dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        iterations = 5000
1831dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        maxblocks = 50
1832dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        blocks = []
1833dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1834dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        # create and destroy lots of blocks of different sizes
1835dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        for i in xrange(iterations):
1836dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            size = int(random.lognormvariate(0, 1) * 1000)
1837dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            b = multiprocessing.heap.BufferWrapper(size)
1838dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            blocks.append(b)
1839dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            if len(blocks) > maxblocks:
1840dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson                i = random.randrange(maxblocks)
1841dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson                del blocks[i]
1842dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1843dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        # get the heap object
1844dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        heap = multiprocessing.heap.BufferWrapper._heap
1845dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1846dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        # verify the state of the heap
1847dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        all = []
1848dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        occupied = 0
1849414d0faedced1b7cb3585e76e0bdfff1795e15f3Charles-François Natali        heap._lock.acquire()
1850414d0faedced1b7cb3585e76e0bdfff1795e15f3Charles-François Natali        self.addCleanup(heap._lock.release)
1851dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        for L in heap._len_to_seq.values():
1852dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            for arena, start, stop in L:
1853dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson                all.append((heap._arenas.index(arena), start, stop,
1854dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson                            stop-start, 'free'))
1855dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        for arena, start, stop in heap._allocated_blocks:
1856dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            all.append((heap._arenas.index(arena), start, stop,
1857dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson                        stop-start, 'occupied'))
1858dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            occupied += (stop-start)
1859dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1860dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        all.sort()
1861dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1862dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        for i in range(len(all)-1):
1863dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            (arena, start, stop) = all[i][:3]
1864dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            (narena, nstart, nstop) = all[i+1][:3]
1865dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            self.assertTrue((arena != narena and nstart == 0) or
1866dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson                            (stop == nstart))
1867dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1868414d0faedced1b7cb3585e76e0bdfff1795e15f3Charles-François Natali    def test_free_from_gc(self):
1869414d0faedced1b7cb3585e76e0bdfff1795e15f3Charles-François Natali        # Check that freeing of blocks by the garbage collector doesn't deadlock
1870414d0faedced1b7cb3585e76e0bdfff1795e15f3Charles-François Natali        # (issue #12352).
1871414d0faedced1b7cb3585e76e0bdfff1795e15f3Charles-François Natali        # Make sure the GC is enabled, and set lower collection thresholds to
1872414d0faedced1b7cb3585e76e0bdfff1795e15f3Charles-François Natali        # make collections more frequent (and increase the probability of
1873414d0faedced1b7cb3585e76e0bdfff1795e15f3Charles-François Natali        # deadlock).
18747c20ad32fd79dfd5383b3cd75f433cdf0bacbd52Charles-François Natali        if not gc.isenabled():
1875414d0faedced1b7cb3585e76e0bdfff1795e15f3Charles-François Natali            gc.enable()
1876414d0faedced1b7cb3585e76e0bdfff1795e15f3Charles-François Natali            self.addCleanup(gc.disable)
18777c20ad32fd79dfd5383b3cd75f433cdf0bacbd52Charles-François Natali        thresholds = gc.get_threshold()
18787c20ad32fd79dfd5383b3cd75f433cdf0bacbd52Charles-François Natali        self.addCleanup(gc.set_threshold, *thresholds)
1879414d0faedced1b7cb3585e76e0bdfff1795e15f3Charles-François Natali        gc.set_threshold(10)
1880414d0faedced1b7cb3585e76e0bdfff1795e15f3Charles-François Natali
1881414d0faedced1b7cb3585e76e0bdfff1795e15f3Charles-François Natali        # perform numerous block allocations, with cyclic references to make
1882414d0faedced1b7cb3585e76e0bdfff1795e15f3Charles-François Natali        # sure objects are collected asynchronously by the gc
1883414d0faedced1b7cb3585e76e0bdfff1795e15f3Charles-François Natali        for i in range(5000):
1884414d0faedced1b7cb3585e76e0bdfff1795e15f3Charles-François Natali            a = multiprocessing.heap.BufferWrapper(1)
1885414d0faedced1b7cb3585e76e0bdfff1795e15f3Charles-François Natali            b = multiprocessing.heap.BufferWrapper(1)
1886414d0faedced1b7cb3585e76e0bdfff1795e15f3Charles-François Natali            # circular references
1887414d0faedced1b7cb3585e76e0bdfff1795e15f3Charles-François Natali            a.buddy = b
1888414d0faedced1b7cb3585e76e0bdfff1795e15f3Charles-François Natali            b.buddy = a
1889414d0faedced1b7cb3585e76e0bdfff1795e15f3Charles-François Natali
1890dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson#
1891dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson#
1892dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson#
1893dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1894dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonclass _Foo(Structure):
1895dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    _fields_ = [
1896dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        ('x', c_int),
1897dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        ('y', c_double)
1898dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        ]
1899dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1900dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonclass _TestSharedCTypes(BaseTestCase):
1901dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1902dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    ALLOWED_TYPES = ('processes',)
1903dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
190455d935a145710c2609c234df47b1172b52c3dcd9Antoine Pitrou    def setUp(self):
190555d935a145710c2609c234df47b1172b52c3dcd9Antoine Pitrou        if not HAS_SHAREDCTYPES:
190655d935a145710c2609c234df47b1172b52c3dcd9Antoine Pitrou            self.skipTest("requires multiprocessing.sharedctypes")
190755d935a145710c2609c234df47b1172b52c3dcd9Antoine Pitrou
19084eb2b28553eceda5a19465534bc906929dd85243Antoine Pitrou    @classmethod
19094eb2b28553eceda5a19465534bc906929dd85243Antoine Pitrou    def _double(cls, x, y, foo, arr, string):
1910dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        x.value *= 2
1911dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        y.value *= 2
1912dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        foo.x *= 2
1913dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        foo.y *= 2
1914dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        string.value *= 2
1915dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        for i in range(len(arr)):
1916dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            arr[i] *= 2
1917dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1918dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def test_sharedctypes(self, lock=False):
1919dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        x = Value('i', 7, lock=lock)
1920bd564c3c21ef4c6d6cb0070870edd9d2f7c89d11Georg Brandl        y = Value(c_double, 1.0/3.0, lock=lock)
1921dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        foo = Value(_Foo, 3, 2, lock=lock)
1922bd564c3c21ef4c6d6cb0070870edd9d2f7c89d11Georg Brandl        arr = self.Array('d', range(10), lock=lock)
1923bd564c3c21ef4c6d6cb0070870edd9d2f7c89d11Georg Brandl        string = self.Array('c', 20, lock=lock)
1924a06e9b8f6b2edf4936146fa8867f12222106d0f8Brian Curtin        string.value = latin('hello')
1925dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1926dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        p = self.Process(target=self._double, args=(x, y, foo, arr, string))
19276f6016bc591305a9a99551ea7b1c467334c2b622Jesus Cea        p.daemon = True
1928dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        p.start()
1929dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        p.join()
1930dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1931dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(x.value, 14)
1932dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertAlmostEqual(y.value, 2.0/3.0)
1933dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(foo.x, 6)
1934dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertAlmostEqual(foo.y, 4.0)
1935dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        for i in range(10):
1936dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            self.assertAlmostEqual(arr[i], i*2)
1937dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(string.value, latin('hellohello'))
1938dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1939dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def test_synchronize(self):
1940dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.test_sharedctypes(lock=True)
1941dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1942dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def test_copy(self):
1943dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        foo = _Foo(2, 5.0)
1944a06e9b8f6b2edf4936146fa8867f12222106d0f8Brian Curtin        bar = copy(foo)
1945dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        foo.x = 0
1946dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        foo.y = 0
1947dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(bar.x, 2)
1948dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertAlmostEqual(bar.y, 5.0)
1949dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1950dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson#
1951dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson#
1952dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson#
1953dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1954dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonclass _TestFinalize(BaseTestCase):
1955dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1956dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    ALLOWED_TYPES = ('processes',)
1957dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
19584eb2b28553eceda5a19465534bc906929dd85243Antoine Pitrou    @classmethod
19594eb2b28553eceda5a19465534bc906929dd85243Antoine Pitrou    def _test_finalize(cls, conn):
1960dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        class Foo(object):
1961dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            pass
1962dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1963dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        a = Foo()
1964dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        util.Finalize(a, conn.send, args=('a',))
1965dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        del a           # triggers callback for a
1966dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1967dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        b = Foo()
1968dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        close_b = util.Finalize(b, conn.send, args=('b',))
1969dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        close_b()       # triggers callback for b
1970dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        close_b()       # does nothing because callback has already been called
1971dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        del b           # does nothing because callback has already been called
1972dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1973dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        c = Foo()
1974dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        util.Finalize(c, conn.send, args=('c',))
1975dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1976dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        d10 = Foo()
1977dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        util.Finalize(d10, conn.send, args=('d10',), exitpriority=1)
1978dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1979dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        d01 = Foo()
1980dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        util.Finalize(d01, conn.send, args=('d01',), exitpriority=0)
1981dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        d02 = Foo()
1982dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        util.Finalize(d02, conn.send, args=('d02',), exitpriority=0)
1983dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        d03 = Foo()
1984dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        util.Finalize(d03, conn.send, args=('d03',), exitpriority=0)
1985dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1986dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        util.Finalize(None, conn.send, args=('e',), exitpriority=-10)
1987dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1988dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        util.Finalize(None, conn.send, args=('STOP',), exitpriority=-100)
1989dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1990c2077b0d9b5bf99768c6f396bf7ae6c41b682465Ezio Melotti        # call multiprocessing's cleanup function then exit process without
1991dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        # garbage collecting locals
1992dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        util._exit_function()
1993dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        conn.close()
1994dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        os._exit(0)
1995dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1996dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def test_finalize(self):
1997dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        conn, child_conn = self.Pipe()
1998dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
1999dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        p = self.Process(target=self._test_finalize, args=(child_conn,))
20006f6016bc591305a9a99551ea7b1c467334c2b622Jesus Cea        p.daemon = True
2001dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        p.start()
2002dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        p.join()
2003dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
2004dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        result = [obj for obj in iter(conn.recv, 'STOP')]
2005dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(result, ['a', 'b', 'd10', 'd03', 'd02', 'd01', 'e'])
2006dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
2007dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson#
2008dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# Test that from ... import * works for each module
2009dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson#
2010dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
2011dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonclass _TestImportStar(BaseTestCase):
2012dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
2013dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    ALLOWED_TYPES = ('processes',)
2014dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
2015dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def test_import(self):
201636b9fbb803659350f9e6182b85f5bf66ca2a72a8Florent Xicluna        modules = [
2017dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            'multiprocessing', 'multiprocessing.connection',
2018dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            'multiprocessing.heap', 'multiprocessing.managers',
2019dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            'multiprocessing.pool', 'multiprocessing.process',
2020dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            'multiprocessing.synchronize', 'multiprocessing.util'
202136b9fbb803659350f9e6182b85f5bf66ca2a72a8Florent Xicluna            ]
202236b9fbb803659350f9e6182b85f5bf66ca2a72a8Florent Xicluna
2023f8413b29c07babc49a2a891f8716f4fcda538489Charles-François Natali        if HAS_REDUCTION:
2024f8413b29c07babc49a2a891f8716f4fcda538489Charles-François Natali            modules.append('multiprocessing.reduction')
2025f8413b29c07babc49a2a891f8716f4fcda538489Charles-François Natali
202636b9fbb803659350f9e6182b85f5bf66ca2a72a8Florent Xicluna        if c_int is not None:
202736b9fbb803659350f9e6182b85f5bf66ca2a72a8Florent Xicluna            # This module requires _ctypes
202836b9fbb803659350f9e6182b85f5bf66ca2a72a8Florent Xicluna            modules.append('multiprocessing.sharedctypes')
2029dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
2030dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        for name in modules:
2031dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            __import__(name)
2032dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            mod = sys.modules[name]
2033dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
2034dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            for attr in getattr(mod, '__all__', ()):
2035dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson                self.assertTrue(
2036dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson                    hasattr(mod, attr),
2037dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson                    '%r does not have attribute %r' % (mod, attr)
2038dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson                    )
2039dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
2040dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson#
2041dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# Quick test that logging works -- does not test logging output
2042dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson#
2043dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
2044dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonclass _TestLogging(BaseTestCase):
2045dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
2046dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    ALLOWED_TYPES = ('processes',)
2047dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
2048dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def test_enable_logging(self):
2049dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        logger = multiprocessing.get_logger()
2050dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        logger.setLevel(util.SUBWARNING)
2051dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertTrue(logger is not None)
2052dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        logger.debug('this will not be printed')
2053dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        logger.info('nor will this')
2054dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        logger.setLevel(LOG_LEVEL)
2055dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
20564eb2b28553eceda5a19465534bc906929dd85243Antoine Pitrou    @classmethod
20574eb2b28553eceda5a19465534bc906929dd85243Antoine Pitrou    def _test_level(cls, conn):
2058dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        logger = multiprocessing.get_logger()
2059dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        conn.send(logger.getEffectiveLevel())
2060dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
2061dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    def test_level(self):
2062dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        LEVEL1 = 32
2063dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        LEVEL2 = 37
2064dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
2065dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        logger = multiprocessing.get_logger()
2066dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        root_logger = logging.getLogger()
2067dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        root_level = root_logger.level
2068dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
2069dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        reader, writer = multiprocessing.Pipe(duplex=False)
2070dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
2071dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        logger.setLevel(LEVEL1)
20726f6016bc591305a9a99551ea7b1c467334c2b622Jesus Cea        p = self.Process(target=self._test_level, args=(writer,))
20736f6016bc591305a9a99551ea7b1c467334c2b622Jesus Cea        p.daemon = True
20746f6016bc591305a9a99551ea7b1c467334c2b622Jesus Cea        p.start()
2075dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(LEVEL1, reader.recv())
2076dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
2077dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        logger.setLevel(logging.NOTSET)
2078dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        root_logger.setLevel(LEVEL2)
20796f6016bc591305a9a99551ea7b1c467334c2b622Jesus Cea        p = self.Process(target=self._test_level, args=(writer,))
20806f6016bc591305a9a99551ea7b1c467334c2b622Jesus Cea        p.daemon = True
20816f6016bc591305a9a99551ea7b1c467334c2b622Jesus Cea        p.start()
2082dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        self.assertEqual(LEVEL2, reader.recv())
2083dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
2084dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        root_logger.setLevel(root_level)
2085dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        logger.setLevel(level=LOG_LEVEL)
2086dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
2087814d02dcd1b30a98f9a34c710be35de6db82aa40Jesse Noller
20889a03f2fd03278d2c12dfe253de1bbed7c0c9c506Jesse Noller# class _TestLoggingProcessName(BaseTestCase):
20899a03f2fd03278d2c12dfe253de1bbed7c0c9c506Jesse Noller#
20909a03f2fd03278d2c12dfe253de1bbed7c0c9c506Jesse Noller#     def handle(self, record):
20919a03f2fd03278d2c12dfe253de1bbed7c0c9c506Jesse Noller#         assert record.processName == multiprocessing.current_process().name
20929a03f2fd03278d2c12dfe253de1bbed7c0c9c506Jesse Noller#         self.__handled = True
20939a03f2fd03278d2c12dfe253de1bbed7c0c9c506Jesse Noller#
20949a03f2fd03278d2c12dfe253de1bbed7c0c9c506Jesse Noller#     def test_logging(self):
20959a03f2fd03278d2c12dfe253de1bbed7c0c9c506Jesse Noller#         handler = logging.Handler()
20969a03f2fd03278d2c12dfe253de1bbed7c0c9c506Jesse Noller#         handler.handle = self.handle
20979a03f2fd03278d2c12dfe253de1bbed7c0c9c506Jesse Noller#         self.__handled = False
20989a03f2fd03278d2c12dfe253de1bbed7c0c9c506Jesse Noller#         # Bypass getLogger() and side-effects
20999a03f2fd03278d2c12dfe253de1bbed7c0c9c506Jesse Noller#         logger = logging.getLoggerClass()(
21009a03f2fd03278d2c12dfe253de1bbed7c0c9c506Jesse Noller#                 'multiprocessing.test.TestLoggingProcessName')
21019a03f2fd03278d2c12dfe253de1bbed7c0c9c506Jesse Noller#         logger.addHandler(handler)
21029a03f2fd03278d2c12dfe253de1bbed7c0c9c506Jesse Noller#         logger.propagate = False
21039a03f2fd03278d2c12dfe253de1bbed7c0c9c506Jesse Noller#
21049a03f2fd03278d2c12dfe253de1bbed7c0c9c506Jesse Noller#         logger.warn('foo')
21059a03f2fd03278d2c12dfe253de1bbed7c0c9c506Jesse Noller#         assert self.__handled
2106814d02dcd1b30a98f9a34c710be35de6db82aa40Jesse Noller
2107dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson#
21089a5b2ad38d605206f05a52fe32868d3f839e8a86Jesse Noller# Test to verify handle verification, see issue 3321
21099a5b2ad38d605206f05a52fe32868d3f839e8a86Jesse Noller#
21109a5b2ad38d605206f05a52fe32868d3f839e8a86Jesse Noller
21119a5b2ad38d605206f05a52fe32868d3f839e8a86Jesse Nollerclass TestInvalidHandle(unittest.TestCase):
21129a5b2ad38d605206f05a52fe32868d3f839e8a86Jesse Noller
211336b9fbb803659350f9e6182b85f5bf66ca2a72a8Florent Xicluna    @unittest.skipIf(WIN32, "skipped on Windows")
21149a5b2ad38d605206f05a52fe32868d3f839e8a86Jesse Noller    def test_invalid_handles(self):
21159a5b2ad38d605206f05a52fe32868d3f839e8a86Jesse Noller        conn = _multiprocessing.Connection(44977608)
21169a5b2ad38d605206f05a52fe32868d3f839e8a86Jesse Noller        self.assertRaises(IOError, conn.poll)
21179a5b2ad38d605206f05a52fe32868d3f839e8a86Jesse Noller        self.assertRaises(IOError, _multiprocessing.Connection, -1)
211836b9fbb803659350f9e6182b85f5bf66ca2a72a8Florent Xicluna
21199a5b2ad38d605206f05a52fe32868d3f839e8a86Jesse Noller#
2120dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# Functions used to create test cases from the base ones in this module
2121dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson#
2122dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
2123dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersondef get_attributes(Source, names):
2124dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    d = {}
2125dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    for name in names:
2126dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        obj = getattr(Source, name)
2127dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        if type(obj) == type(get_attributes):
2128dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            obj = staticmethod(obj)
2129dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        d[name] = obj
2130dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    return d
2131dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
2132dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersondef create_test_cases(Mixin, type):
2133dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    result = {}
2134dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    glob = globals()
213536b9fbb803659350f9e6182b85f5bf66ca2a72a8Florent Xicluna    Type = type.capitalize()
2136dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
2137dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    for name in glob.keys():
2138dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        if name.startswith('_Test'):
2139dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            base = glob[name]
2140dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson            if type in base.ALLOWED_TYPES:
2141dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson                newname = 'With' + Type + name[1:]
2142dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson                class Temp(base, unittest.TestCase, Mixin):
2143dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson                    pass
2144dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson                result[newname] = Temp
2145dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson                Temp.__name__ = newname
2146dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson                Temp.__module__ = Mixin.__module__
2147dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    return result
2148dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
2149dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson#
2150dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# Create test cases
2151dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson#
2152dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
2153dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonclass ProcessesMixin(object):
2154dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    TYPE = 'processes'
2155dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    Process = multiprocessing.Process
2156dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    locals().update(get_attributes(multiprocessing, (
2157dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        'Queue', 'Lock', 'RLock', 'Semaphore', 'BoundedSemaphore',
2158dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        'Condition', 'Event', 'Value', 'Array', 'RawValue',
2159dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        'RawArray', 'current_process', 'active_children', 'Pipe',
2160d44a4a27a6968558c3a78dbf2578ac7dcbd2ee08Richard Oudkerk        'connection', 'JoinableQueue', 'Pool'
2161dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        )))
2162dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
2163dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersontestcases_processes = create_test_cases(ProcessesMixin, type='processes')
2164dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonglobals().update(testcases_processes)
2165dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
2166dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
2167dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonclass ManagerMixin(object):
2168dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    TYPE = 'manager'
2169dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    Process = multiprocessing.Process
2170dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    manager = object.__new__(multiprocessing.managers.SyncManager)
2171dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    locals().update(get_attributes(manager, (
2172dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        'Queue', 'Lock', 'RLock', 'Semaphore', 'BoundedSemaphore',
2173dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson       'Condition', 'Event', 'Value', 'Array', 'list', 'dict',
2174d44a4a27a6968558c3a78dbf2578ac7dcbd2ee08Richard Oudkerk        'Namespace', 'JoinableQueue', 'Pool'
2175dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        )))
2176dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
2177dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersontestcases_manager = create_test_cases(ManagerMixin, type='manager')
2178dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonglobals().update(testcases_manager)
2179dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
2180dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
2181dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonclass ThreadsMixin(object):
2182dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    TYPE = 'threads'
2183dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    Process = multiprocessing.dummy.Process
2184dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    locals().update(get_attributes(multiprocessing.dummy, (
2185dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        'Queue', 'Lock', 'RLock', 'Semaphore', 'BoundedSemaphore',
2186dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        'Condition', 'Event', 'Value', 'Array', 'current_process',
2187dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        'active_children', 'Pipe', 'connection', 'dict', 'list',
2188d44a4a27a6968558c3a78dbf2578ac7dcbd2ee08Richard Oudkerk        'Namespace', 'JoinableQueue', 'Pool'
2189dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        )))
2190dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
2191dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersontestcases_threads = create_test_cases(ThreadsMixin, type='threads')
2192dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonglobals().update(testcases_threads)
2193dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
21940c519b3a5e847eea0dffb51ac8df7c68891daf70Neal Norwitzclass OtherTest(unittest.TestCase):
21950c519b3a5e847eea0dffb51ac8df7c68891daf70Neal Norwitz    # TODO: add more tests for deliver/answer challenge.
21960c519b3a5e847eea0dffb51ac8df7c68891daf70Neal Norwitz    def test_deliver_challenge_auth_failure(self):
21970c519b3a5e847eea0dffb51ac8df7c68891daf70Neal Norwitz        class _FakeConnection(object):
21980c519b3a5e847eea0dffb51ac8df7c68891daf70Neal Norwitz            def recv_bytes(self, size):
21992a7767a17311cada06240a187c8896bdbcc1a4d0Neal Norwitz                return b'something bogus'
22000c519b3a5e847eea0dffb51ac8df7c68891daf70Neal Norwitz            def send_bytes(self, data):
22010c519b3a5e847eea0dffb51ac8df7c68891daf70Neal Norwitz                pass
22020c519b3a5e847eea0dffb51ac8df7c68891daf70Neal Norwitz        self.assertRaises(multiprocessing.AuthenticationError,
22030c519b3a5e847eea0dffb51ac8df7c68891daf70Neal Norwitz                          multiprocessing.connection.deliver_challenge,
22040c519b3a5e847eea0dffb51ac8df7c68891daf70Neal Norwitz                          _FakeConnection(), b'abc')
22050c519b3a5e847eea0dffb51ac8df7c68891daf70Neal Norwitz
22060c519b3a5e847eea0dffb51ac8df7c68891daf70Neal Norwitz    def test_answer_challenge_auth_failure(self):
22070c519b3a5e847eea0dffb51ac8df7c68891daf70Neal Norwitz        class _FakeConnection(object):
22080c519b3a5e847eea0dffb51ac8df7c68891daf70Neal Norwitz            def __init__(self):
22090c519b3a5e847eea0dffb51ac8df7c68891daf70Neal Norwitz                self.count = 0
22100c519b3a5e847eea0dffb51ac8df7c68891daf70Neal Norwitz            def recv_bytes(self, size):
22110c519b3a5e847eea0dffb51ac8df7c68891daf70Neal Norwitz                self.count += 1
22120c519b3a5e847eea0dffb51ac8df7c68891daf70Neal Norwitz                if self.count == 1:
22130c519b3a5e847eea0dffb51ac8df7c68891daf70Neal Norwitz                    return multiprocessing.connection.CHALLENGE
22140c519b3a5e847eea0dffb51ac8df7c68891daf70Neal Norwitz                elif self.count == 2:
22152a7767a17311cada06240a187c8896bdbcc1a4d0Neal Norwitz                    return b'something bogus'
22162a7767a17311cada06240a187c8896bdbcc1a4d0Neal Norwitz                return b''
22170c519b3a5e847eea0dffb51ac8df7c68891daf70Neal Norwitz            def send_bytes(self, data):
22180c519b3a5e847eea0dffb51ac8df7c68891daf70Neal Norwitz                pass
22190c519b3a5e847eea0dffb51ac8df7c68891daf70Neal Norwitz        self.assertRaises(multiprocessing.AuthenticationError,
22200c519b3a5e847eea0dffb51ac8df7c68891daf70Neal Norwitz                          multiprocessing.connection.answer_challenge,
22210c519b3a5e847eea0dffb51ac8df7c68891daf70Neal Norwitz                          _FakeConnection(), b'abc')
22220c519b3a5e847eea0dffb51ac8df7c68891daf70Neal Norwitz
22237152f6d9156a19a9f1b31e313d2c19d840dc089dJesse Noller#
22247152f6d9156a19a9f1b31e313d2c19d840dc089dJesse Noller# Test Manager.start()/Pool.__init__() initializer feature - see issue 5585
22257152f6d9156a19a9f1b31e313d2c19d840dc089dJesse Noller#
22267152f6d9156a19a9f1b31e313d2c19d840dc089dJesse Noller
22277152f6d9156a19a9f1b31e313d2c19d840dc089dJesse Nollerdef initializer(ns):
22287152f6d9156a19a9f1b31e313d2c19d840dc089dJesse Noller    ns.test += 1
22297152f6d9156a19a9f1b31e313d2c19d840dc089dJesse Noller
22307152f6d9156a19a9f1b31e313d2c19d840dc089dJesse Nollerclass TestInitializers(unittest.TestCase):
22317152f6d9156a19a9f1b31e313d2c19d840dc089dJesse Noller    def setUp(self):
22327152f6d9156a19a9f1b31e313d2c19d840dc089dJesse Noller        self.mgr = multiprocessing.Manager()
22337152f6d9156a19a9f1b31e313d2c19d840dc089dJesse Noller        self.ns = self.mgr.Namespace()
22347152f6d9156a19a9f1b31e313d2c19d840dc089dJesse Noller        self.ns.test = 0
22357152f6d9156a19a9f1b31e313d2c19d840dc089dJesse Noller
22367152f6d9156a19a9f1b31e313d2c19d840dc089dJesse Noller    def tearDown(self):
22377152f6d9156a19a9f1b31e313d2c19d840dc089dJesse Noller        self.mgr.shutdown()
22387152f6d9156a19a9f1b31e313d2c19d840dc089dJesse Noller
22397152f6d9156a19a9f1b31e313d2c19d840dc089dJesse Noller    def test_manager_initializer(self):
22407152f6d9156a19a9f1b31e313d2c19d840dc089dJesse Noller        m = multiprocessing.managers.SyncManager()
22417152f6d9156a19a9f1b31e313d2c19d840dc089dJesse Noller        self.assertRaises(TypeError, m.start, 1)
22427152f6d9156a19a9f1b31e313d2c19d840dc089dJesse Noller        m.start(initializer, (self.ns,))
22437152f6d9156a19a9f1b31e313d2c19d840dc089dJesse Noller        self.assertEqual(self.ns.test, 1)
22447152f6d9156a19a9f1b31e313d2c19d840dc089dJesse Noller        m.shutdown()
22457152f6d9156a19a9f1b31e313d2c19d840dc089dJesse Noller
22467152f6d9156a19a9f1b31e313d2c19d840dc089dJesse Noller    def test_pool_initializer(self):
22477152f6d9156a19a9f1b31e313d2c19d840dc089dJesse Noller        self.assertRaises(TypeError, multiprocessing.Pool, initializer=1)
22487152f6d9156a19a9f1b31e313d2c19d840dc089dJesse Noller        p = multiprocessing.Pool(1, initializer, (self.ns,))
22497152f6d9156a19a9f1b31e313d2c19d840dc089dJesse Noller        p.close()
22507152f6d9156a19a9f1b31e313d2c19d840dc089dJesse Noller        p.join()
22517152f6d9156a19a9f1b31e313d2c19d840dc089dJesse Noller        self.assertEqual(self.ns.test, 1)
22527152f6d9156a19a9f1b31e313d2c19d840dc089dJesse Noller
22531b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller#
22541b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller# Issue 5155, 5313, 5331: Test process in processes
22551b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller# Verifies os.close(sys.stdin.fileno) vs. sys.stdin.close() behavior
22561b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller#
22571b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller
22581b90efbdc5bb204fe50aea87374603dcba309227Jesse Nollerdef _ThisSubProcess(q):
22591b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller    try:
22601b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller        item = q.get(block=False)
22611b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller    except Queue.Empty:
22621b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller        pass
22631b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller
22641b90efbdc5bb204fe50aea87374603dcba309227Jesse Nollerdef _TestProcess(q):
22651b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller    queue = multiprocessing.Queue()
22661b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller    subProc = multiprocessing.Process(target=_ThisSubProcess, args=(queue,))
22676f6016bc591305a9a99551ea7b1c467334c2b622Jesus Cea    subProc.daemon = True
22681b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller    subProc.start()
22691b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller    subProc.join()
22701b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller
22711b90efbdc5bb204fe50aea87374603dcba309227Jesse Nollerdef _afunc(x):
22721b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller    return x*x
22731b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller
22741b90efbdc5bb204fe50aea87374603dcba309227Jesse Nollerdef pool_in_process():
22751b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller    pool = multiprocessing.Pool(processes=4)
22761b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller    x = pool.map(_afunc, [1, 2, 3, 4, 5, 6, 7])
22771b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller
22781b90efbdc5bb204fe50aea87374603dcba309227Jesse Nollerclass _file_like(object):
22791b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller    def __init__(self, delegate):
22801b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller        self._delegate = delegate
22811b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller        self._pid = None
22821b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller
22831b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller    @property
22841b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller    def cache(self):
22851b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller        pid = os.getpid()
22861b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller        # There are no race conditions since fork keeps only the running thread
22871b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller        if pid != self._pid:
22881b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller            self._pid = pid
22891b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller            self._cache = []
22901b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller        return self._cache
22911b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller
22921b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller    def write(self, data):
22931b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller        self.cache.append(data)
22941b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller
22951b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller    def flush(self):
22961b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller        self._delegate.write(''.join(self.cache))
22971b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller        self._cache = []
22981b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller
22991b90efbdc5bb204fe50aea87374603dcba309227Jesse Nollerclass TestStdinBadfiledescriptor(unittest.TestCase):
23001b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller
23011b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller    def test_queue_in_process(self):
23021b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller        queue = multiprocessing.Queue()
23031b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller        proc = multiprocessing.Process(target=_TestProcess, args=(queue,))
23041b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller        proc.start()
23051b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller        proc.join()
23061b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller
23071b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller    def test_pool_in_process(self):
23081b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller        p = multiprocessing.Process(target=pool_in_process)
23091b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller        p.start()
23101b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller        p.join()
23111b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller
23121b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller    def test_flushing(self):
23131b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller        sio = StringIO()
23141b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller        flike = _file_like(sio)
23151b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller        flike.write('foo')
23161b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller        proc = multiprocessing.Process(target=lambda: flike.flush())
23171b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller        flike.flush()
23181b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller        assert sio.getvalue() == 'foo'
23191b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller
2320e4b9938d77950811a47fb673ecb4d4554a4efec1Richard Oudkerk#
2321e4b9938d77950811a47fb673ecb4d4554a4efec1Richard Oudkerk# Test interaction with socket timeouts - see Issue #6056
2322e4b9938d77950811a47fb673ecb4d4554a4efec1Richard Oudkerk#
2323e4b9938d77950811a47fb673ecb4d4554a4efec1Richard Oudkerk
2324e4b9938d77950811a47fb673ecb4d4554a4efec1Richard Oudkerkclass TestTimeouts(unittest.TestCase):
2325e4b9938d77950811a47fb673ecb4d4554a4efec1Richard Oudkerk    @classmethod
2326e4b9938d77950811a47fb673ecb4d4554a4efec1Richard Oudkerk    def _test_timeout(cls, child, address):
2327e4b9938d77950811a47fb673ecb4d4554a4efec1Richard Oudkerk        time.sleep(1)
2328e4b9938d77950811a47fb673ecb4d4554a4efec1Richard Oudkerk        child.send(123)
2329e4b9938d77950811a47fb673ecb4d4554a4efec1Richard Oudkerk        child.close()
2330e4b9938d77950811a47fb673ecb4d4554a4efec1Richard Oudkerk        conn = multiprocessing.connection.Client(address)
2331e4b9938d77950811a47fb673ecb4d4554a4efec1Richard Oudkerk        conn.send(456)
2332e4b9938d77950811a47fb673ecb4d4554a4efec1Richard Oudkerk        conn.close()
2333e4b9938d77950811a47fb673ecb4d4554a4efec1Richard Oudkerk
2334e4b9938d77950811a47fb673ecb4d4554a4efec1Richard Oudkerk    def test_timeout(self):
2335e4b9938d77950811a47fb673ecb4d4554a4efec1Richard Oudkerk        old_timeout = socket.getdefaulttimeout()
2336e4b9938d77950811a47fb673ecb4d4554a4efec1Richard Oudkerk        try:
2337e4b9938d77950811a47fb673ecb4d4554a4efec1Richard Oudkerk            socket.setdefaulttimeout(0.1)
2338e4b9938d77950811a47fb673ecb4d4554a4efec1Richard Oudkerk            parent, child = multiprocessing.Pipe(duplex=True)
2339e4b9938d77950811a47fb673ecb4d4554a4efec1Richard Oudkerk            l = multiprocessing.connection.Listener(family='AF_INET')
2340e4b9938d77950811a47fb673ecb4d4554a4efec1Richard Oudkerk            p = multiprocessing.Process(target=self._test_timeout,
2341e4b9938d77950811a47fb673ecb4d4554a4efec1Richard Oudkerk                                        args=(child, l.address))
2342e4b9938d77950811a47fb673ecb4d4554a4efec1Richard Oudkerk            p.start()
2343e4b9938d77950811a47fb673ecb4d4554a4efec1Richard Oudkerk            child.close()
2344e4b9938d77950811a47fb673ecb4d4554a4efec1Richard Oudkerk            self.assertEqual(parent.recv(), 123)
2345e4b9938d77950811a47fb673ecb4d4554a4efec1Richard Oudkerk            parent.close()
2346e4b9938d77950811a47fb673ecb4d4554a4efec1Richard Oudkerk            conn = l.accept()
2347e4b9938d77950811a47fb673ecb4d4554a4efec1Richard Oudkerk            self.assertEqual(conn.recv(), 456)
2348e4b9938d77950811a47fb673ecb4d4554a4efec1Richard Oudkerk            conn.close()
2349e4b9938d77950811a47fb673ecb4d4554a4efec1Richard Oudkerk            l.close()
2350e4b9938d77950811a47fb673ecb4d4554a4efec1Richard Oudkerk            p.join(10)
2351e4b9938d77950811a47fb673ecb4d4554a4efec1Richard Oudkerk        finally:
2352e4b9938d77950811a47fb673ecb4d4554a4efec1Richard Oudkerk            socket.setdefaulttimeout(old_timeout)
2353e4b9938d77950811a47fb673ecb4d4554a4efec1Richard Oudkerk
2354faee75c33af1e8ccbf0d4349efe62dc9637779c6Richard Oudkerk#
2355faee75c33af1e8ccbf0d4349efe62dc9637779c6Richard Oudkerk# Test what happens with no "if __name__ == '__main__'"
2356faee75c33af1e8ccbf0d4349efe62dc9637779c6Richard Oudkerk#
2357faee75c33af1e8ccbf0d4349efe62dc9637779c6Richard Oudkerk
2358faee75c33af1e8ccbf0d4349efe62dc9637779c6Richard Oudkerkclass TestNoForkBomb(unittest.TestCase):
2359faee75c33af1e8ccbf0d4349efe62dc9637779c6Richard Oudkerk    def test_noforkbomb(self):
2360faee75c33af1e8ccbf0d4349efe62dc9637779c6Richard Oudkerk        name = os.path.join(os.path.dirname(__file__), 'mp_fork_bomb.py')
2361faee75c33af1e8ccbf0d4349efe62dc9637779c6Richard Oudkerk        if WIN32:
2362faee75c33af1e8ccbf0d4349efe62dc9637779c6Richard Oudkerk            rc, out, err = test.script_helper.assert_python_failure(name)
2363faee75c33af1e8ccbf0d4349efe62dc9637779c6Richard Oudkerk            self.assertEqual('', out.decode('ascii'))
2364faee75c33af1e8ccbf0d4349efe62dc9637779c6Richard Oudkerk            self.assertIn('RuntimeError', err.decode('ascii'))
2365faee75c33af1e8ccbf0d4349efe62dc9637779c6Richard Oudkerk        else:
2366faee75c33af1e8ccbf0d4349efe62dc9637779c6Richard Oudkerk            rc, out, err = test.script_helper.assert_python_ok(name)
2367faee75c33af1e8ccbf0d4349efe62dc9637779c6Richard Oudkerk            self.assertEqual('123', out.decode('ascii').rstrip())
2368faee75c33af1e8ccbf0d4349efe62dc9637779c6Richard Oudkerk            self.assertEqual('', err.decode('ascii'))
2369faee75c33af1e8ccbf0d4349efe62dc9637779c6Richard Oudkerk
2370faee75c33af1e8ccbf0d4349efe62dc9637779c6Richard Oudkerk#
2371faee75c33af1e8ccbf0d4349efe62dc9637779c6Richard Oudkerk#
2372faee75c33af1e8ccbf0d4349efe62dc9637779c6Richard Oudkerk#
2373faee75c33af1e8ccbf0d4349efe62dc9637779c6Richard Oudkerk
23741b90efbdc5bb204fe50aea87374603dcba309227Jesse Nollertestcases_other = [OtherTest, TestInvalidHandle, TestInitializers,
2375faee75c33af1e8ccbf0d4349efe62dc9637779c6Richard Oudkerk                   TestStdinBadfiledescriptor, TestTimeouts, TestNoForkBomb]
23760c519b3a5e847eea0dffb51ac8df7c68891daf70Neal Norwitz
2377dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson#
2378dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson#
2379dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson#
2380dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
2381dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersondef test_main(run=None):
238218623825d25b0f8f3b4bf96c1d5c4c2977a94004Jesse Noller    if sys.platform.startswith("linux"):
238318623825d25b0f8f3b4bf96c1d5c4c2977a94004Jesse Noller        try:
238418623825d25b0f8f3b4bf96c1d5c4c2977a94004Jesse Noller            lock = multiprocessing.RLock()
238518623825d25b0f8f3b4bf96c1d5c4c2977a94004Jesse Noller        except OSError:
2386bec087f29d7dca0aaf8f51be7d7c135e9b84e7f1Benjamin Peterson            raise unittest.SkipTest("OSError raises on RLock creation, see issue 3111!")
2387ed77f2e143102df58212ff1f64a87f7e0c237439Benjamin Peterson
23886392d7f68bbc11e3ad3417f52c93f33dcc0c4cd0Charles-François Natali    check_enough_semaphores()
23896392d7f68bbc11e3ad3417f52c93f33dcc0c4cd0Charles-François Natali
2390dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    if run is None:
2391dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        from test.test_support import run_unittest as run
2392dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
2393dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    util.get_temp_dir()     # creates temp directory for use by all processes
2394dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
2395dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    multiprocessing.get_logger().setLevel(LOG_LEVEL)
2396dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
2397146b7ab818cadccf91ad98e64cfefb77705da0caJesse Noller    ProcessesMixin.pool = multiprocessing.Pool(4)
2398146b7ab818cadccf91ad98e64cfefb77705da0caJesse Noller    ThreadsMixin.pool = multiprocessing.dummy.Pool(4)
2399146b7ab818cadccf91ad98e64cfefb77705da0caJesse Noller    ManagerMixin.manager.__init__()
2400146b7ab818cadccf91ad98e64cfefb77705da0caJesse Noller    ManagerMixin.manager.start()
2401146b7ab818cadccf91ad98e64cfefb77705da0caJesse Noller    ManagerMixin.pool = ManagerMixin.manager.Pool(4)
2402dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
2403dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    testcases = (
2404146b7ab818cadccf91ad98e64cfefb77705da0caJesse Noller        sorted(testcases_processes.values(), key=lambda tc:tc.__name__) +
2405146b7ab818cadccf91ad98e64cfefb77705da0caJesse Noller        sorted(testcases_threads.values(), key=lambda tc:tc.__name__) +
24060c519b3a5e847eea0dffb51ac8df7c68891daf70Neal Norwitz        sorted(testcases_manager.values(), key=lambda tc:tc.__name__) +
24070c519b3a5e847eea0dffb51ac8df7c68891daf70Neal Norwitz        testcases_other
2408dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson        )
2409dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
2410dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    loadTestsFromTestCase = unittest.defaultTestLoader.loadTestsFromTestCase
2411dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    suite = unittest.TestSuite(loadTestsFromTestCase(tc) for tc in testcases)
241213623662eac551c8575ec2507d9afc2a5fcba033Nick Coghlan    # (ncoghlan): Whether or not sys.exc_clear is executed by the threading
241313623662eac551c8575ec2507d9afc2a5fcba033Nick Coghlan    # module during these tests is at least platform dependent and possibly
241414459d5b1b800854ef8f1bbadf019682a6413a32Nick Coghlan    # non-deterministic on any given platform. So we don't mind if the listed
241513623662eac551c8575ec2507d9afc2a5fcba033Nick Coghlan    # warnings aren't actually raised.
241607627880813ffaad8d9b90bfe8791ccf588b031bFlorent Xicluna    with test_support.check_py3k_warnings(
241713623662eac551c8575ec2507d9afc2a5fcba033Nick Coghlan            (".+__(get|set)slice__ has been removed", DeprecationWarning),
241813623662eac551c8575ec2507d9afc2a5fcba033Nick Coghlan            (r"sys.exc_clear\(\) not supported", DeprecationWarning),
241913623662eac551c8575ec2507d9afc2a5fcba033Nick Coghlan            quiet=True):
242007627880813ffaad8d9b90bfe8791ccf588b031bFlorent Xicluna        run(suite)
2421dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
2422146b7ab818cadccf91ad98e64cfefb77705da0caJesse Noller    ThreadsMixin.pool.terminate()
2423146b7ab818cadccf91ad98e64cfefb77705da0caJesse Noller    ProcessesMixin.pool.terminate()
2424146b7ab818cadccf91ad98e64cfefb77705da0caJesse Noller    ManagerMixin.pool.terminate()
2425146b7ab818cadccf91ad98e64cfefb77705da0caJesse Noller    ManagerMixin.manager.shutdown()
2426dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
2427146b7ab818cadccf91ad98e64cfefb77705da0caJesse Noller    del ProcessesMixin.pool, ThreadsMixin.pool, ManagerMixin.pool
2428dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
2429dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersondef main():
2430dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    test_main(unittest.TextTestRunner(verbosity=2).run)
2431dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson
2432dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonif __name__ == '__main__':
2433dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson    main()
2434