postgresql_commands/
pg_test_fsync.rsuse crate::traits::CommandBuilder;
use crate::Settings;
use std::convert::AsRef;
use std::ffi::{OsStr, OsString};
use std::path::PathBuf;
#[derive(Clone, Debug, Default)]
pub struct PgTestFsyncBuilder {
program_dir: Option<PathBuf>,
envs: Vec<(OsString, OsString)>,
filename: Option<OsString>,
secs_per_test: Option<usize>,
}
impl PgTestFsyncBuilder {
#[must_use]
pub fn new() -> Self {
Self::default()
}
pub fn from(settings: &dyn Settings) -> Self {
Self::new().program_dir(settings.get_binary_dir())
}
#[must_use]
pub fn program_dir<P: Into<PathBuf>>(mut self, path: P) -> Self {
self.program_dir = Some(path.into());
self
}
#[must_use]
pub fn filename<S: AsRef<OsStr>>(mut self, filename: S) -> Self {
self.filename = Some(filename.as_ref().to_os_string());
self
}
#[must_use]
pub fn secs_per_test(mut self, secs: usize) -> Self {
self.secs_per_test = Some(secs);
self
}
}
impl CommandBuilder for PgTestFsyncBuilder {
fn get_program(&self) -> &'static OsStr {
"pg_test_fsync".as_ref()
}
fn get_program_dir(&self) -> &Option<PathBuf> {
&self.program_dir
}
fn get_args(&self) -> Vec<OsString> {
let mut args: Vec<OsString> = Vec::new();
if let Some(filename) = &self.filename {
args.push("-f".into());
args.push(filename.into());
}
if let Some(secs) = &self.secs_per_test {
args.push("-s".into());
args.push(secs.to_string().into());
}
args
}
fn get_envs(&self) -> Vec<(OsString, OsString)> {
self.envs.clone()
}
fn env<S: AsRef<OsStr>>(mut self, key: S, value: S) -> Self {
self.envs
.push((key.as_ref().to_os_string(), value.as_ref().to_os_string()));
self
}
}
#[cfg(test)]
mod tests {
use super::*;
use crate::traits::CommandToString;
use crate::TestSettings;
use test_log::test;
#[test]
fn test_builder_new() {
let command = PgTestFsyncBuilder::new().program_dir(".").build();
assert_eq!(
PathBuf::from(".").join("pg_test_fsync"),
PathBuf::from(command.to_command_string().replace('"', ""))
);
}
#[test]
fn test_builder_from() {
let command = PgTestFsyncBuilder::from(&TestSettings).build();
#[cfg(not(target_os = "windows"))]
let command_prefix = r#""./pg_test_fsync""#;
#[cfg(target_os = "windows")]
let command_prefix = r#"".\\pg_test_fsync""#;
assert_eq!(format!("{command_prefix}"), command.to_command_string());
}
#[test]
fn test_builder() {
let command = PgTestFsyncBuilder::new()
.env("PGDATABASE", "database")
.filename("filename")
.secs_per_test(10)
.build();
#[cfg(not(target_os = "windows"))]
let command_prefix = r#"PGDATABASE="database" "#;
#[cfg(target_os = "windows")]
let command_prefix = String::new();
assert_eq!(
format!(r#"{command_prefix}"pg_test_fsync" "-f" "filename" "-s" "10""#),
command.to_command_string()
);
}
}