hermes-agent/tests/hermes_cli/test_gateway_runtime_health.py
Teknium 6b81590c55
test: prune low-value tests suite-wide (wave 1) — 46,820 → 28,106 test functions
Systematic prune per AGENTS.md test policy, one pass over every major
test tree (gateway, hermes_cli, tools, agent, run_agent, plugins, cli,
cron, tui_gateway, honcho/openviking, root-level):

- DELETE: source-reading tests (read_text/getsource on prod files),
  change-detector tests (exact catalog counts, model-name snapshots,
  config version literals), mock-echo tests (assert a mock returns what
  it was told), assertion-free/trivial tests, near-duplicate
  parametrizations (boundaries + one representative kept), async/sync
  twin duplicates, cosmetic within-file variations.
- KEEP (mandatory): security/redaction/approval guards, message-role
  alternation invariants, prompt-caching/deterministic-call-id
  invariants, issue-number regression tests (deduped), E2E tests.
- 6 test files deleted outright (script-style/no-assert or fully
  redundant); conftest.py, fakes/, fixtures/ untouched.
- tests/acp/conftest.py added: autouse fixture stubs the live
  models.dev/GitHub/Copilot/Anthropic inventory fetches that ACP server
  tests performed on every session create — test_server.py 147s → 3.4s,
  and the tests are now genuinely hermetic.
- Sleep-based slowness shrunk where safe (codex_ttfb_watchdog,
  compression_concurrent_fork, etc.); no wall-clock assertion tightened.

Verification: full hermetic suite via scripts/run_tests.sh —
2439 files, 31,130 tests passed, 0 failed, 0 flaky retries, 315s wall
(baseline: 583s wall, 13,564s subprocess CPU).
2026-07-29 13:10:23 -07:00

83 lines
2.8 KiB
Python

from datetime import datetime, timedelta, timezone
from hermes_cli.gateway import _runtime_health_lines
def _iso_age(seconds_ago: float) -> str:
"""ISO-8601 UTC timestamp ``seconds_ago`` in the past (drives _marker_is_stale)."""
return (datetime.now(timezone.utc) - timedelta(seconds=seconds_ago)).isoformat()
_STALE_LINE_PREFIX = "⚠ Stale gateway_state.json:"
def _stale_lines(lines):
return [ln for ln in lines if ln.startswith(_STALE_LINE_PREFIX)]
def test_runtime_health_lines_flags_stale_running_with_dead_pid(monkeypatch):
"""Stale updated_at + dead PID + 'running' -> contradiction line, no draining line."""
from gateway import status as status_mod
monkeypatch.setattr(
"gateway.status.read_runtime_status",
lambda: {
"gateway_state": "running",
"pid": 4242,
"start_time": 111,
"updated_at": _iso_age(600), # well past the 120s TTL -> stale
"active_agents": 0,
},
)
# Recorded PID is gone (ungraceful kill); no real process is touched.
monkeypatch.setattr(status_mod, "_pid_exists", lambda pid: False)
monkeypatch.setattr(status_mod, "_get_process_start_time", lambda pid: None)
lines = _runtime_health_lines()
stale = _stale_lines(lines)
assert len(stale) == 1, lines
assert "recorded state 'running'" in stale[0]
assert "recorded process is gone" in stale[0]
# The misleading live-state summary must be suppressed.
assert not any("draining" in ln.lower() for ln in lines), lines
def test_runtime_health_lines_include_fatal_platform_and_startup_reason(monkeypatch):
monkeypatch.setattr(
"gateway.status.read_runtime_status",
lambda: {
"gateway_state": "startup_failed",
"exit_reason": "telegram conflict",
"platforms": {
"telegram": {
"state": "fatal",
"error_message": "another poller is active",
}
},
},
)
lines = _runtime_health_lines()
assert "⚠ telegram: another poller is active" in lines
assert "⚠ Last startup issue: telegram conflict" in lines
def test_runtime_status_running_pid_validates_live_gateway_record(monkeypatch):
from gateway import status as status_mod
runtime = {
"pid": 12345,
"kind": "hermes-gateway",
"argv": ["/opt/hermes/hermes_cli/main.py", "gateway", "run", "--replace"],
"start_time": None,
"gateway_state": "running",
}
monkeypatch.setattr(status_mod, "_pid_exists", lambda pid: pid == 12345)
monkeypatch.setattr(status_mod, "_get_process_start_time", lambda pid: None)
monkeypatch.setattr(status_mod, "_looks_like_gateway_process", lambda pid: False)
assert status_mod.get_runtime_status_running_pid(runtime) == 12345