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