Luigit
repositories / smith

smith

There are many coding harnesses - but this one is fast

owned by admin

xtask/tests/e2e_nightly.rs

Raw
//! Nightly report and verdict through the real binary (`SMH-SPEC-SPEC0001`, testing acceptance).

#![cfg(unix)]

use std::{fs, os::unix::fs::PermissionsExt, time::Duration};

#[test]
fn e2e_nightly_report_publishes_evidence_before_verdict_reports_findings() {
    let root = std::env::temp_dir().join(format!("smith-nightly-binary-{}", std::process::id()));
    let _ = fs::remove_dir_all(&root);
    let bin = root.join("bin");
    fs::create_dir_all(&bin).unwrap();
    // Script only external coverage machinery; report assembly and verdict
    // still run through the built xtask with real shard files.
    fs::write(
        bin.join("cargo"),
        r#"#!/bin/sh
set -eu
if [ "$1" = llvm-cov ] && [ "$2" = report ]; then
  while [ "$#" -gt 0 ]; do
    case "$1" in
      --output-path) shift; mkdir -p "$(dirname "$1")"; printf 'coverage\n' > "$1" ;;
      --output-dir) shift; mkdir -p "$1"; printf 'coverage\n' > "$1/index.html" ;;
      --summary-only) printf 'coverage summary\n' ;;
    esac
    shift
  done
fi
"#,
    )
    .unwrap();
    fs::write(bin.join("hyperfine"), "#!/bin/sh\nexit 1\n").unwrap();
    fs::write(bin.join("rustup"), "#!/bin/sh\nexit 0\n").unwrap();
    for tool in ["cargo", "hyperfine", "rustup"] {
        fs::set_permissions(bin.join(tool), fs::Permissions::from_mode(0o700)).unwrap();
    }
    for shard in 0..8 {
        let evidence = root
            .join("nightly")
            .join(shard.to_string())
            .join("mutants.out");
        fs::create_dir_all(&evidence).unwrap();
        for name in ["caught.txt", "missed.txt", "timeout.txt", "unviable.txt"] {
            fs::write(evidence.join(name), "").unwrap();
        }
        fs::write(evidence.join("outcomes.json"), "{}").unwrap();
    }
    let report = root.join("nightly/report");
    let path = std::env::join_paths(std::iter::once(bin).chain(std::env::split_paths(
        &std::env::var_os("PATH").unwrap_or_default(),
    )))
    .unwrap();
    let command = || {
        let mut command = assert_cmd::Command::new(env!("CARGO_BIN_EXE_xtask"));
        command
            .env("CARGO_TARGET_DIR", &root)
            .env("PATH", &path)
            .timeout(Duration::from_secs(10));
        command
    };
    command().args(["nightly", "report"]).assert().success();
    assert!(
        fs::read_to_string(report.join("index.md"))
            .unwrap()
            .contains("## Mutation")
    );
    command().args(["nightly", "verdict"]).assert().success();
    assert!(root.join("nightly/verdict/index.md").is_file());
    for name in ["missed.txt", "timeout.txt"] {
        fs::write(report.join(name), "finding\n").unwrap();
        let assertion = command().args(["nightly", "verdict"]).assert().code(1);
        assert!(
            String::from_utf8_lossy(&assertion.get_output().stderr)
                .contains("nightly mutation findings")
        );
        fs::write(report.join(name), "").unwrap();
    }
    fs::remove_file(report.join("index.md")).unwrap();
    command().args(["nightly", "verdict"]).assert().code(1);
    command().args(["nightly", "../escape"]).assert().code(1);
    command().arg("nightly").assert().code(1);
    assert!(!root.join("escape").exists());
    fs::remove_dir_all(root).unwrap();
}