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