1 /* GIO - GLib Input, Output and Streaming Library
3 * Copyright 2011 Red Hat, Inc.
5 * This library is free software; you can redistribute it and/or
6 * modify it under the terms of the GNU Lesser General Public
7 * License as published by the Free Software Foundation; either
8 * version 2 of the License, or (at your option) any later version.
10 * This library is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 * Lesser General Public License for more details.
15 * You should have received a copy of the GNU Lesser General
16 * Public License along with this library; if not, write to the
17 * Free Software Foundation, Inc., 59 Temple Place, Suite 330,
18 * Boston, MA 02111-1307, USA.
24 #define GIO_COMPILATION
25 #include "gnetworkmonitorbase.h"
29 /* Test data; the GInetAddresses and GInetAddressMasks get filled in
30 * in main(). Each address in a TestAddress matches the mask in its
31 * corresponding TestMask, and none of them match any of the other
32 * masks. The addresses in unmatched don't match any of the masks.
37 GInetAddress *address;
41 const char *mask_string;
42 GInetAddressMask *mask;
43 TestAddress *addresses;
46 TestAddress net127addrs[] = {
47 { "127.0.0.1", NULL },
48 { "127.0.0.2", NULL },
49 { "127.0.0.255", NULL },
50 { "127.0.1.0", NULL },
51 { "127.0.255.0", NULL },
52 { "127.0.255.0", NULL },
53 { "127.255.255.255", NULL },
56 TestMask net127 = { "127.0.0.0/8", NULL, net127addrs };
58 TestAddress net10addrs[] = {
61 { "10.0.0.255", NULL },
64 TestMask net10 = { "10.0.0.0/24", NULL, net10addrs };
66 TestAddress net192addrs[] = {
67 { "192.168.0.1", NULL },
68 { "192.168.0.2", NULL },
69 { "192.168.0.255", NULL },
70 { "192.168.1.0", NULL },
71 { "192.168.15.0", NULL },
74 TestMask net192 = { "192.168.0.0/20", NULL, net192addrs };
76 TestAddress netlocal6addrs[] = {
80 TestMask netlocal6 = { "::1/128", NULL, netlocal6addrs };
82 TestAddress netfe80addrs[] = {
85 { "fe80::21b:77ff:fea2:972a", NULL },
88 TestMask netfe80 = { "fe80::/64", NULL, netfe80addrs };
90 TestAddress unmatched[] = {
92 { "10.0.255.0", NULL },
93 { "10.255.255.255", NULL },
94 { "192.168.16.0", NULL },
95 { "192.168.255.0", NULL },
96 { "192.169.0.0", NULL },
97 { "192.255.255.255", NULL },
100 { "fe80::1:0:0:0:0", NULL },
101 { "fe80:8000::0:0:0:0", NULL },
105 GInetAddressMask *ip4_default, *ip6_default;
108 notify_handler (GObject *object,
112 gboolean *emitted = user_data;
118 network_changed_handler (GNetworkMonitor *monitor,
122 gboolean *emitted = user_data;
128 assert_signals (GNetworkMonitor *monitor,
129 gboolean should_emit_notify,
130 gboolean should_emit_network_changed,
131 gboolean expected_network_available)
133 gboolean emitted_notify = FALSE, emitted_network_changed = FALSE;
136 h1 = g_signal_connect (monitor, "notify::network-available",
137 G_CALLBACK (notify_handler),
139 h2 = g_signal_connect (monitor, "network-changed",
140 G_CALLBACK (network_changed_handler),
141 &emitted_network_changed);
143 g_main_context_iteration (NULL, FALSE);
145 g_signal_handler_disconnect (monitor, h1);
146 g_signal_handler_disconnect (monitor, h2);
148 g_assert (emitted_notify == should_emit_notify);
149 g_assert (emitted_network_changed == should_emit_network_changed);
151 g_assert (g_network_monitor_get_network_available (monitor) == expected_network_available);
155 run_tests (GNetworkMonitor *monitor,
156 TestAddress *addresses,
157 gboolean should_be_reachable)
159 GError *error = NULL;
162 GSocketAddress *sockaddr;
164 for (i = 0; addresses[i].address; i++)
166 sockaddr = g_inet_socket_address_new (addresses[i].address, 0);
167 reachable = g_network_monitor_can_reach (monitor,
168 G_SOCKET_CONNECTABLE (sockaddr),
170 g_object_unref (sockaddr);
171 g_assert_cmpint (reachable, ==, should_be_reachable);
172 if (should_be_reachable)
173 g_assert_no_error (error);
176 g_assert (error != NULL);
177 g_clear_error (&error);
185 GNetworkMonitor *monitor;
186 GError *error = NULL;
188 monitor = g_initable_new (G_TYPE_NETWORK_MONITOR_BASE, NULL, &error, NULL);
189 g_assert_no_error (error);
191 /* In the default configuration, all addresses are reachable */
192 run_tests (monitor, net127.addresses, TRUE);
193 run_tests (monitor, net10.addresses, TRUE);
194 run_tests (monitor, net192.addresses, TRUE);
195 run_tests (monitor, netlocal6.addresses, TRUE);
196 run_tests (monitor, netfe80.addresses, TRUE);
197 run_tests (monitor, unmatched, TRUE);
199 assert_signals (monitor, FALSE, FALSE, TRUE);
201 g_object_unref (monitor);
205 test_remove_default (void)
207 GNetworkMonitor *monitor;
208 GError *error = NULL;
210 monitor = g_initable_new (G_TYPE_NETWORK_MONITOR_BASE, NULL, &error, NULL);
211 g_assert_no_error (error);
212 assert_signals (monitor, FALSE, FALSE, TRUE);
214 g_network_monitor_base_remove_network (G_NETWORK_MONITOR_BASE (monitor),
216 assert_signals (monitor, FALSE, TRUE, TRUE);
217 g_network_monitor_base_remove_network (G_NETWORK_MONITOR_BASE (monitor),
219 assert_signals (monitor, TRUE, TRUE, FALSE);
221 /* Now nothing should be reachable */
222 run_tests (monitor, net127.addresses, FALSE);
223 run_tests (monitor, net10.addresses, FALSE);
224 run_tests (monitor, net192.addresses, FALSE);
225 run_tests (monitor, netlocal6.addresses, FALSE);
226 run_tests (monitor, netfe80.addresses, FALSE);
227 run_tests (monitor, unmatched, FALSE);
229 g_object_unref (monitor);
233 test_add_networks (void)
235 GNetworkMonitor *monitor;
236 GError *error = NULL;
238 monitor = g_initable_new (G_TYPE_NETWORK_MONITOR_BASE, NULL, &error, NULL);
239 g_assert_no_error (error);
240 assert_signals (monitor, FALSE, FALSE, TRUE);
242 g_network_monitor_base_remove_network (G_NETWORK_MONITOR_BASE (monitor),
244 assert_signals (monitor, FALSE, TRUE, TRUE);
245 g_network_monitor_base_remove_network (G_NETWORK_MONITOR_BASE (monitor),
247 assert_signals (monitor, TRUE, TRUE, FALSE);
249 /* Now add the masks one by one */
251 g_network_monitor_base_add_network (G_NETWORK_MONITOR_BASE (monitor),
253 assert_signals (monitor, FALSE, TRUE, FALSE);
255 run_tests (monitor, net127.addresses, TRUE);
256 run_tests (monitor, net10.addresses, FALSE);
257 run_tests (monitor, net192.addresses, FALSE);
258 run_tests (monitor, netlocal6.addresses, FALSE);
259 run_tests (monitor, netfe80.addresses, FALSE);
260 run_tests (monitor, unmatched, FALSE);
262 g_network_monitor_base_add_network (G_NETWORK_MONITOR_BASE (monitor),
264 assert_signals (monitor, FALSE, TRUE, FALSE);
265 run_tests (monitor, net127.addresses, TRUE);
266 run_tests (monitor, net10.addresses, TRUE);
267 run_tests (monitor, net192.addresses, FALSE);
268 run_tests (monitor, netlocal6.addresses, FALSE);
269 run_tests (monitor, netfe80.addresses, FALSE);
270 run_tests (monitor, unmatched, FALSE);
272 g_network_monitor_base_add_network (G_NETWORK_MONITOR_BASE (monitor),
274 assert_signals (monitor, FALSE, TRUE, FALSE);
275 run_tests (monitor, net127.addresses, TRUE);
276 run_tests (monitor, net10.addresses, TRUE);
277 run_tests (monitor, net192.addresses, TRUE);
278 run_tests (monitor, netlocal6.addresses, FALSE);
279 run_tests (monitor, netfe80.addresses, FALSE);
280 run_tests (monitor, unmatched, FALSE);
282 g_network_monitor_base_add_network (G_NETWORK_MONITOR_BASE (monitor),
284 assert_signals (monitor, FALSE, TRUE, FALSE);
285 run_tests (monitor, net127.addresses, TRUE);
286 run_tests (monitor, net10.addresses, TRUE);
287 run_tests (monitor, net192.addresses, TRUE);
288 run_tests (monitor, netlocal6.addresses, TRUE);
289 run_tests (monitor, netfe80.addresses, FALSE);
290 run_tests (monitor, unmatched, FALSE);
292 g_network_monitor_base_add_network (G_NETWORK_MONITOR_BASE (monitor),
294 assert_signals (monitor, FALSE, TRUE, FALSE);
295 run_tests (monitor, net127.addresses, TRUE);
296 run_tests (monitor, net10.addresses, TRUE);
297 run_tests (monitor, net192.addresses, TRUE);
298 run_tests (monitor, netlocal6.addresses, TRUE);
299 run_tests (monitor, netfe80.addresses, TRUE);
300 run_tests (monitor, unmatched, FALSE);
302 g_object_unref (monitor);
306 test_remove_networks (void)
308 GNetworkMonitor *monitor;
309 GError *error = NULL;
311 monitor = g_initable_new (G_TYPE_NETWORK_MONITOR_BASE, NULL, &error, NULL);
312 g_assert_no_error (error);
313 assert_signals (monitor, FALSE, FALSE, TRUE);
315 g_network_monitor_base_remove_network (G_NETWORK_MONITOR_BASE (monitor),
317 assert_signals (monitor, FALSE, TRUE, TRUE);
318 g_network_monitor_base_remove_network (G_NETWORK_MONITOR_BASE (monitor),
320 assert_signals (monitor, TRUE, TRUE, FALSE);
323 g_network_monitor_base_add_network (G_NETWORK_MONITOR_BASE (monitor),
325 assert_signals (monitor, FALSE, TRUE, FALSE);
326 g_network_monitor_base_add_network (G_NETWORK_MONITOR_BASE (monitor),
328 assert_signals (monitor, FALSE, TRUE, FALSE);
329 g_network_monitor_base_add_network (G_NETWORK_MONITOR_BASE (monitor),
331 assert_signals (monitor, FALSE, TRUE, FALSE);
332 g_network_monitor_base_add_network (G_NETWORK_MONITOR_BASE (monitor),
334 assert_signals (monitor, FALSE, TRUE, FALSE);
335 g_network_monitor_base_add_network (G_NETWORK_MONITOR_BASE (monitor),
337 assert_signals (monitor, FALSE, TRUE, FALSE);
339 run_tests (monitor, net127.addresses, TRUE);
340 run_tests (monitor, net10.addresses, TRUE);
341 run_tests (monitor, net192.addresses, TRUE);
342 run_tests (monitor, netlocal6.addresses, TRUE);
343 run_tests (monitor, netfe80.addresses, TRUE);
344 run_tests (monitor, unmatched, FALSE);
346 /* Now remove them one by one */
347 g_network_monitor_base_remove_network (G_NETWORK_MONITOR_BASE (monitor),
349 assert_signals (monitor, FALSE, TRUE, FALSE);
350 run_tests (monitor, net127.addresses, FALSE);
351 run_tests (monitor, net10.addresses, TRUE);
352 run_tests (monitor, net192.addresses, TRUE);
353 run_tests (monitor, netlocal6.addresses, TRUE);
354 run_tests (monitor, netfe80.addresses, TRUE);
355 run_tests (monitor, unmatched, FALSE);
357 g_network_monitor_base_remove_network (G_NETWORK_MONITOR_BASE (monitor),
359 assert_signals (monitor, FALSE, TRUE, FALSE);
360 run_tests (monitor, net127.addresses, FALSE);
361 run_tests (monitor, net10.addresses, FALSE);
362 run_tests (monitor, net192.addresses, TRUE);
363 run_tests (monitor, netlocal6.addresses, TRUE);
364 run_tests (monitor, netfe80.addresses, TRUE);
365 run_tests (monitor, unmatched, FALSE);
367 g_network_monitor_base_remove_network (G_NETWORK_MONITOR_BASE (monitor),
369 assert_signals (monitor, FALSE, TRUE, FALSE);
370 run_tests (monitor, net127.addresses, FALSE);
371 run_tests (monitor, net10.addresses, FALSE);
372 run_tests (monitor, net192.addresses, FALSE);
373 run_tests (monitor, netlocal6.addresses, TRUE);
374 run_tests (monitor, netfe80.addresses, TRUE);
375 run_tests (monitor, unmatched, FALSE);
377 g_network_monitor_base_remove_network (G_NETWORK_MONITOR_BASE (monitor),
379 assert_signals (monitor, FALSE, TRUE, FALSE);
380 run_tests (monitor, net127.addresses, FALSE);
381 run_tests (monitor, net10.addresses, FALSE);
382 run_tests (monitor, net192.addresses, FALSE);
383 run_tests (monitor, netlocal6.addresses, FALSE);
384 run_tests (monitor, netfe80.addresses, TRUE);
385 run_tests (monitor, unmatched, FALSE);
387 g_network_monitor_base_remove_network (G_NETWORK_MONITOR_BASE (monitor),
389 assert_signals (monitor, FALSE, TRUE, FALSE);
390 run_tests (monitor, net127.addresses, FALSE);
391 run_tests (monitor, net10.addresses, FALSE);
392 run_tests (monitor, net192.addresses, FALSE);
393 run_tests (monitor, netlocal6.addresses, FALSE);
394 run_tests (monitor, netfe80.addresses, FALSE);
395 run_tests (monitor, unmatched, FALSE);
397 g_object_unref (monitor);
402 init_test (TestMask *test)
404 GError *error = NULL;
407 test->mask = g_inet_address_mask_new_from_string (test->mask_string, &error);
408 g_assert_no_error (error);
410 for (i = 0; test->addresses[i].string; i++)
412 test->addresses[i].address = g_inet_address_new_from_string (test->addresses[i].string);
413 if (strchr (test->addresses[i].string, ':'))
414 g_assert_cmpint (g_inet_address_get_family (test->addresses[i].address), ==, G_SOCKET_FAMILY_IPV6);
416 g_assert_cmpint (g_inet_address_get_family (test->addresses[i].address), ==, G_SOCKET_FAMILY_IPV4);
421 watch_network_changed (GNetworkMonitor *monitor,
425 g_print ("Network is %s\n", available ? "up" : "down");
429 do_watch_network (void)
431 GNetworkMonitor *monitor = g_network_monitor_get_default ();
434 g_print ("Monitoring via %s\n", g_type_name_from_instance ((GTypeInstance *) monitor));
436 g_signal_connect (monitor, "network-changed",
437 G_CALLBACK (watch_network_changed), NULL);
438 watch_network_changed (monitor, g_network_monitor_get_network_available (monitor), NULL);
440 loop = g_main_loop_new (NULL, FALSE);
441 g_main_loop_run (loop);
445 main (int argc, char **argv)
449 if (argc == 2 && !strcmp (argv[1], "--watch"))
455 g_test_init (&argc, &argv, NULL);
460 init_test (&netlocal6);
461 init_test (&netfe80);
462 ip4_default = g_inet_address_mask_new_from_string ("0.0.0.0/0", NULL);
463 ip6_default = g_inet_address_mask_new_from_string ("::/0", NULL);
465 g_test_add_func ("/network-monitor/default", test_default);
466 g_test_add_func ("/network-monitor/remove_default", test_remove_default);
467 g_test_add_func ("/network-monitor/add_networks", test_add_networks);
468 g_test_add_func ("/network-monitor/remove_networks", test_remove_networks);
470 return g_test_run ();