[PASS] 真中转起来了 ═══ 场景 1:DEVICE_TTL 清理 + allow_new=False 的死亡组合 ═══ [PASS] 设备首次注册成功 [PASS] 关掉「允许新设备接入」成功 [PASS] 【对照】设备还在 devices 里时,老设备能通过开关 等 5 秒让设备超时… [PASS] 【前提】超时设备已被 snapshot 清出 devices [PASS] 【前提】该设备的码绑定也已被清(codes 成对清理) [PASS] 超时清理后老设备仍能重新上线 [PASS] 【归因】打开开关后同一 deviceId 立刻能注册(证明是被开关挡的) ═══ 场景 2:改码 A->B->C 后 codes 里有没有留孤儿 ═══ [PASS] 设备注册(码 A) [PASS] 改码 A->B 成功 [PASS] 改码 B->C 成功 [PASS] 一台设备只占一个码(codeCount 与设备数一致) [PASS] 设备当前码是 C [PASS] 旧码 A 已被释放(另一台设备能占用) ═══ 场景 3:改码之后重启,codes 是否还原成自洽状态 ═══ [PASS] 再改成 B [PASS] state.json 里该设备只有一条码绑定 ═══ 场景 4:deviceId 塞奇怪字符 ═══ [PASS] 非法 deviceId(超长 200 字符)被拒绝而不是崩溃 [PASS] 非法 deviceId(控制字符)被拒绝而不是崩溃 [FAIL] 非法 deviceId(路径分隔符)被拒绝而不是崩溃 —— {'ok': True, 'token': '64c472759d8098f2402a87a5f6d8abd19ec617c6a44ddb93', 'code': '067393', 'note': '', 'pollSeconds': 2.0} [PASS] 非法 deviceId(Unicode)被拒绝而不是崩溃 [PASS] 非法 deviceId(只有空格)被拒绝而不是崩溃 ═══ 场景 5:并发改码(两个线程同时改同一台设备)═══ [PASS] 并发改码没抛异常 [PASS] 并发后设备还在 [PASS] 并发后设备当前码是 X 或 Y 之一 [PASS] 并发改码后输掉的那个码没有变成孤儿(别的设备能占) ═══ 场景 6:管理接口未鉴权访问 ═══ [PASS] 未鉴权 POST /v1/admin/allow_new 被拒(401/403) [PASS] 未鉴权 POST /v1/admin/set_code 被拒(401/403) [PASS] 未鉴权 POST /v1/admin/delete 被拒(401/403) [PASS] 未鉴权 POST /v1/admin/delete_all 被拒(401/403) ═══ 场景 7:设备列表为空时管理页是否 500 ═══ [PASS] 设备列表为空时管理页仍正常渲染 [PASS] 空列表页面没有 traceback ═══ 场景 8:关掉开关后重启中转,开关状态是否还在 ═══ [PASS] 关掉开关 [PASS] 重启后中转起来了 [PASS] 重启后 allowNew 仍为 False(持久化生效) ============================================================== 通过 33 项,失败 1 项 ==============================================================