diff --git a/src/process.rs b/src/process.rs index 443ffd8..e27f0a5 100644 --- a/src/process.rs +++ b/src/process.rs @@ -10,6 +10,7 @@ use std::ffi::OsStr; use tokio::process::Command; use tracing::warn; +#[cfg(not(test))] pub async fn script_exit_code(executable: &str, args: &[impl AsRef]) -> Result { // Run given script and return the exit code let mut child = Command::new(executable).args(args).spawn()?; @@ -17,6 +18,14 @@ pub async fn script_exit_code(executable: &str, args: &[impl AsRef]) -> R status.code().ok_or(anyhow!("Killed by signal")) } +#[cfg(test)] +pub async fn script_exit_code(executable: &str, args: &[impl AsRef]) -> Result { + let test = crate::testing::current(); + let args: Vec<&OsStr> = args.iter().map(|arg| arg.as_ref()).collect(); + let cb = &test.process_cb; + cb(executable, args.as_ref()).map(|(res, _)| res) +} + pub async fn run_script(name: &str, executable: &str, args: &[impl AsRef]) -> Result<()> { // Run given script to get exit code and return true on success. // Return Err on failure, but also print an error if needed @@ -33,6 +42,7 @@ pub async fn run_script(name: &str, executable: &str, args: &[impl AsRef] } } +#[cfg(not(test))] pub async fn script_output(executable: &str, args: &[impl AsRef]) -> Result { // Run given command and return the output given let output = Command::new(executable).args(args).output(); @@ -42,3 +52,11 @@ pub async fn script_output(executable: &str, args: &[impl AsRef]) -> Resu let s = std::str::from_utf8(&output.stdout)?; Ok(s.to_string()) } + +#[cfg(test)] +pub async fn script_output(executable: &str, args: &[impl AsRef]) -> Result { + let test = crate::testing::current(); + let args: Vec<&OsStr> = args.iter().map(|arg| arg.as_ref()).collect(); + let cb = &test.process_cb; + cb(executable, args.as_ref()).map(|(_, res)| res) +} diff --git a/src/testing.rs b/src/testing.rs index 0276d09..042434d 100644 --- a/src/testing.rs +++ b/src/testing.rs @@ -1,4 +1,6 @@ +use anyhow::{anyhow, Result}; use std::cell::RefCell; +use std::ffi::OsStr; use std::path::Path; use std::rc::Rc; use tempfile::{tempdir, TempDir}; @@ -12,6 +14,7 @@ pub fn start() -> TestHandle { assert!(lock.borrow().as_ref().is_none()); let test: Rc = Rc::new(Test { base: tempdir().expect("Couldn't create test directory"), + process_cb: |_, _| Err(anyhow!("No current process_cb")), }); *lock.borrow_mut() = Some(test.clone()); TestHandle { test } @@ -28,6 +31,7 @@ pub fn current() -> Rc { pub struct Test { base: TempDir, + pub process_cb: fn(&str, &[&OsStr]) -> Result<(i32, String)>, } pub struct TestHandle {