diff --git a/contrib/devtools/deterministic-fuzz-coverage/src/main.rs b/contrib/devtools/deterministic-fuzz-coverage/src/main.rs index df52c497639..285f6cddc93 100644 --- a/contrib/devtools/deterministic-fuzz-coverage/src/main.rs +++ b/contrib/devtools/deterministic-fuzz-coverage/src/main.rs @@ -120,12 +120,12 @@ fn deterministic_coverage( .map(|entry| entry.expect("IO error")) .collect::>(); entries.sort_by_key(|entry| entry.file_name()); - let run_single = |run_id: u8, entry: &Path, thread_id: usize| -> Result { - let cov_txt_path = build_dir.join(format!("fuzz_det_cov.show.t{thread_id}.r{run_id}.txt")); - let profraw_file = build_dir.join(format!("fuzz_det_cov.t{thread_id}.r{run_id}.profraw")); - let profdata_file = build_dir.join(format!("fuzz_det_cov.t{thread_id}.r{run_id}.profdata")); - if !{ - { + let run_single = |run_id: char, entry: &Path, thread_id: usize| -> Result { + let cov_txt_path = build_dir.join(format!("fuzz_det_cov.show.t{thread_id}.{run_id}.txt")); + let profraw_file = build_dir.join(format!("fuzz_det_cov.t{thread_id}.{run_id}.profraw")); + let profdata_file = build_dir.join(format!("fuzz_det_cov.t{thread_id}.{run_id}.profdata")); + { + let output = { let mut cmd = Command::new(fuzz_exe); if using_libfuzzer { cmd.arg("-runs=1"); @@ -135,11 +135,15 @@ fn deterministic_coverage( .env("LLVM_PROFILE_FILE", &profraw_file) .env("FUZZ", fuzz_target) .arg(entry) - .status() - .map_err(|e| format!("fuzz failed with {e}"))? - .success() - } { - Err("fuzz failed".to_string())?; + .output() + .map_err(|e| format!("fuzz failed: {e}"))?; + if !output.status.success() { + Err(format!( + "fuzz failed!\nstdout:\n{}\nstderr:\n{}\n", + String::from_utf8_lossy(&output.stdout), + String::from_utf8_lossy(&output.stderr) + ))?; + } } if !Command::new(LLVM_PROFDATA) .arg("merge") @@ -210,8 +214,8 @@ The coverage was not deterministic between runs. if !entry.is_file() { Err(format!("{} should be a file", entry.display()))?; } - let cov_txt_base = run_single(0, &entry, thread_id)?; - let cov_txt_repeat = run_single(1, &entry, thread_id)?; + let cov_txt_base = run_single('a', &entry, thread_id)?; + let cov_txt_repeat = run_single('b', &entry, thread_id)?; check_diff( &cov_txt_base, &cov_txt_repeat, @@ -249,15 +253,15 @@ The coverage was not deterministic between runs. if !corpus_dir.is_dir() { Err(format!("{} should be a folder", corpus_dir.display()))?; } - let cov_txt_base = run_single(0, &corpus_dir, 0)?; - let cov_txt_repeat = run_single(1, &corpus_dir, 0)?; + let cov_txt_base = run_single('a', &corpus_dir, 0)?; + let cov_txt_repeat = run_single('b', &corpus_dir, 0)?; check_diff( &cov_txt_base, &cov_txt_repeat, &format!("All fuzz inputs in {} were used.", corpus_dir.display()), )?; } - println!("Coverage test passed for {fuzz_target}."); + println!("✨ Coverage test passed for {fuzz_target}. ✨"); Ok(()) } @@ -265,7 +269,7 @@ fn main() -> ExitCode { match app() { Ok(()) => ExitCode::SUCCESS, Err(err) => { - eprintln!("{}", err); + eprintln!("⚠️\n{}", err); ExitCode::FAILURE } } diff --git a/contrib/devtools/deterministic-unittest-coverage/src/main.rs b/contrib/devtools/deterministic-unittest-coverage/src/main.rs index 2da483aa7ff..047c8d24edd 100644 --- a/contrib/devtools/deterministic-unittest-coverage/src/main.rs +++ b/contrib/devtools/deterministic-unittest-coverage/src/main.rs @@ -71,7 +71,7 @@ fn app() -> AppResult { fn deterministic_coverage(build_dir: &Path, test_exe: &Path, filter: &str) -> AppResult { let profraw_file = build_dir.join("test_det_cov.profraw"); let profdata_file = build_dir.join("test_det_cov.profdata"); - let run_single = |run_id: u8| -> Result { + let run_single = |run_id: char| -> Result { println!("Run with id {run_id}"); let cov_txt_path = build_dir.join(format!("test_det_cov.show.{run_id}.txt")); if !Command::new(test_exe) @@ -131,10 +131,10 @@ fn deterministic_coverage(build_dir: &Path, test_exe: &Path, filter: &str) -> Ap } Ok(()) }; - let r0 = run_single(0)?; - let r1 = run_single(1)?; + let r0 = run_single('a')?; + let r1 = run_single('b')?; check_diff(&r0, &r1)?; - println!("The coverage was deterministic across two runs."); + println!("✨ The coverage was deterministic across two runs. ✨"); Ok(()) } @@ -142,7 +142,7 @@ fn main() -> ExitCode { match app() { Ok(()) => ExitCode::SUCCESS, Err(err) => { - eprintln!("{}", err); + eprintln!("⚠️\n{}", err); ExitCode::FAILURE } }