use oxiproto_core::wire::DecodeBuffer;
use proptest::prelude::*;
proptest! {
#[test]
fn fuzz_varint_decode_no_panic(
bytes in proptest::collection::vec(any::<u8>(), 0..20)
) {
let mut buf = DecodeBuffer::new(&bytes);
let _ = buf.read_varint(); }
#[test]
fn fuzz_varint32_decode_no_panic(
bytes in proptest::collection::vec(any::<u8>(), 0..20)
) {
let mut buf = DecodeBuffer::new(&bytes);
let _ = buf.read_varint32();
}
#[test]
fn fuzz_tag_decode_no_panic(
bytes in proptest::collection::vec(any::<u8>(), 0..20)
) {
let mut buf = DecodeBuffer::new(&bytes);
let _ = buf.read_tag();
}
#[test]
fn fuzz_length_delimited_no_panic(
bytes in proptest::collection::vec(any::<u8>(), 0..100)
) {
let mut buf = DecodeBuffer::new(&bytes);
let _ = buf.read_length_delimited();
}
#[test]
fn fuzz_string_decode_no_panic(
bytes in proptest::collection::vec(any::<u8>(), 0..100)
) {
let mut buf = DecodeBuffer::new(&bytes);
let _ = buf.read_string();
}
#[test]
fn fuzz_fixed32_decode_no_panic(
bytes in proptest::collection::vec(any::<u8>(), 0..20)
) {
let mut buf = DecodeBuffer::new(&bytes);
let _ = buf.read_fixed32();
}
#[test]
fn fuzz_fixed64_decode_no_panic(
bytes in proptest::collection::vec(any::<u8>(), 0..20)
) {
let mut buf = DecodeBuffer::new(&bytes);
let _ = buf.read_fixed64();
}
#[test]
fn fuzz_float_decode_no_panic(
bytes in proptest::collection::vec(any::<u8>(), 0..20)
) {
let mut buf = DecodeBuffer::new(&bytes);
let _ = buf.read_float();
}
#[test]
fn fuzz_double_decode_no_panic(
bytes in proptest::collection::vec(any::<u8>(), 0..20)
) {
let mut buf = DecodeBuffer::new(&bytes);
let _ = buf.read_double();
}
#[test]
fn fuzz_bool_decode_no_panic(
bytes in proptest::collection::vec(any::<u8>(), 0..20)
) {
let mut buf = DecodeBuffer::new(&bytes);
let _ = buf.read_bool();
}
#[test]
fn fuzz_truncated_length_delimited_no_panic(
claimed_len in 0u64..=(1u64 << 32),
body in proptest::collection::vec(any::<u8>(), 0..10)
) {
let mut bytes: Vec<u8> = Vec::new();
let mut v = claimed_len;
loop {
let byte = (v & 0x7F) as u8;
v >>= 7;
if v != 0 {
bytes.push(byte | 0x80);
} else {
bytes.push(byte);
break;
}
}
bytes.extend_from_slice(&body);
let mut buf = DecodeBuffer::new(&bytes);
let _ = buf.read_length_delimited(); }
#[test]
fn fuzz_all_0xff_no_panic(len in 1usize..50) {
let bytes = vec![0xFF_u8; len];
let mut buf = DecodeBuffer::new(&bytes);
let _ = buf.read_varint();
}
#[test]
fn fuzz_all_0x80_no_panic(len in 1usize..50) {
let bytes = vec![0x80_u8; len];
let mut buf = DecodeBuffer::new(&bytes);
let _ = buf.read_varint();
}
#[test]
fn fuzz_empty_input_no_panic(_unused in 0u8..1u8) {
let bytes: &[u8] = &[];
let mut buf = DecodeBuffer::new(bytes);
let _ = buf.read_varint();
let mut buf = DecodeBuffer::new(bytes);
let _ = buf.read_tag();
let mut buf = DecodeBuffer::new(bytes);
let _ = buf.read_length_delimited();
let mut buf = DecodeBuffer::new(bytes);
let _ = buf.read_fixed32();
let mut buf = DecodeBuffer::new(bytes);
let _ = buf.read_fixed64();
}
#[test]
fn fuzz_repeated_varint_decode_no_panic(
bytes in proptest::collection::vec(any::<u8>(), 0..200)
) {
let mut buf = DecodeBuffer::new(&bytes);
for _ in 0..50 {
match buf.read_varint() {
Ok(_) => {}
Err(_) => break,
}
}
}
#[test]
fn fuzz_message_decode_loop_no_panic(
bytes in proptest::collection::vec(any::<u8>(), 0..200)
) {
let mut buf = DecodeBuffer::new(&bytes);
for _ in 0..50 {
let tag = match buf.read_tag() {
Ok(t) => t,
Err(_) => break,
};
if buf.skip_field(tag.wire_type).is_err() {
break;
}
}
}
#[test]
fn fuzz_single_byte_no_panic(byte in any::<u8>()) {
let bytes = [byte];
let mut buf = DecodeBuffer::new(&bytes);
let _ = buf.read_varint();
let mut buf = DecodeBuffer::new(&bytes);
let _ = buf.read_tag();
}
}