bpo-31249: test_concurrent_futures checks dangling threads (#3167)

Add a BaseTestCase class to test_concurrent_futures to check for
dangling threads and processes on all tests, not only tests using
ExecutorMixin.
This commit is contained in:
Victor Stinner 2017-08-21 23:24:24 +02:00 committed by GitHub
parent 58cf7488d5
commit 489d91c61d
1 changed files with 20 additions and 12 deletions

View File

@ -59,11 +59,20 @@ class MyObject(object):
pass pass
class BaseTestCase(unittest.TestCase):
def setUp(self):
self._thread_key = test.support.threading_setup()
def tearDown(self):
test.support.reap_children()
test.support.threading_cleanup(*self._thread_key)
class ExecutorMixin: class ExecutorMixin:
worker_count = 5 worker_count = 5
def setUp(self): def setUp(self):
self._thread_cleanup = test.support.threading_setup() super().setUp()
self.t1 = time.time() self.t1 = time.time()
try: try:
@ -81,8 +90,7 @@ class ExecutorMixin:
print("%.2fs" % dt, end=' ') print("%.2fs" % dt, end=' ')
self.assertLess(dt, 60, "synchronization issue: test lasted too long") self.assertLess(dt, 60, "synchronization issue: test lasted too long")
test.support.threading_cleanup(*self._thread_cleanup) super().tearDown()
test.support.reap_children()
def _prime_executor(self): def _prime_executor(self):
# Make sure that the executor is ready to do work before running the # Make sure that the executor is ready to do work before running the
@ -130,7 +138,7 @@ class ExecutorShutdownTest:
f.result() f.result()
class ThreadPoolShutdownTest(ThreadPoolMixin, ExecutorShutdownTest, unittest.TestCase): class ThreadPoolShutdownTest(ThreadPoolMixin, ExecutorShutdownTest, BaseTestCase):
def _prime_executor(self): def _prime_executor(self):
pass pass
@ -185,7 +193,7 @@ class ThreadPoolShutdownTest(ThreadPoolMixin, ExecutorShutdownTest, unittest.Tes
t.join() t.join()
class ProcessPoolShutdownTest(ProcessPoolMixin, ExecutorShutdownTest, unittest.TestCase): class ProcessPoolShutdownTest(ProcessPoolMixin, ExecutorShutdownTest, BaseTestCase):
def _prime_executor(self): def _prime_executor(self):
pass pass
@ -322,7 +330,7 @@ class WaitTests:
self.assertEqual(set([future2]), pending) self.assertEqual(set([future2]), pending)
class ThreadPoolWaitTests(ThreadPoolMixin, WaitTests, unittest.TestCase): class ThreadPoolWaitTests(ThreadPoolMixin, WaitTests, BaseTestCase):
def test_pending_calls_race(self): def test_pending_calls_race(self):
# Issue #14406: multi-threaded race condition when waiting on all # Issue #14406: multi-threaded race condition when waiting on all
@ -340,7 +348,7 @@ class ThreadPoolWaitTests(ThreadPoolMixin, WaitTests, unittest.TestCase):
sys.setswitchinterval(oldswitchinterval) sys.setswitchinterval(oldswitchinterval)
class ProcessPoolWaitTests(ProcessPoolMixin, WaitTests, unittest.TestCase): class ProcessPoolWaitTests(ProcessPoolMixin, WaitTests, BaseTestCase):
pass pass
@ -389,11 +397,11 @@ class AsCompletedTests:
self.assertEqual(len(completed), 1) self.assertEqual(len(completed), 1)
class ThreadPoolAsCompletedTests(ThreadPoolMixin, AsCompletedTests, unittest.TestCase): class ThreadPoolAsCompletedTests(ThreadPoolMixin, AsCompletedTests, BaseTestCase):
pass pass
class ProcessPoolAsCompletedTests(ProcessPoolMixin, AsCompletedTests, unittest.TestCase): class ProcessPoolAsCompletedTests(ProcessPoolMixin, AsCompletedTests, BaseTestCase):
pass pass
@ -464,7 +472,7 @@ class ExecutorTest:
self.executor_type(max_workers=number) self.executor_type(max_workers=number)
class ThreadPoolExecutorTest(ThreadPoolMixin, ExecutorTest, unittest.TestCase): class ThreadPoolExecutorTest(ThreadPoolMixin, ExecutorTest, BaseTestCase):
def test_map_submits_without_iteration(self): def test_map_submits_without_iteration(self):
"""Tests verifying issue 11777.""" """Tests verifying issue 11777."""
finished = [] finished = []
@ -481,7 +489,7 @@ class ThreadPoolExecutorTest(ThreadPoolMixin, ExecutorTest, unittest.TestCase):
(os.cpu_count() or 1) * 5) (os.cpu_count() or 1) * 5)
class ProcessPoolExecutorTest(ProcessPoolMixin, ExecutorTest, unittest.TestCase): class ProcessPoolExecutorTest(ProcessPoolMixin, ExecutorTest, BaseTestCase):
def test_killed_child(self): def test_killed_child(self):
# When a child process is abruptly terminated, the whole pool gets # When a child process is abruptly terminated, the whole pool gets
# "broken". # "broken".
@ -537,7 +545,7 @@ class ProcessPoolExecutorTest(ProcessPoolMixin, ExecutorTest, unittest.TestCase)
f1.getvalue()) f1.getvalue())
class FutureTests(unittest.TestCase): class FutureTests(BaseTestCase):
def test_done_callback_with_result(self): def test_done_callback_with_result(self):
callback_result = None callback_result = None
def fn(callback_future): def fn(callback_future):