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