From 46997381257d0c86f25365694a56370046f816b3 Mon Sep 17 00:00:00 2001 From: Sam Gross Date: Wed, 6 Mar 2024 17:30:06 +0000 Subject: [PATCH] gh-110097: Make test_map_timeout faster and increase timeout. This changes test_map_timeout to use an event instead of `time.sleep()` so that the common case can run faster. The test is re-run with a longer timeout (10 seconds) if the first attempt times out too soon. --- Lib/test/test_concurrent_futures/executor.py | 55 +++++++++++++++----- 1 file changed, 43 insertions(+), 12 deletions(-) diff --git a/Lib/test/test_concurrent_futures/executor.py b/Lib/test/test_concurrent_futures/executor.py index 6a79fe69ec37cf..a1c58fb55fd45e 100644 --- a/Lib/test/test_concurrent_futures/executor.py +++ b/Lib/test/test_concurrent_futures/executor.py @@ -22,8 +22,28 @@ def my_method(self): def make_dummy_object(_): return MyObject() +wait_event = None + +def init_wait_event(event): + global wait_event + wait_event = event + +def maybe_wait(should_wait): + if should_wait: + wait_event.wait(support.SHORT_TIMEOUT) + wait_event.clear() class ExecutorTest: + + def setUp(self): + if hasattr(self, "ctx"): + self.wait_event = self.get_context().Event() + else: + self.wait_event = threading.Event() + self.executor_kwargs = dict(initializer=init_wait_event, + initargs=(self.wait_event,)) + super().setUp() + # Executor.shutdown() and context manager usage is tested by # ExecutorShutdownTest. def test_submit(self): @@ -57,18 +77,29 @@ def test_map_exception(self): @support.requires_resource('walltime') def test_map_timeout(self): - results = [] - try: - for i in self.executor.map(time.sleep, - [0, 0, 6], - timeout=5): - results.append(i) - except futures.TimeoutError: - pass - else: - self.fail('expected TimeoutError') - - self.assertEqual([None, None], results) + def run_test(timeout): + results = [] + try: + for i in self.executor.map(maybe_wait, + [False, False, True], + timeout=timeout): + results.append(i) + except futures.TimeoutError: + self.wait_event.set() # cancel the last task + else: + self.fail('expected TimeoutError') + return results + + results = run_test(0.5) # First, try with a short timeout + if results != [None, None]: + # The launching of tasks may have timed out + self.assertLessEqual(len(results), 2) + self.assertTrue(results == [] or results == [None]) + + # re-run with a longer timeout + self.wait_event.clear() + results = run_test(10) + self.assertEqual(results, [None, None]) def test_shutdown_race_issue12456(self): # Issue #12456: race condition at shutdown where trying to post a