225 lines
6.1 KiB
Bash
Executable File
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}')"
|