test_multiprocessing.py revision aa98058cc44ba20f35c106d20918c6196b737561
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 48dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson#LOG_LEVEL = logging.WARNING 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) 135dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertTrue(isinstance(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) 1055dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# 1056dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# Test that manager has expected number of shared objects left 1057dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# 1058dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1059dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonclass _TestZZZNumberOfObjects(BaseTestCase): 1060dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson # Because test cases are sorted alphabetically, this one will get 1061dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson # run after all the other tests for the manager. It tests that 1062dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson # there have been no "reference leaks" for the manager's shared 1063dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson # objects. Note the comment in _TestPool.test_terminate(). 1064dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson ALLOWED_TYPES = ('manager',) 1065dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1066dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson def test_number_of_objects(self): 1067dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson EXPECTED_NUMBER = 1 # the pool object is still alive 1068dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson multiprocessing.active_children() # discard dead process objs 1069dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson gc.collect() # do garbage collection 1070dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson refs = self.manager._number_of_objects() 10717314b38168da53863136d1937059fc0ac4883a56Jesse Noller debug_info = self.manager._debug_info() 1072dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson if refs != EXPECTED_NUMBER: 10737fb9640d57f5d96dcaa0d0e6497abc21fa85f37eJesse Noller print self.manager._debug_info() 10747314b38168da53863136d1937059fc0ac4883a56Jesse Noller print debug_info 1075dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1076dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(refs, EXPECTED_NUMBER) 1077dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1078dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# 1079dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# Test of creating a customized manager class 1080dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# 1081dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1082dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonfrom multiprocessing.managers import BaseManager, BaseProxy, RemoteError 1083dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1084dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonclass FooBar(object): 1085dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson def f(self): 1086dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson return 'f()' 1087dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson def g(self): 1088dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson raise ValueError 1089dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson def _h(self): 1090dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson return '_h()' 1091dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1092dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersondef baz(): 1093dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson for i in xrange(10): 1094dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson yield i*i 1095dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1096dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonclass IteratorProxy(BaseProxy): 1097dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson _exposed_ = ('next', '__next__') 1098dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson def __iter__(self): 1099dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson return self 1100dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson def next(self): 1101dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson return self._callmethod('next') 1102dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson def __next__(self): 1103dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson return self._callmethod('__next__') 1104dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1105dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonclass MyManager(BaseManager): 1106dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson pass 1107dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1108dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin PetersonMyManager.register('Foo', callable=FooBar) 1109dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin PetersonMyManager.register('Bar', callable=FooBar, exposed=('f', '_h')) 1110dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin PetersonMyManager.register('baz', callable=baz, proxytype=IteratorProxy) 1111dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1112dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1113dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonclass _TestMyManager(BaseTestCase): 1114dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1115dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson ALLOWED_TYPES = ('manager',) 1116dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1117dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson def test_mymanager(self): 1118dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson manager = MyManager() 1119dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson manager.start() 1120dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1121dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson foo = manager.Foo() 1122dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson bar = manager.Bar() 1123dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson baz = manager.baz() 1124dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1125dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson foo_methods = [name for name in ('f', 'g', '_h') if hasattr(foo, name)] 1126dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson bar_methods = [name for name in ('f', 'g', '_h') if hasattr(bar, name)] 1127dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1128dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(foo_methods, ['f', 'g']) 1129dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(bar_methods, ['f', '_h']) 1130dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1131dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(foo.f(), 'f()') 1132dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertRaises(ValueError, foo.g) 1133dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(foo._callmethod('f'), 'f()') 1134dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertRaises(RemoteError, foo._callmethod, '_h') 1135dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1136dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(bar.f(), 'f()') 1137dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(bar._h(), '_h()') 1138dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(bar._callmethod('f'), 'f()') 1139dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(bar._callmethod('_h'), '_h()') 1140dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1141dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(list(baz), [i*i for i in range(10)]) 1142dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1143dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson manager.shutdown() 1144dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1145dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# 1146dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# Test of connecting to a remote server and using xmlrpclib for serialization 1147dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# 1148dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1149dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson_queue = Queue.Queue() 1150dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersondef get_queue(): 1151dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson return _queue 1152dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1153dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonclass QueueManager(BaseManager): 1154dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson '''manager class used by server process''' 1155dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin PetersonQueueManager.register('get_queue', callable=get_queue) 1156dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1157dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonclass QueueManager2(BaseManager): 1158dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson '''manager class which specifies the same interface as QueueManager''' 1159dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin PetersonQueueManager2.register('get_queue') 1160dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1161dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1162dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin PetersonSERIALIZER = 'xmlrpclib' 1163dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1164dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonclass _TestRemoteManager(BaseTestCase): 1165dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1166dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson ALLOWED_TYPES = ('manager',) 1167dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1168dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson def _putter(self, address, authkey): 1169dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson manager = QueueManager2( 1170dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson address=address, authkey=authkey, serializer=SERIALIZER 1171dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson ) 1172dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson manager.connect() 1173dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson queue = manager.get_queue() 1174dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson queue.put(('hello world', None, True, 2.25)) 1175dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1176dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson def test_remote(self): 1177dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson authkey = os.urandom(32) 1178dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1179dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson manager = QueueManager( 1180dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson address=('localhost', 0), authkey=authkey, serializer=SERIALIZER 1181dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson ) 1182dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson manager.start() 1183dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1184dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson p = self.Process(target=self._putter, args=(manager.address, authkey)) 1185dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson p.start() 1186dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1187dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson manager2 = QueueManager2( 1188dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson address=manager.address, authkey=authkey, serializer=SERIALIZER 1189dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson ) 1190dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson manager2.connect() 1191dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson queue = manager2.get_queue() 1192dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1193dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson # Note that xmlrpclib will deserialize object as a list not a tuple 1194dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(queue.get(), ['hello world', None, True, 2.25]) 1195dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1196dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson # Because we are using xmlrpclib for serialization instead of 1197dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson # pickle this will cause a serialization error. 1198dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertRaises(Exception, queue.put, time.sleep) 1199dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1200dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson # Make queue finalizer run before the server is stopped 1201dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson del queue 1202dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson manager.shutdown() 1203dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1204459a6481662c62d6cb57a070d21230db3e721c56Jesse Nollerclass _TestManagerRestart(BaseTestCase): 1205459a6481662c62d6cb57a070d21230db3e721c56Jesse Noller 1206459a6481662c62d6cb57a070d21230db3e721c56Jesse Noller def _putter(self, address, authkey): 1207459a6481662c62d6cb57a070d21230db3e721c56Jesse Noller manager = QueueManager( 1208459a6481662c62d6cb57a070d21230db3e721c56Jesse Noller address=address, authkey=authkey, serializer=SERIALIZER) 1209459a6481662c62d6cb57a070d21230db3e721c56Jesse Noller manager.connect() 1210459a6481662c62d6cb57a070d21230db3e721c56Jesse Noller queue = manager.get_queue() 1211459a6481662c62d6cb57a070d21230db3e721c56Jesse Noller queue.put('hello world') 1212459a6481662c62d6cb57a070d21230db3e721c56Jesse Noller 1213459a6481662c62d6cb57a070d21230db3e721c56Jesse Noller def test_rapid_restart(self): 1214459a6481662c62d6cb57a070d21230db3e721c56Jesse Noller authkey = os.urandom(32) 1215c7298ff0fa9a4b667f206733d591966729c87337R. David Murray port = test_support.find_unused_port() 1216459a6481662c62d6cb57a070d21230db3e721c56Jesse Noller manager = QueueManager( 1217c7298ff0fa9a4b667f206733d591966729c87337R. David Murray address=('localhost', port), authkey=authkey, serializer=SERIALIZER) 1218459a6481662c62d6cb57a070d21230db3e721c56Jesse Noller manager.start() 1219459a6481662c62d6cb57a070d21230db3e721c56Jesse Noller 1220459a6481662c62d6cb57a070d21230db3e721c56Jesse Noller p = self.Process(target=self._putter, args=(manager.address, authkey)) 1221459a6481662c62d6cb57a070d21230db3e721c56Jesse Noller p.start() 1222459a6481662c62d6cb57a070d21230db3e721c56Jesse Noller queue = manager.get_queue() 1223459a6481662c62d6cb57a070d21230db3e721c56Jesse Noller self.assertEqual(queue.get(), 'hello world') 1224019ce773cd25ee08d1a822f06958774b43881d00Jesse Noller del queue 1225459a6481662c62d6cb57a070d21230db3e721c56Jesse Noller manager.shutdown() 1226459a6481662c62d6cb57a070d21230db3e721c56Jesse Noller manager = QueueManager( 1227c7298ff0fa9a4b667f206733d591966729c87337R. David Murray address=('localhost', port), authkey=authkey, serializer=SERIALIZER) 1228459a6481662c62d6cb57a070d21230db3e721c56Jesse Noller manager.start() 1229019ce773cd25ee08d1a822f06958774b43881d00Jesse Noller manager.shutdown() 1230459a6481662c62d6cb57a070d21230db3e721c56Jesse Noller 1231dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# 1232dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# 1233dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# 1234dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1235dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin PetersonSENTINEL = latin('') 1236dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1237dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonclass _TestConnection(BaseTestCase): 1238dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1239dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson ALLOWED_TYPES = ('processes', 'threads') 1240dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1241dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson def _echo(self, conn): 1242dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson for msg in iter(conn.recv_bytes, SENTINEL): 1243dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson conn.send_bytes(msg) 1244dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson conn.close() 1245dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1246dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson def test_connection(self): 1247dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson conn, child_conn = self.Pipe() 1248dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1249dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson p = self.Process(target=self._echo, args=(child_conn,)) 12505bc9f4c09c99eb701dbee83fb9e26eed558e474fJesse Noller p.daemon = True 1251dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson p.start() 1252dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1253dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson seq = [1, 2.25, None] 1254dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson msg = latin('hello world') 1255dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson longmsg = msg * 10 1256dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson arr = array.array('i', range(4)) 1257dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1258dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson if self.TYPE == 'processes': 1259dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(type(conn.fileno()), int) 1260dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1261dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(conn.send(seq), None) 1262dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(conn.recv(), seq) 1263dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1264dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(conn.send_bytes(msg), None) 1265dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(conn.recv_bytes(), msg) 1266dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1267dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson if self.TYPE == 'processes': 1268dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson buffer = array.array('i', [0]*10) 1269dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson expected = list(arr) + [0] * (10 - len(arr)) 1270dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(conn.send_bytes(arr), None) 1271dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(conn.recv_bytes_into(buffer), 1272dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson len(arr) * buffer.itemsize) 1273dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(list(buffer), expected) 1274dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1275dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson buffer = array.array('i', [0]*10) 1276dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson expected = [0] * 3 + list(arr) + [0] * (10 - 3 - len(arr)) 1277dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(conn.send_bytes(arr), None) 1278dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(conn.recv_bytes_into(buffer, 3 * buffer.itemsize), 1279dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson len(arr) * buffer.itemsize) 1280dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(list(buffer), expected) 1281dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1282dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson buffer = bytearray(latin(' ' * 40)) 1283dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(conn.send_bytes(longmsg), None) 1284dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson try: 1285dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson res = conn.recv_bytes_into(buffer) 1286dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson except multiprocessing.BufferTooShort, e: 1287dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(e.args, (longmsg,)) 1288dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson else: 1289dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.fail('expected BufferTooShort, got %s' % res) 1290dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1291dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson poll = TimingWrapper(conn.poll) 1292dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1293dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(poll(), False) 1294dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertTimingAlmostEqual(poll.elapsed, 0) 1295dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1296dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(poll(TIMEOUT1), False) 1297dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertTimingAlmostEqual(poll.elapsed, TIMEOUT1) 1298dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1299dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson conn.send(None) 1300dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1301dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(poll(TIMEOUT1), True) 1302dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertTimingAlmostEqual(poll.elapsed, 0) 1303dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1304dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(conn.recv(), None) 1305dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1306dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson really_big_msg = latin('X') * (1024 * 1024 * 16) # 16Mb 1307dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson conn.send_bytes(really_big_msg) 1308dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(conn.recv_bytes(), really_big_msg) 1309dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1310dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson conn.send_bytes(SENTINEL) # tell child to quit 1311dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson child_conn.close() 1312dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1313dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson if self.TYPE == 'processes': 1314dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(conn.readable, True) 1315dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(conn.writable, True) 1316dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertRaises(EOFError, conn.recv) 1317dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertRaises(EOFError, conn.recv_bytes) 1318dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1319dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson p.join() 1320dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1321dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson def test_duplex_false(self): 1322dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson reader, writer = self.Pipe(duplex=False) 1323dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(writer.send(1), None) 1324dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(reader.recv(), 1) 1325dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson if self.TYPE == 'processes': 1326dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(reader.readable, True) 1327dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(reader.writable, False) 1328dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(writer.readable, False) 1329dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(writer.writable, True) 1330dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertRaises(IOError, reader.send, 2) 1331dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertRaises(IOError, writer.recv) 1332dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertRaises(IOError, writer.poll) 1333dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1334dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson def test_spawn_close(self): 1335dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson # We test that a pipe connection can be closed by parent 1336dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson # process immediately after child is spawned. On Windows this 1337dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson # would have sometimes failed on old versions because 1338dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson # child_conn would be closed before the child got a chance to 1339dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson # duplicate it. 1340dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson conn, child_conn = self.Pipe() 1341dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1342dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson p = self.Process(target=self._echo, args=(child_conn,)) 1343dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson p.start() 1344dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson child_conn.close() # this might complete before child initializes 1345dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1346dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson msg = latin('hello') 1347dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson conn.send_bytes(msg) 1348dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(conn.recv_bytes(), msg) 1349dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1350dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson conn.send_bytes(SENTINEL) 1351dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson conn.close() 1352dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson p.join() 1353dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1354dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson def test_sendbytes(self): 1355dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson if self.TYPE != 'processes': 1356dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson return 1357dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1358dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson msg = latin('abcdefghijklmnopqrstuvwxyz') 1359dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson a, b = self.Pipe() 1360dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1361dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson a.send_bytes(msg) 1362dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(b.recv_bytes(), msg) 1363dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1364dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson a.send_bytes(msg, 5) 1365dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(b.recv_bytes(), msg[5:]) 1366dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1367dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson a.send_bytes(msg, 7, 8) 1368dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(b.recv_bytes(), msg[7:7+8]) 1369dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1370dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson a.send_bytes(msg, 26) 1371dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(b.recv_bytes(), latin('')) 1372dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1373dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson a.send_bytes(msg, 26, 0) 1374dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(b.recv_bytes(), latin('')) 1375dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1376dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertRaises(ValueError, a.send_bytes, msg, 27) 1377dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1378dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertRaises(ValueError, a.send_bytes, msg, 22, 5) 1379dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1380dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertRaises(ValueError, a.send_bytes, msg, 26, 1) 1381dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1382dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertRaises(ValueError, a.send_bytes, msg, -1) 1383dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1384dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertRaises(ValueError, a.send_bytes, msg, 4, -1) 1385dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1386dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonclass _TestListenerClient(BaseTestCase): 1387dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1388dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson ALLOWED_TYPES = ('processes', 'threads') 1389dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1390dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson def _test(self, address): 1391dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson conn = self.connection.Client(address) 1392dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson conn.send('hello') 1393dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson conn.close() 1394dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1395dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson def test_listener_client(self): 1396dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson for family in self.connection.families: 1397dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson l = self.connection.Listener(family=family) 1398dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson p = self.Process(target=self._test, args=(l.address,)) 13995bc9f4c09c99eb701dbee83fb9e26eed558e474fJesse Noller p.daemon = True 1400dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson p.start() 1401dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson conn = l.accept() 1402dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(conn.recv(), 'hello') 1403dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson p.join() 1404dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson l.close() 1405dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# 1406dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# Test of sending connection and socket objects between processes 1407dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# 1408da3a1b120055855a464c2d5f5143021ae8f5dc86Benjamin Peterson""" 1409dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonclass _TestPicklingConnections(BaseTestCase): 1410dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1411dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson ALLOWED_TYPES = ('processes',) 1412dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1413dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson def _listener(self, conn, families): 1414dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson for fam in families: 1415dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson l = self.connection.Listener(family=fam) 1416dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson conn.send(l.address) 1417dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson new_conn = l.accept() 1418dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson conn.send(new_conn) 1419dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1420dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson if self.TYPE == 'processes': 1421dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson l = socket.socket() 1422dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson l.bind(('localhost', 0)) 1423dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson conn.send(l.getsockname()) 1424dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson l.listen(1) 1425dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson new_conn, addr = l.accept() 1426dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson conn.send(new_conn) 1427dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1428dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson conn.recv() 1429dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1430dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson def _remote(self, conn): 1431dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson for (address, msg) in iter(conn.recv, None): 1432dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson client = self.connection.Client(address) 1433dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson client.send(msg.upper()) 1434dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson client.close() 1435dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1436dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson if self.TYPE == 'processes': 1437dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson address, msg = conn.recv() 1438dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson client = socket.socket() 1439dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson client.connect(address) 1440dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson client.sendall(msg.upper()) 1441dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson client.close() 1442dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1443dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson conn.close() 1444dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1445dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson def test_pickling(self): 1446dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson try: 1447dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson multiprocessing.allow_connection_pickling() 1448dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson except ImportError: 1449dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson return 1450dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1451dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson families = self.connection.families 1452dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1453dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson lconn, lconn0 = self.Pipe() 1454dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson lp = self.Process(target=self._listener, args=(lconn0, families)) 1455dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson lp.start() 1456dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson lconn0.close() 1457dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1458dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson rconn, rconn0 = self.Pipe() 1459dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson rp = self.Process(target=self._remote, args=(rconn0,)) 1460dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson rp.start() 1461dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson rconn0.close() 1462dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1463dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson for fam in families: 1464dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson msg = ('This connection uses family %s' % fam).encode('ascii') 1465dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson address = lconn.recv() 1466dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson rconn.send((address, msg)) 1467dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson new_conn = lconn.recv() 1468dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(new_conn.recv(), msg.upper()) 1469dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1470dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson rconn.send(None) 1471dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1472dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson if self.TYPE == 'processes': 1473dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson msg = latin('This connection uses a normal socket') 1474dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson address = lconn.recv() 1475dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson rconn.send((address, msg)) 1476dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson if hasattr(socket, 'fromfd'): 1477dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson new_conn = lconn.recv() 1478dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(new_conn.recv(100), msg.upper()) 1479dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson else: 1480dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson # XXX On Windows with Py2.6 need to backport fromfd() 1481dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson discard = lconn.recv_bytes() 1482dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1483dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson lconn.send(None) 1484dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1485dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson rconn.close() 1486dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson lconn.close() 1487dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1488dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson lp.join() 1489dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson rp.join() 1490da3a1b120055855a464c2d5f5143021ae8f5dc86Benjamin Peterson""" 1491dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# 1492dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# 1493dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# 1494dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1495dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonclass _TestHeap(BaseTestCase): 1496dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1497dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson ALLOWED_TYPES = ('processes',) 1498dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1499dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson def test_heap(self): 1500dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson iterations = 5000 1501dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson maxblocks = 50 1502dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson blocks = [] 1503dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1504dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson # create and destroy lots of blocks of different sizes 1505dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson for i in xrange(iterations): 1506dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson size = int(random.lognormvariate(0, 1) * 1000) 1507dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson b = multiprocessing.heap.BufferWrapper(size) 1508dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson blocks.append(b) 1509dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson if len(blocks) > maxblocks: 1510dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson i = random.randrange(maxblocks) 1511dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson del blocks[i] 1512dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1513dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson # get the heap object 1514dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson heap = multiprocessing.heap.BufferWrapper._heap 1515dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1516dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson # verify the state of the heap 1517dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson all = [] 1518dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson occupied = 0 1519dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson for L in heap._len_to_seq.values(): 1520dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson for arena, start, stop in L: 1521dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson all.append((heap._arenas.index(arena), start, stop, 1522dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson stop-start, 'free')) 1523dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson for arena, start, stop in heap._allocated_blocks: 1524dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson all.append((heap._arenas.index(arena), start, stop, 1525dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson stop-start, 'occupied')) 1526dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson occupied += (stop-start) 1527dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1528dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson all.sort() 1529dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1530dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson for i in range(len(all)-1): 1531dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson (arena, start, stop) = all[i][:3] 1532dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson (narena, nstart, nstop) = all[i+1][:3] 1533dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertTrue((arena != narena and nstart == 0) or 1534dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson (stop == nstart)) 1535dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1536dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# 1537dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# 1538dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# 1539dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1540dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersontry: 1541dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson from ctypes import Structure, Value, copy, c_int, c_double 1542dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonexcept ImportError: 1543dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson Structure = object 1544dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson c_int = c_double = None 1545dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1546dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonclass _Foo(Structure): 1547dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson _fields_ = [ 1548dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson ('x', c_int), 1549dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson ('y', c_double) 1550dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson ] 1551dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1552dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonclass _TestSharedCTypes(BaseTestCase): 1553dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1554dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson ALLOWED_TYPES = ('processes',) 1555dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1556dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson def _double(self, x, y, foo, arr, string): 1557dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson x.value *= 2 1558dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson y.value *= 2 1559dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson foo.x *= 2 1560dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson foo.y *= 2 1561dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson string.value *= 2 1562dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson for i in range(len(arr)): 1563dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson arr[i] *= 2 1564dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1565dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson def test_sharedctypes(self, lock=False): 1566dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson if c_int is None: 1567dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson return 1568dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1569dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson x = Value('i', 7, lock=lock) 1570dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson y = Value(ctypes.c_double, 1.0/3.0, lock=lock) 1571dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson foo = Value(_Foo, 3, 2, lock=lock) 1572dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson arr = Array('d', range(10), lock=lock) 1573dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson string = Array('c', 20, lock=lock) 1574dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson string.value = 'hello' 1575dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1576dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson p = self.Process(target=self._double, args=(x, y, foo, arr, string)) 1577dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson p.start() 1578dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson p.join() 1579dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1580dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(x.value, 14) 1581dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertAlmostEqual(y.value, 2.0/3.0) 1582dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(foo.x, 6) 1583dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertAlmostEqual(foo.y, 4.0) 1584dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson for i in range(10): 1585dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertAlmostEqual(arr[i], i*2) 1586dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(string.value, latin('hellohello')) 1587dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1588dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson def test_synchronize(self): 1589dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.test_sharedctypes(lock=True) 1590dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1591dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson def test_copy(self): 1592dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson if c_int is None: 1593dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson return 1594dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1595dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson foo = _Foo(2, 5.0) 1596dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson bar = copy(foo) 1597dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson foo.x = 0 1598dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson foo.y = 0 1599dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(bar.x, 2) 1600dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertAlmostEqual(bar.y, 5.0) 1601dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1602dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# 1603dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# 1604dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# 1605dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1606dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonclass _TestFinalize(BaseTestCase): 1607dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1608dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson ALLOWED_TYPES = ('processes',) 1609dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1610dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson def _test_finalize(self, conn): 1611dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson class Foo(object): 1612dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson pass 1613dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1614dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson a = Foo() 1615dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson util.Finalize(a, conn.send, args=('a',)) 1616dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson del a # triggers callback for a 1617dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1618dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson b = Foo() 1619dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson close_b = util.Finalize(b, conn.send, args=('b',)) 1620dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson close_b() # triggers callback for b 1621dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson close_b() # does nothing because callback has already been called 1622dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson del b # does nothing because callback has already been called 1623dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1624dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson c = Foo() 1625dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson util.Finalize(c, conn.send, args=('c',)) 1626dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1627dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson d10 = Foo() 1628dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson util.Finalize(d10, conn.send, args=('d10',), exitpriority=1) 1629dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1630dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson d01 = Foo() 1631dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson util.Finalize(d01, conn.send, args=('d01',), exitpriority=0) 1632dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson d02 = Foo() 1633dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson util.Finalize(d02, conn.send, args=('d02',), exitpriority=0) 1634dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson d03 = Foo() 1635dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson util.Finalize(d03, conn.send, args=('d03',), exitpriority=0) 1636dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1637dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson util.Finalize(None, conn.send, args=('e',), exitpriority=-10) 1638dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1639dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson util.Finalize(None, conn.send, args=('STOP',), exitpriority=-100) 1640dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1641dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson # call mutliprocessing's cleanup function then exit process without 1642dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson # garbage collecting locals 1643dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson util._exit_function() 1644dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson conn.close() 1645dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson os._exit(0) 1646dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1647dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson def test_finalize(self): 1648dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson conn, child_conn = self.Pipe() 1649dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1650dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson p = self.Process(target=self._test_finalize, args=(child_conn,)) 1651dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson p.start() 1652dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson p.join() 1653dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1654dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson result = [obj for obj in iter(conn.recv, 'STOP')] 1655dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(result, ['a', 'b', 'd10', 'd03', 'd02', 'd01', 'e']) 1656dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1657dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# 1658dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# Test that from ... import * works for each module 1659dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# 1660dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1661dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonclass _TestImportStar(BaseTestCase): 1662dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1663dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson ALLOWED_TYPES = ('processes',) 1664dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1665dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson def test_import(self): 1666dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson modules = ( 1667dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 'multiprocessing', 'multiprocessing.connection', 1668dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 'multiprocessing.heap', 'multiprocessing.managers', 1669dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 'multiprocessing.pool', 'multiprocessing.process', 1670dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 'multiprocessing.reduction', 'multiprocessing.sharedctypes', 1671dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 'multiprocessing.synchronize', 'multiprocessing.util' 1672dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson ) 1673dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1674dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson for name in modules: 1675dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson __import__(name) 1676dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson mod = sys.modules[name] 1677dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1678dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson for attr in getattr(mod, '__all__', ()): 1679dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertTrue( 1680dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson hasattr(mod, attr), 1681dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson '%r does not have attribute %r' % (mod, attr) 1682dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson ) 1683dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1684dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# 1685dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# Quick test that logging works -- does not test logging output 1686dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# 1687dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1688dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonclass _TestLogging(BaseTestCase): 1689dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1690dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson ALLOWED_TYPES = ('processes',) 1691dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1692dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson def test_enable_logging(self): 1693dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson logger = multiprocessing.get_logger() 1694dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson logger.setLevel(util.SUBWARNING) 1695dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertTrue(logger is not None) 1696dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson logger.debug('this will not be printed') 1697dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson logger.info('nor will this') 1698dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson logger.setLevel(LOG_LEVEL) 1699dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1700dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson def _test_level(self, conn): 1701dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson logger = multiprocessing.get_logger() 1702dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson conn.send(logger.getEffectiveLevel()) 1703dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1704dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson def test_level(self): 1705dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson LEVEL1 = 32 1706dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson LEVEL2 = 37 1707dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1708dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson logger = multiprocessing.get_logger() 1709dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson root_logger = logging.getLogger() 1710dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson root_level = root_logger.level 1711dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1712dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson reader, writer = multiprocessing.Pipe(duplex=False) 1713dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1714dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson logger.setLevel(LEVEL1) 1715dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.Process(target=self._test_level, args=(writer,)).start() 1716dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(LEVEL1, reader.recv()) 1717dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1718dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson logger.setLevel(logging.NOTSET) 1719dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson root_logger.setLevel(LEVEL2) 1720dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.Process(target=self._test_level, args=(writer,)).start() 1721dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(LEVEL2, reader.recv()) 1722dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1723dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson root_logger.setLevel(root_level) 1724dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson logger.setLevel(level=LOG_LEVEL) 1725dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1726814d02dcd1b30a98f9a34c710be35de6db82aa40Jesse Noller 17279a03f2fd03278d2c12dfe253de1bbed7c0c9c506Jesse Noller# class _TestLoggingProcessName(BaseTestCase): 17289a03f2fd03278d2c12dfe253de1bbed7c0c9c506Jesse Noller# 17299a03f2fd03278d2c12dfe253de1bbed7c0c9c506Jesse Noller# def handle(self, record): 17309a03f2fd03278d2c12dfe253de1bbed7c0c9c506Jesse Noller# assert record.processName == multiprocessing.current_process().name 17319a03f2fd03278d2c12dfe253de1bbed7c0c9c506Jesse Noller# self.__handled = True 17329a03f2fd03278d2c12dfe253de1bbed7c0c9c506Jesse Noller# 17339a03f2fd03278d2c12dfe253de1bbed7c0c9c506Jesse Noller# def test_logging(self): 17349a03f2fd03278d2c12dfe253de1bbed7c0c9c506Jesse Noller# handler = logging.Handler() 17359a03f2fd03278d2c12dfe253de1bbed7c0c9c506Jesse Noller# handler.handle = self.handle 17369a03f2fd03278d2c12dfe253de1bbed7c0c9c506Jesse Noller# self.__handled = False 17379a03f2fd03278d2c12dfe253de1bbed7c0c9c506Jesse Noller# # Bypass getLogger() and side-effects 17389a03f2fd03278d2c12dfe253de1bbed7c0c9c506Jesse Noller# logger = logging.getLoggerClass()( 17399a03f2fd03278d2c12dfe253de1bbed7c0c9c506Jesse Noller# 'multiprocessing.test.TestLoggingProcessName') 17409a03f2fd03278d2c12dfe253de1bbed7c0c9c506Jesse Noller# logger.addHandler(handler) 17419a03f2fd03278d2c12dfe253de1bbed7c0c9c506Jesse Noller# logger.propagate = False 17429a03f2fd03278d2c12dfe253de1bbed7c0c9c506Jesse Noller# 17439a03f2fd03278d2c12dfe253de1bbed7c0c9c506Jesse Noller# logger.warn('foo') 17449a03f2fd03278d2c12dfe253de1bbed7c0c9c506Jesse Noller# assert self.__handled 1745814d02dcd1b30a98f9a34c710be35de6db82aa40Jesse Noller 1746dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# 17479a5b2ad38d605206f05a52fe32868d3f839e8a86Jesse Noller# Test to verify handle verification, see issue 3321 17489a5b2ad38d605206f05a52fe32868d3f839e8a86Jesse Noller# 17499a5b2ad38d605206f05a52fe32868d3f839e8a86Jesse Noller 17509a5b2ad38d605206f05a52fe32868d3f839e8a86Jesse Nollerclass TestInvalidHandle(unittest.TestCase): 17519a5b2ad38d605206f05a52fe32868d3f839e8a86Jesse Noller 17529a5b2ad38d605206f05a52fe32868d3f839e8a86Jesse Noller def test_invalid_handles(self): 17539a5b2ad38d605206f05a52fe32868d3f839e8a86Jesse Noller if WIN32: 17549a5b2ad38d605206f05a52fe32868d3f839e8a86Jesse Noller return 17559a5b2ad38d605206f05a52fe32868d3f839e8a86Jesse Noller conn = _multiprocessing.Connection(44977608) 17569a5b2ad38d605206f05a52fe32868d3f839e8a86Jesse Noller self.assertRaises(IOError, conn.poll) 17579a5b2ad38d605206f05a52fe32868d3f839e8a86Jesse Noller self.assertRaises(IOError, _multiprocessing.Connection, -1) 17589a5b2ad38d605206f05a52fe32868d3f839e8a86Jesse Noller# 1759dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# Functions used to create test cases from the base ones in this module 1760dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# 1761dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1762dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersondef get_attributes(Source, names): 1763dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson d = {} 1764dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson for name in names: 1765dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson obj = getattr(Source, name) 1766dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson if type(obj) == type(get_attributes): 1767dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson obj = staticmethod(obj) 1768dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson d[name] = obj 1769dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson return d 1770dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1771dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersondef create_test_cases(Mixin, type): 1772dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson result = {} 1773dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson glob = globals() 1774dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson Type = type[0].upper() + type[1:] 1775dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1776dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson for name in glob.keys(): 1777dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson if name.startswith('_Test'): 1778dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson base = glob[name] 1779dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson if type in base.ALLOWED_TYPES: 1780dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson newname = 'With' + Type + name[1:] 1781dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson class Temp(base, unittest.TestCase, Mixin): 1782dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson pass 1783dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson result[newname] = Temp 1784dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson Temp.__name__ = newname 1785dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson Temp.__module__ = Mixin.__module__ 1786dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson return result 1787dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1788dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# 1789dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# Create test cases 1790dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# 1791dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1792dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonclass ProcessesMixin(object): 1793dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson TYPE = 'processes' 1794dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson Process = multiprocessing.Process 1795dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson locals().update(get_attributes(multiprocessing, ( 1796dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 'Queue', 'Lock', 'RLock', 'Semaphore', 'BoundedSemaphore', 1797dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 'Condition', 'Event', 'Value', 'Array', 'RawValue', 1798dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 'RawArray', 'current_process', 'active_children', 'Pipe', 1799dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 'connection', 'JoinableQueue' 1800dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson ))) 1801dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1802dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersontestcases_processes = create_test_cases(ProcessesMixin, type='processes') 1803dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonglobals().update(testcases_processes) 1804dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1805dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1806dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonclass ManagerMixin(object): 1807dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson TYPE = 'manager' 1808dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson Process = multiprocessing.Process 1809dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson manager = object.__new__(multiprocessing.managers.SyncManager) 1810dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson locals().update(get_attributes(manager, ( 1811dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 'Queue', 'Lock', 'RLock', 'Semaphore', 'BoundedSemaphore', 1812dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 'Condition', 'Event', 'Value', 'Array', 'list', 'dict', 1813dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 'Namespace', 'JoinableQueue' 1814dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson ))) 1815dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1816dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersontestcases_manager = create_test_cases(ManagerMixin, type='manager') 1817dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonglobals().update(testcases_manager) 1818dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1819dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1820dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonclass ThreadsMixin(object): 1821dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson TYPE = 'threads' 1822dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson Process = multiprocessing.dummy.Process 1823dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson locals().update(get_attributes(multiprocessing.dummy, ( 1824dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 'Queue', 'Lock', 'RLock', 'Semaphore', 'BoundedSemaphore', 1825dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 'Condition', 'Event', 'Value', 'Array', 'current_process', 1826dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 'active_children', 'Pipe', 'connection', 'dict', 'list', 1827dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 'Namespace', 'JoinableQueue' 1828dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson ))) 1829dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1830dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersontestcases_threads = create_test_cases(ThreadsMixin, type='threads') 1831dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonglobals().update(testcases_threads) 1832dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 18330c519b3a5e847eea0dffb51ac8df7c68891daf70Neal Norwitzclass OtherTest(unittest.TestCase): 18340c519b3a5e847eea0dffb51ac8df7c68891daf70Neal Norwitz # TODO: add more tests for deliver/answer challenge. 18350c519b3a5e847eea0dffb51ac8df7c68891daf70Neal Norwitz def test_deliver_challenge_auth_failure(self): 18360c519b3a5e847eea0dffb51ac8df7c68891daf70Neal Norwitz class _FakeConnection(object): 18370c519b3a5e847eea0dffb51ac8df7c68891daf70Neal Norwitz def recv_bytes(self, size): 18382a7767a17311cada06240a187c8896bdbcc1a4d0Neal Norwitz return b'something bogus' 18390c519b3a5e847eea0dffb51ac8df7c68891daf70Neal Norwitz def send_bytes(self, data): 18400c519b3a5e847eea0dffb51ac8df7c68891daf70Neal Norwitz pass 18410c519b3a5e847eea0dffb51ac8df7c68891daf70Neal Norwitz self.assertRaises(multiprocessing.AuthenticationError, 18420c519b3a5e847eea0dffb51ac8df7c68891daf70Neal Norwitz multiprocessing.connection.deliver_challenge, 18430c519b3a5e847eea0dffb51ac8df7c68891daf70Neal Norwitz _FakeConnection(), b'abc') 18440c519b3a5e847eea0dffb51ac8df7c68891daf70Neal Norwitz 18450c519b3a5e847eea0dffb51ac8df7c68891daf70Neal Norwitz def test_answer_challenge_auth_failure(self): 18460c519b3a5e847eea0dffb51ac8df7c68891daf70Neal Norwitz class _FakeConnection(object): 18470c519b3a5e847eea0dffb51ac8df7c68891daf70Neal Norwitz def __init__(self): 18480c519b3a5e847eea0dffb51ac8df7c68891daf70Neal Norwitz self.count = 0 18490c519b3a5e847eea0dffb51ac8df7c68891daf70Neal Norwitz def recv_bytes(self, size): 18500c519b3a5e847eea0dffb51ac8df7c68891daf70Neal Norwitz self.count += 1 18510c519b3a5e847eea0dffb51ac8df7c68891daf70Neal Norwitz if self.count == 1: 18520c519b3a5e847eea0dffb51ac8df7c68891daf70Neal Norwitz return multiprocessing.connection.CHALLENGE 18530c519b3a5e847eea0dffb51ac8df7c68891daf70Neal Norwitz elif self.count == 2: 18542a7767a17311cada06240a187c8896bdbcc1a4d0Neal Norwitz return b'something bogus' 18552a7767a17311cada06240a187c8896bdbcc1a4d0Neal Norwitz return b'' 18560c519b3a5e847eea0dffb51ac8df7c68891daf70Neal Norwitz def send_bytes(self, data): 18570c519b3a5e847eea0dffb51ac8df7c68891daf70Neal Norwitz pass 18580c519b3a5e847eea0dffb51ac8df7c68891daf70Neal Norwitz self.assertRaises(multiprocessing.AuthenticationError, 18590c519b3a5e847eea0dffb51ac8df7c68891daf70Neal Norwitz multiprocessing.connection.answer_challenge, 18600c519b3a5e847eea0dffb51ac8df7c68891daf70Neal Norwitz _FakeConnection(), b'abc') 18610c519b3a5e847eea0dffb51ac8df7c68891daf70Neal Norwitz 18627152f6d9156a19a9f1b31e313d2c19d840dc089dJesse Noller# 18637152f6d9156a19a9f1b31e313d2c19d840dc089dJesse Noller# Test Manager.start()/Pool.__init__() initializer feature - see issue 5585 18647152f6d9156a19a9f1b31e313d2c19d840dc089dJesse Noller# 18657152f6d9156a19a9f1b31e313d2c19d840dc089dJesse Noller 18667152f6d9156a19a9f1b31e313d2c19d840dc089dJesse Nollerdef initializer(ns): 18677152f6d9156a19a9f1b31e313d2c19d840dc089dJesse Noller ns.test += 1 18687152f6d9156a19a9f1b31e313d2c19d840dc089dJesse Noller 18697152f6d9156a19a9f1b31e313d2c19d840dc089dJesse Nollerclass TestInitializers(unittest.TestCase): 18707152f6d9156a19a9f1b31e313d2c19d840dc089dJesse Noller def setUp(self): 18717152f6d9156a19a9f1b31e313d2c19d840dc089dJesse Noller self.mgr = multiprocessing.Manager() 18727152f6d9156a19a9f1b31e313d2c19d840dc089dJesse Noller self.ns = self.mgr.Namespace() 18737152f6d9156a19a9f1b31e313d2c19d840dc089dJesse Noller self.ns.test = 0 18747152f6d9156a19a9f1b31e313d2c19d840dc089dJesse Noller 18757152f6d9156a19a9f1b31e313d2c19d840dc089dJesse Noller def tearDown(self): 18767152f6d9156a19a9f1b31e313d2c19d840dc089dJesse Noller self.mgr.shutdown() 18777152f6d9156a19a9f1b31e313d2c19d840dc089dJesse Noller 18787152f6d9156a19a9f1b31e313d2c19d840dc089dJesse Noller def test_manager_initializer(self): 18797152f6d9156a19a9f1b31e313d2c19d840dc089dJesse Noller m = multiprocessing.managers.SyncManager() 18807152f6d9156a19a9f1b31e313d2c19d840dc089dJesse Noller self.assertRaises(TypeError, m.start, 1) 18817152f6d9156a19a9f1b31e313d2c19d840dc089dJesse Noller m.start(initializer, (self.ns,)) 18827152f6d9156a19a9f1b31e313d2c19d840dc089dJesse Noller self.assertEqual(self.ns.test, 1) 18837152f6d9156a19a9f1b31e313d2c19d840dc089dJesse Noller m.shutdown() 18847152f6d9156a19a9f1b31e313d2c19d840dc089dJesse Noller 18857152f6d9156a19a9f1b31e313d2c19d840dc089dJesse Noller def test_pool_initializer(self): 18867152f6d9156a19a9f1b31e313d2c19d840dc089dJesse Noller self.assertRaises(TypeError, multiprocessing.Pool, initializer=1) 18877152f6d9156a19a9f1b31e313d2c19d840dc089dJesse Noller p = multiprocessing.Pool(1, initializer, (self.ns,)) 18887152f6d9156a19a9f1b31e313d2c19d840dc089dJesse Noller p.close() 18897152f6d9156a19a9f1b31e313d2c19d840dc089dJesse Noller p.join() 18907152f6d9156a19a9f1b31e313d2c19d840dc089dJesse Noller self.assertEqual(self.ns.test, 1) 18917152f6d9156a19a9f1b31e313d2c19d840dc089dJesse Noller 18921b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller# 18931b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller# Issue 5155, 5313, 5331: Test process in processes 18941b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller# Verifies os.close(sys.stdin.fileno) vs. sys.stdin.close() behavior 18951b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller# 18961b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller 18971b90efbdc5bb204fe50aea87374603dcba309227Jesse Nollerdef _ThisSubProcess(q): 18981b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller try: 18991b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller item = q.get(block=False) 19001b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller except Queue.Empty: 19011b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller pass 19021b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller 19031b90efbdc5bb204fe50aea87374603dcba309227Jesse Nollerdef _TestProcess(q): 19041b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller queue = multiprocessing.Queue() 19051b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller subProc = multiprocessing.Process(target=_ThisSubProcess, args=(queue,)) 19061b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller subProc.start() 19071b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller subProc.join() 19081b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller 19091b90efbdc5bb204fe50aea87374603dcba309227Jesse Nollerdef _afunc(x): 19101b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller return x*x 19111b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller 19121b90efbdc5bb204fe50aea87374603dcba309227Jesse Nollerdef pool_in_process(): 19131b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller pool = multiprocessing.Pool(processes=4) 19141b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller x = pool.map(_afunc, [1, 2, 3, 4, 5, 6, 7]) 19151b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller 19161b90efbdc5bb204fe50aea87374603dcba309227Jesse Nollerclass _file_like(object): 19171b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller def __init__(self, delegate): 19181b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller self._delegate = delegate 19191b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller self._pid = None 19201b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller 19211b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller @property 19221b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller def cache(self): 19231b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller pid = os.getpid() 19241b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller # There are no race conditions since fork keeps only the running thread 19251b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller if pid != self._pid: 19261b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller self._pid = pid 19271b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller self._cache = [] 19281b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller return self._cache 19291b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller 19301b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller def write(self, data): 19311b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller self.cache.append(data) 19321b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller 19331b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller def flush(self): 19341b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller self._delegate.write(''.join(self.cache)) 19351b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller self._cache = [] 19361b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller 19371b90efbdc5bb204fe50aea87374603dcba309227Jesse Nollerclass TestStdinBadfiledescriptor(unittest.TestCase): 19381b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller 19391b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller def test_queue_in_process(self): 19401b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller queue = multiprocessing.Queue() 19411b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller proc = multiprocessing.Process(target=_TestProcess, args=(queue,)) 19421b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller proc.start() 19431b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller proc.join() 19441b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller 19451b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller def test_pool_in_process(self): 19461b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller p = multiprocessing.Process(target=pool_in_process) 19471b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller p.start() 19481b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller p.join() 19491b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller 19501b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller def test_flushing(self): 19511b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller sio = StringIO() 19521b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller flike = _file_like(sio) 19531b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller flike.write('foo') 19541b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller proc = multiprocessing.Process(target=lambda: flike.flush()) 19551b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller flike.flush() 19561b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller assert sio.getvalue() == 'foo' 19571b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller 19581b90efbdc5bb204fe50aea87374603dcba309227Jesse Nollertestcases_other = [OtherTest, TestInvalidHandle, TestInitializers, 19591b90efbdc5bb204fe50aea87374603dcba309227Jesse Noller TestStdinBadfiledescriptor] 19600c519b3a5e847eea0dffb51ac8df7c68891daf70Neal Norwitz 1961dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# 1962dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# 1963dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# 1964dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1965dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersondef test_main(run=None): 196618623825d25b0f8f3b4bf96c1d5c4c2977a94004Jesse Noller if sys.platform.startswith("linux"): 196718623825d25b0f8f3b4bf96c1d5c4c2977a94004Jesse Noller try: 196818623825d25b0f8f3b4bf96c1d5c4c2977a94004Jesse Noller lock = multiprocessing.RLock() 196918623825d25b0f8f3b4bf96c1d5c4c2977a94004Jesse Noller except OSError: 1970bec087f29d7dca0aaf8f51be7d7c135e9b84e7f1Benjamin Peterson raise unittest.SkipTest("OSError raises on RLock creation, see issue 3111!") 1971ed77f2e143102df58212ff1f64a87f7e0c237439Benjamin Peterson 1972dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson if run is None: 1973dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson from test.test_support import run_unittest as run 1974dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1975dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson util.get_temp_dir() # creates temp directory for use by all processes 1976dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1977dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson multiprocessing.get_logger().setLevel(LOG_LEVEL) 1978dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1979146b7ab818cadccf91ad98e64cfefb77705da0caJesse Noller ProcessesMixin.pool = multiprocessing.Pool(4) 1980146b7ab818cadccf91ad98e64cfefb77705da0caJesse Noller ThreadsMixin.pool = multiprocessing.dummy.Pool(4) 1981146b7ab818cadccf91ad98e64cfefb77705da0caJesse Noller ManagerMixin.manager.__init__() 1982146b7ab818cadccf91ad98e64cfefb77705da0caJesse Noller ManagerMixin.manager.start() 1983146b7ab818cadccf91ad98e64cfefb77705da0caJesse Noller ManagerMixin.pool = ManagerMixin.manager.Pool(4) 1984dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1985dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson testcases = ( 1986146b7ab818cadccf91ad98e64cfefb77705da0caJesse Noller sorted(testcases_processes.values(), key=lambda tc:tc.__name__) + 1987146b7ab818cadccf91ad98e64cfefb77705da0caJesse Noller sorted(testcases_threads.values(), key=lambda tc:tc.__name__) + 19880c519b3a5e847eea0dffb51ac8df7c68891daf70Neal Norwitz sorted(testcases_manager.values(), key=lambda tc:tc.__name__) + 19890c519b3a5e847eea0dffb51ac8df7c68891daf70Neal Norwitz testcases_other 1990dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson ) 1991dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1992dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson loadTestsFromTestCase = unittest.defaultTestLoader.loadTestsFromTestCase 1993dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson suite = unittest.TestSuite(loadTestsFromTestCase(tc) for tc in testcases) 1994ce8e33a095030e7af94f58f9da196b240bdf0476Senthil Kumaran run(suite) 1995dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1996146b7ab818cadccf91ad98e64cfefb77705da0caJesse Noller ThreadsMixin.pool.terminate() 1997146b7ab818cadccf91ad98e64cfefb77705da0caJesse Noller ProcessesMixin.pool.terminate() 1998146b7ab818cadccf91ad98e64cfefb77705da0caJesse Noller ManagerMixin.pool.terminate() 1999146b7ab818cadccf91ad98e64cfefb77705da0caJesse Noller ManagerMixin.manager.shutdown() 2000dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 2001146b7ab818cadccf91ad98e64cfefb77705da0caJesse Noller del ProcessesMixin.pool, ThreadsMixin.pool, ManagerMixin.pool 2002dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 2003dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersondef main(): 2004dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson test_main(unittest.TextTestRunner(verbosity=2).run) 2005dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 2006dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonif __name__ == '__main__': 2007dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson main() 2008