Files
settled-reach/tests/run-ipc-fixtures
T
jpmschweitzerandClaude Opus 4.6 4f21465dbf feat(ci): test runner scripts and Makefile integration (#270)
Six test runner scripts at tests/: run-rust, run-godot, run-ipc-fixtures,
run-ipc-protocol, run-ipc-integration, run-all. Plus run-ipc-benchmark
for Layer 3 timing. All produce structured JSON stdout, support --filter,
and exit 0/non-zero. Makefile targets updated to delegate to scripts.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-25 12:47:58 +01:00

99 lines
3.4 KiB
Bash
Executable File

#!/usr/bin/env bash
# tests/run-ipc-fixtures: Layer 1 IPC fixture tests (D-030)
# Runs Rust serialization round-trip tests + GDScript fixture validation.
# GDScript side is skipped if client/tests/test_ipc_fixtures.gd doesn't exist yet (#271).
# Exit: 0 = all pass, non-zero = any failure
# Stdout: {"suite":"ipc-fixtures","total":N,"passed":N,"failed":N,"duration_ms":N}
set -euo pipefail
FILTER=""
while [[ $# -gt 0 ]]; do
case "$1" in
--filter) FILTER="${2:-}"; shift 2 ;;
--filter=*) FILTER="${1#--filter=}"; shift ;;
*) echo "Unknown argument: $1" >&2; exit 2 ;;
esac
done
REPO_ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
_extract_num() {
local haystack="$1" pattern="$2"
echo "$haystack" | grep -oE "[0-9]+ $pattern" | grep -oE '^[0-9]+' || echo 0
}
_parse_nextest_summary() {
local tmpout="$1"
local summary total passed failed
summary=$(grep -E "^\s*(Summary|Finished)" "$tmpout" | tail -1 || true)
if [[ -n "$summary" ]]; then
total=$(_extract_num "$summary" "tests? run")
passed=$(_extract_num "$summary" "passed")
failed=$(_extract_num "$summary" "failed")
else
total=0; passed=0; failed=0
fi
echo "$total $passed $failed"
}
# --- Layer 1a: Rust serialization tests ---
START_MS=$(date +%s%3N)
cd "$REPO_ROOT/server"
TMPOUT=$(mktemp)
NEXTEST_ARGS=(nextest run --color never --test serialization)
[[ -n "$FILTER" ]] && NEXTEST_ARGS+=(-E "test(~${FILTER})")
set +e
cargo "${NEXTEST_ARGS[@]}" 2>&1 | tee "$TMPOUT" >&2
RUST_EXIT=${PIPESTATUS[0]}
set -e
read -r RUST_TOTAL RUST_PASSED RUST_FAILED < <(_parse_nextest_summary "$TMPOUT")
rm -f "$TMPOUT"
# --- Layer 1b: GDScript fixture tests (optional until #271 lands) ---
GDS_FIXTURE="$REPO_ROOT/client/tests/test_ipc_fixtures.gd"
GDS_TOTAL=0; GDS_PASSED=0; GDS_FAILED=0; GDS_EXIT=0
if [[ -f "$GDS_FIXTURE" ]]; then
GODOT=$(command -v godot4 2>/dev/null || command -v godot 2>/dev/null || echo "")
if [[ -z "$GODOT" ]]; then
echo "Warning: test_ipc_fixtures.gd found but godot not in PATH — skipping GDScript layer" >&2
else
GDTMP=$(mktemp)
set +e
"$GODOT" --headless --path "$REPO_ROOT/client" \
-s res://addons/gdUnit4/bin/GdUnitCmdTool.gd \
--ignoreHeadlessMode -c \
-a res://tests/test_ipc_fixtures.gd \
2>&1 | tee "$GDTMP" >&2
GDS_EXIT=${PIPESTATUS[0]}
set -e
STATS=$(grep -oE "[0-9]+ test cases \| [0-9]+ errors \| [0-9]+ failures" "$GDTMP" || true)
if [[ -n "$STATS" ]]; then
GDS_TOTAL=$(echo "$STATS" | grep -oE '^[0-9]+' | awk '{s+=$1} END {print s}')
ERRS=$(echo "$STATS" | grep -oE '[0-9]+ errors' | grep -oE '^[0-9]+' | awk '{s+=$1} END {print s}')
FAILS=$(echo "$STATS" | grep -oE '[0-9]+ failures' | grep -oE '^[0-9]+' | awk '{s+=$1} END {print s}')
GDS_FAILED=$(( ${ERRS:-0} + ${FAILS:-0} ))
GDS_PASSED=$(( GDS_TOTAL - GDS_FAILED ))
fi
rm -f "$GDTMP"
fi
fi
END_MS=$(date +%s%3N)
DURATION_MS=$((END_MS - START_MS))
TOTAL=$(( RUST_TOTAL + GDS_TOTAL ))
PASSED=$(( RUST_PASSED + GDS_PASSED ))
FAILED=$(( RUST_FAILED + GDS_FAILED ))
# Overall exit: fail if either side failed
EXIT_CODE=$(( RUST_EXIT != 0 || GDS_EXIT != 0 ? 1 : 0 ))
printf '{"suite":"ipc-fixtures","total":%d,"passed":%d,"failed":%d,"duration_ms":%d}\n' \
"$TOTAL" "$PASSED" "$FAILED" "$DURATION_MS"
exit $EXIT_CODE