use std::{
io,
path::{Path, PathBuf},
};
#[derive(Debug)]
pub struct FixtureDirectory {
directory: crate::owned_directory::OwnedDirectory,
}
impl FixtureDirectory {
pub fn new(parent: &Path, prefix: &str) -> io::Result<Self> {
Ok(Self {
directory: crate::owned_directory::OwnedDirectory::new(create_fixture_directory(
parent, prefix,
)?),
})
}
#[must_use]
pub fn path(&self) -> &Path {
self.directory.path()
}
}
impl Drop for FixtureDirectory {
fn drop(&mut self) {
if std::thread::panicking() {
self.directory.disarm();
eprintln!(
"Failed test fixture retained: {}",
self.directory.path().display()
);
}
}
}
pub fn create_fixture_directory(parent: &Path, prefix: &str) -> io::Result<PathBuf> {
crate::directory::validate_options(prefix, 0o700)?;
let parent = parent.canonicalize()?;
crate::directory::create_unique_directory(&parent, prefix, 0o700, None)
}
#[cfg(unix)]
pub fn create_fifo(path: &Path, permissions: Option<u32>) -> io::Result<()> {
let mut command = std::process::Command::new("/usr/bin/mkfifo");
command.env_clear();
if let Some(permissions) = permissions {
command.args(["-m", &format!("{permissions:o}")]);
}
let status = command.arg(path).status()?;
if status.success() {
Ok(())
} else {
Err(io::Error::other(format!(
"FIFO fixture creation failed: {status}"
)))
}
}
#[cfg(test)]
mod tests;