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