monocoque-rs 0.1.1

High-performance ZeroMQ-compatible messaging runtime built on io_uring
Documentation
use bytes::Bytes;
use monocoque::zmq::PairSocket;
use std::thread;
use std::time::Duration;

#[test]
fn test_interop_pair() {
    let (ready_tx, ready_rx) = std::sync::mpsc::channel::<std::net::SocketAddr>();
    let (result_tx, result_rx) = std::sync::mpsc::channel::<Result<(), String>>();

    thread::spawn(move || {
        compio::runtime::Runtime::new().unwrap().block_on(async {
            let listener = compio::net::TcpListener::bind("127.0.0.1:0").await.unwrap();
            let local_addr = listener.local_addr().unwrap();
            ready_tx.send(local_addr).unwrap();

            let (stream, _) = listener.accept().await.unwrap();

            let mut pair = PairSocket::from_tcp(stream).await.unwrap();

            let msg = pair.recv().await.unwrap().unwrap();
            if msg[0] != b"Ping"[..] {
                result_tx
                    .send(Err(format!("Expected Ping, got {:?}", msg[0])))
                    .unwrap();
                return;
            }

            pair.send(vec![Bytes::from_static(b"Pong")]).await.unwrap();
            result_tx.send(Ok(())).unwrap();
        });
    });

    let local_addr = ready_rx.recv().unwrap();

    let ctx = zmq::Context::new();
    let sock = ctx.socket(zmq::PAIR).unwrap();
    sock.connect(&format!("tcp://{}", local_addr)).unwrap();

    sock.send("Ping", 0).unwrap();
    sock.set_rcvtimeo(5000).unwrap();
    let msg = sock.recv_string(0).unwrap().unwrap();
    assert_eq!(msg, "Pong");

    result_rx
        .recv_timeout(Duration::from_secs(5))
        .unwrap()
        .unwrap();
}