#!/usr/bin/env python3 # -*- coding: utf-8 -*- """ui_net_sink 心跳边界主机侧纯逻辑单元测试运行器(纯标准库)。 做什么: 用本机 MSVC 编译 test/host/ui_sink/ui_sink_test.c(以 #include 纳入生产源 Drivers/BSP/UI/ui_net_sink.c),用桩 net_* 假件驱动推流协议全路径,钉死 F3(2026-10-25 大窗判读)两条判据:未注册钩子 = 行为逐字不变(模拟器形态); 注册后每个可等待 net 往返的返回处恰好喂一次心跳(风暴期单轮多往返不再串成 UI 心跳缺口,看门狗按位连击判据只抓真挂死)。 为什么要主机侧单测: 台架能复现风暴但造不出确定性的 RPC 计数;而心跳漏喂是回归性风险(改一行 调用位置就静默失效),必须在门禁层用计数断言钉死。 用法(仓库根目录): & '.venv\\Scripts\\python.exe' test/host/ui_sink/run_unit_test.py 退出码:0=PASS / 1=测试失败 / 2=环境错误。 设计依据:docs/UI设计/UI_设计架构.md(推流心跳边界); docs/子系统设计/看门狗设计说明.md §5.3(按位连击判据) 创建日期:2026-10-25 """ import os import sys HERE = os.path.dirname(os.path.abspath(__file__)) ROOT = os.path.dirname(os.path.dirname(os.path.dirname(HERE))) sys.path.insert(0, os.path.join(ROOT, "test", "host", "common")) from unit_test_harness import TestBuild, run_host_unit_test # noqa: E402 # stub 目录必须**先于** Drivers/BSP/UI:net_socket.h / ui_port.h / dbg_log.h / # test_config.h 由桩提供,ui_net_sink.h 与 ui_net_sink_backend.h 用真实头 # (几何令牌与协议常量一改即编译期报错)。 BUILD = TestBuild( name="UI Sink Beat Tests", src=os.path.join(HERE, "ui_sink_test.c"), include_dirs=[ os.path.join(HERE, "stub"), os.path.join(ROOT, "Drivers", "BSP", "UI"), HERE, ], summary_marker="=== UI Sink Tests:", ) if __name__ == "__main__": sys.exit(run_host_unit_test(BUILD))