cargo-test-fuzz 0.1.0-alpha.14

cargo-test-fuzz
use assert_cmd::prelude::*;
use dirs::corpus_directory_from_target;
use predicates::prelude::*;
use std::{fs::remove_dir_all, process::Command};

const TEST_DIR: &str = "../examples";

const TIMEOUT: &str = "60";

#[test]
fn fuzz_assert() {
    fuzz("assert", false)
}

#[test]
fn fuzz_qwerty() {
    fuzz("qwerty", true)
}

fn fuzz(name: &str, persistent: bool) {
    let corpus = corpus_directory_from_target(name, &format!("{}::target", name));

    remove_dir_all(&corpus).unwrap_or_default();

    Command::new("cargo")
        .current_dir(TEST_DIR)
        .args(&["test", "--", "--test", name])
        .assert()
        .success();

    let mut command = Command::cargo_bin("cargo-test-fuzz").unwrap();

    let mut args = vec![
        "test-fuzz",
        "--target",
        name,
        "--no-ui",
        "--run-until-crash",
    ];
    if persistent {
        args.push("--persistent");
    }
    args.extend_from_slice(&["--", "-V", TIMEOUT]);

    command
        .current_dir(TEST_DIR)
        .args(&args)
        .assert()
        .success()
        .stdout(
            predicate::str::contains("+++ Testing aborted programmatically +++")
                .and(predicate::str::contains("Time limit was reached").not()),
        );
}