#!/usr/bin/env bash set -euo pipefail cd "$(dirname "$0")" chromium_bin=${CHROMIUM:-} if [[ -z "$chromium_bin" ]]; then for candidate in chromium chromium-browser google-chrome; do if command -v "$candidate" >/dev/null 2>&1; then chromium_bin=$(command -v "$candidate") break fi done fi missing=() if [[ -z "$chromium_bin" ]]; then missing+=("chromium") fi for required in python3 web/public/cnc_sim.js web/public/cnc_sim.wasm web/test-browser-wasm-smoke.html; do if [[ "$required" == python3 ]]; then if ! command -v python3 >/dev/null 2>&1; then missing+=("python3") fi elif [[ ! -f "$required" ]]; then missing+=("$required") fi done if ((${#missing[@]} > 0)); then echo "WASM browser smoke prerequisites are missing: ${missing[*]}." >&2 echo "Run ./build-wasm.sh after activating emsdk to generate web/public/cnc_sim.js and web/public/cnc_sim.wasm." >&2 exit 1 fi server_log=$(mktemp "${TMPDIR:-/tmp}/cnc_sim_browser_smoke_server.XXXXXX.log") dom_log=$(mktemp "${TMPDIR:-/tmp}/cnc_sim_browser_smoke_dom.XXXXXX.html") profile_dir=$(mktemp -d "${TMPDIR:-/tmp}/cnc_sim_browser_smoke_profile.XXXXXX") cleanup() { if [[ -n "${server_pid:-}" ]]; then kill "$server_pid" >/dev/null 2>&1 || true wait "$server_pid" >/dev/null 2>&1 || true fi rm -f "$server_log" "$dom_log" rm -rf "$profile_dir" } trap cleanup EXIT port=$(python3 - <<'PY' import socket with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as sock: sock.bind(("127.0.0.1", 0)) print(sock.getsockname()[1]) PY ) python3 -m http.server "$port" --bind 127.0.0.1 --directory web >"$server_log" 2>&1 & server_pid=$! for _ in {1..50}; do if ! kill -0 "$server_pid" >/dev/null 2>&1; then echo "browser smoke HTTP server exited early" >&2 sed -n '1,40p' "$server_log" >&2 exit 1 fi if python3 - "$port" <<'PY' import socket import sys with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as sock: sock.settimeout(0.1) sys.exit(0 if sock.connect_ex(("127.0.0.1", int(sys.argv[1]))) == 0 else 1) PY then break fi sleep 0.1 done if ! python3 - "$port" <<'PY' import socket import sys with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as sock: sock.settimeout(0.1) sys.exit(0 if sock.connect_ex(("127.0.0.1", int(sys.argv[1]))) == 0 else 1) PY then echo "browser smoke HTTP server did not start on port $port" >&2 sed -n '1,40p' "$server_log" >&2 exit 1 fi "$chromium_bin" \ --headless=new \ --disable-gpu \ --no-sandbox \ --user-data-dir="$profile_dir" \ --virtual-time-budget=5000 \ --dump-dom \ "http://127.0.0.1:$port/test-browser-wasm-smoke.html" >"$dom_log" 2>&1 if ! grep -F "browser wasm smoke passed" "$dom_log" >/dev/null; then echo "browser WASM smoke did not pass" >&2 sed -n '1,120p' "$dom_log" >&2 exit 1 fi echo "browser wasm smoke passed"