0ef5fcb1c5
Security / Dependency audit (pip-audit) (push) Has been cancelled
Security / CodeQL (javascript-typescript) (push) Has been cancelled
Security / CodeQL (python) (push) Has been cancelled
Security / Secret scan (gitleaks) (push) Has been cancelled
rust / test (ubuntu) (push) Has been cancelled
rust / simulator e2e (macos-latest) (push) Has been cancelled
rust / simulator e2e (ubuntu-latest) (push) Has been cancelled
rust / simulator e2e (windows-latest) (push) Has been cancelled
rust / wheels (aarch64-apple-darwin) (push) Has been cancelled
rust / wheels (x86_64-unknown-linux-gnu) (push) Has been cancelled
rust / wheels (x86_64-apple-darwin) (push) Has been cancelled
rust / audit (push) Has been cancelled
rust / parity (nightly, allowed to fail during Phase 0) (push) Has been cancelled
CI / commitlint (push) Has been skipped
Dev Containers / validate (.devcontainer/devcontainer.json, default) (push) Failing after 0s
Dev Containers / validate (.devcontainer/memory-stack/devcontainer.json, memory-stack) (push) Failing after 0s
Dev Containers / validate-worktree (push) Failing after 0s
CI / changes (push) Failing after 4s
Deploy Documentation / validate (push) Has been skipped
Deploy Documentation / deploy (push) Failing after 1s
Init Native E2E / init-native (ubuntu-latest, claude) (push) Failing after 1s
Init Native E2E / init-native (ubuntu-latest, codex) (push) Failing after 1s
Install Native E2E / install-native (ubuntu-latest) (push) Failing after 1s
OpenCode Plugin / typecheck + build + test (push) Failing after 1s
Init Native E2E / init-native (ubuntu-latest, copilot) (push) Failing after 1s
Release Please / release-please (push) Failing after 1s
Wrap E2E / docker-wrap-e2e (push) Failing after 1s
Wrap Native E2E / wrap-native (ubuntu-latest) (push) Failing after 1s
Init E2E / docker-init-e2e (push) Failing after 4s
Merge Conflicts / merge-conflicts (push) Failing after 4s
CI / lint (push) Has been cancelled
CI / build-wheel (push) Has been cancelled
CI / build-wheel-windows (push) Has been cancelled
CI / prefetch-model (push) Has been cancelled
CI / test-dashboard-ui (push) Has been cancelled
CI / test (1) (push) Has been cancelled
CI / test (2) (push) Has been cancelled
CI / test (3) (push) Has been cancelled
CI / test (4) (push) Has been cancelled
CI / test-extras (push) Has been cancelled
CI / test-agno (push) Has been cancelled
CI / build (push) Has been cancelled
CI / workflow-validation (push) Has been cancelled
CI / docker-native-e2e (push) Has been cancelled
CI / windows-native-wrapper (push) Has been cancelled
CI / macos-native-wrapper (push) Has been cancelled
Docker / docker-build (map[name:arm64 platform:linux/arm64 runs_on:ubuntu-24.04-arm], map[bake_target:runtime-code-nonroot name:code-nonroot]) (push) Has been cancelled
Docker / docker-build (map[name:arm64 platform:linux/arm64 runs_on:ubuntu-24.04-arm], map[bake_target:runtime-code-slim name:code-slim]) (push) Has been cancelled
Docker / docker-build (map[name:arm64 platform:linux/arm64 runs_on:ubuntu-24.04-arm], map[bake_target:runtime-code-slim-nonroot name:code-slim-nonroot]) (push) Has been cancelled
Docker / docker-build (map[name:arm64 platform:linux/arm64 runs_on:ubuntu-24.04-arm], map[bake_target:runtime-nonroot name:nonroot]) (push) Has been cancelled
Docker / docker-build (map[name:arm64 platform:linux/arm64 runs_on:ubuntu-24.04-arm], map[bake_target:runtime-slim name:slim]) (push) Has been cancelled
Docker / docker-build (map[name:arm64 platform:linux/arm64 runs_on:ubuntu-24.04-arm], map[bake_target:runtime-slim-nonroot name:slim-nonroot]) (push) Has been cancelled
Docker / docker-manifest (map[bake_target:runtime name:]) (push) Has been cancelled
Docker / docker-manifest (map[bake_target:runtime-code name:code]) (push) Has been cancelled
Docker / docker-manifest (map[bake_target:runtime-code-nonroot name:code-nonroot]) (push) Has been cancelled
Docker / docker-manifest (map[bake_target:runtime-code-slim name:code-slim]) (push) Has been cancelled
Docker / docker-manifest (map[bake_target:runtime-code-slim-nonroot name:code-slim-nonroot]) (push) Has been cancelled
Docker / docker-manifest (map[bake_target:runtime-nonroot name:nonroot]) (push) Has been cancelled
Docker / docker-manifest (map[bake_target:runtime-slim name:slim]) (push) Has been cancelled
Docker / docker-manifest (map[bake_target:runtime-slim-nonroot name:slim-nonroot]) (push) Has been cancelled
Docker / docker-build (map[name:amd64 platform:linux/amd64 runs_on:ubuntu-24.04], map[bake_target:runtime name:]) (push) Has been cancelled
Docker / docker-build (map[name:amd64 platform:linux/amd64 runs_on:ubuntu-24.04], map[bake_target:runtime-code name:code]) (push) Has been cancelled
Docker / docker-build (map[name:amd64 platform:linux/amd64 runs_on:ubuntu-24.04], map[bake_target:runtime-code-nonroot name:code-nonroot]) (push) Has been cancelled
Docker / docker-build (map[name:amd64 platform:linux/amd64 runs_on:ubuntu-24.04], map[bake_target:runtime-code-slim name:code-slim]) (push) Has been cancelled
Docker / docker-build (map[name:amd64 platform:linux/amd64 runs_on:ubuntu-24.04], map[bake_target:runtime-code-slim-nonroot name:code-slim-nonroot]) (push) Has been cancelled
Docker / docker-build (map[name:amd64 platform:linux/amd64 runs_on:ubuntu-24.04], map[bake_target:runtime-nonroot name:nonroot]) (push) Has been cancelled
Docker / docker-build (map[name:amd64 platform:linux/amd64 runs_on:ubuntu-24.04], map[bake_target:runtime-slim name:slim]) (push) Has been cancelled
Docker / docker-build (map[name:amd64 platform:linux/amd64 runs_on:ubuntu-24.04], map[bake_target:runtime-slim-nonroot name:slim-nonroot]) (push) Has been cancelled
Docker / docker-build (map[name:arm64 platform:linux/arm64 runs_on:ubuntu-24.04-arm], map[bake_target:runtime name:]) (push) Has been cancelled
Docker / docker-build (map[name:arm64 platform:linux/arm64 runs_on:ubuntu-24.04-arm], map[bake_target:runtime-code name:code]) (push) Has been cancelled
Docker / promote-latest (push) Has been cancelled
Init Native E2E / init-native (macos-latest, claude) (push) Has been cancelled
Init Native E2E / init-native (macos-latest, codex) (push) Has been cancelled
Init Native E2E / init-native (macos-latest, copilot) (push) Has been cancelled
Install Native E2E / install-native (macos-latest) (push) Has been cancelled
Wrap Native E2E / wrap-native (macos-latest) (push) Has been cancelled
110 lines
3.5 KiB
Python
110 lines
3.5 KiB
Python
"""Tests for the complete stateless write guarantee.
|
|
|
|
Covers the process-wide stateless flag and the opt-in serving writers gated by
|
|
it: the output-savings recorder and persistent memory. (Savings tracker and
|
|
TOIN are covered in their own test modules.)
|
|
"""
|
|
|
|
from __future__ import annotations
|
|
|
|
import pytest
|
|
|
|
pytest.importorskip("fastapi")
|
|
|
|
from headroom import paths
|
|
from headroom.proxy.output_savings import SavingsRecorder
|
|
from headroom.relevance.embedding import (
|
|
_DEFAULT_MODEL_PINNED_REVISION,
|
|
DEFAULT_MODEL_NAME,
|
|
_pinned_revision,
|
|
)
|
|
|
|
|
|
@pytest.fixture(autouse=True)
|
|
def _reset_stateless_globals():
|
|
"""The stateless flag and TOIN singleton are process-global — never leak."""
|
|
yield
|
|
paths.set_process_stateless(False)
|
|
try:
|
|
from headroom.telemetry.toin import reset_toin
|
|
|
|
reset_toin()
|
|
except Exception:
|
|
pass
|
|
|
|
|
|
# ---- process-wide stateless flag ------------------------------------------
|
|
|
|
|
|
def test_process_stateless_flag_set_and_clear(monkeypatch):
|
|
monkeypatch.delenv("HEADROOM_STATELESS", raising=False)
|
|
paths.set_process_stateless(False)
|
|
assert paths.process_is_stateless() is False
|
|
paths.set_process_stateless(True)
|
|
assert paths.process_is_stateless() is True
|
|
|
|
|
|
@pytest.mark.parametrize(
|
|
"value,expected", [("1", True), ("true", True), ("on", True), ("off", False), ("", False)]
|
|
)
|
|
def test_process_stateless_env(monkeypatch, value, expected):
|
|
paths.set_process_stateless(False)
|
|
monkeypatch.setenv("HEADROOM_STATELESS", value)
|
|
assert paths.process_is_stateless() is expected
|
|
|
|
|
|
# ---- output-savings recorder ----------------------------------------------
|
|
|
|
|
|
def test_output_savings_flush_writes_nothing_when_stateless(tmp_path, monkeypatch):
|
|
monkeypatch.delenv("HEADROOM_STATELESS", raising=False)
|
|
path = tmp_path / "output_savings.json"
|
|
paths.set_process_stateless(True)
|
|
rec = SavingsRecorder(path)
|
|
rec.flush()
|
|
assert not path.exists()
|
|
|
|
|
|
def test_output_savings_flush_persists_when_not_stateless(tmp_path, monkeypatch):
|
|
monkeypatch.delenv("HEADROOM_STATELESS", raising=False)
|
|
path = tmp_path / "output_savings.json"
|
|
paths.set_process_stateless(False)
|
|
rec = SavingsRecorder(path)
|
|
rec.flush()
|
|
assert path.exists()
|
|
|
|
|
|
# ---- persistent memory ----------------------------------------------------
|
|
|
|
|
|
def test_memory_disabled_under_stateless(tmp_path, monkeypatch):
|
|
"""A stateless proxy with --memory must not initialize memory or write a DB."""
|
|
monkeypatch.chdir(tmp_path)
|
|
monkeypatch.setenv("HEADROOM_WORKSPACE_DIR", str(tmp_path))
|
|
from headroom.proxy.server import ProxyConfig, create_app
|
|
|
|
app = create_app(ProxyConfig(memory_enabled=True, stateless=True))
|
|
proxy = app.state.proxy
|
|
assert proxy.memory_handler is None
|
|
assert not (tmp_path / ".headroom" / "memory.db").exists()
|
|
|
|
|
|
# ---- fastembed model pinning ----------------------------------------------
|
|
|
|
|
|
def test_fastembed_default_model_is_pinned_to_sha(monkeypatch):
|
|
monkeypatch.delenv("HEADROOM_HF_PIN", raising=False)
|
|
rev = _pinned_revision(DEFAULT_MODEL_NAME)
|
|
assert rev == _DEFAULT_MODEL_PINNED_REVISION
|
|
assert len(rev) == 40 and all(c in "0123456789abcdef" for c in rev)
|
|
|
|
|
|
def test_fastembed_custom_model_not_pinned(monkeypatch):
|
|
monkeypatch.delenv("HEADROOM_HF_PIN", raising=False)
|
|
assert _pinned_revision("intfloat/e5-small-v2") is None
|
|
|
|
|
|
def test_fastembed_pin_can_be_disabled(monkeypatch):
|
|
monkeypatch.setenv("HEADROOM_HF_PIN", "off")
|
|
assert _pinned_revision(DEFAULT_MODEL_NAME) is None
|