1 #![warn(rust_2018_idioms)] 2 #![cfg(feature = "full")] 3 #![cfg(unix)] 4 5 use tokio::net::UnixDatagram; 6 7 use std::io; 8 echo_server(mut socket: UnixDatagram) -> io::Result<()>9async fn echo_server(mut socket: UnixDatagram) -> io::Result<()> { 10 let mut recv_buf = vec![0u8; 1024]; 11 loop { 12 let (len, peer_addr) = socket.recv_from(&mut recv_buf[..]).await?; 13 if let Some(path) = peer_addr.as_pathname() { 14 socket.send_to(&recv_buf[..len], path).await?; 15 } 16 } 17 } 18 19 #[tokio::test] echo() -> io::Result<()>20async fn echo() -> io::Result<()> { 21 let dir = tempfile::tempdir().unwrap(); 22 let server_path = dir.path().join("server.sock"); 23 let client_path = dir.path().join("client.sock"); 24 25 let server_socket = UnixDatagram::bind(server_path.clone())?; 26 27 tokio::spawn(async move { 28 if let Err(e) = echo_server(server_socket).await { 29 eprintln!("Error in echo server: {}", e); 30 } 31 }); 32 33 { 34 let mut socket = UnixDatagram::bind(&client_path).unwrap(); 35 socket.connect(server_path)?; 36 socket.send(b"ECHO").await?; 37 let mut recv_buf = [0u8; 16]; 38 let len = socket.recv(&mut recv_buf[..]).await?; 39 assert_eq!(&recv_buf[..len], b"ECHO"); 40 } 41 42 Ok(()) 43 } 44