1use crate::{Driver, TypeGenerator};
2use std::net::{IpAddr, Ipv4Addr, Ipv6Addr, Shutdown, SocketAddr, SocketAddrV4, SocketAddrV6};
3
4macro_rules! impl_generator {
5 ($ty:ty, | $driver:ident | $produce:expr) => {
6 impl TypeGenerator for $ty {
7 fn generate<D: Driver>(driver: &mut D) -> Option<Self> {
8 driver.enter_product::<Self, _, _>(|$driver| $produce)
9 }
10 }
11 };
12}
13
14impl_generator!(Ipv4Addr, |driver| {
15 let v: u32 = driver.produce()?;
16 Some(Ipv4Addr::from(v))
17});
18impl_generator!(Ipv6Addr, |driver| {
19 let v: u128 = driver.produce()?;
20 Some(Ipv6Addr::from(v))
21});
22impl_generator!(SocketAddrV4, |driver| {
23 let ip = driver.produce()?;
24 let port = driver.produce()?;
25 Some(SocketAddrV4::new(ip, port))
26});
27impl_generator!(SocketAddrV6, |driver| {
28 let ip = driver.produce()?;
29 let port = driver.produce()?;
30 let flow_info = driver.produce()?;
31 let scope_id = driver.produce()?;
32 Some(SocketAddrV6::new(ip, port, flow_info, scope_id))
33});
34impl_generator!(SocketAddr, |driver| {
35 let ip = driver.produce()?;
36 let port = driver.produce()?;
37 Some(SocketAddr::new(ip, port))
38});
39
40impl TypeGenerator for IpAddr {
41 fn generate<D: Driver>(driver: &mut D) -> Option<Self> {
42 driver.enter_sum::<Self, _, _>(Some(&["V4", "V6"]), 2, 0, |driver, idx| match idx {
43 0 => Some(IpAddr::V4(driver.produce()?)),
44 1 => Some(IpAddr::V6(driver.produce()?)),
45 _ => None,
46 })
47 }
48}
49
50impl TypeGenerator for Shutdown {
51 fn generate<D: Driver>(driver: &mut D) -> Option<Self> {
52 driver.enter_sum::<Self, _, _>(Some(&["Read", "Write", "Both"]), 3, 0, |_driver, idx| {
53 match idx {
54 0 => Some(Shutdown::Read),
55 1 => Some(Shutdown::Write),
56 2 => Some(Shutdown::Both),
57 _ => None,
58 }
59 })
60 }
61}
62
63#[cfg(test)]
64mod tests {
65 use super::*;
66
67 macro_rules! test_generator {
68 ($name:ident, $ty:ty) => {
69 #[test]
70 fn $name() {
71 let _ = generator_test!(produce::<$ty>());
72 }
73 };
74 }
75
76 test_generator!(test_ipv4addr, Ipv4Addr);
77 test_generator!(test_ipv6addr, Ipv6Addr);
78 test_generator!(test_ipaddr, IpAddr);
79 test_generator!(test_socketaddrv4, SocketAddrV4);
80 test_generator!(test_socketaddrv6, SocketAddrV6);
81 test_generator!(test_socketaddr, SocketAddr);
82 test_generator!(test_shutdown, Shutdown);
83}