76 lines
3.0 KiB
Python
76 lines
3.0 KiB
Python
"""Managed launch preserves direct I/O across engine command-line versions."""
|
|
from __future__ import annotations
|
|
|
|
import subprocess
|
|
from types import SimpleNamespace
|
|
|
|
import pytest
|
|
|
|
from hermes_cli.local_runtime import supervisor
|
|
|
|
|
|
@pytest.mark.parametrize("help_text, expected", [
|
|
("-lm, --load-mode MODE\n dio: use DirectIO if available", ["--load-mode", "dio"]),
|
|
("-dio, --direct-io use DirectIO if available", ["-dio"]),
|
|
])
|
|
def test_spawn_selects_supported_direct_io_option(tmp_path, monkeypatch, help_text, expected):
|
|
monkeypatch.setattr(supervisor, "runtimes_root", lambda: tmp_path / "runtime")
|
|
executable = tmp_path / "engine" / "llama-server"
|
|
monkeypatch.setattr(supervisor, "server_binary", lambda _: executable)
|
|
probes = []
|
|
|
|
def run(argv, **kwargs):
|
|
probes.append(argv)
|
|
return subprocess.CompletedProcess(argv, 0, help_text, "")
|
|
|
|
monkeypatch.setattr(supervisor.subprocess, "run", run)
|
|
commands = []
|
|
monkeypatch.setattr(supervisor, "spawn_server", lambda argv, **kwargs: (
|
|
commands.append(argv) or SimpleNamespace(pid=123, poll=lambda: 0), None,
|
|
))
|
|
sup = supervisor.LlamaServerSupervisor(tmp_path / "engine", tmp_path / "models", port=19001)
|
|
monkeypatch.setattr(sup, "_write_state", lambda: None)
|
|
try:
|
|
sup._spawn()
|
|
index = commands[0].index(expected[0])
|
|
assert commands[0][index:index + len(expected)] == expected
|
|
if expected[0] == "--load-mode":
|
|
assert "-dio" not in commands[0]
|
|
assert probes == [[str(executable), "--help"]]
|
|
finally:
|
|
sup.stop()
|
|
|
|
|
|
def test_direct_io_probe_is_reused_for_the_same_engine(tmp_path, monkeypatch):
|
|
calls = []
|
|
|
|
def run(argv, **kwargs):
|
|
calls.append(argv)
|
|
return subprocess.CompletedProcess(argv, 0, "--load-mode MODE", "")
|
|
|
|
monkeypatch.setattr(supervisor.subprocess, "run", run)
|
|
executable = tmp_path / "llama-server"
|
|
assert supervisor._direct_io_args(executable) == ("--load-mode", "dio")
|
|
assert supervisor._direct_io_args(executable) == ("--load-mode", "dio")
|
|
assert len(calls) == 1
|
|
|
|
|
|
def test_failed_engine_probe_can_be_retried(tmp_path, monkeypatch):
|
|
executable = tmp_path / "llama-server"
|
|
|
|
def fail(argv, **kwargs):
|
|
raise subprocess.TimeoutExpired(argv, 15)
|
|
|
|
monkeypatch.setattr(supervisor.subprocess, "run", fail)
|
|
with pytest.raises(subprocess.TimeoutExpired):
|
|
supervisor._direct_io_args(executable)
|
|
monkeypatch.setattr(supervisor.subprocess, "run", lambda argv, **kwargs:
|
|
subprocess.CompletedProcess(argv, 0, "--load-mode MODE", ""))
|
|
assert supervisor._direct_io_args(executable) == ("--load-mode", "dio")
|
|
|
|
|
|
def test_engine_without_direct_io_uses_its_supported_defaults(tmp_path, monkeypatch):
|
|
monkeypatch.setattr(supervisor.subprocess, "run", lambda argv, **kwargs:
|
|
subprocess.CompletedProcess(argv, 0, "--model FILE", ""))
|
|
assert supervisor._direct_io_args(tmp_path / "llama-server") == ()
|