]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
[3.12] gh-109582: test_fork_signal_handling should wait for event (GH-109605) (#109695)
authorMiss Islington (bot) <31488909+miss-islington@users.noreply.github.com>
Mon, 2 Oct 2023 15:14:30 +0000 (08:14 -0700)
committerGitHub <noreply@github.com>
Mon, 2 Oct 2023 15:14:30 +0000 (17:14 +0200)
gh-109582: test_fork_signal_handling should wait for event (GH-109605)

Sometimes the child_handled event was missing because either
the child quits before it gets a chance to handle the signal,
or the parent asserts before the event notification is
delivered via IPC.  Synchronize explicitly to avoid this.
(cherry picked from commit 608c1f3083ea1e06d383ef1a9878a9758903de4b)

Co-authored-by: Davide Rizzo <sorcio@gmail.com>
Lib/test/test_asyncio/test_unix_events.py

index cdf3eaac68af15983d86662376f7d9871f145c82..7322be597ae2d2bd29b8f895492c771da275ef15 100644 (file)
@@ -11,9 +11,11 @@ import socket
 import stat
 import sys
 import threading
+import time
 import unittest
 from unittest import mock
 import warnings
+from test import support
 from test.support import os_helper
 from test.support import socket_helper
 from test.support import wait_process
@@ -1911,8 +1913,14 @@ class TestFork(unittest.IsolatedAsyncioTestCase):
         parent_handled = manager.Event()
 
         def child_main():
-            signal.signal(signal.SIGTERM, lambda *args: child_handled.set())
+            def on_sigterm(*args):
+                child_handled.set()
+                sys.exit()
+
+            signal.signal(signal.SIGTERM, on_sigterm)
             child_started.set()
+            while True:
+                time.sleep(1)
 
         async def main():
             loop = asyncio.get_running_loop()
@@ -1922,7 +1930,7 @@ class TestFork(unittest.IsolatedAsyncioTestCase):
             process.start()
             child_started.wait()
             os.kill(process.pid, signal.SIGTERM)
-            process.join()
+            process.join(timeout=support.SHORT_TIMEOUT)
 
             async def func():
                 await asyncio.sleep(0.1)
@@ -1933,6 +1941,7 @@ class TestFork(unittest.IsolatedAsyncioTestCase):
 
         asyncio.run(main())
 
+        child_handled.wait(timeout=support.SHORT_TIMEOUT)
         self.assertFalse(parent_handled.is_set())
         self.assertTrue(child_handled.is_set())