Skip to content

gh-132912: Use readline to synchronize between procs in remote pdb test #132949

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 1 commit into from
Apr 25, 2025
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
31 changes: 11 additions & 20 deletions Lib/test/test_remote_pdb.py
Original file line number Diff line number Diff line change
Expand Up @@ -465,12 +465,6 @@ def test_breakpoints(self):

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
Expand All @@ -487,11 +481,10 @@ def bar():
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

Expand All @@ -508,22 +501,20 @@ def bar():
# 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
Expand Down
Loading