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
|
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):
|
||||||
|
|
Loading…
Reference in New Issue