Files
hermes-agent/tests/test_batch_runner_exit_code.py
Christopher ae7b5c8eab fix(batch_runner): propagate fatal and validation errors as non-zero exit codes
Python Fire serializes the return value of a wrapped function but does not
use that value as the process exit code. Error paths in main() that used
 or  therefore caused the process to exit 0, swallowing
fatal errors and argument-validation failures.

Raise SystemExit(1) on every error path so batch_runner returns a non-zero
exit code when it cannot run. Success paths (e.g. --list_distributions) are
left unchanged.

Closes NousResearch/hermes-agent#86524.
2026-08-16 01:50:20 -07:00

65 lines
1.8 KiB
Python

"""Regression tests for batch_runner process exit codes.
Python Fire serializes the return value of the wrapped function but does not
use it as the process exit code. Before the fix, all of ``main``'s error paths
returned ``0`` because a bare ``return`` or ``return 1`` was treated as the
function result, not a non-zero exit status.
"""
import subprocess
import sys
from pathlib import Path
import pytest
REPO_ROOT = Path(__file__).parent.parent
PYTHON = sys.executable
def _run(*args):
return subprocess.run(
[PYTHON, "batch_runner.py", *args],
cwd=REPO_ROOT,
text=True,
capture_output=True,
)
def test_missing_dataset_file_exits_nonzero():
result = _run("--run_name=test")
assert result.returncode == 1
assert "--dataset_file is required" in result.stdout
def test_invalid_batch_size_exits_nonzero():
result = _run("--dataset_file=/tmp/data.jsonl", "--batch_size=-1", "--run_name=test")
assert result.returncode == 1
assert "--batch_size must be a positive integer" in result.stdout
def test_invalid_reasoning_effort_exits_nonzero():
result = _run(
"--dataset_file=/tmp/data.jsonl",
"--batch_size=1",
"--run_name=test",
"--reasoning_effort=invalid",
)
assert result.returncode == 1
assert "--reasoning_effort must be one of" in result.stdout
def test_invalid_prefill_messages_file_exits_nonzero(tmp_path):
bad_prefill = tmp_path / "prefill.json"
bad_prefill.write_text("not json", encoding="utf-8")
result = _run(
"--dataset_file=/tmp/data.jsonl",
"--batch_size=1",
"--run_name=test",
f"--prefill_messages_file={bad_prefill}",
)
assert result.returncode == 1
assert "Error loading prefill messages" in result.stdout