Files
marte-benchmark-suite/patchers/configuration/build_s03h3_minimal_from_s03h1_test.sh
T
2026-08-27 11:12:22 +02:00

152 lines
4.5 KiB
Bash
Executable File

#!/usr/bin/env bash
set -u
set -o pipefail
PATCHER_DIR="$(cd -- "$(dirname -- "${BASH_SOURCE[0]}")" && pwd -P)"
SUITE="$(cd -- "$PATCHER_DIR/../.." && pwd -P)"
PARENT="$SUITE/configurations/generated/S03H1/from_patcher/smoke_s03h1_execution_profiles_test_from_s02.marte"
OUTPUT_DIR="$SUITE/configurations/generated/S03H3/from_patcher"
OUTPUT="$OUTPUT_DIR/smoke_s03h3_execution_profiles_minimal_from_s03h1_test.marte"
VERIFIER="$SUITE/scenarios/S03H3_execution_profiles/verify_s03h3_minimal_structure.py"
EXPECTED_PARENT_SHA256="d037561b32760fbd0e2aec9f1eefc5efda27b1918eca4742c89092a8a2f7e92e"
TEMP_OUTPUT=""
cleanup() {
if [ -n "$TEMP_OUTPUT" ]; then
rm -f -- "$TEMP_OUTPUT"
fi
}
trap cleanup EXIT HUP INT TERM
fail() {
local code="$1"
local reason="$2"
printf 'PATCHER_STATUS=FAIL\n' >&2
printf 'PATCHER_ERROR=%s\n' "$reason" >&2
printf 'SOURCE_MODIFIED_IN_PLACE=NO\n' >&2
exit "$code"
}
if [ "$#" -ne 0 ]; then
printf 'Uso: %s\n' "$0" >&2
exit 2
fi
if [ ! -f "$PARENT" ]; then
fail 10 "CANONICAL_TEST_PARENT_MISSING"
fi
if [ ! -f "$VERIFIER" ]; then
fail 11 "MINIMAL_VERIFIER_MISSING"
fi
PARENT_SHA256_BEFORE="$(sha256sum -- "$PARENT" | awk '{print $1}')" || \
fail 12 "PARENT_HASH_UNAVAILABLE"
if [ "$PARENT_SHA256_BEFORE" != "$EXPECTED_PARENT_SHA256" ]; then
fail 13 "CANONICAL_TEST_PARENT_SHA256_MISMATCH"
fi
if ! mkdir -p -- "$OUTPUT_DIR"; then
fail 14 "OUTPUT_DIRECTORY_CREATION_FAILED"
fi
TEMP_OUTPUT="$(mktemp "$OUTPUT_DIR/.s03h3_minimal.XXXXXX")" || \
fail 15 "TEMPORARY_OUTPUT_CREATION_FAILED"
if ! python3 - "$PARENT" "$TEMP_OUTPUT" <<'PY'
import sys
from pathlib import Path
parent = Path(sys.argv[1])
target = Path(sys.argv[2])
text = parent.read_bytes().decode("utf-8")
gamdisplay_start = " +GAMDisplay = {\n"
writer_start = " +IOGAM_Writer = {\n"
display_block = (
" +Display = {\n"
" Class = GAMDataSource\n"
" }\n"
)
old_functions = (
" Functions = "
"{GAMTimer SentinelProducer GAMDisplay IOGAM_Writer}"
)
new_functions = (
" Functions = "
"{GAMTimer SentinelProducer IOGAM_Writer}"
)
checks = {
"GAMDISPLAY_ANCHOR": text.count(gamdisplay_start),
"WRITER_ANCHOR": text.count(writer_start),
"DISPLAY_BLOCK": text.count(display_block),
"FUNCTIONS_ANCHOR": text.count(old_functions),
"MINIMAL_FUNCTIONS_PREEXISTING": text.count(new_functions),
}
if checks != {
"GAMDISPLAY_ANCHOR": 1,
"WRITER_ANCHOR": 1,
"DISPLAY_BLOCK": 1,
"FUNCTIONS_ANCHOR": 1,
"MINIMAL_FUNCTIONS_PREEXISTING": 0,
}:
for name, value in checks.items():
print(f"{name}_COUNT={value}", file=sys.stderr)
raise SystemExit(20)
start = text.index(gamdisplay_start)
end = text.index(writer_start, start)
if end <= start:
raise SystemExit(21)
result = text[:start] + text[end:]
result = result.replace(display_block, "", 1)
result = result.replace(old_functions, new_functions, 1)
target.write_bytes(result.encode("utf-8"))
PY
then
fail 16 "STRUCTURAL_TRANSFORMATION_FAILED"
fi
PARENT_SHA256_AFTER="$(sha256sum -- "$PARENT" | awk '{print $1}')" || \
fail 17 "PARENT_POST_HASH_UNAVAILABLE"
if [ "$PARENT_SHA256_AFTER" != "$PARENT_SHA256_BEFORE" ]; then
fail 18 "SOURCE_MODIFIED_IN_PLACE"
fi
if ! python3 "$VERIFIER" CANONICAL "$PARENT" "$TEMP_OUTPUT"; then
fail 19 "CANONICAL_STRUCTURAL_COMPLETENESS_FAILED"
fi
if [ -e "$OUTPUT" ]; then
if [ ! -f "$OUTPUT" ]; then
fail 20 "OUTPUT_EXISTS_NOT_REGULAR_FILE"
fi
if ! cmp -s -- "$TEMP_OUTPUT" "$OUTPUT"; then
fail 21 "EXISTING_OUTPUT_DIFFERS_FROM_DETERMINISTIC_RESULT"
fi
if ! python3 "$VERIFIER" CANONICAL "$PARENT" "$OUTPUT" >/dev/null; then
fail 22 "EXISTING_OUTPUT_COMPLETENESS_FAILED"
fi
printf 'PATCHER_RESULT=ALREADY_VALID\n'
else
chmod 0644 -- "$TEMP_OUTPUT" || fail 23 "OUTPUT_MODE_SET_FAILED"
mv -- "$TEMP_OUTPUT" "$OUTPUT" || fail 24 "OUTPUT_PUBLICATION_FAILED"
TEMP_OUTPUT=""
if ! python3 "$VERIFIER" CANONICAL "$PARENT" "$OUTPUT" >/dev/null; then
fail 25 "PUBLISHED_OUTPUT_COMPLETENESS_FAILED"
fi
printf 'PATCHER_RESULT=CREATED\n'
fi
OUTPUT_SHA256="$(sha256sum -- "$OUTPUT" | awk '{print $1}')" || \
fail 26 "OUTPUT_HASH_UNAVAILABLE"
printf 'PATCHER_STATUS=PASS\n'
printf 'PATCHER_DETERMINISM=PASS\n'
printf 'PATCHER_PARENT_HASH_MATCH=PASS\n'
printf 'CANONICAL_STRUCTURAL_COMPLETENESS_STATUS=PASS\n'
printf 'SOURCE_MODIFIED_IN_PLACE=NO\n'
printf 'MINIMAL_CONFIG=%s\n' "$OUTPUT"
printf 'MINIMAL_CONFIG_SHA256=%s\n' "$OUTPUT_SHA256"