#[cfg(unix)]
use compio::net::{UnixListener, UnixStream};
#[cfg(unix)]
use std::path::Path;
#[cfg(unix)]
pub async fn connect<P: AsRef<Path>>(path: P) -> std::io::Result<UnixStream> {
UnixStream::connect(path).await
}
#[cfg(unix)]
pub async fn bind<P: AsRef<Path>>(path: P) -> std::io::Result<UnixListener> {
let path_ref = path.as_ref();
if path_ref.exists() {
std::fs::remove_file(path_ref)?;
}
UnixListener::bind(path).await
}
#[cfg(unix)]
pub async fn accept(listener: &UnixListener) -> std::io::Result<UnixStream> {
let (stream, _addr) = listener.accept().await?;
Ok(stream)
}
#[cfg(test)]
#[cfg(unix)]
mod tests {
use super::*;
#[compio::test]
async fn test_ipc_connect_bind() {
let path = "/tmp/monocoque_test_ipc.sock";
let _ = std::fs::remove_file(path);
let listener = bind(path).await.unwrap();
let accept_handle = compio::runtime::spawn(async move { accept(&listener).await });
compio::time::sleep(std::time::Duration::from_millis(10)).await;
let client = connect(path).await.unwrap();
let server = accept_handle.await.unwrap();
assert!(client.peer_addr().is_ok());
assert!(server.local_addr().is_ok());
drop(client);
drop(server);
let _ = std::fs::remove_file(path);
}
}