Skip to content

[MERC-4] 补齐 transport error 即时失效单测与后端死亡恢复 E2E - #4

Merged
kugouming merged 1 commit into
mainfrom
agent/ai-brain/51e26b99824d
Sep 2, 2026
Merged

[MERC-4] 补齐 transport error 即时失效单测与后端死亡恢复 E2E#4
kugouming merged 1 commit into
mainfrom
agent/ai-brain/51e26b99824d

Conversation

@kugouming

Copy link
Copy Markdown
Contributor

背景

基于 MERC-3 review 结论补齐测试缺口(Multica issue: MERC-4)。

Architect 在 MERC-3 review 中确认主根因修复正确、可合并,但「已实现单测 + E2E 验证」只完成了一半:

  • 单测缺口:transport.on('error') → invalidateConnection(修复的「即时失效」卖点)完全没有测试覆盖;现有 pool 用例 mock 了 isConnected(),没有验证「真实 transport 进入 ERROR → isConnected() 翻转 → 池失效 → 新建」整链路。
  • E2E 缺口:没有任何集成/E2E 测试覆盖「后端挂掉 → 池恢复 → tools/list 重新拿到工具」的恢复链路。

本 PR 在 MERC-3 修复(commit f3f946e,PR #3)之上补齐这些测试。

改动

单测:tests/unit/pool/transport-error-invalidation.test.ts(5 用例)

覆盖 transport.on('error') → invalidateConnection 即时失效路径。使用真实 BaseTransport 子类(TestTransport),走真实状态机 handleError → state ERROR + isConnected() 翻转 + emit('error'),而非 mock isConnected() —— 可抓到 isConnectionHealthy 不再调用 isConnected()handleError 不再翻 ERROR 的回归。验证:connectionFailed 携带连接 id、死连接释放 maxConnections 槽位、下次 acquire 拿到不同 id 的新连接、幂等不重复失效。

E2E:tests/integration/backend-death-recovery.test.ts(2 用例,真实 stdio 子进程)

stdio 后端进程运行中退出(code 0)→ 池即时失效死连接 → 下次 tools/list 成功并经新连接返回相同 N 个工具(非 TRANSPORT_ERROR)。验证单槽池在连接死亡后释放槽位、不再复用死连接。

E2E:tests/integration/sse-reconnect-recovery.test.ts(2 用例,真实 HttpTransport

SSE 后端重连耗尽 → transport ERROR → 池失效连接 → SSE 恢复可达后下次 tools/list 经新连接成功;SSE 持续不可达时返回明确降级错误(连接创建超时),而非吐回死连接的陈旧响应。HttpTransportConnectionPool 为真实实例,仅 mock eventsource / node-fetch 两个网络原语以确定性驱动 SSE 连通性。

新增 mock MCP stdio 后端:tests/integration/fixtures/mock-stdio-server.js

验证

  • npm run typecheck / npm run lint / npm run format:check:通过
  • clean build 后 npm test947/947 通过(含 9 个 cli-mode 集成测试 9/9,build 后全绿)

说明

本 PR 在 MERC-3 修复(PR #3,commit f3f946e)之上追加测试 commit。若 PR #3 先合并入 main,本 PR 的 diff 将自动收敛为仅含新增测试。两 PR 可独立评审、不冲突。

Multica: MERC-4

基于 MERC-3 review 结论补齐测试缺口(MERC-4):

单测(tests/unit/pool/transport-error-invalidation.test.ts):
- 覆盖 transport.on('error') → invalidateConnection 即时失效路径
  (修复的卖点,此前完全没有测试覆盖)
- 使用真实 BaseTransport 子类(TestTransport),走真实状态机
  handleError → state ERROR + isConnected() 翻转 + emit('error'),
  而非 mock isConnected(),可抓到 isConnectionHealthy 不再调用
  isConnected() 或 handleError 不再翻 ERROR 的回归
- 验证:connectionFailed 携带连接 id、死连接释放 maxConnections 槽位、
  下次 acquire 拿到不同 id 的新连接、幂等不重复失效

E2E(tests/integration/backend-death-recovery.test.ts):
- stdio 后端进程运行中退出(code 0)→ 池失效死连接 → 下次
  tools/list 成功并经新连接返回相同 N 个工具(非 TRANSPORT_ERROR)
- 验证单槽池在连接死亡后释放槽位、不再复用死连接

E2E(tests/integration/sse-reconnect-recovery.test.ts):
- SSE 后端重连耗尽 → transport ERROR → 池失效连接 → SSE 恢复可达后
  下次 tools/list 经新连接成功;SSE 持续不可达时返回明确降级错误
  (连接创建超时),而非吐回死连接的陈旧响应

验证:npm run typecheck/lint/format:check 通过;clean build 后
npm test 全绿(947/947,含 cli-mode 集成测试 9/9)。
@kugouming
kugouming merged commit a716617 into main Sep 2, 2026
7 checks passed
@kugouming
kugouming deleted the agent/ai-brain/51e26b99824d branch September 3, 2026 01:29
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.

1 participant