diff --git a/fuzz/Cargo.toml b/fuzz/Cargo.toml index 076e274ec..dfb62aba5 100644 --- a/fuzz/Cargo.toml +++ b/fuzz/Cargo.toml @@ -12,6 +12,7 @@ libfuzzer-sys = "0.4" libc = "0.2" tempfile = "3" rand = { version = "0.8", features = ["small_rng"] } +similar = "2" uucore = { path = "../src/uucore/" } uu_date = { path = "../src/uu/date/" } diff --git a/fuzz/fuzz_targets/fuzz_common.rs b/fuzz/fuzz_targets/fuzz_common.rs index e8cac8d40..cf56268d7 100644 --- a/fuzz/fuzz_targets/fuzz_common.rs +++ b/fuzz/fuzz_targets/fuzz_common.rs @@ -7,6 +7,7 @@ use libc::STDIN_FILENO; use libc::{close, dup, dup2, pipe, STDERR_FILENO, STDOUT_FILENO}; use rand::prelude::SliceRandom; use rand::Rng; +use similar::TextDiff; use std::ffi::OsString; use std::io::{Seek, SeekFrom, Write}; use std::os::fd::{AsRawFd, RawFd}; @@ -321,12 +322,14 @@ pub fn compare_result( discrepancies.push("stdout differs"); println!("Rust stdout: {}", rust_result.stdout); println!("GNU stdout: {}", gnu_result.stdout); + print_diff(&rust_result.stdout, &gnu_result.stdout); should_panic = true; } if rust_result.stderr.trim() != gnu_result.stderr.trim() { discrepancies.push("stderr differs"); println!("Rust stderr: {}", rust_result.stderr); println!("GNU stderr: {}", gnu_result.stderr); + print_diff(&rust_result.stderr, &gnu_result.stderr); if fail_on_stderr_diff { should_panic = true; } @@ -353,6 +356,16 @@ pub fn compare_result( } } +/// When we have different outputs, print the diff +fn print_diff(rust_output: &str, gnu_output: &str) { + println!("Diff="); + let diff = TextDiff::from_lines(rust_output, gnu_output); + for change in diff.iter_all_changes() { + print!("{}{}", change.tag(), change); + } + println!(); +} + pub fn generate_random_string(max_length: usize) -> String { let mut rng = rand::thread_rng(); let valid_utf8: Vec = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"