]>
Commit | Line | Data |
---|---|---|
53e1b683 | 1 | /* SPDX-License-Identifier: LGPL-2.1+ */ |
f579559b | 2 | |
d03f390e | 3 | #include <arpa/inet.h> |
2de2abad LB |
4 | #include <sys/param.h> |
5 | ||
51517f9e YW |
6 | #include "sd-device.h" |
7 | ||
b5efdb8a | 8 | #include "alloc-util.h" |
e1ea665e | 9 | #include "dhcp-lease-internal.h" |
2de2abad | 10 | #include "hostname-util.h" |
cf0fbc49 | 11 | #include "network-internal.h" |
23f53b99 | 12 | #include "networkd-manager.h" |
2de2abad | 13 | #include "string-util.h" |
317bb217 | 14 | #include "tests.h" |
09bee74d TG |
15 | |
16 | static void test_deserialize_in_addr(void) { | |
17 | _cleanup_free_ struct in_addr *addresses = NULL; | |
18 | _cleanup_free_ struct in6_addr *addresses6 = NULL; | |
004aadca | 19 | union in_addr_union a, b, c, d, e, f; |
a2ba62c7 | 20 | int size; |
09bee74d TG |
21 | const char *addresses_string = "192.168.0.1 0:0:0:0:0:FFFF:204.152.189.116 192.168.0.2 ::1 192.168.0.3 1:0:0:0:0:0:0:8"; |
22 | ||
004aadca YW |
23 | assert_se(in_addr_from_string(AF_INET, "0:0:0:0:0:FFFF:204.152.189.116", &a) < 0); |
24 | assert_se(in_addr_from_string(AF_INET6, "192.168.0.1", &d) < 0); | |
09bee74d | 25 | |
004aadca YW |
26 | assert_se(in_addr_from_string(AF_INET, "192.168.0.1", &a) >= 0); |
27 | assert_se(in_addr_from_string(AF_INET, "192.168.0.2", &b) >= 0); | |
28 | assert_se(in_addr_from_string(AF_INET, "192.168.0.3", &c) >= 0); | |
29 | assert_se(in_addr_from_string(AF_INET6, "0:0:0:0:0:FFFF:204.152.189.116", &d) >= 0); | |
30 | assert_se(in_addr_from_string(AF_INET6, "::1", &e) >= 0); | |
31 | assert_se(in_addr_from_string(AF_INET6, "1:0:0:0:0:0:0:8", &f) >= 0); | |
09bee74d | 32 | |
a2ba62c7 | 33 | assert_se((size = deserialize_in_addrs(&addresses, addresses_string)) >= 0); |
09bee74d | 34 | assert_se(size == 3); |
004aadca YW |
35 | assert_se(in_addr_equal(AF_INET, &a, (union in_addr_union *) &addresses[0])); |
36 | assert_se(in_addr_equal(AF_INET, &b, (union in_addr_union *) &addresses[1])); | |
37 | assert_se(in_addr_equal(AF_INET, &c, (union in_addr_union *) &addresses[2])); | |
09bee74d | 38 | |
a2ba62c7 | 39 | assert_se((size = deserialize_in6_addrs(&addresses6, addresses_string)) >= 0); |
09bee74d | 40 | assert_se(size == 3); |
004aadca YW |
41 | assert_se(in_addr_equal(AF_INET6, &d, (union in_addr_union *) &addresses6[0])); |
42 | assert_se(in_addr_equal(AF_INET6, &e, (union in_addr_union *) &addresses6[1])); | |
43 | assert_se(in_addr_equal(AF_INET6, &f, (union in_addr_union *) &addresses6[2])); | |
09bee74d | 44 | } |
f579559b | 45 | |
e1ea665e EY |
46 | static void test_deserialize_dhcp_routes(void) { |
47 | size_t size, allocated; | |
48 | ||
49 | { | |
50 | _cleanup_free_ struct sd_dhcp_route *routes = NULL; | |
51 | assert_se(deserialize_dhcp_routes(&routes, &size, &allocated, "") >= 0); | |
52 | assert_se(size == 0); | |
53 | } | |
54 | ||
55 | { | |
56 | /* no errors */ | |
57 | _cleanup_free_ struct sd_dhcp_route *routes = NULL; | |
58 | const char *routes_string = "192.168.0.0/16,192.168.0.1 10.1.2.0/24,10.1.2.1 0.0.0.0/0,10.0.1.1"; | |
59 | ||
60 | assert_se(deserialize_dhcp_routes(&routes, &size, &allocated, routes_string) >= 0); | |
61 | ||
62 | assert_se(size == 3); | |
63 | assert_se(routes[0].dst_addr.s_addr == inet_addr("192.168.0.0")); | |
64 | assert_se(routes[0].gw_addr.s_addr == inet_addr("192.168.0.1")); | |
65 | assert_se(routes[0].dst_prefixlen == 16); | |
66 | ||
67 | assert_se(routes[1].dst_addr.s_addr == inet_addr("10.1.2.0")); | |
68 | assert_se(routes[1].gw_addr.s_addr == inet_addr("10.1.2.1")); | |
69 | assert_se(routes[1].dst_prefixlen == 24); | |
70 | ||
71 | assert_se(routes[2].dst_addr.s_addr == inet_addr("0.0.0.0")); | |
72 | assert_se(routes[2].gw_addr.s_addr == inet_addr("10.0.1.1")); | |
73 | assert_se(routes[2].dst_prefixlen == 0); | |
74 | } | |
75 | ||
76 | { | |
77 | /* error in second word */ | |
78 | _cleanup_free_ struct sd_dhcp_route *routes = NULL; | |
79 | const char *routes_string = "192.168.0.0/16,192.168.0.1 10.1.2.0#24,10.1.2.1 0.0.0.0/0,10.0.1.1"; | |
80 | ||
81 | assert_se(deserialize_dhcp_routes(&routes, &size, &allocated, routes_string) >= 0); | |
82 | ||
83 | assert_se(size == 2); | |
84 | assert_se(routes[0].dst_addr.s_addr == inet_addr("192.168.0.0")); | |
85 | assert_se(routes[0].gw_addr.s_addr == inet_addr("192.168.0.1")); | |
86 | assert_se(routes[0].dst_prefixlen == 16); | |
87 | ||
5bb14c86 TG |
88 | assert_se(routes[1].dst_addr.s_addr == inet_addr("0.0.0.0")); |
89 | assert_se(routes[1].gw_addr.s_addr == inet_addr("10.0.1.1")); | |
90 | assert_se(routes[1].dst_prefixlen == 0); | |
e1ea665e EY |
91 | } |
92 | ||
93 | { | |
94 | /* error in every word */ | |
95 | _cleanup_free_ struct sd_dhcp_route *routes = NULL; | |
96 | const char *routes_string = "192.168.0.0/55,192.168.0.1 10.1.2.0#24,10.1.2.1 0.0.0.0/0,10.0.1.X"; | |
97 | ||
98 | assert_se(deserialize_dhcp_routes(&routes, &size, &allocated, routes_string) >= 0); | |
99 | assert_se(size == 0); | |
100 | } | |
101 | } | |
102 | ||
5347925a TG |
103 | static int test_load_config(Manager *manager) { |
104 | int r; | |
7c99d940 TG |
105 | /* TODO: should_reload, is false if the config dirs do not exist, so |
106 | * so we can't do this test here, move it to a test for paths_check_timestamps | |
107 | * directly | |
108 | * | |
12e0f830 | 109 | * assert_se(network_should_reload(manager) == true); |
7c99d940 | 110 | */ |
5347925a TG |
111 | |
112 | r = manager_load_config(manager); | |
113 | if (r == -EPERM) | |
114 | return r; | |
115 | assert_se(r >= 0); | |
116 | ||
12e0f830 | 117 | assert_se(manager_should_reload(manager) == false); |
5347925a TG |
118 | |
119 | return 0; | |
f579559b TG |
120 | } |
121 | ||
51517f9e | 122 | static void test_network_get(Manager *manager, sd_device *loopback) { |
f579559b | 123 | Network *network; |
67a46833 | 124 | const struct ether_addr mac = ETHER_ADDR_NULL; |
e519e20a | 125 | int r; |
f579559b | 126 | |
e519e20a ZJS |
127 | /* Let's hope that the test machine does not have a .network file that applies to loopback device… |
128 | * But it is still possible, so let's allow that case too. */ | |
ef62949a | 129 | r = network_get(manager, 0, loopback, "lo", NULL, &mac, &mac, 0, NULL, NULL, &network); |
e519e20a ZJS |
130 | if (r == -ENOENT) |
131 | /* The expected case */ | |
132 | assert_se(!network); | |
133 | else if (r >= 0) | |
134 | assert_se(network); | |
135 | else | |
136 | assert_not_reached("bad error!"); | |
f579559b TG |
137 | } |
138 | ||
9505d3c6 | 139 | static void test_address_equality(void) { |
8e766630 | 140 | _cleanup_(address_freep) Address *a1 = NULL, *a2 = NULL; |
9505d3c6 | 141 | |
f0213e37 TG |
142 | assert_se(address_new(&a1) >= 0); |
143 | assert_se(address_new(&a2) >= 0); | |
9505d3c6 TG |
144 | |
145 | assert_se(address_equal(NULL, NULL)); | |
146 | assert_se(!address_equal(a1, NULL)); | |
147 | assert_se(!address_equal(NULL, a2)); | |
148 | assert_se(address_equal(a1, a2)); | |
149 | ||
150 | a1->family = AF_INET; | |
151 | assert_se(!address_equal(a1, a2)); | |
152 | ||
153 | a2->family = AF_INET; | |
154 | assert_se(address_equal(a1, a2)); | |
155 | ||
004aadca | 156 | assert_se(in_addr_from_string(AF_INET, "192.168.3.9", &a1->in_addr) >= 0); |
3ac8e543 | 157 | assert_se(!address_equal(a1, a2)); |
004aadca | 158 | assert_se(in_addr_from_string(AF_INET, "192.168.3.9", &a2->in_addr) >= 0); |
9505d3c6 | 159 | assert_se(address_equal(a1, a2)); |
004aadca | 160 | assert_se(in_addr_from_string(AF_INET, "192.168.3.10", &a1->in_addr_peer) >= 0); |
3ac8e543 | 161 | assert_se(address_equal(a1, a2)); |
004aadca | 162 | assert_se(in_addr_from_string(AF_INET, "192.168.3.11", &a2->in_addr_peer) >= 0); |
3ac8e543 | 163 | assert_se(address_equal(a1, a2)); |
9505d3c6 TG |
164 | a1->prefixlen = 10; |
165 | assert_se(!address_equal(a1, a2)); | |
166 | a2->prefixlen = 10; | |
167 | assert_se(address_equal(a1, a2)); | |
168 | ||
9505d3c6 TG |
169 | a1->family = AF_INET6; |
170 | assert_se(!address_equal(a1, a2)); | |
171 | ||
172 | a2->family = AF_INET6; | |
004aadca YW |
173 | assert_se(in_addr_from_string(AF_INET6, "2001:4ca0:4f01::2", &a1->in_addr) >= 0); |
174 | assert_se(in_addr_from_string(AF_INET6, "2001:4ca0:4f01::2", &a2->in_addr) >= 0); | |
9505d3c6 TG |
175 | assert_se(address_equal(a1, a2)); |
176 | ||
177 | a2->prefixlen = 8; | |
178 | assert_se(address_equal(a1, a2)); | |
179 | ||
004aadca | 180 | assert_se(in_addr_from_string(AF_INET6, "2001:4ca0:4f01::1", &a2->in_addr) >= 0); |
9505d3c6 TG |
181 | assert_se(!address_equal(a1, a2)); |
182 | } | |
183 | ||
2de2abad LB |
184 | static void test_dhcp_hostname_shorten_overlong(void) { |
185 | int r; | |
186 | ||
187 | { | |
188 | /* simple hostname, no actions, no errors */ | |
189 | _cleanup_free_ char *shortened = NULL; | |
190 | r = shorten_overlong("name1", &shortened); | |
191 | assert_se(r == 0); | |
192 | assert_se(streq("name1", shortened)); | |
193 | } | |
194 | ||
195 | { | |
196 | /* simple fqdn, no actions, no errors */ | |
197 | _cleanup_free_ char *shortened = NULL; | |
198 | r = shorten_overlong("name1.example.com", &shortened); | |
199 | assert_se(r == 0); | |
200 | assert_se(streq("name1.example.com", shortened)); | |
201 | } | |
202 | ||
203 | { | |
204 | /* overlong fqdn, cut to first dot, no errors */ | |
205 | _cleanup_free_ char *shortened = NULL; | |
206 | r = shorten_overlong("name1.test-dhcp-this-one-here-is-a-very-very-long-domain.example.com", &shortened); | |
207 | assert_se(r == 1); | |
208 | assert_se(streq("name1", shortened)); | |
209 | } | |
210 | ||
211 | { | |
212 | /* overlong hostname, cut to HOST_MAX_LEN, no errors */ | |
213 | _cleanup_free_ char *shortened = NULL; | |
214 | r = shorten_overlong("test-dhcp-this-one-here-is-a-very-very-long-hostname-without-domainname", &shortened); | |
215 | assert_se(r == 1); | |
216 | assert_se(streq("test-dhcp-this-one-here-is-a-very-very-long-hostname-without-dom", shortened)); | |
217 | } | |
218 | ||
219 | { | |
220 | /* overlong fqdn, cut to first dot, empty result error */ | |
221 | _cleanup_free_ char *shortened = NULL; | |
222 | r = shorten_overlong(".test-dhcp-this-one-here-is-a-very-very-long-hostname.example.com", &shortened); | |
223 | assert_se(r == -EDOM); | |
224 | assert_se(shortened == NULL); | |
225 | } | |
226 | ||
227 | } | |
228 | ||
f579559b | 229 | int main(void) { |
8e766630 | 230 | _cleanup_(manager_freep) Manager *manager = NULL; |
51517f9e YW |
231 | _cleanup_(sd_device_unrefp) sd_device *loopback = NULL; |
232 | int ifindex, r; | |
f579559b | 233 | |
6d7c4033 ZJS |
234 | test_setup_logging(LOG_INFO); |
235 | ||
09bee74d | 236 | test_deserialize_in_addr(); |
e1ea665e | 237 | test_deserialize_dhcp_routes(); |
9505d3c6 | 238 | test_address_equality(); |
2de2abad | 239 | test_dhcp_hostname_shorten_overlong(); |
9505d3c6 | 240 | |
3534a043 | 241 | assert_se(manager_new(&manager) >= 0); |
f579559b | 242 | |
5347925a | 243 | r = test_load_config(manager); |
317bb217 ZJS |
244 | if (r == -EPERM) |
245 | return log_tests_skipped("Cannot load configuration"); | |
246 | assert_se(r == 0); | |
f579559b | 247 | |
51517f9e | 248 | assert_se(sd_device_new_from_syspath(&loopback, "/sys/class/net/lo") >= 0); |
12e0f830 | 249 | assert_se(loopback); |
51517f9e YW |
250 | assert_se(sd_device_get_ifindex(loopback, &ifindex) >= 0); |
251 | assert_se(ifindex == 1); | |
f579559b TG |
252 | |
253 | test_network_get(manager, loopback); | |
254 | ||
505f8da7 | 255 | assert_se(manager_rtnl_enumerate_links(manager) >= 0); |
f579559b | 256 | } |