48 lines
3.0 KiB
Python
48 lines
3.0 KiB
Python
"""Read-only producer archive verification; no package/application/compiler run."""
|
|
import hashlib
|
|
import json
|
|
from pathlib import Path
|
|
|
|
base = Path(__file__).resolve().parent
|
|
root = base.parents[2]
|
|
read = lambda path: json.loads(path.read_text(encoding="utf-8"))
|
|
sha = lambda path: hashlib.sha256(path.read_bytes()).hexdigest()
|
|
manifest = read(base / "manifest.json")
|
|
assert {p.relative_to(base).as_posix() for p in base.rglob("*") if p.is_file()} == {item["path"] for item in manifest["files"]} | {"manifest.json", "readback.json"}
|
|
for item in manifest["files"]:
|
|
path = base / item["path"]
|
|
assert path.stat().st_size == item["bytes"] and sha(path) == item["sha256"], item["path"]
|
|
assert sha(base / "manifest.json") == read(base / "readback.json")["manifestSha256"]
|
|
for item in read(base / "references.json"):
|
|
if "committedEquivalent" in item:
|
|
assert sha(root / item["committedEquivalent"]) == item["sha256"]
|
|
assert read(base / "initial-failed/prepare-result.json")["success"] is False
|
|
assert len(read(base / "producer/failure-audit.json")["missing"]) == 7
|
|
assert read(base / "producer/prepare-result.json")["success"] is True
|
|
prepared = read(base / "producer/preparation.json")
|
|
assert len(prepared["gui_inputs"]) == 500 and len(prepared["restorations"]) == 15
|
|
assert prepared["root_before"] == prepared["root_after"]
|
|
assert prepared["reconstruction_commit"] == "802855f7e6f2f00a107a12196b458b267f586b8d"
|
|
assert read(base / "producer/metadata2-result.json")["exitCode"] == 0
|
|
package = read(base / "producer/package2-result.json")
|
|
result = read(base / "producer/package-readback.json")
|
|
assert package["success"] and result["status"] == "PASS"
|
|
assert result["archive_sha256"] == package["archive_sha256"] == "d7228c542f162663933ea002739a78c722bcca41e437df63b7c868ea2af201f1"
|
|
assert result["file_count"] == len(result["files"]) == 559
|
|
assert result["gui_inputs_verified"] == 500 and result["historical_server_inputs_verified"] == 120
|
|
push = read(base / "producer/source-push-result.json")
|
|
assert push["success"] and push["before"] == ""
|
|
assert push["commit"] == prepared["reconstruction_commit"] == push["after"].split()[0]
|
|
for path in (base / "package-metadata").iterdir():
|
|
if path.name in result["files"]:
|
|
assert sha(path) == result["files"][path.name]["sha256"]
|
|
historical = read(base / "historical-server/git-inputs.json")
|
|
tar = read(base / "historical-server/tar-inventory.json")
|
|
assert len(historical["inputs"]) == 120 and len(tar["files"]) == 459
|
|
hashes = {item["path"]: item["sha256"] for item in tar["files"]}
|
|
assert all(hashes[item["path"]] == item["sha256"] for item in historical["inputs"])
|
|
for path in (base / "historical-server/original-workspace").rglob("*"):
|
|
if path.is_file():
|
|
assert sha(path) == hashes[path.relative_to(base / "historical-server/original-workspace").as_posix()]
|
|
print(json.dumps({"passed": True, "payloadFiles": len(manifest["files"]), "producerPackageFiles": 559, "guiInputs": 500, "historicalServerInputs": 120, "scope": "Producer receipts and archive integrity only"}))
|