Files
pirate-dice/tests/run.sh
2026-09-16 17:55:28 +02:00

71 lines
2.6 KiB
Bash
Executable File

#!/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