1 /*-*- Mode: C; c-basic-offset: 8; indent-tabs-mode: nil -*-*/
4 This file is part of systemd.
6 Copyright 2013 Tom Gundersen <teg@jklm.no>
8 systemd is free software; you can redistribute it and/or modify it
9 under the terms of the GNU Lesser General Public License as published by
10 the Free Software Foundation; either version 2.1 of the License, or
11 (at your option) any later version.
13 systemd is distributed in the hope that it will be useful, but
14 WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16 Lesser General Public License for more details.
18 You should have received a copy of the GNU Lesser General Public License
19 along with systemd; If not, see <http://www.gnu.org/licenses/>.
22 #include "alloc-util.h"
23 #include "dhcp-lease-internal.h"
24 #include "network-internal.h"
27 static void test_deserialize_in_addr(void) {
28 _cleanup_free_
struct in_addr
*addresses
= NULL
;
29 _cleanup_free_
struct in6_addr
*addresses6
= NULL
;
30 struct in_addr a
, b
, c
;
31 struct in6_addr d
, e
, f
;
33 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";
35 assert_se(inet_pton(AF_INET
, "0:0:0:0:0:FFFF:204.152.189.116", &a
) == 0);
36 assert_se(inet_pton(AF_INET6
, "192.168.0.1", &d
) == 0);
38 assert_se(inet_pton(AF_INET
, "192.168.0.1", &a
) == 1);
39 assert_se(inet_pton(AF_INET
, "192.168.0.2", &b
) == 1);
40 assert_se(inet_pton(AF_INET
, "192.168.0.3", &c
) == 1);
41 assert_se(inet_pton(AF_INET6
, "0:0:0:0:0:FFFF:204.152.189.116", &d
) == 1);
42 assert_se(inet_pton(AF_INET6
, "::1", &e
) == 1);
43 assert_se(inet_pton(AF_INET6
, "1:0:0:0:0:0:0:8", &f
) == 1);
45 assert_se((size
= deserialize_in_addrs(&addresses
, addresses_string
)) >= 0);
47 assert_se(!memcmp(&a
, &addresses
[0], sizeof(struct in_addr
)));
48 assert_se(!memcmp(&b
, &addresses
[1], sizeof(struct in_addr
)));
49 assert_se(!memcmp(&c
, &addresses
[2], sizeof(struct in_addr
)));
51 assert_se((size
= deserialize_in6_addrs(&addresses6
, addresses_string
)) >= 0);
53 assert_se(!memcmp(&d
, &addresses6
[0], sizeof(struct in6_addr
)));
54 assert_se(!memcmp(&e
, &addresses6
[1], sizeof(struct in6_addr
)));
55 assert_se(!memcmp(&f
, &addresses6
[2], sizeof(struct in6_addr
)));
58 static void test_deserialize_dhcp_routes(void) {
59 size_t size
, allocated
;
62 _cleanup_free_
struct sd_dhcp_route
*routes
= NULL
;
63 assert_se(deserialize_dhcp_routes(&routes
, &size
, &allocated
, "") >= 0);
69 _cleanup_free_
struct sd_dhcp_route
*routes
= NULL
;
70 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";
72 assert_se(deserialize_dhcp_routes(&routes
, &size
, &allocated
, routes_string
) >= 0);
75 assert_se(routes
[0].dst_addr
.s_addr
== inet_addr("192.168.0.0"));
76 assert_se(routes
[0].gw_addr
.s_addr
== inet_addr("192.168.0.1"));
77 assert_se(routes
[0].dst_prefixlen
== 16);
79 assert_se(routes
[1].dst_addr
.s_addr
== inet_addr("10.1.2.0"));
80 assert_se(routes
[1].gw_addr
.s_addr
== inet_addr("10.1.2.1"));
81 assert_se(routes
[1].dst_prefixlen
== 24);
83 assert_se(routes
[2].dst_addr
.s_addr
== inet_addr("0.0.0.0"));
84 assert_se(routes
[2].gw_addr
.s_addr
== inet_addr("10.0.1.1"));
85 assert_se(routes
[2].dst_prefixlen
== 0);
89 /* error in second word */
90 _cleanup_free_
struct sd_dhcp_route
*routes
= NULL
;
91 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";
93 assert_se(deserialize_dhcp_routes(&routes
, &size
, &allocated
, routes_string
) >= 0);
96 assert_se(routes
[0].dst_addr
.s_addr
== inet_addr("192.168.0.0"));
97 assert_se(routes
[0].gw_addr
.s_addr
== inet_addr("192.168.0.1"));
98 assert_se(routes
[0].dst_prefixlen
== 16);
100 assert_se(routes
[1].dst_addr
.s_addr
== inet_addr("0.0.0.0"));
101 assert_se(routes
[1].gw_addr
.s_addr
== inet_addr("10.0.1.1"));
102 assert_se(routes
[1].dst_prefixlen
== 0);
106 /* error in every word */
107 _cleanup_free_
struct sd_dhcp_route
*routes
= NULL
;
108 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";
110 assert_se(deserialize_dhcp_routes(&routes
, &size
, &allocated
, routes_string
) >= 0);
111 assert_se(size
== 0);
115 static int test_load_config(Manager
*manager
) {
117 /* TODO: should_reload, is false if the config dirs do not exist, so
118 * so we can't do this test here, move it to a test for paths_check_timestamps
121 * assert_se(network_should_reload(manager) == true);
124 r
= manager_load_config(manager
);
129 assert_se(manager_should_reload(manager
) == false);
134 static void test_network_get(Manager
*manager
, struct udev_device
*loopback
) {
136 const struct ether_addr mac
= {};
138 /* let's assume that the test machine does not have a .network file
139 that applies to the loopback device... */
140 assert_se(network_get(manager
, loopback
, "lo", &mac
, &network
) == -ENOENT
);
144 static void test_address_equality(void) {
145 _cleanup_address_free_ Address
*a1
= NULL
, *a2
= NULL
;
147 assert_se(address_new(&a1
) >= 0);
148 assert_se(address_new(&a2
) >= 0);
150 assert_se(address_equal(NULL
, NULL
));
151 assert_se(!address_equal(a1
, NULL
));
152 assert_se(!address_equal(NULL
, a2
));
153 assert_se(address_equal(a1
, a2
));
155 a1
->family
= AF_INET
;
156 assert_se(!address_equal(a1
, a2
));
158 a2
->family
= AF_INET
;
159 assert_se(address_equal(a1
, a2
));
161 assert_se(inet_pton(AF_INET
, "192.168.3.9", &a1
->in_addr
.in
));
162 assert_se(!address_equal(a1
, a2
));
163 assert_se(inet_pton(AF_INET
, "192.168.3.9", &a2
->in_addr
.in
));
164 assert_se(address_equal(a1
, a2
));
165 assert_se(inet_pton(AF_INET
, "192.168.3.10", &a1
->in_addr_peer
.in
));
166 assert_se(address_equal(a1
, a2
));
167 assert_se(inet_pton(AF_INET
, "192.168.3.11", &a2
->in_addr_peer
.in
));
168 assert_se(address_equal(a1
, a2
));
170 assert_se(!address_equal(a1
, a2
));
172 assert_se(address_equal(a1
, a2
));
174 a1
->family
= AF_INET6
;
175 assert_se(!address_equal(a1
, a2
));
177 a2
->family
= AF_INET6
;
178 assert_se(inet_pton(AF_INET6
, "2001:4ca0:4f01::2", &a1
->in_addr
.in6
));
179 assert_se(inet_pton(AF_INET6
, "2001:4ca0:4f01::2", &a2
->in_addr
.in6
));
180 assert_se(address_equal(a1
, a2
));
183 assert_se(address_equal(a1
, a2
));
185 assert_se(inet_pton(AF_INET6
, "2001:4ca0:4f01::1", &a2
->in_addr
.in6
));
186 assert_se(!address_equal(a1
, a2
));
190 _cleanup_manager_free_ Manager
*manager
= NULL
;
192 struct udev_device
*loopback
;
195 test_deserialize_in_addr();
196 test_deserialize_dhcp_routes();
197 test_address_equality();
199 assert_se(manager_new(&manager
) >= 0);
201 r
= test_load_config(manager
);
203 return EXIT_TEST_SKIP
;
208 loopback
= udev_device_new_from_syspath(udev
, "/sys/class/net/lo");
210 assert_se(udev_device_get_ifindex(loopback
) == 1);
212 test_network_get(manager
, loopback
);
214 assert_se(manager_rtnl_enumerate_links(manager
) >= 0);
216 udev_device_unref(loopback
);