local-runtime 0.2.1

Thread-local async runtime
Documentation
use std::net::UdpSocket;

use local_runtime::{block_on, io::Async, join};

#[test]
fn unconnected() {
    let socket1 = Async::<UdpSocket>::bind(([127, 0, 0, 1], 0)).unwrap();
    let addr1 = socket1.get_ref().local_addr().unwrap();
    let socket2 = Async::<UdpSocket>::bind(([127, 0, 0, 1], 0)).unwrap();
    let addr2 = socket2.get_ref().local_addr().unwrap();

    block_on(async {
        let fut1 = async {
            let mut data = [0u8; 5];
            let (n, addr) = socket1.recv_from(&mut data).await.unwrap();
            assert_eq!(&data, b"hello");
            assert_eq!(n, 5);
            assert_eq!(addr, addr2);
        };

        let fut2 = async {
            socket2.send_to(b"hello", addr1).await.unwrap();
        };

        join!(fut1, fut2).await;
    });
}

#[test]
fn connected() {
    let socket1 = Async::<UdpSocket>::bind(([127, 0, 0, 1], 0)).unwrap();
    let addr1 = socket1.get_ref().local_addr().unwrap();
    let socket2 = Async::<UdpSocket>::bind(([127, 0, 0, 1], 0)).unwrap();
    let addr2 = socket2.get_ref().local_addr().unwrap();

    block_on(async {
        let fut1 = async {
            socket1.connect(addr2).unwrap();
            let mut data = [0u8; 5];
            let n = socket1.recv(&mut data).await.unwrap();
            assert_eq!(&data, b"hello");
            assert_eq!(n, 5);
        };

        let fut2 = async {
            socket2.connect(addr1).unwrap();
            socket2.send(b"hello").await.unwrap();
        };

        join!(fut1, fut2).await;
    });
}

#[test]
fn loopback() {
    let socket = Async::<UdpSocket>::bind(([127, 0, 0, 1], 0)).unwrap();
    let addr = socket.get_ref().local_addr().unwrap();
    socket.connect(addr).unwrap();

    block_on(async {
        let fut1 = async {
            let mut data = [0u8; 5];
            let n = socket.recv(&mut data).await.unwrap();
            assert_eq!(&data, b"hello");
            assert_eq!(n, 5);
            let n = socket.recv(&mut data).await.unwrap();
            assert_eq!(&data, b"hello");
            assert_eq!(n, 5);
        };

        let fut2 = async {
            socket.send(b"hello").await.unwrap();
            socket.send(b"hello").await.unwrap();
        };

        join!(fut1, fut2).await;
    });
}