Files
aiturk-hermes-ide/tests/hermes_cli/test_local_runtime_updates.py
T

124 lines
4.5 KiB
Python

"""Engine-update contracts (Rollout 4 follow-up):
- default tag flows from DEFAULT_CONFIG unless the user pinned;
- boot serves what is INSTALLED, never downloads (the ladder);
- update_available only when the local engine is enabled AND installed
AND the configured tag is missing on disk;
- the update itself is a button-driven job, and prune keeps N-1.
"""
from __future__ import annotations
import json
import pytest
@pytest.fixture
def hermes_home(tmp_path, monkeypatch):
home = tmp_path / ".hermes"
home.mkdir()
monkeypatch.setenv("HERMES_HOME", str(home))
return home
def _install_fake_tag(home, tag: str, backend: str = "cuda") -> None:
d = home / "runtimes" / "llamacpp" / tag / backend
d.mkdir(parents=True)
(d / "manifest.json").write_text(json.dumps({
"tag": tag, "backend": backend, "assets": {},
"verified_version": f"version: {tag.lstrip('b')}",
}), encoding="utf-8")
# server_binary() looks for the executable name per-OS; give it both.
(d / "llama-server.exe").write_bytes(b"MZ fake")
(d / "llama-server").write_bytes(b"\x7fELF fake")
def test_installed_tags_newest_first(hermes_home):
from hermes_cli.local_runtime.binaries import installed_tags
assert installed_tags() == []
_install_fake_tag(hermes_home, "b10290")
_install_fake_tag(hermes_home, "b10412")
assert installed_tags() == ["b10412", "b10290"]
def test_default_tag_flows_from_default_config(hermes_home):
"""Unpinned users inherit the Hermes-release default (deep-merge);
the shipped default must be a plausible rolling tag."""
from hermes_cli.config import load_config
from hermes_cli.config_defaults import DEFAULT_CONFIG
default_tag = DEFAULT_CONFIG["local_runtime"]["tag"]
assert default_tag.startswith("b") and default_tag.lstrip("b").isdigit()
assert load_config()["local_runtime"]["tag"] == default_tag
def test_update_available_requires_enabled_and_installed(hermes_home, monkeypatch):
"""The flag's truth table: enabled+installed+configured-missing only."""
from fastapi.testclient import TestClient
from hermes_cli import web_server
client = TestClient(web_server.app)
# Same auth pattern as the other local-models route tests.
client.headers[web_server._SESSION_HEADER_NAME] = web_server._SESSION_TOKEN
def status():
r = client.get("/api/local-models/status")
assert r.status_code == 200, r.text
return r.json()
import hermes_cli.web_routers.local_models as lm
# Case 1: enabled, configured newer than installed -> update available.
monkeypatch.setattr(lm, "_runtime_section",
lambda: {"enabled": True, "tag": "b10412"})
_install_fake_tag(hermes_home, "b10290")
s = status()
assert s["update_available"] is True
assert s["configured_tag"] == "b10412"
assert s["tag"] == "b10290" # serving what's installed
# Case 2: configured tag installed -> no update.
_install_fake_tag(hermes_home, "b10412")
s = status()
assert s["update_available"] is False
assert s["tag"] == "b10412"
# Case 3: disabled -> never flagged, even with a mismatch.
monkeypatch.setattr(lm, "_runtime_section",
lambda: {"enabled": False, "tag": "b10999"})
assert status()["update_available"] is False
def test_boot_never_downloads_missing_tag(hermes_home, monkeypatch):
"""The ladder: configured-but-not-installed serves the newest installed
tag; nothing installed means no boot (and NO download either way)."""
from hermes_cli.local_runtime import bootstrap
calls = []
monkeypatch.setattr(
"hermes_cli.local_runtime.binaries.ensure_runtime_installed",
lambda tag, backend, **kw: calls.append(tag) or (_ for _ in ()).throw(
AssertionError("boot must not reach install for missing tags")))
# Nothing installed: returns None before any install attempt.
cfg = {"local_runtime": {"enabled": True, "tag": "b10412"}}
assert bootstrap.ensure_local_runtime(cfg) is None
assert calls == []
def test_prune_keeps_n_minus_one(hermes_home):
from hermes_cli.local_runtime.binaries import installed_tags, prune_old_tags
for tag in ("b10100", "b10200", "b10290"):
_install_fake_tag(hermes_home, tag)
prune_old_tags(["b10290", "b10200"])
assert installed_tags() == ["b10290", "b10200"]
# downloads/ cache dir must survive pruning when present.
downloads = hermes_home / "runtimes" / "llamacpp" / "downloads"
downloads.mkdir(exist_ok=True)
prune_old_tags(["b10290"])
assert downloads.exists()