local-runtime 0.2.1

Thread-local async runtime
Documentation
use std::net::{TcpListener, TcpStream};

use futures_lite::{AsyncReadExt, AsyncWriteExt, StreamExt};
use local_runtime::{block_on, io::Async, join};

#[test]
fn single_thread_echo() {
    let _ = env_logger::builder()
        .is_test(true)
        .filter_level(log::LevelFilter::Trace)
        .try_init();

    let mut done = (false, false);
    block_on(async {
        let listener = Async::<TcpListener>::bind(([127, 0, 0, 1], 0)).unwrap();
        let addr = listener.get_ref().local_addr().unwrap();

        let fut1 = async {
            let mut incoming = listener.incoming();
            for i in 1..=10 {
                let mut buf = [0u8; 1000];
                let mut stream = incoming.next().await.unwrap().unwrap();
                log::info!("Task1: Accept");
                stream.read_exact(&mut buf).await.unwrap();
                log::info!("Task1: Read");
                stream.write_all(b"hello world").await.unwrap();
                log::info!("Task1: Write");
                assert!(buf.iter().all(|&b| b == i));
            }
            done.0 = true;
        };

        let fut2 = async {
            for i in 1..=10 {
                let mut buf = [0u8; 11];
                let mut stream = Async::<TcpStream>::connect(addr).await.unwrap();
                log::info!("Task2: Connect");
                for _ in 0..10 {
                    stream.write_all(&[i; 100]).await.unwrap();
                }
                log::info!("Task2: Write");
                stream.read(&mut buf).await.unwrap();
                log::info!("Task2: Read");
                assert_eq!(&buf, b"hello world");
            }
            done.1 = true;
        };

        join!(fut1, fut2).await;
        assert!(done.0);
        assert!(done.1);
    });
}

#[test]
fn echo_with_channel() {
    let _ = env_logger::builder()
        .is_test(true)
        .filter_level(log::LevelFilter::Trace)
        .try_init();

    let (send, recv) = flume::bounded(0);
    let listener = Async::<TcpListener>::bind(([127, 0, 0, 1], 0)).unwrap();
    let addr = listener.get_ref().local_addr().unwrap();

    let th = std::thread::spawn(move || {
        block_on(async {
            let mut stream = Async::<TcpStream>::connect(addr).await.unwrap();
            send.send_async(b"deadbeef").await.unwrap();
            let mut data = vec![];
            stream.read_to_end(&mut data).await.unwrap();
            assert_eq!(data, b"deadbeef");
        });
    });

    block_on(async {
        let (mut stream, _) = listener.accept().await.unwrap();
        let msg = recv.recv_async().await.unwrap();
        stream.write_all(msg).await.unwrap();
    });

    th.join().unwrap();
}