diff --git a/src/socket/tcp.rs b/src/socket/tcp.rs index 5489517..5ebd25a 100644 --- a/src/socket/tcp.rs +++ b/src/socket/tcp.rs @@ -152,7 +152,7 @@ impl fmt::Display for State { } } -#[derive(Debug)] +#[derive(Debug, PartialEq)] struct Retransmit { resend_at: u64, delay: u64 @@ -1020,6 +1020,29 @@ mod test { (recv(&mut $socket, $time, |repr| assert_eq!(repr, $result))); } + macro_rules! sanity { + ($socket1:expr, $socket2:expr, retransmit: $retransmit:expr) => ({ + let (s1, s2) = ($socket1, $socket2); + assert_eq!(s1.state, s2.state, "state"); + assert_eq!(s1.listen_address, s2.listen_address, "listen_address"); + assert_eq!(s1.local_endpoint, s2.local_endpoint, "local_endpoint"); + assert_eq!(s1.remote_endpoint, s2.remote_endpoint, "remote_endpoint"); + assert_eq!(s1.local_seq_no, s2.local_seq_no, "local_seq_no"); + assert_eq!(s1.remote_seq_no, s2.remote_seq_no, "remote_seq_no"); + assert_eq!(s1.remote_last_seq, s2.remote_last_seq, "remote_last_seq"); + assert_eq!(s1.remote_last_ack, s2.remote_last_ack, "remote_last_ack"); + assert_eq!(s1.remote_win_len, s2.remote_win_len, "remote_win_len"); + if $retransmit { + assert_eq!(s1.retransmit, s2.retransmit, "retransmit"); + } else { + let retransmit = Retransmit { resend_at: 100, delay: 100 }; + assert_eq!(s1.retransmit, retransmit, "retransmit (delaying)"); + } + }); + ($socket1:expr, $socket2:expr) => + (sanity!($socket1, $socket2, retransmit: true)) + } + fn init_logger() { extern crate log; use std::boxed::Box; @@ -1086,6 +1109,25 @@ mod test { s } + #[test] + fn test_listen_sanity() { + let mut s = socket(); + s.listen(LOCAL_PORT).unwrap(); + sanity!(s, socket_listen()); + } + + #[test] + fn test_listen_syn() { + let mut s = socket_listen(); + send!(s, TcpRepr { + control: TcpControl::Syn, + seq_number: REMOTE_SEQ, + ack_number: None, + ..SEND_TEMPL + }); + sanity!(s, socket_syn_received()); + } + #[test] fn test_listen_syn_no_ack() { let mut s = socket_listen(); @@ -1127,6 +1169,7 @@ mod test { s.local_seq_no = LOCAL_SEQ; s.remote_seq_no = REMOTE_SEQ + 1; s.remote_last_seq = LOCAL_SEQ + 1; + s.remote_win_len = 256; s } @@ -1144,6 +1187,8 @@ mod test { ack_number: Some(LOCAL_SEQ + 1), ..SEND_TEMPL }); + assert_eq!(s.state, State::Established); + sanity!(s, socket_established()); } #[test] @@ -1227,12 +1272,9 @@ mod test { // =========================================================================================// fn socket_established() -> TcpSocket<'static> { let mut s = socket_syn_received(); - s.state = State::Established; + s.state = State::Established; s.local_seq_no = LOCAL_SEQ + 1; - s.remote_seq_no = REMOTE_SEQ + 1; - s.remote_last_seq = LOCAL_SEQ + 1; s.remote_last_ack = REMOTE_SEQ + 1; - s.remote_win_len = 128; s } @@ -1371,12 +1413,13 @@ mod test { ack_number: Some(LOCAL_SEQ + 1), ..SEND_TEMPL }); - assert_eq!(s.state, State::CloseWait); recv!(s, [TcpRepr { seq_number: LOCAL_SEQ + 1, ack_number: Some(REMOTE_SEQ + 1 + 1), ..RECV_TEMPL }]); + assert_eq!(s.state, State::CloseWait); + sanity!(s, socket_close_wait(), retransmit: false); } #[test] @@ -1427,6 +1470,7 @@ mod test { let mut s = socket_established(); s.close(); assert_eq!(s.state, State::FinWait1); + sanity!(s, socket_fin_wait_1()); } // =========================================================================================// @@ -1453,6 +1497,7 @@ mod test { ..SEND_TEMPL }); assert_eq!(s.state, State::FinWait2); + sanity!(&s, socket_fin_wait_2(), retransmit: false); } #[test] @@ -1471,6 +1516,7 @@ mod test { ..SEND_TEMPL }); assert_eq!(s.state, State::Closing); + sanity!(s, socket_closing()); } #[test] @@ -1500,6 +1546,7 @@ mod test { ..SEND_TEMPL }); assert_eq!(s.state, State::TimeWait); + sanity!(s, socket_time_wait(false)); } #[test] @@ -1534,6 +1581,7 @@ mod test { ..SEND_TEMPL }); assert_eq!(s.state, State::TimeWait); + sanity!(s, socket_time_wait(true)); } #[test] @@ -1612,6 +1660,7 @@ mod test { let mut s = socket_close_wait(); s.close(); assert_eq!(s.state, State::LastAck); + sanity!(s, socket_last_ack()); } // =========================================================================================//