strest 0.1.10

Blazing-fast async HTTP load tester in Rust - lock-free design, real-time stats, distributed runs, and optional chart exports for high-load API testing.
Documentation
use std::io::Write;

use tempfile::NamedTempFile;

use crate::error::AppResult;

use super::validate::validate_plugin_module;

fn write_wasm_module(wat: &str) -> AppResult<(NamedTempFile, String, Vec<u8>)> {
    let wasm_bytes = wat::parse_str(wat)
        .map_err(|err| crate::error::AppError::script(format!("failed to parse WAT: {}", err)))?;

    let mut file = NamedTempFile::new().map_err(|err| {
        crate::error::AppError::script(format!("failed to create tempfile: {}", err))
    })?;
    file.write_all(&wasm_bytes).map_err(|err| {
        crate::error::AppError::script(format!("failed to write tempfile: {}", err))
    })?;
    let path = file
        .path()
        .to_str()
        .ok_or_else(|| crate::error::AppError::script("temp path is not valid UTF-8"))?
        .to_owned();
    Ok((file, path, wasm_bytes))
}

#[test]
fn validate_plugin_allows_wasi_imports() -> AppResult<()> {
    let wat = r#"
        (module
          (import "wasi_snapshot_preview1" "proc_exit" (func $proc_exit (param i32)))
          (func (export "_start")
            i32.const 0
            call $proc_exit))
    "#;
    let (_file, path, wasm_bytes) = write_wasm_module(wat)?;
    validate_plugin_module(&path, &wasm_bytes)?;
    Ok(())
}

#[test]
fn validate_plugin_rejects_non_wasi_imports() -> AppResult<()> {
    let wat = r#"
        (module
          (import "env" "log" (func $log (param i32))))
    "#;
    let (_file, path, wasm_bytes) = write_wasm_module(wat)?;
    let result = validate_plugin_module(&path, &wasm_bytes);
    if result.is_ok() {
        return Err(crate::error::AppError::script(
            "expected non-wasi import validation to fail",
        ));
    }
    Ok(())
}