4.9 KiB
4.9 KiB
テスト妥当性レビュー: protocol
- 評価: 概ね良い
確認範囲
- 対象は
crates/protocolと解釈した。 - 読んだ範囲:
crates/protocol/README.mdcrates/protocol/Cargo.tomlcrates/protocol/src/lib.rscrates/protocol/src/stream.rs
- 実行した検証:
cargo test -p protocol— pass。unit tests 38 件、doc tests 0 件。
現在のテストがよくカバーしていること
protocol crate の主責務である「Pod client/server 間の wire protocol 型」をかなり広く検証できている。特に以下は妥当。
Method/Eventの serde tag 形式を、serde_json::Valueまたは固定 JSON で確認している。Method::RunとSegment::{Text, Paste}の roundtrip がある。- 未知の
Segmentkind がSegment::Unknownに落ちる forward compatibility 要件を直接テストしている。 Notify,PodEvent, completion, snapshot, status, compaction, tool result, LLM retry/continuation など、最近の運用上重要そうな wire shape が個別に押さえられている。Snapshotの legacy default (status,context_window,context_tokens) を確認しており、互換性テストとして価値がある。PodEvent::should_notify_agent()のような単なる serde ではない分類 invariant もテストされている。
この crate はロジックが薄く、ほぼ protocol schema の authority なので、現在のテストの中心が serde shape / roundtrip になっていること自体は適切。
不足 / 疑問のあるテスト
src/stream.rsのJsonLineReader/JsonLineWriterにテストがない。JSONL reader/writer はこの crate の README 上の「JSONL message boundary」に近い責務なので、空行 skip、EOF、invalid JSON のInvalidData、writer の newline/flush 相当は最低限押さえたい。Method/Eventの variant coverage は完全ではない。- 未確認の例:
Method::Cancel,ListRewindTargets,RewindTo,Shutdown;Event::TextDone,ToolCallStart,ToolCallArgsDelta,ToolCallDone,Usage,Shutdown,MemoryWorker,RewindTargets,RewindAppliedなど。 - protocol crate は variant 追加・rename の影響が大きいため、未テスト variant が増えると wire contract の退行を見逃しやすい。
- 未確認の例:
Segment::flatten_to_text()とMethod::run_text()が未テスト。特にflatten_to_text()は sigil 復元・貼り付け content・unknown placeholder という明確な仕様を持つので、serde よりも壊れやすい実装ロジックとしてテスト価値が高い。ScopeRule/Permissionの wire shape とrecursivedefault はScopeSubDelegated経由で一部触れているが、recursive省略時の default やPermissionの lowercase serde は直接確認されていない。- 一部テストは roundtrip のみで、期待 JSON 名や payload 値の確認が弱い。
- 例:
pod_discovery_methods_roundtrip()はRestorePod { name }/RegisterPeer { name }の値を assert していない。 - roundtrip だけだと、同一型内で serialize/deserialize が揃って壊れた場合に検出できないことがある。
- 例:
- 固定 JSON 文字列との完全一致テストが一部ある。wire format の固定には有効だが、serde の field order に依存するため、意図しない脆さもある。重要な canonical shape だけに絞り、他は
serde_json::Valueで意味を assert する現在の混合方針は概ね妥当。
追加提案
stream.rsに async unit tests を追加する。- writer が JSON +
\nを出す。 - reader が空行を skip して次の JSON を読む。
- EOF で
Ok(None)。 - invalid JSON が
io::ErrorKind::InvalidDataになる。 - writer → reader の小さな end-to-end roundtrip。
- writer が JSON +
Segment::flatten_to_text()の仕様テストを追加する。Text,Paste,FileRef,KnowledgeRef,WorkflowInvoke,Unknownを混ぜた順序保持。@,#,/の sigil 復元。
- 未カバーの control/event variant に、少なくとも代表的な pinned wire-shape テストを足す。
Cancel,Shutdown,RewindTo,ListRewindTargetsToolCall*,Usage,TextDone,RewindTargets,RewindApplied,MemoryWorker
- roundtrip だけのテストは、重要 payload を assert する。
RestorePod.nameRegisterPeer.namePodsListed/PodRestored/PeerRegisteredは現在 payload equality があるので良い。
ScopeRuleの default と permission rename を単体で確認する。{"target": "...", "permission": "read"}でrecursive == truePermission::Writeが"write"になる。
実行したコマンド
cd /home/hare/Projects/yoi && cargo test -p protocol
結果: pass。38 unit tests passed、0 failed。doc tests は 0 件。