rasi_spec/
ipc.rs

1use std::time::Duration;
2
3use futures::{executor::ThreadPool, task::SpawnExt, AsyncReadExt, AsyncWriteExt, TryStreamExt};
4use rasi::ipc::{IpcListener, IpcStream};
5
6#[cfg(windows)]
7use rasi::fs::syscall::Driver;
8#[cfg(unix)]
9use rasi::net::syscall::Driver;
10
11use crate::async_spec;
12
13pub async fn test_named_pipe(
14    #[cfg(windows)] syscall: &dyn Driver,
15    #[cfg(unix)] syscall: &dyn Driver,
16) {
17    let thread_pool = ThreadPool::new().unwrap();
18
19    let mut server = IpcListener::bind_with("rasi-named-pipe-create", 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.try_next().await.unwrap().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    std::thread::sleep(Duration::from_secs(1));
40
41    let mut client = IpcStream::connect_with("rasi-named-pipe-create", syscall)
42        .await
43        .unwrap();
44
45    client.write(message).await.unwrap();
46
47    let mut buf = vec![0; 32];
48
49    let read_size = client.read(&mut buf).await.unwrap();
50
51    assert_eq!(&buf[..read_size], message);
52}
53
54pub async fn run_ipc_spec(#[cfg(windows)] syscall: &dyn Driver, #[cfg(unix)] syscall: &dyn Driver) {
55    async_spec!(test_named_pipe, syscall);
56}