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}