rasio_spec/network/
unix.rs

1use 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}