diff --git a/linux-agent/src/input.rs b/linux-agent/src/input.rs index 0a77bf5..6fe4865 100644 --- a/linux-agent/src/input.rs +++ b/linux-agent/src/input.rs @@ -242,8 +242,10 @@ mod tests { #[test] fn coordinate_scaling_covers_full_range() { assert_eq!(scale(0, 1920), 0); + // 归一化上界必须映射到 extent-1,否则指针永远到不了屏幕最右/最下 assert_eq!(scale(65535, 1920), 1919); - assert_eq!(scale(32768, 1920), 960); + // 中点:32768 × 1919 ÷ 65535 = 959.49…,整数除法向下取整 → 959 + assert_eq!(scale(32768, 1920), 959); assert_eq!(scale(12345, 0), 0); // 退化尺寸不 panic } } diff --git a/scripts/linux-smoke.sh b/scripts/linux-smoke.sh index 327651b..6eb2dfa 100644 --- a/scripts/linux-smoke.sh +++ b/scripts/linux-smoke.sh @@ -43,6 +43,9 @@ if [ "$ready" -ne 1 ]; then fi echo "[smoke] X server 就绪:$(xdpyinfo -display "$DISPLAY_NUM" | grep -E 'dimensions' | head -1)" -# 两个测试共用同一块虚拟屏与指针,必须串行 +# 先跑纯逻辑单测(键码映射 / 坐标换算),不需要 X server +cargo test -p linux-agent --bins + +# 再跑端到端用例:两个用例共用同一块虚拟屏与指针,必须串行 cargo test -p linux-agent --test smoke -- --nocapture --test-threads=1 echo "[smoke] 通过" diff --git a/构建运行手册.md b/构建运行手册.md index d85b7b0..5a52ba9 100644 --- a/构建运行手册.md +++ b/构建运行手册.md @@ -167,9 +167,15 @@ viewer.exe --addr <被控机IP> --port 47800 --code 123456 bash scripts/linux-smoke.sh ``` -脚本自建 Xvfb 虚拟屏后跑端到端测试,覆盖:X11 采集 → openh264 编码 → QUIC 下行解帧、 -验证码认证(含**错误验证码被拒**)、Ping/Pong(含下行丢包统计字段)、静止桌面下的关键帧 -恢复,以及**输入注入实证**——注入鼠标移动后,从另一条 X11 连接读回指针真实坐标。 +脚本自建 Xvfb 虚拟屏后跑**单测 + 端到端**两层: + +- 单测(不需要 X server):键码映射、坐标换算等纯逻辑; +- 端到端:X11 采集 → openh264 编码 → QUIC 下行解帧、验证码认证(含**错误验证码被拒**)、 + Ping/Pong(含下行丢包统计字段)、静止桌面下的关键帧恢复,以及**输入注入实证**—— + 注入鼠标移动后,从另一条 X11 连接读回指针真实坐标。 + +> 单测那层别省:坐标换算的取整边界就是靠它才发现的(集成测试有 ±2 像素容差, +> 期望值写错也照样绿)。 > 静止关键帧那条用例做过**变异测试**:把修复退回会失败、恢复后通过,确认断言不是摆设。 > 注意扰动量必须小(画 64x64 小方块)——整屏刷白会触发编码器场景切换自动 IDR,