Add lots of sanity checking to TCP test helpers.

This commit is contained in:
whitequark 2017-01-14 12:56:58 +00:00
parent a864157feb
commit c0697cf37d
1 changed files with 55 additions and 6 deletions

View File

@ -152,7 +152,7 @@ impl fmt::Display for State {
} }
} }
#[derive(Debug)] #[derive(Debug, PartialEq)]
struct Retransmit { struct Retransmit {
resend_at: u64, resend_at: u64,
delay: u64 delay: u64
@ -1020,6 +1020,29 @@ mod test {
(recv(&mut $socket, $time, |repr| assert_eq!(repr, $result))); (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() { fn init_logger() {
extern crate log; extern crate log;
use std::boxed::Box; use std::boxed::Box;
@ -1086,6 +1109,25 @@ mod test {
s 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] #[test]
fn test_listen_syn_no_ack() { fn test_listen_syn_no_ack() {
let mut s = socket_listen(); let mut s = socket_listen();
@ -1127,6 +1169,7 @@ mod test {
s.local_seq_no = LOCAL_SEQ; s.local_seq_no = LOCAL_SEQ;
s.remote_seq_no = REMOTE_SEQ + 1; s.remote_seq_no = REMOTE_SEQ + 1;
s.remote_last_seq = LOCAL_SEQ + 1; s.remote_last_seq = LOCAL_SEQ + 1;
s.remote_win_len = 256;
s s
} }
@ -1144,6 +1187,8 @@ mod test {
ack_number: Some(LOCAL_SEQ + 1), ack_number: Some(LOCAL_SEQ + 1),
..SEND_TEMPL ..SEND_TEMPL
}); });
assert_eq!(s.state, State::Established);
sanity!(s, socket_established());
} }
#[test] #[test]
@ -1227,12 +1272,9 @@ mod test {
// =========================================================================================// // =========================================================================================//
fn socket_established() -> TcpSocket<'static> { fn socket_established() -> TcpSocket<'static> {
let mut s = socket_syn_received(); let mut s = socket_syn_received();
s.state = State::Established; s.state = State::Established;
s.local_seq_no = LOCAL_SEQ + 1; 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_last_ack = REMOTE_SEQ + 1;
s.remote_win_len = 128;
s s
} }
@ -1371,12 +1413,13 @@ mod test {
ack_number: Some(LOCAL_SEQ + 1), ack_number: Some(LOCAL_SEQ + 1),
..SEND_TEMPL ..SEND_TEMPL
}); });
assert_eq!(s.state, State::CloseWait);
recv!(s, [TcpRepr { recv!(s, [TcpRepr {
seq_number: LOCAL_SEQ + 1, seq_number: LOCAL_SEQ + 1,
ack_number: Some(REMOTE_SEQ + 1 + 1), ack_number: Some(REMOTE_SEQ + 1 + 1),
..RECV_TEMPL ..RECV_TEMPL
}]); }]);
assert_eq!(s.state, State::CloseWait);
sanity!(s, socket_close_wait(), retransmit: false);
} }
#[test] #[test]
@ -1427,6 +1470,7 @@ mod test {
let mut s = socket_established(); let mut s = socket_established();
s.close(); s.close();
assert_eq!(s.state, State::FinWait1); assert_eq!(s.state, State::FinWait1);
sanity!(s, socket_fin_wait_1());
} }
// =========================================================================================// // =========================================================================================//
@ -1453,6 +1497,7 @@ mod test {
..SEND_TEMPL ..SEND_TEMPL
}); });
assert_eq!(s.state, State::FinWait2); assert_eq!(s.state, State::FinWait2);
sanity!(&s, socket_fin_wait_2(), retransmit: false);
} }
#[test] #[test]
@ -1471,6 +1516,7 @@ mod test {
..SEND_TEMPL ..SEND_TEMPL
}); });
assert_eq!(s.state, State::Closing); assert_eq!(s.state, State::Closing);
sanity!(s, socket_closing());
} }
#[test] #[test]
@ -1500,6 +1546,7 @@ mod test {
..SEND_TEMPL ..SEND_TEMPL
}); });
assert_eq!(s.state, State::TimeWait); assert_eq!(s.state, State::TimeWait);
sanity!(s, socket_time_wait(false));
} }
#[test] #[test]
@ -1534,6 +1581,7 @@ mod test {
..SEND_TEMPL ..SEND_TEMPL
}); });
assert_eq!(s.state, State::TimeWait); assert_eq!(s.state, State::TimeWait);
sanity!(s, socket_time_wait(true));
} }
#[test] #[test]
@ -1612,6 +1660,7 @@ mod test {
let mut s = socket_close_wait(); let mut s = socket_close_wait();
s.close(); s.close();
assert_eq!(s.state, State::LastAck); assert_eq!(s.state, State::LastAck);
sanity!(s, socket_last_ack());
} }
// =========================================================================================// // =========================================================================================//