fn arbitrary()

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,
        })
    }