#!/usr/bin/env bash # Alle headless Tests, parallel. Aufruf: make test (oder: bash tests/run.sh) # Ein Test fällt sofort, wenn ein Skriptfehler im Log auftaucht - nicht erst # nach dem Timeout. Der Mehrspieler-Test braucht einen freien Port; 8000 ist # auf Rechnern mit laufendem Entwicklungsserver oft belegt, deshalb 8765. set -u GODOT="${GODOT:-$HOME/bin/godot}" PORT="${PORT:-8765}" # Ein Rest vom letzten Lauf oder ein fremder Dienst darf den Test nicht # still auf einen falschen Server schicken: freien Port suchen. while ss -ltn 2>/dev/null | grep -q ":$PORT "; do PORT=$((PORT + 1)); done TMP="$(mktemp -d)" cd "$(dirname "$0")/.." start=$(date +%s) declare -A PID starte() { # name, timeout, argumente... -> Hintergrund local name="$1"; local zeit="$2"; shift 2 timeout "$zeit" "$GODOT" --headless --path . "res://tests/${name%%:*}.tscn" -- "$@" > "$TMP/$name.log" 2>&1 & PID[$name]=$! } starte logik 90 starte genau 90 starte kampagne 90 starte nochmal 60 starte bots 90 2 rm -f "$TMP/code.txt" "$TMP/code2.txt" starte mp_start:srv 200 server "$PORT" sleep 2 # Zwei Räume auf demselben Server: die RPCs müssen je Raum getrennt bleiben. PIRATE_DICE_SERVER="ws://127.0.0.1:$PORT" starte mp_start:host 190 host "$TMP/code.txt" PIRATE_DICE_SERVER="ws://127.0.0.1:$PORT" starte mp_start:host2 190 host "$TMP/code2.txt" sleep 1 PIRATE_DICE_SERVER="ws://127.0.0.1:$PORT" starte mp_start:join 190 join "$TMP/code.txt" PIRATE_DICE_SERVER="ws://127.0.0.1:$PORT" starte mp_start:join2 190 join "$TMP/code2.txt" # Warten, aber bei Skriptfehlern sofort abbrechen. while :; do offen=0 for name in "${!PID[@]}"; do pid=${PID[$name]} kill -0 "$pid" 2>/dev/null || continue if grep -q "SCRIPT ERROR" "$TMP/$name.log" 2>/dev/null; then kill "$pid" 2>/dev/null continue fi offen=$((offen + 1)) done [ "$offen" -eq 0 ] && break sleep 1 done wait 2>/dev/null ergebnis=0 for name in logik genau kampagne nochmal bots mp_start:host mp_start:join mp_start:host2 mp_start:join2 mp_start:srv; do log="$TMP/$name.log" echo "=== $name" grep -E "^(OK |FEHL|SERVER:| |TEST:)" "$log" fehler=$(grep -c "SCRIPT ERROR" "$log") [ "$fehler" -gt 0 ] && { echo " $fehler Skriptfehler:"; grep -A2 "SCRIPT ERROR" "$log" | head -6; ergebnis=1; } if [ "$name" != "mp_start:srv" ] && ! grep -q "TEST: fertig, Fehler = 0" "$log"; then ergebnis=1; fi done pfad=$(cat "$TMP"/mp_start:*.log | grep -c "Failed to get path") [ "$pfad" -gt 0 ] && { echo " RPC-Pfadfehler: $pfad"; ergebnis=1; } echo echo "Dauer: $(( $(date +%s) - start ))s Logs: $TMP" [ $ergebnis -eq 0 ] && echo "ALLE TESTS GRÜN" || echo "TESTS ROT" exit $ergebnis