#!/usr/bin/env python3 # -*- coding: utf-8 -*- """保护定值持久化胶水层(prot_set_store)的主机侧单元测试运行器(L0.5,纯标准库)。 做什么: 用本机 MSVC 编译 test/host/prot_set_store/prot_set_store_test.c(同时纳入**生产源** App/cfg/prot_set_store.c 与 App/cfg/prot_set.c),在 PC 上离线验证 blob 装载的 返回码分流(1 无档 / 0 成功 / 2 换代 / -1 损坏)与保存的脏标志回置,失败即非 0 退出。工具链与判定委托 test/host/common/unit_test_harness.py。 为什么要主机侧单测(而不是只用台架): 换代与损坏必须分开(B8:定值表 32→40 项)——把正常的固件升级当损坏,会让设备在 升级后报 ERROR + 自检留痕,现场查一个不存在的故障;写盘失败若不把脏标志还回去, 表现是"改了定值、重启又变回旧的"且无任何提示。这两条真机上都要靠故障注入才碰得到。 为什么连 prot_set.c 一起编:blob 的编解码与脏标志都在它里面,只有拿**真** serialize 产出的 blob 去改 magic/ver/cnt/校验,才能造出真实的"换代"与"损坏"形态;手搓 blob 等于测自己的桩。定值算法本身归 test/host/prot_set/,本模块不重测。 用法(仓库根目录): python test/host/prot_set_store/run_unit_test.py 退出码:0=PASS / 1=测试失败 / 2=环境错误。 设计依据:App/cfg/prot_set_store.h 的返回码表、docs/测试说明/主机单测覆盖率口径.md §9 P1 创建日期:2026-10-23 """ 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 先于生产目录(覆盖 dbg_log.h)。cfg_file_store.h / prot_set.h / # prot_set_store.h 全用真实头,后端两个被调函数由测试单元给可控实现。 BUILD = TestBuild( name="Prot Set Store Tests", src=os.path.join(HERE, "prot_set_store_test.c"), include_dirs=[ os.path.join(HERE, "stub"), os.path.join(ROOT, "App", "cfg"), os.path.join(ROOT, "App", "algo"), HERE, ], summary_marker="=== Prot Set Store Tests:", ) if __name__ == "__main__": sys.exit(run_host_unit_test(BUILD))