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