Files
cnc_wams/wasm-port/tools/verify_task_status_json_contract.sh
2026-07-08 09:20:47 -04:00

72 lines
2.2 KiB
Bash
Executable File

#!/usr/bin/env bash
set -euo pipefail
ROOT_DIR="$(cd "$(dirname "$0")/.." && pwd)"
TASK_WRAPPER="$ROOT_DIR/runtime/core/linuxcnc_wrap/linuxcnc_task_hal_wasm.cpp"
SDK="$ROOT_DIR/runtime/sdk/src/linuxcnc-task-hal.js"
fail() {
printf 'task_status_json_contract_status=fail\n'
printf 'task_status_json_contract_error=%s\n' "$1"
exit 1
}
require_text() {
local label="$1"
local file="$2"
local text="$3"
grep -Fq "$text" "$file" || fail "$label missing"
printf 'task_status_json_contract_%s=ok\n' "$label"
}
reject_text() {
local label="$1"
local file="$2"
local text="$3"
if grep -Fq "$text" "$file"; then
fail "$label present"
fi
printf 'task_status_json_contract_%s=absent\n' "$label"
}
if ! command -v emcc >/dev/null 2>&1 && [[ -f "$HOME/emsdk/emsdk_env.sh" ]]; then
# shellcheck source=/dev/null
source "$HOME/emsdk/emsdk_env.sh" >/dev/null
fi
if ! command -v emcc >/dev/null 2>&1; then
printf 'task_status_json_contract_status=skipped_missing_emcc\n'
printf 'nativeTaskReady=false\n'
printf 'nativeHalSyncReady=false\n'
exit 0
fi
if [[ "${SKIP_TASK_HAL_BUILD:-0}" != "1" ]]; then
"$ROOT_DIR/tools/build_task_hal_wasm.sh"
fi
node "$ROOT_DIR/tests/wasm/node/verify_task_status_json_contract.mjs"
require_text schema_version "$TASK_WRAPPER" 'schemaVersion'
require_text standalone_status_source "$TASK_WRAPPER" 'statusSource'
require_text traj_object "$TASK_WRAPPER" 'traj'
require_text task_line_fields "$TASK_WRAPPER" 'currentLine'
require_text axis_array "$TASK_WRAPPER" 'axis_status_array_json'
require_text joint_array "$TASK_WRAPPER" 'joint_status_array_json'
require_text io_aux "$TASK_WRAPPER" 'aux'
require_text io_tool "$TASK_WRAPPER" 'tool'
require_text io_coolant "$TASK_WRAPPER" 'coolant'
read_status_body="$(
awk '/int lctask_read_status_json/{capture=1} capture{print} capture && /^}/{exit}' "$TASK_WRAPPER"
)"
if grep -Fq 'lcmot_read_status_json' <<<"$read_status_body"; then
fail "lctask_read_status_json calls lcmot_read_status_json"
fi
printf 'task_status_json_contract_status_read_no_motion_json=ok\n'
reject_text sdk_no_motion_semantics "$SDK" "queueFull"
reject_text sdk_no_task_semantics "$SDK" "interpState"
printf 'task_status_json_contract_status=ok\n'