Files
STM32F4-Base/test/host/iec104_serv/run_unit_test.py
T
wandering1 f754d59218 docs(测试说明): 按用途分六个子目录并同步全库引用
分层:流程与规范/ 单元测试/ 板级测试/ 专项验证/ 测试工具/ 测试数据/,
顶层只留新增的目录导航 README.md(归层判据 + 硬约束 + 本次处置记录)。

- 搬迁 28 个路径:测试数据三个目录 58 个文件为纯改名(R100,内容逐字节不变)
- 全库引用同步 124 个文件:AGENTS / docs 索引 / skills / 门禁注释 / scripts
- 门禁面:scripts/check_test_traceability.py 的 glob 改 rglob
  (分层后不递归扫描=追溯门禁直接瞎掉)
- scripts/rename_ref.py:收尾的 ℹ 提示在 GBK 代码页抛 UnicodeEncodeError,
  让进程以退出码 1 收场而改写其实已落盘(RC 与真实结果相反);改为把
  stdout/stderr reconfigure 成 UTF-8,与 check_doc_links.py 等同法
- docs/文档规范.md §1.1 补「子目录文件过多时再分一层」;§3.6 补 rename_ref
  搬整目录的两个实测坑:① 会改写目录内部文件的内容 ② 内部文件的 ../ 出链
  不补层级(本次 23 个被误改的证据文件已按 HEAD 原始字节逐字节还原)
- docs/README.md §6 改为与六个子目录一一对应,并补登原先漏登记的
  「启动日志原子性复验流程」一行
- .cubemx_survival_baseline.json:App/util/task_watchdog.c 的注释路径也随分层更新,
  该文件是存活审计的 watchdog-module 漂移锚点,按脚本自己的提示跑 --write 重建基线
  (实测重建后仅 watchdog-module 一条哈希变化)
- 铁律 4 例外(本次在任务树里改了单写者文件):AGENTS.md 与
  .pre-commit-config.yaml 只被 rename_ref 改写路径字面量(后者全在注释行),
  任务表块与钩子声明一字未动

验证:check_doc_links.py --sections-strict 覆盖全部 88 个改动 .md 全绿;
check_test_traceability.py 输出与主树逐行一致;196 个文本文件无 BOM、无新增
CR、无 U+FFFD、无行尾空白;陈旧引用面由主树 25 处降到 6 处(无新增断链)。
2026-10-30 07:16:07 +08:00

77 lines
3.8 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 -*-
"""IEC 104 上行服务生命周期(iec104_serv)主机侧纯逻辑单元测试运行器(纯标准库)。
做什么:
用本机 MSVC 编译 test/host/iec104_serv/iec104_serv_test.c(以 #include 纳入生产源
App/task/iec104_serv.c),离线驱动它的全部 static 辅助函数(**不跑 never-returning
的任务主循环**),验证监听建立与失败回收、网络代次一变就重建监听、accept 门控与
表项失效自愈、单连接 socket 的断线语义、连续短写判死、活性分频探活、协议掉回 IDLE
时丢弃重生,以及时钟桥接的两个溢出边界。
为什么要主机侧单测(而不是只用台架):
104 主站掉线重连是现场最常见故障形态,但台架无法按需制造"改 IP 时正好有连接"
"对端 FIN 与 RST 的区别""连续三次短写";这几条处理错的后果都是端口永久失联或
会话卡死,只能等主站侧超时才发现。判死用**连续**短写计数(成功即复位),写成累计
就会把偶发拥塞误判成断线;时钟桥接的 >4G 秒必须拒绝、未对时必须回哨兵而不是 0;
活性分频写错就成了每轮多一次系统调用或 TESTFR 迟迟不发。
桩的边界:iec104_link.h / iec104_pts.h / prot_set.h / sys_clock.h / sys_events.h /
task_watchdog.h / net_types.h 用真实头(iec104_state_t、cfg 的函数指针签名、
TASK_WD_IEC104=7、SYS_EVT_* 位值一改即编译期报错);链路层与 pts 层给假件——链路
协议本身有 test/host/iec104 的 97 条专测,本模块只管服务怎么活、怎么死、怎么重生;
socket 面给可控假件(连 socket 号、发送返回、错误码、代次、门控都能注入)。
用法(仓库根目录):
python test/host/iec104_serv/run_unit_test.py
退出码:0=PASS / 1=测试失败 / 2=环境错误。
设计依据:docs/子系统设计/*104* 设计文档、AGENTS.md 模块约定(单连接 socket 断开语义、
错误码经任务通知值回传)、docs/测试说明/单元测试/主机单测覆盖率口径.md §9
创建日期: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
def _header_dirs(base):
"""收集 base 下所有**真的放着 .h** 的目录。
104 服务要 include 的 iec104_serv.h / iec104_link.h / iec104_pts.h /
task_watchdog.h / sys_clock.h / sys_events.h / prot_set.h 散在 App 的多个
子目录里,逐个手写列表一定会漏(漏一个就是 C1083,而且报错落在被测源上,
很容易被误读成生产代码坏了)。这里按目录实际内容自动收集,多给几个 /I
对编译没有代价,却把"漏目录"这类脆错误消掉。
"""
dirs = []
for root, _sub, files in os.walk(base):
if any(f.endswith(".h") for f in files):
dirs.append(root)
return sorted(dirs)
BUILD = TestBuild(
name="IEC104 SERV Tests",
src=os.path.join(HERE, "iec104_serv_test.c"),
include_dirs=[
os.path.join(HERE, "stub"), # 必须先于真头目录(覆盖 net_socket.h 等)
] + _header_dirs(os.path.join(ROOT, "App")) +
# sys_clock.h 会拉 sd2506.h(Drivers/BSP/SD2506),BSP 的头也散在多个子目录里,
# 同样按实际内容收集。注意 stub 目录排在最前,桩依然优先于这些真头。
_header_dirs(os.path.join(ROOT, "Drivers", "BSP")) + [
os.path.join(ROOT, "Drivers", "BSP", "NET"),
HERE,
],
summary_marker="=== IEC104 SERV Tests:",
)
if __name__ == "__main__":
sys.exit(run_host_unit_test(BUILD))