Files
cnc_wams/wasm-port/tests/native/verify_native_probes.sh
wangdequan 55f6659993 是的
结论:已将 LinuxCNC identity/trivial kinematics 源码纳入 WASM port 的 vendored manifest、native probe 和文档验证链,完整 native 验证通过。
2026-06-07 18:56:38 +08:00

310 lines
12 KiB
Bash
Executable File

#!/usr/bin/env bash
set -euo pipefail
ROOT_DIR="$(cd "$(dirname "$0")/../.." && pwd)"
BUILD_DIR="$ROOT_DIR/build/native"
GCODE_FIXTURE_DIR="$ROOT_DIR/tests/fixtures/gcode"
CANON_FIXTURE_DIR="$ROOT_DIR/tests/fixtures/canon"
GCODE_ERROR_FIXTURE_DIR="$ROOT_DIR/tests/fixtures/gcode_errors"
CANON_ERROR_FIXTURE_DIR="$ROOT_DIR/tests/fixtures/canon_errors"
NAMEDPARAM_INI_FIXTURE="$ROOT_DIR/tests/fixtures/ini/namedparams.ini"
"$ROOT_DIR/tools/verify_upstream_baseline.sh"
"$ROOT_DIR/tools/verify_vendor_sync.sh"
"$ROOT_DIR/tools/verify_no_standalone_cnc_semantics.sh"
"$ROOT_DIR/tools/build_native_probes.sh"
check_source_probe_coverage() {
local manifest_sources="$BUILD_DIR/source-manifest-sources.sorted"
local probe_sources="$BUILD_DIR/source-probe-sources.sorted"
local duplicate_probe_sources="$BUILD_DIR/source-probe-sources.duplicates"
awk '
/^[[:space:]]*($|#)/ { next }
/\.(c|cc)$/ { print }
' "$ROOT_DIR/tools/source-manifest.txt" | sort > "$manifest_sources"
if [[ ! -f "$BUILD_DIR/source-probes.tsv" ]]; then
echo "missing source probe map: $BUILD_DIR/source-probes.tsv" >&2
exit 1
fi
cut -f1 "$BUILD_DIR/source-probes.tsv" | sort > "$probe_sources"
uniq -d "$probe_sources" > "$duplicate_probe_sources"
if [[ -s "$duplicate_probe_sources" ]]; then
echo "duplicate source probe entries:" >&2
cat "$duplicate_probe_sources" >&2
exit 1
fi
local missing_sources
missing_sources="$(comm -23 "$manifest_sources" "$probe_sources")"
if [[ -n "$missing_sources" ]]; then
echo "manifest source files without source probes:" >&2
printf '%s\n' "$missing_sources" >&2
exit 1
fi
local extra_sources
extra_sources="$(comm -13 "$manifest_sources" "$probe_sources")"
if [[ -n "$extra_sources" ]]; then
echo "source probes not listed in manifest:" >&2
printf '%s\n' "$extra_sources" >&2
exit 1
fi
}
check_exitcode() {
local name="$1"
local file="$BUILD_DIR/$name.exitcode"
if [[ ! -f "$file" ]]; then
echo "missing exitcode: $file" >&2
exit 1
fi
local rc
rc="$(tr -d '[:space:]' < "$file")"
if [[ "$rc" != "0" ]]; then
echo "$name failed with exit code $rc" >&2
if [[ -f "$BUILD_DIR/$name.stderr.log" ]]; then
sed -n '1,160p' "$BUILD_DIR/$name.stderr.log" >&2
fi
exit 1
fi
}
check_source_probe_coverage
check_exitcode linuxcnc_interp_state_probe
check_exitcode linuxcnc_inifile_source_probe
check_exitcode linuxcnc_tp_api_probe
check_exitcode linuxcnc_tp_api_probe.run
check_exitcode linuxcnc_kinematics_probe
check_exitcode linuxcnc_kinematics_probe.run
for name in \
linuxcnc_tp_tp_source_probe \
linuxcnc_tp_tc_source_probe \
linuxcnc_tp_tcq_source_probe \
linuxcnc_tp_spherical_arc_source_probe \
linuxcnc_tp_blendmath_source_probe \
linuxcnc_tp_sp_scurve_source_probe \
linuxcnc_tp_ruckig_wrapper_source_probe \
linuxcnc_cruckig_block_source_probe \
linuxcnc_cruckig_brake_source_probe \
linuxcnc_cruckig_calculator_source_probe \
linuxcnc_cruckig_cruckig_source_probe \
linuxcnc_cruckig_input_parameter_source_probe \
linuxcnc_cruckig_output_parameter_source_probe \
linuxcnc_cruckig_profile_source_probe \
linuxcnc_cruckig_roots_source_probe \
linuxcnc_cruckig_trajectory_source_probe \
linuxcnc_cruckig_position_first_step1_source_probe \
linuxcnc_cruckig_position_first_step2_source_probe \
linuxcnc_cruckig_position_second_step1_source_probe \
linuxcnc_cruckig_position_second_step2_source_probe \
linuxcnc_cruckig_position_third_step1_source_probe \
linuxcnc_cruckig_position_third_step2_source_probe \
linuxcnc_cruckig_velocity_second_step1_source_probe \
linuxcnc_cruckig_velocity_second_step2_source_probe \
linuxcnc_cruckig_velocity_third_step1_source_probe \
linuxcnc_cruckig_velocity_third_step2_source_probe \
linuxcnc_emcpose_source_probe \
linuxcnc_posemath_source_probe \
linuxcnc_posemath_c_source_probe \
linuxcnc_sincos_source_probe; do
check_exitcode "$name"
done
check_exitcode linuxcnc_namedparam_harness
check_exitcode linuxcnc_namedparam_harness.run
check_exitcode linuxcnc_interp_minimal_harness
check_exitcode linuxcnc_interp_minimal_harness.run
check_exitcode linuxcnc_parameter_file_harness
check_exitcode linuxcnc_parameter_file_harness.run
check_exitcode linuxcnc_rs274_compile_probe
check_exitcode linuxcnc_kins_util_source_probe
check_exitcode linuxcnc_trivkins_source_probe
check_exitcode linuxcnc_interp_convert_source_probe
check_exitcode linuxcnc_interp_read_source_probe
check_exitcode linuxcnc_interp_check_source_probe
check_exitcode linuxcnc_interp_execute_source_probe
check_exitcode linuxcnc_modal_state_source_probe
check_exitcode linuxcnc_interp_array_source_probe
check_exitcode linuxcnc_interp_internal_source_probe
check_exitcode linuxcnc_interp_arc_source_probe
check_exitcode linuxcnc_interp_inverse_source_probe
check_exitcode linuxcnc_interp_cycles_source_probe
check_exitcode linuxcnc_interp_g7x_source_probe
check_exitcode linuxcnc_interp_queue_source_probe
check_exitcode linuxcnc_interp_find_source_probe
check_exitcode linuxcnc_interp_namedparams_source_probe
check_exitcode linuxcnc_interp_write_source_probe
check_exitcode linuxcnc_interp_o_word_source_probe
check_exitcode linuxcnc_rs274ngc_pre_source_probe
check_exitcode linuxcnc_interp_base_source_probe
check_exitcode linuxcnc_gomath_source_probe
NAMEDPARAM_STDOUT="$BUILD_DIR/linuxcnc_namedparam_harness.run.stdout.log"
grep -Fq "init_named_parameters=0" "$NAMEDPARAM_STDOUT"
grep -Fq "global_named_count=57" "$NAMEDPARAM_STDOUT"
grep -Fq "_metric_machine: rc=0 found=1 value=1" "$NAMEDPARAM_STDOUT"
grep -Fq "_motion_mode: rc=0 found=1 value=10" "$NAMEDPARAM_STDOUT"
grep -Fq "_metric: rc=0 found=1 value=1" "$NAMEDPARAM_STDOUT"
grep -Fq "_feed: rc=0 found=1 value=123.45" "$NAMEDPARAM_STDOUT"
grep -Fq "_rpm: rc=0 found=1 value=678.9" "$NAMEDPARAM_STDOUT"
grep -Fq "_x: rc=0 found=1 value=1.25" "$NAMEDPARAM_STDOUT"
grep -Fq "_current_tool: rc=0 found=1 value=12" "$NAMEDPARAM_STDOUT"
grep -Fq "_ini[traj]max_linear_velocity: rc=0 found=1 value=35" "$NAMEDPARAM_STDOUT"
grep -Fq "_hal[standalone.pin-bit]: rc=0 found=1 value=1" "$NAMEDPARAM_STDOUT"
grep -Fq "_hal[standalone.signal-float]: rc=0 found=1 value=98.25" "$NAMEDPARAM_STDOUT"
grep -Fq "_hal[standalone.param-s32]: rc=0 found=1 value=-17" "$NAMEDPARAM_STDOUT"
grep -Fq "_hal[standalone.pin-u32]: rc=0 found=1 value=1.23457e+08" "$NAMEDPARAM_STDOUT"
grep -Fq "_hal[standalone.signal-s64]: rc=0 found=1 value=-9e+09" "$NAMEDPARAM_STDOUT"
grep -Fq "_hal[standalone.param-u64]: rc=0 found=1 value=9e+09" "$NAMEDPARAM_STDOUT"
grep -Fq "_hal[standalone.disconnected-float]: rc=0 found=1 value=12.5" "$NAMEDPARAM_STDOUT"
grep -Fq "_hal[standalone.missing]: rc=0 found=0 value=0" "$NAMEDPARAM_STDOUT"
PARAMETER_FILE_STDOUT="$BUILD_DIR/linuxcnc_parameter_file_harness.run.stdout.log"
grep -Fq "restore_existing=0" "$PARAMETER_FILE_STDOUT"
grep -Fq "parameter_5161=10.5" "$PARAMETER_FILE_STDOUT"
grep -Fq "parameter_5162=20.25" "$PARAMETER_FILE_STDOUT"
grep -Fq "parameter_5220=1" "$PARAMETER_FILE_STDOUT"
grep -Fq "parameter_5221=2.25" "$PARAMETER_FILE_STDOUT"
grep -Fq "parameter_5399=44" "$PARAMETER_FILE_STDOUT"
grep -Fq "restore_missing_file=0" "$PARAMETER_FILE_STDOUT"
grep -Fq "restore_out_of_order=5" "$PARAMETER_FILE_STDOUT"
grep -Fq "restore_out_of_order_error=Parameter file out of order" "$PARAMETER_FILE_STDOUT"
grep -Fq "restore_missing_required=0" "$PARAMETER_FILE_STDOUT"
grep -Fq "missing_required_5161=3.5" "$PARAMETER_FILE_STDOUT"
grep -Fq "missing_required_5162=0" "$PARAMETER_FILE_STDOUT"
grep -Fq "save_parameters=0" "$PARAMETER_FILE_STDOUT"
grep -Fq "saved_has_5161=1" "$PARAMETER_FILE_STDOUT"
grep -Fq "saved_has_5162=1" "$PARAMETER_FILE_STDOUT"
grep -Fq "saved_has_5221=1" "$PARAMETER_FILE_STDOUT"
grep -Fq "saved_has_5399=1" "$PARAMETER_FILE_STDOUT"
grep -Fq "saved_has_named_param=0" "$PARAMETER_FILE_STDOUT"
grep -Fq "backup_has_original_5161=1" "$PARAMETER_FILE_STDOUT"
TP_API_STDOUT="$BUILD_DIR/linuxcnc_tp_api_probe.run.stdout.log"
grep -Fq "tp_default_queue_size=32" "$TP_API_STDOUT"
grep -Fq "tp_err_ok=0" "$TP_API_STDOUT"
grep -Fq "tc_linear=1" "$TP_API_STDOUT"
grep -Fq "tc_circular=2" "$TP_API_STDOUT"
grep -Fq "pose_xyz=1,2,3" "$TP_API_STDOUT"
grep -Fq "tp_create=0" "$TP_API_STDOUT"
grep -Fq "tp_set_cycle_time=0" "$TP_API_STDOUT"
grep -Fq "tp_add_line=0" "$TP_API_STDOUT"
grep -Fq "tp_done_after_line=1" "$TP_API_STDOUT"
grep -Fq "tp_final_pos=1,0,0" "$TP_API_STDOUT"
grep -Fq "tp_add_circle=0" "$TP_API_STDOUT"
grep -Fq "tp_done_after_arc=1" "$TP_API_STDOUT"
grep -Fq "tp_arc_final_pos_near_end=1" "$TP_API_STDOUT"
grep -Fq "tp_queue_add_line1=0" "$TP_API_STDOUT"
grep -Fq "tp_queue_depth_after_line1=1" "$TP_API_STDOUT"
grep -Fq "tp_queue_add_line2=0" "$TP_API_STDOUT"
grep -Fq "tp_queue_depth_after_line2=2" "$TP_API_STDOUT"
grep -Fq "tp_done_after_queued_lines=1" "$TP_API_STDOUT"
grep -Fq "tp_queue_final_depth=0" "$TP_API_STDOUT"
grep -Fq "tp_queue_final_pos_near_end=1" "$TP_API_STDOUT"
KINEMATICS_STDOUT="$BUILD_DIR/linuxcnc_kinematics_probe.run.stdout.log"
grep -Fq "kinematics_init=0" "$KINEMATICS_STDOUT"
grep -Fq "kinematics_type=1" "$KINEMATICS_STDOUT"
grep -Fq "kinematics_switchable=0" "$KINEMATICS_STDOUT"
grep -Fq "kinematics_switch=0" "$KINEMATICS_STDOUT"
grep -Fq "kinematics_forward=0" "$KINEMATICS_STDOUT"
grep -Fq "kinematics_forward_xyz=1,2,3" "$KINEMATICS_STDOUT"
grep -Fq "kinematics_forward_abcuvw=4,5,6,7,8,9" "$KINEMATICS_STDOUT"
grep -Fq "kinematics_inverse=0" "$KINEMATICS_STDOUT"
grep -Fq "kinematics_inverse_xyz=10,20,30" "$KINEMATICS_STDOUT"
grep -Fq "kinematics_inverse_abcuvw=40,50,60,70,80,90" "$KINEMATICS_STDOUT"
check_fixture_output() {
local fixture="$1"
local expected="$2"
local stdout_file="$3"
local require_mdi="${4:-1}"
grep -Fq "read=0" "$stdout_file"
grep -Fq "parse_line=0" "$stdout_file"
if [[ "$require_mdi" == "1" ]]; then
local line_count
line_count="$(grep -cv '^[[:space:]]*$' "$fixture")"
local line_number
for ((line_number = 1; line_number <= line_count; line_number += 1)); do
if ! grep -Fq "execute_line_${line_number}=0" "$stdout_file" &&
! grep -Fq "execute_line_${line_number}=1" "$stdout_file" &&
! grep -Fq "execute_line_${line_number}=2" "$stdout_file"; then
echo "missing successful execute status for line $line_number in $stdout_file" >&2
exit 1
fi
done
else
grep -Fq "file_open=0" "$stdout_file"
grep -Fq "file_execute_1=0" "$stdout_file"
fi
while IFS= read -r expected_event; do
[[ -z "$expected_event" ]] && continue
grep -Fq "$expected_event" "$stdout_file"
done < "$expected"
}
RUN_STDOUT="$BUILD_DIR/linuxcnc_interp_minimal_harness.run.stdout.log"
check_fixture_output \
"$GCODE_FIXTURE_DIR/minimal_linear.ngc" \
"$CANON_FIXTURE_DIR/minimal_linear.events" \
"$RUN_STDOUT"
for fixture in "$GCODE_FIXTURE_DIR"/*.ngc; do
name="$(basename "$fixture" .ngc)"
expected="$CANON_FIXTURE_DIR/$name.events"
if [[ ! -f "$expected" ]]; then
echo "missing expected canon fixture: $expected" >&2
exit 1
fi
stdout_file="$BUILD_DIR/linuxcnc_interp_minimal_harness.$name.stdout.log"
stderr_file="$BUILD_DIR/linuxcnc_interp_minimal_harness.$name.stderr.log"
INI_FILE_NAME="$NAMEDPARAM_INI_FIXTURE" "$BUILD_DIR/linuxcnc_interp_minimal_harness" "$fixture" \
>"$stdout_file" \
2>"$stderr_file"
require_mdi=1
if [[ "$name" == "oword_subroutine" ]]; then
require_mdi=0
fi
check_fixture_output "$fixture" "$expected" "$stdout_file" "$require_mdi"
done
for fixture in "$GCODE_ERROR_FIXTURE_DIR"/*.ngc; do
name="$(basename "$fixture" .ngc)"
expected="$CANON_ERROR_FIXTURE_DIR/$name.expected"
if [[ ! -f "$expected" ]]; then
echo "missing expected error fixture: $expected" >&2
exit 1
fi
stdout_file="$BUILD_DIR/linuxcnc_interp_minimal_harness.$name.stdout.log"
stderr_file="$BUILD_DIR/linuxcnc_interp_minimal_harness.$name.stderr.log"
INI_FILE_NAME="$NAMEDPARAM_INI_FIXTURE" "$BUILD_DIR/linuxcnc_interp_minimal_harness" "$fixture" \
>"$stdout_file" \
2>"$stderr_file"
while IFS= read -r expected_line; do
[[ -z "$expected_line" ]] && continue
if [[ "$expected_line" == absent=* ]]; then
forbidden="${expected_line#absent=}"
if grep -Fq "$forbidden" "$stdout_file"; then
echo "unexpected output in $stdout_file: $forbidden" >&2
exit 1
fi
elif [[ "$expected_line" == error_text=* ]]; then
grep -Fq "$expected_line" "$stdout_file"
else
grep -Fq "$expected_line" "$stdout_file"
fi
done < "$expected"
done
echo "native probe validation complete"