test(host): 断言字面量统一纯 ASCII,30 文件 1535 行
用户裁定「统一」。口径就是 AGENTS 铁律:字符串字面量必须纯 ASCII (无 BOM 文件里奇数个汉字会吞掉结束引号,偶数才侥幸通过),中文只写注释。 四名队友按目录分四组并行、写范围互斥:net_socket 418 行(6 文件)、 console_log/sys_log_mcu/soe_store/cfg_file_store_mcu 268 行(4 文件)、 11 个存量套件 404 行 + adc_input 89 行、iec104 与 lftpd 与 NET 四套等 356 行 (9 文件)。runner 的 .py 文档串不在口径内(Python 源不经 ARMCC 代码页)。 两套口径必须分清:粗口径(按行切引号)普查 = 34 文件 / 1,552 行;严格口径 (状态机剥掉块/行注释与字符常量后再取字符串字面量)= 30 文件 / 1,535 行。 差值那 4 个文件的命中全在注释里(ns_peers.c、net_socket/stub/ns_rtos.h、 common/ch395f_fake.h、common/fatfs_fake.c)——按口径一处都不该改,改了等于 把中文从注释里搬走、正好违背口径。粗口径绝不能当交付判据,否则要么白改 注释、要么留下「这行为什么没改」的悬案。 Lead 独立终检(不采信自报)五条硬判据,结果 30 文件漂移 0:① 每文件 TC 号 集合与 HEAD 逐字相同 ② 断言宏调用点数不变 ③ 行数与 HEAD 完全相等(专抓 整文件回写把尾部含 main() 吃掉的截断,第 1 轮真发生过两次)④ 剥注释后代码区 非 ASCII 字符 = 0 ⑤ 字节卫生(BOM 与 HEAD 一致、无 CR、无 U+FFFD、单尾换行)。 另用「逐行把字面量整体替换成空串后与 HEAD 必须逐行相等」机械证明只改了字面量; 各套 --module 覆盖率与断言数逐字不变(net_socket 887/889·53/53、console_log 199/200·16/16、sys_log_mcu 324/326·13/13、adc_input 103/103、sys_clock 100/100) → 生产码零改动,基线不需重登。 闸拦下一处真实回归(我的验收器没抓到):ns_s6_edges.c 翻译时把一个上一轮 已整改成平实描述的编号又写回了 CHECK 标签。原因很清楚:「只改字面量」并不 等于「只改无害内容」,标签里完全可以带进未登记族的编号形态;而 Lead 的自动 验收器只比对了 TC 形 id 集合,未覆盖 L/E/N/S/TRAP 等族。教训:批量改标签的 守卫必须加一条「新串不得出现任何已登记前缀族之外的编号形态」,且结构不变式 只覆盖自己想到的维度时不能替代真闸。 Lead 自查另清掉 126 处写坏的反斜杠(JS→Python 转义层数翻倍,把 markdown 反引号写成反斜杠+反引号),恰好发生在记录这条教训的那一节里。 文档:docs/测试说明/主机单测覆盖率口径.md §9 新增「第 2 轮」小节(两套口径对照 表、五条终检判据、六条手法含「转换说明符序列必须逐位相同」取代「禁止裸 %」、 三条协作纪律含先改板再派工与临时文件带组前缀、后续项 3 条)+ 变更记录一行。 后续项(本轮不做):把剥注释词法扫描器收进 scripts 当门禁(需用户点头并先定 test/ 是否纳入 coding-standard);iec104 的简写编号归族(牵 id_registry, 不能顺手做);替换器加「编号形态白名单」校验。 gate: pre-commit run --all-files -> 39 hooks, 37 Passed; failed = mem-numbers + mem-budget(受管快照与本树 .map 的漂移,属第 1 轮生产码改动的遗留,非本批 增量)。本批只碰 test/host/**,不进 Keil 编译面也不进模拟器 CMake,**RAM/Flash 增量 = 0**;实测水位 RW_IRAM1 57.4%、RW_CCM 87.9%,均低于 92% 红线。 id-check 0 台账外新账(可判定 84.63% > 基线 82.6%);test-coverage 33/33 全绿; cppcheck / coding-standard / bsp-err / layer-deps / doc-links 全 Passed。 按仓内分支约定 --no-verify 提交,台账 --write 回填留待主工作树合并后。
This commit is contained in:
@@ -31,24 +31,24 @@ static void tc_300_poll_gates(void)
|
||||
/* 1) 未初始化:直接 0,连引脚都不该读 */
|
||||
reset_all();
|
||||
g_ns_pump = net_process_messages;
|
||||
CHECK(net_poll() == 0, "TC-NETSOCK-300a 未初始化 → 0 事件");
|
||||
CHECK(net_poll() == 0, "TC-NETSOCK-300a uninitialized -> 0 events");
|
||||
CHECK(g_ns_poll_calls == 0U && g_fxchip.glob_calls == 0,
|
||||
"TC-NETSOCK-300b 未初始化不得读 INT# 引脚、不得读全局中断(省 SPI)");
|
||||
"TC-NETSOCK-300b uninitialized must not read the INT# pin nor the global interrupt register (saves SPI)");
|
||||
|
||||
/* 2) 初始化了但 INT# 为高(无中断待处理):不读全局寄存器 */
|
||||
bring_up();
|
||||
g_ns_int_pin_set = 1;
|
||||
CHECK(net_poll() == 0, "TC-NETSOCK-300c INT# 高 → 0 事件");
|
||||
CHECK(net_poll() == 0, "TC-NETSOCK-300c INT# high -> 0 events");
|
||||
CHECK(g_fxchip.glob_calls == 0,
|
||||
"TC-NETSOCK-300d INT# 高时不得发全局中断读取(引脚轮询就是为省这一步)");
|
||||
"TC-NETSOCK-300d with INT# high no global interrupt read may be issued (pin polling exists to save that step)");
|
||||
|
||||
/* 3) INT# 低但全局状态为 0:读了全局一次,且不进 Socket 循环 */
|
||||
bring_up();
|
||||
g_ns_int_pin_set = 0;
|
||||
ch395f_fake_push_glob(0U);
|
||||
CHECK(net_poll() == 0, "TC-NETSOCK-300e 全局位全 0 → 0 事件");
|
||||
CHECK(net_poll() == 0, "TC-NETSOCK-300e all global bits clear -> 0 events");
|
||||
CHECK(g_fxchip.glob_calls == 1 && g_chip.int_status_calls == 0,
|
||||
"TC-NETSOCK-300f 全局只读一次,读到 0 立即收手(不逐个 Socket 扫)");
|
||||
"TC-NETSOCK-300f global register read exactly once and it stops on 0 (no per-socket sweep)");
|
||||
reset_all();
|
||||
}
|
||||
|
||||
@@ -63,7 +63,7 @@ static void tc_301_poll_only_gated_sockets(void)
|
||||
a = mk_established(NET_SOCK_STREAM);
|
||||
b = mk_established(NET_SOCK_STREAM);
|
||||
(void)mk_established(NET_SOCK_STREAM);
|
||||
CHECK(a == 0 && b == 1, "TC-NETSOCK-301a 前置:三个在用 fd");
|
||||
CHECK(a == 0 && b == 1, "TC-NETSOCK-301a precondition: three fds in use");
|
||||
|
||||
prime_sint_masks();
|
||||
g_ns_int_pin_set = 0;
|
||||
@@ -73,15 +73,15 @@ static void tc_301_poll_only_gated_sockets(void)
|
||||
|
||||
CHECK(g_fake.int_status[0] == (uint8_t)(0x01U << 0) &&
|
||||
g_fake.int_status[2] == (uint8_t)(0x01U << 2),
|
||||
"TC-NETSOCK-301b 未点亮的 Socket 0/2 挂起位图没被清(读即清=读过,没读=还在)");
|
||||
CHECK(g_fake.int_status[1] == 0U, "TC-NETSOCK-301c 点亮的 Socket 1 被读走(位图清零)");
|
||||
CHECK(g_chip.int_status_calls == 1, "TC-NETSOCK-301d 整轮只发了一次 SINT 读取");
|
||||
"TC-NETSOCK-301b pending bitmaps of unlit sockets 0/2 stay uncleared (read-clear means read, still there means not read)");
|
||||
CHECK(g_fake.int_status[1] == 0U, "TC-NETSOCK-301c the lit socket 1 got read (bitmap cleared)");
|
||||
CHECK(g_chip.int_status_calls == 1, "TC-NETSOCK-301d the whole round issued exactly one SINT read");
|
||||
/* 缓存刷新环是另一回事:它对所有在用 fd 都要刷(单一事实源 I1) */
|
||||
CHECK(g_fxchip.rst_poll_calls == 3,
|
||||
"TC-NETSOCK-301e 每轮对全部 3 个在用 fd 步进 sock_reset(IDLE 槽零 SPI)");
|
||||
"TC-NETSOCK-301e every round steps sock_reset for all 3 in-use fds (IDLE slots cost zero SPI)");
|
||||
(void)net_poll();
|
||||
CHECK(g_fxchip.rst_poll_calls == 6,
|
||||
"TC-NETSOCK-301f 再一轮再加 3 次:刷新环不受全局位门控(事件面与状态面分离)");
|
||||
"TC-NETSOCK-301f another round adds 3 more: the refresh loop is not gated by global bits (events vs state split)");
|
||||
reset_all();
|
||||
|
||||
/* 高位字节:Socket 4~7 的全局位在 bit8~bit11 */
|
||||
@@ -94,7 +94,7 @@ static void tc_301_poll_only_gated_sockets(void)
|
||||
ch395f_fake_push_glob((uint16_t)(1U << (4 + 4)));
|
||||
(void)net_poll();
|
||||
CHECK(g_fake.int_status[4] == 0U && g_fake.int_status[3] == (uint8_t)(0x01U << 3),
|
||||
"TC-NETSOCK-301g Socket4~7 用高位字节 bit(n+4)=bit8..11 定位(算错就永远收不到 4~7 的事件)");
|
||||
"TC-NETSOCK-301g sockets 4-7 are located in the high byte bit(n+4)=bit8..11 (a wrong shift never sees their events)");
|
||||
reset_all();
|
||||
}
|
||||
|
||||
@@ -121,33 +121,33 @@ static void tc_302_poll_event_dispatch(void)
|
||||
ch395f_fake_push_glob((uint16_t)(1U << (fd + 4)));
|
||||
|
||||
n = net_poll();
|
||||
CHECK(n == expect, "TC-NETSOCK-302a 事件计数按位型区分(SENBUF_FREE 是状态位不是事件)");
|
||||
CHECK(n == expect, "TC-NETSOCK-302a event counting distinguishes bit kinds (SENBUF_FREE is a state bit, not an event)");
|
||||
switch (bits[k]) {
|
||||
case CH395F_SINT_STAT_CONNECT:
|
||||
CHECK(g_peers.evt_connect_calls == 1, "TC-NETSOCK-302b CONNECT → handle_connect_event");
|
||||
CHECK(g_peers.evt_connect_calls == 1, "TC-NETSOCK-302b CONNECT -> handle_connect_event");
|
||||
break;
|
||||
case CH395F_SINT_STAT_DISCONNECT:
|
||||
CHECK(g_peers.evt_disconnect_calls == 1, "TC-NETSOCK-302c DISCONNECT → handle_disconnect_event");
|
||||
CHECK(g_peers.evt_disconnect_calls == 1, "TC-NETSOCK-302c DISCONNECT -> handle_disconnect_event");
|
||||
break;
|
||||
case CH395F_SINT_STAT_RECV_OK:
|
||||
CHECK(g_peers.evt_recv_calls == 1 && s_net_socks[fd].readable == 1U,
|
||||
"TC-NETSOCK-302d RECV_OK → handle_recv_event 置 readable 电平");
|
||||
"TC-NETSOCK-302d RECV_OK -> handle_recv_event sets the readable level");
|
||||
break;
|
||||
case CH395F_SINT_STAT_SEND_OK:
|
||||
CHECK(g_peers.evt_send_calls == 1, "TC-NETSOCK-302e SEND_OK → handle_send_event");
|
||||
CHECK(g_peers.evt_send_calls == 1, "TC-NETSOCK-302e SEND_OK -> handle_send_event");
|
||||
break;
|
||||
case CH395F_SINT_STAT_SOCK_TIMEOUT:
|
||||
CHECK(g_peers.evt_timeout_calls == 1, "TC-NETSOCK-302f TIMEOUT → handle_timeout_event");
|
||||
CHECK(g_peers.evt_timeout_calls == 1, "TC-NETSOCK-302f TIMEOUT -> handle_timeout_event");
|
||||
break;
|
||||
default:
|
||||
CHECK(s_net_socks[fd].send_ready == 1U && g_peers.evt_send_calls == 0,
|
||||
"TC-NETSOCK-302g SENBUF_FREE 只置 send_ready(不发事件、不误当 SEND_OK)");
|
||||
"TC-NETSOCK-302g SENBUF_FREE only sets send_ready (no event, never mistaken for SEND_OK)");
|
||||
break;
|
||||
}
|
||||
CHECK(g_peers.evt_connect_calls + g_peers.evt_disconnect_calls +
|
||||
g_peers.evt_recv_calls + g_peers.evt_send_calls +
|
||||
g_peers.evt_timeout_calls <= 1,
|
||||
"TC-NETSOCK-302h 一位进来只敲一个 handler(不串味)");
|
||||
"TC-NETSOCK-302h one incoming bit drives exactly one handler (no cross-talk)");
|
||||
}
|
||||
|
||||
/* 同一次 SINT 里多个位 → 多个 handler 都被叫到,事件数叠加 */
|
||||
@@ -157,9 +157,9 @@ static void tc_302_poll_event_dispatch(void)
|
||||
g_ns_int_pin_set = 0;
|
||||
g_fake.int_status[fd] = (uint8_t)(CH395F_SINT_STAT_RECV_OK | CH395F_SINT_STAT_DISCONNECT);
|
||||
ch395f_fake_push_glob((uint16_t)(1U << (fd + 4)));
|
||||
CHECK(net_poll() == 2, "TC-NETSOCK-302i 同批多事件位:各计一次(不吞后到的那位)");
|
||||
CHECK(net_poll() == 2, "TC-NETSOCK-302i multiple event bits in one batch: each counted (the later bit is not swallowed)");
|
||||
CHECK(g_peers.evt_recv_calls == 1 && g_peers.evt_disconnect_calls == 1,
|
||||
"TC-NETSOCK-302j 两位各归各的 handler");
|
||||
"TC-NETSOCK-302j two bits each reach their own handler");
|
||||
reset_all();
|
||||
}
|
||||
|
||||
@@ -172,7 +172,7 @@ static void tc_303_phy_feed(void)
|
||||
ch395f_fake_push_glob(CH395F_GINT_STAT_PHY_CHANGE);
|
||||
(void)net_poll();
|
||||
CHECK(g_fake.link_up == 0U && g_fake.link_change == 1U,
|
||||
"TC-NETSOCK-303 PHY_CHANGE → 驱动重读 PHY 并计一次链路变更(拔网线不再静默)");
|
||||
"TC-NETSOCK-303 PHY_CHANGE -> driver re-reads PHY and counts one link change (cable pull is no longer silent)");
|
||||
reset_all();
|
||||
}
|
||||
|
||||
@@ -183,34 +183,34 @@ static void tc_310_listener_armed(void)
|
||||
|
||||
reset_all();
|
||||
CHECK(net_listener_armed(-1) == 0 && net_listener_armed(NET_MAX_SOCKETS) == 0,
|
||||
"TC-NETSOCK-310a 越界 fd → 0(纯 RAM 读,不发 RPC)");
|
||||
CHECK(net_listener_armed(0) == 0, "TC-NETSOCK-310b 未分配的 fd → 0");
|
||||
"TC-NETSOCK-310a out of range fd -> 0 (pure RAM read, no RPC)");
|
||||
CHECK(net_listener_armed(0) == 0, "TC-NETSOCK-310b unallocated fd -> 0");
|
||||
|
||||
bring_up();
|
||||
fd = mk_established(NET_SOCK_STREAM);
|
||||
CHECK(net_listener_armed(fd) == 1,
|
||||
"TC-NETSOCK-310c ESTABLISHED(待 accept 电平)必须放行:i104 台架实证不放行则会话整场饿死");
|
||||
"TC-NETSOCK-310c ESTABLISHED (pending-accept level) must pass: i104 bench proved starvation without it");
|
||||
s_net_socks[fd].state = NET_SOCK_STATE_LISTENING;
|
||||
CHECK(net_listener_armed(fd) == 1,
|
||||
"TC-NETSOCK-310d LISTENING 放行:补 accept 探针在 net_accept_locked 内部,挡住永远到不了");
|
||||
"TC-NETSOCK-310d LISTENING must pass: the missed-accept probe lives inside net_accept_locked, blocking it never runs");
|
||||
|
||||
s_net_socks[fd].state = NET_SOCK_STATE_CLOSED;
|
||||
s_net_socks[fd].auto_relisten = 1U;
|
||||
s_net_socks[fd].local_port = 7003U;
|
||||
s_net_socks[fd].readable = 1U;
|
||||
CHECK(net_listener_armed(fd) == 1,
|
||||
"TC-NETSOCK-310e CLOSED+auto_relisten+有残留数据 → 放行(保住 closed-with-readable 接受)");
|
||||
"TC-NETSOCK-310e CLOSED plus auto_relisten plus leftover data -> pass (keeps closed-with-readable accept alive)");
|
||||
s_net_socks[fd].readable = 0U;
|
||||
CHECK(net_listener_armed(fd) == 0,
|
||||
"TC-NETSOCK-310f CLOSED 但无残留 → 必须挡下(否则整个 CLOSED 窗每轮发 RPC → 喂不上狗)");
|
||||
"TC-NETSOCK-310f CLOSED with no leftover must be blocked (else every round in that window sends an RPC and the watchdog starves)");
|
||||
s_net_socks[fd].readable = 1U;
|
||||
s_net_socks[fd].auto_relisten = 0U;
|
||||
CHECK(net_listener_armed(fd) == 0, "TC-NETSOCK-310g 非监听型 fd 的 CLOSED 不放行");
|
||||
CHECK(net_listener_armed(fd) == 0, "TC-NETSOCK-310g CLOSED on a non-listener fd does not pass");
|
||||
s_net_socks[fd].auto_relisten = 1U;
|
||||
s_net_socks[fd].local_port = 0U;
|
||||
CHECK(net_listener_armed(fd) == 0, "TC-NETSOCK-310h 还没绑端口的半成品监听不放行");
|
||||
CHECK(net_listener_armed(fd) == 0, "TC-NETSOCK-310h a half-built listener without a bound port does not pass");
|
||||
s_net_socks[fd].state = NET_SOCK_STATE_CONNECTING;
|
||||
CHECK(net_listener_armed(fd) == 0, "TC-NETSOCK-310i CONNECTING 不是监听态 → 0");
|
||||
CHECK(net_listener_armed(fd) == 0, "TC-NETSOCK-310i CONNECTING is not a listening state -> 0");
|
||||
reset_all();
|
||||
}
|
||||
|
||||
@@ -221,17 +221,17 @@ static void tc_311_can_read(void)
|
||||
|
||||
reset_all();
|
||||
CHECK(net_can_read(0) == 1,
|
||||
"TC-NETSOCK-311a 描述符失效 → 1:让 recv 去报 BADF,别把连接不存在藏住");
|
||||
"TC-NETSOCK-311a dead descriptor -> 1: let recv report BADF instead of hiding a missing connection");
|
||||
bring_up();
|
||||
fd = mk_established(NET_SOCK_STREAM);
|
||||
s_net_socks[fd].readable = 0U;
|
||||
CHECK(net_can_read(fd) == 0, "TC-NETSOCK-311b ESTABLISHED 且无可读 → 0");
|
||||
CHECK(net_can_read(fd) == 0, "TC-NETSOCK-311b ESTABLISHED with nothing readable -> 0");
|
||||
s_net_socks[fd].readable = 1U;
|
||||
CHECK(net_can_read(fd) == 1, "TC-NETSOCK-311c readable 置位 → 1");
|
||||
CHECK(net_can_read(fd) == 1, "TC-NETSOCK-311c readable set -> 1");
|
||||
s_net_socks[fd].state = NET_SOCK_STATE_CLOSED;
|
||||
s_net_socks[fd].readable = 0U;
|
||||
CHECK(net_can_read(fd) == 1,
|
||||
"TC-NETSOCK-311d 连接已非 ESTABLISHED → 必须放行一次 recv 取回 EOF/错误");
|
||||
"TC-NETSOCK-311d connection no longer ESTABLISHED -> recv must pass once to fetch EOF or the error");
|
||||
reset_all();
|
||||
}
|
||||
|
||||
@@ -244,23 +244,23 @@ static void tc_320_close_two_paths(void)
|
||||
bring_up();
|
||||
fd = mk_established(NET_SOCK_STREAM);
|
||||
g_fake.cached_open[fd] = CH395F_SOCKET_CLOSED;
|
||||
CHECK(net_close(fd) == 0, "TC-NETSOCK-320a close 成功(快路径)");
|
||||
CHECK(net_close(fd) == 0, "TC-NETSOCK-320a close succeeds (fast path)");
|
||||
CHECK(g_fxchip.cmd_done_calls >= 1 && g_fxchip.rst_begin_calls == 0,
|
||||
"TC-NETSOCK-320b 已 CLOSED → 跳过复位(省掉 100~600ms 的无占用)");
|
||||
"TC-NETSOCK-320b already CLOSED -> reset skipped (saves a pointless 100-600ms occupation)");
|
||||
CHECK(g_fxchip.sock_events_calls >= 1,
|
||||
"TC-NETSOCK-320c 快路径仍要清本 Socket 残留事件(防下一连接误判刚建立就断开)");
|
||||
CHECK(g_fxchip.glob_calls == 0, "TC-NETSOCK-320d 全程零全局读取(F-NET-7)");
|
||||
"TC-NETSOCK-320c the fast path still clears this socket leftover events (else the next connection sees a false immediate drop)");
|
||||
CHECK(g_fxchip.glob_calls == 0, "TC-NETSOCK-320d zero global reads throughout (F-NET-7)");
|
||||
reset_all();
|
||||
|
||||
/* 慢路径:芯片还 OPEN → 走 sock_reset,且必须是 GRACEFUL */
|
||||
bring_up();
|
||||
fd = mk_established(NET_SOCK_STREAM);
|
||||
g_fake.cached_open[fd] = CH395F_SOCKET_OPEN;
|
||||
CHECK(net_close(fd) == 0, "TC-NETSOCK-320e close 成功(慢路径)");
|
||||
CHECK(net_close(fd) == 0, "TC-NETSOCK-320e close succeeds (slow path)");
|
||||
CHECK(g_fxchip.rst_begin_calls == 1 && g_fx.rst_mode[fd] == 0U,
|
||||
"TC-NETSOCK-320f 慢路径用 GRACEFUL(正常释放 100ms 底),不是 QUARANTINE");
|
||||
"TC-NETSOCK-320f slow path uses GRACEFUL (100ms floor for a normal release), not QUARANTINE");
|
||||
CHECK(g_fx.rst_state[fd] == (uint8_t)CH395F_FAKE_RST_IDLE,
|
||||
"TC-NETSOCK-320g 复位机收口回 IDLE(槽位可复用,不搁浅)");
|
||||
"TC-NETSOCK-320g the reset machine ends back at IDLE (slot reusable, never stranded)");
|
||||
reset_all();
|
||||
|
||||
/* 复位启动被拒(槽位已在运行)→ close 仍放行,只留痕 */
|
||||
@@ -268,9 +268,9 @@ static void tc_320_close_two_paths(void)
|
||||
fd = mk_established(NET_SOCK_STREAM);
|
||||
g_fake.cached_open[fd] = CH395F_SOCKET_OPEN;
|
||||
g_fx.rst_state[fd] = (uint8_t)CH395F_FAKE_RST_DRAINED;
|
||||
CHECK(net_close(fd) == 0, "TC-NETSOCK-320h 复位启动失败也放行 close(不卡调用方)");
|
||||
CHECK(net_close(fd) == 0, "TC-NETSOCK-320h close still succeeds when starting the reset fails (do not block the caller)");
|
||||
CHECK(g_fxchip.rst_begin_reject == 1 && g_ns_error_count >= 1,
|
||||
"TC-NETSOCK-320i 复位没成必须 [ERR] 留痕,交 reconciler/pump 对账接管");
|
||||
"TC-NETSOCK-320i a failed reset must leave an [ERR] line for the reconciler/pump to take over");
|
||||
reset_all();
|
||||
}
|
||||
|
||||
@@ -286,19 +286,19 @@ static void tc_321_drop_conn_settle(void)
|
||||
s_net_socks[fd].lost_conn_seen = 3U;
|
||||
g_fake.cached_open[fd] = CH395F_SOCKET_OPEN;
|
||||
|
||||
CHECK(net_drop_conn(fd) == 0, "TC-NETSOCK-321a drop_conn 成功");
|
||||
CHECK(net_drop_conn(fd) == 0, "TC-NETSOCK-321a drop_conn succeeds");
|
||||
CHECK(g_fxchip.rst_begin_calls == 1 && g_fx.rst_mode[fd] == 1U,
|
||||
"TC-NETSOCK-321b 拆会话用 QUARANTINE 400ms 底(TRAP-NET-18 异常释放,与 close 分级)");
|
||||
"TC-NETSOCK-321b session drop uses QUARANTINE with a 400ms floor (TRAP-NET-18 abnormal release, graded against close)");
|
||||
CHECK(s_net_socks[fd].lost_conn_seen == 0U,
|
||||
"TC-NETSOCK-321c 新会话起点:事件未收到去抖计数清零(N-30)");
|
||||
"TC-NETSOCK-321c new session start: the missed-event debounce counter is cleared (N-30)");
|
||||
CHECK(s_net_socks[fd].local_port == 2404U && s_net_socks[fd].auto_relisten == 1U &&
|
||||
s_net_socks[fd].in_use == 1U,
|
||||
"TC-NETSOCK-321d 端口/监听属性/fd 全部保留:这就是拆连接不拆监听");
|
||||
"TC-NETSOCK-321d port, listener attribute and fd all survive: this is drop-the-connection-not-the-listener");
|
||||
CHECK(g_peers.listener_req_calls == 1 &&
|
||||
g_peers.last_req_reason == (int)NET_LISTENER_REQ_DROP,
|
||||
"TC-NETSOCK-321e 登记 REQ_DROP,重建动作在 net_listener_tick 一处");
|
||||
"TC-NETSOCK-321e registers REQ_DROP; the rebuild action lives only in net_listener_tick");
|
||||
CHECK(s_net_socks[fd].readable == 0U && s_net_socks[fd].state == NET_SOCK_STATE_CLOSED,
|
||||
"TC-NETSOCK-321f 收口会话簿记:清 readable + 转 CLOSED");
|
||||
"TC-NETSOCK-321f session bookkeeping closes out: clear readable and move to CLOSED");
|
||||
reset_all();
|
||||
}
|
||||
|
||||
@@ -317,18 +317,18 @@ static void tc_322_close_before_chip(void)
|
||||
g_ns_pump = NULL; /* 本场景不靠泵,直接看登记结果 */
|
||||
CHECK(net_recv_sock(&s_net_socks[fd], rxbuf, (int)sizeof(rxbuf), 0)
|
||||
== NET_PENDING_REGISTERED,
|
||||
"TC-NETSOCK-322p 前置:阻塞 recv 登记了挂起(返回哨兵)");
|
||||
"TC-NETSOCK-322p precondition: blocking recv registered a pending request (returns the sentinel)");
|
||||
ch395f_fake_clear_log();
|
||||
settle_at = g_peers.pending_settle_calls;
|
||||
close_at = g_chip.close_calls;
|
||||
|
||||
CHECK(net_close_sock(&s_net_socks[fd]) == 0, "TC-NETSOCK-322a netTask 直调 close 成功");
|
||||
CHECK(net_close_sock(&s_net_socks[fd]) == 0, "TC-NETSOCK-322a netTask-direct close succeeds");
|
||||
CHECK(g_peers.pending_settle_calls == settle_at + 1,
|
||||
"TC-NETSOCK-322b close 必先结算本 fd 的挂起 recv");
|
||||
"TC-NETSOCK-322b close must first settle this fd pending recv");
|
||||
CHECK(g_chip.close_calls > close_at || g_fxchip.rst_close_calls > 0,
|
||||
"TC-NETSOCK-322c 结算之后芯片侧才收到 CLOSE");
|
||||
"TC-NETSOCK-322c the chip only sees CLOSE after the settlement");
|
||||
CHECK(g_peers.pending_notified == 1,
|
||||
"TC-NETSOCK-322d 结算必通知(取消也要通知,不是静默清槽 → 否则等待方永久悬挂)");
|
||||
"TC-NETSOCK-322d settlement always notifies (cancel notifies too, else the waiter hangs forever)");
|
||||
reset_all();
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user