51 lines
2.1 KiB
Python
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"
|