#!/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