update
This commit is contained in:
87
tests/run.sh
87
tests/run.sh
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user