1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
//! For compat with tokio AsyncRead and AsyncWrite.

#![cfg_attr(feature = "unstable", feature(new_uninit))]

pub mod box_future;
mod buf;

mod safe_wrapper;
mod tcp_unsafe;

#[cfg(feature = "hyper")]
pub mod hyper;

pub use safe_wrapper::StreamWrapper;
pub use tcp_unsafe::TcpStreamCompat as TcpStreamCompatUnsafe;
pub use tokio::io::{AsyncRead, AsyncReadExt, AsyncWrite, AsyncWriteExt};

pub type TcpStreamCompat = StreamWrapper<monoio::net::TcpStream>;
#[cfg(unix)]
pub type UnixStreamCompat = StreamWrapper<monoio::net::UnixStream>;

#[cfg(test)]
mod tests {

    #[monoio::test_all]
    async fn test_rw() {
        let listener = monoio::net::TcpListener::bind("127.0.0.1:0").unwrap();
        let addr = listener.local_addr().unwrap();
        let server = async move {
            let (conn, _) = listener.accept().await.unwrap();
            let mut compat_conn = TcpStreamCompat::new(conn);

            let mut buf = [0u8; 10];
            compat_conn.read_exact(&mut buf).await.unwrap();
            buf[0] += 1;
            compat_conn.write_all(&buf).await.unwrap();
        };
        let client = async {
            let conn = monoio::net::TcpStream::connect(addr).await.unwrap();
            let mut compat_conn = TcpStreamCompat::new(conn);

            let mut buf = [65u8; 10];
            compat_conn.write_all(&buf).await.unwrap();
            compat_conn.read_exact(&mut buf).await.unwrap();
            assert_eq!(buf[0], 66);
        };
        monoio::spawn(server);
        client.await;
    }

    #[monoio::test_all]
    async fn test_rw_unsafe() {
        let listener = monoio::net::TcpListener::bind("127.0.0.1:0").unwrap();
        let addr = listener.local_addr().unwrap();
        let server = async move {
            let (conn, _) = listener.accept().await.unwrap();
            let mut compat_conn = unsafe { TcpStreamCompatUnsafe::new(conn) };

            let mut buf = [0u8; 10];
            compat_conn.read_exact(&mut buf).await.unwrap();
            buf[0] += 1;
            compat_conn.write_all(&buf).await.unwrap();
        };
        let client = async {
            let conn = monoio::net::TcpStream::connect(addr).await.unwrap();
            let mut compat_conn = unsafe { TcpStreamCompatUnsafe::new(conn) };

            let mut buf = [65u8; 10];
            compat_conn.write_all(&buf).await.unwrap();
            compat_conn.read_exact(&mut buf).await.unwrap();
            assert_eq!(buf[0], 66);
        };
        monoio::spawn(server);
        client.await;
    }
}