2
2
// Copyright 2025 Hedgehog
3
3
4
4
use crate :: bolero:: support:: {
5
- CidrString , IpAddrString , Ipv4AddrString , K8sObjectNameString , LinuxIfName , choose,
5
+ CidrString , IpAddrString , Ipv4AddrString , K8sObjectNameString , LinuxIfName ,
6
+ UniqueV4CidrGenerator , UniqueV6CidrGenerator , choose,
6
7
} ;
7
8
use crate :: config:: {
8
9
BgpAddressFamilyIPv4 , BgpAddressFamilyIPv6 , BgpAddressFamilyL2vpnEvpn , BgpAf , BgpNeighbor ,
9
10
BgpNeighborUpdateSource , RouteMap , RouterConfig , bgp_neighbor_update_source,
10
11
} ;
11
- use bolero:: { Driver , TypeGenerator } ;
12
+ use bolero:: { Driver , TypeGenerator , ValueGenerator } ;
12
13
use std:: ops:: Bound ;
13
14
14
15
#[ derive( Clone , Copy , PartialEq , TypeGenerator ) ]
@@ -19,20 +20,28 @@ enum BgpNeighborUpdateSourceType {
19
20
20
21
impl TypeGenerator for BgpAddressFamilyIPv4 {
21
22
fn generate < D : Driver > ( d : & mut D ) -> Option < Self > {
23
+ let v4_prefix_generator = UniqueV4CidrGenerator :: new (
24
+ d. gen_u16 ( Bound :: Included ( & 0 ) , Bound :: Included ( & 10 ) ) ?,
25
+ d. gen_u8 ( Bound :: Included ( & 1 ) , Bound :: Included ( & 32 ) ) ?,
26
+ ) ;
22
27
Some ( BgpAddressFamilyIPv4 {
23
28
redistribute_connected : d. gen_bool ( None ) ?,
24
29
redistribute_static : d. gen_bool ( None ) ?,
25
- networks : vec ! [ ] ,
30
+ networks : v4_prefix_generator . generate ( d ) ? ,
26
31
} )
27
32
}
28
33
}
29
34
30
35
impl TypeGenerator for BgpAddressFamilyIPv6 {
31
36
fn generate < D : Driver > ( d : & mut D ) -> Option < Self > {
37
+ let v6_prefix_generator = UniqueV6CidrGenerator :: new (
38
+ d. gen_u16 ( Bound :: Included ( & 0 ) , Bound :: Included ( & 10 ) ) ?,
39
+ d. gen_u8 ( Bound :: Included ( & 1 ) , Bound :: Included ( & 128 ) ) ?,
40
+ ) ;
32
41
Some ( BgpAddressFamilyIPv6 {
33
42
redistribute_connected : d. gen_bool ( None ) ?,
34
43
redistribute_static : d. gen_bool ( None ) ?,
35
- networks : vec ! [ ] ,
44
+ networks : v6_prefix_generator . generate ( d ) ? ,
36
45
} )
37
46
}
38
47
}
@@ -150,4 +159,38 @@ mod test {
150
159
assert ! ( router_config. asn. parse:: <u32 >( ) . is_ok( ) ) ;
151
160
} ) ;
152
161
}
162
+
163
+ #[ test]
164
+ fn test_bgp_address_family_ipv4 ( ) {
165
+ let mut some_networks = false ;
166
+ bolero:: check!( )
167
+ . with_type :: < BgpAddressFamilyIPv4 > ( )
168
+ . for_each ( |bgp_address_family_ipv4| {
169
+ if !bgp_address_family_ipv4. networks . is_empty ( ) {
170
+ some_networks = true ;
171
+ let mut seen = std:: collections:: HashSet :: new ( ) ;
172
+ for network in & bgp_address_family_ipv4. networks {
173
+ assert ! ( seen. insert( network) , "Duplicate network found: {network}" ) ;
174
+ }
175
+ }
176
+ } ) ;
177
+ assert ! ( some_networks) ;
178
+ }
179
+
180
+ #[ test]
181
+ fn test_bgp_address_family_ipv6 ( ) {
182
+ let mut some_networks = false ;
183
+ bolero:: check!( )
184
+ . with_type :: < BgpAddressFamilyIPv6 > ( )
185
+ . for_each ( |bgp_address_family_ipv6| {
186
+ if !bgp_address_family_ipv6. networks . is_empty ( ) {
187
+ some_networks = true ;
188
+ let mut seen = std:: collections:: HashSet :: new ( ) ;
189
+ for network in & bgp_address_family_ipv6. networks {
190
+ assert ! ( seen. insert( network) , "Duplicate network found: {network}" ) ;
191
+ }
192
+ }
193
+ } ) ;
194
+ assert ! ( some_networks) ;
195
+ }
153
196
}
0 commit comments