Files
VianoBugAnalysis/tests/test_package_validator.py

51 lines
2.1 KiB
Python

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"