Files
wasm-simulator/test-web-wasm-node-smoke.sh

123 lines
3.5 KiB
Bash
Executable File

#!/usr/bin/env bash
set -euo pipefail
cd "$(dirname "$0")"
# LinuxCNC source basis: Node smoke only verifies the wasm/API bridge around
# source-backed LinuxCNC RS274 and switchkins/remap fixtures; it must not grow
# independent G-code or kinematics behavior.
missing=()
minimum_steps=${WASM_NODE_SMOKE_MIN_STEPS:-50}
if ! [[ "$minimum_steps" =~ ^[1-9][0-9]*$ ]]; then
echo "WASM_NODE_SMOKE_MIN_STEPS must be a positive integer: $minimum_steps" >&2
exit 1
fi
require_command() {
local command_name=$1
if ! command -v "$command_name" >/dev/null 2>&1; then
missing+=("$command_name")
fi
}
require_file() {
local file_path=$1
if [[ ! -f "$file_path" ]]; then
missing+=("$file_path")
elif [[ ! -r "$file_path" || ! -s "$file_path" ]]; then
missing+=("readable non-empty $file_path")
fi
}
report_missing_prerequisites() {
echo "WASM Node 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
}
required_files=(
test-web-wasm-node-smoke.cjs
web/public/cnc_sim.js
web/public/cnc_sim.wasm
web/public/linuxcnc_switchkins_remap_config_cases.json
web/src/app.js
web/src/wasm-core.js
)
for required in \
node \
"${required_files[@]}"
do
if [[ "$required" == node ]]; then
require_command node
else
require_file "$required"
fi
done
if ((${#missing[@]} > 0)); then
report_missing_prerequisites
exit 1
fi
if ! node - <<'JS'
const fs = require("fs");
const cases = JSON.parse(fs.readFileSync("web/public/linuxcnc_switchkins_remap_config_cases.json", "utf8"));
if (!Array.isArray(cases) || cases.length === 0) {
throw new Error("expected non-empty LinuxCNC switchkins config case JSON");
}
for (const [index, configCase] of cases.entries()) {
if (
!configCase ||
typeof configCase.field !== "string" ||
typeof configCase.value !== "string" ||
!Number.isInteger(configCase.m428) ||
!Number.isInteger(configCase.m429) ||
!Number.isInteger(configCase.m430)
) {
throw new Error(`invalid LinuxCNC switchkins config case at index ${index}`);
}
}
JS
then
echo "WASM Node smoke switchkins config case JSON check failed" >&2
exit 1
fi
node_log=$(mktemp "${TMPDIR:-/tmp}/cnc_sim_node_smoke.XXXXXX.log")
cleanup() {
rm -f "$node_log"
}
trap cleanup EXIT
echo "running WASM Node smoke"
echo "WASM Node smoke node version: $(node --version)"
if ! node --check test-web-wasm-node-smoke.cjs >"$node_log" 2>&1; then
echo "WASM Node smoke syntax check failed" >&2
sed -n '1,80p' "$node_log" >&2
exit 1
fi
for web_module in web/public/cnc_sim.js web/src/wasm-core.js web/src/app.js; do
if ! node --check "$web_module" >"$node_log" 2>&1; then
echo "WASM Node smoke web module syntax check failed for $web_module" >&2
sed -n '1,80p' "$node_log" >&2
exit 1
fi
done
if ! node test-web-wasm-node-smoke.cjs >"$node_log" 2>&1; then
echo "WASM Node smoke failed" >&2
sed -n '1,120p' "$node_log" >&2
exit 1
fi
passed_steps=$(grep -o 'web wasm node smoke passed ([0-9][0-9]* steps)' "$node_log" | tail -n 1 | grep -o '[0-9][0-9]*' || true)
if [[ -z "$passed_steps" ]]; then
echo "WASM Node smoke did not report a completed step count" >&2
sed -n '1,120p' "$node_log" >&2
exit 1
fi
if ((passed_steps < minimum_steps)); then
echo "WASM Node smoke covered $passed_steps steps, expected at least $minimum_steps" >&2
sed -n '1,120p' "$node_log" >&2
exit 1
fi
cat "$node_log"