Files
2026-08-27 11:12:22 +02:00

225 lines
6.1 KiB
Bash
Executable File

#!/usr/bin/env bash
set -u
SUITE="/home/dariodf/Scrivania/MARTE/marte-benchmark-suite"
SOURCE_CONFIG="$SUITE/configurations/generated/S01/from_patcher/smoke_s1_timing_from_s00.marte"
OUTPUT_DIR="$SUITE/configurations/generated/S02/from_patcher"
OUTPUT_CONFIG="$OUTPUT_DIR/smoke_s2_binary_recording_from_s01.marte"
EXPECTED_SOURCE_SHA256="1513e1ca72eba56d53079ac7328908f12ddc72772456e2d75bcbacb6465d2427"
if [ ! -f "$SOURCE_CONFIG" ]; then
printf "SOURCE_STATUS=NOT_FOUND\n"
printf "SOURCE_CONFIG=%s\n" "$SOURCE_CONFIG"
exit 20
fi
ACTUAL_SOURCE_SHA256="$(sha256sum -- "$SOURCE_CONFIG" | awk '{print $1}')"
printf "SOURCE_CONFIG=%s\n" "$SOURCE_CONFIG"
printf "EXPECTED_SOURCE_SHA256=%s\n" "$EXPECTED_SOURCE_SHA256"
printf "ACTUAL_SOURCE_SHA256=%s\n" "$ACTUAL_SOURCE_SHA256"
if [ "$ACTUAL_SOURCE_SHA256" != "$EXPECTED_SOURCE_SHA256" ]; then
printf "SOURCE_HASH_STATUS=MISMATCH\n"
exit 21
fi
printf "SOURCE_HASH_STATUS=MATCH\n"
mkdir -p -- "$OUTPUT_DIR"
TEMP_CONFIG="$(mktemp "$OUTPUT_DIR/.s02_candidate_XXXXXX.marte")"
if [ -z "$TEMP_CONFIG" ]; then
printf "TEMPORARY_FILE_STATUS=FAIL\n"
exit 22
fi
trap 'rm -f -- "$TEMP_CONFIG"' EXIT
python3 - "$SOURCE_CONFIG" "$TEMP_CONFIG" <<'PY'
import re
import sys
from pathlib import Path
source = Path(sys.argv[1])
destination = Path(sys.argv[2])
text = source.read_text(encoding="utf-8")
for forbidden in (
"+IOGAM_Writer =",
"+FileWriter =",
"__MARTE_RUN_DIR__",
):
if forbidden in text:
print("SOURCE_ALREADY_CONTAINS_S02_CONTENT=" + forbidden)
sys.exit(30)
writer_gam = """ +IOGAM_Writer = {
Class = IOGAM
InputSignals = {
Counter = {
DataSource = DDB1
Type = uint32
}
Time = {
DataSource = DDB1
Type = uint32
}
State1_Thread1_CycleTime = {
Alias = State1.Thread1_CycleTime
DataSource = Timings
Type = uint32
}
}
OutputSignals = {
Counter = {
DataSource = FileWriter
Type = uint32
}
Time = {
DataSource = FileWriter
Type = uint32
}
State1_Thread1_CycleTime = {
DataSource = FileWriter
Type = uint32
}
}
}
"""
file_writer = """ +FileWriter = {
Class = FileDataSource::FileWriter
NumberOfBuffers = 100
CPUMask = 0x1
StackSize = 10000000
Filename = "__MARTE_RUN_DIR__/s02_output.bin"
Overwrite = "yes"
FileFormat = "binary"
StoreOnTrigger = 0
RefreshContent = 0
Signals = {
Counter = {
Type = uint32
}
Time = {
Type = uint32
}
State1_Thread1_CycleTime = {
Type = uint32
}
}
}
"""
patched, functions_count = re.subn(
r"(?m)^ }\n \+Data = \{\n",
writer_gam + " }\n +Data = {\n",
text,
count=1,
)
patched, data_count = re.subn(
r"(?m)^ }\n \+States = \{\n",
file_writer + " }\n +States = {\n",
patched,
count=1,
)
patched, thread_count = re.subn(
r"Functions = \{GAMTimer GAMDisplay\}",
"Functions = {GAMTimer GAMDisplay IOGAM_Writer}",
patched,
count=1,
)
print("FUNCTIONS_TRANSFORM_COUNT=" + str(functions_count))
print("DATA_TRANSFORM_COUNT=" + str(data_count))
print("THREAD_TRANSFORM_COUNT=" + str(thread_count))
if (functions_count, data_count, thread_count) != (1, 1, 1):
print("TRANSFORM_STATUS=FAIL")
sys.exit(31)
checks = {
"IOGAM_WRITER_COUNT": patched.count("+IOGAM_Writer ="),
"FILE_WRITER_COUNT": patched.count("+FileWriter ="),
"FILE_WRITER_CLASS_COUNT": patched.count("Class = FileDataSource::FileWriter"),
"PLAIN_FILE_WRITER_CLASS_COUNT": patched.count("Class = FileWriter"),
"FILEWRITER_OUTPUT_COUNT": patched.count("DataSource = FileWriter"),
"RUN_DIR_PLACEHOLDER_COUNT": patched.count("__MARTE_RUN_DIR__"),
"BINARY_FORMAT_COUNT": patched.count('FileFormat = "binary"'),
"OVERWRITE_YES_COUNT": patched.count('Overwrite = "yes"'),
"CONTINUOUS_MODE_COUNT": patched.count("StoreOnTrigger = 0"),
}
for name, value in checks.items():
print(name + "=" + str(value))
expected = {
"IOGAM_WRITER_COUNT": 1,
"FILE_WRITER_COUNT": 1,
"FILE_WRITER_CLASS_COUNT": 1,
"PLAIN_FILE_WRITER_CLASS_COUNT": 0,
"FILEWRITER_OUTPUT_COUNT": 3,
"RUN_DIR_PLACEHOLDER_COUNT": 1,
"BINARY_FORMAT_COUNT": 1,
"OVERWRITE_YES_COUNT": 1,
"CONTINUOUS_MODE_COUNT": 1,
}
if checks != expected:
print("STRUCTURAL_CHECK_STATUS=FAIL")
sys.exit(32)
required_thread = "Functions = {GAMTimer GAMDisplay IOGAM_Writer}"
if patched.count(required_thread) != 1:
print("THREAD_FUNCTION_LIST_STATUS=FAIL")
sys.exit(33)
destination.write_text(patched, encoding="utf-8")
print("STRUCTURAL_CHECK_STATUS=PASS")
print("TRANSFORM_STATUS=PASS")
PY
PYTHON_RC=$?
if [ "$PYTHON_RC" -ne 0 ]; then
printf "PYTHON_TRANSFORM_EXIT_CODE=%s\n" "$PYTHON_RC"
exit 23
fi
if [ -f "$OUTPUT_CONFIG" ]; then
if cmp -s -- "$TEMP_CONFIG" "$OUTPUT_CONFIG"; then
printf "OUTPUT_STATUS=ALREADY_VALID\n"
printf "OUTPUT_CONFIG=%s\n" "$OUTPUT_CONFIG"
printf "OUTPUT_SHA256=%s\n" \
"$(sha256sum -- "$OUTPUT_CONFIG" | awk '{print $1}')"
exit 0
fi
printf "OUTPUT_STATUS=EXISTS_BUT_DIFFERS\n"
printf "OUTPUT_CONFIG=%s\n" "$OUTPUT_CONFIG"
exit 24
fi
chmod 0644 "$TEMP_CONFIG"
if ! mv -- "$TEMP_CONFIG" "$OUTPUT_CONFIG"; then
printf "OUTPUT_STATUS=PUBLISH_FAILED\n"
exit 25
fi
trap - EXIT
printf "OUTPUT_STATUS=CREATED\n"
printf "OUTPUT_CONFIG=%s\n" "$OUTPUT_CONFIG"
printf "OUTPUT_SHA256=%s\n" \
"$(sha256sum -- "$OUTPUT_CONFIG" | awk '{print $1}')"