compio-net 0.12.1

Networking IO for compio
use compio_io::{AsyncRead, AsyncReadExt, AsyncWrite, AsyncWriteExt};
use compio_net::{TcpListener, TcpStream, UnixListener, UnixStream};
use compio_runtime::ResumeUnwind;
use futures_util::StreamExt;

#[compio_macros::test]
async fn incoming_tcp() {
    let listener = TcpListener::bind("127.0.0.1:0").await.unwrap();
    let addr = listener.local_addr().unwrap();
    let task = compio_runtime::spawn(async move {
        let mut incoming = listener.incoming();
        let mut i = 0usize;
        while let Some(stream) = incoming.next().await {
            let mut stream = stream.unwrap();
            stream.write_all(format!("Hello, {}", i)).await.unwrap();
            stream.shutdown().await.unwrap();
            stream.read_exact([0u8; 8]).await.unwrap();
            i += 1;
            if i >= 2 {
                break;
            }
        }
    });

    for i in 0..2 {
        let mut client = TcpStream::connect(&addr).await.unwrap();
        let (_, text) = client.read_exact([0u8; 8]).await.unwrap();
        assert_eq!(text, format!("Hello, {}", i).as_bytes());
        client.write_all(text).await.unwrap();
        client.shutdown().await.unwrap();
        client.read([0u8; 1]).await.unwrap();
    }

    task.await.resume_unwind();
}

#[compio_macros::test]
async fn incoming_unix() {
    let dir = tempfile::Builder::new()
        .prefix("compio-uds-incoming-tests")
        .tempdir()
        .unwrap();
    let sock_path = dir.path().join("connect.sock");

    let listener = UnixListener::bind(&sock_path).await.unwrap();
    let task = compio_runtime::spawn(async move {
        let mut incoming = listener.incoming();
        let mut i = 0usize;
        while let Some(stream) = incoming.next().await {
            let mut stream = stream.unwrap();
            stream.write_all(format!("Hello, {}", i)).await.unwrap();
            stream.shutdown().await.unwrap();
            stream.read_exact([0u8; 8]).await.unwrap();
            i += 1;
            if i >= 2 {
                break;
            }
        }
    });

    for i in 0..2 {
        let mut client = UnixStream::connect(&sock_path).await.unwrap();
        let (_, text) = client.read_exact([0u8; 8]).await.unwrap();
        assert_eq!(text, format!("Hello, {}", i).as_bytes());
        client.write_all(text).await.unwrap();
        client.shutdown().await.unwrap();
        client.read([0u8; 1]).await.unwrap();
    }

    task.await.resume_unwind();
}