nio 0.1.4

Async runtime for Rust
Documentation
#![warn(rust_2018_idioms)]
#![cfg(not(target_os = "wasi"))] // Wasi does not support bind()
#![cfg(not(miri))]

use nio::{net::TcpListener, test};

use std::io::{Result, prelude::*};
use std::net::TcpStream;
use std::thread;

mod support {
    pub mod futures;
}
use support::futures::test::assert_ok;

#[test]
async fn echo_server() -> Result<()> {
    const N: usize = 1024;

    let mut srv = TcpListener::bind("127.0.0.1:0").await?;
    let addr = srv.local_addr()?;

    let msg = "foo bar baz";

    let t = thread::spawn(move || {
        let mut s = assert_ok!(TcpStream::connect(addr));

        let t2 = thread::spawn(move || {
            let mut s = assert_ok!(TcpStream::connect(addr));
            let mut b = vec![0; msg.len() * N];
            assert_ok!(s.read_exact(&mut b));
            b
        });

        let mut expected = Vec::<u8>::new();
        for _i in 0..N {
            expected.extend(msg.as_bytes());
            let res = assert_ok!(s.write(msg.as_bytes()));
            assert_eq!(res, msg.len());
        }

        (expected, t2)
    });

    let mut a = srv.accept().await?.connect().await?;
    let mut b = srv.accept().await?.connect().await?;

    let n = futures_lite::io::copy(&mut a, &mut b).await?;

    let (expected, t2) = t.join().unwrap();
    let actual = t2.join().unwrap();

    assert!(expected == actual);
    assert_eq!(n, msg.len() as u64 * 1024);

    Ok(())
}