]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
gh-132912: Use readline to synchronize between procs in remote pdb test (#132949)
authorTian Gao <gaogaotiantian@hotmail.com>
Fri, 25 Apr 2025 17:40:18 +0000 (10:40 -0700)
committerGitHub <noreply@github.com>
Fri, 25 Apr 2025 17:40:18 +0000 (18:40 +0100)
Lib/test/test_remote_pdb.py

index 8d2b584007ef41d5d078c31157a7755bbe8d8437..b7c4a8b14442805e60e0dd1d6bd938720ca81bac 100644 (file)
@@ -469,12 +469,6 @@ class PdbConnectTestCase(unittest.TestCase):
 
     def test_keyboard_interrupt(self):
         """Test that sending keyboard interrupt breaks into pdb."""
-        synchronizer_sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
-        synchronizer_sock.bind(('127.0.0.1', 0))  # Let OS assign port
-        synchronizer_sock.settimeout(SHORT_TIMEOUT)
-        synchronizer_sock.listen(1)
-        self.addCleanup(synchronizer_sock.close)
-        sync_port = synchronizer_sock.getsockname()[1]
 
         script = textwrap.dedent(f"""
             import time
@@ -491,11 +485,10 @@ class PdbConnectTestCase(unittest.TestCase):
                     version=pdb._PdbServer.protocol_version(),
                 )
                 print("Connected to debugger")
-                iterations = 10
-                socket.create_connection(('127.0.0.1', {sync_port})).close()
+                iterations = 50
                 while iterations > 0:
-                    print("Iteration", iterations)
-                    time.sleep(1)
+                    print("Iteration", iterations, flush=True)
+                    time.sleep(0.2)
                     iterations -= 1
                 return 42
 
@@ -512,22 +505,20 @@ class PdbConnectTestCase(unittest.TestCase):
             # Continue execution
             self._send_command(client_file, "c")
 
-            # Wait until execution has continued
-            synchronizer_sock.accept()[0].close()
-
-            # Wait a bit so the remote leaves create_connection(). This is not
-            # required but makes the rest of the test faster as we will exit the main
-            # loop immediately by setting iterations to 0.
-            time.sleep(0.1)
+            # Confirm that the remote is already in the while loop. We know
+            # it's in bar() and we can exit the loop immediately by setting
+            # iterations to 0.
+            while line := process.stdout.readline():
+                if line.startswith("Iteration"):
+                    break
 
             # Inject a script to interrupt the running process
             self._send_interrupt(process.pid)
             messages = self._read_until_prompt(client_file)
 
-            # Verify we got the keyboard interrupt message. Is possible that we get interrupted somewhere
-            # in bar() or when leving create_connection()
+            # Verify we got the keyboard interrupt message.
             interrupt_msgs = [msg['message'] for msg in messages if 'message' in msg]
-            expected_msg = [msg for msg in interrupt_msgs if "bar()" in msg or "create_connection()" in msg]
+            expected_msg = [msg for msg in interrupt_msgs if "bar()" in msg]
             self.assertGreater(len(expected_msg), 0)
 
             # Continue to end as fast as we can