Files
wasm-simulator/test-web-wasm-browser-smoke.sh
cnc de273bf830 接续上一轮:推进浏览器验证与M428配置收拢
结论:已完成浏览器侧真实加载验证,M428/M429/M430 的配置入口进一步从 LinuxCNC INI/HALFILE/REMAP 来源生成,native 与 source-link 验证通过。
2026-05-30 10:03:21 +08:00

111 lines
2.9 KiB
Bash
Executable File

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