#![no_main] use libfuzzer_sys::fuzz_target; use announcement::Announcement; use std::sync::Arc; fuzz_target!(|data: &[u8]| { // Test various data types and patterns // Test with raw bytes if !data.is_empty() { let (announcer, announcement) = Announcement::new(); let listener = announcement.listener(); // Convert to Vec for owned data let vec_data = data.to_vec(); let _ = announcer.announce(vec_data.clone()); // Verify listener receives the data if let Some(received) = listener.try_listen() { assert_eq!(received, vec_data); } } // Test with Arc-wrapped data if data.len() >= 4 { let (announcer, announcement) = Announcement::new(); let listener1 = announcement.listener(); let listener2 = announcement.listener(); let arc_data = Arc::new(data.to_vec()); let _ = announcer.announce(arc_data.clone()); // Both listeners should get the same Arc if let (Some(r1), Some(r2)) = (listener1.try_listen(), listener2.try_listen()) { assert_eq!(r1, r2); assert_eq!(*r1, data.to_vec()); } } // Test with String data (if valid UTF-8) if let Ok(string_data) = std::str::from_utf8(data) { let (announcer, announcement) = Announcement::new(); let listener = announcement.listener(); let _ = announcer.announce(string_data.to_string()); if let Some(received) = listener.try_listen() { assert_eq!(received, string_data); } } // Test with numeric data if data.len() >= 8 { let (announcer, announcement) = Announcement::new(); let listener = announcement.listener(); let mut bytes = [0u8; 8]; bytes.copy_from_slice(&data[..8]); let num = u64::from_le_bytes(bytes); let _ = announcer.announce(num); if let Some(received) = listener.try_listen() { assert_eq!(received, num); } } // Test is_announced flag { let (announcer, announcement) = Announcement::new(); assert!(!announcement.is_announced()); let _ = announcer.announce(42u32); assert!(announcement.is_announced()); } });