diff --git a/scripts/e2e/start-e2e-stack.sh b/scripts/e2e/start-e2e-stack.sh new file mode 100755 index 0000000..0620f65 --- /dev/null +++ b/scripts/e2e/start-e2e-stack.sh @@ -0,0 +1,60 @@ +#!/usr/bin/env bash +set -euo pipefail + +ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/../.." && pwd)" +cd "$ROOT" + +BACKEND_PORT="${E2E_BACKEND_PORT:-8000}" +VITE_HOST="${E2E_VITE_HOST:-127.0.0.1}" +VITE_PORT="${E2E_VITE_PORT:-5173}" + +TMPDIR="$(mktemp -d -t meshchat-e2e-XXXXXX)" +export MESHCHAT_LOG_DIR="$TMPDIR/logs" +mkdir -p "$MESHCHAT_LOG_DIR" + +cleanup() { + if [[ -n "${BACK_PID:-}" ]] && kill -0 "$BACK_PID" 2>/dev/null; then + kill "$BACK_PID" 2>/dev/null || true + wait "$BACK_PID" 2>/dev/null || true + fi + rm -rf "$TMPDIR" +} + +trap cleanup EXIT INT TERM + +echo "E2E: starting MeshChat backend on 127.0.0.1:${BACKEND_PORT} (isolated storage under ${TMPDIR})" + +poetry run python -m meshchatx.meshchat \ + --headless \ + --no-https \ + --host 127.0.0.1 \ + --port "${BACKEND_PORT}" \ + --storage-dir "$TMPDIR/storage" \ + --reticulum-config-dir "$TMPDIR/rns" \ + & +BACK_PID=$! + +echo "E2E: waiting for /api/v1/status (HTTP 200)..." +ready=0 +for i in $(seq 1 240); do + if ! kill -0 "$BACK_PID" 2>/dev/null; then + echo "E2E: backend process exited before becoming ready" + exit 1 + fi + if curl -sf "http://127.0.0.1:${BACKEND_PORT}/api/v1/status" >/dev/null 2>&1; then + ready=1 + echo "E2E: backend ready after ${i}s" + break + fi + sleep 1 +done + +if [[ "$ready" -ne 1 ]]; then + echo "E2E: backend did not respond on :${BACKEND_PORT} within 240s" + exit 1 +fi + +echo "E2E: starting Vite on ${VITE_HOST}:${VITE_PORT}" +pnpm exec vite --host "${VITE_HOST}" --port "${VITE_PORT}" & +VITE_PID=$! +wait "$VITE_PID"