Files
drouter/_dev
liuzhuohua 890b2b3fa6 test(smoke): 修容器冒烟的 13 条假红 —— 判据吃注释 / 路径拼错 / 结构位置错
冒烟脚本 1.0.7 就在报红,本轮首次真跑才看清:13 个失败里
**没有一条是真产品缺陷**,全是判据自身的问题。三类:

## 一、路径拼错:`/opt/douter`(少个 r)

第 13 节 4 条断言全往这个不存在的路径 grep。grep 会往 stderr 打
"No such file or directory",而 `2>&1` 把它收进了输出,于是:
- 「期望 0 次」那两条→ 错一次 == 期望值,**恒绿**
- 「期望包含 xxx」那两条 → 拿到的是报错不是内容,**恒假**

它们守的3 个 1.0.7 真缺陷于是「看起来早就修好了」。
修法:先加一条「helper 路径拼写正确」的前置断言,再谈内容。

## 二、`ck` 配 `grep -c`:数字里永远不含代码片段

第 12/13/14 节共 7 处。`grep -c` 只吐一个数字(如 `1`),
拿它去 `grep -qE 'def _vpn_env'` 匹配,**恒为假**。
而 `ckc` 只能问「恰好等于几」,「出现过没有」这个中间档没有函数。
新增 `ckg`:问「命中数 ≥1」,且非数字输出(grep 报错)判失败 ——
免得「查错了文件」又被读成「代码不在」。

## 三、判据在注释里命中

修好路径后暴露出来的:
- `sensitive=(d == '/etc/drouter')` 命中在 **11669 行的注释**里
  (那段正是在解释这个 bug 的来历)
- `'raw': d` 一处在 **3975 行注释**里,一处是**打印服务的 raw**
  (`{'cups':..., 'raw': dict(PRINT_DEFAULTS['raw'])}`),与 VPN 无关

改法:反向断言先 `grep -v` 剔注释;raw 那条用 awk 限在
`_vpn_status` 函数体内。这正是本轮在 t-107 里反复抓的同一个根因,
**同一个错在冒烟脚本里又犯了一遍**。

## 四、结构位置错:断言写在 trap 之前

「netavark 表已删除」这条断言原本在函数体末尾,而 cleanup 是
`trap cleanup EXIT` 触发的 —— 打印时容器还活着,表刚被 podman 重建,
**结构性必红**。断言移进 cleanup() 内。

连带发现:trap 在 `exit $fail` **之后**才跑,那时 $fail 已求值传给内核,
在 trap 里 `fail=$((fail+1))` 毫无作用。改用 RC_AT_EXIT 传递 + trap 里自己 exit。

## 顺带修正一条写错的需求

第 12 节原本断言三个守护「有不依赖 init 的拉起路径(Popen)」。
**这三个是oneshot 型 timer 守护**(timer 定时拉起、跑完即退),
压根不需要脱离 init 常驻;实测三个文件里Popen 均为 0。
那条断言每版必红 3 条 —— 于是有人会去改期望值「修绿」,那是把判据
迁就实现。改为验它自己的形态:有 __main__ 入口 + Popen=0。

冒烟:36/13 → **53/0**,SMOKE_EXIT=0,netavark 表确认已删。
2026-10-03 12:35:45 +08:00
..