#!/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"