use super::*;
use tempfile::TempDir;
fn sh_args(script: &str) -> Vec<OsString> {
vec![OsString::from("-c"), OsString::from(script)]
}
#[tokio::test]
async fn succeeds_when_process_writes_output_and_exits_zero() {
let dir = TempDir::new().unwrap();
let output = dir.path().join("out.txt");
let script = format!("printf hi > {}", output.display());
let result = execute(
"sh-test",
"n/a",
"sh",
&sh_args(&script),
&output,
TOOL_TIMEOUT,
)
.await;
assert!(result.is_ok(), "{result:?}");
}
#[tokio::test]
async fn maps_nonzero_exit_to_exit_non_zero_with_captured_stderr() {
let dir = TempDir::new().unwrap();
let output = dir.path().join("out.txt");
let result = execute(
"sh-test",
"n/a",
"sh",
&sh_args("echo boom 1>&2; exit 3"),
&output,
TOOL_TIMEOUT,
)
.await;
match result {
Err(ToolError::ExitNonZero { code, stderr, .. }) => {
assert_eq!(code, Some(3));
assert!(stderr.contains("boom"), "stderr was: {stderr}");
}
other => panic!("expected ExitNonZero, got {other:?}"),
}
}
#[tokio::test]
async fn maps_missing_binary_to_not_found() {
let dir = TempDir::new().unwrap();
let output = dir.path().join("out.txt");
let result = execute(
"missing-test",
"install it from nowhere",
"definitely-not-a-real-binary-9f3c2a",
&[],
&output,
TOOL_TIMEOUT,
)
.await;
assert!(
matches!(result, Err(ToolError::NotFound { .. })),
"{result:?}"
);
}
#[tokio::test]
async fn zero_exit_with_no_output_file_is_no_output() {
let dir = TempDir::new().unwrap();
let output = dir.path().join("out.txt");
let result = execute(
"sh-test",
"n/a",
"sh",
&sh_args("true"),
&output,
TOOL_TIMEOUT,
)
.await;
assert!(
matches!(result, Err(ToolError::NoOutput { .. })),
"{result:?}"
);
}
#[tokio::test]
async fn timed_out_process_is_reported() {
let dir = TempDir::new().unwrap();
let output = dir.path().join("out.txt");
let result = execute(
"sh-test",
"n/a",
"sh",
&sh_args("sleep 5"),
&output,
Duration::from_millis(50),
)
.await;
assert!(
matches!(result, Err(ToolError::TimedOut { .. })),
"{result:?}"
);
}
#[test]
fn locates_a_binary_known_to_exist_on_path() {
assert!(
locate_on_path("sh"),
"sh should be on PATH in any test environment"
);
}
#[test]
fn does_not_locate_a_nonexistent_binary() {
assert!(!locate_on_path("definitely-not-a-real-binary-9f3c2a"));
}