Skip to content

Commit

Permalink
improve the test fuzzer
Browse files Browse the repository at this point in the history
  • Loading branch information
sylvestre committed Jun 2, 2023
1 parent b8658ef commit 4a480dd
Showing 1 changed file with 95 additions and 23 deletions.
118 changes: 95 additions & 23 deletions fuzz/fuzz_targets/fuzz_test.rs
Original file line number Diff line number Diff line change
Expand Up @@ -51,57 +51,128 @@ struct TestArg {
arg_type: String,
}

fn generate_test_arg() -> String {
let mut rng = rand::thread_rng();
let test_args = vec![
fn generate_random_path(rng: &mut dyn rand::RngCore) -> &'static str {
match rng.gen_range(0..=3) {
0 => "/dev/null",
1 => "/dev/random",
2 => "/tmp",
_ => "/dev/urandom",
}
}

fn generate_test_args() -> Vec<TestArg> {
vec![
TestArg {
arg: "-z".to_string(),
arg_type: "STRING".to_string(),
},
TestArg {
arg: "-n".to_string(),
arg_type: "STRING".to_string(),
},
TestArg {
arg: "=".to_string(),
arg_type: "STRING1,STRING2".to_string(),
arg_type: "STRING,STRING".to_string(),
},
TestArg {
arg: "!=".to_string(),
arg_type: "STRING,STRING".to_string(),
},
TestArg {
arg: "-eq".to_string(),
arg_type: "INTEGER,INTEGER".to_string(),
},
TestArg {
arg: "-ne".to_string(),
arg_type: "INTEGER,INTEGER".to_string(),
},
TestArg {
arg: "-gt".to_string(),
arg_type: "INTEGER,INTEGER".to_string(),
},
TestArg {
arg: "-ge".to_string(),
arg_type: "INTEGER,INTEGER".to_string(),
},
TestArg {
arg: "-lt".to_string(),
arg_type: "INTEGER,INTEGER".to_string(),
},
TestArg {
arg: "-le".to_string(),
arg_type: "INTEGER,INTEGER".to_string(),
},
TestArg {
arg: "-f".to_string(),
arg_type: "FILE".to_string(),
},
// Add more TestArg structs for all possible arguments
];
TestArg {
arg: "-d".to_string(),
arg_type: "FILE".to_string(),
},
TestArg {
arg: "-e".to_string(),
arg_type: "FILE".to_string(),
},
TestArg {
arg: "-ef".to_string(),
arg_type: "FILE,FILE".to_string(),
},
TestArg {
arg: "-nt".to_string(),
arg_type: "FILE,FILE".to_string(),
},
]
}

fn generate_test_arg() -> String {
let mut rng = rand::thread_rng();
let test_args = generate_test_args();
let mut arg = String::new();

let choice = rng.gen_range(0..=3);
let choice = rng.gen_range(0..=5);

match choice {
0 => {
arg.push_str(&rng.gen_range(-100..=100).to_string());
}
1 => {
1 | 2 | 3 => {
let test_arg = test_args
.choose(&mut rng)
.expect("Failed to choose a random test argument");
arg.push_str(&test_arg.arg);
if test_arg.arg_type.contains("INTEGER") {
arg.push_str(&rng.gen_range(-100..=100).to_string());
arg.push_str(&test_arg.arg);
arg.push_str(&rng.gen_range(-100..=100).to_string());
arg.push_str(&format!(
"{} {} {}",
&rng.gen_range(-100..=100).to_string(),
test_arg.arg,
&rng.gen_range(-100..=100).to_string()
));
} else if test_arg.arg_type.contains("STRING,STRING") {
let random_str = generate_random_string(rng.gen_range(1..=10));
let random_str2 = generate_random_string(rng.gen_range(1..=10));

arg.push_str(&format!(
"{} {} {}",
&random_str, test_arg.arg, &random_str2
));
} else if test_arg.arg_type.contains("STRING") {
let random_str = generate_random_string(rng.gen_range(1..=10));
arg.push_str(&random_str);
arg.push_str(&format!("{} {}", test_arg.arg, &random_str));
} else if test_arg.arg_type.contains("FILE,FILE") {
let path = generate_random_path(&mut rng);
let path2 = generate_random_path(&mut rng);
arg.push_str(&format!("{} {} {}", path, test_arg.arg, path2));
} else if test_arg.arg_type.contains("FILE") {
let choice = rng.gen_range(0..=2);
let path = match choice {
0 => "/dev/null",
1 => "/dev/random",
_ => "/dev/urandom",
};
arg.push_str(&format!("{}{}", test_arg.arg, path));
let path = generate_random_path(&mut rng);
arg.push_str(&format!("{} {}", test_arg.arg, path));
}
}
2 => {
4 => {
let random_str = generate_random_string(rng.gen_range(1..=10));
arg.push_str(&random_str);
}
_ => {
let choice = rng.gen_range(0..=2);
let path = match choice {
let path = match rng.gen_range(0..=2) {
0 => "/dev/null",
1 => "/dev/random",
_ => "/dev/urandom",
Expand Down Expand Up @@ -192,6 +263,7 @@ fuzz_target!(|_data: &[u8]| {
println!("GNU output: {}", gnu_output);
println!("My exit status: {}", uumain_exit_status);
println!("GNU exit status: {}", gnu_exit_status);
panic!();
} else {
println!(
"Outputs and exit statuses matched for expression {:?}",
Expand Down

0 comments on commit 4a480dd

Please sign in to comment.