from __future__ import annotations import subprocess import sys import time from pathlib import Path import pytest from game_data_capture.ingest.clipboard import ClipboardIntake, WatchConfig def test_shutdown_reaps_real_child_process_group( tmp_path: Path, monkeypatch: pytest.MonkeyPatch ) -> None: child: subprocess.Popen[bytes] | None = None real_popen = subprocess.Popen def fake_popen(args: list[str], **kwargs: object) -> subprocess.Popen[bytes]: nonlocal child assert args[0] == "wl-paste" and kwargs["shell"] is False child = real_popen( [sys.executable, "-c", "import time; time.sleep(30)"], stdin=subprocess.DEVNULL, stdout=subprocess.PIPE, stderr=subprocess.DEVNULL, start_new_session=True, ) return child monkeypatch.setattr(subprocess, "Popen", fake_popen) intake = ClipboardIntake( WatchConfig((tmp_path / "spool").resolve(), 100, 1, "v1", 1, 0.01, 0.2) ) intake.arm() assert child is not None and child.poll() is None intake.shutdown() for _ in range(20): if child.poll() is not None: break time.sleep(0.01) assert child.poll() is not None