152 lines
4.5 KiB
Bash
Executable File
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"
|