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 {
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());
}
// =========================================================================================//