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
73 lines
2.8 KiB
Python
73 lines
2.8 KiB
Python
from __future__ import annotations
|
|
|
|
import pytest
|
|
|
|
from headroom.proxy.tool_injection_tracker import SessionToolTracker
|
|
|
|
|
|
def test_tracker_reports_unknown_session_as_not_injected() -> None:
|
|
tracker = SessionToolTracker(max_sessions=10)
|
|
|
|
assert tracker.should_inject("anthropic", "s-1") is False
|
|
|
|
|
|
def test_tracker_records_and_returns_golden_bytes_in_order() -> None:
|
|
tracker = SessionToolTracker(max_sessions=10)
|
|
|
|
tracker.record_injection("anthropic", "s-1", "memory_save", b"save")
|
|
tracker.record_injection("anthropic", "s-1", "memory_search", b"search")
|
|
|
|
assert tracker.should_inject("anthropic", "s-1") is True
|
|
assert tracker.get_golden_definitions("anthropic", "s-1") == [
|
|
("memory_save", b"save"),
|
|
("memory_search", b"search"),
|
|
]
|
|
|
|
|
|
def test_tracker_first_write_wins_per_tool_name() -> None:
|
|
tracker = SessionToolTracker(max_sessions=10)
|
|
|
|
tracker.record_injection("anthropic", "s-1", "memory_save", b"original")
|
|
tracker.record_injection("anthropic", "s-1", "memory_save", b"drift")
|
|
|
|
assert tracker.get_golden_definitions("anthropic", "s-1") == [("memory_save", b"original")]
|
|
|
|
|
|
def test_tracker_keeps_provider_namespaces_independent() -> None:
|
|
tracker = SessionToolTracker(max_sessions=10)
|
|
|
|
tracker.record_injection("anthropic", "shared", "memory_save", b"anthropic")
|
|
tracker.record_injection("openai", "shared", "memory_save", b"openai")
|
|
|
|
assert tracker.get_golden_definitions("anthropic", "shared") == [("memory_save", b"anthropic")]
|
|
assert tracker.get_golden_definitions("openai", "shared") == [("memory_save", b"openai")]
|
|
|
|
|
|
def test_tracker_evicts_least_recently_used_session() -> None:
|
|
tracker = SessionToolTracker(max_sessions=2)
|
|
tracker.record_injection("anthropic", "s-1", "memory_save", b"a")
|
|
tracker.record_injection("anthropic", "s-2", "memory_save", b"b")
|
|
|
|
assert tracker.should_inject("anthropic", "s-1") is True
|
|
tracker.record_injection("anthropic", "s-3", "memory_save", b"c")
|
|
|
|
assert tracker.active_sessions == 2
|
|
assert tracker.should_inject("anthropic", "s-1") is True
|
|
assert tracker.should_inject("anthropic", "s-2") is False
|
|
assert tracker.should_inject("anthropic", "s-3") is True
|
|
|
|
|
|
def test_tracker_validates_constructor_and_record_inputs() -> None:
|
|
with pytest.raises(ValueError, match="max_sessions"):
|
|
SessionToolTracker(max_sessions=0)
|
|
|
|
tracker = SessionToolTracker(max_sessions=10)
|
|
with pytest.raises(ValueError, match="provider"):
|
|
tracker.should_inject("", "s-1")
|
|
with pytest.raises(ValueError, match="session_id"):
|
|
tracker.get_golden_definitions("anthropic", "")
|
|
with pytest.raises(ValueError, match="tool_name"):
|
|
tracker.record_injection("anthropic", "s-1", "", b"bytes")
|
|
with pytest.raises(ValueError, match="tool_definition_bytes"):
|
|
tracker.record_injection("anthropic", "s-1", "memory_save", b"")
|