Nothing to see here, move along meow
1use lancer_core::net_config::NetConfig;
2use proptest::prelude::*;
3
4#[test]
5fn empty_is_all_zero_unconfigured() {
6 let cfg = NetConfig::empty();
7 assert_eq!(cfg.ipv4, [0; 4]);
8 assert_eq!(cfg.prefix_len, 0);
9 assert_eq!(cfg.gateway, [0; 4]);
10 assert_eq!(cfg.dns_count, 0);
11 assert_eq!(cfg.mac, [0; 6]);
12 assert!(!cfg.configured);
13 assert_eq!(cfg.ipv6_link_local, [0; 16]);
14 assert_eq!(cfg.ipv6_global, [0; 16]);
15 assert_eq!(cfg.ipv6_global_prefix_len, 0);
16}
17
18#[test]
19fn set_ipv4_marks_configured() {
20 let mut cfg = NetConfig::empty();
21 cfg.set_ipv4([10, 0, 0, 1], 24);
22 assert!(cfg.configured);
23 assert_eq!(cfg.ipv4, [10, 0, 0, 1]);
24 assert_eq!(cfg.prefix_len, 24);
25}
26
27#[test]
28fn set_gateway_stores_correctly() {
29 let mut cfg = NetConfig::empty();
30 cfg.set_gateway([192, 168, 1, 1]);
31 assert_eq!(cfg.gateway, [192, 168, 1, 1]);
32}
33
34#[test]
35fn set_dns_stores_up_to_three() {
36 let mut cfg = NetConfig::empty();
37 let servers = [[8, 8, 8, 8], [8, 8, 4, 4], [1, 1, 1, 1]];
38 cfg.set_dns(&servers, 3);
39 assert_eq!(cfg.dns_count, 3);
40 assert_eq!(cfg.dns[0], [8, 8, 8, 8]);
41 assert_eq!(cfg.dns[1], [8, 8, 4, 4]);
42 assert_eq!(cfg.dns[2], [1, 1, 1, 1]);
43}
44
45#[test]
46fn set_mac_stores_correctly() {
47 let mut cfg = NetConfig::empty();
48 cfg.set_mac([0xAA, 0xBB, 0xCC, 0xDD, 0xEE, 0xFF]);
49 assert_eq!(cfg.mac, [0xAA, 0xBB, 0xCC, 0xDD, 0xEE, 0xFF]);
50}
51
52#[test]
53fn set_ipv6_link_local_stores() {
54 let mut cfg = NetConfig::empty();
55 let addr = [0xfe, 0x80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1];
56 cfg.set_ipv6_link_local(addr);
57 assert_eq!(cfg.ipv6_link_local, addr);
58}
59
60#[test]
61fn set_ipv6_global_stores() {
62 let mut cfg = NetConfig::empty();
63 let addr = [0x20, 0x01, 0x0d, 0xb8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1];
64 cfg.set_ipv6_global(addr, 64);
65 assert_eq!(cfg.ipv6_global, addr);
66 assert_eq!(cfg.ipv6_global_prefix_len, 64);
67}
68
69#[test]
70fn clear_ipv4_resets_to_unconfigured() {
71 let mut cfg = NetConfig::empty();
72 cfg.set_ipv4([10, 0, 0, 1], 24);
73 cfg.set_gateway([10, 0, 0, 254]);
74 cfg.set_dns(&[[8, 8, 8, 8]], 1);
75 cfg.clear_ipv4();
76 assert!(!cfg.configured);
77 assert_eq!(cfg.ipv4, [0; 4]);
78 assert_eq!(cfg.prefix_len, 0);
79 assert_eq!(cfg.gateway, [0; 4]);
80 assert_eq!(cfg.dns_count, 0);
81}
82
83#[test]
84fn serialize_deserialize_empty() {
85 let cfg = NetConfig::empty();
86 let mut buf = [0u8; 128];
87 let len = cfg.serialize(&mut buf);
88 assert!(len > 0);
89 let restored = NetConfig::deserialize(&buf[..len]).unwrap();
90 assert!(!restored.configured);
91 assert_eq!(restored.ipv4, [0; 4]);
92}
93
94#[test]
95fn serialize_deserialize_fully_populated() {
96 let mut cfg = NetConfig::empty();
97 cfg.set_ipv4([192, 168, 1, 100], 24);
98 cfg.set_gateway([192, 168, 1, 1]);
99 cfg.set_dns(&[[8, 8, 8, 8], [8, 8, 4, 4], [1, 1, 1, 1]], 3);
100 cfg.set_mac([0x02, 0x00, 0x00, 0x00, 0x00, 0x01]);
101 cfg.set_ipv6_link_local([0xfe, 0x80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1]);
102 cfg.set_ipv6_global(
103 [0x20, 0x01, 0x0d, 0xb8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1],
104 64,
105 );
106
107 let mut buf = [0u8; 128];
108 let len = cfg.serialize(&mut buf);
109 let restored = NetConfig::deserialize(&buf[..len]).unwrap();
110
111 assert!(restored.configured);
112 assert_eq!(restored.ipv4, [192, 168, 1, 100]);
113 assert_eq!(restored.prefix_len, 24);
114 assert_eq!(restored.gateway, [192, 168, 1, 1]);
115 assert_eq!(restored.dns_count, 3);
116 assert_eq!(restored.dns[0], [8, 8, 8, 8]);
117 assert_eq!(restored.dns[1], [8, 8, 4, 4]);
118 assert_eq!(restored.dns[2], [1, 1, 1, 1]);
119 assert_eq!(restored.mac, [0x02, 0x00, 0x00, 0x00, 0x00, 0x01]);
120 assert_eq!(
121 restored.ipv6_link_local,
122 [0xfe, 0x80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1]
123 );
124 assert_eq!(
125 restored.ipv6_global,
126 [0x20, 0x01, 0x0d, 0xb8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1]
127 );
128 assert_eq!(restored.ipv6_global_prefix_len, 64);
129}
130
131proptest! {
132 #[test]
133 fn serialize_deserialize_round_trip(
134 ipv4 in proptest::array::uniform4(any::<u8>()),
135 prefix in any::<u8>(),
136 gateway in proptest::array::uniform4(any::<u8>()),
137 dns0 in proptest::array::uniform4(any::<u8>()),
138 dns1 in proptest::array::uniform4(any::<u8>()),
139 dns2 in proptest::array::uniform4(any::<u8>()),
140 dns_count in 0u8..=3,
141 mac in proptest::array::uniform6(any::<u8>()),
142 ipv6_ll in proptest::collection::vec(any::<u8>(), 16..=16),
143 ipv6_gl in proptest::collection::vec(any::<u8>(), 16..=16),
144 ipv6_prefix in any::<u8>(),
145 ) {
146 let mut cfg = NetConfig::empty();
147 cfg.set_ipv4(ipv4, prefix);
148 cfg.set_gateway(gateway);
149 cfg.set_dns(&[dns0, dns1, dns2], dns_count);
150 cfg.set_mac(mac);
151
152 let mut ll = [0u8; 16];
153 ll.copy_from_slice(&ipv6_ll);
154 cfg.set_ipv6_link_local(ll);
155
156 let mut gl = [0u8; 16];
157 gl.copy_from_slice(&ipv6_gl);
158 cfg.set_ipv6_global(gl, ipv6_prefix);
159
160 let mut buf = [0u8; 128];
161 let len = cfg.serialize(&mut buf);
162 prop_assert!(len > 0);
163 let restored = NetConfig::deserialize(&buf[..len]).unwrap();
164
165 prop_assert!(restored.configured);
166 prop_assert_eq!(restored.ipv4, ipv4);
167 prop_assert_eq!(restored.prefix_len, prefix);
168 prop_assert_eq!(restored.gateway, gateway);
169 let effective_dns = (dns_count as usize).min(3);
170 prop_assert_eq!(restored.dns_count, effective_dns as u8);
171 let expected_dns = [dns0, dns1, dns2];
172 (0..effective_dns).for_each(|i| {
173 assert_eq!(restored.dns[i], expected_dns[i]);
174 });
175 prop_assert_eq!(restored.mac, mac);
176 prop_assert_eq!(restored.ipv6_link_local, ll);
177 prop_assert_eq!(restored.ipv6_global, gl);
178 prop_assert_eq!(restored.ipv6_global_prefix_len, ipv6_prefix);
179 }
180
181 #[test]
182 fn truncated_buffer_returns_none(len in 0usize..61) {
183 let buf = [0u8; 60];
184 let actual_len = len.min(buf.len());
185 prop_assert!(NetConfig::deserialize(&buf[..actual_len]).is_none());
186 }
187}