Files
OBLITERATUS/tests/test_supply_chain_policy.py
T

201 lines
5.8 KiB
Python

"""Tests for reproducible supply-chain policy decisions."""
from __future__ import annotations
import importlib.util
from datetime import date
from pathlib import Path
ROOT = Path(__file__).parents[1]
SCRIPT = ROOT / "scripts" / "check_supply_chain_policy.py"
SPEC = importlib.util.spec_from_file_location("check_supply_chain_policy", SCRIPT)
assert SPEC is not None and SPEC.loader is not None
MODULE = importlib.util.module_from_spec(SPEC)
SPEC.loader.exec_module(MODULE)
def _policy() -> dict[str, object]:
return {
"schema_version": 1,
"vulnerability": {
"fail_severities": ["unknown", "low", "medium", "high", "critical"],
"max_fixed_suppression_days": 7,
"max_unfixed_suppression_days": 90,
"suppressions": [],
},
"secret": {
"report_redaction_percent": 100,
"max_suppression_days": 30,
"suppressions": [],
},
"license": {
"allowed_expressions": ["MIT"],
"excluded_packages": ["obliteratus"],
},
}
def test_committed_policy_is_valid():
policy = MODULE._read_json(ROOT / "ci" / "supply-chain-policy.json")
assert MODULE.validate_policy(policy) == []
def test_policy_rejects_expired_and_overlong_suppressions():
policy = _policy()
policy["vulnerability"]["suppressions"] = [
{
"id": "GHSA-example",
"reason": "temporary",
"approved_on": "2026-01-01",
"expires": "2026-01-10",
"fix_available": True,
},
]
failures = MODULE.validate_policy(policy, today=date(2026, 1, 11))
assert "suppression[0] expired on 2026-01-10" in failures
assert "suppression[0] exceeds its 7-day maximum" in failures
def test_audit_blocks_every_unsuppressed_vulnerability():
evidence = {
"vulnerabilities": [
{"id": "GHSA-example", "aliases": ["CVE-example"], "fix_versions": ["2.0"]},
],
"adverse_statuses": [],
}
decision = MODULE.evaluate_audit(_policy(), evidence, scanner_status=1)
assert decision["passed"] is False
assert decision["failures"] == ["unsuppressed vulnerability: GHSA-example"]
def test_audit_rejects_unexplained_scanner_failure():
evidence = {"vulnerabilities": [], "adverse_statuses": []}
decision = MODULE.evaluate_audit(_policy(), evidence, scanner_status=1)
assert decision["passed"] is False
assert decision["failures"] == [
"uv audit returned failure without reviewable findings",
]
def test_audit_accepts_bounded_alias_suppression():
policy = _policy()
policy["vulnerability"]["suppressions"] = [
{
"id": "CVE-example",
"reason": "upgrade lands this week",
"approved_on": "2026-01-01",
"expires": "2026-01-08",
"fix_available": True,
},
]
evidence = {
"vulnerabilities": [
{"id": "GHSA-example", "aliases": ["CVE-example"], "fix_versions": ["2.0"]},
],
"adverse_statuses": [],
}
decision = MODULE.evaluate_audit(
policy,
evidence,
scanner_status=1,
today=date(2026, 1, 2),
)
assert decision["passed"] is True
assert decision["suppressed"] == ["GHSA-example"]
def test_audit_rejects_stale_fixability_claim():
policy = _policy()
policy["vulnerability"]["suppressions"] = [
{
"id": "GHSA-example",
"reason": "waiting for a fix",
"approved_on": "2026-01-01",
"expires": "2026-03-01",
"fix_available": False,
},
]
evidence = {
"vulnerabilities": [{"id": "GHSA-example", "fix_versions": ["2.0"]}],
"adverse_statuses": [],
}
decision = MODULE.evaluate_audit(
policy,
evidence,
scanner_status=1,
today=date(2026, 1, 2),
)
assert decision["passed"] is False
assert any("fixability is stale" in failure for failure in decision["failures"])
def test_license_gate_is_exact_and_excludes_first_party_package():
inventory = [
{"Name": "obliteratus", "License": "AGPL-3.0-or-later"},
{"Name": "safe", "License": "MIT"},
{"Name": "unknown", "License": "UNKNOWN"},
]
decision = MODULE.evaluate_licenses(_policy(), inventory)
assert decision["passed"] is False
assert decision["checked_packages"] == 2
assert decision["failures"] == ["unapproved license expression for unknown: UNKNOWN"]
def test_secret_gate_requires_redaction_even_for_suppressed_finding():
policy = _policy()
policy["secret"]["suppressions"] = [
{
"fingerprint": "file:rule:1",
"reason": "documented fixture",
"approved_on": "2026-01-01",
"expires": "2026-01-15",
},
]
report = [
{
"Fingerprint": "file:rule:1",
"Secret": "not-redacted",
"Match": "token=not-redacted",
},
]
decision = MODULE.evaluate_secrets(
policy,
report,
scanner_status=1,
today=date(2026, 1, 2),
)
assert decision["passed"] is False
assert any("not fully redacted" in failure for failure in decision["failures"])
def test_bind_sbom_adds_exact_wheel_hash(tmp_path):
wheel = tmp_path / "obliteratus-0.1.2-py3-none-any.whl"
wheel.write_bytes(b"wheel")
sbom = {
"bomFormat": "CycloneDX",
"specVersion": "1.5",
"metadata": {"component": {"name": "obliteratus"}},
}
bound = MODULE.bind_sbom(sbom, wheel)
component = bound["metadata"]["component"]
assert component["hashes"] == [
{
"alg": "SHA-256",
"content": "ba59926159d2aa256eb8739b8da7e2b574b960e1202c6d624cbe981cef996c91",
},
]
assert component["properties"] == [
{"name": "obliteratus:distribution-file", "value": wheel.name},
]