120 lines
4.1 KiB
Python
120 lines
4.1 KiB
Python
"""Tests for scripts/collect_leo_restart_survival_proof.py."""
|
|
|
|
from __future__ import annotations
|
|
|
|
import argparse
|
|
import json
|
|
import sys
|
|
from pathlib import Path
|
|
|
|
REPO_ROOT = Path(__file__).resolve().parents[1]
|
|
sys.path.insert(0, str(REPO_ROOT / "scripts"))
|
|
|
|
import collect_leo_restart_survival_proof as restart_proof # noqa: E402
|
|
|
|
|
|
COUNTS = {
|
|
"public.claims": 1837,
|
|
"public.sources": 4145,
|
|
"public.claim_evidence": 4670,
|
|
"public.claim_edges": 4916,
|
|
"kb_stage.kb_proposals": 26,
|
|
}
|
|
|
|
|
|
def args(tmp_path: Path, *, execute_restart: bool = True, skip_handler: bool = False) -> argparse.Namespace:
|
|
return argparse.Namespace(
|
|
execute_restart=execute_restart,
|
|
skip_handler=skip_handler,
|
|
out=tmp_path / "restart.json",
|
|
markdown_out=tmp_path / "restart.md",
|
|
ssh_target="root@example.test",
|
|
ssh_key=tmp_path / "key",
|
|
connect_timeout=1,
|
|
timeout=5,
|
|
active_timeout=5,
|
|
poll_interval=0,
|
|
handler_timeout=5,
|
|
handler_turn_timeout=300,
|
|
remote_handler_report="/tmp/leo-restart-survival-direct-claim-current.json",
|
|
)
|
|
|
|
|
|
def readback(label: str, pid: str) -> dict:
|
|
return {
|
|
"label": label,
|
|
"remote_repo": "/opt/teleo-eval/workspaces/deploy-infra",
|
|
"deploy_head": "abc123",
|
|
"last_deploy_sha": "abc123",
|
|
"git_status_short": "",
|
|
"service": {
|
|
"returncode": 0,
|
|
"stderr": "",
|
|
"state": {
|
|
"ActiveState": "active",
|
|
"SubState": "running",
|
|
"MainPID": pid,
|
|
"NRestarts": "0",
|
|
"ExecMainStartTimestamp": "Fri 2026-07-10 01:04:22 UTC",
|
|
},
|
|
},
|
|
"db_counts": {"returncode": 0, "stderr": "", "counts": COUNTS, "raw": json.dumps(COUNTS)},
|
|
}
|
|
|
|
|
|
def fake_runner(command: list[str], input_text: str, timeout: int) -> restart_proof.CommandResult:
|
|
remote = command[-1]
|
|
if "before_restart" in remote:
|
|
return restart_proof.CommandResult(0, json.dumps(readback("before_restart", "100")) + "\n", "")
|
|
if remote == "systemctl restart leoclean-gateway.service":
|
|
return restart_proof.CommandResult(0, "", "")
|
|
if "after_restart_poll" in remote:
|
|
return restart_proof.CommandResult(0, json.dumps(readback("after_restart_poll", "200")) + "\n", "")
|
|
if "run_leo_direct_claim_handler_remote.py" in remote:
|
|
return restart_proof.CommandResult(
|
|
0,
|
|
json.dumps(
|
|
{
|
|
"pass_runtime": True,
|
|
"posted_to_telegram": False,
|
|
"mutates_kb_by_harness": False,
|
|
"changed_live_profile": False,
|
|
"temp_profile_removed": True,
|
|
"results": [{"prompt_id": "DC-01", "ok": True, "reply": "ok"}],
|
|
}
|
|
)
|
|
+ "\n",
|
|
"",
|
|
)
|
|
raise AssertionError(remote)
|
|
|
|
|
|
def test_collect_restart_survival_passes_with_unchanged_counts_and_handler(tmp_path: Path):
|
|
report = restart_proof.collect(args(tmp_path), runner=fake_runner)
|
|
|
|
assert report["status"] == "pass"
|
|
assert report["survives_restart"] is True
|
|
assert report["db_counts_changed"] is False
|
|
assert report["posted_to_telegram"] is False
|
|
assert report["production_db_apply_ran"] is False
|
|
assert report["handler"]["pass_runtime"] is True
|
|
assert report["before"]["service"]["state"]["MainPID"] == "100"
|
|
assert report["after"]["service"]["state"]["MainPID"] == "200"
|
|
|
|
|
|
def test_collect_refuses_to_claim_restart_without_execute_flag(tmp_path: Path):
|
|
report = restart_proof.collect(args(tmp_path, execute_restart=False), runner=fake_runner)
|
|
|
|
assert report["status"] == "not_executed_missing_execute_restart"
|
|
assert report["survives_restart"] is False
|
|
assert "before" in report
|
|
|
|
|
|
def test_markdown_report_names_safety_boundaries(tmp_path: Path):
|
|
report = restart_proof.collect(args(tmp_path), runner=fake_runner)
|
|
|
|
text = restart_proof.markdown_report(report)
|
|
|
|
assert "Survives restart: `True`" in text
|
|
assert "Posted to Telegram: `False`" in text
|
|
assert "Production DB apply ran: `False`" in text
|