This commit is contained in:
team3
2026-09-16 15:04:02 +02:00
parent 3be22351a3
commit b9d6b115c0
23 changed files with 795 additions and 425 deletions

View File

@@ -1,51 +1,66 @@
#!/usr/bin/env bash
# Alle headless Tests. Aufruf: make test (oder: bash tests/run.sh)
# Der Mehrspieler-Test braucht einen freien Port; 8000 ist auf Rechnern mit
# laufendem Entwicklungsserver oft belegt, deshalb 8765.
# 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")/.."
ergebnis=0
start=$(date +%s)
lauf() { # name, timeout, argumente...
declare -A PID
starte() { # name, timeout, argumente... -> Hintergrund
local name="$1"; local zeit="$2"; shift 2
echo "=== $name"
timeout "$zeit" "$GODOT" --headless --path . "res://tests/$name.tscn" -- "$@" > "$TMP/$name.log" 2>&1
local rc=$?
grep -E "^(OK |FEHL| |TEST:)" "$TMP/$name.log"
local fehler; fehler=$(grep -c "SCRIPT ERROR" "$TMP/$name.log")
[ "$fehler" -gt 0 ] && { echo " $fehler Skriptfehler im Log: $TMP/$name.log"; rc=1; }
[ $rc -ne 0 ] && ergebnis=1
timeout "$zeit" "$GODOT" --headless --path . "res://tests/${name%%:*}.tscn" -- "$@" > "$TMP/$name.log" 2>&1 &
PID[$name]=$!
}
lauf logik 200
lauf nochmal 120
lauf bots 900 2
echo "=== mehrspieler"
starte logik 90
starte genau 90
starte nochmal 60
starte bots 90 2
rm -f "$TMP/code.txt"
timeout 700 "$GODOT" --headless --path . res://tests/mp_start.tscn -- server "$PORT" > "$TMP/srv.log" 2>&1 &
SRV=$!
sleep 3
PIRATE_DICE_SERVER="ws://127.0.0.1:$PORT" timeout 680 "$GODOT" --headless --path . res://tests/mp_start.tscn -- host "$TMP/code.txt" > "$TMP/host.log" 2>&1 &
H=$!
starte mp_start:srv 200 server "$PORT"
sleep 2
PIRATE_DICE_SERVER="ws://127.0.0.1:$PORT" timeout 680 "$GODOT" --headless --path . res://tests/mp_start.tscn -- join "$TMP/code.txt" > "$TMP/join.log" 2>&1 &
J=$!
wait $H; rc_h=$?
wait $J; rc_j=$?
# Der Server beendet sich nach dem Ende selbst. Ihn abzuschiessen würde
# seine letzten Zeilen verlieren - Ausgabe in eine Datei ist gepuffert.
for _ in $(seq 1 40); do kill -0 $SRV 2>/dev/null || break; sleep 1; done
kill $SRV 2>/dev/null; wait $SRV 2>/dev/null
grep -E "^(OK |FEHL|SERVER:|TEST:)" "$TMP/host.log" "$TMP/join.log" "$TMP/srv.log" | sed 's|^.*/||'
pfad=$(cat "$TMP/host.log" "$TMP/join.log" "$TMP/srv.log" | grep -c "Failed to get path")
fehler=$(cat "$TMP/host.log" "$TMP/join.log" "$TMP/srv.log" | grep -c "SCRIPT ERROR")
echo " RPC-Pfadfehler=$pfad Skriptfehler=$fehler (Logs: $TMP)"
[ $rc_h -ne 0 ] || [ $rc_j -ne 0 ] || [ "$pfad" -gt 0 ] || [ "$fehler" -gt 0 ] && ergebnis=1
PIRATE_DICE_SERVER="ws://127.0.0.1:$PORT" starte mp_start:host 190 host "$TMP/code.txt"
sleep 1
PIRATE_DICE_SERVER="ws://127.0.0.1:$PORT" starte mp_start:join 190 join "$TMP/code.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 nochmal bots mp_start:host mp_start:join 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
[ $ergebnis -eq 0 ] && echo "ALLE TESTS GRÜN" || echo "TESTS ROT (Logs: $TMP)"
echo "Dauer: $(( $(date +%s) - start ))s Logs: $TMP"
[ $ergebnis -eq 0 ] && echo "ALLE TESTS GRÜN" || echo "TESTS ROT"
exit $ergebnis