#[cfg(all(target_os = "linux", feature = "splice"))]
#[monoio::test_all]
async fn zero_copy_for_tcp() {
    use monoio::{
        buf::IoBufMut,
        io::{zero_copy, AsyncReadRentExt, AsyncWriteRentExt, Splitable},
        net::TcpStream,
    };

    const MSG: &[u8] = b"copy for split";
    let srv = monoio::net::TcpListener::bind("127.0.0.1:0").unwrap();
    let (mut c_tx, mut c_rx) = local_sync::oneshot::channel::<()>();
    let addr = srv.local_addr().unwrap();
    monoio::spawn(async move {
        let stream = TcpStream::connect(&addr).await.unwrap();
        let (mut rx, mut tx) = stream.into_split();
        tx.write_all(MSG).await.0.unwrap();
        let buf = Vec::<u8>::with_capacity(MSG.len()).slice_mut(0..MSG.len());
        let (res, buf) = rx.read_exact(buf).await;
        let buf = buf.into_inner();
        res.unwrap();
        assert_eq!(&buf, MSG);
        c_rx.close();
    });
    let (conn, _) = srv.accept().await.unwrap();
    let (mut rx, mut tx) = conn.into_split();
    assert_eq!(zero_copy(&mut rx, &mut tx).await.unwrap(), MSG.len() as u64);
    c_tx.closed().await;
}

#[cfg(all(target_os = "linux", feature = "splice"))]
#[monoio::test_all]
async fn zero_copy_for_uds() {
    use monoio::{
        buf::IoBufMut,
        io::{zero_copy, AsyncReadRentExt, AsyncWriteRentExt, Splitable},
        net::UnixStream,
    };

    const MSG: &[u8] = b"copy for split";
    let dir = tempfile::Builder::new()
        .prefix("monoio-uds-tests")
        .tempdir()
        .unwrap();
    let sock_path = dir.path().join("zero_copy.sock");
    let srv = monoio::net::UnixListener::bind(&sock_path).unwrap();
    let (mut c_tx, mut c_rx) = local_sync::oneshot::channel::<()>();
    monoio::spawn(async move {
        let stream = UnixStream::connect(&sock_path).await.unwrap();
        let (mut rx, mut tx) = stream.into_split();
        tx.write_all(MSG).await.0.unwrap();
        let buf = Vec::<u8>::with_capacity(MSG.len()).slice_mut(0..MSG.len());
        let (res, buf) = rx.read_exact(buf).await;
        let buf = buf.into_inner();
        res.unwrap();
        assert_eq!(&buf, MSG);
        c_rx.close();
    });
    let (conn, _) = srv.accept().await.unwrap();
    let (mut rx, mut tx) = conn.into_split();
    assert_eq!(zero_copy(&mut rx, &mut tx).await.unwrap(), MSG.len() as u64);
    c_tx.closed().await;
}
