Files
STM32F4-Base/Drivers/BSP/CH395F/ch395f_test.h
2026-07-22 11:14:22 +08:00

170 lines
6.0 KiB
C
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.
/*
* 模块名称CH395F Driver Test Suite
* 模块功能CH395F 驱动各功能模块的测试入口,分阶段组织测试用例,
* 覆盖 SPI 命令路径、协议栈配置、Socket 状态机、大文件传输、
* 边界条件、KeepAlive、PHY 链路恢复等,基于单连接 socket 模式
* 适用平台STM32F4 系列CH395F 以太网芯片)
* 作者:王建锋
* 创建日期2026-07-19
* 修改记录:
* 2026-07-22 全面重构为单连接模式,增加大文件传输、边界条件等测试
*
* === 测试阶段一览 ===
* Phase | 类型 | 描述
* ---------|--------------|-----------------------------------------------
* Phase 1 | 独立运行 | 寄存器读写 + SPI 命令路径验证
* Phase 2 | PC 配合 | TCP Client 收发 + 关闭重连
* Phase 3 | PC 配合 | UDP Server EchoHELLO + PING + 大包)
* Phase 4 | netTask | NET 层 TCP Echo单连接模式基础收发验证
* Phase 5 | netTask | NET 层大文件传输20KB+ 分块收发)
* Phase 6 | PC 配合 | DHCP 自动获取 IP
* Phase 7 | netTask | Select/Poll I/O 多路复用
* Phase 8 | netTask | 边界条件测试零长度、DMA 边界、缓冲溢出)
* Phase 9 | 需拔插网线 | PHY 链路恢复
* Phase 10 | netTask | KeepAlive 超时断开测试
*/
#ifndef __CH395F_TEST_H
#define __CH395F_TEST_H
#ifdef __cplusplus
extern "C" {
#endif
#include <stdint.h>
/*
* 阶段使能开关(取消注释即启用对应阶段)
* 注意一次仅启用一个阶段Phase 4/5/7/8 共享 netTask 循环,可同时启用)
* Phase 6 (DHCP) 会改变 IP必须独立运行
*/
//#define ENABLE_PHASE1_TESTS /* 寄存器读写 + SPI 命令路径 */
//#define ENABLE_PHASE2_TESTS /* TCP Client 收发 + 关闭重连 */
//#define ENABLE_PHASE3_TESTS /* UDP Server Echo */
#define ENABLE_PHASE4_TESTS /* NET 层 TCP Echo单连接基础收发 */
//#define ENABLE_PHASE5_TESTS /* NET 层大文件传输20KB+ 分块) */
//#define ENABLE_PHASE6_TESTS /* DHCP 自动获取 IP会改 IP独立运行 */
//#define ENABLE_PHASE7_TESTS /* Select/Poll I/O 多路复用 */
//#define ENABLE_PHASE8_TESTS /* 边界条件测试 */
//#define ENABLE_PHASE9_TESTS /* PHY 链路恢复测试 */
//#define ENABLE_PHASE10_TESTS /* KeepAlive 超时断开测试 */
/* 测试统计 */
typedef struct {
uint16_t total;
uint16_t passed;
uint16_t failed;
} test_stats_t;
extern test_stats_t g_test_stats;
#define TEST_CHECK(cond, fmt, ...) do { \
g_test_stats.total++; \
if (cond) { \
g_test_stats.passed++; \
DBG_INFO("[PASS] " fmt, ##__VA_ARGS__); \
} else { \
g_test_stats.failed++; \
DBG_ERROR("[FAIL] " fmt, ##__VA_ARGS__); \
} \
} while (0)
#define TEST_REPORT(name) do { \
DBG_INFO("=== %s: %d/%d PASSED (failed=%d) ===", \
name, g_test_stats.passed, g_test_stats.total, g_test_stats.failed); \
} while (0)
/*
* Phase 1: 底层寄存器测试
* 通过: 9 项全部打印 OK/SUCCESS/YES/0x00
* 失败: 任何一项 FAIL/ERROR/MISMATCH
*/
void ch395f_phase1_tests(void);
/*
* Phase 2: TCP Client 收发 + 关闭重连 ×3 轮
* 通过: 日志打印 3 轮 "PASS"
* 失败: 任何一轮打印 "FAIL" 或超时
* PC 端预启动:
* python test/ch395f_socket_test.py tcp_server --port 8081
*/
void ch395f_phase2_tests(void);
/*
* Phase 3: UDP Server Echo + PING + 大包
* 通过: 30/30 回显匹配
* 失败: 任何回显超时或丢包
* PC 端:
* python test/ch395f_socket_test.py udp_client --ip 192.168.1.100 --port 60000
*/
void ch395f_phase3_tests(void);
/*
* Phase 4: NET 层 TCP Echo单连接模式netTask 中运行)
* 验证 Socket 0 单连接生命周期LISTEN → ESTABLISHED → DISCONNECT → re-LISTEN
* 覆盖载荷64B、1460B(MSS)、4096B(缓冲满)、20KB(大文件分块)
* PC 端:
* python test/ch395f_socket_test.py tcp_client --ip 192.168.1.100 --port 8080
*/
void ch395f_phase4_tests(void);
/*
* Phase 5: NET 层大文件传输netTask 中运行)
* 验证超过 CH395F 内部缓冲区大小4KB的连续数据收发
* 覆盖载荷20480B(20KB)、65535B(64KBrecv_len上限)
* PC 端:
* python test/ch395f_socket_test.py tcp_file --ip 192.168.1.100 --port 8080 --size 20480
*/
void ch395f_phase5_init(void);
void ch395f_phase5_tests(void);
/*
* Phase 6: DHCP 自动获取 IP
* 通过: DHCP SUCCESS + IP 非零 + 广播宣告 + HELLO 回显
* 失败: DHCP timeout 或宣告/HELLO 失败
* 注意: 会改变 IP需独立运行
* PC 端:管理员权限
* python test/ch395f_socket_test.py dhcp_server --dhcp-iface 192.168.1.2 --ip 192.168.1.100
*/
void ch395f_phase6_tests(void);
/*
* Phase 7: Select/Poll I/O 多路复用netTask 中运行)
* 验证 net_select() 和 net_poll_events() 在单 socket 模式下正确工作
* PC 端:
* python test/ch395f_socket_test.py tcp_client --ip 192.168.1.100 --port 8080
*/
void ch395f_phase7_tests(void);
/*
* Phase 8: 边界条件测试netTask 中运行)
* 覆盖零长度收发、DMA 边界4095/4096/4097B、recv 缓冲区小于数据、
* 连续快速发送、多轮快速连接-断开循环
* PC 端:
* python test/ch395f_socket_test.py tcp_client --ip 192.168.1.100 --port 8080
*/
void ch395f_phase8_init(void);
void ch395f_phase8_tests(void);
/*
* Phase 9: PHY 链路恢复测试
* 通过拔插网线验证 PHY 断开检测和链路恢复后 socket 自动重新监听
* 需物理操作PC 端:
* python test/ch395f_socket_test.py tcp_client --ip 192.168.1.100 --port 8080
*/
void ch395f_phase9_tests(void);
/*
* Phase 10: TCP KeepAlive 超时断开测试
* 验证 KeepAlive 在空闲超时后触发断开并自动重新监听
* PC 端:连接后静置(不发数据),等待 KeepAlive 触发
* python test/ch395f_socket_test.py tcp_client --ip 192.168.1.100 --port 8080 --silent
*/
void ch395f_phase10_tests(void);
#ifdef __cplusplus
}
#endif
#endif /* __CH395F_TEST_H */