# DataRouter 单元测试用例文档 ## 测试环境 | 项目 | 内容 | |------|------| | 语言标准 | C11 | | 编译器 | GCC 11.4.0 | | 测试框架 | 自定义轻量框架(宏 + goto cleanup) | | 构建系统 | CMake ≥ 3.10 | | 发送能力 | `sensor` / `status` | | 接收能力 | `rtcm` / `command` | ## 运行方式 ```bash cmake -S . -B build cmake --build build ctest --test-dir build ./build/test_datarouter ``` ## 测试用例列表 ### 1. 未初始化(1 个) | # | 测试名 | 描述 | 步骤 | 预期 | |---|--------|------|------|------| | 1 | `error_uninit` | 未 init 时发送 | `send_sensor("d", 1)` | 返回 -1 | ### 2. 端口管理(4 个) | # | 测试名 | 描述 | 步骤 | 预期 | |---|--------|------|------|------| | 2 | `port_create_basic` | 基本创建 | `port_create()` | 返回 ≥ 0 | | 3 | `port_create_max` | 满容量 64 | 循环创建到满再尝试 | 64 个成功,第 65 个 INVALID | | 4 | `port_delete_invalid` | 删除无效 ID | `delete(-1)` + `delete(999)` | 不崩溃 | | 5 | `port_default_state` | 默认状态 | 新建端口,查 send_type / handler count | `send_type=-1`, `count=0` | ### 3. send_type 与 handler(3 个) | # | 测试名 | 描述 | 步骤 | 预期 | |---|--------|------|------|------| | 6 | `send_type_set_get` | 设置并清除 send_type | `set_send_type(sensor)` → `get` → `set(-1)` → `get` | sensor → -1 | | 7 | `handler_add_remove` | 添加后移除 handler | add(h) count=1 → remove(h) count=0 | count 正确 | | 8 | `handler_clear` | 清除全部 handler | add → clear | count == 0 | ### 4. 发送 — 自动广播(11 个) | # | 测试名 | 描述 | 步骤 | 预期 | |---|--------|------|------|------| | 9 | `send_no_match_port` | 无匹配端口 | 不创建任何端口,直接 `send_sensor` | 返回 -2 | | 10 | `send_one_port_one_handler` | 单端口单 handler | 创建端口中 send_type + add(h) → send | 返回 0;handler 1 次 | | 11 | `send_one_port_multi_handler` | 单端口双 handler | add(h) + add(h2) → send | handler 2 次 | | 12 | `send_multi_ports_same_type` | 两端口同类型 | p1(sensor,h) + p2(sensor,h) → send | handler 2 次,各端口一次 | | 13 | `send_multi_port_multi_handler` | 多端口多 handler | p1(h,h2) + p2(h3) → send | handler 3 次 | | 14 | `send_type_filter` | 类型过滤 | p1(sensor,h) + p2(status,h) → `send_sensor` | 只触发 p1 | | 15 | `send_after_remove_handler` | 移除 handler 后 | add(h) → send count=1 → remove(h) → send | 第二次返回 -2 | | 16 | `send_after_delete_port` | 删除端口后 | 创建→设好→删除→send | 返回 -2 | | 17 | `send_zero_length` | 零长度数据 | send("x", 0) | 返回 0;handler 被调 | | 18 | `send_null_data` | NULL 数据 | send(NULL, 0) | 返回 0;handler 被调 | | 19 | `send_multi_cap` | 多能力独立 | p1(sensor) + p2(status) → 分别 send_sensor + send_status | 各触发匹配的端口 | ### 5. 接收回调(1 个) | # | 测试名 | 描述 | 步骤 | 预期 | |---|--------|------|------|------| | 20 | `recv_callback` | 用户实现接收回调 | `on_recv_rtcm(0, "d", 1)` | 回调被触发 | ### 6. 能力元数据(2 个) | # | 测试名 | 描述 | 步骤 | 预期 | |---|--------|------|------|------| | 21 | `send_cap_meta` | 发送能力元数据 | count / name / desc / 边界 | SEND 两组正确 | | 22 | `recv_cap_meta` | 接收能力元数据 | count / name / desc / 边界 | RECV 两组正确 | ## 覆盖矩阵 | 功能模块 | 用例数 | 主要验证点 | |----------|:------:|------------| | 未初始化 | 1 | send → -1 | | 端口管理 | 4 | 创建/满容量/删除异常/默认状态 | | send_type & handler | 3 | 设置/清除/添加/移除/清空 | | 发送自动广播 | 11 | 无匹配/单播/多 handler 单端口/多端口同类型/多端口多 handler/类型过滤/移除后/删除后/零长/NULL/多能力独立 | | 接收回调 | 1 | 用户实现覆盖弱符号 | | 能力元数据 | 2 | SEND 与 RECV 两组独立查询 | **总计:22 个测试用例**