use proptest::prelude::*;
proptest! {
#[test]
fn png_decoder_no_panic_random_bytes(data in prop::collection::vec(any::<u8>(), 0..512)) {
use oximedia_codec::png::PngDecoder;
let _ = PngDecoder::new(&data).and_then(|d| d.decode());
}
}
proptest! {
#[test]
fn png_decoder_no_panic_magic_plus_random(body in prop::collection::vec(any::<u8>(), 0..512)) {
use oximedia_codec::png::PngDecoder;
let mut data = vec![0x89u8, 0x50, 0x4E, 0x47, 0x0D, 0x0A, 0x1A, 0x0A];
data.extend_from_slice(&body);
let _ = PngDecoder::new(&data).and_then(|d| d.decode());
}
}
proptest! {
#[test]
fn png_decoder_no_panic_valid_plus_garbage(
garbage in prop::collection::vec(any::<u8>(), 0..256)
) {
use oximedia_codec::png::PngDecoder;
let mut data: Vec<u8> = vec![
0x89, 0x50, 0x4E, 0x47, 0x0D, 0x0A, 0x1A, 0x0A,
0x00, 0x00, 0x00, 0x0D,
0x49, 0x48, 0x44, 0x52, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x08, 0x00, 0x00, 0x00, 0x00, 0x3A, 0x7E, 0x9B, 0x55, 0x00, 0x00, 0x00, 0x0B,
0x49, 0x44, 0x41, 0x54, 0x08, 0xD7, 0x63, 0xF8, 0xFF, 0x00, 0x02, 0x00, 0x01,
0xE2, 0x21, 0xBC, 0x33, 0x00, 0x00, 0x00, 0x00,
0x49, 0x45, 0x4E, 0x44, 0xAE, 0x42, 0x60, 0x82, ];
data.extend_from_slice(&garbage);
let _ = PngDecoder::new(&data).and_then(|d| d.decode());
}
}
proptest! {
#[test]
fn gif_decoder_no_panic_random_bytes(data in prop::collection::vec(any::<u8>(), 0..512)) {
use oximedia_codec::gif::GifDecoder;
let _ = GifDecoder::new(&data);
}
}
proptest! {
#[test]
fn gif_decoder_no_panic_header_plus_random(body in prop::collection::vec(any::<u8>(), 0..512)) {
use oximedia_codec::gif::GifDecoder;
let mut data = b"GIF89a".to_vec();
data.extend_from_slice(&body);
let _ = GifDecoder::new(&data);
}
}
proptest! {
#[test]
fn gif_decoder_no_panic_87a_header_plus_random(body in prop::collection::vec(any::<u8>(), 0..256)) {
use oximedia_codec::gif::GifDecoder;
let mut data = b"GIF87a".to_vec();
data.extend_from_slice(&body);
let _ = GifDecoder::new(&data);
}
}
proptest! {
#[test]
fn webp_vp8l_decoder_no_panic_random_bytes(data in prop::collection::vec(any::<u8>(), 0..512)) {
use oximedia_codec::webp::Vp8lDecoder;
let mut dec = Vp8lDecoder::new();
let _ = dec.decode(&data);
}
}
proptest! {
#[test]
fn webp_decoder_no_panic_riff_header_plus_random(body in prop::collection::vec(any::<u8>(), 0..512)) {
use oximedia_codec::webp::Vp8lDecoder;
let total_size = body.len() as u32 + 4;
let mut data = Vec::with_capacity(12 + body.len());
data.extend_from_slice(b"RIFF");
data.extend_from_slice(&total_size.to_le_bytes());
data.extend_from_slice(b"WEBP");
data.extend_from_slice(&body);
let mut dec = Vp8lDecoder::new();
let _ = dec.decode(&data);
}
}
proptest! {
#[test]
fn webp_vp8l_chunk_plus_random_no_panic(body in prop::collection::vec(any::<u8>(), 0..256)) {
use oximedia_codec::webp::Vp8lDecoder;
let chunk_len = body.len() as u32;
let mut data = Vec::with_capacity(8 + body.len());
data.extend_from_slice(b"VP8L");
data.extend_from_slice(&chunk_len.to_le_bytes());
data.extend_from_slice(&body);
let mut dec = Vp8lDecoder::new();
let _ = dec.decode(&data);
}
}