test(net/udp): 加 240 轮定种子随机长跑 UDP-24,配套假件补可重排收包脚本(#73)
CI / 静态门禁 (pre-commit) (push) Failing after 45s
CI / 主机侧单测 (MSVC) (push) Failing after 44s
CI / 静态门禁 (pre-commit) (pull_request) Failing after 46s
CI / 主机侧单测 (MSVC) (pull_request) Failing after 44s

真机台架被断电和断线卡住,这一段只推进纯软件侧:把 UDP 数据面的随机序列
扫起来,并修掉随机长跑逼出的两条"测法自误"。

- ns_s7_udp.c 新增 UDP-24:固定种子 20261104 的 240 轮随机交互,每轮随机
  载荷长度 1~112(112 = 假件收包流 128 B 上限减 8 字节信息头)、源端口、
  源 IP、SERVER/CLIENT 形态、显式对端 sendto 与按记账对端 sendto,每 17 轮
  close + 重 bind 一次。断言收在六族不变量上(长度等于芯片宣布值、既不吞
  信息头也不丢真字节、源地址按形态分别取自表头/对端记账、udp_mode 与命令
  一致、close/重 bind 后出参槽与挂起槽不残留、每次 sendto 交给芯片恰好 len
  字节),并要求 ≥90% 轮次端到端干净(实测 240/240)。
- 长跑逼出的两处都是测法问题,不是被测码 bug,但只有长跑才逼得出:
  1) 连续 sendto 不注入 SENBUF_FREE 时,第二次发送会合法转挂起,而本套的
     挂起 send 替身从不完成,于是 FATAL 掐死整套件(连汇总行都没有)。改法
     照 440i/440j:set_sint_sticky(SENBUF_FREE) + push_glob + g_ns_int_pin_set=0,
     注释点名 TRAP-NET-04,背靠背发送的真机面留给 TC-NET-1609。
  2) 假件 ch395f_get_recv_len 是"按调用序号取、耗尽后重复最后一个"的脚本且
     容量有限,240 轮只追加不清空,序号撞满容量后每轮读到同一个陈旧长度
     (症状:len 在随机而 n 恒为 28,前 24 轮全绿,最容易误判成产品 bug)。
     补加法助手 ch395f_fake_reset_recv_len(sock),只归零该 sock 的脚本长度与
     序号,既有单轮用例不调用它、行为一字未变。
- 覆盖率口径第 4 轮同步:用例面记到 24 组、全套 654/654(改造前 470),
  新增一条"随机长跑逼出两条测法自误"的教训(长跑对假件的第一要求是
  状态可重排,不是能追加)。

验证:net_socket 套件 654/654 绿;全量覆盖率 47/47 退出码 0,net_udp.c
237/239 行 99.2%、14/14 函数,net_socket.c 966/969 行 99.7%、59/59 函数,
总行 8372/9290(90.1%),无 REGRESS;cppcheck(--hook-stage manual)退出码 0;
check_doc_links --all 通过(213 个文档,无法判定 0);pre-commit 对本批文件
全绿。基线 JSON 无变化(本轮只加测试,未动生产码),故不随本提交改动。
This commit is contained in:
2026-11-04 00:46:08 +08:00
parent fc0d3e4b5c
commit 9608b7a8ea
4 changed files with 221 additions and 1 deletions
+13
View File
@@ -169,6 +169,19 @@ void ch395f_fake_set_sint_sticky(uint8_t sock, uint8_t mask)
}
}
/* 重排本轮的"芯片收到 N 字节"脚本:把调用序号退回起点并清空旧值。
* 既有脚本语义是"按调用序号取、耗尽后重复最后一个"且容量有限;一条要跑
* 几百轮的随机化用例若每轮只追加不清空,序号会撞满容量,之后每轮读到的
* 都是同一个陈旧长度(UDP 队列化的 soak 用例就是这么踩到的)。
* 既有单轮用例不调用它,逐字节行为不变。 */
void ch395f_fake_reset_recv_len(uint8_t sock)
{
if (sock < CH395F_FAKE_SOCK_MAX) {
g_fake.recv_len_n[sock] = 0U;
g_fake.recv_len_i[sock] = 0U;
}
}
uint16_t ch395f_get_recv_len(uint8_t sock)
{
uint16_t v;
+3
View File
@@ -192,6 +192,9 @@ extern ch395f_fake_obs_t g_chip;
void ch395f_fake_reset(void); /* 全清并把所有 socket 设为"已关闭" */
void ch395f_fake_push_recv_len(uint8_t sock, uint16_t v);
/* 清空并重排该 sock 的收包长度脚本(长跑/多轮用例每轮开头调一次;
* 既有单轮用例不需要调,行为不变) */
void ch395f_fake_reset_recv_len(uint8_t sock);
void ch395f_fake_set_listening(uint8_t sock);
void ch395f_fake_set_peer(uint8_t sock, uint8_t b0, uint8_t b1, uint8_t b2,
uint8_t b3, uint16_t peer_port); /* 预置对端六元组 */ /* 缓存:open!=CLOSED 且 tcp=LISTEN */