Skip to content

Commit b488899

Browse files
author
unit-test-spec-leader
committed
docs(spec): F-Stack lib/ unit test framework spec generation
Spec-only phase deliverable for introducing CMocka 1.1.7 as F-Stack's unit test framework, scoped to the 11 host-side glue files in lib/Makefile FF_HOST_SRCS (KERN_SRCS kernel subset stays out-of-scope). Sub-agent team: arch-explorer / mock-strategist / target-prioritizer / spec-author / gate-keeper. Gate review PASS (BOUNCE 0/3, 16/16 cross-checks). Documents (6 tracked, 1601 lines; plan.md local-only via .gitignore): 00-overview-and-glossary.md (133) scope + 12-term glossary 01-requirements-spec.md (159) FR-U / NFR-U / R-U / DP-U / G1-G4 02-current-architecture-and-targets.md (282) 11-file inventory + P0/P1/P2/P3 ROI tier + dependency matrices 04-cmocka-framework-and-impl.md (417) CMocka selection + tests/unit/ layout + Makefile draft + 11x4 mock strategy + fatal-fn wrap (rte_exit/rte_panic/etc) 06-test-cases-and-acceptance.md (344) TC-U-* matrix: P0+P1 = 57 cases (>=25 threshold per FR-U-6), coverage P0 >=80% line. 99-review-report.md (266) gate-keeper PASS report. Tier decision (DP-U-11): P0 ff_ini_parser.c + ff_log.c P1 ff_host_interface.c + ff_epoll.c + ff_config.c (handlers via ini entry) P2 ff_dpdk_if.c + ff_dpdk_pcap.c + ff_dpdk_kni.c + ff_init.c + ff_thread.c P3 ff_memory.c (FF_USE_PAGE_ARRAY off by default) CMocka 1.1.7 verified ready (libcmocka{,-devel}-1.1.7-4.tl4 / demo 2/2 PASS). Workspace mandate honored: 0 direct rm/kill/chmod throughout spec phase. Local commit only; no push. Follow-up (FU-U-1..7) covers tests/unit/ skeleton, P0/P1/P2 case landing, CI integration, coverage reporting, and English translation post-audit.
1 parent 4f58fd6 commit b488899

7 files changed

Lines changed: 1604 additions & 0 deletions

.gitignore

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,3 +50,6 @@ plan.md
5050
app/nginx-1.28.0/Makefile
5151
app/nginx-1.28.0/dist/
5252
app/nginx-1.28.0/objs/
53+
54+
# AI agent local spec backup mirrors (per unit_test_spec plan.md §6)
55+
.spec-backup/
Lines changed: 133 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,133 @@
1+
# 00 — 项目总览与术语表
2+
3+
> 文档版本:v0.1(2026-06-09 17:45 UTC+8)
4+
> Author:spec-author(基于 Phase 2 三路调研材料起草)
5+
> 适用范围:F-Stack v1.26(FreeBSD 15.0 移植 + DPDK 24.11.6 LTS)lib/ 目录胶水代码(FF_HOST_SRCS)的 CMocka 单元测试框架
6+
7+
---
8+
9+
## 1. 项目背景
10+
11+
F-Stack 是一个 user-space TCP/IP 协议栈,将 FreeBSD 网络栈移植到 user-space 并基于 DPDK 提供高性能数据面能力。截至 2026-06-09,F-Stack 已完成两次大型升级(FreeBSD 13.0 → 15.0 + DPDK 23.11.5 → 24.11.6 LTS),但**始终缺乏单元测试框架**
12+
13+
- `f-stack/` 仓库根目录无 `tests/` / `test/`
14+
- `lib/*.c` 中无 `#ifdef TEST` / `#ifdef UNITTEST` 守卫
15+
- 现有的运行时验证依赖:(a) helloworld primary 起栈 + curl smoke、(b) nginx_fstack 多 worker 烟测、(c) phase-5b perf 矩阵
16+
- 这些是**集成测试**,覆盖 lib 层 glue 代码的纯函数 / 字符串处理 / 协议解析等"小逻辑"成本极高
17+
18+
→ 本项目首次为 F-Stack lib 层引入**真正的单元测试**(基于 CMocka 1.1.7),从最易切入的胶水代码开始,逐步建立可持续演进的测试体系。
19+
20+
## 2. 项目目标
21+
22+
| ID | 目标 | 阶段 |
23+
|---|---|---|
24+
| **G-A** | 为 F-Stack lib/ host 侧胶水代码(FF_HOST_SRCS 11 文件)建立 **CMocka 单元测试框架 spec** | **本任务(spec 阶段)**|
25+
| **G-B** | 阶段二:搭建 `tests/unit/` 工程骨架 + 第一个 hello-world test | 后续 |
26+
| **G-C** | 阶段三:P0 用例落地(`ff_ini_parser.c` + `ff_log.c`| 后续 |
27+
| **G-D** | 阶段四:P1 扩展(`ff_host_interface.c` + `ff_epoll.c` + `ff_config.c` 端到端)| 后续 |
28+
| **G-E** | 阶段五:P2 follow-up(DPDK 重依赖文件)+ CI 集成 + 覆盖率守门 | 后续 |
29+
30+
**本任务范围 = 仅 G-A**,产出 7 篇中文 spec 文档(含 plan + 6 spec),不写测试代码、不动 `lib/*.c`、不改 `lib/Makefile`
31+
32+
## 3. 范围(Scope / Out-of-Scope)
33+
34+
### 3.1 In-Scope
35+
36+
- ✅ FF_HOST_SRCS 罗列的 **11 个胶水代码文件**(详 02 §2)
37+
- ✅ CMocka 1.1.7 框架集成方案 spec
38+
-`tests/unit/` 目录结构 + Makefile 草案 spec
39+
- ✅ DPDK rte_* / pthread / epoll / printf 4 类外部依赖的 mock 策略矩阵
40+
- ✅ 第一批 P0 测试用例草案(TC-U-*
41+
- ✅ Unity → CMocka API 映射表(参考 `c-unittest-expert.mdc` 方法论)
42+
43+
### 3.2 Out-of-Scope
44+
45+
- ❌ KERN_SRCS(kernel 子集移植代码)单元测试 — 共 ~20 个 `ff_veth.c` / `ff_glue.c` / `ff_route.c` / `ff_kern_*.c` / `ff_subr_*.c` / `ff_syscall_wrapper.c` 文件,本质是 FreeBSD kernel 子集,host 端不直接编译,单测意义低且 mock 工作量爆炸
46+
- ❌ 集成测试(已由 helloworld + nginx + vlan-test 覆盖)
47+
- ❌ 性能测试(已由 phase-5b 矩阵覆盖)
48+
- ❌ 物理机环境测试(user 自行做)
49+
- ❌ CI 集成(DP-U-C1 留阶段五)
50+
- ❌ Mutation testing(DP-U-C2 留阶段五)
51+
- ❌ 英文版 spec(DP-U-2 决策为延迟到人工审计完成后)
52+
- ❌ 测试代码、Makefile 真正落地(属阶段二+ G-B)
53+
54+
## 4. 与既有体系的关系
55+
56+
### 4.1 与 docs/ 三层架构的关系
57+
58+
| 三层架构 doc | 本任务关系 |
59+
|---|---|
60+
| `docs/01-LAYER1-ARCHITECTURE.md` | 本任务的 11 文件全部属于 L1 列出的 `lib/ff_dpdk_*.c` + `lib/ff_config.c` + `lib/ff_*.c` 胶水层;spec 02 用 L1 文件路径作为 anchor 锚点 |
61+
| `docs/02-LAYER2-INTERFACES.md` | 本任务的"非 static 公开 API"清单与 L2 接口规约 1:1 对应;spec 02/06 引用 L2 函数签名 |
62+
| `docs/03-LAYER3-FUNCTIONS.md` | 本任务的 static helper / inih handler 清单与 L3 函数索引交叉验证 |
63+
64+
**spec 完成后,由 commit 阶段最小化追加 anchor 行**到 L1(与 dpdk-23-24 / vlan-test 同款模式),不在本 spec 阶段动 `docs/01-LAYER*.md`
65+
66+
### 4.2 与既有 spec 项目的关系
67+
68+
| 项目 | 时间 | 模式 | 沿用 |
69+
|---|---|---|---|
70+
| `freebsd_13_to_15_upgrade_spec/` | 2025-2026 | 9 篇完整模式 | 备份目录命名风格 / commit 模板 |
71+
| `dpdk_23_24_upgrade_spec/` | 2026-06-09 | **7 篇精简模式** | **本任务沿用** |
72+
| `unit_test_spec/` (本任务) | 2026-06-09 17:35 | 7 篇精简模式 ||
73+
74+
### 4.3 与 c-unittest-expert.mdc rule 的关系
75+
76+
`workspace/.codebuddy/rules/c-unittest-expert.mdc`**Unity-based** 中文方法论 rule,本任务**复用其方法论**(test 命名 / setup-teardown / 断言粒度 / 边界覆盖),但 **API 全部映射为 CMocka 形式**。spec 04 §3 给出 **Unity → CMocka API 映射表**(≥15 行)。
77+
78+
## 5. 术语表
79+
80+
| 术语 | 定义 |
81+
|---|---|
82+
| **CMocka** | 一个面向 C 语言的轻量级单元测试框架(v1.1.7 已通过 `dnf install libcmocka libcmocka-devel` 就位),主页 https://cmocka.org/,特性:内置 mock + setjmp 子进程隔离 + group fixture |
83+
| **FF_HOST_SRCS** | `lib/Makefile` 中定义的 host-side 源文件列表(line 272-291 + line 568-572),共 11 个 `.c` 文件,host 端直接编译,区别于 KERN_SRCS(FreeBSD 内核子集移植代码) |
84+
| **glue 代码 / 胶水代码** | F-Stack 中介于 user-space TCP/IP 栈与 DPDK PMD 之间的转换层代码,主要在 lib/ff_dpdk_*.c / lib/ff_config.c 等文件中,是本任务的测试目标 |
85+
| **mock** | 用 CMocka `__wrap_*` 链接器标志或 `mock()` 宏替换被测代码调用的外部函数,控制其返回值与参数验证 |
86+
| **fixture** | CMocka `cmocka_unit_test_setup_teardown` 中的 setup/teardown 闭包,用于在每个测试前后准备/清理资源(如临时 .ini 文件、伪 ff_global_cfg 等) |
87+
| **assertion** | CMocka 提供的 `assert_int_equal` / `assert_string_equal` / `assert_non_null` 等宏,验证被测代码的输出 |
88+
| **inih** | `ff_ini_parser.c` 内嵌的 BSD-licensed 第三方 INI parser(https://github.com/benhoyt/inih),F-Stack 配置文件解析的底层 |
89+
| **handler** | `ff_config.c` 中 11 个 `*_cfg_handler` 函数(全 static),是 inih `ini_handler` 协议下的 callback,用于 parse 每个 `[section] key=value` |
90+
| **P0/P1/P2/P3** | 测试优先级分层:P0=立即落地(最高 ROI)/ P1=第二批(高 ROI)/ P2=follow-up(中 ROI)/ P3=暂不测(低 ROI) |
91+
| **TC-U-x** | 单元测试用例 ID(unit test case),sphere 06 中编号 |
92+
| **FR-U-x** | 功能需求 ID(functional requirement, unit-test),spec 01 中编号 |
93+
| **NFR-U-x** | 非功能需求 ID,spec 01 中编号 |
94+
| **R-U-x** | 风险 ID,spec 01 中编号 |
95+
| **DP-U-x** | 决策点 ID(decision point),spec 01 + plan §4 中编号 |
96+
| **G1-G4** | 验收门禁(acceptance gate),spec 01 §8 中定义 |
97+
| **bounce** | gate-keeper 评审打回机制,上限 3 次(DP-U-8),≥4 写 ESCALATION-INFO.md |
98+
99+
## 6. 关键决策摘要(详细见 spec 01 §7)
100+
101+
| ID | 决策 | 取值 |
102+
|---|---|---|
103+
| DP-U-1 | 目录命名 | `docs/unit_test_spec/zh_cn/` |
104+
| DP-U-2 | 文档语言 | 中文(英文延迟)|
105+
| DP-U-3 | spec 篇数 | 7 篇精简(沿用 dpdk_23_24 模式)|
106+
| DP-U-4 | 测试框架 | CMocka 1.1.7 |
107+
| DP-U-6 | 测试目录 | `f-stack/tests/unit/` |
108+
| DP-U-7 | Build 系统 | 独立 GNU Makefile + pkg-config |
109+
| DP-U-11 | scope | FF_HOST_SRCS 11 文件;KERN_SRCS out-of-scope |
110+
| DP-U-12 (修订) | P0 | **`ff_ini_parser.c` + `ff_log.c`**(target-prioritizer Phase 2 调整后;原 plan 列 ff_config.c 因 handlers 全 static 改入 P1) |
111+
112+
## 7. 交付物清单(spec 阶段)
113+
114+
| # | 文件 | 行数预算 | 状态 |
115+
|---|---|---|---|
116+
| 1 | `plan.md` | 354 ✓ | local-only ✓ |
117+
| 2 | `00-overview-and-glossary.md`(本文)| ≤200 | 起草中 |
118+
| 3 | `01-requirements-spec.md` | ≤250 | 待写 |
119+
| 4 | `02-current-architecture-and-targets.md` | ≤450 | 待写 |
120+
| 5 | `04-cmocka-framework-and-impl.md` | ≤500 | 待写 |
121+
| 6 | `06-test-cases-and-acceptance.md` | ≤450 | 待写 |
122+
| 7 | `99-review-report.md` | ≤350 | 待写 |
123+
124+
## 8. 工作区强制规约(再次声明)
125+
126+
- 禁止直接 `rm/kill/chmod`;全部走 `/data/workspace/{rm_tmp_file,kill_process,chmod_modify}.sh`
127+
- 禁止猜测;所有 line 引用必须实测;reviewer cross-check ≥10 处
128+
- 中文 spec;英文延迟到人工审计完成后
129+
- local commit only;不 push
130+
131+
---
132+
133+
**文档结束(v0.1)**
Lines changed: 159 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,159 @@
1+
# 01 — 需求规格说明
2+
3+
> 文档版本:v0.1(2026-06-09 17:50 UTC+8)
4+
> Author:spec-author
5+
> 范围:F-Stack lib/ FF_HOST_SRCS 11 文件 CMocka 单元测试框架
6+
7+
---
8+
9+
## 1. 文档目的
10+
11+
本 spec 列出本任务(仅 spec 阶段)的:(1) 功能需求 FR-U-x;(2) 非功能需求 NFR-U-x;(3) 风险 R-U-x;(4) 决策 DP-U-x;(5) 验收门禁 G1-G4;(6) 启动条件。所有 ID 都被其余 spec 文档(02 / 04 / 06 / 99)引用。
12+
13+
---
14+
15+
## 2. 功能需求(FR-U-x)
16+
17+
### 2.1 spec 文档级(FR-U-1..3)
18+
19+
| ID | 描述 | 验收标准 |
20+
|---|---|---|
21+
| **FR-U-1** | 7 篇中文 spec 文档全部落盘到 `docs/unit_test_spec/zh_cn/` | `ls docs/unit_test_spec/zh_cn/*.md \| wc -l` ≥ 7(plan + 6 spec)|
22+
| **FR-U-2** | 6 篇 tracked spec 中每篇 line 引用全部实测准确 | gate-keeper 抽样 ≥10 处 cross-check 实测命中率 = 100% |
23+
| **FR-U-3** | spec 04 含 Unity → CMocka API 映射表,行数 ≥15 | grep `assert_int_equal\\|assert_string_equal` ≥15 行 |
24+
25+
### 2.2 测试范围级(FR-U-4..6)
26+
27+
| ID | 描述 | 验收标准 |
28+
|---|---|---|
29+
| **FR-U-4** | spec 02 含 FF_HOST_SRCS 11 文件全清单 + P0/P1/P2/P3 分层 | spec 02 §2 / §3 表格行数 11;分层合计 = 11 |
30+
| **FR-U-5** | spec 04 含 mock 策略矩阵:11 文件 × 4 依赖类型(rte/pthread/sys/printf)| spec 04 §7 表格 ≥11 × 4 = 44 cell 实测填充 |
31+
| **FR-U-6** | spec 06 含 P0/P1 文件的 TC-U-* 用例草案 | spec 06 §3 + §4 用例总数 ≥25;每 P0 文件 ≥10;每 P1 文件 ≥6 |
32+
33+
### 2.3 方法论级(FR-U-7..9)
34+
35+
| ID | 描述 | 验收标准 |
36+
|---|---|---|
37+
| **FR-U-7** | 测试用例命名遵循 `test_<func>_<scenario>` 风格(c-unittest-expert.mdc 方法论)| spec 06 抽样 5 例命名格式合规 |
38+
| **FR-U-8** | 边界覆盖至少包含:空输入 / 极端长度 / 非法字符 / NULL 指针 / 重复 key 5 类 | spec 06 §5 边界覆盖表 ≥5 行 |
39+
| **FR-U-9** | 致命函数处理(rte_exit / rte_panic / exit / abort)有显式 wrap 策略 | spec 04 §8 含 `__wrap_*` + `longjmp` / `mock_assert` 处理代码片段 |
40+
41+
---
42+
43+
## 3. 非功能需求(NFR-U-x)
44+
45+
### 3.1 质量属性(NFR-U-1..3)
46+
47+
| ID | 描述 | 阈值 |
48+
|---|---|---|
49+
| **NFR-U-1** | spec 文档 grounded 度 | 每篇 ≥80% 论述带 line 引用或代码片段,gate-keeper cross-check 抽样命中率 100% |
50+
| **NFR-U-2** | spec 间一致性 | 跨 5 篇 spec 的 line 号、术语、决策ID、风险ID、TC-ID 100% 一致 |
51+
| **NFR-U-3** | 行数预算遵守度 | 每篇 spec 实际行数在预算 ±20% 内(plan §0.2)|
52+
53+
### 3.2 测试体系质量(NFR-U-4..6,是阶段二+ 的 NFR,本阶段 spec 中描述)
54+
55+
| ID | 描述 | 阈值 |
56+
|---|---|---|
57+
| **NFR-U-4** | 单元测试可移植性 | 仅依赖 `pkg-config cmocka`,0 私有 patch;可在 TencentOS 4.4 + Ubuntu 22.04 + RHEL 9 上 ≥98% 用例 PASS |
58+
| **NFR-U-5** | 单测耗时 | P0 + P1 全套 < 30s(粗估,spec 04 §10 列具体 budget)|
59+
| **NFR-U-6** | 与 lib/ build 解耦度 | `tests/unit/` 独立 Makefile,**不改 `lib/Makefile` 一行****不依赖 lib/libfstack.a 整体链接**(避免拉入 FreeBSD kernel 子集)|
60+
61+
### 3.3 工程合规(NFR-U-7..8)
62+
63+
| ID | 描述 | 阈值 |
64+
|---|---|---|
65+
| **NFR-U-7** | 0 直接 rm/kill/chmod 调用 | 全 spec 阶段 commit / log 内检索 `rm[^_t]\\|^kill\\b\\|^chmod\\b` 命中数 = 0 |
66+
| **NFR-U-8** | local commit only | spec 阶段 1 commit;不 push;plan.md 按 .gitignore 不入库 |
67+
68+
---
69+
70+
## 4. 风险登记(R-U-x,已与 plan §5 同步)
71+
72+
> 等级:High = 项目级阻塞 / Mid = 阶段级阻塞 / Low = 微调风险
73+
74+
| ID | 风险 | 等级 | mitigation | 检测时机 |
75+
|---|---|---|---|---|
76+
| **R-U-1** | DPDK rte_* 大量 mock 工作量爆炸(ff_dpdk_if.c 173 个 rte_ 调用)| **High** | P2 留 follow-up;spec 04 §7 仅给"纯函数子集"mock 计划 | mock-strategist Phase 2 ✓ |
77+
| **R-U-2** | FreeBSD-host 编译差异 | Mid | spec 04 §6 列 host-only 编译矩阵;测试 Makefile 用 `uname -s` guard | spec 04 撰写时 |
78+
| **R-U-3** | CMocka 1.1.7 vs 1.1.5/1.1.0 API 差异 | Low | spec 04 §2 锁版本 ≥1.1.7;`pkg-config --modversion cmocka` 校验 | 阶段二落地时 |
79+
| **R-U-4** | DPDK 24.11.6 升级后 rte_* 函数签名变化 | Mid | spec 04 §7 mock 矩阵每条标注"DPDK 24.11.6 verified" | gate-keeper review |
80+
| **R-U-5** | ff_config.c 11 handler 全 static 不可直接测 | **High(已闭环)** | spec 06 §3.4 给"端到端 .ini fixture + `#include \"ff_config.c\"` 双策略";优先端到端 | target-prioritizer Phase 2 ✓ 已闭环 |
81+
| **R-U-6** | ff_ini_parser.c 是 BSD-licensed 第三方 inih 代码,单测意义有限 | Mid | spec 06 §3 显式标注"测 F-Stack 集成层封装 + inih 状态机覆盖";不重测 inih 内部 | spec 06 撰写时 |
82+
| **R-U-7** | mock-strategist 与 target-prioritizer 输出冲突 | Low | Phase 3 spec-author 起草时统一;gate-keeper Phase 4 cross-check | Phase 3-4 |
83+
| **R-U-8** | 测试可执行文件链接 libfstack.a 触发 FreeBSD kernel 子集编译爆炸 | **High** | spec 04 §5 明确"仅链接被测 .o + 必要 stub"策略;不链整个 libfstack.a | spec 04 撰写时 |
84+
| **R-U-9** | gate-keeper bounce ≥4 触发 escalation | Low | bounce 上限 = 3;≥4 写 ESCALATION-INFO.md | Phase 4 |
85+
| **R-U-10** | iwiki / 外网 F-Stack CMocka 资料稀缺 | Low | 显式标注 "no match";以 CMocka 官方 + Samba / libssh / DPDK app/test/ CMocka 实践为参考 | reviewer/spec-author |
86+
| **R-U-11** | 覆盖率工具与 CMocka flag 冲突 | Low | spec 04 §6 给 `-fprofile-arcs -ftest-coverage` 与 CMocka 兼容编译参数 | 阶段二落地时 |
87+
| **R-U-12** | 工作区强制规约违规(直接 rm/kill/chmod)| **零容忍** | 所有 spec 中 wrapper 调用显式标注;reviewer compliance gate | 全过程 |
88+
| **R-U-13** | rte_exit / rte_panic 不 wrap 导致单测进程被杀(**新增**| **High** | spec 04 §8 强制 `__wrap_rte_exit` + `__wrap_rte_panic` + `mock_assert(false)` 替换 | mock-strategist Phase 2 ✓ |
89+
| **R-U-14** | ff_log_open_set / ff_log_close 依赖 `ff_global_cfg` 全局变量(**新增**| Mid | spec 06 §3.2 给 ff_global_cfg fixture 模板 | spec 06 撰写时 |
90+
91+
---
92+
93+
## 5. 决策点(DP-U-x,与 plan §4 同步)
94+
95+
### 5.1 已决策(spec 阶段不再讨论)
96+
97+
| ID | 决策 | 取值 | 来源 |
98+
|---|---|---|---|
99+
| **DP-U-1** | 目录命名 | `docs/unit_test_spec/zh_cn/` | 用户对话明确 |
100+
| **DP-U-2** | 文档语言 | 中文(英文延迟)| 用户原始需求 |
101+
| **DP-U-3** | spec 篇数 | 7 篇精简 | plan_create |
102+
| **DP-U-4** | 测试框架 | CMocka 1.1.7(已就位)| 用户决策 |
103+
| **DP-U-5** | 方法论参考 | `c-unittest-expert.mdc` Unity-based 但 API 映射 CMocka | 用户原始需求 §6 |
104+
| **DP-U-6** | 测试目录 | `f-stack/tests/unit/` | GNU 项目惯例 |
105+
| **DP-U-7** | Build 系统 | 独立 GNU Makefile + pkg-config | 与 lib/Makefile 风格一致 |
106+
| **DP-U-8** | Bounce 上限 | 3 | 与 vlan-test / dpdk-23-24 一致 |
107+
| **DP-U-9** | KG 处理 | reviewer 直接 query MCP,不 reindex | spec 阶段不改代码 |
108+
| **DP-U-10** | 备份目录 | `f-stack/.spec-backup/unit-test-spec/` | 仓库内本地 backup(详 plan §6)|
109+
| **DP-U-11** | scope | FF_HOST_SRCS 11 文件;KERN_SRCS out-of-scope | §1.2 实测 |
110+
111+
### 5.2 在 Phase 2 调研后闭环的(DP-U-Bx)
112+
113+
| ID | 决策 | 取值 | 闭环来源 |
114+
|---|---|---|---|
115+
| **DP-U-B1** | P1 范围 | `ff_host_interface.c` + `ff_epoll.c` + `ff_config.c`(端到端)| target-prioritizer Phase 2 |
116+
| **DP-U-B2** | `ff_dpdk_kni.c` 优先级 | **P2**(极高 mock 复杂度,仅可拆纯函数测)| mock-strategist + target-prioritizer Phase 2 |
117+
| **DP-U-B3** | DPDK rte_* mock 边界 | CMocka `__wrap_*` 链接器替换;致命函数(rte_exit/panic)用 mock_assert 替换;非致命纯函数(rte_eal_process_type 等)用 will_return | mock-strategist Phase 2 |
118+
| **DP-U-B4** | 覆盖率工具 P0 阶段是否接入 | **不接入**(仅 spec 列 NFR 指标,阶段三才落地)| 简化 P0 起步 |
119+
| **DP-U-B5** | tests/unit/ 子目录划分 | 按 src 文件名(`tests/unit/test_ff_ini_parser.c` / `test_ff_log.c` 等)| 简化追踪 |
120+
| **DP-U-B6** | `make test` / `make check` 标准 target | spec 04 §6 提供 `make test`(默认)+ `make check`(含 valgrind)| GNU 风格 |
121+
| **DP-U-B7** | TC-U-* 用例数下限 | 每 P0 文件 ≥10;每 P1 文件 ≥6(FR-U-6) | spec 06 |
122+
| **DP-U-B8 (新增)** | P0 重新选定 | **`ff_ini_parser.c` + `ff_log.c`** | target-prioritizer 调整:原 plan §1.1 列 `ff_config.c parser handlers 子集` 因全 static 不可直接测,改入 P1 端到端 |
123+
124+
### 5.3 留作阶段二/三决策(spec 阶段不闭环)
125+
126+
| ID | 决策 | 时机 |
127+
|---|---|---|
128+
| **DP-U-C1** | CI 集成(GitHub Actions / 公司内部 CI)| 阶段五 |
129+
| **DP-U-C2** | Mutation testing(mutpy / mull)| 阶段五 |
130+
| **DP-U-C3** | nginx_fstack / helloworld 集成测试扩展 | 阶段五 |
131+
| **DP-U-C4** | ff_dpdk_if.c 纯函数子集测试落地(4 个候选:`ff_rss_check` / `ff_rss_tbl_get_portrange` / `ff_in_pcbladdr` / `ff_get_tsc_ns`| 阶段五 |
132+
133+
---
134+
135+
## 6. 验收门禁(Gx,与 plan §3.4 同步)
136+
137+
| Gate | 检查 | PASS 条件 |
138+
|---|---|---|
139+
| **G1 spec 落盘** | `ls docs/unit_test_spec/zh_cn/` ≥ 7 markdown 文件 | 7 篇全部存在 + 行数在预算 ±20% |
140+
| **G2 cross-check** | gate-keeper 抽样 ≥10 处 line 引用实测 | 命中率 = 100% |
141+
| **G3 4 维评分** | 一致性 / 完整性 / 风险覆盖度 / 可执行性 4 维评 | 全 ≥A(4 分制)|
142+
| **G4 compliance** | grep `^rm \\|^kill \\|^chmod ` 直接调用 | 整个 spec 阶段 commit / log = 0 命中 |
143+
144+
---
145+
146+
## 7. 启动条件(spec 阶段已满足)
147+
148+
| 条件 | 状态 |
149+
|---|---|
150+
| ✅ CMocka 1.1.7 已通过 dnf 安装 | 上对话确认 |
151+
| ✅ workspace skill 全就位(c-unittest-expert.mdc / spec-driven / harness-engineering-orchestrator)| 已 grep |
152+
| ✅ KG 已就位(`.gitnexus/`| 已 ls |
153+
| ✅ docs 三层架构 + 既有 spec 模板就位 | 已 ls |
154+
| ✅ git working tree clean | 已 git status |
155+
| ✅ 工作区 wrapper 脚本可用 | 已 ls -l |
156+
157+
---
158+
159+
**文档结束(v0.1)**

0 commit comments

Comments
 (0)