test(network): unit tests for ticket codec + gossip wire types

Add #[cfg(test)] coverage for the join-link codec and gossip wire format:
PeerSpeakTicket Display/FromStr round-trip and — the real gap —
malformed-input rejection (empty / non-base64 / valid-base64-non-JSON all
return NetError::InvalidTicket, never panic, since users paste untrusted
text here); PeerState serde round-trip; and GossipMessage::Leave /
Announce + GossipPayload round-trips. Tests-only; no production change.

Implemented by Gemini (junior implementer), reviewed and verified by senior
(cargo build + clippy --all-targets + cargo test all green).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
2026-06-02 05:37:08 -04:00
co-authored by Claude Opus 4.8
parent f3e7b4fbca
commit 8f1ecb2a5e
2 changed files with 110 additions and 0 deletions
+50
View File
@@ -285,3 +285,53 @@ impl RoomState for IrohGossipState {
}
}
}
#[cfg(test)]
mod tests {
use super::*;
use crate::network::PeerState;
use iroh::SecretKey;
fn sample_peer_state() -> PeerState {
let secret = SecretKey::generate();
let public = secret.public();
let addr = iroh::EndpointAddr::from(public);
PeerState {
name: "TestPeerGossip".to_string(),
is_muted: true,
addr,
}
}
#[test]
fn test_gossip_message_leave_round_trip() {
let original = GossipMessage::Leave;
let serialized = serde_json::to_string(&original).unwrap();
let deserialized: GossipMessage = serde_json::from_str(&serialized).unwrap();
assert!(matches!(deserialized, GossipMessage::Leave));
}
#[test]
fn test_gossip_payload_announce_round_trip() {
let peer_state = sample_peer_state();
let author = peer_state.addr.id;
let payload = GossipPayload {
author,
msg: GossipMessage::Announce(peer_state.clone()),
};
let serialized = serde_json::to_string(&payload).unwrap();
let deserialized: GossipPayload = serde_json::from_str(&serialized).unwrap();
assert_eq!(deserialized.author, author);
match deserialized.msg {
GossipMessage::Announce(state) => {
assert_eq!(state, peer_state);
}
GossipMessage::Leave => {
panic!("Expected GossipMessage::Announce, got Leave");
}
}
}
}