1ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh#!/usr/bin/env python 2ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 3ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh# 4ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh# Unit tests for the multiprocessing package 5ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh# 6ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 7ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehimport unittest 8ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehimport Queue 9ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehimport time 10ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehimport sys 11ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehimport os 12ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehimport gc 13ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehimport signal 14ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehimport array 15ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehimport socket 16ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehimport random 17ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehimport logging 18ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehimport errno 19ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehimport test.script_helper 20ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehfrom test import test_support 21ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehfrom StringIO import StringIO 22ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh_multiprocessing = test_support.import_module('_multiprocessing') 23ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh# import threading after _multiprocessing to raise a more relevant error 24ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh# message: "No module named _multiprocessing". _multiprocessing is not compiled 25ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh# without thread support. 26ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehimport threading 27ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 28ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh# Work around broken sem_open implementations 29ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehtest_support.import_module('multiprocessing.synchronize') 30ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 31ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehimport multiprocessing.dummy 32ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehimport multiprocessing.connection 33ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehimport multiprocessing.managers 34ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehimport multiprocessing.heap 35ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehimport multiprocessing.pool 36ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 37ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehfrom multiprocessing import util 38ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 39ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehtry: 40ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh from multiprocessing import reduction 41ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh HAS_REDUCTION = True 42ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehexcept ImportError: 43ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh HAS_REDUCTION = False 44ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 45ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehtry: 46ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh from multiprocessing.sharedctypes import Value, copy 47ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh HAS_SHAREDCTYPES = True 48ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehexcept ImportError: 49ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh HAS_SHAREDCTYPES = False 50ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 51ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehtry: 52ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh import msvcrt 53ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehexcept ImportError: 54ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh msvcrt = None 55ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 56ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh# 57ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh# 58ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh# 59ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 60ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehlatin = str 61ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 62ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh# 63ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh# Constants 64ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh# 65ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 66ffab958fd8d42ed7227d83007350e61555a1fa36Andrew HsiehLOG_LEVEL = util.SUBWARNING 67ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh#LOG_LEVEL = logging.DEBUG 68ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 69ffab958fd8d42ed7227d83007350e61555a1fa36Andrew HsiehDELTA = 0.1 70ffab958fd8d42ed7227d83007350e61555a1fa36Andrew HsiehCHECK_TIMINGS = False # making true makes tests take a lot longer 71ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # and can sometimes cause some non-serious 72ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # failures because some calls block a bit 73ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # longer than expected 74ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehif CHECK_TIMINGS: 75ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh TIMEOUT1, TIMEOUT2, TIMEOUT3 = 0.82, 0.35, 1.4 76ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehelse: 77ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh TIMEOUT1, TIMEOUT2, TIMEOUT3 = 0.1, 0.1, 0.1 78ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 79ffab958fd8d42ed7227d83007350e61555a1fa36Andrew HsiehHAVE_GETVALUE = not getattr(_multiprocessing, 80ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 'HAVE_BROKEN_SEM_GETVALUE', False) 81ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 82ffab958fd8d42ed7227d83007350e61555a1fa36Andrew HsiehWIN32 = (sys.platform == "win32") 83ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 84ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehtry: 85ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh MAXFD = os.sysconf("SC_OPEN_MAX") 86ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehexcept: 87ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh MAXFD = 256 88ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 89ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh# 90ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh# Some tests require ctypes 91ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh# 92ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 93ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehtry: 94ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh from ctypes import Structure, c_int, c_double 95ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehexcept ImportError: 96ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh Structure = object 97ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh c_int = c_double = None 98ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 99ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 100ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehdef check_enough_semaphores(): 101ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh """Check that the system supports enough semaphores to run the test.""" 102ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # minimum number of semaphores available according to POSIX 103ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh nsems_min = 256 104ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh try: 105ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh nsems = os.sysconf("SC_SEM_NSEMS_MAX") 106ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh except (AttributeError, ValueError): 107ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # sysconf not available or setting not available 108ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh return 109ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh if nsems == -1 or nsems >= nsems_min: 110ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh return 111ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh raise unittest.SkipTest("The OS doesn't support enough semaphores " 112ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh "to run the test (required: %d)." % nsems_min) 113ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 114ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 115ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh# 116ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh# Creates a wrapper for a function which records the time it takes to finish 117ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh# 118ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 119ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehclass TimingWrapper(object): 120ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 121ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh def __init__(self, func): 122ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.func = func 123ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.elapsed = None 124ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 125ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh def __call__(self, *args, **kwds): 126ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh t = time.time() 127ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh try: 128ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh return self.func(*args, **kwds) 129ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh finally: 130ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.elapsed = time.time() - t 131ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 132ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh# 133ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh# Base class for test cases 134ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh# 135ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 136ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehclass BaseTestCase(object): 137ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 138ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh ALLOWED_TYPES = ('processes', 'manager', 'threads') 139ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 140ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh def assertTimingAlmostEqual(self, a, b): 141ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh if CHECK_TIMINGS: 142ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertAlmostEqual(a, b, 1) 143ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 144ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh def assertReturnsIfImplemented(self, value, func, *args): 145ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh try: 146ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh res = func(*args) 147ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh except NotImplementedError: 148ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh pass 149ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh else: 150ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh return self.assertEqual(value, res) 151ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 152ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # For the sanity of Windows users, rather than crashing or freezing in 153ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # multiple ways. 154ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh def __reduce__(self, *args): 155ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh raise NotImplementedError("shouldn't try to pickle a test case") 156ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 157ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh __reduce_ex__ = __reduce__ 158ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 159ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh# 160ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh# Return the value of a semaphore 161ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh# 162ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 163ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehdef get_value(self): 164ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh try: 165ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh return self.get_value() 166ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh except AttributeError: 167ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh try: 168ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh return self._Semaphore__value 169ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh except AttributeError: 170ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh try: 171ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh return self._value 172ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh except AttributeError: 173ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh raise NotImplementedError 174ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 175ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh# 176ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh# Testcases 177ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh# 178ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 179ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehclass _TestProcess(BaseTestCase): 180ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 181ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh ALLOWED_TYPES = ('processes', 'threads') 182ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 183ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh def test_current(self): 184ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh if self.TYPE == 'threads': 185ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh return 186ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 187ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh current = self.current_process() 188ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh authkey = current.authkey 189ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 190ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertTrue(current.is_alive()) 191ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertTrue(not current.daemon) 192ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertIsInstance(authkey, bytes) 193ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertTrue(len(authkey) > 0) 194ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(current.ident, os.getpid()) 195ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(current.exitcode, None) 196ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 197ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh @classmethod 198ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh def _test(cls, q, *args, **kwds): 199ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh current = cls.current_process() 200ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh q.put(args) 201ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh q.put(kwds) 202ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh q.put(current.name) 203ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh if cls.TYPE != 'threads': 204ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh q.put(bytes(current.authkey)) 205ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh q.put(current.pid) 206ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 207ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh def test_process(self): 208ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh q = self.Queue(1) 209ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh e = self.Event() 210ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh args = (q, 1, 2) 211ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh kwargs = {'hello':23, 'bye':2.54} 212ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh name = 'SomeProcess' 213ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh p = self.Process( 214ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh target=self._test, args=args, kwargs=kwargs, name=name 215ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh ) 216ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh p.daemon = True 217ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh current = self.current_process() 218ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 219ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh if self.TYPE != 'threads': 220ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(p.authkey, current.authkey) 221ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(p.is_alive(), False) 222ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(p.daemon, True) 223ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertNotIn(p, self.active_children()) 224ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertTrue(type(self.active_children()) is list) 225ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(p.exitcode, None) 226ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 227ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh p.start() 228ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 229ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(p.exitcode, None) 230ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(p.is_alive(), True) 231ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertIn(p, self.active_children()) 232ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 233ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(q.get(), args[1:]) 234ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(q.get(), kwargs) 235ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(q.get(), p.name) 236ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh if self.TYPE != 'threads': 237ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(q.get(), current.authkey) 238ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(q.get(), p.pid) 239ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 240ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh p.join() 241ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 242ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(p.exitcode, 0) 243ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(p.is_alive(), False) 244ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertNotIn(p, self.active_children()) 245ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 246ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh @classmethod 247ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh def _test_terminate(cls): 248ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh time.sleep(1000) 249ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 250ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh def test_terminate(self): 251ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh if self.TYPE == 'threads': 252ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh return 253ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 254ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh p = self.Process(target=self._test_terminate) 255ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh p.daemon = True 256ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh p.start() 257ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 258ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(p.is_alive(), True) 259ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertIn(p, self.active_children()) 260ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(p.exitcode, None) 261ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 262ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh p.terminate() 263ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 264ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh join = TimingWrapper(p.join) 265ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(join(), None) 266ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertTimingAlmostEqual(join.elapsed, 0.0) 267ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 268ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(p.is_alive(), False) 269ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertNotIn(p, self.active_children()) 270ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 271ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh p.join() 272ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 273ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # XXX sometimes get p.exitcode == 0 on Windows ... 274ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh #self.assertEqual(p.exitcode, -signal.SIGTERM) 275ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 276ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh def test_cpu_count(self): 277ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh try: 278ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh cpus = multiprocessing.cpu_count() 279ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh except NotImplementedError: 280ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh cpus = 1 281ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertTrue(type(cpus) is int) 282ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertTrue(cpus >= 1) 283ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 284ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh def test_active_children(self): 285ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(type(self.active_children()), list) 286ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 287ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh p = self.Process(target=time.sleep, args=(DELTA,)) 288ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertNotIn(p, self.active_children()) 289ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 290ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh p.daemon = True 291ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh p.start() 292ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertIn(p, self.active_children()) 293ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 294ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh p.join() 295ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertNotIn(p, self.active_children()) 296ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 297ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh @classmethod 298ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh def _test_recursion(cls, wconn, id): 299ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh from multiprocessing import forking 300ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh wconn.send(id) 301ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh if len(id) < 2: 302ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh for i in range(2): 303ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh p = cls.Process( 304ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh target=cls._test_recursion, args=(wconn, id+[i]) 305ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh ) 306ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh p.start() 307ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh p.join() 308ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 309ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh def test_recursion(self): 310ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh rconn, wconn = self.Pipe(duplex=False) 311ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self._test_recursion(wconn, []) 312ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 313ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh time.sleep(DELTA) 314ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh result = [] 315ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh while rconn.poll(): 316ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh result.append(rconn.recv()) 317ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 318ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh expected = [ 319ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh [], 320ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh [0], 321ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh [0, 0], 322ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh [0, 1], 323ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh [1], 324ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh [1, 0], 325ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh [1, 1] 326ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh ] 327ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(result, expected) 328ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 329ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh @classmethod 330ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh def _test_sys_exit(cls, reason, testfn): 331ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh sys.stderr = open(testfn, 'w') 332ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh sys.exit(reason) 333ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 334ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh def test_sys_exit(self): 335ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # See Issue 13854 336ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh if self.TYPE == 'threads': 337ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh return 338ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 339ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh testfn = test_support.TESTFN 340ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.addCleanup(test_support.unlink, testfn) 341ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 342ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh for reason, code in (([1, 2, 3], 1), ('ignore this', 0)): 343ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh p = self.Process(target=self._test_sys_exit, args=(reason, testfn)) 344ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh p.daemon = True 345ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh p.start() 346ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh p.join(5) 347ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(p.exitcode, code) 348ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 349ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh with open(testfn, 'r') as f: 350ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(f.read().rstrip(), str(reason)) 351ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 352ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh for reason in (True, False, 8): 353ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh p = self.Process(target=sys.exit, args=(reason,)) 354ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh p.daemon = True 355ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh p.start() 356ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh p.join(5) 357ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(p.exitcode, reason) 358ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 359ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh# 360ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh# 361ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh# 362ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 363ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehclass _UpperCaser(multiprocessing.Process): 364ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 365ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh def __init__(self): 366ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh multiprocessing.Process.__init__(self) 367ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.child_conn, self.parent_conn = multiprocessing.Pipe() 368ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 369ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh def run(self): 370ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.parent_conn.close() 371ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh for s in iter(self.child_conn.recv, None): 372ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.child_conn.send(s.upper()) 373ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.child_conn.close() 374ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 375ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh def submit(self, s): 376ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh assert type(s) is str 377ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.parent_conn.send(s) 378ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh return self.parent_conn.recv() 379ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 380ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh def stop(self): 381ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.parent_conn.send(None) 382ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.parent_conn.close() 383ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.child_conn.close() 384ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 385ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehclass _TestSubclassingProcess(BaseTestCase): 386ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 387ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh ALLOWED_TYPES = ('processes',) 388ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 389ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh def test_subclassing(self): 390ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh uppercaser = _UpperCaser() 391ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh uppercaser.daemon = True 392ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh uppercaser.start() 393ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(uppercaser.submit('hello'), 'HELLO') 394ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(uppercaser.submit('world'), 'WORLD') 395ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh uppercaser.stop() 396ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh uppercaser.join() 397ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 398ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh# 399ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh# 400ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh# 401ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 402ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehdef queue_empty(q): 403ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh if hasattr(q, 'empty'): 404ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh return q.empty() 405ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh else: 406ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh return q.qsize() == 0 407ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 408ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehdef queue_full(q, maxsize): 409ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh if hasattr(q, 'full'): 410ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh return q.full() 411ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh else: 412ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh return q.qsize() == maxsize 413ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 414ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 415ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehclass _TestQueue(BaseTestCase): 416ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 417ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 418ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh @classmethod 419ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh def _test_put(cls, queue, child_can_start, parent_can_continue): 420ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh child_can_start.wait() 421ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh for i in range(6): 422ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh queue.get() 423ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh parent_can_continue.set() 424ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 425ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh def test_put(self): 426ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh MAXSIZE = 6 427ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh queue = self.Queue(maxsize=MAXSIZE) 428ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh child_can_start = self.Event() 429ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh parent_can_continue = self.Event() 430ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 431ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh proc = self.Process( 432ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh target=self._test_put, 433ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh args=(queue, child_can_start, parent_can_continue) 434ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh ) 435ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh proc.daemon = True 436ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh proc.start() 437ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 438ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(queue_empty(queue), True) 439ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(queue_full(queue, MAXSIZE), False) 440ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 441ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh queue.put(1) 442ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh queue.put(2, True) 443ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh queue.put(3, True, None) 444ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh queue.put(4, False) 445ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh queue.put(5, False, None) 446ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh queue.put_nowait(6) 447ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 448ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # the values may be in buffer but not yet in pipe so sleep a bit 449ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh time.sleep(DELTA) 450ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 451ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(queue_empty(queue), False) 452ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(queue_full(queue, MAXSIZE), True) 453ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 454ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh put = TimingWrapper(queue.put) 455ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh put_nowait = TimingWrapper(queue.put_nowait) 456ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 457ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertRaises(Queue.Full, put, 7, False) 458ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertTimingAlmostEqual(put.elapsed, 0) 459ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 460ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertRaises(Queue.Full, put, 7, False, None) 461ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertTimingAlmostEqual(put.elapsed, 0) 462ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 463ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertRaises(Queue.Full, put_nowait, 7) 464ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertTimingAlmostEqual(put_nowait.elapsed, 0) 465ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 466ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertRaises(Queue.Full, put, 7, True, TIMEOUT1) 467ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertTimingAlmostEqual(put.elapsed, TIMEOUT1) 468ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 469ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertRaises(Queue.Full, put, 7, False, TIMEOUT2) 470ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertTimingAlmostEqual(put.elapsed, 0) 471ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 472ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertRaises(Queue.Full, put, 7, True, timeout=TIMEOUT3) 473ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertTimingAlmostEqual(put.elapsed, TIMEOUT3) 474ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 475ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh child_can_start.set() 476ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh parent_can_continue.wait() 477ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 478ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(queue_empty(queue), True) 479ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(queue_full(queue, MAXSIZE), False) 480ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 481ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh proc.join() 482ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 483ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh @classmethod 484ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh def _test_get(cls, queue, child_can_start, parent_can_continue): 485ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh child_can_start.wait() 486ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh #queue.put(1) 487ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh queue.put(2) 488ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh queue.put(3) 489ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh queue.put(4) 490ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh queue.put(5) 491ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh parent_can_continue.set() 492ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 493ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh def test_get(self): 494ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh queue = self.Queue() 495ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh child_can_start = self.Event() 496ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh parent_can_continue = self.Event() 497ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 498ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh proc = self.Process( 499ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh target=self._test_get, 500ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh args=(queue, child_can_start, parent_can_continue) 501ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh ) 502ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh proc.daemon = True 503ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh proc.start() 504ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 505ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(queue_empty(queue), True) 506ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 507ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh child_can_start.set() 508ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh parent_can_continue.wait() 509ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 510ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh time.sleep(DELTA) 511ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(queue_empty(queue), False) 512ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 513ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # Hangs unexpectedly, remove for now 514ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh #self.assertEqual(queue.get(), 1) 515ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(queue.get(True, None), 2) 516ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(queue.get(True), 3) 517ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(queue.get(timeout=1), 4) 518ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(queue.get_nowait(), 5) 519ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 520ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(queue_empty(queue), True) 521ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 522ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh get = TimingWrapper(queue.get) 523ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh get_nowait = TimingWrapper(queue.get_nowait) 524ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 525ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertRaises(Queue.Empty, get, False) 526ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertTimingAlmostEqual(get.elapsed, 0) 527ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 528ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertRaises(Queue.Empty, get, False, None) 529ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertTimingAlmostEqual(get.elapsed, 0) 530ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 531ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertRaises(Queue.Empty, get_nowait) 532ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertTimingAlmostEqual(get_nowait.elapsed, 0) 533ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 534ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertRaises(Queue.Empty, get, True, TIMEOUT1) 535ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertTimingAlmostEqual(get.elapsed, TIMEOUT1) 536ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 537ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertRaises(Queue.Empty, get, False, TIMEOUT2) 538ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertTimingAlmostEqual(get.elapsed, 0) 539ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 540ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertRaises(Queue.Empty, get, timeout=TIMEOUT3) 541ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertTimingAlmostEqual(get.elapsed, TIMEOUT3) 542ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 543ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh proc.join() 544ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 545ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh @classmethod 546ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh def _test_fork(cls, queue): 547ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh for i in range(10, 20): 548ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh queue.put(i) 549ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # note that at this point the items may only be buffered, so the 550ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # process cannot shutdown until the feeder thread has finished 551ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # pushing items onto the pipe. 552ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 553ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh def test_fork(self): 554ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # Old versions of Queue would fail to create a new feeder 555ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # thread for a forked process if the original process had its 556ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # own feeder thread. This test checks that this no longer 557ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # happens. 558ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 559ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh queue = self.Queue() 560ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 561ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # put items on queue so that main process starts a feeder thread 562ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh for i in range(10): 563ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh queue.put(i) 564ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 565ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # wait to make sure thread starts before we fork a new process 566ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh time.sleep(DELTA) 567ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 568ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # fork process 569ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh p = self.Process(target=self._test_fork, args=(queue,)) 570ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh p.daemon = True 571ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh p.start() 572ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 573ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # check that all expected items are in the queue 574ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh for i in range(20): 575ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(queue.get(), i) 576ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertRaises(Queue.Empty, queue.get, False) 577ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 578ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh p.join() 579ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 580ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh def test_qsize(self): 581ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh q = self.Queue() 582ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh try: 583ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(q.qsize(), 0) 584ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh except NotImplementedError: 585ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh return 586ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh q.put(1) 587ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(q.qsize(), 1) 588ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh q.put(5) 589ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(q.qsize(), 2) 590ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh q.get() 591ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(q.qsize(), 1) 592ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh q.get() 593ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(q.qsize(), 0) 594ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 595ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh @classmethod 596ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh def _test_task_done(cls, q): 597ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh for obj in iter(q.get, None): 598ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh time.sleep(DELTA) 599ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh q.task_done() 600ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 601ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh def test_task_done(self): 602ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh queue = self.JoinableQueue() 603ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 604ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh if sys.version_info < (2, 5) and not hasattr(queue, 'task_done'): 605ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.skipTest("requires 'queue.task_done()' method") 606ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 607ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh workers = [self.Process(target=self._test_task_done, args=(queue,)) 608ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh for i in xrange(4)] 609ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 610ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh for p in workers: 611ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh p.daemon = True 612ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh p.start() 613ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 614ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh for i in xrange(10): 615ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh queue.put(i) 616ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 617ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh queue.join() 618ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 619ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh for p in workers: 620ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh queue.put(None) 621ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 622ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh for p in workers: 623ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh p.join() 624ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 625ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh# 626ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh# 627ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh# 628ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 629ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehclass _TestLock(BaseTestCase): 630ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 631ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh def test_lock(self): 632ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh lock = self.Lock() 633ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(lock.acquire(), True) 634ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(lock.acquire(False), False) 635ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(lock.release(), None) 636ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertRaises((ValueError, threading.ThreadError), lock.release) 637ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 638ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh def test_rlock(self): 639ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh lock = self.RLock() 640ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(lock.acquire(), True) 641ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(lock.acquire(), True) 642ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(lock.acquire(), True) 643ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(lock.release(), None) 644ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(lock.release(), None) 645ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(lock.release(), None) 646ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertRaises((AssertionError, RuntimeError), lock.release) 647ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 648ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh def test_lock_context(self): 649ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh with self.Lock(): 650ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh pass 651ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 652ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 653ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehclass _TestSemaphore(BaseTestCase): 654ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 655ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh def _test_semaphore(self, sem): 656ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertReturnsIfImplemented(2, get_value, sem) 657ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(sem.acquire(), True) 658ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertReturnsIfImplemented(1, get_value, sem) 659ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(sem.acquire(), True) 660ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertReturnsIfImplemented(0, get_value, sem) 661ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(sem.acquire(False), False) 662ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertReturnsIfImplemented(0, get_value, sem) 663ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(sem.release(), None) 664ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertReturnsIfImplemented(1, get_value, sem) 665ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(sem.release(), None) 666ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertReturnsIfImplemented(2, get_value, sem) 667ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 668ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh def test_semaphore(self): 669ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh sem = self.Semaphore(2) 670ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self._test_semaphore(sem) 671ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(sem.release(), None) 672ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertReturnsIfImplemented(3, get_value, sem) 673ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(sem.release(), None) 674ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertReturnsIfImplemented(4, get_value, sem) 675ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 676ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh def test_bounded_semaphore(self): 677ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh sem = self.BoundedSemaphore(2) 678ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self._test_semaphore(sem) 679ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # Currently fails on OS/X 680ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh #if HAVE_GETVALUE: 681ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # self.assertRaises(ValueError, sem.release) 682ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # self.assertReturnsIfImplemented(2, get_value, sem) 683ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 684ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh def test_timeout(self): 685ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh if self.TYPE != 'processes': 686ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh return 687ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 688ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh sem = self.Semaphore(0) 689ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh acquire = TimingWrapper(sem.acquire) 690ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 691ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(acquire(False), False) 692ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertTimingAlmostEqual(acquire.elapsed, 0.0) 693ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 694ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(acquire(False, None), False) 695ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertTimingAlmostEqual(acquire.elapsed, 0.0) 696ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 697ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(acquire(False, TIMEOUT1), False) 698ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertTimingAlmostEqual(acquire.elapsed, 0) 699ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 700ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(acquire(True, TIMEOUT2), False) 701ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertTimingAlmostEqual(acquire.elapsed, TIMEOUT2) 702ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 703ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(acquire(timeout=TIMEOUT3), False) 704ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertTimingAlmostEqual(acquire.elapsed, TIMEOUT3) 705ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 706ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 707ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehclass _TestCondition(BaseTestCase): 708ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 709ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh @classmethod 710ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh def f(cls, cond, sleeping, woken, timeout=None): 711ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh cond.acquire() 712ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh sleeping.release() 713ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh cond.wait(timeout) 714ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh woken.release() 715ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh cond.release() 716ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 717ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh def check_invariant(self, cond): 718ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # this is only supposed to succeed when there are no sleepers 719ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh if self.TYPE == 'processes': 720ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh try: 721ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh sleepers = (cond._sleeping_count.get_value() - 722ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh cond._woken_count.get_value()) 723ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(sleepers, 0) 724ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(cond._wait_semaphore.get_value(), 0) 725ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh except NotImplementedError: 726ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh pass 727ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 728ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh def test_notify(self): 729ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh cond = self.Condition() 730ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh sleeping = self.Semaphore(0) 731ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh woken = self.Semaphore(0) 732ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 733ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh p = self.Process(target=self.f, args=(cond, sleeping, woken)) 734ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh p.daemon = True 735ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh p.start() 736ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 737ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh p = threading.Thread(target=self.f, args=(cond, sleeping, woken)) 738ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh p.daemon = True 739ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh p.start() 740ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 741ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # wait for both children to start sleeping 742ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh sleeping.acquire() 743ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh sleeping.acquire() 744ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 745ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # check no process/thread has woken up 746ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh time.sleep(DELTA) 747ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertReturnsIfImplemented(0, get_value, woken) 748ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 749ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # wake up one process/thread 750ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh cond.acquire() 751ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh cond.notify() 752ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh cond.release() 753ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 754ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # check one process/thread has woken up 755ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh time.sleep(DELTA) 756ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertReturnsIfImplemented(1, get_value, woken) 757ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 758ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # wake up another 759ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh cond.acquire() 760ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh cond.notify() 761ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh cond.release() 762ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 763ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # check other has woken up 764ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh time.sleep(DELTA) 765ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertReturnsIfImplemented(2, get_value, woken) 766ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 767ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # check state is not mucked up 768ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.check_invariant(cond) 769ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh p.join() 770ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 771ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh def test_notify_all(self): 772ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh cond = self.Condition() 773ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh sleeping = self.Semaphore(0) 774ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh woken = self.Semaphore(0) 775ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 776ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # start some threads/processes which will timeout 777ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh for i in range(3): 778ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh p = self.Process(target=self.f, 779ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh args=(cond, sleeping, woken, TIMEOUT1)) 780ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh p.daemon = True 781ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh p.start() 782ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 783ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh t = threading.Thread(target=self.f, 784ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh args=(cond, sleeping, woken, TIMEOUT1)) 785ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh t.daemon = True 786ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh t.start() 787ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 788ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # wait for them all to sleep 789ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh for i in xrange(6): 790ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh sleeping.acquire() 791ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 792ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # check they have all timed out 793ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh for i in xrange(6): 794ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh woken.acquire() 795ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertReturnsIfImplemented(0, get_value, woken) 796ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 797ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # check state is not mucked up 798ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.check_invariant(cond) 799ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 800ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # start some more threads/processes 801ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh for i in range(3): 802ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh p = self.Process(target=self.f, args=(cond, sleeping, woken)) 803ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh p.daemon = True 804ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh p.start() 805ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 806ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh t = threading.Thread(target=self.f, args=(cond, sleeping, woken)) 807ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh t.daemon = True 808ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh t.start() 809ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 810ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # wait for them to all sleep 811ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh for i in xrange(6): 812ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh sleeping.acquire() 813ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 814ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # check no process/thread has woken up 815ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh time.sleep(DELTA) 816ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertReturnsIfImplemented(0, get_value, woken) 817ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 818ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # wake them all up 819ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh cond.acquire() 820ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh cond.notify_all() 821ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh cond.release() 822ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 823ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # check they have all woken 824ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh time.sleep(DELTA) 825ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertReturnsIfImplemented(6, get_value, woken) 826ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 827ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # check state is not mucked up 828ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.check_invariant(cond) 829ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 830ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh def test_timeout(self): 831ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh cond = self.Condition() 832ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh wait = TimingWrapper(cond.wait) 833ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh cond.acquire() 834ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh res = wait(TIMEOUT1) 835ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh cond.release() 836ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(res, None) 837ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertTimingAlmostEqual(wait.elapsed, TIMEOUT1) 838ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 839ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 840ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehclass _TestEvent(BaseTestCase): 841ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 842ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh @classmethod 843ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh def _test_event(cls, event): 844ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh time.sleep(TIMEOUT2) 845ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh event.set() 846ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 847ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh def test_event(self): 848ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh event = self.Event() 849ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh wait = TimingWrapper(event.wait) 850ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 851ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # Removed temporarily, due to API shear, this does not 852ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # work with threading._Event objects. is_set == isSet 853ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(event.is_set(), False) 854ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 855ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # Removed, threading.Event.wait() will return the value of the __flag 856ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # instead of None. API Shear with the semaphore backed mp.Event 857ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(wait(0.0), False) 858ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertTimingAlmostEqual(wait.elapsed, 0.0) 859ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(wait(TIMEOUT1), False) 860ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertTimingAlmostEqual(wait.elapsed, TIMEOUT1) 861ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 862ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh event.set() 863ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 864ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # See note above on the API differences 865ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(event.is_set(), True) 866ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(wait(), True) 867ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertTimingAlmostEqual(wait.elapsed, 0.0) 868ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(wait(TIMEOUT1), True) 869ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertTimingAlmostEqual(wait.elapsed, 0.0) 870ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # self.assertEqual(event.is_set(), True) 871ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 872ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh event.clear() 873ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 874ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh #self.assertEqual(event.is_set(), False) 875ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 876ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh p = self.Process(target=self._test_event, args=(event,)) 877ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh p.daemon = True 878ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh p.start() 879ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(wait(), True) 880ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 881ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh# 882ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh# 883ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh# 884ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 885ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehclass _TestValue(BaseTestCase): 886ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 887ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh ALLOWED_TYPES = ('processes',) 888ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 889ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh codes_values = [ 890ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh ('i', 4343, 24234), 891ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh ('d', 3.625, -4.25), 892ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh ('h', -232, 234), 893ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh ('c', latin('x'), latin('y')) 894ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh ] 895ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 896ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh def setUp(self): 897ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh if not HAS_SHAREDCTYPES: 898ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.skipTest("requires multiprocessing.sharedctypes") 899ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 900ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh @classmethod 901ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh def _test(cls, values): 902ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh for sv, cv in zip(values, cls.codes_values): 903ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh sv.value = cv[2] 904ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 905ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 906ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh def test_value(self, raw=False): 907ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh if raw: 908ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh values = [self.RawValue(code, value) 909ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh for code, value, _ in self.codes_values] 910ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh else: 911ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh values = [self.Value(code, value) 912ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh for code, value, _ in self.codes_values] 913ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 914ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh for sv, cv in zip(values, self.codes_values): 915ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(sv.value, cv[1]) 916ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 917ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh proc = self.Process(target=self._test, args=(values,)) 918ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh proc.daemon = True 919ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh proc.start() 920ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh proc.join() 921ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 922ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh for sv, cv in zip(values, self.codes_values): 923ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(sv.value, cv[2]) 924ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 925ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh def test_rawvalue(self): 926ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.test_value(raw=True) 927ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 928ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh def test_getobj_getlock(self): 929ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh val1 = self.Value('i', 5) 930ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh lock1 = val1.get_lock() 931ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh obj1 = val1.get_obj() 932ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 933ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh val2 = self.Value('i', 5, lock=None) 934ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh lock2 = val2.get_lock() 935ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh obj2 = val2.get_obj() 936ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 937ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh lock = self.Lock() 938ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh val3 = self.Value('i', 5, lock=lock) 939ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh lock3 = val3.get_lock() 940ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh obj3 = val3.get_obj() 941ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(lock, lock3) 942ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 943ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh arr4 = self.Value('i', 5, lock=False) 944ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertFalse(hasattr(arr4, 'get_lock')) 945ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertFalse(hasattr(arr4, 'get_obj')) 946ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 947ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertRaises(AttributeError, self.Value, 'i', 5, lock='navalue') 948ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 949ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh arr5 = self.RawValue('i', 5) 950ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertFalse(hasattr(arr5, 'get_lock')) 951ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertFalse(hasattr(arr5, 'get_obj')) 952ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 953ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 954ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehclass _TestArray(BaseTestCase): 955ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 956ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh ALLOWED_TYPES = ('processes',) 957ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 958ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh @classmethod 959ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh def f(cls, seq): 960ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh for i in range(1, len(seq)): 961ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh seq[i] += seq[i-1] 962ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 963ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh @unittest.skipIf(c_int is None, "requires _ctypes") 964ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh def test_array(self, raw=False): 965ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh seq = [680, 626, 934, 821, 150, 233, 548, 982, 714, 831] 966ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh if raw: 967ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh arr = self.RawArray('i', seq) 968ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh else: 969ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh arr = self.Array('i', seq) 970ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 971ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(len(arr), len(seq)) 972ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(arr[3], seq[3]) 973ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(list(arr[2:7]), list(seq[2:7])) 974ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 975ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh arr[4:8] = seq[4:8] = array.array('i', [1, 2, 3, 4]) 976ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 977ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(list(arr[:]), seq) 978ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 979ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.f(seq) 980ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 981ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh p = self.Process(target=self.f, args=(arr,)) 982ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh p.daemon = True 983ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh p.start() 984ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh p.join() 985ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 986ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(list(arr[:]), seq) 987ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 988ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh @unittest.skipIf(c_int is None, "requires _ctypes") 989ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh def test_array_from_size(self): 990ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh size = 10 991ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # Test for zeroing (see issue #11675). 992ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # The repetition below strengthens the test by increasing the chances 993ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # of previously allocated non-zero memory being used for the new array 994ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # on the 2nd and 3rd loops. 995ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh for _ in range(3): 996ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh arr = self.Array('i', size) 997ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(len(arr), size) 998ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(list(arr), [0] * size) 999ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh arr[:] = range(10) 1000ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(list(arr), range(10)) 1001ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh del arr 1002ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 1003ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh @unittest.skipIf(c_int is None, "requires _ctypes") 1004ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh def test_rawarray(self): 1005ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.test_array(raw=True) 1006ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 1007ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh @unittest.skipIf(c_int is None, "requires _ctypes") 1008ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh def test_array_accepts_long(self): 1009ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh arr = self.Array('i', 10L) 1010ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(len(arr), 10) 1011ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh raw_arr = self.RawArray('i', 10L) 1012ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(len(raw_arr), 10) 1013ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 1014ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh @unittest.skipIf(c_int is None, "requires _ctypes") 1015ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh def test_getobj_getlock_obj(self): 1016ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh arr1 = self.Array('i', range(10)) 1017ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh lock1 = arr1.get_lock() 1018ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh obj1 = arr1.get_obj() 1019ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 1020ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh arr2 = self.Array('i', range(10), lock=None) 1021ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh lock2 = arr2.get_lock() 1022ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh obj2 = arr2.get_obj() 1023ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 1024ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh lock = self.Lock() 1025ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh arr3 = self.Array('i', range(10), lock=lock) 1026ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh lock3 = arr3.get_lock() 1027ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh obj3 = arr3.get_obj() 1028ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(lock, lock3) 1029ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 1030ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh arr4 = self.Array('i', range(10), lock=False) 1031ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertFalse(hasattr(arr4, 'get_lock')) 1032ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertFalse(hasattr(arr4, 'get_obj')) 1033ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertRaises(AttributeError, 1034ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.Array, 'i', range(10), lock='notalock') 1035ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 1036ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh arr5 = self.RawArray('i', range(10)) 1037ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertFalse(hasattr(arr5, 'get_lock')) 1038ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertFalse(hasattr(arr5, 'get_obj')) 1039ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 1040ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh# 1041ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh# 1042ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh# 1043ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 1044ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehclass _TestContainers(BaseTestCase): 1045ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 1046ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh ALLOWED_TYPES = ('manager',) 1047ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 1048ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh def test_list(self): 1049ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh a = self.list(range(10)) 1050ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(a[:], range(10)) 1051ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 1052ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh b = self.list() 1053ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(b[:], []) 1054ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 1055ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh b.extend(range(5)) 1056ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(b[:], range(5)) 1057ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 1058ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(b[2], 2) 1059ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(b[2:10], [2,3,4]) 1060ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 1061ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh b *= 2 1062ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(b[:], [0, 1, 2, 3, 4, 0, 1, 2, 3, 4]) 1063ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 1064ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(b + [5, 6], [0, 1, 2, 3, 4, 0, 1, 2, 3, 4, 5, 6]) 1065ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 1066ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(a[:], range(10)) 1067ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 1068ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh d = [a, b] 1069ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh e = self.list(d) 1070ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual( 1071ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh e[:], 1072ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh [[0, 1, 2, 3, 4, 5, 6, 7, 8, 9], [0, 1, 2, 3, 4, 0, 1, 2, 3, 4]] 1073ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh ) 1074ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 1075ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh f = self.list([a]) 1076ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh a.append('hello') 1077ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(f[:], [[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 'hello']]) 1078ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 1079ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh def test_dict(self): 1080ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh d = self.dict() 1081ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh indices = range(65, 70) 1082ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh for i in indices: 1083ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh d[i] = chr(i) 1084ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(d.copy(), dict((i, chr(i)) for i in indices)) 1085ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(sorted(d.keys()), indices) 1086ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(sorted(d.values()), [chr(i) for i in indices]) 1087ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(sorted(d.items()), [(i, chr(i)) for i in indices]) 1088ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 1089ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh def test_namespace(self): 1090ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh n = self.Namespace() 1091ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh n.name = 'Bob' 1092ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh n.job = 'Builder' 1093ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh n._hidden = 'hidden' 1094ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual((n.name, n.job), ('Bob', 'Builder')) 1095ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh del n.job 1096ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(str(n), "Namespace(name='Bob')") 1097ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertTrue(hasattr(n, 'name')) 1098ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertTrue(not hasattr(n, 'job')) 1099ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 1100ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh# 1101ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh# 1102ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh# 1103ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 1104ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehdef sqr(x, wait=0.0): 1105ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh time.sleep(wait) 1106ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh return x*x 1107ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehclass _TestPool(BaseTestCase): 1108ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 1109ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh def test_apply(self): 1110ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh papply = self.pool.apply 1111ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(papply(sqr, (5,)), sqr(5)) 1112ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(papply(sqr, (), {'x':3}), sqr(x=3)) 1113ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 1114ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh def test_map(self): 1115ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh pmap = self.pool.map 1116ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(pmap(sqr, range(10)), map(sqr, range(10))) 1117ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(pmap(sqr, range(100), chunksize=20), 1118ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh map(sqr, range(100))) 1119ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 1120ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh def test_map_chunksize(self): 1121ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh try: 1122ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.pool.map_async(sqr, [], chunksize=1).get(timeout=TIMEOUT1) 1123ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh except multiprocessing.TimeoutError: 1124ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.fail("pool.map_async with chunksize stalled on null list") 1125ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 1126ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh def test_async(self): 1127ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh res = self.pool.apply_async(sqr, (7, TIMEOUT1,)) 1128ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh get = TimingWrapper(res.get) 1129ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(get(), 49) 1130ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertTimingAlmostEqual(get.elapsed, TIMEOUT1) 1131ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 1132ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh def test_async_timeout(self): 1133ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh res = self.pool.apply_async(sqr, (6, TIMEOUT2 + 0.2)) 1134ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh get = TimingWrapper(res.get) 1135ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertRaises(multiprocessing.TimeoutError, get, timeout=TIMEOUT2) 1136ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertTimingAlmostEqual(get.elapsed, TIMEOUT2) 1137ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 1138ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh def test_imap(self): 1139ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh it = self.pool.imap(sqr, range(10)) 1140ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(list(it), map(sqr, range(10))) 1141ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 1142ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh it = self.pool.imap(sqr, range(10)) 1143ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh for i in range(10): 1144ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(it.next(), i*i) 1145ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertRaises(StopIteration, it.next) 1146ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 1147ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh it = self.pool.imap(sqr, range(1000), chunksize=100) 1148ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh for i in range(1000): 1149ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(it.next(), i*i) 1150ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertRaises(StopIteration, it.next) 1151ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 1152ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh def test_imap_unordered(self): 1153ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh it = self.pool.imap_unordered(sqr, range(1000)) 1154ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(sorted(it), map(sqr, range(1000))) 1155ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 1156ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh it = self.pool.imap_unordered(sqr, range(1000), chunksize=53) 1157ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(sorted(it), map(sqr, range(1000))) 1158ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 1159ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh def test_make_pool(self): 1160ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertRaises(ValueError, multiprocessing.Pool, -1) 1161ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertRaises(ValueError, multiprocessing.Pool, 0) 1162ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 1163ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh p = multiprocessing.Pool(3) 1164ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(3, len(p._pool)) 1165ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh p.close() 1166ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh p.join() 1167ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 1168ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh def test_terminate(self): 1169ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh if self.TYPE == 'manager': 1170ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # On Unix a forked process increfs each shared object to 1171ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # which its parent process held a reference. If the 1172ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # forked process gets terminated then there is likely to 1173ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # be a reference leak. So to prevent 1174ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # _TestZZZNumberOfObjects from failing we skip this test 1175ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # when using a manager. 1176ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh return 1177ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 1178ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh result = self.pool.map_async( 1179ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh time.sleep, [0.1 for i in range(10000)], chunksize=1 1180ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh ) 1181ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.pool.terminate() 1182ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh join = TimingWrapper(self.pool.join) 1183ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh join() 1184ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertTrue(join.elapsed < 0.2) 1185ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 1186ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh def test_empty_iterable(self): 1187ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # See Issue 12157 1188ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh p = self.Pool(1) 1189ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 1190ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(p.map(sqr, []), []) 1191ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(list(p.imap(sqr, [])), []) 1192ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(list(p.imap_unordered(sqr, [])), []) 1193ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(p.map_async(sqr, []).get(), []) 1194ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 1195ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh p.close() 1196ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh p.join() 1197ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 1198ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehdef unpickleable_result(): 1199ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh return lambda: 42 1200ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 1201ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehclass _TestPoolWorkerErrors(BaseTestCase): 1202ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh ALLOWED_TYPES = ('processes', ) 1203ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 1204ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh def test_unpickleable_result(self): 1205ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh from multiprocessing.pool import MaybeEncodingError 1206ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh p = multiprocessing.Pool(2) 1207ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 1208ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # Make sure we don't lose pool processes because of encoding errors. 1209ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh for iteration in range(20): 1210ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh res = p.apply_async(unpickleable_result) 1211ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertRaises(MaybeEncodingError, res.get) 1212ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 1213ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh p.close() 1214ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh p.join() 1215ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 1216ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehclass _TestPoolWorkerLifetime(BaseTestCase): 1217ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 1218ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh ALLOWED_TYPES = ('processes', ) 1219ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh def test_pool_worker_lifetime(self): 1220ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh p = multiprocessing.Pool(3, maxtasksperchild=10) 1221ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(3, len(p._pool)) 1222ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh origworkerpids = [w.pid for w in p._pool] 1223ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # Run many tasks so each worker gets replaced (hopefully) 1224ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh results = [] 1225ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh for i in range(100): 1226ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh results.append(p.apply_async(sqr, (i, ))) 1227ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # Fetch the results and verify we got the right answers, 1228ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # also ensuring all the tasks have completed. 1229ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh for (j, res) in enumerate(results): 1230ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(res.get(), sqr(j)) 1231ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # Refill the pool 1232ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh p._repopulate_pool() 1233ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # Wait until all workers are alive 1234ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # (countdown * DELTA = 5 seconds max startup process time) 1235ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh countdown = 50 1236ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh while countdown and not all(w.is_alive() for w in p._pool): 1237ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh countdown -= 1 1238ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh time.sleep(DELTA) 1239ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh finalworkerpids = [w.pid for w in p._pool] 1240ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # All pids should be assigned. See issue #7805. 1241ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertNotIn(None, origworkerpids) 1242ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertNotIn(None, finalworkerpids) 1243ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # Finally, check that the worker pids have changed 1244ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertNotEqual(sorted(origworkerpids), sorted(finalworkerpids)) 1245ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh p.close() 1246ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh p.join() 1247ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 1248ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh def test_pool_worker_lifetime_early_close(self): 1249ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # Issue #10332: closing a pool whose workers have limited lifetimes 1250ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # before all the tasks completed would make join() hang. 1251ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh p = multiprocessing.Pool(3, maxtasksperchild=1) 1252ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh results = [] 1253ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh for i in range(6): 1254ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh results.append(p.apply_async(sqr, (i, 0.3))) 1255ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh p.close() 1256ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh p.join() 1257ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # check the results 1258ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh for (j, res) in enumerate(results): 1259ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(res.get(), sqr(j)) 1260ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 1261ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 1262ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh# 1263ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh# Test that manager has expected number of shared objects left 1264ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh# 1265ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 1266ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehclass _TestZZZNumberOfObjects(BaseTestCase): 1267ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # Because test cases are sorted alphabetically, this one will get 1268ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # run after all the other tests for the manager. It tests that 1269ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # there have been no "reference leaks" for the manager's shared 1270ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # objects. Note the comment in _TestPool.test_terminate(). 1271ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh ALLOWED_TYPES = ('manager',) 1272ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 1273ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh def test_number_of_objects(self): 1274ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh EXPECTED_NUMBER = 1 # the pool object is still alive 1275ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh multiprocessing.active_children() # discard dead process objs 1276ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh gc.collect() # do garbage collection 1277ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh refs = self.manager._number_of_objects() 1278ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh debug_info = self.manager._debug_info() 1279ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh if refs != EXPECTED_NUMBER: 1280ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh print self.manager._debug_info() 1281ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh print debug_info 1282ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 1283ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(refs, EXPECTED_NUMBER) 1284ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 1285ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh# 1286ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh# Test of creating a customized manager class 1287ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh# 1288ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 1289ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehfrom multiprocessing.managers import BaseManager, BaseProxy, RemoteError 1290ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 1291ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehclass FooBar(object): 1292ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh def f(self): 1293ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh return 'f()' 1294ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh def g(self): 1295ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh raise ValueError 1296ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh def _h(self): 1297ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh return '_h()' 1298ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 1299ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehdef baz(): 1300ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh for i in xrange(10): 1301ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh yield i*i 1302ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 1303ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehclass IteratorProxy(BaseProxy): 1304ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh _exposed_ = ('next', '__next__') 1305ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh def __iter__(self): 1306ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh return self 1307ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh def next(self): 1308ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh return self._callmethod('next') 1309ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh def __next__(self): 1310ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh return self._callmethod('__next__') 1311ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 1312ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehclass MyManager(BaseManager): 1313ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh pass 1314ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 1315ffab958fd8d42ed7227d83007350e61555a1fa36Andrew HsiehMyManager.register('Foo', callable=FooBar) 1316ffab958fd8d42ed7227d83007350e61555a1fa36Andrew HsiehMyManager.register('Bar', callable=FooBar, exposed=('f', '_h')) 1317ffab958fd8d42ed7227d83007350e61555a1fa36Andrew HsiehMyManager.register('baz', callable=baz, proxytype=IteratorProxy) 1318ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 1319ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 1320ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehclass _TestMyManager(BaseTestCase): 1321ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 1322ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh ALLOWED_TYPES = ('manager',) 1323ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 1324ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh def test_mymanager(self): 1325ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh manager = MyManager() 1326ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh manager.start() 1327ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 1328ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh foo = manager.Foo() 1329ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh bar = manager.Bar() 1330ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh baz = manager.baz() 1331ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 1332ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh foo_methods = [name for name in ('f', 'g', '_h') if hasattr(foo, name)] 1333ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh bar_methods = [name for name in ('f', 'g', '_h') if hasattr(bar, name)] 1334ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 1335ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(foo_methods, ['f', 'g']) 1336ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(bar_methods, ['f', '_h']) 1337ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 1338ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(foo.f(), 'f()') 1339ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertRaises(ValueError, foo.g) 1340ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(foo._callmethod('f'), 'f()') 1341ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertRaises(RemoteError, foo._callmethod, '_h') 1342ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 1343ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(bar.f(), 'f()') 1344ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(bar._h(), '_h()') 1345ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(bar._callmethod('f'), 'f()') 1346ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(bar._callmethod('_h'), '_h()') 1347ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 1348ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(list(baz), [i*i for i in range(10)]) 1349ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 1350ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh manager.shutdown() 1351ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 1352ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh# 1353ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh# Test of connecting to a remote server and using xmlrpclib for serialization 1354ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh# 1355ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 1356ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh_queue = Queue.Queue() 1357ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehdef get_queue(): 1358ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh return _queue 1359ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 1360ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehclass QueueManager(BaseManager): 1361ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh '''manager class used by server process''' 1362ffab958fd8d42ed7227d83007350e61555a1fa36Andrew HsiehQueueManager.register('get_queue', callable=get_queue) 1363ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 1364ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehclass QueueManager2(BaseManager): 1365ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh '''manager class which specifies the same interface as QueueManager''' 1366ffab958fd8d42ed7227d83007350e61555a1fa36Andrew HsiehQueueManager2.register('get_queue') 1367ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 1368ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 1369ffab958fd8d42ed7227d83007350e61555a1fa36Andrew HsiehSERIALIZER = 'xmlrpclib' 1370ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 1371ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehclass _TestRemoteManager(BaseTestCase): 1372ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 1373ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh ALLOWED_TYPES = ('manager',) 1374ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 1375ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh @classmethod 1376ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh def _putter(cls, address, authkey): 1377ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh manager = QueueManager2( 1378ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh address=address, authkey=authkey, serializer=SERIALIZER 1379ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh ) 1380ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh manager.connect() 1381ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh queue = manager.get_queue() 1382ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh queue.put(('hello world', None, True, 2.25)) 1383ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 1384ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh def test_remote(self): 1385ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh authkey = os.urandom(32) 1386ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 1387ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh manager = QueueManager( 1388ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh address=('localhost', 0), authkey=authkey, serializer=SERIALIZER 1389ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh ) 1390ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh manager.start() 1391ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 1392ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh p = self.Process(target=self._putter, args=(manager.address, authkey)) 1393ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh p.daemon = True 1394ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh p.start() 1395ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 1396ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh manager2 = QueueManager2( 1397ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh address=manager.address, authkey=authkey, serializer=SERIALIZER 1398ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh ) 1399ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh manager2.connect() 1400ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh queue = manager2.get_queue() 1401ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 1402ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # Note that xmlrpclib will deserialize object as a list not a tuple 1403ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(queue.get(), ['hello world', None, True, 2.25]) 1404ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 1405ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # Because we are using xmlrpclib for serialization instead of 1406ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # pickle this will cause a serialization error. 1407ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertRaises(Exception, queue.put, time.sleep) 1408ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 1409ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # Make queue finalizer run before the server is stopped 1410ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh del queue 1411ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh manager.shutdown() 1412ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 1413ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehclass _TestManagerRestart(BaseTestCase): 1414ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 1415ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh @classmethod 1416ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh def _putter(cls, address, authkey): 1417ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh manager = QueueManager( 1418ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh address=address, authkey=authkey, serializer=SERIALIZER) 1419ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh manager.connect() 1420ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh queue = manager.get_queue() 1421ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh queue.put('hello world') 1422ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 1423ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh def test_rapid_restart(self): 1424ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh authkey = os.urandom(32) 1425ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh manager = QueueManager( 1426ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh address=('localhost', 0), authkey=authkey, serializer=SERIALIZER) 1427ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh srvr = manager.get_server() 1428ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh addr = srvr.address 1429ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # Close the connection.Listener socket which gets opened as a part 1430ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # of manager.get_server(). It's not needed for the test. 1431ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh srvr.listener.close() 1432ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh manager.start() 1433ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 1434ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh p = self.Process(target=self._putter, args=(manager.address, authkey)) 1435ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh p.daemon = True 1436ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh p.start() 1437ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh queue = manager.get_queue() 1438ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(queue.get(), 'hello world') 1439ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh del queue 1440ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh manager.shutdown() 1441ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh manager = QueueManager( 1442ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh address=addr, authkey=authkey, serializer=SERIALIZER) 1443ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh manager.start() 1444ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh manager.shutdown() 1445ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 1446ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh# 1447ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh# 1448ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh# 1449ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 1450ffab958fd8d42ed7227d83007350e61555a1fa36Andrew HsiehSENTINEL = latin('') 1451ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 1452ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehclass _TestConnection(BaseTestCase): 1453ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 1454ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh ALLOWED_TYPES = ('processes', 'threads') 1455ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 1456ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh @classmethod 1457ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh def _echo(cls, conn): 1458ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh for msg in iter(conn.recv_bytes, SENTINEL): 1459ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh conn.send_bytes(msg) 1460ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh conn.close() 1461ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 1462ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh def test_connection(self): 1463ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh conn, child_conn = self.Pipe() 1464ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 1465ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh p = self.Process(target=self._echo, args=(child_conn,)) 1466ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh p.daemon = True 1467ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh p.start() 1468ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 1469ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh seq = [1, 2.25, None] 1470ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh msg = latin('hello world') 1471ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh longmsg = msg * 10 1472ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh arr = array.array('i', range(4)) 1473ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 1474ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh if self.TYPE == 'processes': 1475ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(type(conn.fileno()), int) 1476ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 1477ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(conn.send(seq), None) 1478ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(conn.recv(), seq) 1479ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 1480ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(conn.send_bytes(msg), None) 1481ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(conn.recv_bytes(), msg) 1482ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 1483ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh if self.TYPE == 'processes': 1484ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh buffer = array.array('i', [0]*10) 1485ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh expected = list(arr) + [0] * (10 - len(arr)) 1486ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(conn.send_bytes(arr), None) 1487ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(conn.recv_bytes_into(buffer), 1488ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh len(arr) * buffer.itemsize) 1489ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(list(buffer), expected) 1490ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 1491ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh buffer = array.array('i', [0]*10) 1492ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh expected = [0] * 3 + list(arr) + [0] * (10 - 3 - len(arr)) 1493ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(conn.send_bytes(arr), None) 1494ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(conn.recv_bytes_into(buffer, 3 * buffer.itemsize), 1495ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh len(arr) * buffer.itemsize) 1496ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(list(buffer), expected) 1497ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 1498ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh buffer = bytearray(latin(' ' * 40)) 1499ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(conn.send_bytes(longmsg), None) 1500ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh try: 1501ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh res = conn.recv_bytes_into(buffer) 1502ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh except multiprocessing.BufferTooShort, e: 1503ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(e.args, (longmsg,)) 1504ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh else: 1505ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.fail('expected BufferTooShort, got %s' % res) 1506ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 1507ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh poll = TimingWrapper(conn.poll) 1508ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 1509ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(poll(), False) 1510ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertTimingAlmostEqual(poll.elapsed, 0) 1511ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 1512ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(poll(TIMEOUT1), False) 1513ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertTimingAlmostEqual(poll.elapsed, TIMEOUT1) 1514ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 1515ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh conn.send(None) 1516ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh time.sleep(.1) 1517ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 1518ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(poll(TIMEOUT1), True) 1519ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertTimingAlmostEqual(poll.elapsed, 0) 1520ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 1521ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(conn.recv(), None) 1522ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 1523ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh really_big_msg = latin('X') * (1024 * 1024 * 16) # 16Mb 1524ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh conn.send_bytes(really_big_msg) 1525ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(conn.recv_bytes(), really_big_msg) 1526ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 1527ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh conn.send_bytes(SENTINEL) # tell child to quit 1528ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh child_conn.close() 1529ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 1530ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh if self.TYPE == 'processes': 1531ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(conn.readable, True) 1532ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(conn.writable, True) 1533ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertRaises(EOFError, conn.recv) 1534ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertRaises(EOFError, conn.recv_bytes) 1535ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 1536ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh p.join() 1537ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 1538ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh def test_duplex_false(self): 1539ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh reader, writer = self.Pipe(duplex=False) 1540ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(writer.send(1), None) 1541ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(reader.recv(), 1) 1542ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh if self.TYPE == 'processes': 1543ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(reader.readable, True) 1544ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(reader.writable, False) 1545ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(writer.readable, False) 1546ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(writer.writable, True) 1547ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertRaises(IOError, reader.send, 2) 1548ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertRaises(IOError, writer.recv) 1549ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertRaises(IOError, writer.poll) 1550ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 1551ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh def test_spawn_close(self): 1552ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # We test that a pipe connection can be closed by parent 1553ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # process immediately after child is spawned. On Windows this 1554ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # would have sometimes failed on old versions because 1555ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # child_conn would be closed before the child got a chance to 1556ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # duplicate it. 1557ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh conn, child_conn = self.Pipe() 1558ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 1559ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh p = self.Process(target=self._echo, args=(child_conn,)) 1560ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh p.daemon = True 1561ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh p.start() 1562ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh child_conn.close() # this might complete before child initializes 1563ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 1564ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh msg = latin('hello') 1565ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh conn.send_bytes(msg) 1566ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(conn.recv_bytes(), msg) 1567ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 1568ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh conn.send_bytes(SENTINEL) 1569ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh conn.close() 1570ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh p.join() 1571ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 1572ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh def test_sendbytes(self): 1573ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh if self.TYPE != 'processes': 1574ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh return 1575ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 1576ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh msg = latin('abcdefghijklmnopqrstuvwxyz') 1577ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh a, b = self.Pipe() 1578ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 1579ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh a.send_bytes(msg) 1580ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(b.recv_bytes(), msg) 1581ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 1582ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh a.send_bytes(msg, 5) 1583ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(b.recv_bytes(), msg[5:]) 1584ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 1585ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh a.send_bytes(msg, 7, 8) 1586ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(b.recv_bytes(), msg[7:7+8]) 1587ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 1588ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh a.send_bytes(msg, 26) 1589ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(b.recv_bytes(), latin('')) 1590ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 1591ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh a.send_bytes(msg, 26, 0) 1592ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(b.recv_bytes(), latin('')) 1593ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 1594ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertRaises(ValueError, a.send_bytes, msg, 27) 1595ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 1596ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertRaises(ValueError, a.send_bytes, msg, 22, 5) 1597ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 1598ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertRaises(ValueError, a.send_bytes, msg, 26, 1) 1599ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 1600ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertRaises(ValueError, a.send_bytes, msg, -1) 1601ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 1602ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertRaises(ValueError, a.send_bytes, msg, 4, -1) 1603ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 1604ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh @classmethod 1605ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh def _is_fd_assigned(cls, fd): 1606ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh try: 1607ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh os.fstat(fd) 1608ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh except OSError as e: 1609ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh if e.errno == errno.EBADF: 1610ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh return False 1611ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh raise 1612ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh else: 1613ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh return True 1614ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 1615ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh @classmethod 1616ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh def _writefd(cls, conn, data, create_dummy_fds=False): 1617ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh if create_dummy_fds: 1618ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh for i in range(0, 256): 1619ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh if not cls._is_fd_assigned(i): 1620ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh os.dup2(conn.fileno(), i) 1621ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh fd = reduction.recv_handle(conn) 1622ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh if msvcrt: 1623ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh fd = msvcrt.open_osfhandle(fd, os.O_WRONLY) 1624ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh os.write(fd, data) 1625ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh os.close(fd) 1626ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 1627ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh @unittest.skipUnless(HAS_REDUCTION, "test needs multiprocessing.reduction") 1628ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh def test_fd_transfer(self): 1629ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh if self.TYPE != 'processes': 1630ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.skipTest("only makes sense with processes") 1631ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh conn, child_conn = self.Pipe(duplex=True) 1632ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 1633ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh p = self.Process(target=self._writefd, args=(child_conn, b"foo")) 1634ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh p.daemon = True 1635ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh p.start() 1636ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh with open(test_support.TESTFN, "wb") as f: 1637ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh fd = f.fileno() 1638ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh if msvcrt: 1639ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh fd = msvcrt.get_osfhandle(fd) 1640ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh reduction.send_handle(conn, fd, p.pid) 1641ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh p.join() 1642ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh with open(test_support.TESTFN, "rb") as f: 1643ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(f.read(), b"foo") 1644ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 1645ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh @unittest.skipUnless(HAS_REDUCTION, "test needs multiprocessing.reduction") 1646ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh @unittest.skipIf(sys.platform == "win32", 1647ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh "test semantics don't make sense on Windows") 1648ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh @unittest.skipIf(MAXFD <= 256, 1649ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh "largest assignable fd number is too small") 1650ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh @unittest.skipUnless(hasattr(os, "dup2"), 1651ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh "test needs os.dup2()") 1652ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh def test_large_fd_transfer(self): 1653ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # With fd > 256 (issue #11657) 1654ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh if self.TYPE != 'processes': 1655ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.skipTest("only makes sense with processes") 1656ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh conn, child_conn = self.Pipe(duplex=True) 1657ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 1658ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh p = self.Process(target=self._writefd, args=(child_conn, b"bar", True)) 1659ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh p.daemon = True 1660ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh p.start() 1661ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh with open(test_support.TESTFN, "wb") as f: 1662ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh fd = f.fileno() 1663ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh for newfd in range(256, MAXFD): 1664ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh if not self._is_fd_assigned(newfd): 1665ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh break 1666ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh else: 1667ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.fail("could not find an unassigned large file descriptor") 1668ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh os.dup2(fd, newfd) 1669ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh try: 1670ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh reduction.send_handle(conn, newfd, p.pid) 1671ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh finally: 1672ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh os.close(newfd) 1673ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh p.join() 1674ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh with open(test_support.TESTFN, "rb") as f: 1675ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(f.read(), b"bar") 1676ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 1677ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh @classmethod 1678ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh def _send_data_without_fd(self, conn): 1679ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh os.write(conn.fileno(), b"\0") 1680ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 1681ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh @unittest.skipUnless(HAS_REDUCTION, "test needs multiprocessing.reduction") 1682ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh @unittest.skipIf(sys.platform == "win32", "doesn't make sense on Windows") 1683ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh def test_missing_fd_transfer(self): 1684ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # Check that exception is raised when received data is not 1685ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # accompanied by a file descriptor in ancillary data. 1686ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh if self.TYPE != 'processes': 1687ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.skipTest("only makes sense with processes") 1688ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh conn, child_conn = self.Pipe(duplex=True) 1689ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 1690ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh p = self.Process(target=self._send_data_without_fd, args=(child_conn,)) 1691ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh p.daemon = True 1692ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh p.start() 1693ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertRaises(RuntimeError, reduction.recv_handle, conn) 1694ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh p.join() 1695ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 1696ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehclass _TestListenerClient(BaseTestCase): 1697ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 1698ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh ALLOWED_TYPES = ('processes', 'threads') 1699ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 1700ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh @classmethod 1701ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh def _test(cls, address): 1702ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh conn = cls.connection.Client(address) 1703ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh conn.send('hello') 1704ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh conn.close() 1705ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 1706ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh def test_listener_client(self): 1707ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh for family in self.connection.families: 1708ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh l = self.connection.Listener(family=family) 1709ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh p = self.Process(target=self._test, args=(l.address,)) 1710ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh p.daemon = True 1711ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh p.start() 1712ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh conn = l.accept() 1713ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(conn.recv(), 'hello') 1714ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh p.join() 1715ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh l.close() 1716ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 1717ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh def test_issue14725(self): 1718ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh l = self.connection.Listener() 1719ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh p = self.Process(target=self._test, args=(l.address,)) 1720ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh p.daemon = True 1721ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh p.start() 1722ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh time.sleep(1) 1723ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # On Windows the client process should by now have connected, 1724ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # written data and closed the pipe handle by now. This causes 1725ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # ConnectNamdedPipe() to fail with ERROR_NO_DATA. See Issue 1726ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # 14725. 1727ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh conn = l.accept() 1728ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(conn.recv(), 'hello') 1729ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh conn.close() 1730ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh p.join() 1731ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh l.close() 1732ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 1733ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh# 1734ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh# Test of sending connection and socket objects between processes 1735ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh# 1736ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh""" 1737ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehclass _TestPicklingConnections(BaseTestCase): 1738ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 1739ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh ALLOWED_TYPES = ('processes',) 1740ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 1741ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh def _listener(self, conn, families): 1742ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh for fam in families: 1743ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh l = self.connection.Listener(family=fam) 1744ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh conn.send(l.address) 1745ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh new_conn = l.accept() 1746ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh conn.send(new_conn) 1747ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 1748ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh if self.TYPE == 'processes': 1749ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh l = socket.socket() 1750ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh l.bind(('localhost', 0)) 1751ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh conn.send(l.getsockname()) 1752ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh l.listen(1) 1753ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh new_conn, addr = l.accept() 1754ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh conn.send(new_conn) 1755ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 1756ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh conn.recv() 1757ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 1758ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh def _remote(self, conn): 1759ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh for (address, msg) in iter(conn.recv, None): 1760ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh client = self.connection.Client(address) 1761ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh client.send(msg.upper()) 1762ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh client.close() 1763ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 1764ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh if self.TYPE == 'processes': 1765ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh address, msg = conn.recv() 1766ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh client = socket.socket() 1767ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh client.connect(address) 1768ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh client.sendall(msg.upper()) 1769ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh client.close() 1770ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 1771ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh conn.close() 1772ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 1773ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh def test_pickling(self): 1774ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh try: 1775ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh multiprocessing.allow_connection_pickling() 1776ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh except ImportError: 1777ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh return 1778ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 1779ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh families = self.connection.families 1780ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 1781ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh lconn, lconn0 = self.Pipe() 1782ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh lp = self.Process(target=self._listener, args=(lconn0, families)) 1783ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh lp.daemon = True 1784ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh lp.start() 1785ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh lconn0.close() 1786ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 1787ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh rconn, rconn0 = self.Pipe() 1788ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh rp = self.Process(target=self._remote, args=(rconn0,)) 1789ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh rp.daemon = True 1790ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh rp.start() 1791ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh rconn0.close() 1792ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 1793ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh for fam in families: 1794ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh msg = ('This connection uses family %s' % fam).encode('ascii') 1795ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh address = lconn.recv() 1796ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh rconn.send((address, msg)) 1797ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh new_conn = lconn.recv() 1798ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(new_conn.recv(), msg.upper()) 1799ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 1800ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh rconn.send(None) 1801ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 1802ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh if self.TYPE == 'processes': 1803ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh msg = latin('This connection uses a normal socket') 1804ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh address = lconn.recv() 1805ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh rconn.send((address, msg)) 1806ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh if hasattr(socket, 'fromfd'): 1807ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh new_conn = lconn.recv() 1808ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(new_conn.recv(100), msg.upper()) 1809ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh else: 1810ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # XXX On Windows with Py2.6 need to backport fromfd() 1811ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh discard = lconn.recv_bytes() 1812ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 1813ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh lconn.send(None) 1814ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 1815ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh rconn.close() 1816ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh lconn.close() 1817ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 1818ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh lp.join() 1819ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh rp.join() 1820ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh""" 1821ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh# 1822ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh# 1823ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh# 1824ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 1825ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehclass _TestHeap(BaseTestCase): 1826ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 1827ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh ALLOWED_TYPES = ('processes',) 1828ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 1829ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh def test_heap(self): 1830ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh iterations = 5000 1831ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh maxblocks = 50 1832ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh blocks = [] 1833ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 1834ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # create and destroy lots of blocks of different sizes 1835ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh for i in xrange(iterations): 1836ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh size = int(random.lognormvariate(0, 1) * 1000) 1837ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh b = multiprocessing.heap.BufferWrapper(size) 1838ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh blocks.append(b) 1839ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh if len(blocks) > maxblocks: 1840ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh i = random.randrange(maxblocks) 1841ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh del blocks[i] 1842ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 1843ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # get the heap object 1844ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh heap = multiprocessing.heap.BufferWrapper._heap 1845ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 1846ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # verify the state of the heap 1847ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh all = [] 1848ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh occupied = 0 1849ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh heap._lock.acquire() 1850ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.addCleanup(heap._lock.release) 1851ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh for L in heap._len_to_seq.values(): 1852ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh for arena, start, stop in L: 1853ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh all.append((heap._arenas.index(arena), start, stop, 1854ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh stop-start, 'free')) 1855ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh for arena, start, stop in heap._allocated_blocks: 1856ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh all.append((heap._arenas.index(arena), start, stop, 1857ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh stop-start, 'occupied')) 1858ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh occupied += (stop-start) 1859ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 1860ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh all.sort() 1861ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 1862ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh for i in range(len(all)-1): 1863ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh (arena, start, stop) = all[i][:3] 1864ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh (narena, nstart, nstop) = all[i+1][:3] 1865ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertTrue((arena != narena and nstart == 0) or 1866ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh (stop == nstart)) 1867ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 1868ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh def test_free_from_gc(self): 1869ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # Check that freeing of blocks by the garbage collector doesn't deadlock 1870ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # (issue #12352). 1871ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # Make sure the GC is enabled, and set lower collection thresholds to 1872ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # make collections more frequent (and increase the probability of 1873ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # deadlock). 1874ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh if not gc.isenabled(): 1875ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh gc.enable() 1876ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.addCleanup(gc.disable) 1877ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh thresholds = gc.get_threshold() 1878ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.addCleanup(gc.set_threshold, *thresholds) 1879ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh gc.set_threshold(10) 1880ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 1881ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # perform numerous block allocations, with cyclic references to make 1882ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # sure objects are collected asynchronously by the gc 1883ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh for i in range(5000): 1884ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh a = multiprocessing.heap.BufferWrapper(1) 1885ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh b = multiprocessing.heap.BufferWrapper(1) 1886ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # circular references 1887ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh a.buddy = b 1888ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh b.buddy = a 1889ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 1890ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh# 1891ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh# 1892ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh# 1893ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 1894ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehclass _Foo(Structure): 1895ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh _fields_ = [ 1896ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh ('x', c_int), 1897ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh ('y', c_double) 1898ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh ] 1899ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 1900ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehclass _TestSharedCTypes(BaseTestCase): 1901ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 1902ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh ALLOWED_TYPES = ('processes',) 1903ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 1904ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh def setUp(self): 1905ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh if not HAS_SHAREDCTYPES: 1906ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.skipTest("requires multiprocessing.sharedctypes") 1907ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 1908ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh @classmethod 1909ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh def _double(cls, x, y, foo, arr, string): 1910ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh x.value *= 2 1911ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh y.value *= 2 1912ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh foo.x *= 2 1913ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh foo.y *= 2 1914ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh string.value *= 2 1915ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh for i in range(len(arr)): 1916ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh arr[i] *= 2 1917ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 1918ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh def test_sharedctypes(self, lock=False): 1919ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh x = Value('i', 7, lock=lock) 1920ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh y = Value(c_double, 1.0/3.0, lock=lock) 1921ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh foo = Value(_Foo, 3, 2, lock=lock) 1922ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh arr = self.Array('d', range(10), lock=lock) 1923ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh string = self.Array('c', 20, lock=lock) 1924ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh string.value = latin('hello') 1925ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 1926ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh p = self.Process(target=self._double, args=(x, y, foo, arr, string)) 1927ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh p.daemon = True 1928ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh p.start() 1929ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh p.join() 1930ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 1931ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(x.value, 14) 1932ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertAlmostEqual(y.value, 2.0/3.0) 1933ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(foo.x, 6) 1934ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertAlmostEqual(foo.y, 4.0) 1935ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh for i in range(10): 1936ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertAlmostEqual(arr[i], i*2) 1937ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(string.value, latin('hellohello')) 1938ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 1939ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh def test_synchronize(self): 1940ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.test_sharedctypes(lock=True) 1941ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 1942ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh def test_copy(self): 1943ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh foo = _Foo(2, 5.0) 1944ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh bar = copy(foo) 1945ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh foo.x = 0 1946ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh foo.y = 0 1947ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(bar.x, 2) 1948ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertAlmostEqual(bar.y, 5.0) 1949ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 1950ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh# 1951ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh# 1952ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh# 1953ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 1954ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehclass _TestFinalize(BaseTestCase): 1955ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 1956ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh ALLOWED_TYPES = ('processes',) 1957ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 1958ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh @classmethod 1959ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh def _test_finalize(cls, conn): 1960ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh class Foo(object): 1961ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh pass 1962ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 1963ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh a = Foo() 1964ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh util.Finalize(a, conn.send, args=('a',)) 1965ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh del a # triggers callback for a 1966ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 1967ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh b = Foo() 1968ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh close_b = util.Finalize(b, conn.send, args=('b',)) 1969ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh close_b() # triggers callback for b 1970ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh close_b() # does nothing because callback has already been called 1971ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh del b # does nothing because callback has already been called 1972ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 1973ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh c = Foo() 1974ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh util.Finalize(c, conn.send, args=('c',)) 1975ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 1976ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh d10 = Foo() 1977ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh util.Finalize(d10, conn.send, args=('d10',), exitpriority=1) 1978ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 1979ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh d01 = Foo() 1980ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh util.Finalize(d01, conn.send, args=('d01',), exitpriority=0) 1981ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh d02 = Foo() 1982ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh util.Finalize(d02, conn.send, args=('d02',), exitpriority=0) 1983ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh d03 = Foo() 1984ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh util.Finalize(d03, conn.send, args=('d03',), exitpriority=0) 1985ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 1986ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh util.Finalize(None, conn.send, args=('e',), exitpriority=-10) 1987ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 1988ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh util.Finalize(None, conn.send, args=('STOP',), exitpriority=-100) 1989ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 1990ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # call multiprocessing's cleanup function then exit process without 1991ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # garbage collecting locals 1992ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh util._exit_function() 1993ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh conn.close() 1994ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh os._exit(0) 1995ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 1996ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh def test_finalize(self): 1997ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh conn, child_conn = self.Pipe() 1998ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 1999ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh p = self.Process(target=self._test_finalize, args=(child_conn,)) 2000ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh p.daemon = True 2001ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh p.start() 2002ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh p.join() 2003ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 2004ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh result = [obj for obj in iter(conn.recv, 'STOP')] 2005ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(result, ['a', 'b', 'd10', 'd03', 'd02', 'd01', 'e']) 2006ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 2007ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh# 2008ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh# Test that from ... import * works for each module 2009ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh# 2010ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 2011ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehclass _TestImportStar(BaseTestCase): 2012ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 2013ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh ALLOWED_TYPES = ('processes',) 2014ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 2015ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh def test_import(self): 2016ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh modules = [ 2017ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 'multiprocessing', 'multiprocessing.connection', 2018ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 'multiprocessing.heap', 'multiprocessing.managers', 2019ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 'multiprocessing.pool', 'multiprocessing.process', 2020ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 'multiprocessing.synchronize', 'multiprocessing.util' 2021ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh ] 2022ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 2023ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh if HAS_REDUCTION: 2024ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh modules.append('multiprocessing.reduction') 2025ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 2026ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh if c_int is not None: 2027ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # This module requires _ctypes 2028ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh modules.append('multiprocessing.sharedctypes') 2029ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 2030ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh for name in modules: 2031ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh __import__(name) 2032ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh mod = sys.modules[name] 2033ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 2034ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh for attr in getattr(mod, '__all__', ()): 2035ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertTrue( 2036ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh hasattr(mod, attr), 2037ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh '%r does not have attribute %r' % (mod, attr) 2038ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh ) 2039ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 2040ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh# 2041ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh# Quick test that logging works -- does not test logging output 2042ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh# 2043ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 2044ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehclass _TestLogging(BaseTestCase): 2045ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 2046ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh ALLOWED_TYPES = ('processes',) 2047ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 2048ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh def test_enable_logging(self): 2049ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh logger = multiprocessing.get_logger() 2050ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh logger.setLevel(util.SUBWARNING) 2051ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertTrue(logger is not None) 2052ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh logger.debug('this will not be printed') 2053ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh logger.info('nor will this') 2054ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh logger.setLevel(LOG_LEVEL) 2055ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 2056ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh @classmethod 2057ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh def _test_level(cls, conn): 2058ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh logger = multiprocessing.get_logger() 2059ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh conn.send(logger.getEffectiveLevel()) 2060ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 2061ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh def test_level(self): 2062ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh LEVEL1 = 32 2063ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh LEVEL2 = 37 2064ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 2065ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh logger = multiprocessing.get_logger() 2066ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh root_logger = logging.getLogger() 2067ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh root_level = root_logger.level 2068ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 2069ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh reader, writer = multiprocessing.Pipe(duplex=False) 2070ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 2071ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh logger.setLevel(LEVEL1) 2072ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh p = self.Process(target=self._test_level, args=(writer,)) 2073ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh p.daemon = True 2074ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh p.start() 2075ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(LEVEL1, reader.recv()) 2076ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 2077ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh logger.setLevel(logging.NOTSET) 2078ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh root_logger.setLevel(LEVEL2) 2079ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh p = self.Process(target=self._test_level, args=(writer,)) 2080ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh p.daemon = True 2081ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh p.start() 2082ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(LEVEL2, reader.recv()) 2083ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 2084ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh root_logger.setLevel(root_level) 2085ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh logger.setLevel(level=LOG_LEVEL) 2086ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 2087ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 2088ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh# class _TestLoggingProcessName(BaseTestCase): 2089ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh# 2090ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh# def handle(self, record): 2091ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh# assert record.processName == multiprocessing.current_process().name 2092ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh# self.__handled = True 2093ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh# 2094ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh# def test_logging(self): 2095ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh# handler = logging.Handler() 2096ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh# handler.handle = self.handle 2097ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh# self.__handled = False 2098ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh# # Bypass getLogger() and side-effects 2099ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh# logger = logging.getLoggerClass()( 2100ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh# 'multiprocessing.test.TestLoggingProcessName') 2101ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh# logger.addHandler(handler) 2102ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh# logger.propagate = False 2103ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh# 2104ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh# logger.warn('foo') 2105ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh# assert self.__handled 2106ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 2107ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh# 2108ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh# Check that Process.join() retries if os.waitpid() fails with EINTR 2109ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh# 2110ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 2111ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehclass _TestPollEintr(BaseTestCase): 2112ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 2113ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh ALLOWED_TYPES = ('processes',) 2114ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 2115ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh @classmethod 2116ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh def _killer(cls, pid): 2117ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh time.sleep(0.5) 2118ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh os.kill(pid, signal.SIGUSR1) 2119ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 2120ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh @unittest.skipUnless(hasattr(signal, 'SIGUSR1'), 'requires SIGUSR1') 2121ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh def test_poll_eintr(self): 2122ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh got_signal = [False] 2123ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh def record(*args): 2124ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh got_signal[0] = True 2125ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh pid = os.getpid() 2126ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh oldhandler = signal.signal(signal.SIGUSR1, record) 2127ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh try: 2128ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh killer = self.Process(target=self._killer, args=(pid,)) 2129ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh killer.start() 2130ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh p = self.Process(target=time.sleep, args=(1,)) 2131ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh p.start() 2132ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh p.join() 2133ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertTrue(got_signal[0]) 2134ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(p.exitcode, 0) 2135ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh killer.join() 2136ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh finally: 2137ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh signal.signal(signal.SIGUSR1, oldhandler) 2138ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 2139ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh# 2140ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh# Test to verify handle verification, see issue 3321 2141ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh# 2142ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 2143ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehclass TestInvalidHandle(unittest.TestCase): 2144ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 2145ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh @unittest.skipIf(WIN32, "skipped on Windows") 2146ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh def test_invalid_handles(self): 2147ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh conn = _multiprocessing.Connection(44977608) 2148ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertRaises(IOError, conn.poll) 2149ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertRaises(IOError, _multiprocessing.Connection, -1) 2150ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 2151ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh# 2152ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh# Functions used to create test cases from the base ones in this module 2153ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh# 2154ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 2155ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehdef get_attributes(Source, names): 2156ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh d = {} 2157ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh for name in names: 2158ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh obj = getattr(Source, name) 2159ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh if type(obj) == type(get_attributes): 2160ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh obj = staticmethod(obj) 2161ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh d[name] = obj 2162ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh return d 2163ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 2164ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehdef create_test_cases(Mixin, type): 2165ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh result = {} 2166ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh glob = globals() 2167ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh Type = type.capitalize() 2168ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 2169ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh for name in glob.keys(): 2170ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh if name.startswith('_Test'): 2171ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh base = glob[name] 2172ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh if type in base.ALLOWED_TYPES: 2173ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh newname = 'With' + Type + name[1:] 2174ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh class Temp(base, unittest.TestCase, Mixin): 2175ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh pass 2176ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh result[newname] = Temp 2177ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh Temp.__name__ = newname 2178ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh Temp.__module__ = Mixin.__module__ 2179ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh return result 2180ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 2181ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh# 2182ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh# Create test cases 2183ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh# 2184ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 2185ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehclass ProcessesMixin(object): 2186ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh TYPE = 'processes' 2187ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh Process = multiprocessing.Process 2188ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh locals().update(get_attributes(multiprocessing, ( 2189ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 'Queue', 'Lock', 'RLock', 'Semaphore', 'BoundedSemaphore', 2190ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 'Condition', 'Event', 'Value', 'Array', 'RawValue', 2191ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 'RawArray', 'current_process', 'active_children', 'Pipe', 2192ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 'connection', 'JoinableQueue', 'Pool' 2193ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh ))) 2194ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 2195ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehtestcases_processes = create_test_cases(ProcessesMixin, type='processes') 2196ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehglobals().update(testcases_processes) 2197ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 2198ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 2199ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehclass ManagerMixin(object): 2200ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh TYPE = 'manager' 2201ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh Process = multiprocessing.Process 2202ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh manager = object.__new__(multiprocessing.managers.SyncManager) 2203ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh locals().update(get_attributes(manager, ( 2204ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 'Queue', 'Lock', 'RLock', 'Semaphore', 'BoundedSemaphore', 2205ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 'Condition', 'Event', 'Value', 'Array', 'list', 'dict', 2206ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 'Namespace', 'JoinableQueue', 'Pool' 2207ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh ))) 2208ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 2209ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehtestcases_manager = create_test_cases(ManagerMixin, type='manager') 2210ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehglobals().update(testcases_manager) 2211ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 2212ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 2213ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehclass ThreadsMixin(object): 2214ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh TYPE = 'threads' 2215ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh Process = multiprocessing.dummy.Process 2216ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh locals().update(get_attributes(multiprocessing.dummy, ( 2217ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 'Queue', 'Lock', 'RLock', 'Semaphore', 'BoundedSemaphore', 2218ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 'Condition', 'Event', 'Value', 'Array', 'current_process', 2219ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 'active_children', 'Pipe', 'connection', 'dict', 'list', 2220ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 'Namespace', 'JoinableQueue', 'Pool' 2221ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh ))) 2222ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 2223ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehtestcases_threads = create_test_cases(ThreadsMixin, type='threads') 2224ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehglobals().update(testcases_threads) 2225ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 2226ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehclass OtherTest(unittest.TestCase): 2227ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # TODO: add more tests for deliver/answer challenge. 2228ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh def test_deliver_challenge_auth_failure(self): 2229ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh class _FakeConnection(object): 2230ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh def recv_bytes(self, size): 2231ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh return b'something bogus' 2232ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh def send_bytes(self, data): 2233ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh pass 2234ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertRaises(multiprocessing.AuthenticationError, 2235ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh multiprocessing.connection.deliver_challenge, 2236ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh _FakeConnection(), b'abc') 2237ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 2238ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh def test_answer_challenge_auth_failure(self): 2239ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh class _FakeConnection(object): 2240ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh def __init__(self): 2241ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.count = 0 2242ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh def recv_bytes(self, size): 2243ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.count += 1 2244ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh if self.count == 1: 2245ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh return multiprocessing.connection.CHALLENGE 2246ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh elif self.count == 2: 2247ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh return b'something bogus' 2248ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh return b'' 2249ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh def send_bytes(self, data): 2250ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh pass 2251ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertRaises(multiprocessing.AuthenticationError, 2252ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh multiprocessing.connection.answer_challenge, 2253ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh _FakeConnection(), b'abc') 2254ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 2255ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh# 2256ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh# Test Manager.start()/Pool.__init__() initializer feature - see issue 5585 2257ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh# 2258ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 2259ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehdef initializer(ns): 2260ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh ns.test += 1 2261ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 2262ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehclass TestInitializers(unittest.TestCase): 2263ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh def setUp(self): 2264ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.mgr = multiprocessing.Manager() 2265ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.ns = self.mgr.Namespace() 2266ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.ns.test = 0 2267ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 2268ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh def tearDown(self): 2269ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.mgr.shutdown() 2270ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 2271ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh def test_manager_initializer(self): 2272ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh m = multiprocessing.managers.SyncManager() 2273ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertRaises(TypeError, m.start, 1) 2274ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh m.start(initializer, (self.ns,)) 2275ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(self.ns.test, 1) 2276ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh m.shutdown() 2277ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 2278ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh def test_pool_initializer(self): 2279ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertRaises(TypeError, multiprocessing.Pool, initializer=1) 2280ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh p = multiprocessing.Pool(1, initializer, (self.ns,)) 2281ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh p.close() 2282ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh p.join() 2283ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(self.ns.test, 1) 2284ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 2285ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh# 2286ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh# Issue 5155, 5313, 5331: Test process in processes 2287ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh# Verifies os.close(sys.stdin.fileno) vs. sys.stdin.close() behavior 2288ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh# 2289ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 2290ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehdef _ThisSubProcess(q): 2291ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh try: 2292ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh item = q.get(block=False) 2293ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh except Queue.Empty: 2294ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh pass 2295ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 2296ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehdef _TestProcess(q): 2297ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh queue = multiprocessing.Queue() 2298ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh subProc = multiprocessing.Process(target=_ThisSubProcess, args=(queue,)) 2299ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh subProc.daemon = True 2300ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh subProc.start() 2301ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh subProc.join() 2302ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 2303ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehdef _afunc(x): 2304ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh return x*x 2305ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 2306ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehdef pool_in_process(): 2307ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh pool = multiprocessing.Pool(processes=4) 2308ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh x = pool.map(_afunc, [1, 2, 3, 4, 5, 6, 7]) 2309ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 2310ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehclass _file_like(object): 2311ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh def __init__(self, delegate): 2312ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self._delegate = delegate 2313ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self._pid = None 2314ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 2315ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh @property 2316ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh def cache(self): 2317ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh pid = os.getpid() 2318ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # There are no race conditions since fork keeps only the running thread 2319ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh if pid != self._pid: 2320ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self._pid = pid 2321ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self._cache = [] 2322ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh return self._cache 2323ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 2324ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh def write(self, data): 2325ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.cache.append(data) 2326ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 2327ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh def flush(self): 2328ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self._delegate.write(''.join(self.cache)) 2329ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self._cache = [] 2330ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 2331ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehclass TestStdinBadfiledescriptor(unittest.TestCase): 2332ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 2333ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh def test_queue_in_process(self): 2334ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh queue = multiprocessing.Queue() 2335ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh proc = multiprocessing.Process(target=_TestProcess, args=(queue,)) 2336ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh proc.start() 2337ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh proc.join() 2338ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 2339ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh def test_pool_in_process(self): 2340ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh p = multiprocessing.Process(target=pool_in_process) 2341ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh p.start() 2342ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh p.join() 2343ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 2344ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh def test_flushing(self): 2345ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh sio = StringIO() 2346ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh flike = _file_like(sio) 2347ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh flike.write('foo') 2348ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh proc = multiprocessing.Process(target=lambda: flike.flush()) 2349ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh flike.flush() 2350ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh assert sio.getvalue() == 'foo' 2351ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 2352ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh# 2353ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh# Test interaction with socket timeouts - see Issue #6056 2354ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh# 2355ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 2356ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehclass TestTimeouts(unittest.TestCase): 2357ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh @classmethod 2358ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh def _test_timeout(cls, child, address): 2359ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh time.sleep(1) 2360ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh child.send(123) 2361ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh child.close() 2362ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh conn = multiprocessing.connection.Client(address) 2363ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh conn.send(456) 2364ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh conn.close() 2365ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 2366ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh def test_timeout(self): 2367ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh old_timeout = socket.getdefaulttimeout() 2368ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh try: 2369ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh socket.setdefaulttimeout(0.1) 2370ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh parent, child = multiprocessing.Pipe(duplex=True) 2371ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh l = multiprocessing.connection.Listener(family='AF_INET') 2372ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh p = multiprocessing.Process(target=self._test_timeout, 2373ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh args=(child, l.address)) 2374ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh p.start() 2375ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh child.close() 2376ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(parent.recv(), 123) 2377ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh parent.close() 2378ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh conn = l.accept() 2379ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(conn.recv(), 456) 2380ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh conn.close() 2381ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh l.close() 2382ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh p.join(10) 2383ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh finally: 2384ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh socket.setdefaulttimeout(old_timeout) 2385ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 2386ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh# 2387ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh# Test what happens with no "if __name__ == '__main__'" 2388ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh# 2389ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 2390ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehclass TestNoForkBomb(unittest.TestCase): 2391ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh def test_noforkbomb(self): 2392ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh name = os.path.join(os.path.dirname(__file__), 'mp_fork_bomb.py') 2393ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh if WIN32: 2394ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh rc, out, err = test.script_helper.assert_python_failure(name) 2395ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual('', out.decode('ascii')) 2396ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertIn('RuntimeError', err.decode('ascii')) 2397ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh else: 2398ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh rc, out, err = test.script_helper.assert_python_ok(name) 2399ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual('123', out.decode('ascii').rstrip()) 2400ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual('', err.decode('ascii')) 2401ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 2402ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh# 2403ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh# Issue 12098: check sys.flags of child matches that for parent 2404ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh# 2405ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 2406ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehclass TestFlags(unittest.TestCase): 2407ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh @classmethod 2408ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh def run_in_grandchild(cls, conn): 2409ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh conn.send(tuple(sys.flags)) 2410ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 2411ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh @classmethod 2412ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh def run_in_child(cls): 2413ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh import json 2414ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh r, w = multiprocessing.Pipe(duplex=False) 2415ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh p = multiprocessing.Process(target=cls.run_in_grandchild, args=(w,)) 2416ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh p.start() 2417ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh grandchild_flags = r.recv() 2418ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh p.join() 2419ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh r.close() 2420ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh w.close() 2421ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh flags = (tuple(sys.flags), grandchild_flags) 2422ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh print(json.dumps(flags)) 2423ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 2424ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh def test_flags(self): 2425ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh import json, subprocess 2426ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # start child process using unusual flags 2427ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh prog = ('from test.test_multiprocessing import TestFlags; ' + 2428ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 'TestFlags.run_in_child()') 2429ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh data = subprocess.check_output( 2430ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh [sys.executable, '-E', '-B', '-O', '-c', prog]) 2431ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh child_flags, grandchild_flags = json.loads(data.decode('ascii')) 2432ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(child_flags, grandchild_flags) 2433ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 2434ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh# 2435ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh# Issue #17555: ForkAwareThreadLock 2436ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh# 2437ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 2438ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehclass TestForkAwareThreadLock(unittest.TestCase): 2439ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # We recurisvely start processes. Issue #17555 meant that the 2440ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # after fork registry would get duplicate entries for the same 2441ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # lock. The size of the registry at generation n was ~2**n. 2442ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 2443ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh @classmethod 2444ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh def child(cls, n, conn): 2445ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh if n > 1: 2446ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh p = multiprocessing.Process(target=cls.child, args=(n-1, conn)) 2447ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh p.start() 2448ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh p.join() 2449ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh else: 2450ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh conn.send(len(util._afterfork_registry)) 2451ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh conn.close() 2452ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 2453ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh def test_lock(self): 2454ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh r, w = multiprocessing.Pipe(False) 2455ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh l = util.ForkAwareThreadLock() 2456ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh old_size = len(util._afterfork_registry) 2457ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh p = multiprocessing.Process(target=self.child, args=(5, w)) 2458ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh p.start() 2459ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh new_size = r.recv() 2460ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh p.join() 2461ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertLessEqual(new_size, old_size) 2462ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 2463ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh# 2464ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh# 2465ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh# 2466ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 2467ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehtestcases_other = [OtherTest, TestInvalidHandle, TestInitializers, 2468ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh TestStdinBadfiledescriptor, TestTimeouts, TestNoForkBomb, 2469ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh TestFlags, TestForkAwareThreadLock] 2470ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 2471ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh# 2472ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh# 2473ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh# 2474ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 2475ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehdef test_main(run=None): 2476ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh if sys.platform.startswith("linux"): 2477ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh try: 2478ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh lock = multiprocessing.RLock() 2479ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh except OSError: 2480ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh raise unittest.SkipTest("OSError raises on RLock creation, see issue 3111!") 2481ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 2482ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh check_enough_semaphores() 2483ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 2484ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh if run is None: 2485ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh from test.test_support import run_unittest as run 2486ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 2487ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh util.get_temp_dir() # creates temp directory for use by all processes 2488ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 2489ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh multiprocessing.get_logger().setLevel(LOG_LEVEL) 2490ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 2491ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh ProcessesMixin.pool = multiprocessing.Pool(4) 2492ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh ThreadsMixin.pool = multiprocessing.dummy.Pool(4) 2493ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh ManagerMixin.manager.__init__() 2494ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh ManagerMixin.manager.start() 2495ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh ManagerMixin.pool = ManagerMixin.manager.Pool(4) 2496ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 2497ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh testcases = ( 2498ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh sorted(testcases_processes.values(), key=lambda tc:tc.__name__) + 2499ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh sorted(testcases_threads.values(), key=lambda tc:tc.__name__) + 2500ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh sorted(testcases_manager.values(), key=lambda tc:tc.__name__) + 2501ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh testcases_other 2502ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh ) 2503ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 2504ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh loadTestsFromTestCase = unittest.defaultTestLoader.loadTestsFromTestCase 2505ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh suite = unittest.TestSuite(loadTestsFromTestCase(tc) for tc in testcases) 2506ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # (ncoghlan): Whether or not sys.exc_clear is executed by the threading 2507ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # module during these tests is at least platform dependent and possibly 2508ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # non-deterministic on any given platform. So we don't mind if the listed 2509ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # warnings aren't actually raised. 2510ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh with test_support.check_py3k_warnings( 2511ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh (".+__(get|set)slice__ has been removed", DeprecationWarning), 2512ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh (r"sys.exc_clear\(\) not supported", DeprecationWarning), 2513ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh quiet=True): 2514ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh run(suite) 2515ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 2516ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh ThreadsMixin.pool.terminate() 2517ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh ProcessesMixin.pool.terminate() 2518ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh ManagerMixin.pool.terminate() 2519ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh ManagerMixin.manager.shutdown() 2520ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 2521ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh del ProcessesMixin.pool, ThreadsMixin.pool, ManagerMixin.pool 2522ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 2523ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehdef main(): 2524ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh test_main(unittest.TextTestRunner(verbosity=2).run) 2525ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 2526ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehif __name__ == '__main__': 2527ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh main() 2528