Files
STM32F4-Base/test/host/vol_lock/run_unit_test.py
T
wandering1 a2f5d1397a 主机单测:新增卷锁与时间同步两套用例(33+80 项)并登记钩子
- vol_lock(App/fs/vol_lock.c):33 用例。核心不变量是 fail-open——
  互斥量创建失败时 vol_lock_wait() 必须返回 1 且绝不阻塞,因为调用者
  defaultTask 是看门狗喂狗点;板端该路径只在内存耗尽时才可能走到。
- time_sync(App/sync/time_sync.c):80 用例。本模块是 N-17 看门狗风险的
  全部逻辑贡献者,用例钉死分片喂狗节奏、监听退避、报文重组(半包/粘连/
  EOF/真错/预算耗尽/tick 回绕)、重听门控;用 longjmp 跳出 for(;;) 任务循环。
- 两套均为纯逻辑主机侧测试,MSVC 离线编译真实源文件(#include 纳入)。
- 新增钩子 vol-lock-unit-test、time-sync-unit-test(7f/7g)。
- 全量主机单测:watchdog 39 + sys_clock 100 + cfg_file 149 + phasor 57
  + adc_input 70 + vol_lock 33 + time_sync 80 = 528 项,全绿。
2026-10-10 18:03:31 +08:00

54 lines
2.3 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""卷锁(vol_lock)的主机侧单元测试运行器(L0.5,纯标准库)。
做什么:
用本机 MSVC 编译 test/host/vol_lock/vol_lock_test.c(它以 #include 纳入
**生产源文件** App/fs/vol_lock.c),在 PC 上离线跑创建/幂等/等待/超时/
**fail-open**/释放,失败即非 0 退出。零硬件、零烧录、毫秒级。
工具链探测 / INCLUDE-LIB 拼接 / 编译运行 / 退出码判定全部委托给通用 harness
`test/host/common/unit_test_harness.py`(本文件只做声明)。
为什么要主机侧单测(而不是只用板端套件):
本模块最要紧的语义是 **fail-open**——锁创建失败时 vol_lock_wait 必须返回 1
且**绝不阻塞**(defaultTask 是看门狗喂狗点,等锁 = 停喂 = IWDG 误复位)。
真机上 osMutexNew 失败几乎不可复现(需堆耗尽),板端套件无法构造;主机侧
一次钉死。幂等性 / 超时透传 / 未创建时 release 无害 同属纯状态逻辑。
用法(仓库根目录):
python test/host/vol_lock/run_unit_test.py
或统一用 .venv: & '.venv\\Scripts\\python.exe' test/host/vol_lock/run_unit_test.py
退出码:0=PASS / 1=测试失败 / 2=环境错误(找不到编译器 / 编译失败 / 无汇总行)。
设计依据:App/fs/vol_lock.h 文件头「使用约定(铁律)」;
创建日期:2026-10-10
"""
import os
import sys
HERE = os.path.dirname(os.path.abspath(__file__))
ROOT = os.path.dirname(os.path.dirname(os.path.dirname(HERE)))
# harness 位于 test/host/common/
sys.path.insert(0, os.path.join(ROOT, "test", "host", "common"))
from unit_test_harness import TestBuild, run_host_unit_test # noqa: E402
# 顺序敏感:stub 目录必须**先于**生产目录,才能覆盖 cmsis_os.h
# (真实头在 Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS_V2/,会拖入整套
# FreeRTOS)。vol_lock.h 用真实头(接口契约原汁);三个 osMutex* 由测试单元给强符号桩。
BUILD = TestBuild(
name="Volume Lock Tests",
src=os.path.join(HERE, "vol_lock_test.c"),
include_dirs=[
os.path.join(HERE, "stub"),
os.path.join(ROOT, "App", "fs"),
HERE,
],
summary_marker="=== Volume Lock Tests:",
)
if __name__ == "__main__":
sys.exit(run_host_unit_test(BUILD))