mini-static 0.20.0

A secure, async static file server with streaming, traversal protection, and connection limits.
Documentation
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"));
}