use std::ops::{Deref, DerefMut};
#[cfg(unix)]
use std::os::unix::fs::PermissionsExt;
use crate::TariaLayer;
pub(crate) struct TestLayer {
layer: TariaLayer,
_dir: tempfile::TempDir,
}
pub(crate) fn bind_test_layer(prefix: &str, label: &str) -> TestLayer {
let mut builder = tempfile::Builder::new();
builder.prefix(prefix);
#[cfg(unix)]
builder.permissions(std::fs::Permissions::from_mode(0o700));
let dir = builder.tempdir().expect("create test socket dir");
#[cfg(not(windows))]
let path = dir.path().join(format!("{label}.sock"));
#[cfg(windows)]
let path = {
use std::sync::atomic::{AtomicUsize, Ordering};
static NEXT: AtomicUsize = AtomicUsize::new(0);
let n = NEXT.fetch_add(1, Ordering::Relaxed);
format!(r"\\.\pipe\{prefix}{}-{n}-{label}", std::process::id())
};
let layer = TariaLayer::bind_at(label, path).expect("bind test layer");
TestLayer { layer, _dir: dir }
}
impl Deref for TestLayer {
type Target = TariaLayer;
fn deref(&self) -> &TariaLayer {
&self.layer
}
}
impl DerefMut for TestLayer {
fn deref_mut(&mut self) -> &mut TariaLayer {
&mut self.layer
}
}