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}