#!/usr/bin/env bash
# Layer 5: GameState Router over P2P (REALTIME + DURABLE)
# Tests: route resolution, REALTIME/DURABLE/BOTH channels, promote/demote, role permissions.
# Two peers via swarm_join mesh (P2P, no client/server).
set -euo pipefail
cd "$(dirname "$0")"
echo "=== Layer 5: GameState Router over P2P ==="
# Cleanup
rm -f /tmp/layer5_*.txt /tmp/layer_bootstrap.txt
# Process tracking
PIDS=()
TESTNET_PID=""
cleanup() {
for pid in "${PIDS[@]}" "$TESTNET_PID"; do
[ -n "$pid" ] && kill "$pid" 2>/dev/null || true
[ -n "$pid" ] && pkill -P "$pid" 2>/dev/null || true
done
sleep 0.5
for pid in "${PIDS[@]}" "$TESTNET_PID"; do
[ -n "$pid" ] && kill -9 "$pid" 2>/dev/null || true
[ -n "$pid" ] && pkill -9 -P "$pid" 2>/dev/null || true
done
wait 2>/dev/null || true
rm -f /tmp/layer5_*.txt /tmp/layer_bootstrap.txt
}
trap cleanup EXIT
# Start testnet
echo "[orchestrator] starting DHT testnet..."
node layer2_testnet.js &
TESTNET_PID=$!
for i in $(seq 1 30); do
[ -f /tmp/layer_bootstrap.txt ] && break
sleep 0.2
done
[ -f /tmp/layer_bootstrap.txt ] || { echo "FAIL: testnet timeout"; exit 1; }
# Start Peer A (writer) — uses project dir
echo "[orchestrator] starting peer A (writer)..."
timeout -k 10 45 godot4 --headless --path project --script ../layer5_state_a.gd 2>&1 | sed 's/^/ [A] /' &
PIDS+=($!)
# Start Peer B (verifier) — uses project_b dir (both use swarm_join now)
echo "[orchestrator] starting peer B (verifier)..."
timeout -k 10 45 godot4 --headless --path project_b --script ../layer5_state_b.gd 2>&1 | sed 's/^/ [B] /' &
PIDS+=($!)
# Wait for completion
ELAPSED=0
while [ $ELAPSED -lt 35 ]; do
B_STATUS=$(cat /tmp/layer5_peer_b_status.txt 2>/dev/null || echo "")
if [ "$B_STATUS" = "PASS" ]; then
echo ""
echo "=== Layer 5: PASS ==="
exit 0
fi
if echo "$B_STATUS" | grep -q "^FAIL"; then
echo ""
echo "Peer B: $B_STATUS"
echo "=== Layer 5: FAILED ==="
exit 1
fi
sleep 1
ELAPSED=$((ELAPSED + 1))
done
echo ""
echo "Peer A: $(cat /tmp/layer5_peer_a_status.txt 2>/dev/null || echo 'no status')"
echo "Peer B: $(cat /tmp/layer5_peer_b_status.txt 2>/dev/null || echo 'no status')"
echo "=== Layer 5: TIMEOUT ==="
exit 1