[Python-checkins] [3.6] bpo-31234: Enhance test_thread.test_forkinthread() (GH-3516) (#3519)

Victor Stinner webhook-mailer at python.org
Tue Sep 12 19:14:12 EDT 2017


https://github.com/python/cpython/commit/bcf042ff98b6261b7780c1e40fa1681ef30502f9
commit: bcf042ff98b6261b7780c1e40fa1681ef30502f9
branch: 3.6
author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com>
committer: Victor Stinner <victor.stinner at gmail.com>
date: 2017年09月12日T16:14:09-07:00
summary:
[3.6] bpo-31234: Enhance test_thread.test_forkinthread() (GH-3516) (#3519)
* test_thread.test_forkinthread() now waits until the thread completes.
* Check the status in the test method, not in the thread function
* Don't ignore RuntimeError anymore: since the commit
 346cbd351ee0dd3ab9cb9f0e4cb625556707877e (bpo-16500,
 os.register_at_fork(), os.fork() cannot fail anymore with
 RuntimeError.
* Replace 0.01 literal with a new POLL_SLEEP constant
* test_forkinthread(): test if os.fork() exists rather than testing
 the platform.
(cherry picked from commit a15d155aadfad232158f530278505cdc6f326f93)
files:
M Lib/test/test_thread.py
diff --git a/Lib/test/test_thread.py b/Lib/test/test_thread.py
index 2e2655aee7f..2dd1593eaa0 100644
--- a/Lib/test/test_thread.py
+++ b/Lib/test/test_thread.py
@@ -11,6 +11,7 @@
 
 NUMTASKS = 10
 NUMTRIPS = 3
+POLL_SLEEP = 0.010 # seconds = 10 ms
 
 _print_mutex = thread.allocate_lock()
 
@@ -114,7 +115,7 @@ def task():
 mut.release()
 thread.start_new_thread(task, ())
 while not started:
- time.sleep(0.01)
+ time.sleep(POLL_SLEEP)
 self.assertEqual(thread._count(), orig + 1)
 # Allow the task to finish.
 mut.release()
@@ -125,7 +126,7 @@ def task():
 wr = weakref.ref(task, lambda _: done.append(None))
 del task
 while not done:
- time.sleep(0.01)
+ time.sleep(POLL_SLEEP)
 self.assertEqual(thread._count(), orig)
 
 def test_save_exception_state_on_error(self):
@@ -148,7 +149,7 @@ def mywrite(self, *args):
 thread.start_new_thread(task, ())
 started.acquire()
 while thread._count() > c:
- time.sleep(0.01)
+ time.sleep(POLL_SLEEP)
 self.assertIn("Traceback", stderr.getvalue())
 
 
@@ -221,30 +222,36 @@ class TestForkInThread(unittest.TestCase):
 def setUp(self):
 self.read_fd, self.write_fd = os.pipe()
 
- @unittest.skipIf(sys.platform.startswith('win'),
- "This test is only appropriate for POSIX-like systems.")
+ @unittest.skipUnless(hasattr(os, 'fork'), 'need os.fork')
 @support.reap_threads
 def test_forkinthread(self):
+ running = True
+ status = "not set"
+
 def thread1():
- try:
- pid = os.fork() # fork in a thread
- except RuntimeError:
- os._exit(1) # exit the child
+ nonlocal running, status
 
- if pid == 0: # child
+ # fork in a thread
+ pid = os.fork()
+ if pid == 0:
+ # child
 try:
 os.close(self.read_fd)
 os.write(self.write_fd, b"OK")
 finally:
 os._exit(0)
- else: # parent
+ else:
+ # parent
 os.close(self.write_fd)
 pid, status = os.waitpid(pid, 0)
- self.assertEqual(status, 0)
+ running = False
 
 thread.start_new_thread(thread1, ())
 self.assertEqual(os.read(self.read_fd, 2), b"OK",
 "Unable to fork() in thread")
+ while running:
+ time.sleep(POLL_SLEEP)
+ self.assertEqual(status, 0)
 
 def tearDown(self):
 try:


More information about the Python-checkins mailing list

AltStyle によって変換されたページ (->オリジナル) /