#![warn(rust_2018_idioms)] #![cfg(feature = "full")] use tokio::net::UdpSocket; #[tokio::test] async fn send_recv() -> std::io::Result<()> { let mut sender = UdpSocket::bind("127.0.0.1:0").await?; let mut receiver = UdpSocket::bind("127.0.0.1:0").await?; sender.connect(receiver.local_addr()?).await?; receiver.connect(sender.local_addr()?).await?; let message = b"hello!"; sender.send(message).await?; let mut recv_buf = [0u8; 32]; let len = receiver.recv(&mut recv_buf[..]).await?; assert_eq!(&recv_buf[..len], message); Ok(()) } #[tokio::test] async fn send_to_recv_from() -> std::io::Result<()> { let mut sender = UdpSocket::bind("127.0.0.1:0").await?; let mut receiver = UdpSocket::bind("127.0.0.1:0").await?; let message = b"hello!"; let receiver_addr = receiver.local_addr()?; sender.send_to(message, &receiver_addr).await?; let mut recv_buf = [0u8; 32]; let (len, addr) = receiver.recv_from(&mut recv_buf[..]).await?; assert_eq!(&recv_buf[..len], message); assert_eq!(addr, sender.local_addr()?); Ok(()) } #[tokio::test] async fn split() -> std::io::Result<()> { let socket = UdpSocket::bind("127.0.0.1:0").await?; let (mut r, mut s) = socket.split(); let msg = b"hello"; let addr = s.as_ref().local_addr()?; tokio::spawn(async move { s.send_to(msg, &addr).await.unwrap(); }); let mut recv_buf = [0u8; 32]; let (len, _) = r.recv_from(&mut recv_buf[..]).await?; assert_eq!(&recv_buf[..len], msg); Ok(()) } #[tokio::test] async fn reunite() -> std::io::Result<()> { let socket = UdpSocket::bind("127.0.0.1:0").await?; let (s, r) = socket.split(); assert!(s.reunite(r).is_ok()); Ok(()) } #[tokio::test] async fn reunite_error() -> std::io::Result<()> { let socket = UdpSocket::bind("127.0.0.1:0").await?; let socket1 = UdpSocket::bind("127.0.0.1:0").await?; let (s, _) = socket.split(); let (_, r1) = socket1.split(); assert!(s.reunite(r1).is_err()); Ok(()) }