mod common;
use common::poll_recv;
use lio::api::resource::Resource;
use lio::{Lio, api};
use std::mem::MaybeUninit;
use std::net::SocketAddr;
use std::os::fd::{AsRawFd, FromRawFd};
#[test]
fn test_shutdown_write() {
let mut lio = Lio::new(64).unwrap();
let server_sock = lio::test_utils::tcp_socket().with_lio(&mut lio).send();
lio.try_run().unwrap();
let server_sock = server_sock.recv().unwrap();
let addr: SocketAddr = "127.0.0.1:0".parse().unwrap();
let bind_recv = api::bind(&server_sock, addr).with_lio(&mut lio).send();
lio.try_run().unwrap();
bind_recv.recv().expect("Failed to bind");
let bound_addr = unsafe {
let mut addr_storage = MaybeUninit::<libc::sockaddr_in>::zeroed();
let mut addr_len =
std::mem::size_of::<libc::sockaddr_in>() as libc::socklen_t;
libc::getsockname(
server_sock.as_raw_fd(),
addr_storage.as_mut_ptr() as *mut libc::sockaddr,
&mut addr_len,
);
let sockaddr_in = addr_storage.assume_init();
let port = u16::from_be(sockaddr_in.sin_port);
format!("127.0.0.1:{}", port).parse::<SocketAddr>().unwrap()
};
let listen_recv = api::listen(&server_sock, 128).with_lio(&mut lio).send();
lio.try_run().unwrap();
listen_recv.recv().expect("Failed to listen");
let client_sock = lio::test_utils::tcp_socket().with_lio(&mut lio).send();
lio.try_run().unwrap();
let client_sock = client_sock.recv().unwrap();
let mut connect_recv =
api::connect(&client_sock, bound_addr).with_lio(&mut lio).send();
let mut accept_recv = api::accept(&server_sock).with_lio(&mut lio).send();
poll_recv(&mut lio, &mut connect_recv).unwrap();
let (server_client_fd, _addr) =
poll_recv(&mut lio, &mut accept_recv).unwrap();
let mut shutdown_recv =
api::shutdown(&client_sock, libc::SHUT_WR).with_lio(&mut lio).send();
poll_recv(&mut lio, &mut shutdown_recv).unwrap();
let data = b"Test data".to_vec();
let mut send_recv =
api::send(&client_sock, data, None).with_lio(&mut lio).send();
let (result, _) = poll_recv(&mut lio, &mut send_recv);
assert!(
result.is_err() || result.unwrap() == 0,
"Send should fail after SHUT_WR"
);
let buf = vec![0u8; 100];
let mut recv_recv =
api::recv(&server_client_fd, buf, None).with_lio(&mut lio).send();
let (bytes_received, _) = poll_recv(&mut lio, &mut recv_recv);
assert_eq!(
bytes_received.expect("Recv should succeed"),
0,
"Should receive EOF after client shutdown write"
);
}
#[test]
fn test_shutdown_read() {
let mut lio = Lio::new(64).unwrap();
let server_sock = lio::test_utils::tcp_socket().with_lio(&mut lio).send();
lio.try_run().unwrap();
let server_sock = server_sock.recv().unwrap();
let addr: SocketAddr = "127.0.0.1:0".parse().unwrap();
let bind_recv = api::bind(&server_sock, addr).with_lio(&mut lio).send();
lio.try_run().unwrap();
bind_recv.recv().expect("Failed to bind");
let bound_addr = unsafe {
let mut addr_storage = MaybeUninit::<libc::sockaddr_in>::zeroed();
let mut addr_len =
std::mem::size_of::<libc::sockaddr_in>() as libc::socklen_t;
libc::getsockname(
server_sock.as_raw_fd(),
addr_storage.as_mut_ptr() as *mut libc::sockaddr,
&mut addr_len,
);
let sockaddr_in = addr_storage.assume_init();
let port = u16::from_be(sockaddr_in.sin_port);
format!("127.0.0.1:{}", port).parse::<SocketAddr>().unwrap()
};
let listen_recv = api::listen(&server_sock, 128).with_lio(&mut lio).send();
lio.try_run().unwrap();
listen_recv.recv().expect("Failed to listen");
let client_sock = lio::test_utils::tcp_socket().with_lio(&mut lio).send();
lio.try_run().unwrap();
let client_sock = client_sock.recv().unwrap();
let mut connect_recv =
api::connect(&client_sock, bound_addr).with_lio(&mut lio).send();
let mut accept_recv = api::accept(&server_sock).with_lio(&mut lio).send();
poll_recv(&mut lio, &mut connect_recv).unwrap();
let (server_client_fd, _addr) =
poll_recv(&mut lio, &mut accept_recv).unwrap();
let mut shutdown_recv =
api::shutdown(&client_sock, libc::SHUT_RD).with_lio(&mut lio).send();
poll_recv(&mut lio, &mut shutdown_recv).unwrap();
let data = b"Hello".to_vec();
let mut send_recv =
api::send(&client_sock, data.clone(), None).with_lio(&mut lio).send();
let (bytes_sent, _) = poll_recv(&mut lio, &mut send_recv);
assert_eq!(bytes_sent.expect("Send should succeed") as usize, data.len());
let buf = vec![0u8; 100];
let mut recv_recv =
api::recv(&server_client_fd, buf, None).with_lio(&mut lio).send();
let (bytes_received, received_buf) = poll_recv(&mut lio, &mut recv_recv);
let bytes_received = bytes_received.expect("Recv should succeed") as usize;
assert_eq!(bytes_received, data.len());
assert_eq!(&received_buf[..bytes_received], data.as_slice());
}
#[test]
fn test_shutdown_both() {
let mut lio = Lio::new(64).unwrap();
let mut server_sock = lio::test_utils::tcp_socket().with_lio(&mut lio).send();
let server_sock = poll_recv(&mut lio, &mut server_sock).unwrap();
let addr: SocketAddr = "127.0.0.1:0".parse().unwrap();
let mut bind_recv = api::bind(&server_sock, addr).with_lio(&mut lio).send();
poll_recv(&mut lio, &mut bind_recv).expect("Failed to bind");
let bound_addr = unsafe {
let mut addr_storage = MaybeUninit::<libc::sockaddr_in>::zeroed();
let mut addr_len =
std::mem::size_of::<libc::sockaddr_in>() as libc::socklen_t;
libc::getsockname(
server_sock.as_raw_fd(),
addr_storage.as_mut_ptr() as *mut libc::sockaddr,
&mut addr_len,
);
let sockaddr_in = addr_storage.assume_init();
let port = u16::from_be(sockaddr_in.sin_port);
format!("127.0.0.1:{}", port).parse::<SocketAddr>().unwrap()
};
let mut listen_recv =
api::listen(&server_sock, 128).with_lio(&mut lio).send();
poll_recv(&mut lio, &mut listen_recv).expect("Failed to listen");
let mut client_sock = lio::test_utils::tcp_socket().with_lio(&mut lio).send();
let client_sock = poll_recv(&mut lio, &mut client_sock).unwrap();
let mut connect_recv =
api::connect(&client_sock, bound_addr).with_lio(&mut lio).send();
let mut accept_recv = api::accept(&server_sock).with_lio(&mut lio).send();
poll_recv(&mut lio, &mut connect_recv).unwrap();
let (server_client_fd, _addr) =
poll_recv(&mut lio, &mut accept_recv).unwrap();
let mut shutdown_recv =
api::shutdown(&client_sock, libc::SHUT_RDWR).with_lio(&mut lio).send();
poll_recv(&mut lio, &mut shutdown_recv).expect("Failed to shutdown both");
let data = b"Test".to_vec();
let mut send_recv =
api::send(&client_sock, data, None).with_lio(&mut lio).send();
let (result, _) = poll_recv(&mut lio, &mut send_recv);
assert!(
result.is_err() || result.unwrap() == 0,
"Send should fail after SHUT_RDWR"
);
let buf = vec![0u8; 100];
let mut recv_recv =
api::recv(&server_client_fd, buf, None).with_lio(&mut lio).send();
let (bytes_received, _) = poll_recv(&mut lio, &mut recv_recv);
assert_eq!(
bytes_received.expect("Recv should succeed"),
0,
"Should receive EOF"
);
}
#[test]
fn test_shutdown_invalid_fd() {
let mut lio = Lio::new(64).unwrap();
let mut shutdown_recv =
api::shutdown(&unsafe { Resource::from_raw_fd(-1) }, libc::SHUT_RDWR)
.with_lio(&mut lio)
.send();
let result = poll_recv(&mut lio, &mut shutdown_recv);
assert!(result.is_err(), "Shutdown on invalid fd should fail");
}
#[test]
fn test_shutdown_after_close() {
let mut lio = Lio::new(64).unwrap();
let server_sock = lio::test_utils::tcp_socket().with_lio(&mut lio).send();
lio.try_run().unwrap();
let server_sock = server_sock.recv().expect("Failed to create server socket");
let addr: SocketAddr = "127.0.0.1:0".parse().unwrap();
let bind_recv = api::bind(&server_sock, addr).with_lio(&mut lio).send();
lio.try_run().unwrap();
bind_recv.recv().expect("Failed to bind");
let bound_addr = unsafe {
let mut addr_storage = MaybeUninit::<libc::sockaddr_in>::zeroed();
let mut addr_len =
std::mem::size_of::<libc::sockaddr_in>() as libc::socklen_t;
libc::getsockname(
server_sock.as_raw_fd(),
addr_storage.as_mut_ptr() as *mut libc::sockaddr,
&mut addr_len,
);
let sockaddr_in = addr_storage.assume_init();
let port = u16::from_be(sockaddr_in.sin_port);
format!("127.0.0.1:{}", port).parse::<SocketAddr>().unwrap()
};
let listen_recv = api::listen(&server_sock, 128).with_lio(&mut lio).send();
lio.try_run().unwrap();
listen_recv.recv().expect("Failed to listen");
let mut client_sock_recv =
lio::test_utils::tcp_socket().with_lio(&mut lio).send();
let client_sock = poll_recv(&mut lio, &mut client_sock_recv).unwrap();
let mut connect_recv =
api::connect(&client_sock, bound_addr).with_lio(&mut lio).send();
poll_recv(&mut lio, &mut connect_recv).unwrap();
unsafe {
libc::close(client_sock.as_raw_fd());
}
std::mem::forget(client_sock);
let mut shutdown_recv =
api::shutdown(&unsafe { Resource::from_raw_fd(-1) }, libc::SHUT_RDWR)
.with_lio(&mut lio)
.send();
let result = poll_recv(&mut lio, &mut shutdown_recv);
assert!(result.is_err(), "Shutdown after close should fail");
}
#[test]
fn test_shutdown_twice() {
let mut lio = Lio::new(64).unwrap();
let server_sock = lio::test_utils::tcp_socket().with_lio(&mut lio).send();
lio.try_run().unwrap();
let server_sock = server_sock.recv().expect("Failed to create server socket");
let addr: SocketAddr = "127.0.0.1:0".parse().unwrap();
let bind_recv = api::bind(&server_sock, addr).with_lio(&mut lio).send();
lio.try_run().unwrap();
bind_recv.recv().expect("Failed to bind");
let bound_addr = unsafe {
let mut addr_storage = MaybeUninit::<libc::sockaddr_in>::zeroed();
let mut addr_len =
std::mem::size_of::<libc::sockaddr_in>() as libc::socklen_t;
libc::getsockname(
server_sock.as_raw_fd(),
addr_storage.as_mut_ptr() as *mut libc::sockaddr,
&mut addr_len,
);
let sockaddr_in = addr_storage.assume_init();
let port = u16::from_be(sockaddr_in.sin_port);
format!("127.0.0.1:{}", port).parse::<SocketAddr>().unwrap()
};
let listen_recv = api::listen(&server_sock, 128).with_lio(&mut lio).send();
lio.try_run().unwrap();
listen_recv.recv().expect("Failed to listen");
let client_sock = lio::test_utils::tcp_socket().with_lio(&mut lio).send();
lio.try_run().unwrap();
let client_sock = client_sock.recv().unwrap();
let mut connect_recv =
api::connect(&client_sock, bound_addr).with_lio(&mut lio).send();
let mut accept_recv = api::accept(&server_sock).with_lio(&mut lio).send();
poll_recv(&mut lio, &mut connect_recv).unwrap();
let (_server_client_fd, _addr) =
poll_recv(&mut lio, &mut accept_recv).unwrap();
let mut shutdown_recv =
api::shutdown(&client_sock, libc::SHUT_WR).with_lio(&mut lio).send();
poll_recv(&mut lio, &mut shutdown_recv)
.expect("First shutdown should succeed");
let mut shutdown_recv2 =
api::shutdown(&client_sock, libc::SHUT_WR).with_lio(&mut lio).send();
let result = poll_recv(&mut lio, &mut shutdown_recv2);
let _ = result;
}
#[test]
fn test_shutdown_sequential_directions() {
let mut lio = Lio::new(64).unwrap();
let server_sock = lio::test_utils::tcp_socket().with_lio(&mut lio).send();
lio.try_run().unwrap();
let server_sock = server_sock.recv().unwrap();
let addr: SocketAddr = "127.0.0.1:0".parse().unwrap();
let bind_recv = api::bind(&server_sock, addr).with_lio(&mut lio).send();
lio.try_run().unwrap();
bind_recv.recv().expect("Failed to bind");
let bound_addr = unsafe {
let mut addr_storage = MaybeUninit::<libc::sockaddr_in>::zeroed();
let mut addr_len =
std::mem::size_of::<libc::sockaddr_in>() as libc::socklen_t;
libc::getsockname(
server_sock.as_raw_fd(),
addr_storage.as_mut_ptr() as *mut libc::sockaddr,
&mut addr_len,
);
let sockaddr_in = addr_storage.assume_init();
let port = u16::from_be(sockaddr_in.sin_port);
format!("127.0.0.1:{}", port).parse::<SocketAddr>().unwrap()
};
let listen_recv = api::listen(&server_sock, 128).with_lio(&mut lio).send();
lio.try_run().unwrap();
listen_recv.recv().expect("Failed to listen");
let client_sock = lio::test_utils::tcp_socket().with_lio(&mut lio).send();
lio.try_run().unwrap();
let client_sock = client_sock.recv().unwrap();
let mut connect_recv =
api::connect(&client_sock, bound_addr).with_lio(&mut lio).send();
let mut accept_recv = api::accept(&server_sock).with_lio(&mut lio).send();
poll_recv(&mut lio, &mut connect_recv).unwrap();
let (server_client_fd, _addr) =
poll_recv(&mut lio, &mut accept_recv).unwrap();
let mut shutdown_recv =
api::shutdown(&client_sock, libc::SHUT_WR).with_lio(&mut lio).send();
poll_recv(&mut lio, &mut shutdown_recv).expect("Failed to shutdown write");
let data = b"From server".to_vec();
let mut send_recv =
api::send(&server_client_fd, data, None).with_lio(&mut lio).send();
let (bytes_sent, _) = poll_recv(&mut lio, &mut send_recv);
assert!(bytes_sent.is_ok(), "Server send should succeed");
let buf = vec![0u8; 100];
let mut recv_recv =
api::recv(&client_sock, buf, None).with_lio(&mut lio).send();
let (bytes_received, received_buf) = poll_recv(&mut lio, &mut recv_recv);
let bytes_received = bytes_received.unwrap() as usize;
assert_eq!(&received_buf[..bytes_received], b"From server");
let mut shutdown_recv2 =
api::shutdown(&client_sock, libc::SHUT_RD).with_lio(&mut lio).send();
poll_recv(&mut lio, &mut shutdown_recv2).expect("Failed to shutdown read");
}
#[test]
fn test_shutdown_before_data_sent() {
let mut lio = Lio::new(64).unwrap();
let server_sock = lio::test_utils::tcp_socket().with_lio(&mut lio).send();
lio.try_run().unwrap();
let server_sock = server_sock.recv().expect("Failed to create server socket");
let addr: SocketAddr = "127.0.0.1:0".parse().unwrap();
let bind_recv = api::bind(&server_sock, addr).with_lio(&mut lio).send();
lio.try_run().unwrap();
bind_recv.recv().expect("Failed to bind");
let bound_addr = unsafe {
let mut addr_storage = MaybeUninit::<libc::sockaddr_in>::zeroed();
let mut addr_len =
std::mem::size_of::<libc::sockaddr_in>() as libc::socklen_t;
libc::getsockname(
server_sock.as_raw_fd(),
addr_storage.as_mut_ptr() as *mut libc::sockaddr,
&mut addr_len,
);
let sockaddr_in = addr_storage.assume_init();
let port = u16::from_be(sockaddr_in.sin_port);
format!("127.0.0.1:{}", port).parse::<SocketAddr>().unwrap()
};
let listen_recv = api::listen(&server_sock, 128).with_lio(&mut lio).send();
lio.try_run().unwrap();
listen_recv.recv().expect("Failed to listen");
let client_sock = lio::test_utils::tcp_socket().with_lio(&mut lio).send();
lio.try_run().unwrap();
let client_sock = client_sock.recv().unwrap();
let mut connect_recv =
api::connect(&client_sock, bound_addr).with_lio(&mut lio).send();
let mut accept_recv = api::accept(&server_sock).with_lio(&mut lio).send();
poll_recv(&mut lio, &mut connect_recv).unwrap();
let (server_client_fd, _addr) =
poll_recv(&mut lio, &mut accept_recv).unwrap();
let mut shutdown_recv =
api::shutdown(&client_sock, libc::SHUT_RDWR).with_lio(&mut lio).send();
poll_recv(&mut lio, &mut shutdown_recv)
.expect("Shutdown should succeed on fresh connection");
let buf = vec![0u8; 100];
let mut recv_recv =
api::recv(&server_client_fd, buf, None).with_lio(&mut lio).send();
let (bytes_received, _) = poll_recv(&mut lio, &mut recv_recv);
assert_eq!(bytes_received.expect("Recv should succeed"), 0);
}
#[test]
fn test_shutdown_ipv6() {
let mut lio = Lio::new(64).unwrap();
let server_sock = lio::test_utils::tcp6_socket().with_lio(&mut lio).send();
lio.try_run().unwrap();
let server_sock =
server_sock.recv().expect("Failed to create IPv6 server socket");
let addr: SocketAddr = "[::1]:0".parse().unwrap();
let bind_recv = api::bind(&server_sock, addr).with_lio(&mut lio).send();
lio.try_run().unwrap();
bind_recv.recv().expect("Failed to bind IPv6");
let bound_addr = unsafe {
let mut addr_storage = MaybeUninit::<libc::sockaddr_in6>::zeroed();
let mut addr_len =
std::mem::size_of::<libc::sockaddr_in6>() as libc::socklen_t;
libc::getsockname(
server_sock.as_raw_fd(),
addr_storage.as_mut_ptr() as *mut libc::sockaddr,
&mut addr_len,
);
let sockaddr_in6 = addr_storage.assume_init();
let port = u16::from_be(sockaddr_in6.sin6_port);
format!("[::1]:{}", port).parse::<SocketAddr>().unwrap()
};
let listen_recv = api::listen(&server_sock, 128).with_lio(&mut lio).send();
lio.try_run().unwrap();
listen_recv.recv().expect("Failed to listen");
let client_sock = lio::test_utils::tcp6_socket().with_lio(&mut lio).send();
lio.try_run().unwrap();
let client_sock =
client_sock.recv().expect("Failed to create IPv6 client socket");
let mut connect_recv =
api::connect(&client_sock, bound_addr).with_lio(&mut lio).send();
let mut accept_recv = api::accept(&server_sock).with_lio(&mut lio).send();
poll_recv(&mut lio, &mut connect_recv).expect("Failed to connect IPv6");
let (server_client_fd, _addr) =
poll_recv(&mut lio, &mut accept_recv).expect("Failed to accept IPv6");
let mut shutdown_recv =
api::shutdown(&client_sock, libc::SHUT_WR).with_lio(&mut lio).send();
poll_recv(&mut lio, &mut shutdown_recv)
.expect("Failed to shutdown IPv6 socket");
let buf = vec![0u8; 100];
let mut recv_recv =
api::recv(&server_client_fd, buf, None).with_lio(&mut lio).send();
let (bytes_received, _) = poll_recv(&mut lio, &mut recv_recv);
assert_eq!(bytes_received.expect("Recv should succeed"), 0);
}
#[test]
fn test_shutdown_concurrent() {
let mut lio = Lio::new(64).unwrap();
for _ in 0..5 {
let mut server_sock =
lio::test_utils::tcp_socket().with_lio(&mut lio).send();
let server_sock = poll_recv(&mut lio, &mut server_sock)
.expect("Failed to create server socket");
let addr: SocketAddr = "127.0.0.1:0".parse().unwrap();
let mut bind_recv = api::bind(&server_sock, addr).with_lio(&mut lio).send();
poll_recv(&mut lio, &mut bind_recv).expect("Failed to bind");
let bound_addr = unsafe {
let mut addr_storage = MaybeUninit::<libc::sockaddr_in>::zeroed();
let mut addr_len =
std::mem::size_of::<libc::sockaddr_in>() as libc::socklen_t;
libc::getsockname(
server_sock.as_raw_fd(),
addr_storage.as_mut_ptr() as *mut libc::sockaddr,
&mut addr_len,
);
let sockaddr_in = addr_storage.assume_init();
let port = u16::from_be(sockaddr_in.sin_port);
format!("127.0.0.1:{}", port).parse::<SocketAddr>().unwrap()
};
let mut listen_recv =
api::listen(&server_sock, 128).with_lio(&mut lio).send();
poll_recv(&mut lio, &mut listen_recv).expect("Failed to listen");
let mut client_sock =
lio::test_utils::tcp_socket().with_lio(&mut lio).send();
let client_sock = poll_recv(&mut lio, &mut client_sock).unwrap();
let mut connect_recv =
api::connect(&client_sock, bound_addr).with_lio(&mut lio).send();
let mut accept_recv = api::accept(&server_sock).with_lio(&mut lio).send();
poll_recv(&mut lio, &mut connect_recv).unwrap();
let (_server_client_fd, _addr) =
poll_recv(&mut lio, &mut accept_recv).unwrap();
let mut shutdown_recv =
api::shutdown(&client_sock, libc::SHUT_RDWR).with_lio(&mut lio).send();
poll_recv(&mut lio, &mut shutdown_recv)
.expect("Concurrent shutdown failed");
}
}
#[test]
fn test_shutdown_with_pending_data() {
let mut lio = Lio::new(64).unwrap();
let server_sock = lio::test_utils::tcp_socket().with_lio(&mut lio).send();
lio.try_run().unwrap();
let server_sock = server_sock.recv().unwrap();
let addr: SocketAddr = "127.0.0.1:0".parse().unwrap();
let bind_recv = api::bind(&server_sock, addr).with_lio(&mut lio).send();
lio.try_run().unwrap();
bind_recv.recv().expect("Failed to bind");
let bound_addr = unsafe {
let mut addr_storage = MaybeUninit::<libc::sockaddr_in>::zeroed();
let mut addr_len =
std::mem::size_of::<libc::sockaddr_in>() as libc::socklen_t;
libc::getsockname(
server_sock.as_raw_fd(),
addr_storage.as_mut_ptr() as *mut libc::sockaddr,
&mut addr_len,
);
let sockaddr_in = addr_storage.assume_init();
let port = u16::from_be(sockaddr_in.sin_port);
format!("127.0.0.1:{}", port).parse::<SocketAddr>().unwrap()
};
let listen_recv = api::listen(&server_sock, 128).with_lio(&mut lio).send();
lio.try_run().unwrap();
listen_recv.recv().expect("Failed to listen");
let client_sock = lio::test_utils::tcp_socket().with_lio(&mut lio).send();
lio.try_run().unwrap();
let client_sock = client_sock.recv().unwrap();
let mut connect_recv =
api::connect(&client_sock, bound_addr).with_lio(&mut lio).send();
let mut accept_recv = api::accept(&server_sock).with_lio(&mut lio).send();
poll_recv(&mut lio, &mut connect_recv).unwrap();
let (server_client_fd, _addr) =
poll_recv(&mut lio, &mut accept_recv).unwrap();
let data = b"Data before shutdown".to_vec();
let mut send_recv =
api::send(&client_sock, data.clone(), None).with_lio(&mut lio).send();
let (bytes_sent, _) = poll_recv(&mut lio, &mut send_recv);
assert!(bytes_sent.is_ok(), "Send should succeed");
let mut shutdown_recv =
api::shutdown(&client_sock, libc::SHUT_WR).with_lio(&mut lio).send();
poll_recv(&mut lio, &mut shutdown_recv).expect("Shutdown should succeed");
let buf = vec![0u8; 100];
let mut recv_recv =
api::recv(&server_client_fd, buf, None).with_lio(&mut lio).send();
let (bytes_received, received_buf) = poll_recv(&mut lio, &mut recv_recv);
let bytes_received = bytes_received.expect("Recv should succeed") as usize;
if bytes_received > 0 {
assert_eq!(&received_buf[..bytes_received], data.as_slice());
let buf2 = vec![0u8; 100];
let mut recv_recv2 =
api::recv(&server_client_fd, buf2, None).with_lio(&mut lio).send();
let (bytes_received2, _) = poll_recv(&mut lio, &mut recv_recv2);
assert_eq!(bytes_received2.expect("Recv should succeed"), 0);
}
}