71 lines
2.6 KiB
Bash
Executable File
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
|