AvanzaCast/e2e/run-smoke-local.sh

117 lines
4.1 KiB
Bash

#!/usr/bin/env bash
# e2e/run-smoke-local.sh
# Smoke test helper: arranca mock server, arranca Chrome (opcional) o fallback via puppeteer launcher,
# ejecuta `validate-flow-remote-chrome.js` y limpia los procesos.
# Usage:
# CHROME_CMD="/usr/bin/google-chrome" ./run-smoke-local.sh
# or set CHROME_HOST/CHROME_WS to reuse an existing remote Chrome
set -euo pipefail
ROOT_DIR="$(cd "$(dirname "$0")" && pwd)"
cd "$ROOT_DIR"
LOGDIR="$ROOT_DIR/logs"
mkdir -p "$LOGDIR"
MOCK_LOG="$LOGDIR/mock_server.log"
CHROME_LOG="$LOGDIR/chrome_launch.log"
VALIDATOR_LOG="$LOGDIR/validator.log"
echo "[smoke] working dir: $ROOT_DIR"
# Start mock server
echo "[smoke] starting mock server... (logs: $MOCK_LOG)"
node mock_server.js > "$MOCK_LOG" 2>&1 &
MOCK_PID=$!
sleep 0.6
if ! kill -0 "$MOCK_PID" 2>/dev/null; then
echo "[smoke][error] failed to start mock server; see $MOCK_LOG"
tail -n 200 "$MOCK_LOG" || true
exit 2
fi
echo "[smoke] mock server pid=$MOCK_PID"
# Determine Chrome websocket endpoint
WS=""
if [ -n "${CHROME_WS:-}" ]; then
WS="$CHROME_WS"
echo "[smoke] using CHROME_WS from env"
fi
# If user provided CHROME_HOST, resolve ws
if [ -z "$WS" ] && [ -n "${CHROME_HOST:-}" ]; then
echo "[smoke] resolving websocket endpoint from CHROME_HOST=$CHROME_HOST"
URL="http://${CHROME_HOST%:*}:${CHROME_HOST##*:}/json/version"
# if CHROME_HOST already has port include it directly
if [[ "$CHROME_HOST" == *":"* ]]; then URL="http://$CHROME_HOST/json/version"; fi
if ! curl -sS "$URL" > /dev/null 2>&1; then
echo "[smoke] warning: cannot reach $URL"
else
WS=$(curl -sS "$URL" | python3 -c "import sys,json;print(json.load(sys.stdin).get('webSocketDebuggerUrl',''))") || true
echo "[smoke] resolved WS=$WS"
fi
fi
# If still no WS, try to launch Chrome via CHROME_CMD if provided
LAUNCHED_CHROME_PID=""
if [ -z "$WS" ]; then
if [ -n "${CHROME_CMD:-}" ]; then
echo "[smoke] launching Chrome via CHROME_CMD=$CHROME_CMD"
"$CHROME_CMD" --remote-debugging-port=9222 --user-data-dir=/tmp/avz_smoke_profile --no-first-run --no-default-browser-check > "$CHROME_LOG" 2>&1 &
LAUNCHED_CHROME_PID=$!
sleep 1
# try to fetch ws
for i in 1 2 3 4 5; do
if curl -sS http://localhost:9222/json/version >/dev/null 2>&1; then
WS=$(curl -sS http://localhost:9222/json/version | python3 -c "import sys,json;print(json.load(sys.stdin).get('webSocketDebuggerUrl',''))") || true
break
fi
sleep 1
done
echo "[smoke] chrome launched pid=$LAUNCHED_CHROME_PID ws=$WS"
else
# fallback: use puppeteer launcher script
echo "[smoke] no CHROME_CMD provided; launching Chromium via puppeteer (fallback)"
node _launch_chrome_puppeteer.js > "$CHROME_LOG" 2>&1 &
LAUNCHER_PID=$!
sleep 0.8
# read ws from log
for i in 1 2 3 4 5; do
if grep -m1 PUPPETEER_WS= "$CHROME_LOG" >/dev/null 2>&1; then
WS_LINE=$(grep -m1 PUPPETEER_WS= "$CHROME_LOG" || true)
WS=${WS_LINE#PUPPETEER_WS=}
break
fi
sleep 1
done
echo "[smoke] puppeteer-launched chrome pid=$LAUNCHER_PID ws=$WS"
LAUNCHED_CHROME_PID=${LAUNCHER_PID:-}
fi
fi
if [ -z "$WS" ]; then
echo "[smoke][warn] could not resolve Chrome websocket endpoint; you can set CHROME_WS or CHROME_HOST to skip launch"
echo "[smoke] continuing to try validator using CHROME_HOST if set"
fi
# Run validator using CHROME_WS if available else CHROME_HOST
echo "[smoke] running validator (logs: $VALIDATOR_LOG)"
export CHROME_WS="$WS"
export BROADCAST_URL="http://localhost:4001/broadcast"
export STUDIO_URL="http://localhost:4001/studio"
export TOKEN="smoketest-token-123"
node validate-flow-remote-chrome.js > "$VALIDATOR_LOG" 2>&1 || echo "[smoke] validator exited non-zero; see $VALIDATOR_LOG"
# show result snippets
echo "[smoke] validator log (tail 200):"
tail -n 200 "$VALIDATOR_LOG" || true
# cleanup
echo "[smoke] cleaning up..."
if [ -n "${MOCK_PID:-}" ]; then kill $MOCK_PID >/dev/null 2>&1 || true; fi
if [ -n "${LAUNCHED_CHROME_PID:-}" ]; then kill $LAUNCHED_CHROME_PID >/dev/null 2>&1 || true; fi
if [ -n "${LAUNCHER_PID:-}" ]; then kill $LAUNCHER_PID >/dev/null 2>&1 || true; fi
echo "[smoke] logs stored in $LOGDIR"
exit 0