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:
@@ -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");
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user