Skip to main content

bolero_generator/
net.rs

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}