Skip to content

test(codex): 用例失败时也回收 fake app-server,防止孤儿进程 - #1582

Merged
deepcoldy merged 1 commit into
deepcoldy:masterfrom
xu4wang:fix/codex-rpc-test-leak
Sep 26, 2026
Merged

deepcoldy merged 1 commit into
deepcoldy:masterfrom
xu4wang:fix/codex-rpc-test-leak

Conversation

@xu4wang

@xu4wang xu4wang commented Sep 25, 2026

Copy link
Copy Markdown
Contributor

问题

test/codex-rpc-engine.test.ts 里的 fake app-server(test/fixtures/fake-codex-rpc-server.mjs)由 CodexRpcEngine 以 detached: true + unref() 拉起(src/codex-rpc-engine.ts),独立进程组,vitest 退出不会带走它,只有 engine.stop() 能回收。

而各用例都把 engine.stop() 写在最后一行(全文件仅 1 处用了 finally、没有 afterEach)——只要 stop() 之前有断言失败 / 抛错,fixture 就会以孤儿进程(ppid=1)长期存活并占着一个本地端口。实际机器上发现过一个这样的残留跑了 57 天。

改动

仅测试文件:makeEngine 把每个 engine 登记到集合里,afterEach 统一 stop() 后清空。stop() 幂等(已有用例覆盖),用例里原有的 engine.stop() 保持不动。

验证

在 requestUserInput 用例的 stop() 之前注入一条必失败断言做变异,跑完后数残留的 fixture 进程:

场景 结果 残留 fixture
原代码 + 变异 1 failed / 38 passed 1
本 PR + 变异 1 failed / 38 passed 0
本 PR(无变异) 39 passed 0

🤖 Generated with Claude Code

fake-codex-rpc-server 以 detached + unref 方式拉起,只有 engine.stop()
能杀掉它;而各用例都把 stop() 放在最后一行,断言先抛就执行不到,
fixture 会在 vitest 退出后以孤儿进程形式长期存活并占着端口
(本机实测一个这样的残留跑了 57 天)。

makeEngine 登记每个 engine,afterEach 统一 stop()(stop 幂等)。

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@deepcoldy

Copy link
Copy Markdown
Owner

你好 @xu4wang,感谢提交 PR!我们已为这个 PR 创建了飞书评审群,自动评审正在进行中。系统自动拉你入群时失败了,麻烦点击下面的一年有效链接自行加入评审群,后续评审意见和沟通都会在群里同步:

https://applink.larkoffice.com/client/chat/chatter/add_by_link?link_token=66dvb1c5-177b-45c5-9a52-b009a2cfa4c2

也可以在名单文档中核对/更新你的飞书信息:https://bytedance.larkoffice.com/wiki/WJ1nwWbtxi89erkNGNbcgkt9nUe

本条为自动流程发出,最终评审结论以维护者审阅为准,谢谢!

@deepcoldy
deepcoldy merged commit 597ffb1 into deepcoldy:master Sep 26, 2026
10 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants