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