in netbench/src/multiplex.rs [519:587]
fn test(config: Config, scenario: &Scenario) -> (MemoryLogger, MemoryLogger) {
let traces = &scenario.traces;
let (client, server) = testing::Connection::pair(10000);
let mut client = {
let scenario = &scenario.clients[0].connections[0];
let conn = Box::pin(client);
let conn = super::Connection::new(0, conn, config.clone());
Driver::new(scenario, conn)
};
let mut client_trace = MemoryLogger::new(traces.clone());
let mut client_checkpoints = HashSet::new();
let mut client_timer = timer::Testing::default();
let mut server = {
let scenario = &scenario.servers[0].connections[0];
let conn = Box::pin(server);
let conn = super::Connection::new(1, conn, config);
Driver::new(scenario, conn)
};
let mut server_trace = MemoryLogger::new(traces.clone());
let mut server_checkpoints = HashSet::new();
let mut server_timer = timer::Testing::default();
let (waker, count) = new_count_waker();
let mut prev_count = 0;
let mut cx = core::task::Context::from_waker(&waker);
loop {
let c = client.poll_with_timer(
&mut client_trace,
&mut client_checkpoints,
&mut client_timer,
&mut cx,
);
let s = server.poll_with_timer(
&mut server_trace,
&mut server_checkpoints,
&mut server_timer,
&mut cx,
);
match (c, s) {
(Poll::Ready(Ok(())), Poll::Ready(Ok(()))) => break,
(Poll::Ready(Err(e)), _) | (_, Poll::Ready(Err(e))) => panic!("{e}"),
_ => {
let current_count = count.get();
if current_count > prev_count {
prev_count = current_count;
continue;
}
if client_timer.advance_pair(&mut server_timer).is_none() {
eprintln!("the timer did not advance!");
eprintln!("server trace:");
eprintln!("{}", server_trace.as_str().unwrap());
eprintln!("{server:#?}");
eprintln!("client trace:");
eprintln!("{}", client_trace.as_str().unwrap());
eprintln!("{client:#?}");
panic!("test is deadlocked");
}
}
}
}
(client_trace, server_trace)
}