Remove g_type_init() calls
[platform/upstream/glib.git] / gio / tests / network-monitor.c
1 /* GIO - GLib Input, Output and Streaming Library
2  *
3  * Copyright 2011 Red Hat, Inc.
4  *
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.
9  *
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.
14  *
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.
19  */
20
21 #include "gio.h"
22
23 /* hack */
24 #define GIO_COMPILATION
25 #include "gnetworkmonitorbase.h"
26
27 #include <string.h>
28
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.
33  */
34
35 typedef struct {
36   const char *string;
37   GInetAddress *address;
38 } TestAddress;
39
40 typedef struct {
41   const char *mask_string;
42   GInetAddressMask *mask;
43   TestAddress *addresses;
44 } TestMask;
45
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 },
54   { NULL, NULL }
55 };
56 TestMask net127 = { "127.0.0.0/8", NULL, net127addrs };
57
58 TestAddress net10addrs[] = {
59   { "10.0.0.1", NULL },
60   { "10.0.0.2", NULL },
61   { "10.0.0.255", NULL },
62   { NULL, NULL }
63 };
64 TestMask net10 = { "10.0.0.0/24", NULL, net10addrs };
65
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 },
72   { NULL, NULL }
73 };
74 TestMask net192 = { "192.168.0.0/20", NULL, net192addrs };
75
76 TestAddress netlocal6addrs[] = {
77   { "::1", NULL },
78   { NULL, NULL }
79 };
80 TestMask netlocal6 = { "::1/128", NULL, netlocal6addrs };
81
82 TestAddress netfe80addrs[] = {
83   { "fe80::", NULL },
84   { "fe80::1", NULL },
85   { "fe80::21b:77ff:fea2:972a", NULL },
86   { NULL, NULL }
87 };
88 TestMask netfe80 = { "fe80::/64", NULL, netfe80addrs };
89
90 TestAddress unmatched[] = {
91   { "10.0.1.0", NULL },
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 },
98   { "::2", NULL },
99   { "1::1", NULL },
100   { "fe80::1:0:0:0:0", NULL },
101   { "fe80:8000::0:0:0:0", NULL },
102   { NULL, NULL }
103 };
104
105 GInetAddressMask *ip4_default, *ip6_default;
106
107 static void
108 notify_handler (GObject    *object,
109                 GParamSpec *pspec,
110                 gpointer    user_data)
111 {
112   gboolean *emitted = user_data;
113
114   *emitted = TRUE;
115 }
116
117 static void
118 network_changed_handler (GNetworkMonitor *monitor,
119                          gboolean         available,
120                          gpointer         user_data)
121 {
122   gboolean *emitted = user_data;
123
124   *emitted = TRUE;
125 }
126
127 static void
128 assert_signals (GNetworkMonitor *monitor,
129                 gboolean         should_emit_notify,
130                 gboolean         should_emit_network_changed,
131                 gboolean         expected_network_available)
132 {
133   gboolean emitted_notify = FALSE, emitted_network_changed = FALSE;
134   guint h1, h2;
135
136   h1 = g_signal_connect (monitor, "notify::network-available",
137                          G_CALLBACK (notify_handler),
138                          &emitted_notify);
139   h2 = g_signal_connect (monitor, "network-changed",
140                          G_CALLBACK (network_changed_handler),
141                          &emitted_network_changed);
142
143   g_main_context_iteration (NULL, FALSE);
144
145   g_signal_handler_disconnect (monitor, h1);
146   g_signal_handler_disconnect (monitor, h2);
147
148   g_assert (emitted_notify == should_emit_notify);
149   g_assert (emitted_network_changed == should_emit_network_changed);
150
151   g_assert (g_network_monitor_get_network_available (monitor) == expected_network_available);
152 }
153
154 typedef struct {
155   GNetworkMonitor *monitor;
156   GMainLoop       *loop;
157   GSocketAddress  *sockaddr;
158   gboolean         should_be_reachable;
159 } CanReachData;
160
161 static void
162 reach_cb (GObject      *source,
163           GAsyncResult *res,
164           gpointer      user_data)
165 {
166   GError *error = NULL;
167   gboolean reachable;
168   CanReachData *data = user_data;
169
170   reachable = g_network_monitor_can_reach_finish (data->monitor, res, &error);
171
172   if (data->should_be_reachable)
173     g_assert_no_error (error);
174   else
175     {
176       g_assert (error != NULL);
177       g_clear_error (&error);
178     }
179   g_assert (reachable == data->should_be_reachable);
180
181   g_main_loop_quit (data->loop);
182 }
183
184 static gboolean
185 test_reach_async (gpointer user_data)
186 {
187   CanReachData *data = user_data;
188
189   g_network_monitor_can_reach_async (data->monitor,
190                                      G_SOCKET_CONNECTABLE (data->sockaddr),
191                                      NULL,
192                                      reach_cb,
193                                      data);
194   return G_SOURCE_REMOVE;
195 }
196
197 static void
198 run_tests (GNetworkMonitor *monitor,
199            TestAddress     *addresses,
200            gboolean         should_be_reachable)
201 {
202   GError *error = NULL;
203   int i;
204   gboolean reachable;
205   GSocketAddress *sockaddr;
206   CanReachData data;
207
208   data.monitor = monitor;
209   data.loop = g_main_loop_new (NULL, FALSE);
210
211   for (i = 0; addresses[i].address; i++)
212     {
213       sockaddr = g_inet_socket_address_new (addresses[i].address, 0);
214       reachable = g_network_monitor_can_reach (monitor,
215                                                G_SOCKET_CONNECTABLE (sockaddr),
216                                                NULL, &error);
217       data.sockaddr = sockaddr;
218       data.should_be_reachable = should_be_reachable;
219
220       g_idle_add (test_reach_async, &data);
221       g_main_loop_run (data.loop);
222
223       g_object_unref (sockaddr);
224       g_assert_cmpint (reachable, ==, should_be_reachable);
225       if (should_be_reachable)
226         g_assert_no_error (error);
227       else
228         {
229           g_assert (error != NULL);
230           g_clear_error (&error);
231         }
232     }
233
234   g_main_loop_unref (data.loop);
235 }
236
237 static void
238 test_default (void)
239 {
240   GNetworkMonitor *monitor, *m;
241   GError *error = NULL;
242
243   m = g_network_monitor_get_default ();
244   g_assert (G_IS_NETWORK_MONITOR (m));
245
246   monitor = g_initable_new (G_TYPE_NETWORK_MONITOR_BASE, NULL, &error, NULL);
247   g_assert_no_error (error);
248
249   /* In the default configuration, all addresses are reachable */
250   run_tests (monitor, net127.addresses, TRUE);
251   run_tests (monitor, net10.addresses, TRUE);
252   run_tests (monitor, net192.addresses, TRUE);
253   run_tests (monitor, netlocal6.addresses, TRUE);
254   run_tests (monitor, netfe80.addresses, TRUE);
255   run_tests (monitor, unmatched, TRUE);
256
257   assert_signals (monitor, FALSE, FALSE, TRUE);
258
259   g_object_unref (monitor);
260 }
261
262 static void
263 test_remove_default (void)
264 {
265   GNetworkMonitor *monitor;
266   GError *error = NULL;
267
268   monitor = g_initable_new (G_TYPE_NETWORK_MONITOR_BASE, NULL, &error, NULL);
269   g_assert_no_error (error);
270   assert_signals (monitor, FALSE, FALSE, TRUE);
271
272   g_network_monitor_base_remove_network (G_NETWORK_MONITOR_BASE (monitor),
273                                          ip4_default);
274   assert_signals (monitor, FALSE, TRUE, TRUE);
275   g_network_monitor_base_remove_network (G_NETWORK_MONITOR_BASE (monitor),
276                                          ip6_default);
277   assert_signals (monitor, TRUE, TRUE, FALSE);
278
279   /* Now nothing should be reachable */
280   run_tests (monitor, net127.addresses, FALSE);
281   run_tests (monitor, net10.addresses, FALSE);
282   run_tests (monitor, net192.addresses, FALSE);
283   run_tests (monitor, netlocal6.addresses, FALSE);
284   run_tests (monitor, netfe80.addresses, FALSE);
285   run_tests (monitor, unmatched, FALSE);
286
287   g_object_unref (monitor);
288 }
289
290 static void
291 test_add_networks (void)
292 {
293   GNetworkMonitor *monitor;
294   GError *error = NULL;
295
296   monitor = g_initable_new (G_TYPE_NETWORK_MONITOR_BASE, NULL, &error, NULL);
297   g_assert_no_error (error);
298   assert_signals (monitor, FALSE, FALSE, TRUE);
299
300   g_network_monitor_base_remove_network (G_NETWORK_MONITOR_BASE (monitor),
301                                          ip4_default);
302   assert_signals (monitor, FALSE, TRUE, TRUE);
303   g_network_monitor_base_remove_network (G_NETWORK_MONITOR_BASE (monitor),
304                                          ip6_default);
305   assert_signals (monitor, TRUE, TRUE, FALSE);
306
307   /* Now add the masks one by one */
308
309   g_network_monitor_base_add_network (G_NETWORK_MONITOR_BASE (monitor),
310                                       net127.mask);
311   assert_signals (monitor, FALSE, TRUE, FALSE);
312
313   run_tests (monitor, net127.addresses, TRUE);
314   run_tests (monitor, net10.addresses, FALSE);
315   run_tests (monitor, net192.addresses, FALSE);
316   run_tests (monitor, netlocal6.addresses, FALSE);
317   run_tests (monitor, netfe80.addresses, FALSE);
318   run_tests (monitor, unmatched, FALSE);
319
320   g_network_monitor_base_add_network (G_NETWORK_MONITOR_BASE (monitor),
321                                       net10.mask);
322   assert_signals (monitor, FALSE, TRUE, FALSE);
323   run_tests (monitor, net127.addresses, TRUE);
324   run_tests (monitor, net10.addresses, TRUE);
325   run_tests (monitor, net192.addresses, FALSE);
326   run_tests (monitor, netlocal6.addresses, FALSE);
327   run_tests (monitor, netfe80.addresses, FALSE);
328   run_tests (monitor, unmatched, FALSE);
329
330   g_network_monitor_base_add_network (G_NETWORK_MONITOR_BASE (monitor),
331                                       net192.mask);
332   assert_signals (monitor, FALSE, TRUE, FALSE);
333   run_tests (monitor, net127.addresses, TRUE);
334   run_tests (monitor, net10.addresses, TRUE);
335   run_tests (monitor, net192.addresses, TRUE);
336   run_tests (monitor, netlocal6.addresses, FALSE);
337   run_tests (monitor, netfe80.addresses, FALSE);
338   run_tests (monitor, unmatched, FALSE);
339
340   g_network_monitor_base_add_network (G_NETWORK_MONITOR_BASE (monitor),
341                                       netlocal6.mask);
342   assert_signals (monitor, FALSE, TRUE, FALSE);
343   run_tests (monitor, net127.addresses, TRUE);
344   run_tests (monitor, net10.addresses, TRUE);
345   run_tests (monitor, net192.addresses, TRUE);
346   run_tests (monitor, netlocal6.addresses, TRUE);
347   run_tests (monitor, netfe80.addresses, FALSE);
348   run_tests (monitor, unmatched, FALSE);
349
350   g_network_monitor_base_add_network (G_NETWORK_MONITOR_BASE (monitor),
351                                       netfe80.mask);
352   assert_signals (monitor, FALSE, TRUE, FALSE);
353   run_tests (monitor, net127.addresses, TRUE);
354   run_tests (monitor, net10.addresses, TRUE);
355   run_tests (monitor, net192.addresses, TRUE);
356   run_tests (monitor, netlocal6.addresses, TRUE);
357   run_tests (monitor, netfe80.addresses, TRUE);
358   run_tests (monitor, unmatched, FALSE);
359
360   g_object_unref (monitor);
361 }
362
363 static void
364 test_remove_networks (void)
365 {
366   GNetworkMonitor *monitor;
367   GError *error = NULL;
368
369   monitor = g_initable_new (G_TYPE_NETWORK_MONITOR_BASE, NULL, &error, NULL);
370   g_assert_no_error (error);
371   assert_signals (monitor, FALSE, FALSE, TRUE);
372
373   g_network_monitor_base_remove_network (G_NETWORK_MONITOR_BASE (monitor),
374                                          ip4_default);
375   assert_signals (monitor, FALSE, TRUE, TRUE);
376   g_network_monitor_base_remove_network (G_NETWORK_MONITOR_BASE (monitor),
377                                          ip6_default);
378   assert_signals (monitor, TRUE, TRUE, FALSE);
379
380   /* First add them */
381   g_network_monitor_base_add_network (G_NETWORK_MONITOR_BASE (monitor),
382                                       net127.mask);
383   assert_signals (monitor, FALSE, TRUE, FALSE);
384   g_network_monitor_base_add_network (G_NETWORK_MONITOR_BASE (monitor),
385                                       net10.mask);
386   assert_signals (monitor, FALSE, TRUE, FALSE);
387   g_network_monitor_base_add_network (G_NETWORK_MONITOR_BASE (monitor),
388                                       net192.mask);
389   assert_signals (monitor, FALSE, TRUE, FALSE);
390   g_network_monitor_base_add_network (G_NETWORK_MONITOR_BASE (monitor),
391                                       netlocal6.mask);
392   assert_signals (monitor, FALSE, TRUE, FALSE);
393   g_network_monitor_base_add_network (G_NETWORK_MONITOR_BASE (monitor),
394                                       netfe80.mask);
395   assert_signals (monitor, FALSE, TRUE, FALSE);
396
397   run_tests (monitor, net127.addresses, TRUE);
398   run_tests (monitor, net10.addresses, TRUE);
399   run_tests (monitor, net192.addresses, TRUE);
400   run_tests (monitor, netlocal6.addresses, TRUE);
401   run_tests (monitor, netfe80.addresses, TRUE);
402   run_tests (monitor, unmatched, FALSE);
403
404   /* Now remove them one by one */
405   g_network_monitor_base_remove_network (G_NETWORK_MONITOR_BASE (monitor),
406                                          net127.mask);
407   assert_signals (monitor, FALSE, TRUE, FALSE);
408   run_tests (monitor, net127.addresses, FALSE);
409   run_tests (monitor, net10.addresses, TRUE);
410   run_tests (monitor, net192.addresses, TRUE);
411   run_tests (monitor, netlocal6.addresses, TRUE);
412   run_tests (monitor, netfe80.addresses, TRUE);
413   run_tests (monitor, unmatched, FALSE);
414
415   g_network_monitor_base_remove_network (G_NETWORK_MONITOR_BASE (monitor),
416                                          net10.mask);
417   assert_signals (monitor, FALSE, TRUE, FALSE);
418   run_tests (monitor, net127.addresses, FALSE);
419   run_tests (monitor, net10.addresses, FALSE);
420   run_tests (monitor, net192.addresses, TRUE);
421   run_tests (monitor, netlocal6.addresses, TRUE);
422   run_tests (monitor, netfe80.addresses, TRUE);
423   run_tests (monitor, unmatched, FALSE);
424
425   g_network_monitor_base_remove_network (G_NETWORK_MONITOR_BASE (monitor),
426                                          net192.mask);
427   assert_signals (monitor, FALSE, TRUE, FALSE);
428   run_tests (monitor, net127.addresses, FALSE);
429   run_tests (monitor, net10.addresses, FALSE);
430   run_tests (monitor, net192.addresses, FALSE);
431   run_tests (monitor, netlocal6.addresses, TRUE);
432   run_tests (monitor, netfe80.addresses, TRUE);
433   run_tests (monitor, unmatched, FALSE);
434
435   g_network_monitor_base_remove_network (G_NETWORK_MONITOR_BASE (monitor),
436                                          netlocal6.mask);
437   assert_signals (monitor, FALSE, TRUE, FALSE);
438   run_tests (monitor, net127.addresses, FALSE);
439   run_tests (monitor, net10.addresses, FALSE);
440   run_tests (monitor, net192.addresses, FALSE);
441   run_tests (monitor, netlocal6.addresses, FALSE);
442   run_tests (monitor, netfe80.addresses, TRUE);
443   run_tests (monitor, unmatched, FALSE);
444
445   g_network_monitor_base_remove_network (G_NETWORK_MONITOR_BASE (monitor),
446                                          netfe80.mask);
447   assert_signals (monitor, FALSE, TRUE, FALSE);
448   run_tests (monitor, net127.addresses, FALSE);
449   run_tests (monitor, net10.addresses, FALSE);
450   run_tests (monitor, net192.addresses, FALSE);
451   run_tests (monitor, netlocal6.addresses, FALSE);
452   run_tests (monitor, netfe80.addresses, FALSE);
453   run_tests (monitor, unmatched, FALSE);
454
455   g_object_unref (monitor);
456 }
457
458
459 static void
460 init_test (TestMask *test)
461 {
462   GError *error = NULL;
463   int i;
464
465   test->mask = g_inet_address_mask_new_from_string (test->mask_string, &error);
466   g_assert_no_error (error);
467
468   for (i = 0; test->addresses[i].string; i++)
469     {
470       test->addresses[i].address = g_inet_address_new_from_string (test->addresses[i].string);
471       if (strchr (test->addresses[i].string, ':'))
472         g_assert_cmpint (g_inet_address_get_family (test->addresses[i].address), ==, G_SOCKET_FAMILY_IPV6);
473       else
474         g_assert_cmpint (g_inet_address_get_family (test->addresses[i].address), ==, G_SOCKET_FAMILY_IPV4);
475     }
476 }
477
478 static void
479 cleanup_test (TestMask *test)
480 {
481   int i;
482
483   g_object_unref (test->mask);
484   for (i = 0; test->addresses[i].string; i++)
485     g_object_unref (test->addresses[i].address);
486 }
487
488 static void
489 watch_network_changed (GNetworkMonitor *monitor,
490                        gboolean         available,
491                        gpointer         user_data)
492 {
493   g_print ("Network is %s\n", available ? "up" : "down");
494 }
495
496 static void
497 do_watch_network (void)
498 {
499   GNetworkMonitor *monitor = g_network_monitor_get_default ();
500   GMainLoop *loop;
501
502   g_print ("Monitoring via %s\n", g_type_name_from_instance ((GTypeInstance *) monitor));
503
504   g_signal_connect (monitor, "network-changed",
505                     G_CALLBACK (watch_network_changed), NULL);
506   watch_network_changed (monitor, g_network_monitor_get_network_available (monitor), NULL);
507
508   loop = g_main_loop_new (NULL, FALSE);
509   g_main_loop_run (loop);
510 }
511
512 int
513 main (int argc, char **argv)
514 {
515   int ret;
516
517   if (argc == 2 && !strcmp (argv[1], "--watch"))
518     {
519       do_watch_network ();
520       return 0;
521     }
522
523   g_test_init (&argc, &argv, NULL);
524
525   init_test (&net127);
526   init_test (&net10);
527   init_test (&net192);
528   init_test (&netlocal6);
529   init_test (&netfe80);
530   ip4_default = g_inet_address_mask_new_from_string ("0.0.0.0/0", NULL);
531   ip6_default = g_inet_address_mask_new_from_string ("::/0", NULL);
532
533   g_test_add_func ("/network-monitor/default", test_default);
534   g_test_add_func ("/network-monitor/remove_default", test_remove_default);
535   g_test_add_func ("/network-monitor/add_networks", test_add_networks);
536   g_test_add_func ("/network-monitor/remove_networks", test_remove_networks);
537
538   ret = g_test_run ();
539
540   cleanup_test (&net127);
541   cleanup_test (&net10);
542   cleanup_test (&net192);
543   cleanup_test (&netlocal6);
544   cleanup_test (&netfe80);
545   g_object_unref (ip4_default);
546   g_object_unref (ip6_default);
547
548   return ret;
549 }