import hashlib import pytest from viano_bug_analysis.package import PackageValidator def test_minimal_package(make_package): result = PackageValidator().validate(make_package()) assert result.valid assert result.manifest["case_id"] == "case-A" def test_returned_package_and_unknown_data(manifest, make_package): payload = b"immutable case" manifest.update(state="REOPENED", package_generation=8, analysis_revision=3) manifest["artifacts"]["case"] = "case/case.json" manifest["history"]["analysis_revisions"] = 3 manifest["integrity"]["case/case.json"] = {"size": len(payload), "sha256": hashlib.sha256(payload).hexdigest()} manifest["extension"] = {"vendor": "anything"} result = PackageValidator().validate(make_package(entries={"case/case.json": payload, "unknown/data.bin": b"opaque"})) assert result.valid assert result.manifest["extension"] == {"vendor": "anything"} assert "unknown/data.bin" in result.files @pytest.mark.parametrize("kind", ["missing", "hash", "size"]) def test_invalid_integrity(kind, manifest, make_package): manifest["integrity"]["original/raw"] = {"size": 3, "sha256": hashlib.sha256(b"abc").hexdigest()} entries = {} if kind == "missing" else {"original/raw": b"abc"} if kind == "hash": manifest["integrity"]["original/raw"]["sha256"] = "0" * 64 if kind == "size": manifest["integrity"]["original/raw"]["size"] = 4 assert not PackageValidator().validate(make_package(entries=entries)).valid @pytest.mark.parametrize("ref", ["absent.json", "../escape", "/absolute", "manifest.json"]) def test_invalid_pointer(ref, manifest, make_package): manifest["artifacts"]["case"] = ref assert not PackageValidator().validate(make_package()).valid @pytest.mark.parametrize("raw", [b"{}", b"[]", b"{", b'{"state":"NEW","state":"REOPENED"}', b"\xff", b"[" * 2000]) def test_invalid_manifest_controlled(raw, make_package): assert not PackageValidator().validate(make_package(raw=raw)).valid def test_missing_archive(tmp_path): assert PackageValidator().validate(tmp_path / "missing").issues[0].code == "ARCHIVE_ERROR"