test: proptest property testing + cargo-fuzz fuzzing for donglora-cobs

This commit is contained in:
swaits committed 2026-03-30 10:57:57 -06:00
1 parent 1fbbf110bc
commit d7bb127d92
8 files changed
+567 -9

No files matched your search

+24
View File
@@ -0,0 +1,24 @@
[package]
name = "donglora-cobs-fuzz"
version = "0.0.0"
publish = false
edition = "2021"
[package.metadata]
cargo-fuzz = true
[dependencies]
libfuzzer-sys = "0.4"
donglora-cobs = { path = ".." }
[[bin]]
name = "fuzz_decode"
path = "fuzz_targets/fuzz_decode.rs"
test = false
doc = false
[[bin]]
name = "fuzz_roundtrip"
path = "fuzz_targets/fuzz_roundtrip.rs"
test = false
doc = false
@@ -0,0 +1,9 @@
//! Fuzz target: feed arbitrary bytes to decode(). Must never panic.
#![no_main]
use libfuzzer_sys::fuzz_target;
fuzz_target!(|data: &[u8]| {
let mut buf = [0u8; 2048];
// Must not panic — may return None on invalid input.
let _ = donglora_cobs::decode(data, &mut buf);
});
@@ -0,0 +1,30 @@
//! Fuzz target: encode then decode arbitrary input. Output must match input.
#![no_main]
use libfuzzer_sys::fuzz_target;
fuzz_target!(|data: &[u8]| {
if data.len() > 1024 {
return; // skip huge inputs to keep fuzzing fast
}
let max_enc = donglora_cobs::max_encoded_len(data.len()) + 1;
let mut enc_buf = vec![0u8; max_enc];
let enc_len = match donglora_cobs::encode(data, &mut enc_buf) {
Some(n) => n,
None => return, // encode failed (buffer too small shouldn't happen, but skip)
};
let encoded = &enc_buf[..enc_len];
// Encoded output must never contain 0x00.
assert!(!encoded.contains(&0x00), "encoded contains sentinel");
let mut dec_buf = vec![0u8; data.len() + 1];
let dec_len = donglora_cobs::decode(encoded, &mut dec_buf)
.expect("decode failed after successful encode");
assert_eq!(
&dec_buf[..dec_len], data,
"round-trip mismatch: encode→decode produced different output"
);
});