//! `LoRaConfig` round-trips through its wire encoding for every //! construction derived via `Arbitrary`. #![no_main] use arbitrary::Arbitrary; use donglora_protocol::{LoRaBandwidth, LoRaCodingRate, LoRaConfig, LoRaHeaderMode}; use libfuzzer_sys::fuzz_target; #[derive(Debug, Arbitrary)] struct Input { freq_hz: u32, sf: u8, bw_raw: u8, cr_raw: u8, preamble_len: u16, sync_word: u16, tx_power_dbm: i8, header_raw: u8, payload_crc: bool, iq_invert: bool, } fuzz_target!(|input: Input| { let Some(bw) = LoRaBandwidth::from_u8(input.bw_raw & 0x0F) else { return; }; let Some(cr) = LoRaCodingRate::from_u8(input.cr_raw & 0x03) else { return; }; let Some(header_mode) = LoRaHeaderMode::from_u8(input.header_raw & 0x01) else { return; }; let cfg = LoRaConfig { freq_hz: input.freq_hz, sf: input.sf, bw, cr, preamble_len: input.preamble_len, sync_word: input.sync_word, tx_power_dbm: input.tx_power_dbm, header_mode, payload_crc: input.payload_crc, iq_invert: input.iq_invert, }; let mut buf = [0u8; 32]; let n = cfg.encode(&mut buf).unwrap(); assert_eq!(LoRaConfig::decode(&buf[..n]).unwrap(), cfg); });