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