use std::net::Ipv6Addr;
use compio_io::{AsyncReadManaged, AsyncWriteExt};
use compio_net::{TcpListener, TcpStream, UdpSocket, UnixListener, UnixStream};
use compio_runtime::BufferPool;
#[compio_macros::test]
async fn test_tcp_read_buffer_pool() {
let listener = TcpListener::bind((Ipv6Addr::LOCALHOST, 0)).await.unwrap();
let addr = listener.local_addr().unwrap();
compio_runtime::spawn(async move {
let mut stream = listener.accept().await.unwrap().0;
stream.write_all(b"test").await.unwrap();
})
.detach();
let buffer_pool = BufferPool::new(1, 4).unwrap();
let mut stream = TcpStream::connect(addr).await.unwrap();
assert_eq!(
stream.read_managed(&buffer_pool, 0).await.unwrap().as_ref(),
b"test"
);
assert_eq!(
stream
.read_managed(&buffer_pool, 0)
.await
.map(|b| b.len())
.unwrap_or_default(),
0
);
}
#[compio_macros::test]
async fn test_udp_read_buffer_pool() {
let listener = UdpSocket::bind((Ipv6Addr::LOCALHOST, 0)).await.unwrap();
let addr = listener.local_addr().unwrap();
let connected = UdpSocket::bind((Ipv6Addr::LOCALHOST, 0)).await.unwrap();
connected.connect(addr).await.unwrap();
let addr = connected.local_addr().unwrap();
compio_runtime::spawn(async move {
listener.send_to(b"test", addr).await.unwrap();
})
.detach();
let buffer_pool = BufferPool::new(1, 4).unwrap();
assert_eq!(
connected
.recv_managed(&buffer_pool, 0)
.await
.unwrap()
.as_ref(),
b"test"
);
}
#[compio_macros::test]
async fn test_udp_recv_from_buffer_pool() {
let listener = UdpSocket::bind((Ipv6Addr::LOCALHOST, 0)).await.unwrap();
let listener_addr = listener.local_addr().unwrap();
let connected = UdpSocket::bind((Ipv6Addr::LOCALHOST, 0)).await.unwrap();
let connected_addr = connected.local_addr().unwrap();
compio_runtime::spawn(async move {
connected.send_to(b"test", listener_addr).await.unwrap();
})
.detach();
let buffer_pool = BufferPool::new(1, 4).unwrap();
let (buffer, addr) = listener.recv_from_managed(&buffer_pool, 0).await.unwrap();
assert_eq!(buffer.as_ref(), b"test");
assert_eq!(addr, connected_addr);
}
#[compio_macros::test]
async fn test_uds_recv_buffer_pool() {
let dir = tempfile::Builder::new()
.prefix("compio-uds-buffer-pool-tests")
.tempdir()
.unwrap();
let sock_path = dir.path().join("connect.sock");
let listener = UnixListener::bind(&sock_path).await.unwrap();
let (mut client, (mut server, _)) =
futures_util::try_join!(UnixStream::connect(&sock_path), listener.accept()).unwrap();
client.write_all("test").await.unwrap();
drop(client);
let buffer_pool = BufferPool::new(1, 4).unwrap();
assert_eq!(
server.read_managed(&buffer_pool, 0).await.unwrap().as_ref(),
b"test"
);
assert_eq!(
server
.read_managed(&buffer_pool, 0)
.await
.map(|b| b.len())
.unwrap_or_default(),
0
);
}