#![allow(
clippy::unwrap_used,
reason = "a test helper: a fake daemon that cannot start fails the test"
)]
use std::path::PathBuf;
use std::sync::atomic::{AtomicU32, Ordering};
use std::time::Duration;
use runnerd_core::client::{Client, Timeouts};
#[derive(Debug)]
pub(crate) struct Fake {
dir: PathBuf,
socket: PathBuf,
server: tokio::task::JoinHandle<()>,
}
impl Fake {
pub(crate) fn serve(router: axum::Router) -> Fake {
static NEXT: AtomicU32 = AtomicU32::new(0);
let dir = std::env::temp_dir().join(format!(
"runnerctl-unit-{}-{}",
std::process::id(),
NEXT.fetch_add(1, Ordering::Relaxed)
));
let _ = std::fs::remove_dir_all(&dir);
std::fs::create_dir_all(&dir).unwrap();
let socket = dir.join("runnerd.sock");
let server = serve(&socket, router);
Fake {
dir,
socket,
server,
}
}
pub(crate) async fn stop(&mut self) {
self.server.abort();
let _ = (&mut self.server).await;
}
pub(crate) fn serve_again(&mut self, router: axum::Router) {
std::fs::remove_file(&self.socket).unwrap();
self.server = serve(&self.socket, router);
}
pub(crate) fn client(&self, request: Duration, idle: Duration) -> Client {
Client::new(self.socket.clone()).with_timeouts(Timeouts { request, idle })
}
}
fn serve(socket: &std::path::Path, router: axum::Router) -> tokio::task::JoinHandle<()> {
let listener = tokio::net::UnixListener::bind(socket).unwrap();
tokio::spawn(async move {
let _ = axum::serve(listener, router).await;
})
}
impl Drop for Fake {
fn drop(&mut self) {
let _ = std::fs::remove_dir_all(&self.dir);
}
}