]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
gh-109582: test_fork_signal_handling should wait for event (#109605)
authorDavide Rizzo <sorcio@gmail.com>
Thu, 21 Sep 2023 21:20:29 +0000 (23:20 +0200)
committerGitHub <noreply@github.com>
Thu, 21 Sep 2023 21:20:29 +0000 (23:20 +0200)
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.

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())