Skip to content

Commit 0c79864

Browse files
authored
tests(fuzz): Add parse_duration fuzzing target (#1129)
Add a fuzzing target for parsing into a Duration.
1 parent 52046b9 commit 0c79864

2 files changed

Lines changed: 38 additions & 0 deletions

File tree

fuzz/Cargo.toml

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,3 +35,10 @@ path = "fuzzers/parse_date.rs"
3535
test = false
3636
doc = false
3737
bench = false
38+
39+
[[bin]]
40+
name = "parse_duration"
41+
path = "fuzzers/parse_duration.rs"
42+
test = false
43+
doc = false
44+
bench = false

fuzz/fuzzers/parse_duration.rs

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
#![no_main]
2+
3+
use libfuzzer_sys::fuzz_target;
4+
5+
fuzz_target!(|data: &[u8]| test_parse_duration(data));
6+
7+
pub fn test_parse_duration(data: &[u8]) {
8+
use std::str::from_utf8;
9+
use std::str::FromStr;
10+
11+
// input must be text
12+
let Ok(original_text) = from_utf8(data) else {
13+
return;
14+
};
15+
16+
// parse input as a duration
17+
let Ok(duration) = prost_types::Duration::from_str(original_text) else {
18+
if original_text.ends_with("s") {
19+
assert!(
20+
original_text.parse::<f64>().is_err(),
21+
"prost failed to parse duration, but it seems to be a valid number: {}",
22+
original_text
23+
);
24+
}
25+
return;
26+
};
27+
28+
// roundtrip to and from string
29+
let roundtrip_text = format!("{duration}");
30+
assert_eq!(Ok(&duration), roundtrip_text.parse().as_ref());
31+
}

0 commit comments

Comments
 (0)