"""A killed runner cannot leave a child holding its Mineflayer port.""" import os import socket import subprocess import sys import time from pathlib import Path import pytest sys.path.insert(0, str(Path(__file__).resolve().parents[1])) from voyager_processes import stop_runner @pytest.mark.skipif(os.name != "posix", reason="POSIX runner sessions") def test_orphan_port_is_released_without_touching_the_parent(): child = "import socket,time; s=socket.socket(); s.bind(('127.0.0.1',0)); s.listen(); print(s.getsockname()[1],flush=True); time.sleep(30)" leader = "import subprocess,sys,os; subprocess.Popen([sys.executable,'-u','-c',sys.argv[1]]); os._exit(75)" proc = subprocess.Popen([sys.executable, "-u", "-c", leader, child], stdout=subprocess.PIPE, text=True, start_new_session=True) port = int(proc.stdout.readline()) proc.wait(timeout=5) try: with socket.create_connection(("127.0.0.1", port), timeout=1): pass stop_runner(proc) deadline = time.monotonic() + 1 while True: try: connection = socket.create_connection(("127.0.0.1", port), timeout=0.1) connection.close() except OSError: break assert time.monotonic() < deadline, "orphan still holds the Mineflayer port" time.sleep(0.01) finally: stop_runner(proc)