]>
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; |
f579559b TG |
125 | |
126 | /* let's assume that the test machine does not have a .network file | |
127 | that applies to the loopback device... */ | |
505f8da7 | 128 | assert_se(network_get(manager, loopback, "lo", &mac, &network) == -ENOENT); |
12e0f830 | 129 | assert_se(!network); |
f579559b TG |
130 | } |
131 | ||
9505d3c6 | 132 | static void test_address_equality(void) { |
8e766630 | 133 | _cleanup_(address_freep) Address *a1 = NULL, *a2 = NULL; |
9505d3c6 | 134 | |
f0213e37 TG |
135 | assert_se(address_new(&a1) >= 0); |
136 | assert_se(address_new(&a2) >= 0); | |
9505d3c6 TG |
137 | |
138 | assert_se(address_equal(NULL, NULL)); | |
139 | assert_se(!address_equal(a1, NULL)); | |
140 | assert_se(!address_equal(NULL, a2)); | |
141 | assert_se(address_equal(a1, a2)); | |
142 | ||
143 | a1->family = AF_INET; | |
144 | assert_se(!address_equal(a1, a2)); | |
145 | ||
146 | a2->family = AF_INET; | |
147 | assert_se(address_equal(a1, a2)); | |
148 | ||
004aadca | 149 | assert_se(in_addr_from_string(AF_INET, "192.168.3.9", &a1->in_addr) >= 0); |
3ac8e543 | 150 | assert_se(!address_equal(a1, a2)); |
004aadca | 151 | assert_se(in_addr_from_string(AF_INET, "192.168.3.9", &a2->in_addr) >= 0); |
9505d3c6 | 152 | assert_se(address_equal(a1, a2)); |
004aadca | 153 | assert_se(in_addr_from_string(AF_INET, "192.168.3.10", &a1->in_addr_peer) >= 0); |
3ac8e543 | 154 | assert_se(address_equal(a1, a2)); |
004aadca | 155 | assert_se(in_addr_from_string(AF_INET, "192.168.3.11", &a2->in_addr_peer) >= 0); |
3ac8e543 | 156 | assert_se(address_equal(a1, a2)); |
9505d3c6 TG |
157 | a1->prefixlen = 10; |
158 | assert_se(!address_equal(a1, a2)); | |
159 | a2->prefixlen = 10; | |
160 | assert_se(address_equal(a1, a2)); | |
161 | ||
9505d3c6 TG |
162 | a1->family = AF_INET6; |
163 | assert_se(!address_equal(a1, a2)); | |
164 | ||
165 | a2->family = AF_INET6; | |
004aadca YW |
166 | assert_se(in_addr_from_string(AF_INET6, "2001:4ca0:4f01::2", &a1->in_addr) >= 0); |
167 | assert_se(in_addr_from_string(AF_INET6, "2001:4ca0:4f01::2", &a2->in_addr) >= 0); | |
9505d3c6 TG |
168 | assert_se(address_equal(a1, a2)); |
169 | ||
170 | a2->prefixlen = 8; | |
171 | assert_se(address_equal(a1, a2)); | |
172 | ||
004aadca | 173 | assert_se(in_addr_from_string(AF_INET6, "2001:4ca0:4f01::1", &a2->in_addr) >= 0); |
9505d3c6 TG |
174 | assert_se(!address_equal(a1, a2)); |
175 | } | |
176 | ||
2de2abad LB |
177 | static void test_dhcp_hostname_shorten_overlong(void) { |
178 | int r; | |
179 | ||
180 | { | |
181 | /* simple hostname, no actions, no errors */ | |
182 | _cleanup_free_ char *shortened = NULL; | |
183 | r = shorten_overlong("name1", &shortened); | |
184 | assert_se(r == 0); | |
185 | assert_se(streq("name1", shortened)); | |
186 | } | |
187 | ||
188 | { | |
189 | /* simple fqdn, no actions, no errors */ | |
190 | _cleanup_free_ char *shortened = NULL; | |
191 | r = shorten_overlong("name1.example.com", &shortened); | |
192 | assert_se(r == 0); | |
193 | assert_se(streq("name1.example.com", shortened)); | |
194 | } | |
195 | ||
196 | { | |
197 | /* overlong fqdn, cut to first dot, no errors */ | |
198 | _cleanup_free_ char *shortened = NULL; | |
199 | r = shorten_overlong("name1.test-dhcp-this-one-here-is-a-very-very-long-domain.example.com", &shortened); | |
200 | assert_se(r == 1); | |
201 | assert_se(streq("name1", shortened)); | |
202 | } | |
203 | ||
204 | { | |
205 | /* overlong hostname, cut to HOST_MAX_LEN, no errors */ | |
206 | _cleanup_free_ char *shortened = NULL; | |
207 | r = shorten_overlong("test-dhcp-this-one-here-is-a-very-very-long-hostname-without-domainname", &shortened); | |
208 | assert_se(r == 1); | |
209 | assert_se(streq("test-dhcp-this-one-here-is-a-very-very-long-hostname-without-dom", shortened)); | |
210 | } | |
211 | ||
212 | { | |
213 | /* overlong fqdn, cut to first dot, empty result error */ | |
214 | _cleanup_free_ char *shortened = NULL; | |
215 | r = shorten_overlong(".test-dhcp-this-one-here-is-a-very-very-long-hostname.example.com", &shortened); | |
216 | assert_se(r == -EDOM); | |
217 | assert_se(shortened == NULL); | |
218 | } | |
219 | ||
220 | } | |
221 | ||
f579559b | 222 | int main(void) { |
8e766630 | 223 | _cleanup_(manager_freep) Manager *manager = NULL; |
51517f9e YW |
224 | _cleanup_(sd_device_unrefp) sd_device *loopback = NULL; |
225 | int ifindex, r; | |
f579559b | 226 | |
6d7c4033 ZJS |
227 | test_setup_logging(LOG_INFO); |
228 | ||
09bee74d | 229 | test_deserialize_in_addr(); |
e1ea665e | 230 | test_deserialize_dhcp_routes(); |
9505d3c6 | 231 | test_address_equality(); |
2de2abad | 232 | test_dhcp_hostname_shorten_overlong(); |
9505d3c6 | 233 | |
3534a043 | 234 | assert_se(manager_new(&manager) >= 0); |
f579559b | 235 | |
5347925a | 236 | r = test_load_config(manager); |
317bb217 ZJS |
237 | if (r == -EPERM) |
238 | return log_tests_skipped("Cannot load configuration"); | |
239 | assert_se(r == 0); | |
f579559b | 240 | |
51517f9e | 241 | assert_se(sd_device_new_from_syspath(&loopback, "/sys/class/net/lo") >= 0); |
12e0f830 | 242 | assert_se(loopback); |
51517f9e YW |
243 | assert_se(sd_device_get_ifindex(loopback, &ifindex) >= 0); |
244 | assert_se(ifindex == 1); | |
f579559b TG |
245 | |
246 | test_network_get(manager, loopback); | |
247 | ||
505f8da7 | 248 | assert_se(manager_rtnl_enumerate_links(manager) >= 0); |
f579559b | 249 | } |