Fix bidirectional RF-001A coordination
This commit is contained in:
87
tests/test_capture_process_runner.py
Normal file
87
tests/test_capture_process_runner.py
Normal file
@@ -0,0 +1,87 @@
|
||||
"""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
|
||||
Reference in New Issue
Block a user