initial commit
This commit is contained in:
51
exercises/08_futures/07_cancellation/src/lib.rs
Normal file
51
exercises/08_futures/07_cancellation/src/lib.rs
Normal file
@@ -0,0 +1,51 @@
|
||||
// TODO: fix the `assert_eq` at the end of the tests.
|
||||
// Do you understand why that's the resulting output?
|
||||
use std::time::Duration;
|
||||
use tokio::io::AsyncReadExt;
|
||||
use tokio::net::TcpListener;
|
||||
|
||||
pub async fn run(listener: TcpListener, n_messages: usize, timeout: Duration) -> Vec<u8> {
|
||||
let mut buffer = Vec::new();
|
||||
for _ in 0..n_messages {
|
||||
let (mut stream, _) = listener.accept().await.unwrap();
|
||||
let _ = tokio::time::timeout(timeout, async {
|
||||
stream.read_to_end(&mut buffer).await.unwrap();
|
||||
})
|
||||
.await;
|
||||
}
|
||||
buffer
|
||||
}
|
||||
|
||||
#[cfg(test)]
|
||||
mod tests {
|
||||
use super::*;
|
||||
use tokio::io::AsyncWriteExt;
|
||||
|
||||
#[tokio::test]
|
||||
async fn ping() {
|
||||
let listener = TcpListener::bind("127.0.0.1:0").await.unwrap();
|
||||
let addr = listener.local_addr().unwrap();
|
||||
let messages = vec!["hello", "from", "this", "task"];
|
||||
let timeout = Duration::from_millis(20);
|
||||
let handle = tokio::spawn(run(listener, messages.len(), timeout.clone()));
|
||||
|
||||
for message in messages {
|
||||
let mut socket = tokio::net::TcpStream::connect(addr).await.unwrap();
|
||||
let (_, mut writer) = socket.split();
|
||||
|
||||
let (beginning, end) = message.split_at(message.len() / 2);
|
||||
|
||||
// Send first half
|
||||
writer.write_all(beginning.as_bytes()).await.unwrap();
|
||||
tokio::time::sleep(timeout * 2).await;
|
||||
writer.write_all(end.as_bytes()).await.unwrap();
|
||||
|
||||
// Close the write side of the socket
|
||||
let _ = writer.shutdown().await;
|
||||
}
|
||||
|
||||
let buffered = handle.await.unwrap();
|
||||
let buffered = std::str::from_utf8(&buffered).unwrap();
|
||||
assert_eq!(buffered, "");
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user