//! An arbitrary well-formed `(type_id, tag, payload)` must survive a //! frame encode → decode round trip byte-for-byte. #![no_main] use arbitrary::Arbitrary; use donglora_protocol::{FrameDecoder, FrameResult, MAX_PAYLOAD_FIELD, MAX_WIRE_FRAME, encode_frame}; use libfuzzer_sys::fuzz_target; #[derive(Debug, Arbitrary)] struct Input<'a> { type_id: u8, tag: u16, payload: &'a [u8], } fuzz_target!(|input: Input| { if input.payload.len() > MAX_PAYLOAD_FIELD { return; } let mut wire = [0u8; MAX_WIRE_FRAME]; let Ok(n) = encode_frame(input.type_id, input.tag, input.payload, &mut wire) else { return; }; let mut decoder = FrameDecoder::new(); let mut matched = false; decoder.feed(&wire[..n], |res| { if let FrameResult::Ok { type_id, tag, payload, } = res { assert_eq!(type_id, input.type_id); assert_eq!(tag, input.tag); assert_eq!(payload, input.payload); matched = true; } else { panic!("encode→decode produced a frame error: {:?}", res); } }); assert!(matched, "encoded frame did not decode"); });