test_multiprocessing.py revision bd564c3c21ef4c6d6cb0070870edd9d2f7c89d11
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 threading 9dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonimport Queue 10dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonimport time 11dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonimport sys 12dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonimport os 13dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonimport gc 14dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonimport signal 15dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonimport array 16dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonimport copy 17dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonimport socket 18dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonimport random 19dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonimport logging 20c4920e86ef7511b4e858028e870b1811437a71d0Mark Dickinsonfrom test import test_support 211b90efbdc5bb204fe50aea87374603dcba309227Jesse Nollerfrom StringIO import StringIO 22dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 2337040cdace1982772e5f35e4acfa13861d72065dJesse Noller 243db8a3432bd84b58bdc7da2c9872777c537a4d09R. David Murray_multiprocessing = test_support.import_module('_multiprocessing') 253db8a3432bd84b58bdc7da2c9872777c537a4d09R. David Murray 2637040cdace1982772e5f35e4acfa13861d72065dJesse Noller# Work around broken sem_open implementations 273db8a3432bd84b58bdc7da2c9872777c537a4d09R. David Murraytest_support.import_module('multiprocessing.synchronize') 2837040cdace1982772e5f35e4acfa13861d72065dJesse Noller 29dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonimport multiprocessing.dummy 30dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonimport multiprocessing.connection 31dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonimport multiprocessing.managers 32dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonimport multiprocessing.heap 33dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonimport multiprocessing.pool 34dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 35dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonfrom multiprocessing import util 36dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 37dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# 38dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# 39dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# 40dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 41e79edf5f7c53f977b8e1fe8c00773e4668e35ea9Benjamin Petersonlatin = str 42dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 43dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# 44dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# Constants 45dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# 46dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 47dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin PetersonLOG_LEVEL = util.SUBWARNING 48654ade3e6afa2527d1f642be28d69e219bd58b71Jesse Noller#LOG_LEVEL = logging.DEBUG 49dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 50dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin PetersonDELTA = 0.1 51dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin PetersonCHECK_TIMINGS = False # making true makes tests take a lot longer 52dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson # and can sometimes cause some non-serious 53dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson # failures because some calls block a bit 54dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson # longer than expected 55dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonif CHECK_TIMINGS: 56dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson TIMEOUT1, TIMEOUT2, TIMEOUT3 = 0.82, 0.35, 1.4 57dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonelse: 58dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson TIMEOUT1, TIMEOUT2, TIMEOUT3 = 0.1, 0.1, 0.1 59dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 60dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin PetersonHAVE_GETVALUE = not getattr(_multiprocessing, 61dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 'HAVE_BROKEN_SEM_GETVALUE', False) 62dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 639a5b2ad38d605206f05a52fe32868d3f839e8a86Jesse NollerWIN32 = (sys.platform == "win32") 649a5b2ad38d605206f05a52fe32868d3f839e8a86Jesse Noller 65dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# 66dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# Creates a wrapper for a function which records the time it takes to finish 67dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# 68dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 69dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonclass TimingWrapper(object): 70dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 71dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson def __init__(self, func): 72dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.func = func 73dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.elapsed = None 74dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 75dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson def __call__(self, *args, **kwds): 76dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson t = time.time() 77dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson try: 78dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson return self.func(*args, **kwds) 79dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson finally: 80dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.elapsed = time.time() - t 81dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 82dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# 83dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# Base class for test cases 84dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# 85dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 86dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonclass BaseTestCase(object): 87dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 88dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson ALLOWED_TYPES = ('processes', 'manager', 'threads') 89dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 90dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson def assertTimingAlmostEqual(self, a, b): 91dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson if CHECK_TIMINGS: 92dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertAlmostEqual(a, b, 1) 93dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 94dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson def assertReturnsIfImplemented(self, value, func, *args): 95dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson try: 96dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson res = func(*args) 97dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson except NotImplementedError: 98dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson pass 99dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson else: 100dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson return self.assertEqual(value, res) 101dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 102dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# 103dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# Return the value of a semaphore 104dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# 105dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 106dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersondef get_value(self): 107dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson try: 108dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson return self.get_value() 109dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson except AttributeError: 110dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson try: 111dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson return self._Semaphore__value 112dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson except AttributeError: 113dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson try: 114dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson return self._value 115dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson except AttributeError: 116dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson raise NotImplementedError 117dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 118dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# 119dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# Testcases 120dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# 121dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 122dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonclass _TestProcess(BaseTestCase): 123dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 124dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson ALLOWED_TYPES = ('processes', 'threads') 125dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 126dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson def test_current(self): 127dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson if self.TYPE == 'threads': 128dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson return 129dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 130dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson current = self.current_process() 1315bc9f4c09c99eb701dbee83fb9e26eed558e474fJesse Noller authkey = current.authkey 132dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 133dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertTrue(current.is_alive()) 1345bc9f4c09c99eb701dbee83fb9e26eed558e474fJesse Noller self.assertTrue(not current.daemon) 135b0f5adc3f4e098b1744eeac65fc830fb1df2b8abEzio Melotti self.assertIsInstance(authkey, bytes) 136dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertTrue(len(authkey) > 0) 1375bc9f4c09c99eb701dbee83fb9e26eed558e474fJesse Noller self.assertEqual(current.ident, os.getpid()) 1385bc9f4c09c99eb701dbee83fb9e26eed558e474fJesse Noller self.assertEqual(current.exitcode, None) 139dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 140dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson def _test(self, q, *args, **kwds): 141dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson current = self.current_process() 142dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson q.put(args) 143dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson q.put(kwds) 1445bc9f4c09c99eb701dbee83fb9e26eed558e474fJesse Noller q.put(current.name) 145dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson if self.TYPE != 'threads': 1465bc9f4c09c99eb701dbee83fb9e26eed558e474fJesse Noller q.put(bytes(current.authkey)) 147dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson q.put(current.pid) 148dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 149dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson def test_process(self): 150dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson q = self.Queue(1) 151dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson e = self.Event() 152dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson args = (q, 1, 2) 153dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson kwargs = {'hello':23, 'bye':2.54} 154dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson name = 'SomeProcess' 155dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson p = self.Process( 156dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson target=self._test, args=args, kwargs=kwargs, name=name 157dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson ) 1585bc9f4c09c99eb701dbee83fb9e26eed558e474fJesse Noller p.daemon = True 159dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson current = self.current_process() 160dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 161dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson if self.TYPE != 'threads': 1625bc9f4c09c99eb701dbee83fb9e26eed558e474fJesse Noller self.assertEquals(p.authkey, current.authkey) 163dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEquals(p.is_alive(), False) 1645bc9f4c09c99eb701dbee83fb9e26eed558e474fJesse Noller self.assertEquals(p.daemon, True) 165aa98058cc44ba20f35c106d20918c6196b737561Ezio Melotti self.assertNotIn(p, self.active_children()) 166dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertTrue(type(self.active_children()) is list) 1675bc9f4c09c99eb701dbee83fb9e26eed558e474fJesse Noller self.assertEqual(p.exitcode, None) 168dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 169dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson p.start() 170dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1715bc9f4c09c99eb701dbee83fb9e26eed558e474fJesse Noller self.assertEquals(p.exitcode, None) 172dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEquals(p.is_alive(), True) 173aa98058cc44ba20f35c106d20918c6196b737561Ezio Melotti self.assertIn(p, self.active_children()) 174dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 175dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEquals(q.get(), args[1:]) 176dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEquals(q.get(), kwargs) 1775bc9f4c09c99eb701dbee83fb9e26eed558e474fJesse Noller self.assertEquals(q.get(), p.name) 178dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson if self.TYPE != 'threads': 1795bc9f4c09c99eb701dbee83fb9e26eed558e474fJesse Noller self.assertEquals(q.get(), current.authkey) 180dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEquals(q.get(), p.pid) 181dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 182dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson p.join() 183dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1845bc9f4c09c99eb701dbee83fb9e26eed558e474fJesse Noller self.assertEquals(p.exitcode, 0) 185dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEquals(p.is_alive(), False) 186aa98058cc44ba20f35c106d20918c6196b737561Ezio Melotti self.assertNotIn(p, self.active_children()) 187dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 188dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson def _test_terminate(self): 189dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson time.sleep(1000) 190dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 191dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson def test_terminate(self): 192dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson if self.TYPE == 'threads': 193dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson return 194dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 195dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson p = self.Process(target=self._test_terminate) 1965bc9f4c09c99eb701dbee83fb9e26eed558e474fJesse Noller p.daemon = True 197dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson p.start() 198dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 199dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(p.is_alive(), True) 200aa98058cc44ba20f35c106d20918c6196b737561Ezio Melotti self.assertIn(p, self.active_children()) 2015bc9f4c09c99eb701dbee83fb9e26eed558e474fJesse Noller self.assertEqual(p.exitcode, None) 202dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 203dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson p.terminate() 204dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 205dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson join = TimingWrapper(p.join) 206dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(join(), None) 207dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertTimingAlmostEqual(join.elapsed, 0.0) 208dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 209dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(p.is_alive(), False) 210aa98058cc44ba20f35c106d20918c6196b737561Ezio Melotti self.assertNotIn(p, self.active_children()) 211dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 212dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson p.join() 213dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 2145bc9f4c09c99eb701dbee83fb9e26eed558e474fJesse Noller # XXX sometimes get p.exitcode == 0 on Windows ... 2155bc9f4c09c99eb701dbee83fb9e26eed558e474fJesse Noller #self.assertEqual(p.exitcode, -signal.SIGTERM) 216dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 217dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson def test_cpu_count(self): 218dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson try: 219dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson cpus = multiprocessing.cpu_count() 220dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson except NotImplementedError: 221dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson cpus = 1 222dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertTrue(type(cpus) is int) 223dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertTrue(cpus >= 1) 224dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 225dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson def test_active_children(self): 226dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(type(self.active_children()), list) 227dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 228dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson p = self.Process(target=time.sleep, args=(DELTA,)) 229aa98058cc44ba20f35c106d20918c6196b737561Ezio Melotti self.assertNotIn(p, self.active_children()) 230dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 231dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson p.start() 232aa98058cc44ba20f35c106d20918c6196b737561Ezio Melotti self.assertIn(p, self.active_children()) 233dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 234dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson p.join() 235aa98058cc44ba20f35c106d20918c6196b737561Ezio Melotti self.assertNotIn(p, self.active_children()) 236dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 237dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson def _test_recursion(self, wconn, id): 238dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson from multiprocessing import forking 239dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson wconn.send(id) 240dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson if len(id) < 2: 241dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson for i in range(2): 242dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson p = self.Process( 243dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson target=self._test_recursion, args=(wconn, id+[i]) 244dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson ) 245dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson p.start() 246dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson p.join() 247dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 248dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson def test_recursion(self): 249dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson rconn, wconn = self.Pipe(duplex=False) 250dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self._test_recursion(wconn, []) 251dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 252dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson time.sleep(DELTA) 253dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson result = [] 254dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson while rconn.poll(): 255dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson result.append(rconn.recv()) 256dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 257dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson expected = [ 258dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson [], 259dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson [0], 260dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson [0, 0], 261dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson [0, 1], 262dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson [1], 263dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson [1, 0], 264dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson [1, 1] 265dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson ] 266dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(result, expected) 267dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 268dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# 269dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# 270dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# 271dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 272dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonclass _UpperCaser(multiprocessing.Process): 273dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 274dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson def __init__(self): 275dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson multiprocessing.Process.__init__(self) 276dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.child_conn, self.parent_conn = multiprocessing.Pipe() 277dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 278dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson def run(self): 279dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.parent_conn.close() 280dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson for s in iter(self.child_conn.recv, None): 281dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.child_conn.send(s.upper()) 282dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.child_conn.close() 283dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 284dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson def submit(self, s): 285dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson assert type(s) is str 286dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.parent_conn.send(s) 287dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson return self.parent_conn.recv() 288dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 289dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson def stop(self): 290dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.parent_conn.send(None) 291dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.parent_conn.close() 292dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.child_conn.close() 293dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 294dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonclass _TestSubclassingProcess(BaseTestCase): 295dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 296dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson ALLOWED_TYPES = ('processes',) 297dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 298dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson def test_subclassing(self): 299dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson uppercaser = _UpperCaser() 300dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson uppercaser.start() 301dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(uppercaser.submit('hello'), 'HELLO') 302dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(uppercaser.submit('world'), 'WORLD') 303dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson uppercaser.stop() 304dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson uppercaser.join() 305dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 306dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# 307dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# 308dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# 309dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 310dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersondef queue_empty(q): 311dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson if hasattr(q, 'empty'): 312dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson return q.empty() 313dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson else: 314dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson return q.qsize() == 0 315dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 316dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersondef queue_full(q, maxsize): 317dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson if hasattr(q, 'full'): 318dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson return q.full() 319dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson else: 320dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson return q.qsize() == maxsize 321dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 322dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 323dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonclass _TestQueue(BaseTestCase): 324dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 325dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 326dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson def _test_put(self, queue, child_can_start, parent_can_continue): 327dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson child_can_start.wait() 328dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson for i in range(6): 329dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson queue.get() 330dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson parent_can_continue.set() 331dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 332dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson def test_put(self): 333dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson MAXSIZE = 6 334dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson queue = self.Queue(maxsize=MAXSIZE) 335dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson child_can_start = self.Event() 336dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson parent_can_continue = self.Event() 337dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 338dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson proc = self.Process( 339dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson target=self._test_put, 340dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson args=(queue, child_can_start, parent_can_continue) 341dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson ) 3425bc9f4c09c99eb701dbee83fb9e26eed558e474fJesse Noller proc.daemon = True 343dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson proc.start() 344dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 345dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(queue_empty(queue), True) 346dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(queue_full(queue, MAXSIZE), False) 347dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 348dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson queue.put(1) 349dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson queue.put(2, True) 350dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson queue.put(3, True, None) 351dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson queue.put(4, False) 352dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson queue.put(5, False, None) 353dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson queue.put_nowait(6) 354dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 355dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson # the values may be in buffer but not yet in pipe so sleep a bit 356dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson time.sleep(DELTA) 357dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 358dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(queue_empty(queue), False) 359dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(queue_full(queue, MAXSIZE), True) 360dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 361dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson put = TimingWrapper(queue.put) 362dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson put_nowait = TimingWrapper(queue.put_nowait) 363dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 364dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertRaises(Queue.Full, put, 7, False) 365dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertTimingAlmostEqual(put.elapsed, 0) 366dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 367dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertRaises(Queue.Full, put, 7, False, None) 368dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertTimingAlmostEqual(put.elapsed, 0) 369dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 370dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertRaises(Queue.Full, put_nowait, 7) 371dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertTimingAlmostEqual(put_nowait.elapsed, 0) 372dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 373dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertRaises(Queue.Full, put, 7, True, TIMEOUT1) 374dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertTimingAlmostEqual(put.elapsed, TIMEOUT1) 375dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 376dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertRaises(Queue.Full, put, 7, False, TIMEOUT2) 377dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertTimingAlmostEqual(put.elapsed, 0) 378dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 379dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertRaises(Queue.Full, put, 7, True, timeout=TIMEOUT3) 380dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertTimingAlmostEqual(put.elapsed, TIMEOUT3) 381dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 382dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson child_can_start.set() 383dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson parent_can_continue.wait() 384dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 385dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(queue_empty(queue), True) 386dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(queue_full(queue, MAXSIZE), False) 387dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 388dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson proc.join() 389dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 390dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson def _test_get(self, queue, child_can_start, parent_can_continue): 391dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson child_can_start.wait() 392da3a1b120055855a464c2d5f5143021ae8f5dc86Benjamin Peterson #queue.put(1) 393dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson queue.put(2) 394dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson queue.put(3) 395dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson queue.put(4) 396dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson queue.put(5) 397dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson parent_can_continue.set() 398dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 399dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson def test_get(self): 400dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson queue = self.Queue() 401dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson child_can_start = self.Event() 402dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson parent_can_continue = self.Event() 403dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 404dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson proc = self.Process( 405dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson target=self._test_get, 406dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson args=(queue, child_can_start, parent_can_continue) 407dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson ) 4085bc9f4c09c99eb701dbee83fb9e26eed558e474fJesse Noller proc.daemon = True 409dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson proc.start() 410dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 411dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(queue_empty(queue), True) 412dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 413dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson child_can_start.set() 414dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson parent_can_continue.wait() 415dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 416dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson time.sleep(DELTA) 417dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(queue_empty(queue), False) 418dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 419da3a1b120055855a464c2d5f5143021ae8f5dc86Benjamin Peterson # Hangs unexpectedly, remove for now 420da3a1b120055855a464c2d5f5143021ae8f5dc86Benjamin Peterson #self.assertEqual(queue.get(), 1) 421dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(queue.get(True, None), 2) 422dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(queue.get(True), 3) 423dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(queue.get(timeout=1), 4) 424dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(queue.get_nowait(), 5) 425dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 426dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(queue_empty(queue), True) 427dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 428dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson get = TimingWrapper(queue.get) 429dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson get_nowait = TimingWrapper(queue.get_nowait) 430dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 431dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertRaises(Queue.Empty, get, False) 432dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertTimingAlmostEqual(get.elapsed, 0) 433dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 434dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertRaises(Queue.Empty, get, False, None) 435dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertTimingAlmostEqual(get.elapsed, 0) 436dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 437dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertRaises(Queue.Empty, get_nowait) 438dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertTimingAlmostEqual(get_nowait.elapsed, 0) 439dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 440dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertRaises(Queue.Empty, get, True, TIMEOUT1) 441dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertTimingAlmostEqual(get.elapsed, TIMEOUT1) 442dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 443dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertRaises(Queue.Empty, get, False, TIMEOUT2) 444dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertTimingAlmostEqual(get.elapsed, 0) 445dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 446dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertRaises(Queue.Empty, get, timeout=TIMEOUT3) 447dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertTimingAlmostEqual(get.elapsed, TIMEOUT3) 448dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 449dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson proc.join() 450dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 451dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson def _test_fork(self, queue): 452dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson for i in range(10, 20): 453dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson queue.put(i) 454dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson # note that at this point the items may only be buffered, so the 455dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson # process cannot shutdown until the feeder thread has finished 456dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson # pushing items onto the pipe. 457dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 458dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson def test_fork(self): 459dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson # Old versions of Queue would fail to create a new feeder 460dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson # thread for a forked process if the original process had its 461dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson # own feeder thread. This test checks that this no longer 462dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson # happens. 463dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 464dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson queue = self.Queue() 465dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 466dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson # put items on queue so that main process starts a feeder thread 467dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson for i in range(10): 468dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson queue.put(i) 469dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 470dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson # wait to make sure thread starts before we fork a new process 471dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson time.sleep(DELTA) 472dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 473dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson # fork process 474dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson p = self.Process(target=self._test_fork, args=(queue,)) 475dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson p.start() 476dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 477dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson # check that all expected items are in the queue 478dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson for i in range(20): 479dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(queue.get(), i) 480dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertRaises(Queue.Empty, queue.get, False) 481dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 482dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson p.join() 483dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 484dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson def test_qsize(self): 485dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson q = self.Queue() 486dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson try: 487dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(q.qsize(), 0) 488dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson except NotImplementedError: 489dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson return 490dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson q.put(1) 491dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(q.qsize(), 1) 492dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson q.put(5) 493dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(q.qsize(), 2) 494dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson q.get() 495dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(q.qsize(), 1) 496dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson q.get() 497dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(q.qsize(), 0) 498dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 499dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson def _test_task_done(self, q): 500dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson for obj in iter(q.get, None): 501dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson time.sleep(DELTA) 502dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson q.task_done() 503dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 504dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson def test_task_done(self): 505dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson queue = self.JoinableQueue() 506dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 507dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson if sys.version_info < (2, 5) and not hasattr(queue, 'task_done'): 508dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson return 509dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 510dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson workers = [self.Process(target=self._test_task_done, args=(queue,)) 511dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson for i in xrange(4)] 512dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 513dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson for p in workers: 514dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson p.start() 515dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 516dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson for i in xrange(10): 517dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson queue.put(i) 518dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 519dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson queue.join() 520dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 521dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson for p in workers: 522dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson queue.put(None) 523dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 524dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson for p in workers: 525dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson p.join() 526dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 527dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# 528dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# 529dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# 530dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 531dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonclass _TestLock(BaseTestCase): 532dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 533dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson def test_lock(self): 534dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson lock = self.Lock() 535dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(lock.acquire(), True) 536dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(lock.acquire(False), False) 537dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(lock.release(), None) 538dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertRaises((ValueError, threading.ThreadError), lock.release) 539dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 540dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson def test_rlock(self): 541dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson lock = self.RLock() 542dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(lock.acquire(), True) 543dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(lock.acquire(), True) 544dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(lock.acquire(), True) 545dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(lock.release(), None) 546dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(lock.release(), None) 547dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(lock.release(), None) 548dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertRaises((AssertionError, RuntimeError), lock.release) 549dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 55082eb5902ce169be81110c79662b772b904cd00fcJesse Noller def test_lock_context(self): 55182eb5902ce169be81110c79662b772b904cd00fcJesse Noller with self.Lock(): 55282eb5902ce169be81110c79662b772b904cd00fcJesse Noller pass 55382eb5902ce169be81110c79662b772b904cd00fcJesse Noller 554dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 555dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonclass _TestSemaphore(BaseTestCase): 556dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 557dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson def _test_semaphore(self, sem): 558dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertReturnsIfImplemented(2, get_value, sem) 559dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(sem.acquire(), True) 560dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertReturnsIfImplemented(1, get_value, sem) 561dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(sem.acquire(), True) 562dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertReturnsIfImplemented(0, get_value, sem) 563dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(sem.acquire(False), False) 564dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertReturnsIfImplemented(0, get_value, sem) 565dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(sem.release(), None) 566dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertReturnsIfImplemented(1, get_value, sem) 567dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(sem.release(), None) 568dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertReturnsIfImplemented(2, get_value, sem) 569dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 570dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson def test_semaphore(self): 571dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson sem = self.Semaphore(2) 572dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self._test_semaphore(sem) 573dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(sem.release(), None) 574dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertReturnsIfImplemented(3, get_value, sem) 575dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(sem.release(), None) 576dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertReturnsIfImplemented(4, get_value, sem) 577dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 578dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson def test_bounded_semaphore(self): 579dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson sem = self.BoundedSemaphore(2) 580dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self._test_semaphore(sem) 581dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson # Currently fails on OS/X 582dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson #if HAVE_GETVALUE: 583dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson # self.assertRaises(ValueError, sem.release) 584dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson # self.assertReturnsIfImplemented(2, get_value, sem) 585dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 586dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson def test_timeout(self): 587dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson if self.TYPE != 'processes': 588dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson return 589dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 590dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson sem = self.Semaphore(0) 591dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson acquire = TimingWrapper(sem.acquire) 592dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 593dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(acquire(False), False) 594dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertTimingAlmostEqual(acquire.elapsed, 0.0) 595dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 596dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(acquire(False, None), False) 597dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertTimingAlmostEqual(acquire.elapsed, 0.0) 598dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 599dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(acquire(False, TIMEOUT1), False) 600dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertTimingAlmostEqual(acquire.elapsed, 0) 601dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 602dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(acquire(True, TIMEOUT2), False) 603dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertTimingAlmostEqual(acquire.elapsed, TIMEOUT2) 604dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 605dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(acquire(timeout=TIMEOUT3), False) 606dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertTimingAlmostEqual(acquire.elapsed, TIMEOUT3) 607dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 608dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 609dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonclass _TestCondition(BaseTestCase): 610dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 611dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson def f(self, cond, sleeping, woken, timeout=None): 612dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson cond.acquire() 613dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson sleeping.release() 614dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson cond.wait(timeout) 615dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson woken.release() 616dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson cond.release() 617dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 618dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson def check_invariant(self, cond): 619dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson # this is only supposed to succeed when there are no sleepers 620dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson if self.TYPE == 'processes': 621dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson try: 622dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson sleepers = (cond._sleeping_count.get_value() - 623dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson cond._woken_count.get_value()) 624dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(sleepers, 0) 625dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(cond._wait_semaphore.get_value(), 0) 626dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson except NotImplementedError: 627dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson pass 628dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 629dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson def test_notify(self): 630dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson cond = self.Condition() 631dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson sleeping = self.Semaphore(0) 632dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson woken = self.Semaphore(0) 633dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 634dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson p = self.Process(target=self.f, args=(cond, sleeping, woken)) 6355bc9f4c09c99eb701dbee83fb9e26eed558e474fJesse Noller p.daemon = True 636dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson p.start() 637dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 638dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson p = threading.Thread(target=self.f, args=(cond, sleeping, woken)) 6395bc9f4c09c99eb701dbee83fb9e26eed558e474fJesse Noller p.daemon = True 640dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson p.start() 641dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 642dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson # wait for both children to start sleeping 643dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson sleeping.acquire() 644dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson sleeping.acquire() 645dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 646dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson # check no process/thread has woken up 647dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson time.sleep(DELTA) 648dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertReturnsIfImplemented(0, get_value, woken) 649dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 650dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson # wake up one process/thread 651dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson cond.acquire() 652dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson cond.notify() 653dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson cond.release() 654dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 655dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson # check one process/thread has woken up 656dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson time.sleep(DELTA) 657dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertReturnsIfImplemented(1, get_value, woken) 658dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 659dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson # wake up another 660dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson cond.acquire() 661dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson cond.notify() 662dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson cond.release() 663dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 664dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson # check other has woken up 665dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson time.sleep(DELTA) 666dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertReturnsIfImplemented(2, get_value, woken) 667dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 668dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson # check state is not mucked up 669dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.check_invariant(cond) 670dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson p.join() 671dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 672dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson def test_notify_all(self): 673dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson cond = self.Condition() 674dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson sleeping = self.Semaphore(0) 675dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson woken = self.Semaphore(0) 676dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 677dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson # start some threads/processes which will timeout 678dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson for i in range(3): 679dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson p = self.Process(target=self.f, 680dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson args=(cond, sleeping, woken, TIMEOUT1)) 6815bc9f4c09c99eb701dbee83fb9e26eed558e474fJesse Noller p.daemon = True 682dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson p.start() 683dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 684dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson t = threading.Thread(target=self.f, 685dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson args=(cond, sleeping, woken, TIMEOUT1)) 686a9b2222de40ed62e6ec1c79f6a89607913f4babdBenjamin Peterson t.daemon = True 687dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson t.start() 688dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 689dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson # wait for them all to sleep 690dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson for i in xrange(6): 691dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson sleeping.acquire() 692dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 693dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson # check they have all timed out 694dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson for i in xrange(6): 695dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson woken.acquire() 696dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertReturnsIfImplemented(0, get_value, woken) 697dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 698dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson # check state is not mucked up 699dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.check_invariant(cond) 700dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 701dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson # start some more threads/processes 702dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson for i in range(3): 703dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson p = self.Process(target=self.f, args=(cond, sleeping, woken)) 7045bc9f4c09c99eb701dbee83fb9e26eed558e474fJesse Noller p.daemon = True 705dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson p.start() 706dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 707dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson t = threading.Thread(target=self.f, args=(cond, sleeping, woken)) 708a9b2222de40ed62e6ec1c79f6a89607913f4babdBenjamin Peterson t.daemon = True 709dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson t.start() 710dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 711dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson # wait for them to all sleep 712dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson for i in xrange(6): 713dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson sleeping.acquire() 714dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 715dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson # check no process/thread has woken up 716dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson time.sleep(DELTA) 717dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertReturnsIfImplemented(0, get_value, woken) 718dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 719dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson # wake them all up 720dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson cond.acquire() 721dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson cond.notify_all() 722dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson cond.release() 723dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 724dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson # check they have all woken 725dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson time.sleep(DELTA) 726dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertReturnsIfImplemented(6, get_value, woken) 727dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 728dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson # check state is not mucked up 729dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.check_invariant(cond) 730dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 731dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson def test_timeout(self): 732dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson cond = self.Condition() 733dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson wait = TimingWrapper(cond.wait) 734dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson cond.acquire() 735dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson res = wait(TIMEOUT1) 736dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson cond.release() 737dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(res, None) 738dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertTimingAlmostEqual(wait.elapsed, TIMEOUT1) 739dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 740dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 741dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonclass _TestEvent(BaseTestCase): 742dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 743dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson def _test_event(self, event): 744dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson time.sleep(TIMEOUT2) 745dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson event.set() 746dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 747dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson def test_event(self): 748dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson event = self.Event() 749dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson wait = TimingWrapper(event.wait) 750dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 751dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson # Removed temporaily, due to API shear, this does not 752dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson # work with threading._Event objects. is_set == isSet 75302cb0eb231fc01e2a50cbe14f6da7a8df52959efJesse Noller self.assertEqual(event.is_set(), False) 754dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 75502cb0eb231fc01e2a50cbe14f6da7a8df52959efJesse Noller # Removed, threading.Event.wait() will return the value of the __flag 75602cb0eb231fc01e2a50cbe14f6da7a8df52959efJesse Noller # instead of None. API Shear with the semaphore backed mp.Event 75702cb0eb231fc01e2a50cbe14f6da7a8df52959efJesse Noller self.assertEqual(wait(0.0), False) 758dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertTimingAlmostEqual(wait.elapsed, 0.0) 75902cb0eb231fc01e2a50cbe14f6da7a8df52959efJesse Noller self.assertEqual(wait(TIMEOUT1), False) 760dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertTimingAlmostEqual(wait.elapsed, TIMEOUT1) 761dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 762dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson event.set() 763dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 764dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson # See note above on the API differences 76502cb0eb231fc01e2a50cbe14f6da7a8df52959efJesse Noller self.assertEqual(event.is_set(), True) 76602cb0eb231fc01e2a50cbe14f6da7a8df52959efJesse Noller self.assertEqual(wait(), True) 767dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertTimingAlmostEqual(wait.elapsed, 0.0) 76802cb0eb231fc01e2a50cbe14f6da7a8df52959efJesse Noller self.assertEqual(wait(TIMEOUT1), True) 769dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertTimingAlmostEqual(wait.elapsed, 0.0) 770dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson # self.assertEqual(event.is_set(), True) 771dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 772dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson event.clear() 773dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 774dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson #self.assertEqual(event.is_set(), False) 775dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 776dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.Process(target=self._test_event, args=(event,)).start() 77702cb0eb231fc01e2a50cbe14f6da7a8df52959efJesse Noller self.assertEqual(wait(), True) 778dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 779dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# 780dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# 781dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# 782dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 783dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonclass _TestValue(BaseTestCase): 784dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 785dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson codes_values = [ 786dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson ('i', 4343, 24234), 787dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson ('d', 3.625, -4.25), 788dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson ('h', -232, 234), 789dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson ('c', latin('x'), latin('y')) 790dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson ] 791dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 792dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson def _test(self, values): 793dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson for sv, cv in zip(values, self.codes_values): 794dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson sv.value = cv[2] 795dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 796dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 797dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson def test_value(self, raw=False): 798dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson if self.TYPE != 'processes': 799dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson return 800dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 801dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson if raw: 802dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson values = [self.RawValue(code, value) 803dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson for code, value, _ in self.codes_values] 804dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson else: 805dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson values = [self.Value(code, value) 806dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson for code, value, _ in self.codes_values] 807dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 808dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson for sv, cv in zip(values, self.codes_values): 809dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(sv.value, cv[1]) 810dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 811dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson proc = self.Process(target=self._test, args=(values,)) 812dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson proc.start() 813dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson proc.join() 814dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 815dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson for sv, cv in zip(values, self.codes_values): 816dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(sv.value, cv[2]) 817dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 818dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson def test_rawvalue(self): 819dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.test_value(raw=True) 820dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 821dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson def test_getobj_getlock(self): 822dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson if self.TYPE != 'processes': 823dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson return 824dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 825dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson val1 = self.Value('i', 5) 826dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson lock1 = val1.get_lock() 827dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson obj1 = val1.get_obj() 828dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 829dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson val2 = self.Value('i', 5, lock=None) 830dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson lock2 = val2.get_lock() 831dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson obj2 = val2.get_obj() 832dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 833dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson lock = self.Lock() 834dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson val3 = self.Value('i', 5, lock=lock) 835dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson lock3 = val3.get_lock() 836dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson obj3 = val3.get_obj() 837dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(lock, lock3) 838dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 8396ab22154ddabdb67bd510a1f2e0aa9c7e0ee607dJesse Noller arr4 = self.Value('i', 5, lock=False) 840dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertFalse(hasattr(arr4, 'get_lock')) 841dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertFalse(hasattr(arr4, 'get_obj')) 842dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 8436ab22154ddabdb67bd510a1f2e0aa9c7e0ee607dJesse Noller self.assertRaises(AttributeError, self.Value, 'i', 5, lock='navalue') 8446ab22154ddabdb67bd510a1f2e0aa9c7e0ee607dJesse Noller 8456ab22154ddabdb67bd510a1f2e0aa9c7e0ee607dJesse Noller arr5 = self.RawValue('i', 5) 8466ab22154ddabdb67bd510a1f2e0aa9c7e0ee607dJesse Noller self.assertFalse(hasattr(arr5, 'get_lock')) 8476ab22154ddabdb67bd510a1f2e0aa9c7e0ee607dJesse Noller self.assertFalse(hasattr(arr5, 'get_obj')) 8486ab22154ddabdb67bd510a1f2e0aa9c7e0ee607dJesse Noller 849dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 850dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonclass _TestArray(BaseTestCase): 851dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 852dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson def f(self, seq): 853dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson for i in range(1, len(seq)): 854dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson seq[i] += seq[i-1] 855dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 856dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson def test_array(self, raw=False): 857dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson if self.TYPE != 'processes': 858dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson return 859dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 860dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson seq = [680, 626, 934, 821, 150, 233, 548, 982, 714, 831] 861dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson if raw: 862dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson arr = self.RawArray('i', seq) 863dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson else: 864dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson arr = self.Array('i', seq) 865dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 866dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(len(arr), len(seq)) 867dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(arr[3], seq[3]) 868dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(list(arr[2:7]), list(seq[2:7])) 869dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 870dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson arr[4:8] = seq[4:8] = array.array('i', [1, 2, 3, 4]) 871dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 872dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(list(arr[:]), seq) 873dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 874dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.f(seq) 875dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 876dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson p = self.Process(target=self.f, args=(arr,)) 877dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson p.start() 878dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson p.join() 879dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 880dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(list(arr[:]), seq) 881dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 882dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson def test_rawarray(self): 883dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.test_array(raw=True) 884dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 885dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson def test_getobj_getlock_obj(self): 886dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson if self.TYPE != 'processes': 887dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson return 888dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 889dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson arr1 = self.Array('i', range(10)) 890dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson lock1 = arr1.get_lock() 891dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson obj1 = arr1.get_obj() 892dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 893dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson arr2 = self.Array('i', range(10), lock=None) 894dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson lock2 = arr2.get_lock() 895dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson obj2 = arr2.get_obj() 896dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 897dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson lock = self.Lock() 898dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson arr3 = self.Array('i', range(10), lock=lock) 899dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson lock3 = arr3.get_lock() 900dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson obj3 = arr3.get_obj() 901dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(lock, lock3) 902dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 9036ab22154ddabdb67bd510a1f2e0aa9c7e0ee607dJesse Noller arr4 = self.Array('i', range(10), lock=False) 904dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertFalse(hasattr(arr4, 'get_lock')) 905dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertFalse(hasattr(arr4, 'get_obj')) 9066ab22154ddabdb67bd510a1f2e0aa9c7e0ee607dJesse Noller self.assertRaises(AttributeError, 9076ab22154ddabdb67bd510a1f2e0aa9c7e0ee607dJesse Noller self.Array, 'i', range(10), lock='notalock') 9086ab22154ddabdb67bd510a1f2e0aa9c7e0ee607dJesse Noller 9096ab22154ddabdb67bd510a1f2e0aa9c7e0ee607dJesse Noller arr5 = self.RawArray('i', range(10)) 9106ab22154ddabdb67bd510a1f2e0aa9c7e0ee607dJesse Noller self.assertFalse(hasattr(arr5, 'get_lock')) 9116ab22154ddabdb67bd510a1f2e0aa9c7e0ee607dJesse Noller self.assertFalse(hasattr(arr5, 'get_obj')) 912dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 913dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# 914dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# 915dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# 916dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 917dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonclass _TestContainers(BaseTestCase): 918dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 919dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson ALLOWED_TYPES = ('manager',) 920dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 921dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson def test_list(self): 922dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson a = self.list(range(10)) 923dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(a[:], range(10)) 924dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 925dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson b = self.list() 926dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(b[:], []) 927dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 928dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson b.extend(range(5)) 929dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(b[:], range(5)) 930dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 931dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(b[2], 2) 932dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(b[2:10], [2,3,4]) 933dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 934dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson b *= 2 935dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(b[:], [0, 1, 2, 3, 4, 0, 1, 2, 3, 4]) 936dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 937dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(b + [5, 6], [0, 1, 2, 3, 4, 0, 1, 2, 3, 4, 5, 6]) 938dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 939dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(a[:], range(10)) 940dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 941dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson d = [a, b] 942dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson e = self.list(d) 943dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual( 944dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson e[:], 945dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson [[0, 1, 2, 3, 4, 5, 6, 7, 8, 9], [0, 1, 2, 3, 4, 0, 1, 2, 3, 4]] 946dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson ) 947dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 948dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson f = self.list([a]) 949dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson a.append('hello') 950dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(f[:], [[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 'hello']]) 951dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 952dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson def test_dict(self): 953dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson d = self.dict() 954dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson indices = range(65, 70) 955dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson for i in indices: 956dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson d[i] = chr(i) 957dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(d.copy(), dict((i, chr(i)) for i in indices)) 958dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(sorted(d.keys()), indices) 959dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(sorted(d.values()), [chr(i) for i in indices]) 960dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(sorted(d.items()), [(i, chr(i)) for i in indices]) 961dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 962dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson def test_namespace(self): 963dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson n = self.Namespace() 964dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson n.name = 'Bob' 965dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson n.job = 'Builder' 966dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson n._hidden = 'hidden' 967dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual((n.name, n.job), ('Bob', 'Builder')) 968dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson del n.job 969dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(str(n), "Namespace(name='Bob')") 970dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertTrue(hasattr(n, 'name')) 971dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertTrue(not hasattr(n, 'job')) 972dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 973dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# 974dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# 975dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# 976dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 977dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersondef sqr(x, wait=0.0): 978dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson time.sleep(wait) 979dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson return x*x 980dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonclass _TestPool(BaseTestCase): 981dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 982dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson def test_apply(self): 983dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson papply = self.pool.apply 984dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(papply(sqr, (5,)), sqr(5)) 985dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(papply(sqr, (), {'x':3}), sqr(x=3)) 986dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 987dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson def test_map(self): 988dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson pmap = self.pool.map 989dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(pmap(sqr, range(10)), map(sqr, range(10))) 990dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(pmap(sqr, range(100), chunksize=20), 991dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson map(sqr, range(100))) 992dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 9937530e47948446f03a79ad7dec4cc129ad3388418Jesse Noller def test_map_chunksize(self): 9947530e47948446f03a79ad7dec4cc129ad3388418Jesse Noller try: 9957530e47948446f03a79ad7dec4cc129ad3388418Jesse Noller self.pool.map_async(sqr, [], chunksize=1).get(timeout=TIMEOUT1) 9967530e47948446f03a79ad7dec4cc129ad3388418Jesse Noller except multiprocessing.TimeoutError: 9977530e47948446f03a79ad7dec4cc129ad3388418Jesse Noller self.fail("pool.map_async with chunksize stalled on null list") 9987530e47948446f03a79ad7dec4cc129ad3388418Jesse Noller 999dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson def test_async(self): 1000dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson res = self.pool.apply_async(sqr, (7, TIMEOUT1,)) 1001dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson get = TimingWrapper(res.get) 1002dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(get(), 49) 1003dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertTimingAlmostEqual(get.elapsed, TIMEOUT1) 1004dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1005dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson def test_async_timeout(self): 1006dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson res = self.pool.apply_async(sqr, (6, TIMEOUT2 + 0.2)) 1007dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson get = TimingWrapper(res.get) 1008dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertRaises(multiprocessing.TimeoutError, get, timeout=TIMEOUT2) 1009dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertTimingAlmostEqual(get.elapsed, TIMEOUT2) 1010dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1011dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson def test_imap(self): 1012dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson it = self.pool.imap(sqr, range(10)) 1013dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(list(it), map(sqr, range(10))) 1014dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1015dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson it = self.pool.imap(sqr, range(10)) 1016dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson for i in range(10): 1017dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(it.next(), i*i) 1018dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertRaises(StopIteration, it.next) 1019dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1020dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson it = self.pool.imap(sqr, range(1000), chunksize=100) 1021dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson for i in range(1000): 1022dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(it.next(), i*i) 1023dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertRaises(StopIteration, it.next) 1024dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1025dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson def test_imap_unordered(self): 1026dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson it = self.pool.imap_unordered(sqr, range(1000)) 1027dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(sorted(it), map(sqr, range(1000))) 1028dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1029dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson it = self.pool.imap_unordered(sqr, range(1000), chunksize=53) 1030dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(sorted(it), map(sqr, range(1000))) 1031dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1032dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson def test_make_pool(self): 1033dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson p = multiprocessing.Pool(3) 1034dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(3, len(p._pool)) 1035dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson p.close() 1036dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson p.join() 1037dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1038dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson def test_terminate(self): 1039dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson if self.TYPE == 'manager': 1040dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson # On Unix a forked process increfs each shared object to 1041dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson # which its parent process held a reference. If the 1042dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson # forked process gets terminated then there is likely to 1043dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson # be a reference leak. So to prevent 1044dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson # _TestZZZNumberOfObjects from failing we skip this test 1045dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson # when using a manager. 1046dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson return 1047dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1048dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson result = self.pool.map_async( 1049dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson time.sleep, [0.1 for i in range(10000)], chunksize=1 1050dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson ) 1051dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.pool.terminate() 1052dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson join = TimingWrapper(self.pool.join) 1053dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson join() 1054dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertTrue(join.elapsed < 0.2) 1055654ade3e6afa2527d1f642be28d69e219bd58b71Jesse Noller 1056654ade3e6afa2527d1f642be28d69e219bd58b71Jesse Nollerclass _TestPoolWorkerLifetime(BaseTestCase): 1057654ade3e6afa2527d1f642be28d69e219bd58b71Jesse Noller 1058654ade3e6afa2527d1f642be28d69e219bd58b71Jesse Noller ALLOWED_TYPES = ('processes', ) 1059654ade3e6afa2527d1f642be28d69e219bd58b71Jesse Noller def test_pool_worker_lifetime(self): 1060654ade3e6afa2527d1f642be28d69e219bd58b71Jesse Noller p = multiprocessing.Pool(3, maxtasksperchild=10) 1061654ade3e6afa2527d1f642be28d69e219bd58b71Jesse Noller self.assertEqual(3, len(p._pool)) 1062654ade3e6afa2527d1f642be28d69e219bd58b71Jesse Noller origworkerpids = [w.pid for w in p._pool] 1063654ade3e6afa2527d1f642be28d69e219bd58b71Jesse Noller # Run many tasks so each worker gets replaced (hopefully) 1064654ade3e6afa2527d1f642be28d69e219bd58b71Jesse Noller results = [] 1065654ade3e6afa2527d1f642be28d69e219bd58b71Jesse Noller for i in range(100): 1066654ade3e6afa2527d1f642be28d69e219bd58b71Jesse Noller results.append(p.apply_async(sqr, (i, ))) 1067654ade3e6afa2527d1f642be28d69e219bd58b71Jesse Noller # Fetch the results and verify we got the right answers, 1068654ade3e6afa2527d1f642be28d69e219bd58b71Jesse Noller # also ensuring all the tasks have completed. 1069654ade3e6afa2527d1f642be28d69e219bd58b71Jesse Noller for (j, res) in enumerate(results): 1070654ade3e6afa2527d1f642be28d69e219bd58b71Jesse Noller self.assertEqual(res.get(), sqr(j)) 1071654ade3e6afa2527d1f642be28d69e219bd58b71Jesse Noller # Refill the pool 1072654ade3e6afa2527d1f642be28d69e219bd58b71Jesse Noller p._repopulate_pool() 1073654ade3e6afa2527d1f642be28d69e219bd58b71Jesse Noller # Finally, check that the worker pids have changed 1074654ade3e6afa2527d1f642be28d69e219bd58b71Jesse Noller finalworkerpids = [w.pid for w in p._pool] 1075654ade3e6afa2527d1f642be28d69e219bd58b71Jesse Noller self.assertNotEqual(sorted(origworkerpids), sorted(finalworkerpids)) 1076654ade3e6afa2527d1f642be28d69e219bd58b71Jesse Noller p.close() 1077654ade3e6afa2527d1f642be28d69e219bd58b71Jesse Noller p.join() 1078654ade3e6afa2527d1f642be28d69e219bd58b71Jesse Noller 1079dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# 1080dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# Test that manager has expected number of shared objects left 1081dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# 1082dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1083dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonclass _TestZZZNumberOfObjects(BaseTestCase): 1084dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson # Because test cases are sorted alphabetically, this one will get 1085dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson # run after all the other tests for the manager. It tests that 1086dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson # there have been no "reference leaks" for the manager's shared 1087dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson # objects. Note the comment in _TestPool.test_terminate(). 1088dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson ALLOWED_TYPES = ('manager',) 1089dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1090dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson def test_number_of_objects(self): 1091dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson EXPECTED_NUMBER = 1 # the pool object is still alive 1092dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson multiprocessing.active_children() # discard dead process objs 1093dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson gc.collect() # do garbage collection 1094dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson refs = self.manager._number_of_objects() 10957314b38168da53863136d1937059fc0ac4883a56Jesse Noller debug_info = self.manager._debug_info() 1096dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson if refs != EXPECTED_NUMBER: 10977fb9640d57f5d96dcaa0d0e6497abc21fa85f37eJesse Noller print self.manager._debug_info() 10987314b38168da53863136d1937059fc0ac4883a56Jesse Noller print debug_info 1099dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1100dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(refs, EXPECTED_NUMBER) 1101dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1102dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# 1103dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# Test of creating a customized manager class 1104dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# 1105dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1106dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonfrom multiprocessing.managers import BaseManager, BaseProxy, RemoteError 1107dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1108dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonclass FooBar(object): 1109dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson def f(self): 1110dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson return 'f()' 1111dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson def g(self): 1112dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson raise ValueError 1113dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson def _h(self): 1114dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson return '_h()' 1115dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1116dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersondef baz(): 1117dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson for i in xrange(10): 1118dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson yield i*i 1119dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1120dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonclass IteratorProxy(BaseProxy): 1121dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson _exposed_ = ('next', '__next__') 1122dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson def __iter__(self): 1123dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson return self 1124dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson def next(self): 1125dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson return self._callmethod('next') 1126dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson def __next__(self): 1127dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson return self._callmethod('__next__') 1128dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1129dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonclass MyManager(BaseManager): 1130dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson pass 1131dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1132dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin PetersonMyManager.register('Foo', callable=FooBar) 1133dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin PetersonMyManager.register('Bar', callable=FooBar, exposed=('f', '_h')) 1134dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin PetersonMyManager.register('baz', callable=baz, proxytype=IteratorProxy) 1135dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1136dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1137dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonclass _TestMyManager(BaseTestCase): 1138dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1139dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson ALLOWED_TYPES = ('manager',) 1140dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1141dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson def test_mymanager(self): 1142dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson manager = MyManager() 1143dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson manager.start() 1144dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1145dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson foo = manager.Foo() 1146dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson bar = manager.Bar() 1147dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson baz = manager.baz() 1148dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1149dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson foo_methods = [name for name in ('f', 'g', '_h') if hasattr(foo, name)] 1150dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson bar_methods = [name for name in ('f', 'g', '_h') if hasattr(bar, name)] 1151dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1152dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(foo_methods, ['f', 'g']) 1153dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(bar_methods, ['f', '_h']) 1154dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1155dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(foo.f(), 'f()') 1156dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertRaises(ValueError, foo.g) 1157dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(foo._callmethod('f'), 'f()') 1158dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertRaises(RemoteError, foo._callmethod, '_h') 1159dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1160dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(bar.f(), 'f()') 1161dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(bar._h(), '_h()') 1162dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(bar._callmethod('f'), 'f()') 1163dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(bar._callmethod('_h'), '_h()') 1164dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1165dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(list(baz), [i*i for i in range(10)]) 1166dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1167dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson manager.shutdown() 1168dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1169dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# 1170dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# Test of connecting to a remote server and using xmlrpclib for serialization 1171dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# 1172dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1173dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson_queue = Queue.Queue() 1174dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersondef get_queue(): 1175dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson return _queue 1176dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1177dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonclass QueueManager(BaseManager): 1178dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson '''manager class used by server process''' 1179dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin PetersonQueueManager.register('get_queue', callable=get_queue) 1180dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1181dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonclass QueueManager2(BaseManager): 1182dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson '''manager class which specifies the same interface as QueueManager''' 1183dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin PetersonQueueManager2.register('get_queue') 1184dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1185dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1186dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin PetersonSERIALIZER = 'xmlrpclib' 1187dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1188dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonclass _TestRemoteManager(BaseTestCase): 1189dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1190dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson ALLOWED_TYPES = ('manager',) 1191dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1192dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson def _putter(self, address, authkey): 1193dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson manager = QueueManager2( 1194dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson address=address, authkey=authkey, serializer=SERIALIZER 1195dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson ) 1196dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson manager.connect() 1197dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson queue = manager.get_queue() 1198dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson queue.put(('hello world', None, True, 2.25)) 1199dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1200dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson def test_remote(self): 1201dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson authkey = os.urandom(32) 1202dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1203dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson manager = QueueManager( 1204dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson address=('localhost', 0), authkey=authkey, serializer=SERIALIZER 1205dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson ) 1206dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson manager.start() 1207dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1208dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson p = self.Process(target=self._putter, args=(manager.address, authkey)) 1209dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson p.start() 1210dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1211dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson manager2 = QueueManager2( 1212dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson address=manager.address, authkey=authkey, serializer=SERIALIZER 1213dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson ) 1214dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson manager2.connect() 1215dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson queue = manager2.get_queue() 1216dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1217dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson # Note that xmlrpclib will deserialize object as a list not a tuple 1218dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(queue.get(), ['hello world', None, True, 2.25]) 1219dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1220dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson # Because we are using xmlrpclib for serialization instead of 1221dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson # pickle this will cause a serialization error. 1222dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertRaises(Exception, queue.put, time.sleep) 1223dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1224dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson # Make queue finalizer run before the server is stopped 1225dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson del queue 1226dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson manager.shutdown() 1227dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1228459a6481662c62d6cb57a070d21230db3e721c56Jesse Nollerclass _TestManagerRestart(BaseTestCase): 1229459a6481662c62d6cb57a070d21230db3e721c56Jesse Noller 1230459a6481662c62d6cb57a070d21230db3e721c56Jesse Noller def _putter(self, address, authkey): 1231459a6481662c62d6cb57a070d21230db3e721c56Jesse Noller manager = QueueManager( 1232459a6481662c62d6cb57a070d21230db3e721c56Jesse Noller address=address, authkey=authkey, serializer=SERIALIZER) 1233459a6481662c62d6cb57a070d21230db3e721c56Jesse Noller manager.connect() 1234459a6481662c62d6cb57a070d21230db3e721c56Jesse Noller queue = manager.get_queue() 1235459a6481662c62d6cb57a070d21230db3e721c56Jesse Noller queue.put('hello world') 1236459a6481662c62d6cb57a070d21230db3e721c56Jesse Noller 1237459a6481662c62d6cb57a070d21230db3e721c56Jesse Noller def test_rapid_restart(self): 1238459a6481662c62d6cb57a070d21230db3e721c56Jesse Noller authkey = os.urandom(32) 1239c7298ff0fa9a4b667f206733d591966729c87337R. David Murray port = test_support.find_unused_port() 1240459a6481662c62d6cb57a070d21230db3e721c56Jesse Noller manager = QueueManager( 1241c7298ff0fa9a4b667f206733d591966729c87337R. David Murray address=('localhost', port), authkey=authkey, serializer=SERIALIZER) 1242459a6481662c62d6cb57a070d21230db3e721c56Jesse Noller manager.start() 1243459a6481662c62d6cb57a070d21230db3e721c56Jesse Noller 1244459a6481662c62d6cb57a070d21230db3e721c56Jesse Noller p = self.Process(target=self._putter, args=(manager.address, authkey)) 1245459a6481662c62d6cb57a070d21230db3e721c56Jesse Noller p.start() 1246459a6481662c62d6cb57a070d21230db3e721c56Jesse Noller queue = manager.get_queue() 1247459a6481662c62d6cb57a070d21230db3e721c56Jesse Noller self.assertEqual(queue.get(), 'hello world') 1248019ce773cd25ee08d1a822f06958774b43881d00Jesse Noller del queue 1249459a6481662c62d6cb57a070d21230db3e721c56Jesse Noller manager.shutdown() 1250459a6481662c62d6cb57a070d21230db3e721c56Jesse Noller manager = QueueManager( 1251c7298ff0fa9a4b667f206733d591966729c87337R. David Murray address=('localhost', port), authkey=authkey, serializer=SERIALIZER) 1252459a6481662c62d6cb57a070d21230db3e721c56Jesse Noller manager.start() 1253019ce773cd25ee08d1a822f06958774b43881d00Jesse Noller manager.shutdown() 1254459a6481662c62d6cb57a070d21230db3e721c56Jesse Noller 1255dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# 1256dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# 1257dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# 1258dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1259dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin PetersonSENTINEL = latin('') 1260dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1261dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonclass _TestConnection(BaseTestCase): 1262dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1263dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson ALLOWED_TYPES = ('processes', 'threads') 1264dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1265dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson def _echo(self, conn): 1266dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson for msg in iter(conn.recv_bytes, SENTINEL): 1267dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson conn.send_bytes(msg) 1268dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson conn.close() 1269dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1270dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson def test_connection(self): 1271dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson conn, child_conn = self.Pipe() 1272dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1273dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson p = self.Process(target=self._echo, args=(child_conn,)) 12745bc9f4c09c99eb701dbee83fb9e26eed558e474fJesse Noller p.daemon = True 1275dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson p.start() 1276dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1277dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson seq = [1, 2.25, None] 1278dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson msg = latin('hello world') 1279dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson longmsg = msg * 10 1280dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson arr = array.array('i', range(4)) 1281dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1282dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson if self.TYPE == 'processes': 1283dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(type(conn.fileno()), int) 1284dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1285dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(conn.send(seq), None) 1286dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(conn.recv(), seq) 1287dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1288dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(conn.send_bytes(msg), None) 1289dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(conn.recv_bytes(), msg) 1290dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1291dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson if self.TYPE == 'processes': 1292dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson buffer = array.array('i', [0]*10) 1293dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson expected = list(arr) + [0] * (10 - len(arr)) 1294dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(conn.send_bytes(arr), None) 1295dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(conn.recv_bytes_into(buffer), 1296dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson len(arr) * buffer.itemsize) 1297dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(list(buffer), expected) 1298dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1299dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson buffer = array.array('i', [0]*10) 1300dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson expected = [0] * 3 + list(arr) + [0] * (10 - 3 - len(arr)) 1301dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(conn.send_bytes(arr), None) 1302dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(conn.recv_bytes_into(buffer, 3 * buffer.itemsize), 1303dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson len(arr) * buffer.itemsize) 1304dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(list(buffer), expected) 1305dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1306dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson buffer = bytearray(latin(' ' * 40)) 1307dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(conn.send_bytes(longmsg), None) 1308dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson try: 1309dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson res = conn.recv_bytes_into(buffer) 1310dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson except multiprocessing.BufferTooShort, e: 1311dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(e.args, (longmsg,)) 1312dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson else: 1313dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.fail('expected BufferTooShort, got %s' % res) 1314dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1315dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson poll = TimingWrapper(conn.poll) 1316dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1317dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(poll(), False) 1318dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertTimingAlmostEqual(poll.elapsed, 0) 1319dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1320dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(poll(TIMEOUT1), False) 1321dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertTimingAlmostEqual(poll.elapsed, TIMEOUT1) 1322dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1323dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson conn.send(None) 1324dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1325dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(poll(TIMEOUT1), True) 1326dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertTimingAlmostEqual(poll.elapsed, 0) 1327dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1328dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(conn.recv(), None) 1329dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1330dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson really_big_msg = latin('X') * (1024 * 1024 * 16) # 16Mb 1331dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson conn.send_bytes(really_big_msg) 1332dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(conn.recv_bytes(), really_big_msg) 1333dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1334dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson conn.send_bytes(SENTINEL) # tell child to quit 1335dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson child_conn.close() 1336dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1337dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson if self.TYPE == 'processes': 1338dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(conn.readable, True) 1339dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(conn.writable, True) 1340dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertRaises(EOFError, conn.recv) 1341dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertRaises(EOFError, conn.recv_bytes) 1342dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1343dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson p.join() 1344dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1345dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson def test_duplex_false(self): 1346dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson reader, writer = self.Pipe(duplex=False) 1347dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(writer.send(1), None) 1348dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(reader.recv(), 1) 1349dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson if self.TYPE == 'processes': 1350dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(reader.readable, True) 1351dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(reader.writable, False) 1352dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(writer.readable, False) 1353dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(writer.writable, True) 1354dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertRaises(IOError, reader.send, 2) 1355dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertRaises(IOError, writer.recv) 1356dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertRaises(IOError, writer.poll) 1357dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1358dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson def test_spawn_close(self): 1359dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson # We test that a pipe connection can be closed by parent 1360dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson # process immediately after child is spawned. On Windows this 1361dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson # would have sometimes failed on old versions because 1362dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson # child_conn would be closed before the child got a chance to 1363dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson # duplicate it. 1364dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson conn, child_conn = self.Pipe() 1365dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1366dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson p = self.Process(target=self._echo, args=(child_conn,)) 1367dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson p.start() 1368dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson child_conn.close() # this might complete before child initializes 1369dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1370dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson msg = latin('hello') 1371dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson conn.send_bytes(msg) 1372dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(conn.recv_bytes(), msg) 1373dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1374dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson conn.send_bytes(SENTINEL) 1375dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson conn.close() 1376dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson p.join() 1377dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1378dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson def test_sendbytes(self): 1379dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson if self.TYPE != 'processes': 1380dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson return 1381dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1382dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson msg = latin('abcdefghijklmnopqrstuvwxyz') 1383dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson a, b = self.Pipe() 1384dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1385dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson a.send_bytes(msg) 1386dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(b.recv_bytes(), msg) 1387dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1388dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson a.send_bytes(msg, 5) 1389dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(b.recv_bytes(), msg[5:]) 1390dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1391dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson a.send_bytes(msg, 7, 8) 1392dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(b.recv_bytes(), msg[7:7+8]) 1393dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1394dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson a.send_bytes(msg, 26) 1395dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(b.recv_bytes(), latin('')) 1396dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1397dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson a.send_bytes(msg, 26, 0) 1398dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(b.recv_bytes(), latin('')) 1399dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1400dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertRaises(ValueError, a.send_bytes, msg, 27) 1401dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1402dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertRaises(ValueError, a.send_bytes, msg, 22, 5) 1403dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1404dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertRaises(ValueError, a.send_bytes, msg, 26, 1) 1405dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1406dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertRaises(ValueError, a.send_bytes, msg, -1) 1407dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1408dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertRaises(ValueError, a.send_bytes, msg, 4, -1) 1409dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1410dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonclass _TestListenerClient(BaseTestCase): 1411dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1412dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson ALLOWED_TYPES = ('processes', 'threads') 1413dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1414dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson def _test(self, address): 1415dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson conn = self.connection.Client(address) 1416dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson conn.send('hello') 1417dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson conn.close() 1418dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1419dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson def test_listener_client(self): 1420dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson for family in self.connection.families: 1421dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson l = self.connection.Listener(family=family) 1422dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson p = self.Process(target=self._test, args=(l.address,)) 14235bc9f4c09c99eb701dbee83fb9e26eed558e474fJesse Noller p.daemon = True 1424dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson p.start() 1425dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson conn = l.accept() 1426dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(conn.recv(), 'hello') 1427dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson p.join() 1428dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson l.close() 1429dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# 1430dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# Test of sending connection and socket objects between processes 1431dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# 1432da3a1b120055855a464c2d5f5143021ae8f5dc86Benjamin Peterson""" 1433dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonclass _TestPicklingConnections(BaseTestCase): 1434dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1435dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson ALLOWED_TYPES = ('processes',) 1436dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1437dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson def _listener(self, conn, families): 1438dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson for fam in families: 1439dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson l = self.connection.Listener(family=fam) 1440dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson conn.send(l.address) 1441dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson new_conn = l.accept() 1442dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson conn.send(new_conn) 1443dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1444dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson if self.TYPE == 'processes': 1445dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson l = socket.socket() 1446dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson l.bind(('localhost', 0)) 1447dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson conn.send(l.getsockname()) 1448dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson l.listen(1) 1449dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson new_conn, addr = l.accept() 1450dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson conn.send(new_conn) 1451dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1452dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson conn.recv() 1453dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1454dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson def _remote(self, conn): 1455dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson for (address, msg) in iter(conn.recv, None): 1456dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson client = self.connection.Client(address) 1457dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson client.send(msg.upper()) 1458dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson client.close() 1459dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1460dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson if self.TYPE == 'processes': 1461dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson address, msg = conn.recv() 1462dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson client = socket.socket() 1463dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson client.connect(address) 1464dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson client.sendall(msg.upper()) 1465dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson client.close() 1466dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1467dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson conn.close() 1468dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1469dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson def test_pickling(self): 1470dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson try: 1471dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson multiprocessing.allow_connection_pickling() 1472dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson except ImportError: 1473dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson return 1474dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1475dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson families = self.connection.families 1476dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1477dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson lconn, lconn0 = self.Pipe() 1478dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson lp = self.Process(target=self._listener, args=(lconn0, families)) 1479dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson lp.start() 1480dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson lconn0.close() 1481dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1482dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson rconn, rconn0 = self.Pipe() 1483dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson rp = self.Process(target=self._remote, args=(rconn0,)) 1484dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson rp.start() 1485dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson rconn0.close() 1486dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1487dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson for fam in families: 1488dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson msg = ('This connection uses family %s' % fam).encode('ascii') 1489dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson address = lconn.recv() 1490dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson rconn.send((address, msg)) 1491dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson new_conn = lconn.recv() 1492dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(new_conn.recv(), msg.upper()) 1493dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1494dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson rconn.send(None) 1495dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1496dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson if self.TYPE == 'processes': 1497dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson msg = latin('This connection uses a normal socket') 1498dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson address = lconn.recv() 1499dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson rconn.send((address, msg)) 1500dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson if hasattr(socket, 'fromfd'): 1501dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson new_conn = lconn.recv() 1502dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(new_conn.recv(100), msg.upper()) 1503dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson else: 1504dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson # XXX On Windows with Py2.6 need to backport fromfd() 1505dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson discard = lconn.recv_bytes() 1506dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1507dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson lconn.send(None) 1508dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1509dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson rconn.close() 1510dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson lconn.close() 1511dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1512dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson lp.join() 1513dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson rp.join() 1514da3a1b120055855a464c2d5f5143021ae8f5dc86Benjamin Peterson""" 1515dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# 1516dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# 1517dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# 1518dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1519dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonclass _TestHeap(BaseTestCase): 1520dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1521dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson ALLOWED_TYPES = ('processes',) 1522dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1523dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson def test_heap(self): 1524dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson iterations = 5000 1525dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson maxblocks = 50 1526dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson blocks = [] 1527dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1528dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson # create and destroy lots of blocks of different sizes 1529dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson for i in xrange(iterations): 1530dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson size = int(random.lognormvariate(0, 1) * 1000) 1531dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson b = multiprocessing.heap.BufferWrapper(size) 1532dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson blocks.append(b) 1533dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson if len(blocks) > maxblocks: 1534dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson i = random.randrange(maxblocks) 1535dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson del blocks[i] 1536dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1537dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson # get the heap object 1538dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson heap = multiprocessing.heap.BufferWrapper._heap 1539dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1540dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson # verify the state of the heap 1541dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson all = [] 1542dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson occupied = 0 1543dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson for L in heap._len_to_seq.values(): 1544dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson for arena, start, stop in L: 1545dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson all.append((heap._arenas.index(arena), start, stop, 1546dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson stop-start, 'free')) 1547dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson for arena, start, stop in heap._allocated_blocks: 1548dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson all.append((heap._arenas.index(arena), start, stop, 1549dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson stop-start, 'occupied')) 1550dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson occupied += (stop-start) 1551dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1552dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson all.sort() 1553dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1554dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson for i in range(len(all)-1): 1555dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson (arena, start, stop) = all[i][:3] 1556dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson (narena, nstart, nstop) = all[i+1][:3] 1557dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertTrue((arena != narena and nstart == 0) or 1558dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson (stop == nstart)) 1559dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1560dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# 1561dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# 1562dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# 1563dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1564dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersontry: 1565dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson from ctypes import Structure, Value, copy, c_int, c_double 1566dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonexcept ImportError: 1567dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson Structure = object 1568dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson c_int = c_double = None 1569dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1570dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonclass _Foo(Structure): 1571dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson _fields_ = [ 1572dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson ('x', c_int), 1573dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson ('y', c_double) 1574dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson ] 1575dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1576dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonclass _TestSharedCTypes(BaseTestCase): 1577dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1578dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson ALLOWED_TYPES = ('processes',) 1579dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1580dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson def _double(self, x, y, foo, arr, string): 1581dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson x.value *= 2 1582dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson y.value *= 2 1583dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson foo.x *= 2 1584dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson foo.y *= 2 1585dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson string.value *= 2 1586dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson for i in range(len(arr)): 1587dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson arr[i] *= 2 1588dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1589dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson def test_sharedctypes(self, lock=False): 1590dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson if c_int is None: 1591dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson return 1592dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1593dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson x = Value('i', 7, lock=lock) 1594bd564c3c21ef4c6d6cb0070870edd9d2f7c89d11Georg Brandl y = Value(c_double, 1.0/3.0, lock=lock) 1595dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson foo = Value(_Foo, 3, 2, lock=lock) 1596bd564c3c21ef4c6d6cb0070870edd9d2f7c89d11Georg Brandl arr = self.Array('d', range(10), lock=lock) 1597bd564c3c21ef4c6d6cb0070870edd9d2f7c89d11Georg Brandl string = self.Array('c', 20, lock=lock) 1598dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson string.value = 'hello' 1599dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1600dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson p = self.Process(target=self._double, args=(x, y, foo, arr, string)) 1601dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson p.start() 1602dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson p.join() 1603dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1604dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(x.value, 14) 1605dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertAlmostEqual(y.value, 2.0/3.0) 1606dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(foo.x, 6) 1607dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertAlmostEqual(foo.y, 4.0) 1608dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson for i in range(10): 1609dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertAlmostEqual(arr[i], i*2) 1610dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(string.value, latin('hellohello')) 1611dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1612dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson def test_synchronize(self): 1613dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.test_sharedctypes(lock=True) 1614dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1615dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson def test_copy(self): 1616dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson if c_int is None: 1617dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson return 1618dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1619dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson foo = _Foo(2, 5.0) 1620dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson bar = copy(foo) 1621dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson foo.x = 0 1622dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson foo.y = 0 1623dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(bar.x, 2) 1624dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertAlmostEqual(bar.y, 5.0) 1625dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1626dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# 1627dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# 1628dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# 1629dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1630dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonclass _TestFinalize(BaseTestCase): 1631dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1632dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson ALLOWED_TYPES = ('processes',) 1633dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1634dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson def _test_finalize(self, conn): 1635dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson class Foo(object): 1636dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson pass 1637dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1638dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson a = Foo() 1639dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson util.Finalize(a, conn.send, args=('a',)) 1640dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson del a # triggers callback for a 1641dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1642dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson b = Foo() 1643dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson close_b = util.Finalize(b, conn.send, args=('b',)) 1644dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson close_b() # triggers callback for b 1645dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson close_b() # does nothing because callback has already been called 1646dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson del b # does nothing because callback has already been called 1647dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1648dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson c = Foo() 1649dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson util.Finalize(c, conn.send, args=('c',)) 1650dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1651dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson d10 = Foo() 1652dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson util.Finalize(d10, conn.send, args=('d10',), exitpriority=1) 1653dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1654dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson d01 = Foo() 1655dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson util.Finalize(d01, conn.send, args=('d01',), exitpriority=0) 1656dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson d02 = Foo() 1657dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson util.Finalize(d02, conn.send, args=('d02',), exitpriority=0) 1658dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson d03 = Foo() 1659dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson util.Finalize(d03, conn.send, args=('d03',), exitpriority=0) 1660dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1661dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson util.Finalize(None, conn.send, args=('e',), exitpriority=-10) 1662dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1663dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson util.Finalize(None, conn.send, args=('STOP',), exitpriority=-100) 1664dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1665dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson # call mutliprocessing's cleanup function then exit process without 1666dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson # garbage collecting locals 1667dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson util._exit_function() 1668dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson conn.close() 1669dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson os._exit(0) 1670dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1671dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson def test_finalize(self): 1672dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson conn, child_conn = self.Pipe() 1673dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1674dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson p = self.Process(target=self._test_finalize, args=(child_conn,)) 1675dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson p.start() 1676dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson p.join() 1677dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1678dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson result = [obj for obj in iter(conn.recv, 'STOP')] 1679dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(result, ['a', 'b', 'd10', 'd03', 'd02', 'd01', 'e']) 1680dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1681dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# 1682dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# Test that from ... import * works for each module 1683dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# 1684dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1685dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonclass _TestImportStar(BaseTestCase): 1686dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1687dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson ALLOWED_TYPES = ('processes',) 1688dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1689dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson def test_import(self): 1690dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson modules = ( 1691dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 'multiprocessing', 'multiprocessing.connection', 1692dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 'multiprocessing.heap', 'multiprocessing.managers', 1693dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 'multiprocessing.pool', 'multiprocessing.process', 1694dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 'multiprocessing.reduction', 'multiprocessing.sharedctypes', 1695dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 'multiprocessing.synchronize', 'multiprocessing.util' 1696dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson ) 1697dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1698dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson for name in modules: 1699dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson __import__(name) 1700dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson mod = sys.modules[name] 1701dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1702dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson for attr in getattr(mod, '__all__', ()): 1703dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertTrue( 1704dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson hasattr(mod, attr), 1705dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson '%r does not have attribute %r' % (mod, attr) 1706dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson ) 1707dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1708dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# 1709dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# Quick test that logging works -- does not test logging output 1710dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# 1711dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1712dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonclass _TestLogging(BaseTestCase): 1713dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1714dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson ALLOWED_TYPES = ('processes',) 1715dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1716dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson def test_enable_logging(self): 1717dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson logger = multiprocessing.get_logger() 1718dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson logger.setLevel(util.SUBWARNING) 1719dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertTrue(logger is not None) 1720dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson logger.debug('this will not be printed') 1721dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson logger.info('nor will this') 1722dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson logger.setLevel(LOG_LEVEL) 1723dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1724dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson def _test_level(self, conn): 1725dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson logger = multiprocessing.get_logger() 1726dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson conn.send(logger.getEffectiveLevel()) 1727dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1728dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson def test_level(self): 1729dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson LEVEL1 = 32 1730dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson LEVEL2 = 37 1731dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1732dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson logger = multiprocessing.get_logger() 1733dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson root_logger = logging.getLogger() 1734dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson root_level = root_logger.level 1735dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1736dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson reader, writer = multiprocessing.Pipe(duplex=False) 1737dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1738dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson logger.setLevel(LEVEL1) 1739dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.Process(target=self._test_level, args=(writer,)).start() 1740dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(LEVEL1, reader.recv()) 1741dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1742dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson logger.setLevel(logging.NOTSET) 1743dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson root_logger.setLevel(LEVEL2) 1744dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.Process(target=self._test_level, args=(writer,)).start() 1745dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(LEVEL2, reader.recv()) 1746dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1747dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson root_logger.setLevel(root_level) 1748dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson logger.setLevel(level=LOG_LEVEL) 1749dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1750814d02dcd1b30a98f9a34c710be35de6db82aa40Jesse Noller 17519a03f2fd03278d2c12dfe253de1bbed7c0c9c506Jesse Noller# class _TestLoggingProcessName(BaseTestCase): 17529a03f2fd03278d2c12dfe253de1bbed7c0c9c506Jesse Noller# 17539a03f2fd03278d2c12dfe253de1bbed7c0c9c506Jesse Noller# def handle(self, record): 17549a03f2fd03278d2c12dfe253de1bbed7c0c9c506Jesse Noller# assert record.processName == multiprocessing.current_process().name 17559a03f2fd03278d2c12dfe253de1bbed7c0c9c506Jesse Noller# self.__handled = True 17569a03f2fd03278d2c12dfe253de1bbed7c0c9c506Jesse Noller# 17579a03f2fd03278d2c12dfe253de1bbed7c0c9c506Jesse Noller# def test_logging(self): 17589a03f2fd03278d2c12dfe253de1bbed7c0c9c506Jesse Noller# handler = logging.Handler() 17599a03f2fd03278d2c12dfe253de1bbed7c0c9c506Jesse Noller# handler.handle = self.handle 17609a03f2fd03278d2c12dfe253de1bbed7c0c9c506Jesse Noller# self.__handled = False 17619a03f2fd03278d2c12dfe253de1bbed7c0c9c506Jesse Noller# # Bypass getLogger() and side-effects 17629a03f2fd03278d2c12dfe253de1bbed7c0c9c506Jesse Noller# logger = logging.getLoggerClass()( 17639a03f2fd03278d2c12dfe253de1bbed7c0c9c506Jesse Noller# 'multiprocessing.test.TestLoggingProcessName') 17649a03f2fd03278d2c12dfe253de1bbed7c0c9c506Jesse Noller# logger.addHandler(handler) 17659a03f2fd03278d2c12dfe253de1bbed7c0c9c506Jesse Noller# logger.propagate = False 17669a03f2fd03278d2c12dfe253de1bbed7c0c9c506Jesse Noller# 17679a03f2fd03278d2c12dfe253de1bbed7c0c9c506Jesse Noller# logger.warn('foo') 17689a03f2fd03278d2c12dfe253de1bbed7c0c9c506Jesse Noller# assert self.__handled 1769814d02dcd1b30a98f9a34c710be35de6db82aa40Jesse Noller 1770dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# 17719a5b2ad38d605206f05a52fe32868d3f839e8a86Jesse Noller# Test to verify handle verification, see issue 3321 17729a5b2ad38d605206f05a52fe32868d3f839e8a86Jesse Noller# 17739a5b2ad38d605206f05a52fe32868d3f839e8a86Jesse Noller 17749a5b2ad38d605206f05a52fe32868d3f839e8a86Jesse Nollerclass TestInvalidHandle(unittest.TestCase): 17759a5b2ad38d605206f05a52fe32868d3f839e8a86Jesse Noller 17769a5b2ad38d605206f05a52fe32868d3f839e8a86Jesse Noller def test_invalid_handles(self): 17779a5b2ad38d605206f05a52fe32868d3f839e8a86Jesse Noller if WIN32: 17789a5b2ad38d605206f05a52fe32868d3f839e8a86Jesse Noller return 17799a5b2ad38d605206f05a52fe32868d3f839e8a86Jesse Noller conn = _multiprocessing.Connection(44977608) 17809a5b2ad38d605206f05a52fe32868d3f839e8a86Jesse Noller self.assertRaises(IOError, conn.poll) 17819a5b2ad38d605206f05a52fe32868d3f839e8a86Jesse Noller self.assertRaises(IOError, _multiprocessing.Connection, -1) 17829a5b2ad38d605206f05a52fe32868d3f839e8a86Jesse Noller# 1783dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# Functions used to create test cases from the base ones in this module 1784dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# 1785dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1786dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersondef get_attributes(Source, names): 1787dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson d = {} 1788dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson for name in names: 1789dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson obj = getattr(Source, name) 1790dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson if type(obj) == type(get_attributes): 1791dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson obj = staticmethod(obj) 1792dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson d[name] = obj 1793dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson return d 1794dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1795dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersondef create_test_cases(Mixin, type): 1796dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson result = {} 1797dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson glob = globals() 1798dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson Type = type[0].upper() + type[1:] 1799dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1800dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson for name in glob.keys(): 1801dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson if name.startswith('_Test'): 1802dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson base = glob[name] 1803dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson if type in base.ALLOWED_TYPES: 1804dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson newname = 'With' + Type + name[1:] 1805dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson class Temp(base, unittest.TestCase, Mixin): 1806dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson pass 1807dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson result[newname] = Temp 1808dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson Temp.__name__ = newname 1809dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson Temp.__module__ = Mixin.__module__ 1810dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson return result 1811dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1812dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# 1813dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# Create test cases 1814dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# 1815dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1816dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonclass ProcessesMixin(object): 1817dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson TYPE = 'processes' 1818dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson Process = multiprocessing.Process 1819dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson locals().update(get_attributes(multiprocessing, ( 1820dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 'Queue', 'Lock', 'RLock', 'Semaphore', 'BoundedSemaphore', 1821dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 'Condition', 'Event', 'Value', 'Array', 'RawValue', 1822dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 'RawArray', 'current_process', 'active_children', 'Pipe', 1823dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 'connection', 'JoinableQueue' 1824dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson ))) 1825dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1826dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersontestcases_processes = create_test_cases(ProcessesMixin, type='processes') 1827dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonglobals().update(testcases_processes) 1828dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1829dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1830dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonclass ManagerMixin(object): 1831dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson TYPE = 'manager' 1832dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson Process = multiprocessing.Process 1833dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson manager = object.__new__(multiprocessing.managers.SyncManager) 1834dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson locals().update(get_attributes(manager, ( 1835dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 'Queue', 'Lock', 'RLock', 'Semaphore', 'BoundedSemaphore', 1836dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 'Condition', 'Event', 'Value', 'Array', 'list', 'dict', 1837dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 'Namespace', 'JoinableQueue' 1838dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson ))) 1839dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1840dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersontestcases_manager = create_test_cases(ManagerMixin, type='manager') 1841dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonglobals().update(testcases_manager) 1842dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1843dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1844dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonclass ThreadsMixin(object): 1845dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson TYPE = 'threads' 1846dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson Process = multiprocessing.dummy.Process 1847dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson locals().update(get_attributes(multiprocessing.dummy, ( 1848dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 'Queue', 'Lock', 'RLock', 'Semaphore', 'BoundedSemaphore', 1849dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 'Condition', 'Event', 'Value', 'Array', 'current_process', 1850dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 'active_children', 'Pipe', 'connection', 'dict', 'list', 1851dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 'Namespace', 'JoinableQueue' 1852dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson ))) 1853dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1854dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersontestcases_threads = create_test_cases(ThreadsMixin, type='threads') 1855dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonglobals().update(testcases_threads) 1856dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 18570c519b3a5e847eea0dffb51ac8df7c68891daf70Neal Norwitzclass OtherTest(unittest.TestCase): 18580c519b3a5e847eea0dffb51ac8df7c68891daf70Neal Norwitz # TODO: add more tests for deliver/answer challenge. 18590c519b3a5e847eea0dffb51ac8df7c68891daf70Neal Norwitz def test_deliver_challenge_auth_failure(self): 18600c519b3a5e847eea0dffb51ac8df7c68891daf70Neal Norwitz class _FakeConnection(object): 18610c519b3a5e847eea0dffb51ac8df7c68891daf70Neal Norwitz def recv_bytes(self, size): 18622a7767a17311cada06240a187c8896bdbcc1a4d0Neal Norwitz return b'something bogus' 18630c519b3a5e847eea0dffb51ac8df7c68891daf70Neal Norwitz def send_bytes(self, data): 18640c519b3a5e847eea0dffb51ac8df7c68891daf70Neal Norwitz pass 18650c519b3a5e847eea0dffb51ac8df7c68891daf70Neal Norwitz self.assertRaises(multiprocessing.AuthenticationError, 18660c519b3a5e847eea0dffb51ac8df7c68891daf70Neal Norwitz multiprocessing.connection.deliver_challenge, 18670c519b3a5e847eea0dffb51ac8df7c68891daf70Neal Norwitz _FakeConnection(), b'abc') 18680c519b3a5e847eea0dffb51ac8df7c68891daf70Neal Norwitz 18690c519b3a5e847eea0dffb51ac8df7c68891daf70Neal Norwitz def test_answer_challenge_auth_failure(self): 18700c519b3a5e847eea0dffb51ac8df7c68891daf70Neal Norwitz class _FakeConnection(object): 18710c519b3a5e847eea0dffb51ac8df7c68891daf70Neal Norwitz def __init__(self): 18720c519b3a5e847eea0dffb51ac8df7c68891daf70Neal Norwitz self.count = 0 18730c519b3a5e847eea0dffb51ac8df7c68891daf70Neal Norwitz def recv_bytes(self, size): 18740c519b3a5e847eea0dffb51ac8df7c68891daf70Neal Norwitz self.count += 1 18750c519b3a5e847eea0dffb51ac8df7c68891daf70Neal Norwitz if self.count == 1: 18760c519b3a5e847eea0dffb51ac8df7c68891daf70Neal Norwitz return multiprocessing.connection.CHALLENGE 18770c519b3a5e847eea0dffb51ac8df7c68891daf70Neal Norwitz elif self.count == 2: 18782a7767a17311cada06240a187c8896bdbcc1a4d0Neal Norwitz return b'something bogus' 18792a7767a17311cada06240a187c8896bdbcc1a4d0Neal Norwitz return b'' 18800c519b3a5e847eea0dffb51ac8df7c68891daf70Neal Norwitz def send_bytes(self, data): 18810c519b3a5e847eea0dffb51ac8df7c68891daf70Neal Norwitz pass 18820c519b3a5e847eea0dffb51ac8df7c68891daf70Neal Norwitz self.assertRaises(multiprocessing.AuthenticationError, 18830c519b3a5e847eea0dffb51ac8df7c68891daf70Neal Norwitz multiprocessing.connection.answer_challenge, 18840c519b3a5e847eea0dffb51ac8df7c68891daf70Neal Norwitz _FakeConnection(), b'abc') 18850c519b3a5e847eea0dffb51ac8df7c68891daf70Neal Norwitz 18867152f6d9156a19a9f1b31e313d2c19d840dc089dJesse Noller# 18877152f6d9156a19a9f1b31e313d2c19d840dc089dJesse Noller# Test Manager.start()/Pool.__init__() initializer feature - see issue 5585 18887152f6d9156a19a9f1b31e313d2c19d840dc089dJesse Noller# 18897152f6d9156a19a9f1b31e313d2c19d840dc089dJesse Noller 18907152f6d9156a19a9f1b31e313d2c19d840dc089dJesse Nollerdef initializer(ns): 18917152f6d9156a19a9f1b31e313d2c19d840dc089dJesse Noller ns.test += 1 18927152f6d9156a19a9f1b31e313d2c19d840dc089dJesse Noller 18937152f6d9156a19a9f1b31e313d2c19d840dc089dJesse Nollerclass TestInitializers(unittest.TestCase): 18947152f6d9156a19a9f1b31e313d2c19d840dc089dJesse Noller def setUp(self): 18957152f6d9156a19a9f1b31e313d2c19d840dc089dJesse Noller self.mgr = multiprocessing.Manager() 18967152f6d9156a19a9f1b31e313d2c19d840dc089dJesse Noller self.ns = self.mgr.Namespace() 18977152f6d9156a19a9f1b31e313d2c19d840dc089dJesse Noller self.ns.test = 0 18987152f6d9156a19a9f1b31e313d2c19d840dc089dJesse Noller 18997152f6d9156a19a9f1b31e313d2c19d840dc089dJesse Noller def tearDown(self): 19007152f6d9156a19a9f1b31e313d2c19d840dc089dJesse Noller self.mgr.shutdown() 19017152f6d9156a19a9f1b31e313d2c19d840dc089dJesse Noller 19027152f6d9156a19a9f1b31e313d2c19d840dc089dJesse Noller def test_manager_initializer(self): 19037152f6d9156a19a9f1b31e313d2c19d840dc089dJesse Noller m = multiprocessing.managers.SyncManager() 19047152f6d9156a19a9f1b31e313d2c19d840dc089dJesse Noller self.assertRaises(TypeError, m.start, 1) 19057152f6d9156a19a9f1b31e313d2c19d840dc089dJesse Noller m.start(initializer, (self.ns,)) 19067152f6d9156a19a9f1b31e313d2c19d840dc089dJesse Noller self.assertEqual(self.ns.test, 1) 19077152f6d9156a19a9f1b31e313d2c19d840dc089dJesse Noller m.shutdown() 19087152f6d9156a19a9f1b31e313d2c19d840dc089dJesse Noller 19097152f6d9156a19a9f1b31e313d2c19d840dc089dJesse Noller def test_pool_initializer(self): 19107152f6d9156a19a9f1b31e313d2c19d840dc089dJesse Noller self.assertRaises(TypeError, multiprocessing.Pool, initializer=1) 19117152f6d9156a19a9f1b31e313d2c19d840dc089dJesse Noller p = multiprocessing.Pool(1, initializer, (self.ns,)) 19127152f6d9156a19a9f1b31e313d2c19d840dc089dJesse Noller p.close() 19137152f6d9156a19a9f1b31e313d2c19d840dc089dJesse Noller p.join() 19147152f6d9156a19a9f1b31e313d2c19d840dc089dJesse Noller self.assertEqual(self.ns.test, 1) 19157152f6d9156a19a9f1b31e313d2c19d840dc089dJesse Noller 19161b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller# 19171b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller# Issue 5155, 5313, 5331: Test process in processes 19181b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller# Verifies os.close(sys.stdin.fileno) vs. sys.stdin.close() behavior 19191b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller# 19201b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller 19211b90efbdc5bb204fe50aea87374603dcba309227Jesse Nollerdef _ThisSubProcess(q): 19221b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller try: 19231b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller item = q.get(block=False) 19241b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller except Queue.Empty: 19251b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller pass 19261b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller 19271b90efbdc5bb204fe50aea87374603dcba309227Jesse Nollerdef _TestProcess(q): 19281b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller queue = multiprocessing.Queue() 19291b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller subProc = multiprocessing.Process(target=_ThisSubProcess, args=(queue,)) 19301b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller subProc.start() 19311b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller subProc.join() 19321b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller 19331b90efbdc5bb204fe50aea87374603dcba309227Jesse Nollerdef _afunc(x): 19341b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller return x*x 19351b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller 19361b90efbdc5bb204fe50aea87374603dcba309227Jesse Nollerdef pool_in_process(): 19371b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller pool = multiprocessing.Pool(processes=4) 19381b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller x = pool.map(_afunc, [1, 2, 3, 4, 5, 6, 7]) 19391b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller 19401b90efbdc5bb204fe50aea87374603dcba309227Jesse Nollerclass _file_like(object): 19411b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller def __init__(self, delegate): 19421b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller self._delegate = delegate 19431b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller self._pid = None 19441b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller 19451b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller @property 19461b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller def cache(self): 19471b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller pid = os.getpid() 19481b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller # There are no race conditions since fork keeps only the running thread 19491b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller if pid != self._pid: 19501b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller self._pid = pid 19511b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller self._cache = [] 19521b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller return self._cache 19531b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller 19541b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller def write(self, data): 19551b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller self.cache.append(data) 19561b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller 19571b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller def flush(self): 19581b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller self._delegate.write(''.join(self.cache)) 19591b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller self._cache = [] 19601b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller 19611b90efbdc5bb204fe50aea87374603dcba309227Jesse Nollerclass TestStdinBadfiledescriptor(unittest.TestCase): 19621b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller 19631b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller def test_queue_in_process(self): 19641b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller queue = multiprocessing.Queue() 19651b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller proc = multiprocessing.Process(target=_TestProcess, args=(queue,)) 19661b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller proc.start() 19671b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller proc.join() 19681b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller 19691b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller def test_pool_in_process(self): 19701b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller p = multiprocessing.Process(target=pool_in_process) 19711b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller p.start() 19721b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller p.join() 19731b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller 19741b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller def test_flushing(self): 19751b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller sio = StringIO() 19761b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller flike = _file_like(sio) 19771b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller flike.write('foo') 19781b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller proc = multiprocessing.Process(target=lambda: flike.flush()) 19791b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller flike.flush() 19801b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller assert sio.getvalue() == 'foo' 19811b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller 19821b90efbdc5bb204fe50aea87374603dcba309227Jesse Nollertestcases_other = [OtherTest, TestInvalidHandle, TestInitializers, 19831b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller TestStdinBadfiledescriptor] 19840c519b3a5e847eea0dffb51ac8df7c68891daf70Neal Norwitz 1985dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# 1986dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# 1987dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# 1988dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1989dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersondef test_main(run=None): 199018623825d25b0f8f3b4bf96c1d5c4c2977a94004Jesse Noller if sys.platform.startswith("linux"): 199118623825d25b0f8f3b4bf96c1d5c4c2977a94004Jesse Noller try: 199218623825d25b0f8f3b4bf96c1d5c4c2977a94004Jesse Noller lock = multiprocessing.RLock() 199318623825d25b0f8f3b4bf96c1d5c4c2977a94004Jesse Noller except OSError: 1994bec087f29d7dca0aaf8f51be7d7c135e9b84e7f1Benjamin Peterson raise unittest.SkipTest("OSError raises on RLock creation, see issue 3111!") 1995ed77f2e143102df58212ff1f64a87f7e0c237439Benjamin Peterson 1996dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson if run is None: 1997dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson from test.test_support import run_unittest as run 1998dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1999dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson util.get_temp_dir() # creates temp directory for use by all processes 2000dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 2001dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson multiprocessing.get_logger().setLevel(LOG_LEVEL) 2002dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 2003146b7ab818cadccf91ad98e64cfefb77705da0caJesse Noller ProcessesMixin.pool = multiprocessing.Pool(4) 2004146b7ab818cadccf91ad98e64cfefb77705da0caJesse Noller ThreadsMixin.pool = multiprocessing.dummy.Pool(4) 2005146b7ab818cadccf91ad98e64cfefb77705da0caJesse Noller ManagerMixin.manager.__init__() 2006146b7ab818cadccf91ad98e64cfefb77705da0caJesse Noller ManagerMixin.manager.start() 2007146b7ab818cadccf91ad98e64cfefb77705da0caJesse Noller ManagerMixin.pool = ManagerMixin.manager.Pool(4) 2008dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 2009dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson testcases = ( 2010146b7ab818cadccf91ad98e64cfefb77705da0caJesse Noller sorted(testcases_processes.values(), key=lambda tc:tc.__name__) + 2011146b7ab818cadccf91ad98e64cfefb77705da0caJesse Noller sorted(testcases_threads.values(), key=lambda tc:tc.__name__) + 20120c519b3a5e847eea0dffb51ac8df7c68891daf70Neal Norwitz sorted(testcases_manager.values(), key=lambda tc:tc.__name__) + 20130c519b3a5e847eea0dffb51ac8df7c68891daf70Neal Norwitz testcases_other 2014dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson ) 2015dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 2016dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson loadTestsFromTestCase = unittest.defaultTestLoader.loadTestsFromTestCase 2017dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson suite = unittest.TestSuite(loadTestsFromTestCase(tc) for tc in testcases) 2018ce8e33a095030e7af94f58f9da196b240bdf0476Senthil Kumaran run(suite) 2019dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 2020146b7ab818cadccf91ad98e64cfefb77705da0caJesse Noller ThreadsMixin.pool.terminate() 2021146b7ab818cadccf91ad98e64cfefb77705da0caJesse Noller ProcessesMixin.pool.terminate() 2022146b7ab818cadccf91ad98e64cfefb77705da0caJesse Noller ManagerMixin.pool.terminate() 2023146b7ab818cadccf91ad98e64cfefb77705da0caJesse Noller ManagerMixin.manager.shutdown() 2024dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 2025146b7ab818cadccf91ad98e64cfefb77705da0caJesse Noller del ProcessesMixin.pool, ThreadsMixin.pool, ManagerMixin.pool 2026dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 2027dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersondef main(): 2028dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson test_main(unittest.TextTestRunner(verbosity=2).run) 2029dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 2030dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonif __name__ == '__main__': 2031dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson main() 2032