#!/usr/bin/env bash
set -euo pipefail
ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")"&&pwd)";readonly ROOT RESULTS="${ROOT}/results" IMAGE="serein-svc-04-php";cd "${ROOT}"
milliseconds(){ perl -MTime::HiRes=time -e 'printf "%.0f\n",time*1000'; }
capture(){ local name="$1" expectation="$2";shift 2;local directory="${RESULTS}/${name}" started finished code;mkdir -p "${directory}";printf '%q ' "$@"|sed -E 's/[[:space:]]+$//' >"${directory}/command.txt";printf '\n' >>"${directory}/command.txt";started="$(milliseconds)";set +e;"$@" >"${directory}/output.txt.tmp" 2>&1;code=$?;set -e;finished="$(milliseconds)";sed -E -e 's/[[:space:]]+$//' -e '${/^$/d;}' "${directory}/output.txt.tmp" >"${directory}/output.txt";rm "${directory}/output.txt.tmp";printf 'expectation=%s\nexit_code=%s\nduration_ms=%s\n' "${expectation}" "${code}" "$((finished-started))" >"${directory}/metadata.txt";[[ "${expectation}" == pass && ${code} -eq 0 ]]||[[ "${expectation}" == fail && ${code} -ne 0 ]];}
mutation_case(){ local name="$1" temporary;temporary="$(mktemp -d)";capture "mutations/${name}/generate" pass node mutate.mjs "${name}" "${temporary}";capture "diffs/${name}" fail diff -u --label clean --label "${name}" "${temporary}/evidence.clean.json" "${temporary}/evidence.mutated.json";capture "negative/${name}" fail docker run --rm --volume "${temporary}:/candidate:ro" "${IMAGE}" node verify.mjs /candidate/evidence.mutated.json;rm -rf "${temporary}";}
rm -rf "${RESULTS}";mkdir -p "${RESULTS}";capture setup/build pass docker build --tag "${IMAGE}" .;capture positive/ci pass docker run --rm "${IMAGE}" ./ci.sh;capture analysis/evidence pass docker run --rm "${IMAGE}" node verify.mjs;capture analysis/comparison pass docker run --rm "${IMAGE}" node render-comparison.mjs;for mutation in MUT-01 MUT-02 MUT-03 MUT-04 MUT-05 MUT-06 MUT-07 MUT-08 MUT-09 MUT-10 MUT-11 MUT-12 MUT-13 MUT-14 MUT-15 MUT-16 MUT-17 MUT-18;do mutation_case "${mutation}";done;capture sources/primary pass docker run --rm "${IMAGE}" node source-evidence.mjs;capture provenance/manifest pass docker run --rm "${IMAGE}" node source-manifest.mjs;capture verification/results pass docker run --rm --volume "${RESULTS}:/experiment/results:ro" "${IMAGE}" node verify-results.mjs;echo "SVC-04 evidence retained in ${RESULTS}"
