rasio_spec/network/
unix.rs1use std::{env::temp_dir, fs::remove_file};
2
3use futures::{executor::ThreadPool, task::SpawnExt, AsyncReadExt, AsyncWriteExt};
4use rasio::net::unix::{UnixListener, UnixStream};
5use rasio::net::NetworkDriver;
6
7use crate::async_spec;
8
9pub async fn test_unix_echo(syscall: &dyn NetworkDriver) {
10 let thread_pool = ThreadPool::new().unwrap();
11
12 let dir = temp_dir();
13 let bind_path = dir.join("echo");
14
15 if bind_path.exists() {
16 remove_file(bind_path.clone()).unwrap();
17 }
18
19 let server = UnixListener::bind_with(bind_path.clone(), syscall)
20 .await
21 .unwrap();
22
23 let message = b"hello world";
24
25 thread_pool
26 .spawn(async move {
27 let (mut stream, _) = server.accept().await.unwrap();
28
29 let mut buf = vec![0; 32];
30
31 let read_size = stream.read(&mut buf).await.unwrap();
32
33 assert_eq!(&buf[..read_size], message);
34
35 stream.write(&buf[..read_size]).await.unwrap();
36 })
37 .unwrap();
38
39 let mut client = UnixStream::connect_with(bind_path, syscall).await.unwrap();
40
41 client.write(message).await.unwrap();
42
43 let mut buf = vec![0; 32];
44
45 let read_size = client.read(&mut buf).await.unwrap();
46
47 assert_eq!(&buf[..read_size], message);
48}
49
50pub async fn run_unix_spec(syscall: &dyn NetworkDriver) {
51 async_spec!(test_unix_echo, syscall);
52}