(merge 3.2) Issue #11870: Skip test_threading.test_2_join_in_forked_process()

on platforms with known OS bugs

Share the list of platforms with known OS bugs with other tests. Patch written
by Charles-François Natali.
This commit is contained in:
Victor Stinner 2011-07-01 14:53:07 +02:00
commit 2555b0aac7
1 changed files with 11 additions and 14 deletions

View File

@ -418,6 +418,13 @@ class ThreadTests(BaseTestCase):
class ThreadJoinOnShutdown(BaseTestCase): class ThreadJoinOnShutdown(BaseTestCase):
# Between fork() and exec(), only async-safe functions are allowed (issues
# #12316 and #11870), and fork() from a worker thread is known to trigger
# problems with some operating systems (issue #3863): skip problematic tests
# on platforms known to behave badly.
platforms_to_skip = ('freebsd4', 'freebsd5', 'freebsd6', 'netbsd5',
'os2emx')
def _run_and_join(self, script): def _run_and_join(self, script):
script = """if 1: script = """if 1:
import sys, os, time, threading import sys, os, time, threading
@ -448,6 +455,7 @@ class ThreadJoinOnShutdown(BaseTestCase):
self._run_and_join(script) self._run_and_join(script)
@unittest.skipUnless(hasattr(os, 'fork'), "needs os.fork()") @unittest.skipUnless(hasattr(os, 'fork'), "needs os.fork()")
@unittest.skipIf(sys.platform in platforms_to_skip, "due to known OS bug")
def test_2_join_in_forked_process(self): def test_2_join_in_forked_process(self):
# Like the test above, but from a forked interpreter # Like the test above, but from a forked interpreter
script = """if 1: script = """if 1:
@ -464,15 +472,11 @@ class ThreadJoinOnShutdown(BaseTestCase):
self._run_and_join(script) self._run_and_join(script)
@unittest.skipUnless(hasattr(os, 'fork'), "needs os.fork()") @unittest.skipUnless(hasattr(os, 'fork'), "needs os.fork()")
@unittest.skipIf(sys.platform in platforms_to_skip, "due to known OS bug")
def test_3_join_in_forked_from_thread(self): def test_3_join_in_forked_from_thread(self):
# Like the test above, but fork() was called from a worker thread # Like the test above, but fork() was called from a worker thread
# In the forked process, the main Thread object must be marked as stopped. # In the forked process, the main Thread object must be marked as stopped.
# Skip platforms with known problems forking from a worker thread.
# See http://bugs.python.org/issue3863.
if sys.platform in ('freebsd4', 'freebsd5', 'freebsd6', 'netbsd5',
'os2emx'):
raise unittest.SkipTest('due to known OS bugs on ' + sys.platform)
script = """if 1: script = """if 1:
main_thread = threading.current_thread() main_thread = threading.current_thread()
def worker(): def worker():
@ -498,15 +502,11 @@ class ThreadJoinOnShutdown(BaseTestCase):
self.assertEqual(data, expected_output) self.assertEqual(data, expected_output)
@unittest.skipUnless(hasattr(os, 'fork'), "needs os.fork()") @unittest.skipUnless(hasattr(os, 'fork'), "needs os.fork()")
@unittest.skipIf(sys.platform in platforms_to_skip, "due to known OS bug")
def test_4_joining_across_fork_in_worker_thread(self): def test_4_joining_across_fork_in_worker_thread(self):
# There used to be a possible deadlock when forking from a child # There used to be a possible deadlock when forking from a child
# thread. See http://bugs.python.org/issue6643. # thread. See http://bugs.python.org/issue6643.
# Skip platforms with known problems forking from a worker thread.
# See http://bugs.python.org/issue3863.
if sys.platform in ('freebsd4', 'freebsd5', 'freebsd6', 'os2emx'):
raise unittest.SkipTest('due to known OS bugs on ' + sys.platform)
# The script takes the following steps: # The script takes the following steps:
# - The main thread in the parent process starts a new thread and then # - The main thread in the parent process starts a new thread and then
# tries to join it. # tries to join it.
@ -575,6 +575,7 @@ class ThreadJoinOnShutdown(BaseTestCase):
self.assertScriptHasOutput(script, "end of main\n") self.assertScriptHasOutput(script, "end of main\n")
@unittest.skipUnless(hasattr(os, 'fork'), "needs os.fork()") @unittest.skipUnless(hasattr(os, 'fork'), "needs os.fork()")
@unittest.skipIf(sys.platform in platforms_to_skip, "due to known OS bug")
def test_5_clear_waiter_locks_to_avoid_crash(self): def test_5_clear_waiter_locks_to_avoid_crash(self):
# Check that a spawned thread that forks doesn't segfault on certain # Check that a spawned thread that forks doesn't segfault on certain
# platforms, namely OS X. This used to happen if there was a waiter # platforms, namely OS X. This used to happen if there was a waiter
@ -587,10 +588,6 @@ class ThreadJoinOnShutdown(BaseTestCase):
# lock will be acquired, we can't know if the internal mutex will be # lock will be acquired, we can't know if the internal mutex will be
# acquired at the time of the fork. # acquired at the time of the fork.
# Skip platforms with known problems forking from a worker thread.
# See http://bugs.python.org/issue3863.
if sys.platform in ('freebsd4', 'freebsd5', 'freebsd6', 'os2emx'):
raise unittest.SkipTest('due to known OS bugs on ' + sys.platform)
script = """if True: script = """if True:
import os, time, threading import os, time, threading