Files
pyxis/tests/build_scripts/test_validate_pyxis_web_release.py
T

83 lines
2.5 KiB
Python

import hashlib
import json
from pathlib import Path
import subprocess
import sys
ROOT = Path(__file__).resolve().parents[2]
VALIDATOR = ROOT / "tools/validate_pyxis_web_release.py"
OFFSETS = {
"bootloader.bin": 0,
"partitions.bin": 0x8000,
"boot_app0.bin": 0xE000,
"firmware.bin": 0x10000,
}
def make_release(directory: Path) -> None:
directory.mkdir()
images = {
"bootloader.bin": b"bootloader",
"partitions.bin": b"partitions",
"boot_app0.bin": b"\x01\x00\x00\x00" + b"\xff" * (0x2000 - 4),
"firmware.bin": b"\xe9" + b"\x00" * 11 + b"\x09\x00" + b"\x00" * 114,
}
descriptors = {}
for name, data in images.items():
(directory / name).write_bytes(data)
descriptors[name] = {
"file": name,
"offset": OFFSETS[name],
"size": len(data),
"sha256": hashlib.sha256(data).hexdigest(),
}
metadata = {
"schema": 1,
"version": "v0.3.0",
"source_commit": "a" * 40,
"environment": "tdeck-release",
"chip_family": "ESP32-S3",
"flash_size": 8 * 1024 * 1024,
"persistence_safe": True,
"images": descriptors,
}
(directory / "pyxis-release.json").write_text(json.dumps(metadata))
def test_validator_accepts_complete_matching_release(tmp_path):
release = tmp_path / "release"
make_release(release)
subprocess.run(
[sys.executable, str(VALIDATOR), "--directory", str(release), "--version", "v0.3.0"],
check=True,
)
def test_validator_rejects_digest_mismatch(tmp_path):
release = tmp_path / "release"
make_release(release)
(release / "firmware.bin").write_bytes(b"corrupt")
result = subprocess.run(
[sys.executable, str(VALIDATOR), "--directory", str(release), "--version", "v0.3.0"],
)
assert result.returncode != 0
def test_validator_rejects_image_that_overlaps_next_persistent_region(tmp_path):
release = tmp_path / "release"
make_release(release)
oversized = b"\xff" * 0x1001
(release / "partitions.bin").write_bytes(oversized)
metadata_path = release / "pyxis-release.json"
metadata = json.loads(metadata_path.read_text())
metadata["images"]["partitions.bin"]["size"] = len(oversized)
metadata["images"]["partitions.bin"]["sha256"] = hashlib.sha256(oversized).hexdigest()
metadata_path.write_text(json.dumps(metadata))
result = subprocess.run(
[sys.executable, str(VALIDATOR), "--directory", str(release), "--version", "v0.3.0"],
)
assert result.returncode != 0