Files
erofs-freebsd-out-tree/tests/pre15/cases/B01-g3-equivalence.sh
T
2026-08-18 09:20:44 +02:00

122 lines
4.7 KiB
Bash
Executable File

#!/bin/sh
set -eu
: "${PRE15_DUT:?PRE15_DUT is required}"
: "${PRE15_CASE_TMP:?PRE15_CASE_TMP is required}"
: "${PRE15_LIB_DIR:?PRE15_LIB_DIR is required}"
. "$PRE15_LIB_DIR/runner.sh"
umask 022
spec=$PRE15_DUT/tests/pre15/fixtures/B01-g3-archives.json
helper=$PRE15_DUT/tests/pre15/fixtures/g3.py
metadata_archive=$PRE15_DUT/tests/results/manual/2026-08-08T2337Z-metadata-vfs/prepare-fixtures.sh
final_archive=$PRE15_DUT/tests/results/manual/2026-08-09T0124Z-final-review/prepare-fixtures.sh
for tool in mkfs.erofs fsck.erofs dump.erofs python3 sha256sum; do
command -v "$tool" >/dev/null 2>&1 || \
pre15_infra_blocked "missing G3 equivalence tool: $tool"
done
test "$(id -u)" -eq 0 || \
pre15_infra_blocked 'root is required for deterministic device-node fixtures'
python3 - "$spec" "$PRE15_DUT" <<'PY'
import hashlib
import json
from pathlib import Path
import sys
spec = json.loads(Path(sys.argv[1]).read_text(encoding="ascii"))
dut = Path(sys.argv[2])
for item in spec["archives"]:
path = dut / item["path"]
data = path.read_bytes()
digest = hashlib.sha256(data).hexdigest()
lines = len(data.splitlines())
if digest != item["sha256"] or lines != item["lines"]:
raise SystemExit(
f"{item['id']}: hash/line mismatch {digest}/{lines}, "
f"expected {item['sha256']}/{item['lines']}"
)
PY
pre15_record_fixture g3-archive-spec "$spec"
pre15_record_fixture g3-stable-helper "$helper"
pre15_record_fixture g3-archive-metadata "$metadata_archive"
pre15_record_fixture g3-archive-final "$final_archive"
mkdir "$PRE15_CASE_TMP/archive-metadata-source" "$PRE15_CASE_TMP/archive-metadata"
rmdir "$PRE15_CASE_TMP/archive-metadata-source" "$PRE15_CASE_TMP/archive-metadata"
FIXTURE_DIR="$PRE15_CASE_TMP/archive-metadata-source" \
ARTIFACT_DIR="$PRE15_CASE_TMP/archive-metadata" "$metadata_archive"
find "$PRE15_CASE_TMP/archive-metadata-source/namei/wide" \
-mindepth 1 -maxdepth 1 -type f -printf '%f\n' | LC_ALL=C sort \
> "$PRE15_CASE_TMP/archive-metadata/expected-wide.txt"
python3 -B "$helper" make-metadata \
--source "$PRE15_CASE_TMP/stable-a-metadata-source" \
--output "$PRE15_CASE_TMP/stable-a-metadata"
python3 -B "$helper" make-metadata \
--source "$PRE15_CASE_TMP/stable-b-metadata-source" \
--output "$PRE15_CASE_TMP/stable-b-metadata"
mkdir -p "$PRE15_RUN_DIR/artifacts"
python3 -B "$helper" compare-set \
--left-source "$PRE15_CASE_TMP/archive-metadata-source" \
--left-artifacts "$PRE15_CASE_TMP/archive-metadata" \
--right-source "$PRE15_CASE_TMP/stable-a-metadata-source" \
--right-artifacts "$PRE15_CASE_TMP/stable-a-metadata" \
--output "$PRE15_RUN_DIR/artifacts/metadata-archive-equivalence.json"
python3 -B "$helper" compare-set \
--left-source "$PRE15_CASE_TMP/stable-a-metadata-source" \
--left-artifacts "$PRE15_CASE_TMP/stable-a-metadata" \
--right-source "$PRE15_CASE_TMP/stable-b-metadata-source" \
--right-artifacts "$PRE15_CASE_TMP/stable-b-metadata" \
--output "$PRE15_RUN_DIR/artifacts/metadata-repeat-equivalence.json"
FIXTURE_DIR="$PRE15_CASE_TMP/archive-final-source" \
ARTIFACT_DIR="$PRE15_CASE_TMP/archive-final" "$final_archive"
python3 -B "$helper" make-final \
--source "$PRE15_CASE_TMP/stable-a-final-source" \
--output "$PRE15_CASE_TMP/stable-a-final"
python3 -B "$helper" make-final \
--source "$PRE15_CASE_TMP/stable-b-final-source" \
--output "$PRE15_CASE_TMP/stable-b-final"
python3 -B "$helper" compare-set \
--left-source "$PRE15_CASE_TMP/archive-final-source" \
--left-artifacts "$PRE15_CASE_TMP/archive-final" \
--right-source "$PRE15_CASE_TMP/stable-a-final-source" \
--right-artifacts "$PRE15_CASE_TMP/stable-a-final" \
--output "$PRE15_RUN_DIR/artifacts/final-archive-equivalence.json"
python3 -B "$helper" compare-set \
--left-source "$PRE15_CASE_TMP/stable-a-final-source" \
--left-artifacts "$PRE15_CASE_TMP/stable-a-final" \
--right-source "$PRE15_CASE_TMP/stable-b-final-source" \
--right-artifacts "$PRE15_CASE_TMP/stable-b-final" \
--output "$PRE15_RUN_DIR/artifacts/final-repeat-equivalence.json"
for evidence in \
metadata-archive-equivalence.json metadata-repeat-equivalence.json \
final-archive-equivalence.json final-repeat-equivalence.json; do
pre15_record_fixture "g3-$evidence" "$PRE15_RUN_DIR/artifacts/$evidence"
done
python3 - "$PRE15_RUN_DIR/artifacts" <<'PY'
import json
from pathlib import Path
import sys
root = Path(sys.argv[1])
names = (
"metadata-archive-equivalence.json",
"metadata-repeat-equivalence.json",
"final-archive-equivalence.json",
"final-repeat-equivalence.json",
)
for name in names:
result = json.loads((root / name).read_text(encoding="ascii"))
if result["status"] != "PASS":
raise SystemExit(f"{name}: {result['status']}")
print("G3 archived=548 lines; source/artifact bytes and expectations are equivalent")
PY
pre15_target_reached