Files
chopratejas--headroom/tests/test_responses_pyo3_compression.py
wehub-resource-sync 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
chore: import upstream snapshot with attribution
2026-07-13 12:03:20 +08:00

200 lines
7.6 KiB
Python
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
"""Rust binding tests for `/v1/responses` live-zone compression.
The default Python CLI runtime currently compresses Responses payloads
through CompressionUnit extraction plus ContentRouter. This module keeps
the lower-level PyO3 live-zone binding covered so Rust migration work
cannot silently break the exposed bridge.
These tests pin:
1. The binding is exposed and callable.
2. Round-trip: a body with no eligible content passes through unchanged.
3. Round-trip: a body with a compressible function-call output gets compressed.
4. Errors are non-fatal: malformed JSON / missing input array → passthrough.
5. Auth-mode parsing accepts every variant the F1 classifier produces.
"""
from __future__ import annotations
import json
import pytest
def _ensure_binding():
"""Skip if the Rust extension hasn't been built (mirrors existing pattern)."""
try:
from headroom._core import compress_openai_responses_live_zone
return compress_openai_responses_live_zone
except ImportError:
pytest.skip("headroom._core not built — run scripts/build_rust_extension.sh")
class TestBindingExposed:
"""The pyfunction is reachable from Python."""
def test_callable(self):
compress = _ensure_binding()
assert callable(compress), "compress_openai_responses_live_zone must be callable"
class TestPassthroughCases:
"""Bodies the dispatcher cannot compress should be returned byte-for-byte
with `modified=False`. Matches the Rust proxy's `Outcome::Passthrough`
contract."""
def test_not_json_passthrough(self):
compress = _ensure_binding()
body = b"this is not JSON at all"
out, modified, _saved, _transforms, _reason = compress(body, "payg", "gpt-4o-mini")
assert out == body
assert modified is False
def test_no_input_array_passthrough(self):
compress = _ensure_binding()
body = json.dumps({"model": "gpt-4o-mini"}).encode()
out, modified, _saved, _transforms, _reason = compress(body, "payg", "gpt-4o-mini")
assert out == body
assert modified is False
def test_empty_input_array_passthrough(self):
compress = _ensure_binding()
body = json.dumps({"model": "gpt-4o-mini", "input": []}).encode()
out, modified, _saved, _transforms, _reason = compress(body, "payg", "gpt-4o-mini")
assert out == body
assert modified is False
def test_no_eligible_items_passthrough(self):
compress = _ensure_binding()
# Single user message under the byte threshold — no compression
# applies, but still valid input.
body = json.dumps(
{
"model": "gpt-4o-mini",
"input": [{"type": "message", "role": "user", "content": "hi"}],
}
).encode()
out, modified, _saved, _transforms, _reason = compress(body, "payg", "gpt-4o-mini")
assert modified is False
# Body should be byte-equal (passthrough, not re-serialized).
assert out == body
class TestAuthModeAccepted:
"""Every F1 AuthMode value is accepted; unrecognised falls back to
Unknown (does not raise)."""
@pytest.mark.parametrize(
"auth_mode",
["payg", "oauth", "subscription", "unknown", "", "garbage"],
)
def test_accepts(self, auth_mode):
compress = _ensure_binding()
body = json.dumps({"model": "gpt-4o-mini", "input": []}).encode()
# Should not raise on any string input.
out, modified, _saved, _transforms, _reason = compress(body, auth_mode, "gpt-4o-mini")
assert isinstance(out, bytes)
assert modified is False
class TestModelDefault:
"""Empty `model` defaults to `headroom_core`'s `DEFAULT_MODEL`."""
def test_empty_model_uses_default(self):
compress = _ensure_binding()
body = json.dumps({"input": []}).encode()
out, modified, _saved, _transforms, _reason = compress(body, "payg", "")
assert isinstance(out, bytes)
assert modified is False
class TestNoExceptionsLeak:
"""The binding's contract is `never raises` (matches the Rust proxy's
`compress_openai_responses_request` passthrough-on-error semantics).
Pin this so future maintainers don't accidentally introduce a
raising path."""
def test_garbage_bytes_no_raise(self):
compress = _ensure_binding()
out, modified, _saved, _transforms, _reason = compress(
b"\xff\xfe\x00\xff", "payg", "gpt-4o-mini"
)
assert modified is False
assert out == b"\xff\xfe\x00\xff"
def test_empty_body_no_raise(self):
compress = _ensure_binding()
out, modified, _saved, _transforms, _reason = compress(b"", "payg", "gpt-4o-mini")
assert modified is False
assert out == b""
class TestTelemetryFields:
"""The 4-tuple return surfaces ``tokens_saved`` (sum of
`original_tokens compressed_tokens` across the manifest's
Compressed outcomes) and ``transforms_applied`` (deduplicated list
of compressor strategy names). The Python proxy uses these to
populate /transformations/feed and the dashboard's per-request log
without recounting tokens. See `crates/headroom-core/src/transforms/
live_zone.rs::CompressionManifest::tokens_saved` /
`::transforms_applied`."""
def test_no_change_returns_zero_savings_and_empty_transforms(self):
compress = _ensure_binding()
body = json.dumps({"model": "gpt-4o-mini", "input": []}).encode()
out, modified, saved, transforms, reason = compress(body, "payg", "gpt-4o-mini")
assert modified is False
assert out == body
assert saved == 0
assert transforms == []
assert reason == "no_eligible_items"
def test_field_types(self):
"""Pin the wire shape so downstream callers don't break."""
compress = _ensure_binding()
body = json.dumps({"model": "gpt-4o-mini", "input": []}).encode()
result = compress(body, "payg", "gpt-4o-mini")
assert isinstance(result, tuple)
assert len(result) == 5
out, modified, saved, transforms, reason = result
assert isinstance(out, bytes)
assert isinstance(modified, bool)
assert isinstance(saved, int)
assert isinstance(transforms, list)
assert all(isinstance(t, str) for t in transforms)
assert reason is None or isinstance(reason, str)
def test_large_local_shell_output_compresses_with_telemetry(self):
"""End-to-end check: a payload large enough to clear the
per-item byte threshold produces ``modified=True`` plus a
non-zero ``tokens_saved`` and a populated ``transforms``
list. Mirrors the shape in the Rust crate's
``large_log_output_compressed`` test."""
compress = _ensure_binding()
log_body = "".join(
f"[2024-01-01 00:00:00] INFO compile.rs:42 building module foo_{i}\n"
for i in range(400)
)
assert len(log_body) > 2048
body = json.dumps(
{
"model": "gpt-4o",
"input": [
{
"type": "local_shell_call_output",
"call_id": "c1",
"output": log_body,
}
],
}
).encode()
out, modified, saved, transforms, reason = compress(body, "payg", "gpt-4o")
assert modified is True
assert saved > 0
assert transforms, "expected at least one strategy in transforms"
assert reason is None
new_doc = json.loads(out)
assert new_doc["input"][0]["type"] == "local_shell_call_output"
assert len(new_doc["input"][0]["output"]) < len(log_body)