测试套件

改动任何 C 代码都要跑最小验证;改到哪一块,按表挑相关套件。所有套件都只用可观测轮询 (等日志里出现某一行),不用 sleep。

18 支套件(0.14.0 全绿) ​

套件断言数钉住什么
phase1-e2e.sh12阶段 1 独立客户端(与模块同一份协议层):握手 → 注册 → 注入 → 优雅关闭
phase2-e2e.sh60注入 nginx 原生 HTTP 链:方法/路径/头/体逐字节、return 与 proxy_pass、gzip、trailer、上传背压、写错误语义
phase3-websocket.sh27WebSocket 升级、双向裸字节(4 MiB 背压)、边缘 RST 收尾、裸 TCP 丢弃
phase3-multiworker.sh12多 worker:每 worker 一条隧道、connIndex、独立记账
phase3-heartbeat.sh15心跳判死、退避重连、隧道重建
phase4-stress.sh25并发压测、kill -9 worker 后自动重连、RSS/fd 稳态
phase4-writerr.sh / phase4-writerr-release.sh16 / 18写侧错误语义;连接与配额释放(读侧先发现的收尾)
phase5-backpressure.sh20接收侧背压第 1/2 层、入队即还连接级的可观测差异
phase4-stall.sh32第 3 层停滞淘汰、第 4 层预算淘汰、第 5 层拒新流与「长期不回落」
phase4-asan.sh31ASan 插桩(停滞那套按 29 项口径)
quick-align.sh19快速隧道 provisioning 与 cloudflared 的逐帧逐头对齐 + 8 条错误路径 + 超时
quick-e2e.sh16无凭据启动 → 申请 → 注册 → 注入 → cfd-quick-url → 多 worker / 互斥 / 韧性
multi-tunnel.sh28多隧道块、端口映射、多对一并发、失败隔离、纯端口歧义、多 worker、扁平兼容
remote-config.sh54远程配置下发(版本门、应答逐字节、内层 err、外层 502、END_STREAM 语义)+ 本地优先 + host_override + 混合模式
inject-source-addr.sh36注入来源地址:默认值、配 192.0.2.1、IPv6、realip 采纳、$server_addr 不变、多隧道继承
token-creds.sh38token 解析层(含用真 cloudflared 二进制逐 token 交叉核对接受/拒绝)
token-tunnel.sh29token 的端到端:两条写法都注册成功、坏 token fail-soft、多隧道两个账号

合计 400+ 条断言。

怎么跑 ​

bash
cd /root/DSH/nginx-cfd
source env/activate.sh

# 最小验证(改任何 C 代码)
NGX_MODULES_ONLY=1 ./build/nginx-build.sh && make -C nginx-src/nginx-1.26.3 modules
./build/phase2-e2e.sh 7878 18453 18090 19091
(cd phase1/cfd-tunnel && make test)

# 全套(一个入口跑完 18 支)
bash .scratch/merge/regress0140.sh

改到哪一块跑什么 ​

改动面至少跑
凭据 / token 解析token-creds.sh + token-tunnel.sh
注入器 / 头序列化phase2-e2e.sh + phase3-websocket.sh
背压phase5-backpressure.sh + phase4-stall.sh (+ phase4-asan.sh)
远程配置remote-config.sh
多隧道multi-tunnel.sh
快速隧道quick-align.sh + quick-e2e.sh
来源地址 / realipinject-source-addr.sh
内存安全phase4-asan.sh

交付物级复验 ​

每次交付都拿包内那份 .so 配 Debian 官方 nginx 再跑一遍端到端(60/60),证明「跑回归的那份 字节」就是「装进系统的那份字节」。命令见 交付物与指纹。

模块文档 · 对齐依据是 cloudflared 的源码与实测行为