Files
HomeAgent/internal/plugins
JianFeeeee 125bf57cfa fix(test): 测试不再抢生产端口 :8080(internal/plugins 加载内置 webui 所致)
部署过程中反复出现「8080 被 plugins.test 占用」导致生产 WebUI 起不来。
追到底:internal/plugins 的集成测试会 pluginReg.Load(全部内置插件),
其中 webui 默认监听 :8080 —— **正是生产实例的端口**。

## 为什么这个 bug 特别难查

它不是测试失败,而是**测试与生产静默抢端口**:先到者胜,另一个 bind 失败。

  - 跑测试的人看到「测试随机失败」(其实是生产先占了)
  - 用生产的人看到「WebUI 随机死掉」(其实是测试先占了)
  - 两边现象互不相干,且各自单独重跑往往都过

叠加 webui 已有的「bind 失败必须显式报错」修复后,症状从「静默死亡」
变成「随机报错」,这反而让归属更容易看错 —— 我一开始也是先怀疑自己的
部署脚本,直到采样 /proc/<pid>/cwd 才确认是测试进程。

## 修法

集成测试在 Load 之前用既有的 SetListenOverride 把地址指到
127.0.0.1:0(内核分配空闲端口),并在 cleanup 还原。
测试因此拿到真实可用的 HTTP 服务,且与任何固定端口实例完全隔离。

- webui 新增 ListenOverride() 读取当前值,供调用方保存/还原
  (只有 setter 时无法在不破坏调用方状态的前提下做临时覆盖)。

## 验证

- 修复前:跑 ./internal/plugins/ 期间 8080 持续归 plugins.test(109/200 采样)
- 修复后:35 次采样全程 8080 归 homed,测试同时全绿
- 变异验证:移除 override 后立刻复现抢端口,判据有效

另记两个测试卫生问题(同一根源,已顺手清理泄漏进程):
测试会启动**真实插件进程**(/home/newqqagent/plugins/*/plugin.bin)。
kill 测试进程后这些子进程会残留。已全部清理,生产 23 插件恢复正常。
2026-09-26 13:49:59 +08:00
..
2026-07-21 21:07:37 +08:00