| #![warn(rust_2018_idioms)] |
| #![cfg(feature = "full")] |
| #![cfg(unix)] |
| |
| use tokio::io::{AsyncRead, AsyncReadExt, AsyncWrite, AsyncWriteExt}; |
| use tokio::net::UnixStream; |
| |
| /// Checks that `UnixStream` can be split into a read half and a write half using |
| /// `UnixStream::split` and `UnixStream::split_mut`. |
| /// |
| /// Verifies that the implementation of `AsyncWrite::poll_shutdown` shutdowns the stream for |
| /// writing by reading to the end of stream on the other side of the connection. |
| #[tokio::test] |
| async fn split() -> std::io::Result<()> { |
| let (mut a, mut b) = UnixStream::pair()?; |
| |
| let (mut a_read, mut a_write) = a.split(); |
| let (mut b_read, mut b_write) = b.split(); |
| |
| let (a_response, b_response) = futures::future::try_join( |
| send_recv_all(&mut a_read, &mut a_write, b"A"), |
| send_recv_all(&mut b_read, &mut b_write, b"B"), |
| ) |
| .await?; |
| |
| assert_eq!(a_response, b"B"); |
| assert_eq!(b_response, b"A"); |
| |
| Ok(()) |
| } |
| |
| async fn send_recv_all( |
| read: &mut (dyn AsyncRead + Unpin), |
| write: &mut (dyn AsyncWrite + Unpin), |
| input: &[u8], |
| ) -> std::io::Result<Vec<u8>> { |
| write.write_all(input).await?; |
| write.shutdown().await?; |
| |
| let mut output = Vec::new(); |
| read.read_to_end(&mut output).await?; |
| Ok(output) |
| } |