from __future__ import annotations import hashlib import tarfile from pathlib import Path import pytest from autocad_bench.bundle import BUNDLE_VERSION from autocad_bench.common.paths import BENCHMARK_ROOT from autocad_bench.release import ( CHECKSUM_FILENAME, DEFAULT_SOURCE_DATE_EPOCH, RELEASE_FILENAME, ReleaseError, _write_bundle_archive, build_release, verify_release, ) def test_release_build_is_complete_and_self_verifying(tmp_path: Path) -> None: output = tmp_path / "release" built = build_release( output, source_root=BENCHMARK_ROOT, evaluator_versions=(), ) assert built.source_date_epoch == DEFAULT_SOURCE_DATE_EPOCH assert built.package_name == "autocad-bench" assert built.package_version == "0.1.0" assert built.evaluator_versions == () assert {artifact.kind for artifact in built.artifacts} == { "benchmark_bundle", "sdist", "wheel", } assert {path.name for path in output.iterdir()} == { RELEASE_FILENAME, CHECKSUM_FILENAME, *(artifact.filename for artifact in built.artifacts), } assert verify_release(output) == built wheel = next( output / artifact.filename for artifact in built.artifacts if artifact.kind == "wheel" ) wheel.write_bytes(wheel.read_bytes() + b"tampered") with pytest.raises(ReleaseError, match="size changed"): verify_release(output) def test_release_build_refuses_existing_output(tmp_path: Path) -> None: output = tmp_path / "existing" output.mkdir() with pytest.raises(ReleaseError, match="already exists"): build_release( output, source_root=BENCHMARK_ROOT, evaluator_versions=(), ) def test_bundle_archive_writer_is_byte_reproducible(tmp_path: Path) -> None: bundle = tmp_path / "bundle" (bundle / "nested").mkdir(parents=True) (bundle / "autocad-bench-bundle.json").write_text( '{"fixture":true}\n', encoding="utf-8", ) (bundle / "nested" / "payload.bin").write_bytes(b"\x00\x01fixture") first = tmp_path / "first.tar.gz" second = tmp_path / "second.tar.gz" _write_bundle_archive( bundle, first, epoch=DEFAULT_SOURCE_DATE_EPOCH, ) _write_bundle_archive( bundle, second, epoch=DEFAULT_SOURCE_DATE_EPOCH, ) assert first.read_bytes() == second.read_bytes() assert hashlib.sha256(first.read_bytes()).hexdigest() == hashlib.sha256( second.read_bytes() ).hexdigest() with tarfile.open(first, mode="r:gz") as archive: assert archive.getnames() == [ BUNDLE_VERSION, f"{BUNDLE_VERSION}/autocad-bench-bundle.json", f"{BUNDLE_VERSION}/nested", f"{BUNDLE_VERSION}/nested/payload.bin", ]