"""Software-only checks for the durable capture process runner.""" from __future__ import annotations import hashlib import json import os from pathlib import Path import subprocess import pytest ROOT = Path(__file__).resolve().parents[1] RUNNER = ROOT / "tools" / "capture_process_runner.ps1" @pytest.mark.parametrize("expected_exit_code", [0, 7]) def test_runner_persists_exact_child_exit_code( tmp_path: Path, expected_exit_code: int, ) -> None: child = tmp_path / f"child_{expected_exit_code}.cmd" child.write_text( f"@echo off\r\nexit /b {expected_exit_code}\r\n", encoding="ascii", ) capture = tmp_path / "fake_capture.cs8" capture_bytes = b"software-only-capture-evidence\x00\x01" capture.write_bytes(capture_bytes) arguments_path = tmp_path / "arguments.json" arguments_path.write_text( json.dumps(["/d", "/c", str(child)]), encoding="utf-8", ) stdout_path = tmp_path / "child.stdout.txt" stderr_path = tmp_path / "child.stderr.txt" started_path = tmp_path / "capture_started.json" result_path = tmp_path / "capture_result.json" completed = subprocess.run( [ "powershell.exe", "-NoLogo", "-NoProfile", "-NonInteractive", "-ExecutionPolicy", "Bypass", "-File", str(RUNNER), "-Executable", str(Path(os.environ["COMSPEC"])), "-ArgumentsJsonPath", str(arguments_path), "-CapturePath", str(capture), "-StdoutPath", str(stdout_path), "-StderrPath", str(stderr_path), "-StartedStatusPath", str(started_path), "-ResultStatusPath", str(result_path), ], cwd=ROOT, capture_output=True, text=True, encoding="utf-8", errors="replace", check=False, ) assert completed.returncode == expected_exit_code started = json.loads(started_path.read_text(encoding="utf-8-sig")) result = json.loads(result_path.read_text(encoding="utf-8-sig")) assert started["state"] == "RUNNING" assert isinstance(started["pid"], int) and started["pid"] > 0 assert result["pid"] == started["pid"] assert result["started_at"] == started["started_at"] assert result["finished_at"] assert result["duration"] >= 0 assert result["exit_code"] == expected_exit_code assert result["capture_path"] == str(capture) assert result["capture_size"] == len(capture_bytes) assert result["sha256"] == hashlib.sha256(capture_bytes).hexdigest() assert result["runner_error"] is None