2 * Copyright (C) 2012 Openismus GmbH
4 * Author: Jens Georg <jensg@openismus.com>
6 * This library is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU Library General Public
8 * License as published by the Free Software Foundation; either
9 * version 2 of the License, or (at your option) any later version.
11 * This library is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 * Library General Public License for more details.
16 * You should have received a copy of the GNU Library General Public
17 * License along with this library; if not, write to the
18 * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
19 * Boston, MA 02111-1307, USA.
26 #include <libgssdp/gssdp-resource-browser.h>
27 #include <libgssdp/gssdp-protocol.h>
29 #include "test-util.h"
31 #define UUID_1 "uuid:81909e94-ebf4-469e-ac68-81f2f189de1b"
32 #define VERSIONED_NT_1 "urn:org-gupnp:device:FunctionalTest:1"
33 #define VERSIONED_NT_2 "urn:org-gupnp:device:FunctionalTest:9"
34 #define VERSIONED_USN_1 UUID_1"::"VERSIONED_NT_1
35 #define VERSIONED_USN_2 UUID_1"::"VERSIONED_NT_2
37 /* Helper functions */
44 GSocketAddress *sock_addr;
45 GInetAddress *address;
47 socket = g_socket_new (G_SOCKET_FAMILY_IPV4,
48 G_SOCKET_TYPE_DATAGRAM,
49 G_SOCKET_PROTOCOL_DEFAULT,
51 g_assert (error == NULL);
53 address = g_inet_address_new_from_string ("127.0.0.1");
54 sock_addr = g_inet_socket_address_new (address, 0);
55 g_object_unref (address);
57 g_socket_bind (socket, sock_addr, TRUE, &error);
58 g_assert (error == NULL);
59 g_object_unref (sock_addr);
65 create_alive_message (const char *nt)
69 if (strcmp (nt, UUID_1) == 0)
70 usn = g_strdup (UUID_1);
72 usn = g_strconcat (UUID_1, "::", nt, NULL);
74 msg = g_strdup_printf (SSDP_ALIVE_MESSAGE,
76 "http://127.0.0.1:1234",
78 "Linux/3.0 UPnP/1.0 GSSDPTesting/0.0.0",
87 create_byebye_message (const char *nt)
91 if (strcmp (nt, UUID_1) == 0)
92 usn = g_strdup (UUID_1);
94 usn = g_strconcat (UUID_1, "::", nt, NULL);
96 msg = g_strdup_printf (SSDP_BYEBYE_MESSAGE, nt, usn);
106 } TestDiscoverySSDPAllData;
110 on_test_discovery_ssdp_all_resource_available (GSSDPResourceBrowser *src,
115 TestDiscoverySSDPAllData *data = (TestDiscoverySSDPAllData *) user_data;
117 g_assert_cmpstr (usn, ==, data->usn);
121 g_main_loop_quit (data->loop);
125 on_test_discovery_ssdp_all_resource_unavailable (GSSDPResourceBrowser *src,
129 TestDiscoverySSDPAllData *data = (TestDiscoverySSDPAllData *) user_data;
131 g_assert_cmpstr (usn, ==, data->usn);
135 g_main_loop_quit (data->loop);
139 test_discovery_send_packet (gpointer user_data)
142 GError *error = NULL;
143 GSocketAddress *sock_addr;
144 GInetAddress *address;
145 char *msg = (char *) user_data;
147 socket = create_socket ();
149 address = g_inet_address_new_from_string (SSDP_ADDR);
151 sock_addr = g_inet_socket_address_new (address, SSDP_PORT);
152 g_object_unref (address);
154 g_socket_send_to (socket, sock_addr, msg, strlen (msg), NULL, &error);
155 g_assert (error == NULL);
157 g_object_unref (sock_addr);
158 g_object_unref (socket);
166 test_discovery_ssdp_all (void)
169 GSSDPResourceBrowser *browser;
170 GError *error = NULL;
171 TestDiscoverySSDPAllData data;
175 data.loop = g_main_loop_new (NULL, FALSE);
176 data.usn = UUID_1"::MyService:1";
179 client = gssdp_client_new (NULL, "lo", &error);
180 g_assert (client != NULL);
181 g_assert (error == NULL);
183 browser = gssdp_resource_browser_new (client, "ssdp:all");
184 signal_id = g_signal_connect (browser,
185 "resource-available",
186 G_CALLBACK (on_test_discovery_ssdp_all_resource_available),
188 gssdp_resource_browser_set_active (browser, TRUE);
190 timeout_id = g_timeout_add_seconds (10, quit_loop, data.loop);
192 /* delay announcement until browser issued its M-SEARCH */
193 g_timeout_add_seconds (1,
194 test_discovery_send_packet,
195 create_alive_message ("MyService:1"));
196 g_main_loop_run (data.loop);
198 g_assert (data.found);
201 g_signal_handler_disconnect (browser, signal_id);
202 g_timeout_add_seconds (1,
203 test_discovery_send_packet,
204 create_byebye_message ("MyService:1"));
205 signal_id = g_signal_connect (browser,
206 "resource-unavailable",
207 G_CALLBACK (on_test_discovery_ssdp_all_resource_unavailable),
209 g_main_loop_run (data.loop);
211 g_assert (data.found);
213 g_source_remove (timeout_id);
214 g_object_unref (browser);
215 g_object_unref (client);
216 g_main_loop_unref (data.loop);
220 test_discovery_upnp_rootdevice (void)
223 GSSDPResourceBrowser *browser;
224 GError *error = NULL;
225 TestDiscoverySSDPAllData data;
229 data.loop = g_main_loop_new (NULL, FALSE);
230 data.usn = UUID_1"::upnp:rootdevice";
233 client = gssdp_client_new (NULL, "lo", &error);
234 g_assert (client != NULL);
235 g_assert (error == NULL);
237 browser = gssdp_resource_browser_new (client, "upnp:rootdevice");
238 signal_id = g_signal_connect (browser,
239 "resource-available",
240 G_CALLBACK (on_test_discovery_ssdp_all_resource_available),
242 gssdp_resource_browser_set_active (browser, TRUE);
244 timeout_id = g_timeout_add_seconds (10, quit_loop, data.loop);
246 /* delay announcement until browser issued its M-SEARCH */
247 g_timeout_add_seconds (1,
248 test_discovery_send_packet,
249 create_alive_message ("upnp:rootdevice"));
250 g_main_loop_run (data.loop);
252 g_assert (data.found);
255 g_signal_handler_disconnect (browser, signal_id);
256 g_timeout_add_seconds (1,
257 test_discovery_send_packet,
258 create_byebye_message ("upnp:rootdevice"));
259 signal_id = g_signal_connect (browser,
260 "resource-unavailable",
261 G_CALLBACK (on_test_discovery_ssdp_all_resource_unavailable),
263 g_main_loop_run (data.loop);
265 g_assert (data.found);
267 g_source_remove (timeout_id);
268 g_object_unref (browser);
269 g_object_unref (client);
270 g_main_loop_unref (data.loop);
274 test_discovery_uuid (void)
277 GSSDPResourceBrowser *browser;
278 GError *error = NULL;
279 TestDiscoverySSDPAllData data;
283 data.loop = g_main_loop_new (NULL, FALSE);
287 client = gssdp_client_new (NULL, "lo", &error);
288 g_assert (client != NULL);
289 g_assert (error == NULL);
291 browser = gssdp_resource_browser_new (client, UUID_1);
292 signal_id = g_signal_connect (browser,
293 "resource-available",
294 G_CALLBACK (on_test_discovery_ssdp_all_resource_available),
296 gssdp_resource_browser_set_active (browser, TRUE);
298 timeout_id = g_timeout_add_seconds (10, quit_loop, data.loop);
300 /* delay announcement until browser issued its M-SEARCH */
301 g_timeout_add_seconds (1,
302 test_discovery_send_packet,
303 create_alive_message (UUID_1));
304 g_main_loop_run (data.loop);
306 g_assert (data.found);
309 g_signal_handler_disconnect (browser, signal_id);
310 g_timeout_add_seconds (1,
311 test_discovery_send_packet,
312 create_byebye_message (UUID_1));
313 signal_id = g_signal_connect (browser,
314 "resource-unavailable",
315 G_CALLBACK (on_test_discovery_ssdp_all_resource_unavailable),
317 g_main_loop_run (data.loop);
319 g_assert (data.found);
321 g_source_remove (timeout_id);
322 g_object_unref (browser);
323 g_object_unref (client);
324 g_main_loop_unref (data.loop);
329 test_discovery_versioned (void)
332 GSSDPResourceBrowser *browser;
333 GError *error = NULL;
334 TestDiscoverySSDPAllData data;
338 data.loop = g_main_loop_new (NULL, FALSE);
339 data.usn = VERSIONED_USN_1;
342 client = gssdp_client_new (NULL, "lo", &error);
343 g_assert (client != NULL);
344 g_assert (error == NULL);
346 browser = gssdp_resource_browser_new (client, VERSIONED_NT_1);
347 signal_id = g_signal_connect (browser,
348 "resource-available",
349 G_CALLBACK (on_test_discovery_ssdp_all_resource_available),
351 gssdp_resource_browser_set_active (browser, TRUE);
353 timeout_id = g_timeout_add_seconds (10, quit_loop, data.loop);
355 /* delay announcement until browser issued its M-SEARCH */
356 g_timeout_add_seconds (1,
357 test_discovery_send_packet,
358 create_alive_message (VERSIONED_NT_1));
359 g_main_loop_run (data.loop);
361 g_assert (data.found);
364 g_signal_handler_disconnect (browser, signal_id);
365 g_timeout_add_seconds (1,
366 test_discovery_send_packet,
367 create_byebye_message (VERSIONED_NT_1));
368 signal_id = g_signal_connect (browser,
369 "resource-unavailable",
370 G_CALLBACK (on_test_discovery_ssdp_all_resource_unavailable),
372 g_main_loop_run (data.loop);
374 g_assert (data.found);
376 /* check that the resource group doesn't trigger on other resources */
377 g_signal_handler_disconnect (browser, signal_id);
378 g_timeout_add_seconds (1,
379 test_discovery_send_packet,
380 create_byebye_message ("MyService:1"));
381 signal_id = g_signal_connect (browser,
382 "resource-available",
383 G_CALLBACK (on_resource_available_assert_not_reached),
385 g_source_remove (timeout_id);
386 timeout_id = g_timeout_add_seconds (5, quit_loop, data.loop);
387 g_main_loop_run (data.loop);
388 g_source_remove (timeout_id);
390 g_object_unref (browser);
391 g_object_unref (client);
392 g_main_loop_unref (data.loop);
396 * Search for FunctionalTest:1 and accept FunctionalTest:9
399 test_discovery_versioned_backwards_compatible (void)
402 GSSDPResourceBrowser *browser;
403 GError *error = NULL;
404 TestDiscoverySSDPAllData data;
408 data.loop = g_main_loop_new (NULL, FALSE);
409 data.usn = VERSIONED_USN_2;
412 client = gssdp_client_new (NULL, "lo", &error);
413 g_assert (client != NULL);
414 g_assert (error == NULL);
416 browser = gssdp_resource_browser_new (client, VERSIONED_NT_1);
417 signal_id = g_signal_connect (browser,
418 "resource-available",
419 G_CALLBACK (on_test_discovery_ssdp_all_resource_available),
421 gssdp_resource_browser_set_active (browser, TRUE);
423 timeout_id = g_timeout_add_seconds (10, quit_loop, data.loop);
425 /* delay announcement until browser issued its M-SEARCH */
426 g_timeout_add_seconds (1,
427 test_discovery_send_packet,
428 create_alive_message (VERSIONED_NT_2));
429 g_main_loop_run (data.loop);
431 g_assert (data.found);
434 g_signal_handler_disconnect (browser, signal_id);
435 g_timeout_add_seconds (1,
436 test_discovery_send_packet,
437 create_byebye_message (VERSIONED_NT_2));
438 signal_id = g_signal_connect (browser,
439 "resource-unavailable",
440 G_CALLBACK (on_test_discovery_ssdp_all_resource_unavailable),
442 g_main_loop_run (data.loop);
444 g_assert (data.found);
446 g_source_remove (timeout_id);
447 g_object_unref (browser);
448 g_object_unref (client);
449 g_main_loop_unref (data.loop);
453 * Search for FunctionalTest:9 and ignore FunctionalTest:1
456 test_discovery_versioned_ignore_older (void)
459 GSSDPResourceBrowser *browser;
460 GError *error = NULL;
463 loop = g_main_loop_new (NULL, FALSE);
465 client = gssdp_client_new (NULL, "lo", &error);
466 g_assert (client != NULL);
467 g_assert (error == NULL);
469 browser = gssdp_resource_browser_new (client, VERSIONED_NT_2);
470 g_signal_connect (browser,
471 "resource-available",
472 G_CALLBACK (on_resource_available_assert_not_reached),
474 gssdp_resource_browser_set_active (browser, TRUE);
476 g_timeout_add_seconds (5, quit_loop, loop);
478 /* delay announcement until browser issued its M-SEARCH */
479 g_timeout_add_seconds (1,
480 test_discovery_send_packet,
481 create_alive_message (VERSIONED_NT_1));
482 g_main_loop_run (loop);
484 g_object_unref (browser);
485 g_object_unref (client);
486 g_main_loop_unref (loop);
490 int main(int argc, char *argv[])
493 g_test_init (&argc, &argv, NULL);
495 g_test_add_func ("/functional/resource-group/discovery/ssdp:all",
496 test_discovery_ssdp_all);
498 g_test_add_func ("/functional/resource-group/discovery/upnp:rootdevice",
499 test_discovery_upnp_rootdevice);
501 g_test_add_func ("/functional/resource-group/discovery/uuid",
502 test_discovery_uuid);
504 g_test_add_func ("/functional/resource-group/discovery/versioned/matching",
505 test_discovery_versioned);
507 g_test_add_func ("/functional/resource-group/discovery/versioned/backwards-compatible",
508 test_discovery_versioned_backwards_compatible);
510 g_test_add_func ("/functional/resource-group/discovery/versioned/ignore-older",
511 test_discovery_versioned_ignore_older);