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