in core/fuzz/fuzz_reader.rs [54:117]
fn arbitrary(u: &mut Unstructured<'_>) -> arbitrary::Result<Self> {
let total_size = u.int_in_range(1..=MAX_DATA_SIZE)?;
// TODO: it's valid that size is larger than total_size.
let (offset, size) = match u.int_in_range(0..=3)? {
// Full range
0 => (None, None),
1 => {
let offset = u.int_in_range(0..=total_size as u64 - 1)?;
(Some(offset), None)
}
2 => {
let size = u.int_in_range(1..=total_size as u64)?;
(None, Some(size))
}
3 => {
let offset = u.int_in_range(0..=total_size as u64 - 1)?;
let size = u.int_in_range(1..=total_size as u64 - offset)?;
(Some(offset), Some(size))
}
_ => unreachable!("invalid int generated by arbitrary"),
};
let range = BytesRange::new(offset, size);
let count = u.int_in_range(1..=1024)?;
let mut actions = vec![];
for _ in 0..count {
let action = match u.int_in_range(0..=4)? {
// Read
0 => {
let size = u.int_in_range(0..=total_size * 2)?;
ReadAction::Read { size }
}
// Next
1 => ReadAction::Next,
// Seek Start
2 => {
// NOTE: seek out of the end of file is valid.
let offset = u.int_in_range(0..=total_size * 2)?;
ReadAction::Seek(SeekFrom::Start(offset as u64))
}
// Seek Current
3 => {
let offset = u.int_in_range(-(total_size as i64)..=(total_size as i64))?;
ReadAction::Seek(SeekFrom::Current(offset))
}
// Seek End
4 => {
let offset = u.int_in_range(-(total_size as i64)..=(total_size as i64))?;
ReadAction::Seek(SeekFrom::End(offset))
}
_ => unreachable!("invalid int generated by arbitrary"),
};
actions.push(action);
}
Ok(FuzzInput {
size: total_size,
range,
actions,
})
}