]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
gh-100522 Add a test for 'futures.as_completed' timing out with a non-zero timeout...
authorJosephSBoyle <48555120+JosephSBoyle@users.noreply.github.com>
Thu, 26 Jan 2023 07:01:11 +0000 (07:01 +0000)
committerGitHub <noreply@github.com>
Thu, 26 Jan 2023 07:01:11 +0000 (23:01 -0800)
Lib/test/test_concurrent_futures.py

index fe9fdc4f44d37ba9a918844dbd23a5ac86d4014b..b3520ae3994e034a7865ce48cc683a6cc34efd45 100644 (file)
@@ -711,7 +711,6 @@ create_executor_tests(WaitTests,
 
 
 class AsCompletedTests:
-    # TODO(brian@sweetapp.com): Should have a test with a non-zero timeout.
     def test_no_timeout(self):
         future1 = self.executor.submit(mul, 2, 21)
         future2 = self.executor.submit(mul, 7, 6)
@@ -728,24 +727,29 @@ class AsCompletedTests:
                  future1, future2]),
                 completed)
 
-    def test_zero_timeout(self):
-        future1 = self.executor.submit(time.sleep, 2)
-        completed_futures = set()
-        try:
-            for future in futures.as_completed(
-                    [CANCELLED_AND_NOTIFIED_FUTURE,
-                     EXCEPTION_FUTURE,
-                     SUCCESSFUL_FUTURE,
-                     future1],
-                    timeout=0):
-                completed_futures.add(future)
-        except futures.TimeoutError:
-            pass
+    def test_future_times_out(self):
+        """Test ``futures.as_completed`` timing out before
+        completing it's final future."""
+        already_completed = {CANCELLED_AND_NOTIFIED_FUTURE,
+                             EXCEPTION_FUTURE,
+                             SUCCESSFUL_FUTURE}
 
-        self.assertEqual(set([CANCELLED_AND_NOTIFIED_FUTURE,
-                              EXCEPTION_FUTURE,
-                              SUCCESSFUL_FUTURE]),
-                         completed_futures)
+        for timeout in (0, 0.01):
+            with self.subTest(timeout):
+
+                future = self.executor.submit(time.sleep, 0.1)
+                completed_futures = set()
+                try:
+                    for f in futures.as_completed(
+                        already_completed | {future},
+                        timeout
+                    ):
+                        completed_futures.add(f)
+                except futures.TimeoutError:
+                    pass
+
+                # Check that ``future`` wasn't completed.
+                self.assertEqual(completed_futures, already_completed)
 
     def test_duplicate_futures(self):
         # Issue 20367. Duplicate futures should not raise exceptions or give