local_socket/
lib.rs

1mod connection;
2mod error;
3mod server;
4
5pub use connection::SocketConnection;
6pub use error::SocketError;
7pub use server::SocketServer;
8
9#[cfg(test)]
10mod tests {
11    use super::*;
12    use futures_util::StreamExt;
13    use temp_dir::TempDir;
14
15    #[tokio::test]
16    async fn it_works() {
17        let dir = TempDir::new().unwrap();
18        let socket = dir.path().join("foobar.socket");
19        let mut server = SocketServer::listen(socket.clone()).unwrap();
20        tokio::task::spawn(async move {
21            let mut client = SocketConnection::connect(socket).await.unwrap();
22            loop {
23                let msg = client.next().await.unwrap().unwrap();
24                let msg = std::str::from_utf8(&msg).unwrap();
25                assert_eq!(msg, "ping");
26                client.write("pong".into()).unwrap();
27                client.write("pong".into()).unwrap();
28            }
29        });
30        let mut conn = server.next().await.unwrap().unwrap();
31        let mut i = 0;
32        loop {
33            i += 1;
34            conn.write("ping".into()).unwrap();
35            conn.write("ping".into()).unwrap();
36            let msg = conn.next().await.unwrap().unwrap();
37            let msg = std::str::from_utf8(&msg).unwrap();
38            assert_eq!(msg, "pong");
39            if i % 1000 == 0 {
40                break;
41            }
42        }
43    }
44
45    #[tokio::test]
46    async fn multiple_clients() {
47        let dir = TempDir::new().unwrap();
48        let socket = dir.path().join("foobar.socket");
49        let mut server = SocketServer::listen(socket.clone()).unwrap();
50        for _ in 0..10 {
51            let socket = socket.clone();
52            tokio::task::spawn(async move {
53                let mut client = SocketConnection::connect(socket).await.unwrap();
54                loop {
55                    let msg = client.next().await.unwrap().unwrap();
56                    let msg = std::str::from_utf8(&msg).unwrap();
57                    assert_eq!(msg, "ping");
58                    client.write("pong".into()).unwrap();
59                }
60            });
61        }
62        async fn handle_conn(mut conn: SocketConnection) {
63            let mut i = 0;
64            loop {
65                i += 1;
66                conn.write("ping".into()).unwrap();
67                let msg = conn.next().await.unwrap().unwrap();
68                let msg = std::str::from_utf8(&msg).unwrap();
69                assert_eq!(msg, "pong");
70                if i % 10 == 0 {
71                    break;
72                }
73            }
74        }
75        let mut conn = Vec::new();
76        for _ in 0..10 {
77            conn.push(server.next().await.unwrap().unwrap());
78        }
79        tokio::join!(
80            handle_conn(conn.pop().unwrap()),
81            handle_conn(conn.pop().unwrap()),
82            handle_conn(conn.pop().unwrap()),
83            handle_conn(conn.pop().unwrap()),
84            handle_conn(conn.pop().unwrap()),
85            handle_conn(conn.pop().unwrap()),
86            handle_conn(conn.pop().unwrap()),
87            handle_conn(conn.pop().unwrap()),
88            handle_conn(conn.pop().unwrap()),
89            handle_conn(conn.pop().unwrap()),
90        );
91    }
92}