test_multiprocessing.py revision 02cb0eb231fc01e2a50cbe14f6da7a8df52959ef
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 203db8a3432bd84b58bdc7da2c9872777c537a4d09R. David Murrayimport test_support 21dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 2237040cdace1982772e5f35e4acfa13861d72065dJesse Noller 233db8a3432bd84b58bdc7da2c9872777c537a4d09R. David Murray_multiprocessing = test_support.import_module('_multiprocessing') 243db8a3432bd84b58bdc7da2c9872777c537a4d09R. David Murray 2537040cdace1982772e5f35e4acfa13861d72065dJesse Noller# Work around broken sem_open implementations 263db8a3432bd84b58bdc7da2c9872777c537a4d09R. David Murraytest_support.import_module('multiprocessing.synchronize') 2737040cdace1982772e5f35e4acfa13861d72065dJesse Noller 28dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonimport multiprocessing.dummy 29dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonimport multiprocessing.connection 30dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonimport multiprocessing.managers 31dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonimport multiprocessing.heap 32dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonimport multiprocessing.pool 33dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 34dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonfrom multiprocessing import util 35dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 36dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# 37dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# 38dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# 39dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 40e79edf5f7c53f977b8e1fe8c00773e4668e35ea9Benjamin Petersonlatin = str 41dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 42dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# 43dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# Constants 44dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# 45dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 46dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin PetersonLOG_LEVEL = util.SUBWARNING 47dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson#LOG_LEVEL = logging.WARNING 48dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 49dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin PetersonDELTA = 0.1 50dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin PetersonCHECK_TIMINGS = False # making true makes tests take a lot longer 51dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson # and can sometimes cause some non-serious 52dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson # failures because some calls block a bit 53dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson # longer than expected 54dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonif CHECK_TIMINGS: 55dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson TIMEOUT1, TIMEOUT2, TIMEOUT3 = 0.82, 0.35, 1.4 56dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonelse: 57dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson TIMEOUT1, TIMEOUT2, TIMEOUT3 = 0.1, 0.1, 0.1 58dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 59dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin PetersonHAVE_GETVALUE = not getattr(_multiprocessing, 60dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 'HAVE_BROKEN_SEM_GETVALUE', False) 61dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 629a5b2ad38d605206f05a52fe32868d3f839e8a86Jesse NollerWIN32 = (sys.platform == "win32") 639a5b2ad38d605206f05a52fe32868d3f839e8a86Jesse Noller 64dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# 65dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# Creates a wrapper for a function which records the time it takes to finish 66dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# 67dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 68dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonclass TimingWrapper(object): 69dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 70dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson def __init__(self, func): 71dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.func = func 72dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.elapsed = None 73dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 74dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson def __call__(self, *args, **kwds): 75dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson t = time.time() 76dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson try: 77dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson return self.func(*args, **kwds) 78dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson finally: 79dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.elapsed = time.time() - t 80dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 81dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# 82dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# Base class for test cases 83dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# 84dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 85dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonclass BaseTestCase(object): 86dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 87dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson ALLOWED_TYPES = ('processes', 'manager', 'threads') 88dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 89dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson def assertTimingAlmostEqual(self, a, b): 90dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson if CHECK_TIMINGS: 91dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertAlmostEqual(a, b, 1) 92dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 93dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson def assertReturnsIfImplemented(self, value, func, *args): 94dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson try: 95dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson res = func(*args) 96dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson except NotImplementedError: 97dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson pass 98dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson else: 99dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson return self.assertEqual(value, res) 100dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 101dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# 102dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# Return the value of a semaphore 103dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# 104dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 105dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersondef get_value(self): 106dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson try: 107dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson return self.get_value() 108dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson except AttributeError: 109dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson try: 110dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson return self._Semaphore__value 111dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson except AttributeError: 112dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson try: 113dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson return self._value 114dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson except AttributeError: 115dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson raise NotImplementedError 116dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 117dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# 118dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# Testcases 119dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# 120dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 121dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonclass _TestProcess(BaseTestCase): 122dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 123dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson ALLOWED_TYPES = ('processes', 'threads') 124dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 125dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson def test_current(self): 126dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson if self.TYPE == 'threads': 127dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson return 128dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 129dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson current = self.current_process() 1305bc9f4c09c99eb701dbee83fb9e26eed558e474fJesse Noller authkey = current.authkey 131dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 132dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertTrue(current.is_alive()) 1335bc9f4c09c99eb701dbee83fb9e26eed558e474fJesse Noller self.assertTrue(not current.daemon) 134dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertTrue(isinstance(authkey, bytes)) 135dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertTrue(len(authkey) > 0) 1365bc9f4c09c99eb701dbee83fb9e26eed558e474fJesse Noller self.assertEqual(current.ident, os.getpid()) 1375bc9f4c09c99eb701dbee83fb9e26eed558e474fJesse Noller self.assertEqual(current.exitcode, None) 138dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 139dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson def _test(self, q, *args, **kwds): 140dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson current = self.current_process() 141dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson q.put(args) 142dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson q.put(kwds) 1435bc9f4c09c99eb701dbee83fb9e26eed558e474fJesse Noller q.put(current.name) 144dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson if self.TYPE != 'threads': 1455bc9f4c09c99eb701dbee83fb9e26eed558e474fJesse Noller q.put(bytes(current.authkey)) 146dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson q.put(current.pid) 147dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 148dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson def test_process(self): 149dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson q = self.Queue(1) 150dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson e = self.Event() 151dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson args = (q, 1, 2) 152dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson kwargs = {'hello':23, 'bye':2.54} 153dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson name = 'SomeProcess' 154dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson p = self.Process( 155dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson target=self._test, args=args, kwargs=kwargs, name=name 156dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson ) 1575bc9f4c09c99eb701dbee83fb9e26eed558e474fJesse Noller p.daemon = True 158dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson current = self.current_process() 159dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 160dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson if self.TYPE != 'threads': 1615bc9f4c09c99eb701dbee83fb9e26eed558e474fJesse Noller self.assertEquals(p.authkey, current.authkey) 162dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEquals(p.is_alive(), False) 1635bc9f4c09c99eb701dbee83fb9e26eed558e474fJesse Noller self.assertEquals(p.daemon, True) 164dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertTrue(p not in self.active_children()) 165dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertTrue(type(self.active_children()) is list) 1665bc9f4c09c99eb701dbee83fb9e26eed558e474fJesse Noller self.assertEqual(p.exitcode, None) 167dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 168dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson p.start() 169dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1705bc9f4c09c99eb701dbee83fb9e26eed558e474fJesse Noller self.assertEquals(p.exitcode, None) 171dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEquals(p.is_alive(), True) 172dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertTrue(p in self.active_children()) 173dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 174dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEquals(q.get(), args[1:]) 175dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEquals(q.get(), kwargs) 1765bc9f4c09c99eb701dbee83fb9e26eed558e474fJesse Noller self.assertEquals(q.get(), p.name) 177dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson if self.TYPE != 'threads': 1785bc9f4c09c99eb701dbee83fb9e26eed558e474fJesse Noller self.assertEquals(q.get(), current.authkey) 179dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEquals(q.get(), p.pid) 180dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 181dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson p.join() 182dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1835bc9f4c09c99eb701dbee83fb9e26eed558e474fJesse Noller self.assertEquals(p.exitcode, 0) 184dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEquals(p.is_alive(), False) 185dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertTrue(p not in self.active_children()) 186dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 187dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson def _test_terminate(self): 188dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson time.sleep(1000) 189dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 190dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson def test_terminate(self): 191dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson if self.TYPE == 'threads': 192dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson return 193dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 194dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson p = self.Process(target=self._test_terminate) 1955bc9f4c09c99eb701dbee83fb9e26eed558e474fJesse Noller p.daemon = True 196dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson p.start() 197dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 198dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(p.is_alive(), True) 199dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertTrue(p in self.active_children()) 2005bc9f4c09c99eb701dbee83fb9e26eed558e474fJesse Noller self.assertEqual(p.exitcode, None) 201dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 202dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson p.terminate() 203dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 204dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson join = TimingWrapper(p.join) 205dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(join(), None) 206dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertTimingAlmostEqual(join.elapsed, 0.0) 207dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 208dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(p.is_alive(), False) 209dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertTrue(p not in self.active_children()) 210dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 211dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson p.join() 212dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 2135bc9f4c09c99eb701dbee83fb9e26eed558e474fJesse Noller # XXX sometimes get p.exitcode == 0 on Windows ... 2145bc9f4c09c99eb701dbee83fb9e26eed558e474fJesse Noller #self.assertEqual(p.exitcode, -signal.SIGTERM) 215dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 216dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson def test_cpu_count(self): 217dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson try: 218dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson cpus = multiprocessing.cpu_count() 219dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson except NotImplementedError: 220dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson cpus = 1 221dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertTrue(type(cpus) is int) 222dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertTrue(cpus >= 1) 223dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 224dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson def test_active_children(self): 225dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(type(self.active_children()), list) 226dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 227dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson p = self.Process(target=time.sleep, args=(DELTA,)) 228dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertTrue(p not in self.active_children()) 229dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 230dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson p.start() 231dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertTrue(p in self.active_children()) 232dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 233dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson p.join() 234dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertTrue(p not in self.active_children()) 235dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 236dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson def _test_recursion(self, wconn, id): 237dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson from multiprocessing import forking 238dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson wconn.send(id) 239dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson if len(id) < 2: 240dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson for i in range(2): 241dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson p = self.Process( 242dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson target=self._test_recursion, args=(wconn, id+[i]) 243dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson ) 244dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson p.start() 245dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson p.join() 246dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 247dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson def test_recursion(self): 248dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson rconn, wconn = self.Pipe(duplex=False) 249dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self._test_recursion(wconn, []) 250dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 251dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson time.sleep(DELTA) 252dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson result = [] 253dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson while rconn.poll(): 254dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson result.append(rconn.recv()) 255dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 256dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson expected = [ 257dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson [], 258dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson [0], 259dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson [0, 0], 260dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson [0, 1], 261dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson [1], 262dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson [1, 0], 263dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson [1, 1] 264dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson ] 265dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(result, expected) 266dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 267dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# 268dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# 269dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# 270dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 271dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonclass _UpperCaser(multiprocessing.Process): 272dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 273dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson def __init__(self): 274dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson multiprocessing.Process.__init__(self) 275dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.child_conn, self.parent_conn = multiprocessing.Pipe() 276dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 277dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson def run(self): 278dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.parent_conn.close() 279dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson for s in iter(self.child_conn.recv, None): 280dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.child_conn.send(s.upper()) 281dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.child_conn.close() 282dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 283dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson def submit(self, s): 284dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson assert type(s) is str 285dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.parent_conn.send(s) 286dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson return self.parent_conn.recv() 287dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 288dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson def stop(self): 289dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.parent_conn.send(None) 290dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.parent_conn.close() 291dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.child_conn.close() 292dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 293dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonclass _TestSubclassingProcess(BaseTestCase): 294dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 295dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson ALLOWED_TYPES = ('processes',) 296dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 297dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson def test_subclassing(self): 298dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson uppercaser = _UpperCaser() 299dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson uppercaser.start() 300dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(uppercaser.submit('hello'), 'HELLO') 301dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(uppercaser.submit('world'), 'WORLD') 302dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson uppercaser.stop() 303dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson uppercaser.join() 304dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 305dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# 306dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# 307dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# 308dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 309dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersondef queue_empty(q): 310dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson if hasattr(q, 'empty'): 311dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson return q.empty() 312dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson else: 313dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson return q.qsize() == 0 314dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 315dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersondef queue_full(q, maxsize): 316dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson if hasattr(q, 'full'): 317dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson return q.full() 318dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson else: 319dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson return q.qsize() == maxsize 320dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 321dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 322dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonclass _TestQueue(BaseTestCase): 323dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 324dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 325dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson def _test_put(self, queue, child_can_start, parent_can_continue): 326dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson child_can_start.wait() 327dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson for i in range(6): 328dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson queue.get() 329dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson parent_can_continue.set() 330dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 331dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson def test_put(self): 332dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson MAXSIZE = 6 333dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson queue = self.Queue(maxsize=MAXSIZE) 334dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson child_can_start = self.Event() 335dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson parent_can_continue = self.Event() 336dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 337dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson proc = self.Process( 338dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson target=self._test_put, 339dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson args=(queue, child_can_start, parent_can_continue) 340dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson ) 3415bc9f4c09c99eb701dbee83fb9e26eed558e474fJesse Noller proc.daemon = True 342dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson proc.start() 343dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 344dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(queue_empty(queue), True) 345dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(queue_full(queue, MAXSIZE), False) 346dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 347dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson queue.put(1) 348dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson queue.put(2, True) 349dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson queue.put(3, True, None) 350dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson queue.put(4, False) 351dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson queue.put(5, False, None) 352dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson queue.put_nowait(6) 353dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 354dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson # the values may be in buffer but not yet in pipe so sleep a bit 355dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson time.sleep(DELTA) 356dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 357dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(queue_empty(queue), False) 358dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(queue_full(queue, MAXSIZE), True) 359dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 360dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson put = TimingWrapper(queue.put) 361dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson put_nowait = TimingWrapper(queue.put_nowait) 362dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 363dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertRaises(Queue.Full, put, 7, False) 364dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertTimingAlmostEqual(put.elapsed, 0) 365dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 366dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertRaises(Queue.Full, put, 7, False, None) 367dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertTimingAlmostEqual(put.elapsed, 0) 368dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 369dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertRaises(Queue.Full, put_nowait, 7) 370dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertTimingAlmostEqual(put_nowait.elapsed, 0) 371dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 372dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertRaises(Queue.Full, put, 7, True, TIMEOUT1) 373dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertTimingAlmostEqual(put.elapsed, TIMEOUT1) 374dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 375dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertRaises(Queue.Full, put, 7, False, TIMEOUT2) 376dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertTimingAlmostEqual(put.elapsed, 0) 377dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 378dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertRaises(Queue.Full, put, 7, True, timeout=TIMEOUT3) 379dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertTimingAlmostEqual(put.elapsed, TIMEOUT3) 380dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 381dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson child_can_start.set() 382dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson parent_can_continue.wait() 383dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 384dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(queue_empty(queue), True) 385dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(queue_full(queue, MAXSIZE), False) 386dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 387dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson proc.join() 388dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 389dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson def _test_get(self, queue, child_can_start, parent_can_continue): 390dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson child_can_start.wait() 391da3a1b120055855a464c2d5f5143021ae8f5dc86Benjamin Peterson #queue.put(1) 392dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson queue.put(2) 393dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson queue.put(3) 394dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson queue.put(4) 395dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson queue.put(5) 396dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson parent_can_continue.set() 397dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 398dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson def test_get(self): 399dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson queue = self.Queue() 400dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson child_can_start = self.Event() 401dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson parent_can_continue = self.Event() 402dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 403dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson proc = self.Process( 404dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson target=self._test_get, 405dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson args=(queue, child_can_start, parent_can_continue) 406dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson ) 4075bc9f4c09c99eb701dbee83fb9e26eed558e474fJesse Noller proc.daemon = True 408dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson proc.start() 409dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 410dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(queue_empty(queue), True) 411dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 412dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson child_can_start.set() 413dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson parent_can_continue.wait() 414dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 415dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson time.sleep(DELTA) 416dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(queue_empty(queue), False) 417dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 418da3a1b120055855a464c2d5f5143021ae8f5dc86Benjamin Peterson # Hangs unexpectedly, remove for now 419da3a1b120055855a464c2d5f5143021ae8f5dc86Benjamin Peterson #self.assertEqual(queue.get(), 1) 420dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(queue.get(True, None), 2) 421dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(queue.get(True), 3) 422dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(queue.get(timeout=1), 4) 423dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(queue.get_nowait(), 5) 424dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 425dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(queue_empty(queue), True) 426dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 427dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson get = TimingWrapper(queue.get) 428dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson get_nowait = TimingWrapper(queue.get_nowait) 429dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 430dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertRaises(Queue.Empty, get, False) 431dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertTimingAlmostEqual(get.elapsed, 0) 432dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 433dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertRaises(Queue.Empty, get, False, None) 434dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertTimingAlmostEqual(get.elapsed, 0) 435dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 436dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertRaises(Queue.Empty, get_nowait) 437dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertTimingAlmostEqual(get_nowait.elapsed, 0) 438dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 439dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertRaises(Queue.Empty, get, True, TIMEOUT1) 440dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertTimingAlmostEqual(get.elapsed, TIMEOUT1) 441dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 442dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertRaises(Queue.Empty, get, False, TIMEOUT2) 443dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertTimingAlmostEqual(get.elapsed, 0) 444dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 445dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertRaises(Queue.Empty, get, timeout=TIMEOUT3) 446dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertTimingAlmostEqual(get.elapsed, TIMEOUT3) 447dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 448dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson proc.join() 449dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 450dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson def _test_fork(self, queue): 451dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson for i in range(10, 20): 452dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson queue.put(i) 453dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson # note that at this point the items may only be buffered, so the 454dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson # process cannot shutdown until the feeder thread has finished 455dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson # pushing items onto the pipe. 456dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 457dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson def test_fork(self): 458dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson # Old versions of Queue would fail to create a new feeder 459dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson # thread for a forked process if the original process had its 460dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson # own feeder thread. This test checks that this no longer 461dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson # happens. 462dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 463dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson queue = self.Queue() 464dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 465dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson # put items on queue so that main process starts a feeder thread 466dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson for i in range(10): 467dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson queue.put(i) 468dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 469dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson # wait to make sure thread starts before we fork a new process 470dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson time.sleep(DELTA) 471dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 472dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson # fork process 473dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson p = self.Process(target=self._test_fork, args=(queue,)) 474dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson p.start() 475dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 476dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson # check that all expected items are in the queue 477dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson for i in range(20): 478dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(queue.get(), i) 479dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertRaises(Queue.Empty, queue.get, False) 480dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 481dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson p.join() 482dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 483dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson def test_qsize(self): 484dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson q = self.Queue() 485dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson try: 486dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(q.qsize(), 0) 487dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson except NotImplementedError: 488dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson return 489dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson q.put(1) 490dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(q.qsize(), 1) 491dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson q.put(5) 492dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(q.qsize(), 2) 493dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson q.get() 494dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(q.qsize(), 1) 495dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson q.get() 496dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(q.qsize(), 0) 497dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 498dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson def _test_task_done(self, q): 499dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson for obj in iter(q.get, None): 500dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson time.sleep(DELTA) 501dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson q.task_done() 502dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 503dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson def test_task_done(self): 504dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson queue = self.JoinableQueue() 505dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 506dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson if sys.version_info < (2, 5) and not hasattr(queue, 'task_done'): 507dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson return 508dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 509dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson workers = [self.Process(target=self._test_task_done, args=(queue,)) 510dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson for i in xrange(4)] 511dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 512dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson for p in workers: 513dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson p.start() 514dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 515dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson for i in xrange(10): 516dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson queue.put(i) 517dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 518dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson queue.join() 519dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 520dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson for p in workers: 521dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson queue.put(None) 522dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 523dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson for p in workers: 524dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson p.join() 525dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 526dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# 527dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# 528dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# 529dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 530dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonclass _TestLock(BaseTestCase): 531dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 532dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson def test_lock(self): 533dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson lock = self.Lock() 534dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(lock.acquire(), True) 535dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(lock.acquire(False), False) 536dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(lock.release(), None) 537dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertRaises((ValueError, threading.ThreadError), lock.release) 538dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 539dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson def test_rlock(self): 540dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson lock = self.RLock() 541dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(lock.acquire(), True) 542dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(lock.acquire(), True) 543dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(lock.acquire(), True) 544dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(lock.release(), None) 545dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(lock.release(), None) 546dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(lock.release(), None) 547dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertRaises((AssertionError, RuntimeError), lock.release) 548dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 54982eb5902ce169be81110c79662b772b904cd00fcJesse Noller def test_lock_context(self): 55082eb5902ce169be81110c79662b772b904cd00fcJesse Noller with self.Lock(): 55182eb5902ce169be81110c79662b772b904cd00fcJesse Noller pass 55282eb5902ce169be81110c79662b772b904cd00fcJesse Noller 553dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 554dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonclass _TestSemaphore(BaseTestCase): 555dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 556dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson def _test_semaphore(self, sem): 557dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertReturnsIfImplemented(2, get_value, sem) 558dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(sem.acquire(), True) 559dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertReturnsIfImplemented(1, get_value, sem) 560dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(sem.acquire(), True) 561dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertReturnsIfImplemented(0, get_value, sem) 562dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(sem.acquire(False), False) 563dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertReturnsIfImplemented(0, get_value, sem) 564dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(sem.release(), None) 565dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertReturnsIfImplemented(1, get_value, sem) 566dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(sem.release(), None) 567dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertReturnsIfImplemented(2, get_value, sem) 568dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 569dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson def test_semaphore(self): 570dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson sem = self.Semaphore(2) 571dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self._test_semaphore(sem) 572dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(sem.release(), None) 573dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertReturnsIfImplemented(3, get_value, sem) 574dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(sem.release(), None) 575dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertReturnsIfImplemented(4, get_value, sem) 576dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 577dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson def test_bounded_semaphore(self): 578dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson sem = self.BoundedSemaphore(2) 579dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self._test_semaphore(sem) 580dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson # Currently fails on OS/X 581dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson #if HAVE_GETVALUE: 582dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson # self.assertRaises(ValueError, sem.release) 583dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson # self.assertReturnsIfImplemented(2, get_value, sem) 584dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 585dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson def test_timeout(self): 586dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson if self.TYPE != 'processes': 587dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson return 588dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 589dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson sem = self.Semaphore(0) 590dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson acquire = TimingWrapper(sem.acquire) 591dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 592dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(acquire(False), False) 593dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertTimingAlmostEqual(acquire.elapsed, 0.0) 594dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 595dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(acquire(False, None), False) 596dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertTimingAlmostEqual(acquire.elapsed, 0.0) 597dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 598dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(acquire(False, TIMEOUT1), False) 599dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertTimingAlmostEqual(acquire.elapsed, 0) 600dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 601dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(acquire(True, TIMEOUT2), False) 602dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertTimingAlmostEqual(acquire.elapsed, TIMEOUT2) 603dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 604dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(acquire(timeout=TIMEOUT3), False) 605dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertTimingAlmostEqual(acquire.elapsed, TIMEOUT3) 606dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 607dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 608dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonclass _TestCondition(BaseTestCase): 609dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 610dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson def f(self, cond, sleeping, woken, timeout=None): 611dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson cond.acquire() 612dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson sleeping.release() 613dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson cond.wait(timeout) 614dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson woken.release() 615dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson cond.release() 616dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 617dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson def check_invariant(self, cond): 618dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson # this is only supposed to succeed when there are no sleepers 619dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson if self.TYPE == 'processes': 620dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson try: 621dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson sleepers = (cond._sleeping_count.get_value() - 622dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson cond._woken_count.get_value()) 623dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(sleepers, 0) 624dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(cond._wait_semaphore.get_value(), 0) 625dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson except NotImplementedError: 626dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson pass 627dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 628dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson def test_notify(self): 629dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson cond = self.Condition() 630dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson sleeping = self.Semaphore(0) 631dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson woken = self.Semaphore(0) 632dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 633dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson p = self.Process(target=self.f, args=(cond, sleeping, woken)) 6345bc9f4c09c99eb701dbee83fb9e26eed558e474fJesse Noller p.daemon = True 635dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson p.start() 636dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 637dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson p = threading.Thread(target=self.f, args=(cond, sleeping, woken)) 6385bc9f4c09c99eb701dbee83fb9e26eed558e474fJesse Noller p.daemon = True 639dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson p.start() 640dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 641dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson # wait for both children to start sleeping 642dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson sleeping.acquire() 643dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson sleeping.acquire() 644dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 645dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson # check no process/thread has woken up 646dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson time.sleep(DELTA) 647dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertReturnsIfImplemented(0, get_value, woken) 648dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 649dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson # wake up one process/thread 650dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson cond.acquire() 651dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson cond.notify() 652dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson cond.release() 653dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 654dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson # check one process/thread has woken up 655dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson time.sleep(DELTA) 656dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertReturnsIfImplemented(1, get_value, woken) 657dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 658dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson # wake up another 659dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson cond.acquire() 660dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson cond.notify() 661dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson cond.release() 662dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 663dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson # check other has woken up 664dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson time.sleep(DELTA) 665dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertReturnsIfImplemented(2, get_value, woken) 666dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 667dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson # check state is not mucked up 668dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.check_invariant(cond) 669dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson p.join() 670dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 671dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson def test_notify_all(self): 672dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson cond = self.Condition() 673dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson sleeping = self.Semaphore(0) 674dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson woken = self.Semaphore(0) 675dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 676dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson # start some threads/processes which will timeout 677dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson for i in range(3): 678dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson p = self.Process(target=self.f, 679dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson args=(cond, sleeping, woken, TIMEOUT1)) 6805bc9f4c09c99eb701dbee83fb9e26eed558e474fJesse Noller p.daemon = True 681dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson p.start() 682dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 683dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson t = threading.Thread(target=self.f, 684dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson args=(cond, sleeping, woken, TIMEOUT1)) 685a9b2222de40ed62e6ec1c79f6a89607913f4babdBenjamin Peterson t.daemon = True 686dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson t.start() 687dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 688dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson # wait for them all to sleep 689dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson for i in xrange(6): 690dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson sleeping.acquire() 691dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 692dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson # check they have all timed out 693dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson for i in xrange(6): 694dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson woken.acquire() 695dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertReturnsIfImplemented(0, get_value, woken) 696dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 697dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson # check state is not mucked up 698dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.check_invariant(cond) 699dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 700dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson # start some more threads/processes 701dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson for i in range(3): 702dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson p = self.Process(target=self.f, args=(cond, sleeping, woken)) 7035bc9f4c09c99eb701dbee83fb9e26eed558e474fJesse Noller p.daemon = True 704dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson p.start() 705dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 706dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson t = threading.Thread(target=self.f, args=(cond, sleeping, woken)) 707a9b2222de40ed62e6ec1c79f6a89607913f4babdBenjamin Peterson t.daemon = True 708dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson t.start() 709dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 710dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson # wait for them to all sleep 711dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson for i in xrange(6): 712dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson sleeping.acquire() 713dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 714dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson # check no process/thread has woken up 715dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson time.sleep(DELTA) 716dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertReturnsIfImplemented(0, get_value, woken) 717dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 718dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson # wake them all up 719dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson cond.acquire() 720dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson cond.notify_all() 721dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson cond.release() 722dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 723dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson # check they have all woken 724dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson time.sleep(DELTA) 725dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertReturnsIfImplemented(6, get_value, woken) 726dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 727dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson # check state is not mucked up 728dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.check_invariant(cond) 729dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 730dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson def test_timeout(self): 731dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson cond = self.Condition() 732dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson wait = TimingWrapper(cond.wait) 733dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson cond.acquire() 734dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson res = wait(TIMEOUT1) 735dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson cond.release() 736dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(res, None) 737dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertTimingAlmostEqual(wait.elapsed, TIMEOUT1) 738dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 739dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 740dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonclass _TestEvent(BaseTestCase): 741dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 742dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson def _test_event(self, event): 743dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson time.sleep(TIMEOUT2) 744dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson event.set() 745dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 746dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson def test_event(self): 747dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson event = self.Event() 748dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson wait = TimingWrapper(event.wait) 749dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 750dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson # Removed temporaily, due to API shear, this does not 751dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson # work with threading._Event objects. is_set == isSet 75202cb0eb231fc01e2a50cbe14f6da7a8df52959efJesse Noller self.assertEqual(event.is_set(), False) 753dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 75402cb0eb231fc01e2a50cbe14f6da7a8df52959efJesse Noller # Removed, threading.Event.wait() will return the value of the __flag 75502cb0eb231fc01e2a50cbe14f6da7a8df52959efJesse Noller # instead of None. API Shear with the semaphore backed mp.Event 75602cb0eb231fc01e2a50cbe14f6da7a8df52959efJesse Noller self.assertEqual(wait(0.0), False) 757dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertTimingAlmostEqual(wait.elapsed, 0.0) 75802cb0eb231fc01e2a50cbe14f6da7a8df52959efJesse Noller self.assertEqual(wait(TIMEOUT1), False) 759dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertTimingAlmostEqual(wait.elapsed, TIMEOUT1) 760dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 761dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson event.set() 762dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 763dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson # See note above on the API differences 76402cb0eb231fc01e2a50cbe14f6da7a8df52959efJesse Noller self.assertEqual(event.is_set(), True) 76502cb0eb231fc01e2a50cbe14f6da7a8df52959efJesse Noller self.assertEqual(wait(), True) 766dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertTimingAlmostEqual(wait.elapsed, 0.0) 76702cb0eb231fc01e2a50cbe14f6da7a8df52959efJesse Noller self.assertEqual(wait(TIMEOUT1), True) 768dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertTimingAlmostEqual(wait.elapsed, 0.0) 769dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson # self.assertEqual(event.is_set(), True) 770dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 771dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson event.clear() 772dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 773dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson #self.assertEqual(event.is_set(), False) 774dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 775dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.Process(target=self._test_event, args=(event,)).start() 77602cb0eb231fc01e2a50cbe14f6da7a8df52959efJesse Noller self.assertEqual(wait(), True) 777dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 778dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# 779dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# 780dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# 781dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 782dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonclass _TestValue(BaseTestCase): 783dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 784dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson codes_values = [ 785dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson ('i', 4343, 24234), 786dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson ('d', 3.625, -4.25), 787dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson ('h', -232, 234), 788dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson ('c', latin('x'), latin('y')) 789dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson ] 790dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 791dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson def _test(self, values): 792dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson for sv, cv in zip(values, self.codes_values): 793dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson sv.value = cv[2] 794dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 795dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 796dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson def test_value(self, raw=False): 797dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson if self.TYPE != 'processes': 798dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson return 799dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 800dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson if raw: 801dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson values = [self.RawValue(code, value) 802dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson for code, value, _ in self.codes_values] 803dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson else: 804dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson values = [self.Value(code, value) 805dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson for code, value, _ in self.codes_values] 806dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 807dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson for sv, cv in zip(values, self.codes_values): 808dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(sv.value, cv[1]) 809dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 810dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson proc = self.Process(target=self._test, args=(values,)) 811dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson proc.start() 812dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson proc.join() 813dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 814dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson for sv, cv in zip(values, self.codes_values): 815dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(sv.value, cv[2]) 816dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 817dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson def test_rawvalue(self): 818dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.test_value(raw=True) 819dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 820dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson def test_getobj_getlock(self): 821dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson if self.TYPE != 'processes': 822dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson return 823dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 824dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson val1 = self.Value('i', 5) 825dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson lock1 = val1.get_lock() 826dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson obj1 = val1.get_obj() 827dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 828dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson val2 = self.Value('i', 5, lock=None) 829dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson lock2 = val2.get_lock() 830dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson obj2 = val2.get_obj() 831dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 832dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson lock = self.Lock() 833dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson val3 = self.Value('i', 5, lock=lock) 834dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson lock3 = val3.get_lock() 835dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson obj3 = val3.get_obj() 836dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(lock, lock3) 837dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 8386ab22154ddabdb67bd510a1f2e0aa9c7e0ee607dJesse Noller arr4 = self.Value('i', 5, lock=False) 839dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertFalse(hasattr(arr4, 'get_lock')) 840dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertFalse(hasattr(arr4, 'get_obj')) 841dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 8426ab22154ddabdb67bd510a1f2e0aa9c7e0ee607dJesse Noller self.assertRaises(AttributeError, self.Value, 'i', 5, lock='navalue') 8436ab22154ddabdb67bd510a1f2e0aa9c7e0ee607dJesse Noller 8446ab22154ddabdb67bd510a1f2e0aa9c7e0ee607dJesse Noller arr5 = self.RawValue('i', 5) 8456ab22154ddabdb67bd510a1f2e0aa9c7e0ee607dJesse Noller self.assertFalse(hasattr(arr5, 'get_lock')) 8466ab22154ddabdb67bd510a1f2e0aa9c7e0ee607dJesse Noller self.assertFalse(hasattr(arr5, 'get_obj')) 8476ab22154ddabdb67bd510a1f2e0aa9c7e0ee607dJesse Noller 848dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 849dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonclass _TestArray(BaseTestCase): 850dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 851dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson def f(self, seq): 852dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson for i in range(1, len(seq)): 853dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson seq[i] += seq[i-1] 854dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 855dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson def test_array(self, raw=False): 856dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson if self.TYPE != 'processes': 857dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson return 858dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 859dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson seq = [680, 626, 934, 821, 150, 233, 548, 982, 714, 831] 860dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson if raw: 861dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson arr = self.RawArray('i', seq) 862dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson else: 863dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson arr = self.Array('i', seq) 864dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 865dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(len(arr), len(seq)) 866dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(arr[3], seq[3]) 867dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(list(arr[2:7]), list(seq[2:7])) 868dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 869dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson arr[4:8] = seq[4:8] = array.array('i', [1, 2, 3, 4]) 870dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 871dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(list(arr[:]), seq) 872dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 873dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.f(seq) 874dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 875dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson p = self.Process(target=self.f, args=(arr,)) 876dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson p.start() 877dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson p.join() 878dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 879dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(list(arr[:]), seq) 880dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 881dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson def test_rawarray(self): 882dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.test_array(raw=True) 883dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 884dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson def test_getobj_getlock_obj(self): 885dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson if self.TYPE != 'processes': 886dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson return 887dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 888dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson arr1 = self.Array('i', range(10)) 889dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson lock1 = arr1.get_lock() 890dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson obj1 = arr1.get_obj() 891dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 892dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson arr2 = self.Array('i', range(10), lock=None) 893dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson lock2 = arr2.get_lock() 894dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson obj2 = arr2.get_obj() 895dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 896dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson lock = self.Lock() 897dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson arr3 = self.Array('i', range(10), lock=lock) 898dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson lock3 = arr3.get_lock() 899dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson obj3 = arr3.get_obj() 900dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(lock, lock3) 901dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 9026ab22154ddabdb67bd510a1f2e0aa9c7e0ee607dJesse Noller arr4 = self.Array('i', range(10), lock=False) 903dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertFalse(hasattr(arr4, 'get_lock')) 904dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertFalse(hasattr(arr4, 'get_obj')) 9056ab22154ddabdb67bd510a1f2e0aa9c7e0ee607dJesse Noller self.assertRaises(AttributeError, 9066ab22154ddabdb67bd510a1f2e0aa9c7e0ee607dJesse Noller self.Array, 'i', range(10), lock='notalock') 9076ab22154ddabdb67bd510a1f2e0aa9c7e0ee607dJesse Noller 9086ab22154ddabdb67bd510a1f2e0aa9c7e0ee607dJesse Noller arr5 = self.RawArray('i', range(10)) 9096ab22154ddabdb67bd510a1f2e0aa9c7e0ee607dJesse Noller self.assertFalse(hasattr(arr5, 'get_lock')) 9106ab22154ddabdb67bd510a1f2e0aa9c7e0ee607dJesse Noller self.assertFalse(hasattr(arr5, 'get_obj')) 911dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 912dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# 913dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# 914dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# 915dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 916dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonclass _TestContainers(BaseTestCase): 917dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 918dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson ALLOWED_TYPES = ('manager',) 919dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 920dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson def test_list(self): 921dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson a = self.list(range(10)) 922dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(a[:], range(10)) 923dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 924dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson b = self.list() 925dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(b[:], []) 926dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 927dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson b.extend(range(5)) 928dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(b[:], range(5)) 929dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 930dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(b[2], 2) 931dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(b[2:10], [2,3,4]) 932dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 933dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson b *= 2 934dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(b[:], [0, 1, 2, 3, 4, 0, 1, 2, 3, 4]) 935dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 936dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(b + [5, 6], [0, 1, 2, 3, 4, 0, 1, 2, 3, 4, 5, 6]) 937dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 938dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(a[:], range(10)) 939dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 940dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson d = [a, b] 941dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson e = self.list(d) 942dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual( 943dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson e[:], 944dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson [[0, 1, 2, 3, 4, 5, 6, 7, 8, 9], [0, 1, 2, 3, 4, 0, 1, 2, 3, 4]] 945dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson ) 946dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 947dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson f = self.list([a]) 948dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson a.append('hello') 949dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(f[:], [[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 'hello']]) 950dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 951dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson def test_dict(self): 952dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson d = self.dict() 953dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson indices = range(65, 70) 954dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson for i in indices: 955dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson d[i] = chr(i) 956dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(d.copy(), dict((i, chr(i)) for i in indices)) 957dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(sorted(d.keys()), indices) 958dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(sorted(d.values()), [chr(i) for i in indices]) 959dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(sorted(d.items()), [(i, chr(i)) for i in indices]) 960dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 961dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson def test_namespace(self): 962dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson n = self.Namespace() 963dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson n.name = 'Bob' 964dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson n.job = 'Builder' 965dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson n._hidden = 'hidden' 966dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual((n.name, n.job), ('Bob', 'Builder')) 967dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson del n.job 968dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(str(n), "Namespace(name='Bob')") 969dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertTrue(hasattr(n, 'name')) 970dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertTrue(not hasattr(n, 'job')) 971dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 972dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# 973dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# 974dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# 975dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 976dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersondef sqr(x, wait=0.0): 977dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson time.sleep(wait) 978dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson return x*x 979dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonclass _TestPool(BaseTestCase): 980dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 981dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson def test_apply(self): 982dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson papply = self.pool.apply 983dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(papply(sqr, (5,)), sqr(5)) 984dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(papply(sqr, (), {'x':3}), sqr(x=3)) 985dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 986dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson def test_map(self): 987dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson pmap = self.pool.map 988dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(pmap(sqr, range(10)), map(sqr, range(10))) 989dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(pmap(sqr, range(100), chunksize=20), 990dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson map(sqr, range(100))) 991dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 992dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson def test_async(self): 993dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson res = self.pool.apply_async(sqr, (7, TIMEOUT1,)) 994dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson get = TimingWrapper(res.get) 995dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(get(), 49) 996dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertTimingAlmostEqual(get.elapsed, TIMEOUT1) 997dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 998dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson def test_async_timeout(self): 999dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson res = self.pool.apply_async(sqr, (6, TIMEOUT2 + 0.2)) 1000dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson get = TimingWrapper(res.get) 1001dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertRaises(multiprocessing.TimeoutError, get, timeout=TIMEOUT2) 1002dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertTimingAlmostEqual(get.elapsed, TIMEOUT2) 1003dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1004dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson def test_imap(self): 1005dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson it = self.pool.imap(sqr, range(10)) 1006dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(list(it), map(sqr, range(10))) 1007dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1008dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson it = self.pool.imap(sqr, range(10)) 1009dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson for i in range(10): 1010dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(it.next(), i*i) 1011dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertRaises(StopIteration, it.next) 1012dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1013dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson it = self.pool.imap(sqr, range(1000), chunksize=100) 1014dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson for i in range(1000): 1015dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(it.next(), i*i) 1016dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertRaises(StopIteration, it.next) 1017dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1018dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson def test_imap_unordered(self): 1019dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson it = self.pool.imap_unordered(sqr, range(1000)) 1020dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(sorted(it), map(sqr, range(1000))) 1021dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1022dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson it = self.pool.imap_unordered(sqr, range(1000), chunksize=53) 1023dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(sorted(it), map(sqr, range(1000))) 1024dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1025dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson def test_make_pool(self): 1026dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson p = multiprocessing.Pool(3) 1027dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(3, len(p._pool)) 1028dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson p.close() 1029dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson p.join() 1030dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1031dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson def test_terminate(self): 1032dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson if self.TYPE == 'manager': 1033dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson # On Unix a forked process increfs each shared object to 1034dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson # which its parent process held a reference. If the 1035dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson # forked process gets terminated then there is likely to 1036dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson # be a reference leak. So to prevent 1037dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson # _TestZZZNumberOfObjects from failing we skip this test 1038dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson # when using a manager. 1039dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson return 1040dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1041dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson result = self.pool.map_async( 1042dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson time.sleep, [0.1 for i in range(10000)], chunksize=1 1043dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson ) 1044dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.pool.terminate() 1045dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson join = TimingWrapper(self.pool.join) 1046dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson join() 1047dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertTrue(join.elapsed < 0.2) 1048dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# 1049dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# Test that manager has expected number of shared objects left 1050dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# 1051dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1052dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonclass _TestZZZNumberOfObjects(BaseTestCase): 1053dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson # Because test cases are sorted alphabetically, this one will get 1054dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson # run after all the other tests for the manager. It tests that 1055dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson # there have been no "reference leaks" for the manager's shared 1056dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson # objects. Note the comment in _TestPool.test_terminate(). 1057dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson ALLOWED_TYPES = ('manager',) 1058dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1059dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson def test_number_of_objects(self): 1060dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson EXPECTED_NUMBER = 1 # the pool object is still alive 1061dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson multiprocessing.active_children() # discard dead process objs 1062dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson gc.collect() # do garbage collection 1063dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson refs = self.manager._number_of_objects() 10647314b38168da53863136d1937059fc0ac4883a56Jesse Noller debug_info = self.manager._debug_info() 1065dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson if refs != EXPECTED_NUMBER: 10667fb9640d57f5d96dcaa0d0e6497abc21fa85f37eJesse Noller print self.manager._debug_info() 10677314b38168da53863136d1937059fc0ac4883a56Jesse Noller print debug_info 1068dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1069dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(refs, EXPECTED_NUMBER) 1070dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1071dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# 1072dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# Test of creating a customized manager class 1073dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# 1074dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1075dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonfrom multiprocessing.managers import BaseManager, BaseProxy, RemoteError 1076dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1077dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonclass FooBar(object): 1078dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson def f(self): 1079dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson return 'f()' 1080dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson def g(self): 1081dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson raise ValueError 1082dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson def _h(self): 1083dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson return '_h()' 1084dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1085dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersondef baz(): 1086dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson for i in xrange(10): 1087dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson yield i*i 1088dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1089dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonclass IteratorProxy(BaseProxy): 1090dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson _exposed_ = ('next', '__next__') 1091dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson def __iter__(self): 1092dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson return self 1093dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson def next(self): 1094dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson return self._callmethod('next') 1095dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson def __next__(self): 1096dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson return self._callmethod('__next__') 1097dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1098dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonclass MyManager(BaseManager): 1099dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson pass 1100dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1101dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin PetersonMyManager.register('Foo', callable=FooBar) 1102dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin PetersonMyManager.register('Bar', callable=FooBar, exposed=('f', '_h')) 1103dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin PetersonMyManager.register('baz', callable=baz, proxytype=IteratorProxy) 1104dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1105dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1106dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonclass _TestMyManager(BaseTestCase): 1107dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1108dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson ALLOWED_TYPES = ('manager',) 1109dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1110dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson def test_mymanager(self): 1111dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson manager = MyManager() 1112dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson manager.start() 1113dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1114dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson foo = manager.Foo() 1115dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson bar = manager.Bar() 1116dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson baz = manager.baz() 1117dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1118dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson foo_methods = [name for name in ('f', 'g', '_h') if hasattr(foo, name)] 1119dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson bar_methods = [name for name in ('f', 'g', '_h') if hasattr(bar, name)] 1120dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1121dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(foo_methods, ['f', 'g']) 1122dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(bar_methods, ['f', '_h']) 1123dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1124dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(foo.f(), 'f()') 1125dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertRaises(ValueError, foo.g) 1126dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(foo._callmethod('f'), 'f()') 1127dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertRaises(RemoteError, foo._callmethod, '_h') 1128dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1129dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(bar.f(), 'f()') 1130dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(bar._h(), '_h()') 1131dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(bar._callmethod('f'), 'f()') 1132dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(bar._callmethod('_h'), '_h()') 1133dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1134dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(list(baz), [i*i for i in range(10)]) 1135dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1136dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson manager.shutdown() 1137dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1138dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# 1139dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# Test of connecting to a remote server and using xmlrpclib for serialization 1140dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# 1141dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1142dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson_queue = Queue.Queue() 1143dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersondef get_queue(): 1144dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson return _queue 1145dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1146dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonclass QueueManager(BaseManager): 1147dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson '''manager class used by server process''' 1148dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin PetersonQueueManager.register('get_queue', callable=get_queue) 1149dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1150dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonclass QueueManager2(BaseManager): 1151dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson '''manager class which specifies the same interface as QueueManager''' 1152dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin PetersonQueueManager2.register('get_queue') 1153dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1154dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1155dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin PetersonSERIALIZER = 'xmlrpclib' 1156dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1157dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonclass _TestRemoteManager(BaseTestCase): 1158dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1159dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson ALLOWED_TYPES = ('manager',) 1160dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1161dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson def _putter(self, address, authkey): 1162dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson manager = QueueManager2( 1163dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson address=address, authkey=authkey, serializer=SERIALIZER 1164dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson ) 1165dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson manager.connect() 1166dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson queue = manager.get_queue() 1167dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson queue.put(('hello world', None, True, 2.25)) 1168dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1169dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson def test_remote(self): 1170dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson authkey = os.urandom(32) 1171dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1172dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson manager = QueueManager( 1173dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson address=('localhost', 0), authkey=authkey, serializer=SERIALIZER 1174dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson ) 1175dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson manager.start() 1176dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1177dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson p = self.Process(target=self._putter, args=(manager.address, authkey)) 1178dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson p.start() 1179dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1180dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson manager2 = QueueManager2( 1181dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson address=manager.address, authkey=authkey, serializer=SERIALIZER 1182dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson ) 1183dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson manager2.connect() 1184dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson queue = manager2.get_queue() 1185dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1186dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson # Note that xmlrpclib will deserialize object as a list not a tuple 1187dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(queue.get(), ['hello world', None, True, 2.25]) 1188dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1189dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson # Because we are using xmlrpclib for serialization instead of 1190dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson # pickle this will cause a serialization error. 1191dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertRaises(Exception, queue.put, time.sleep) 1192dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1193dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson # Make queue finalizer run before the server is stopped 1194dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson del queue 1195dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson manager.shutdown() 1196dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1197459a6481662c62d6cb57a070d21230db3e721c56Jesse Nollerclass _TestManagerRestart(BaseTestCase): 1198459a6481662c62d6cb57a070d21230db3e721c56Jesse Noller 1199459a6481662c62d6cb57a070d21230db3e721c56Jesse Noller def _putter(self, address, authkey): 1200459a6481662c62d6cb57a070d21230db3e721c56Jesse Noller manager = QueueManager( 1201459a6481662c62d6cb57a070d21230db3e721c56Jesse Noller address=address, authkey=authkey, serializer=SERIALIZER) 1202459a6481662c62d6cb57a070d21230db3e721c56Jesse Noller manager.connect() 1203459a6481662c62d6cb57a070d21230db3e721c56Jesse Noller queue = manager.get_queue() 1204459a6481662c62d6cb57a070d21230db3e721c56Jesse Noller queue.put('hello world') 1205459a6481662c62d6cb57a070d21230db3e721c56Jesse Noller 1206459a6481662c62d6cb57a070d21230db3e721c56Jesse Noller def test_rapid_restart(self): 1207459a6481662c62d6cb57a070d21230db3e721c56Jesse Noller authkey = os.urandom(32) 1208459a6481662c62d6cb57a070d21230db3e721c56Jesse Noller manager = QueueManager( 1209459a6481662c62d6cb57a070d21230db3e721c56Jesse Noller address=('localhost', 9999), authkey=authkey, serializer=SERIALIZER) 1210459a6481662c62d6cb57a070d21230db3e721c56Jesse Noller manager.start() 1211459a6481662c62d6cb57a070d21230db3e721c56Jesse Noller 1212459a6481662c62d6cb57a070d21230db3e721c56Jesse Noller p = self.Process(target=self._putter, args=(manager.address, authkey)) 1213459a6481662c62d6cb57a070d21230db3e721c56Jesse Noller p.start() 1214459a6481662c62d6cb57a070d21230db3e721c56Jesse Noller queue = manager.get_queue() 1215459a6481662c62d6cb57a070d21230db3e721c56Jesse Noller self.assertEqual(queue.get(), 'hello world') 1216019ce773cd25ee08d1a822f06958774b43881d00Jesse Noller del queue 1217459a6481662c62d6cb57a070d21230db3e721c56Jesse Noller manager.shutdown() 1218459a6481662c62d6cb57a070d21230db3e721c56Jesse Noller manager = QueueManager( 1219459a6481662c62d6cb57a070d21230db3e721c56Jesse Noller address=('localhost', 9999), authkey=authkey, serializer=SERIALIZER) 1220459a6481662c62d6cb57a070d21230db3e721c56Jesse Noller manager.start() 1221019ce773cd25ee08d1a822f06958774b43881d00Jesse Noller manager.shutdown() 1222459a6481662c62d6cb57a070d21230db3e721c56Jesse Noller 1223dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# 1224dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# 1225dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# 1226dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1227dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin PetersonSENTINEL = latin('') 1228dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1229dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonclass _TestConnection(BaseTestCase): 1230dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1231dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson ALLOWED_TYPES = ('processes', 'threads') 1232dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1233dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson def _echo(self, conn): 1234dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson for msg in iter(conn.recv_bytes, SENTINEL): 1235dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson conn.send_bytes(msg) 1236dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson conn.close() 1237dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1238dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson def test_connection(self): 1239dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson conn, child_conn = self.Pipe() 1240dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1241dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson p = self.Process(target=self._echo, args=(child_conn,)) 12425bc9f4c09c99eb701dbee83fb9e26eed558e474fJesse Noller p.daemon = True 1243dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson p.start() 1244dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1245dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson seq = [1, 2.25, None] 1246dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson msg = latin('hello world') 1247dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson longmsg = msg * 10 1248dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson arr = array.array('i', range(4)) 1249dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1250dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson if self.TYPE == 'processes': 1251dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(type(conn.fileno()), int) 1252dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1253dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(conn.send(seq), None) 1254dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(conn.recv(), seq) 1255dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1256dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(conn.send_bytes(msg), None) 1257dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(conn.recv_bytes(), msg) 1258dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1259dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson if self.TYPE == 'processes': 1260dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson buffer = array.array('i', [0]*10) 1261dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson expected = list(arr) + [0] * (10 - len(arr)) 1262dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(conn.send_bytes(arr), None) 1263dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(conn.recv_bytes_into(buffer), 1264dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson len(arr) * buffer.itemsize) 1265dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(list(buffer), expected) 1266dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1267dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson buffer = array.array('i', [0]*10) 1268dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson expected = [0] * 3 + list(arr) + [0] * (10 - 3 - len(arr)) 1269dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(conn.send_bytes(arr), None) 1270dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(conn.recv_bytes_into(buffer, 3 * buffer.itemsize), 1271dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson len(arr) * buffer.itemsize) 1272dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(list(buffer), expected) 1273dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1274dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson buffer = bytearray(latin(' ' * 40)) 1275dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(conn.send_bytes(longmsg), None) 1276dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson try: 1277dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson res = conn.recv_bytes_into(buffer) 1278dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson except multiprocessing.BufferTooShort, e: 1279dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(e.args, (longmsg,)) 1280dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson else: 1281dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.fail('expected BufferTooShort, got %s' % res) 1282dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1283dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson poll = TimingWrapper(conn.poll) 1284dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1285dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(poll(), False) 1286dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertTimingAlmostEqual(poll.elapsed, 0) 1287dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1288dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(poll(TIMEOUT1), False) 1289dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertTimingAlmostEqual(poll.elapsed, TIMEOUT1) 1290dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1291dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson conn.send(None) 1292dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1293dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(poll(TIMEOUT1), True) 1294dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertTimingAlmostEqual(poll.elapsed, 0) 1295dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1296dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(conn.recv(), None) 1297dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1298dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson really_big_msg = latin('X') * (1024 * 1024 * 16) # 16Mb 1299dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson conn.send_bytes(really_big_msg) 1300dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(conn.recv_bytes(), really_big_msg) 1301dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1302dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson conn.send_bytes(SENTINEL) # tell child to quit 1303dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson child_conn.close() 1304dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1305dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson if self.TYPE == 'processes': 1306dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(conn.readable, True) 1307dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(conn.writable, True) 1308dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertRaises(EOFError, conn.recv) 1309dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertRaises(EOFError, conn.recv_bytes) 1310dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1311dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson p.join() 1312dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1313dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson def test_duplex_false(self): 1314dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson reader, writer = self.Pipe(duplex=False) 1315dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(writer.send(1), None) 1316dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(reader.recv(), 1) 1317dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson if self.TYPE == 'processes': 1318dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(reader.readable, True) 1319dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(reader.writable, False) 1320dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(writer.readable, False) 1321dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(writer.writable, True) 1322dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertRaises(IOError, reader.send, 2) 1323dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertRaises(IOError, writer.recv) 1324dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertRaises(IOError, writer.poll) 1325dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1326dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson def test_spawn_close(self): 1327dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson # We test that a pipe connection can be closed by parent 1328dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson # process immediately after child is spawned. On Windows this 1329dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson # would have sometimes failed on old versions because 1330dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson # child_conn would be closed before the child got a chance to 1331dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson # duplicate it. 1332dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson conn, child_conn = self.Pipe() 1333dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1334dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson p = self.Process(target=self._echo, args=(child_conn,)) 1335dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson p.start() 1336dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson child_conn.close() # this might complete before child initializes 1337dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1338dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson msg = latin('hello') 1339dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson conn.send_bytes(msg) 1340dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(conn.recv_bytes(), msg) 1341dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1342dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson conn.send_bytes(SENTINEL) 1343dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson conn.close() 1344dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson p.join() 1345dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1346dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson def test_sendbytes(self): 1347dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson if self.TYPE != 'processes': 1348dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson return 1349dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1350dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson msg = latin('abcdefghijklmnopqrstuvwxyz') 1351dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson a, b = self.Pipe() 1352dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1353dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson a.send_bytes(msg) 1354dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(b.recv_bytes(), msg) 1355dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1356dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson a.send_bytes(msg, 5) 1357dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(b.recv_bytes(), msg[5:]) 1358dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1359dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson a.send_bytes(msg, 7, 8) 1360dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(b.recv_bytes(), msg[7:7+8]) 1361dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1362dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson a.send_bytes(msg, 26) 1363dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(b.recv_bytes(), latin('')) 1364dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1365dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson a.send_bytes(msg, 26, 0) 1366dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(b.recv_bytes(), latin('')) 1367dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1368dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertRaises(ValueError, a.send_bytes, msg, 27) 1369dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1370dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertRaises(ValueError, a.send_bytes, msg, 22, 5) 1371dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1372dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertRaises(ValueError, a.send_bytes, msg, 26, 1) 1373dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1374dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertRaises(ValueError, a.send_bytes, msg, -1) 1375dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1376dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertRaises(ValueError, a.send_bytes, msg, 4, -1) 1377dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1378dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonclass _TestListenerClient(BaseTestCase): 1379dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1380dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson ALLOWED_TYPES = ('processes', 'threads') 1381dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1382dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson def _test(self, address): 1383dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson conn = self.connection.Client(address) 1384dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson conn.send('hello') 1385dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson conn.close() 1386dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1387dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson def test_listener_client(self): 1388dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson for family in self.connection.families: 1389dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson l = self.connection.Listener(family=family) 1390dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson p = self.Process(target=self._test, args=(l.address,)) 13915bc9f4c09c99eb701dbee83fb9e26eed558e474fJesse Noller p.daemon = True 1392dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson p.start() 1393dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson conn = l.accept() 1394dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(conn.recv(), 'hello') 1395dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson p.join() 1396dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson l.close() 1397dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# 1398dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# Test of sending connection and socket objects between processes 1399dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# 1400da3a1b120055855a464c2d5f5143021ae8f5dc86Benjamin Peterson""" 1401dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonclass _TestPicklingConnections(BaseTestCase): 1402dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1403dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson ALLOWED_TYPES = ('processes',) 1404dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1405dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson def _listener(self, conn, families): 1406dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson for fam in families: 1407dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson l = self.connection.Listener(family=fam) 1408dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson conn.send(l.address) 1409dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson new_conn = l.accept() 1410dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson conn.send(new_conn) 1411dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1412dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson if self.TYPE == 'processes': 1413dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson l = socket.socket() 1414dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson l.bind(('localhost', 0)) 1415dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson conn.send(l.getsockname()) 1416dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson l.listen(1) 1417dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson new_conn, addr = l.accept() 1418dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson conn.send(new_conn) 1419dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1420dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson conn.recv() 1421dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1422dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson def _remote(self, conn): 1423dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson for (address, msg) in iter(conn.recv, None): 1424dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson client = self.connection.Client(address) 1425dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson client.send(msg.upper()) 1426dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson client.close() 1427dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1428dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson if self.TYPE == 'processes': 1429dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson address, msg = conn.recv() 1430dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson client = socket.socket() 1431dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson client.connect(address) 1432dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson client.sendall(msg.upper()) 1433dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson client.close() 1434dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1435dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson conn.close() 1436dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1437dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson def test_pickling(self): 1438dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson try: 1439dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson multiprocessing.allow_connection_pickling() 1440dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson except ImportError: 1441dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson return 1442dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1443dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson families = self.connection.families 1444dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1445dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson lconn, lconn0 = self.Pipe() 1446dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson lp = self.Process(target=self._listener, args=(lconn0, families)) 1447dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson lp.start() 1448dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson lconn0.close() 1449dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1450dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson rconn, rconn0 = self.Pipe() 1451dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson rp = self.Process(target=self._remote, args=(rconn0,)) 1452dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson rp.start() 1453dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson rconn0.close() 1454dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1455dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson for fam in families: 1456dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson msg = ('This connection uses family %s' % fam).encode('ascii') 1457dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson address = lconn.recv() 1458dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson rconn.send((address, msg)) 1459dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson new_conn = lconn.recv() 1460dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(new_conn.recv(), msg.upper()) 1461dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1462dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson rconn.send(None) 1463dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1464dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson if self.TYPE == 'processes': 1465dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson msg = latin('This connection uses a normal socket') 1466dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson address = lconn.recv() 1467dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson rconn.send((address, msg)) 1468dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson if hasattr(socket, 'fromfd'): 1469dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson new_conn = lconn.recv() 1470dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(new_conn.recv(100), msg.upper()) 1471dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson else: 1472dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson # XXX On Windows with Py2.6 need to backport fromfd() 1473dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson discard = lconn.recv_bytes() 1474dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1475dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson lconn.send(None) 1476dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1477dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson rconn.close() 1478dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson lconn.close() 1479dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1480dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson lp.join() 1481dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson rp.join() 1482da3a1b120055855a464c2d5f5143021ae8f5dc86Benjamin Peterson""" 1483dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# 1484dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# 1485dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# 1486dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1487dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonclass _TestHeap(BaseTestCase): 1488dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1489dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson ALLOWED_TYPES = ('processes',) 1490dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1491dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson def test_heap(self): 1492dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson iterations = 5000 1493dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson maxblocks = 50 1494dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson blocks = [] 1495dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1496dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson # create and destroy lots of blocks of different sizes 1497dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson for i in xrange(iterations): 1498dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson size = int(random.lognormvariate(0, 1) * 1000) 1499dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson b = multiprocessing.heap.BufferWrapper(size) 1500dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson blocks.append(b) 1501dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson if len(blocks) > maxblocks: 1502dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson i = random.randrange(maxblocks) 1503dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson del blocks[i] 1504dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1505dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson # get the heap object 1506dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson heap = multiprocessing.heap.BufferWrapper._heap 1507dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1508dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson # verify the state of the heap 1509dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson all = [] 1510dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson occupied = 0 1511dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson for L in heap._len_to_seq.values(): 1512dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson for arena, start, stop in L: 1513dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson all.append((heap._arenas.index(arena), start, stop, 1514dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson stop-start, 'free')) 1515dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson for arena, start, stop in heap._allocated_blocks: 1516dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson all.append((heap._arenas.index(arena), start, stop, 1517dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson stop-start, 'occupied')) 1518dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson occupied += (stop-start) 1519dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1520dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson all.sort() 1521dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1522dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson for i in range(len(all)-1): 1523dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson (arena, start, stop) = all[i][:3] 1524dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson (narena, nstart, nstop) = all[i+1][:3] 1525dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertTrue((arena != narena and nstart == 0) or 1526dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson (stop == nstart)) 1527dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1528dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# 1529dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# 1530dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# 1531dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1532dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersontry: 1533dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson from ctypes import Structure, Value, copy, c_int, c_double 1534dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonexcept ImportError: 1535dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson Structure = object 1536dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson c_int = c_double = None 1537dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1538dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonclass _Foo(Structure): 1539dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson _fields_ = [ 1540dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson ('x', c_int), 1541dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson ('y', c_double) 1542dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson ] 1543dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1544dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonclass _TestSharedCTypes(BaseTestCase): 1545dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1546dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson ALLOWED_TYPES = ('processes',) 1547dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1548dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson def _double(self, x, y, foo, arr, string): 1549dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson x.value *= 2 1550dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson y.value *= 2 1551dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson foo.x *= 2 1552dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson foo.y *= 2 1553dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson string.value *= 2 1554dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson for i in range(len(arr)): 1555dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson arr[i] *= 2 1556dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1557dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson def test_sharedctypes(self, lock=False): 1558dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson if c_int is None: 1559dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson return 1560dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1561dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson x = Value('i', 7, lock=lock) 1562dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson y = Value(ctypes.c_double, 1.0/3.0, lock=lock) 1563dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson foo = Value(_Foo, 3, 2, lock=lock) 1564dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson arr = Array('d', range(10), lock=lock) 1565dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson string = Array('c', 20, lock=lock) 1566dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson string.value = 'hello' 1567dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1568dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson p = self.Process(target=self._double, args=(x, y, foo, arr, string)) 1569dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson p.start() 1570dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson p.join() 1571dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1572dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(x.value, 14) 1573dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertAlmostEqual(y.value, 2.0/3.0) 1574dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(foo.x, 6) 1575dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertAlmostEqual(foo.y, 4.0) 1576dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson for i in range(10): 1577dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertAlmostEqual(arr[i], i*2) 1578dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(string.value, latin('hellohello')) 1579dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1580dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson def test_synchronize(self): 1581dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.test_sharedctypes(lock=True) 1582dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1583dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson def test_copy(self): 1584dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson if c_int is None: 1585dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson return 1586dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1587dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson foo = _Foo(2, 5.0) 1588dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson bar = copy(foo) 1589dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson foo.x = 0 1590dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson foo.y = 0 1591dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(bar.x, 2) 1592dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertAlmostEqual(bar.y, 5.0) 1593dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1594dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# 1595dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# 1596dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# 1597dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1598dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonclass _TestFinalize(BaseTestCase): 1599dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1600dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson ALLOWED_TYPES = ('processes',) 1601dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1602dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson def _test_finalize(self, conn): 1603dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson class Foo(object): 1604dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson pass 1605dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1606dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson a = Foo() 1607dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson util.Finalize(a, conn.send, args=('a',)) 1608dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson del a # triggers callback for a 1609dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1610dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson b = Foo() 1611dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson close_b = util.Finalize(b, conn.send, args=('b',)) 1612dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson close_b() # triggers callback for b 1613dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson close_b() # does nothing because callback has already been called 1614dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson del b # does nothing because callback has already been called 1615dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1616dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson c = Foo() 1617dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson util.Finalize(c, conn.send, args=('c',)) 1618dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1619dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson d10 = Foo() 1620dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson util.Finalize(d10, conn.send, args=('d10',), exitpriority=1) 1621dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1622dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson d01 = Foo() 1623dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson util.Finalize(d01, conn.send, args=('d01',), exitpriority=0) 1624dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson d02 = Foo() 1625dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson util.Finalize(d02, conn.send, args=('d02',), exitpriority=0) 1626dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson d03 = Foo() 1627dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson util.Finalize(d03, conn.send, args=('d03',), exitpriority=0) 1628dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1629dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson util.Finalize(None, conn.send, args=('e',), exitpriority=-10) 1630dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1631dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson util.Finalize(None, conn.send, args=('STOP',), exitpriority=-100) 1632dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1633dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson # call mutliprocessing's cleanup function then exit process without 1634dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson # garbage collecting locals 1635dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson util._exit_function() 1636dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson conn.close() 1637dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson os._exit(0) 1638dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1639dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson def test_finalize(self): 1640dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson conn, child_conn = self.Pipe() 1641dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1642dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson p = self.Process(target=self._test_finalize, args=(child_conn,)) 1643dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson p.start() 1644dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson p.join() 1645dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1646dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson result = [obj for obj in iter(conn.recv, 'STOP')] 1647dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(result, ['a', 'b', 'd10', 'd03', 'd02', 'd01', 'e']) 1648dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1649dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# 1650dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# Test that from ... import * works for each module 1651dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# 1652dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1653dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonclass _TestImportStar(BaseTestCase): 1654dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1655dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson ALLOWED_TYPES = ('processes',) 1656dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1657dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson def test_import(self): 1658dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson modules = ( 1659dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 'multiprocessing', 'multiprocessing.connection', 1660dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 'multiprocessing.heap', 'multiprocessing.managers', 1661dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 'multiprocessing.pool', 'multiprocessing.process', 1662dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 'multiprocessing.reduction', 'multiprocessing.sharedctypes', 1663dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 'multiprocessing.synchronize', 'multiprocessing.util' 1664dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson ) 1665dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1666dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson for name in modules: 1667dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson __import__(name) 1668dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson mod = sys.modules[name] 1669dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1670dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson for attr in getattr(mod, '__all__', ()): 1671dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertTrue( 1672dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson hasattr(mod, attr), 1673dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson '%r does not have attribute %r' % (mod, attr) 1674dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson ) 1675dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1676dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# 1677dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# Quick test that logging works -- does not test logging output 1678dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# 1679dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1680dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonclass _TestLogging(BaseTestCase): 1681dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1682dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson ALLOWED_TYPES = ('processes',) 1683dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1684dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson def test_enable_logging(self): 1685dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson logger = multiprocessing.get_logger() 1686dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson logger.setLevel(util.SUBWARNING) 1687dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertTrue(logger is not None) 1688dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson logger.debug('this will not be printed') 1689dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson logger.info('nor will this') 1690dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson logger.setLevel(LOG_LEVEL) 1691dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1692dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson def _test_level(self, conn): 1693dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson logger = multiprocessing.get_logger() 1694dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson conn.send(logger.getEffectiveLevel()) 1695dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1696dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson def test_level(self): 1697dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson LEVEL1 = 32 1698dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson LEVEL2 = 37 1699dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1700dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson logger = multiprocessing.get_logger() 1701dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson root_logger = logging.getLogger() 1702dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson root_level = root_logger.level 1703dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1704dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson reader, writer = multiprocessing.Pipe(duplex=False) 1705dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1706dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson logger.setLevel(LEVEL1) 1707dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.Process(target=self._test_level, args=(writer,)).start() 1708dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(LEVEL1, reader.recv()) 1709dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1710dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson logger.setLevel(logging.NOTSET) 1711dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson root_logger.setLevel(LEVEL2) 1712dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.Process(target=self._test_level, args=(writer,)).start() 1713dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson self.assertEqual(LEVEL2, reader.recv()) 1714dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1715dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson root_logger.setLevel(root_level) 1716dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson logger.setLevel(level=LOG_LEVEL) 1717dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1718dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# 17199a5b2ad38d605206f05a52fe32868d3f839e8a86Jesse Noller# Test to verify handle verification, see issue 3321 17209a5b2ad38d605206f05a52fe32868d3f839e8a86Jesse Noller# 17219a5b2ad38d605206f05a52fe32868d3f839e8a86Jesse Noller 17229a5b2ad38d605206f05a52fe32868d3f839e8a86Jesse Nollerclass TestInvalidHandle(unittest.TestCase): 17239a5b2ad38d605206f05a52fe32868d3f839e8a86Jesse Noller 17249a5b2ad38d605206f05a52fe32868d3f839e8a86Jesse Noller def test_invalid_handles(self): 17259a5b2ad38d605206f05a52fe32868d3f839e8a86Jesse Noller if WIN32: 17269a5b2ad38d605206f05a52fe32868d3f839e8a86Jesse Noller return 17279a5b2ad38d605206f05a52fe32868d3f839e8a86Jesse Noller conn = _multiprocessing.Connection(44977608) 17289a5b2ad38d605206f05a52fe32868d3f839e8a86Jesse Noller self.assertRaises(IOError, conn.poll) 17299a5b2ad38d605206f05a52fe32868d3f839e8a86Jesse Noller self.assertRaises(IOError, _multiprocessing.Connection, -1) 17309a5b2ad38d605206f05a52fe32868d3f839e8a86Jesse Noller# 1731dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# Functions used to create test cases from the base ones in this module 1732dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# 1733dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1734dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersondef get_attributes(Source, names): 1735dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson d = {} 1736dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson for name in names: 1737dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson obj = getattr(Source, name) 1738dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson if type(obj) == type(get_attributes): 1739dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson obj = staticmethod(obj) 1740dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson d[name] = obj 1741dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson return d 1742dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1743dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersondef create_test_cases(Mixin, type): 1744dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson result = {} 1745dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson glob = globals() 1746dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson Type = type[0].upper() + type[1:] 1747dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1748dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson for name in glob.keys(): 1749dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson if name.startswith('_Test'): 1750dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson base = glob[name] 1751dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson if type in base.ALLOWED_TYPES: 1752dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson newname = 'With' + Type + name[1:] 1753dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson class Temp(base, unittest.TestCase, Mixin): 1754dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson pass 1755dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson result[newname] = Temp 1756dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson Temp.__name__ = newname 1757dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson Temp.__module__ = Mixin.__module__ 1758dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson return result 1759dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1760dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# 1761dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# Create test cases 1762dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# 1763dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1764dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonclass ProcessesMixin(object): 1765dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson TYPE = 'processes' 1766dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson Process = multiprocessing.Process 1767dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson locals().update(get_attributes(multiprocessing, ( 1768dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 'Queue', 'Lock', 'RLock', 'Semaphore', 'BoundedSemaphore', 1769dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 'Condition', 'Event', 'Value', 'Array', 'RawValue', 1770dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 'RawArray', 'current_process', 'active_children', 'Pipe', 1771dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 'connection', 'JoinableQueue' 1772dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson ))) 1773dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1774dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersontestcases_processes = create_test_cases(ProcessesMixin, type='processes') 1775dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonglobals().update(testcases_processes) 1776dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1777dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1778dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonclass ManagerMixin(object): 1779dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson TYPE = 'manager' 1780dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson Process = multiprocessing.Process 1781dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson manager = object.__new__(multiprocessing.managers.SyncManager) 1782dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson locals().update(get_attributes(manager, ( 1783dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 'Queue', 'Lock', 'RLock', 'Semaphore', 'BoundedSemaphore', 1784dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 'Condition', 'Event', 'Value', 'Array', 'list', 'dict', 1785dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 'Namespace', 'JoinableQueue' 1786dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson ))) 1787dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1788dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersontestcases_manager = create_test_cases(ManagerMixin, type='manager') 1789dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonglobals().update(testcases_manager) 1790dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1791dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1792dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonclass ThreadsMixin(object): 1793dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson TYPE = 'threads' 1794dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson Process = multiprocessing.dummy.Process 1795dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson locals().update(get_attributes(multiprocessing.dummy, ( 1796dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 'Queue', 'Lock', 'RLock', 'Semaphore', 'BoundedSemaphore', 1797dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 'Condition', 'Event', 'Value', 'Array', 'current_process', 1798dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 'active_children', 'Pipe', 'connection', 'dict', 'list', 1799dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 'Namespace', 'JoinableQueue' 1800dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson ))) 1801dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1802dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersontestcases_threads = create_test_cases(ThreadsMixin, type='threads') 1803dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonglobals().update(testcases_threads) 1804dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 18050c519b3a5e847eea0dffb51ac8df7c68891daf70Neal Norwitzclass OtherTest(unittest.TestCase): 18060c519b3a5e847eea0dffb51ac8df7c68891daf70Neal Norwitz # TODO: add more tests for deliver/answer challenge. 18070c519b3a5e847eea0dffb51ac8df7c68891daf70Neal Norwitz def test_deliver_challenge_auth_failure(self): 18080c519b3a5e847eea0dffb51ac8df7c68891daf70Neal Norwitz class _FakeConnection(object): 18090c519b3a5e847eea0dffb51ac8df7c68891daf70Neal Norwitz def recv_bytes(self, size): 18102a7767a17311cada06240a187c8896bdbcc1a4d0Neal Norwitz return b'something bogus' 18110c519b3a5e847eea0dffb51ac8df7c68891daf70Neal Norwitz def send_bytes(self, data): 18120c519b3a5e847eea0dffb51ac8df7c68891daf70Neal Norwitz pass 18130c519b3a5e847eea0dffb51ac8df7c68891daf70Neal Norwitz self.assertRaises(multiprocessing.AuthenticationError, 18140c519b3a5e847eea0dffb51ac8df7c68891daf70Neal Norwitz multiprocessing.connection.deliver_challenge, 18150c519b3a5e847eea0dffb51ac8df7c68891daf70Neal Norwitz _FakeConnection(), b'abc') 18160c519b3a5e847eea0dffb51ac8df7c68891daf70Neal Norwitz 18170c519b3a5e847eea0dffb51ac8df7c68891daf70Neal Norwitz def test_answer_challenge_auth_failure(self): 18180c519b3a5e847eea0dffb51ac8df7c68891daf70Neal Norwitz class _FakeConnection(object): 18190c519b3a5e847eea0dffb51ac8df7c68891daf70Neal Norwitz def __init__(self): 18200c519b3a5e847eea0dffb51ac8df7c68891daf70Neal Norwitz self.count = 0 18210c519b3a5e847eea0dffb51ac8df7c68891daf70Neal Norwitz def recv_bytes(self, size): 18220c519b3a5e847eea0dffb51ac8df7c68891daf70Neal Norwitz self.count += 1 18230c519b3a5e847eea0dffb51ac8df7c68891daf70Neal Norwitz if self.count == 1: 18240c519b3a5e847eea0dffb51ac8df7c68891daf70Neal Norwitz return multiprocessing.connection.CHALLENGE 18250c519b3a5e847eea0dffb51ac8df7c68891daf70Neal Norwitz elif self.count == 2: 18262a7767a17311cada06240a187c8896bdbcc1a4d0Neal Norwitz return b'something bogus' 18272a7767a17311cada06240a187c8896bdbcc1a4d0Neal Norwitz return b'' 18280c519b3a5e847eea0dffb51ac8df7c68891daf70Neal Norwitz def send_bytes(self, data): 18290c519b3a5e847eea0dffb51ac8df7c68891daf70Neal Norwitz pass 18300c519b3a5e847eea0dffb51ac8df7c68891daf70Neal Norwitz self.assertRaises(multiprocessing.AuthenticationError, 18310c519b3a5e847eea0dffb51ac8df7c68891daf70Neal Norwitz multiprocessing.connection.answer_challenge, 18320c519b3a5e847eea0dffb51ac8df7c68891daf70Neal Norwitz _FakeConnection(), b'abc') 18330c519b3a5e847eea0dffb51ac8df7c68891daf70Neal Norwitz 18349a5b2ad38d605206f05a52fe32868d3f839e8a86Jesse Nollertestcases_other = [OtherTest, TestInvalidHandle] 18350c519b3a5e847eea0dffb51ac8df7c68891daf70Neal Norwitz 1836dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# 1837dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# 1838dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson# 1839dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1840dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersondef test_main(run=None): 184118623825d25b0f8f3b4bf96c1d5c4c2977a94004Jesse Noller if sys.platform.startswith("linux"): 184218623825d25b0f8f3b4bf96c1d5c4c2977a94004Jesse Noller try: 184318623825d25b0f8f3b4bf96c1d5c4c2977a94004Jesse Noller lock = multiprocessing.RLock() 184418623825d25b0f8f3b4bf96c1d5c4c2977a94004Jesse Noller except OSError: 1845888a39b54c4f47ee25d53b157e2c50402627cd0bBenjamin Peterson from test.test_support import SkipTest 1846bec087f29d7dca0aaf8f51be7d7c135e9b84e7f1Benjamin Peterson raise unittest.SkipTest("OSError raises on RLock creation, see issue 3111!") 1847ed77f2e143102df58212ff1f64a87f7e0c237439Benjamin Peterson 1848dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson if run is None: 1849dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson from test.test_support import run_unittest as run 1850dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1851dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson util.get_temp_dir() # creates temp directory for use by all processes 1852dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1853dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson multiprocessing.get_logger().setLevel(LOG_LEVEL) 1854dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1855146b7ab818cadccf91ad98e64cfefb77705da0caJesse Noller ProcessesMixin.pool = multiprocessing.Pool(4) 1856146b7ab818cadccf91ad98e64cfefb77705da0caJesse Noller ThreadsMixin.pool = multiprocessing.dummy.Pool(4) 1857146b7ab818cadccf91ad98e64cfefb77705da0caJesse Noller ManagerMixin.manager.__init__() 1858146b7ab818cadccf91ad98e64cfefb77705da0caJesse Noller ManagerMixin.manager.start() 1859146b7ab818cadccf91ad98e64cfefb77705da0caJesse Noller ManagerMixin.pool = ManagerMixin.manager.Pool(4) 1860dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1861dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson testcases = ( 1862146b7ab818cadccf91ad98e64cfefb77705da0caJesse Noller sorted(testcases_processes.values(), key=lambda tc:tc.__name__) + 1863146b7ab818cadccf91ad98e64cfefb77705da0caJesse Noller sorted(testcases_threads.values(), key=lambda tc:tc.__name__) + 18640c519b3a5e847eea0dffb51ac8df7c68891daf70Neal Norwitz sorted(testcases_manager.values(), key=lambda tc:tc.__name__) + 18650c519b3a5e847eea0dffb51ac8df7c68891daf70Neal Norwitz testcases_other 1866dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson ) 1867dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1868dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson loadTestsFromTestCase = unittest.defaultTestLoader.loadTestsFromTestCase 1869dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson suite = unittest.TestSuite(loadTestsFromTestCase(tc) for tc in testcases) 1870dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson run(suite) 1871dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1872146b7ab818cadccf91ad98e64cfefb77705da0caJesse Noller ThreadsMixin.pool.terminate() 1873146b7ab818cadccf91ad98e64cfefb77705da0caJesse Noller ProcessesMixin.pool.terminate() 1874146b7ab818cadccf91ad98e64cfefb77705da0caJesse Noller ManagerMixin.pool.terminate() 1875146b7ab818cadccf91ad98e64cfefb77705da0caJesse Noller ManagerMixin.manager.shutdown() 1876dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1877146b7ab818cadccf91ad98e64cfefb77705da0caJesse Noller del ProcessesMixin.pool, ThreadsMixin.pool, ManagerMixin.pool 1878dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1879dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersondef main(): 1880dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson test_main(unittest.TextTestRunner(verbosity=2).run) 1881dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson 1882dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Petersonif __name__ == '__main__': 1883dfd79494ce78868c937dc91eddd630cbdcae5611Benjamin Peterson main() 1884