1 | #![warn (rust_2018_idioms)] |
2 | #![cfg (all(feature = "full" , not(target_os = "wasi" )))] // Wasi doesn't support bind |
3 | |
4 | use std::io::Read; |
5 | use std::io::Result; |
6 | use tokio::io::{AsyncReadExt, AsyncWriteExt}; |
7 | use tokio::net::TcpListener; |
8 | use tokio::net::TcpStream; |
9 | |
10 | #[tokio::test ] |
11 | async fn tcp_into_std() -> Result<()> { |
12 | let mut data = [0u8; 12]; |
13 | let listener = TcpListener::bind("127.0.0.1:0" ).await?; |
14 | let addr = listener.local_addr().unwrap().to_string(); |
15 | |
16 | let handle = tokio::spawn(async { |
17 | let stream: TcpStream = TcpStream::connect(addr).await.unwrap(); |
18 | stream |
19 | }); |
20 | |
21 | let (tokio_tcp_stream, _) = listener.accept().await?; |
22 | let mut std_tcp_stream = tokio_tcp_stream.into_std()?; |
23 | std_tcp_stream |
24 | .set_nonblocking(false) |
25 | .expect("set_nonblocking call failed" ); |
26 | |
27 | let mut client = handle.await.expect("The task being joined has panicked" ); |
28 | client.write_all(b"Hello world!" ).await?; |
29 | |
30 | std_tcp_stream |
31 | .read_exact(&mut data) |
32 | .expect("std TcpStream read failed!" ); |
33 | assert_eq!(b"Hello world!" , &data); |
34 | |
35 | // test back to tokio stream |
36 | std_tcp_stream |
37 | .set_nonblocking(true) |
38 | .expect("set_nonblocking call failed" ); |
39 | let mut tokio_tcp_stream = TcpStream::from_std(std_tcp_stream)?; |
40 | client.write_all(b"Hello tokio!" ).await?; |
41 | let _size = tokio_tcp_stream.read_exact(&mut data).await?; |
42 | assert_eq!(b"Hello tokio!" , &data); |
43 | |
44 | Ok(()) |
45 | } |
46 | |