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.
22 #define UUID_1 "uuid:81909e94-ebf4-469e-ac68-81f2f189de1b"
23 #define USN "urn:org-gupnp:device:RegressionTest673150:2"
24 #define USN_1 "urn:org-gupnp:device:RegressionTest673150:1"
25 #define NT_1 UUID_1"::"USN_1
31 #include <libgssdp/gssdp-resource-browser.h>
32 #include <libgssdp/gssdp-resource-group.h>
33 #include <libgssdp/gssdp-protocol.h>
35 #include "test-util.h"
37 /* Utility 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, int max_life)
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",
88 send_packet (gpointer user_data)
92 GSocketAddress *sock_addr;
93 GInetAddress *address;
94 char *msg = (char *) user_data;
96 socket = create_socket ();
98 address = g_inet_address_new_from_string (SSDP_ADDR);
100 sock_addr = g_inet_socket_address_new (address, SSDP_PORT);
101 g_object_unref (address);
103 g_socket_send_to (socket, sock_addr, msg, strlen (msg), NULL, &error);
104 g_assert (error == NULL);
106 g_object_unref (sock_addr);
107 g_object_unref (socket);
114 /* BEGIN Regression test
115 * https://bugzilla.gnome.org/show_bug.cgi?id=673150
119 on_test_bgo673150_delay_timeout (gpointer user_data)
121 GSSDPResourceBrowser *browser = GSSDP_RESOURCE_BROWSER (user_data);
123 gssdp_resource_browser_set_active (browser, TRUE);
124 g_assert (gssdp_resource_browser_get_active (browser));
130 test_bgo673150 (void)
132 GSSDPClient *dest, *src;
133 GSSDPResourceBrowser *browser;
134 GSSDPResourceGroup *group;
135 GError *error = NULL;
139 dest = gssdp_client_new (NULL, "lo", &error);
140 g_assert (dest != NULL);
141 g_assert (error == NULL);
143 src = gssdp_client_new (NULL, "lo", &error);
144 g_assert (src != NULL);
145 g_assert (error == NULL);
147 group = gssdp_resource_group_new (src);
148 gssdp_resource_group_add_resource_simple (group,
151 "http://127.0.0.1:3456");
152 gssdp_resource_group_set_max_age (group, 10);
154 browser = gssdp_resource_browser_new (dest, USN_1);
156 signal_id = g_signal_connect (browser,
157 "resource-unavailable",
158 G_CALLBACK (on_resource_unavailable_assert_not_reached),
161 /* Delay resource browser until ressource group sent its initial
163 g_timeout_add_seconds (5, on_test_bgo673150_delay_timeout, browser);
165 gssdp_resource_group_set_available (group, TRUE);
167 g_assert (gssdp_resource_group_get_available (group));
169 loop = g_main_loop_new (NULL, FALSE);
170 g_timeout_add_seconds (30, (GSourceFunc) g_main_loop_quit, loop);
171 g_main_loop_run (loop);
173 /* prevent the _unref from triggering the assertion */
174 g_signal_handler_disconnect (browser, signal_id);
175 g_object_unref (group);
176 g_object_unref (browser);
177 g_object_unref (src);
178 g_object_unref (dest);
179 g_main_loop_unref (loop);
182 /* END Regression test
183 * https://bugzilla.gnome.org/show_bug.cgi?id=673150
184 * ============================================================================
187 /* BEGIN Regression test
188 * https://bugzilla.gnome.org/show_bug.cgi?id=682099
189 * ============================================================================
190 * - Start a resource browser and send a single SSDP packet with a lifetime of
192 * - Check that there is a "resource-unavailable" signal.
193 * - Shut down the ResourceBrowser and assert that there is NO
194 * "resource-unavailable" signal.
198 announce_ressource_bgo682099 (gpointer user_data)
200 send_packet (create_alive_message (USN_1, 5));
206 resource_unavailabe_bgo682099 (GSSDPResourceBrowser *src,
210 g_assert_cmpstr (usn, ==, NT_1);
211 g_main_loop_quit ((GMainLoop *) user_data);
214 void test_bgo682099 (void)
217 GSSDPResourceBrowser *browser;
218 GError *error = NULL;
222 loop = g_main_loop_new (NULL, FALSE);
224 dest = gssdp_client_new (NULL, "lo", &error);
225 g_assert (dest != NULL);
226 g_assert (error == NULL);
228 browser = gssdp_resource_browser_new (dest, USN_1);
229 signal_id = g_signal_connect (browser,
230 "resource-unavailable",
231 G_CALLBACK (resource_unavailabe_bgo682099),
233 gssdp_resource_browser_set_active (browser, TRUE);
234 g_timeout_add_seconds (2, announce_ressource_bgo682099, NULL);
235 g_main_loop_run (loop);
236 g_signal_handler_disconnect (browser, signal_id);
237 signal_id = g_signal_connect (browser,
238 "resource-unavailable",
239 G_CALLBACK (on_resource_unavailable_assert_not_reached),
241 g_idle_add (unref_object, browser);
242 g_timeout_add_seconds (10, quit_loop, loop);
243 g_main_loop_run (loop);
246 /* END Regression test
247 * https://bugzilla.gnome.org/show_bug.cgi?id=682099
248 * ============================================================================
251 int main (int argc, char *argv[])
254 g_test_init (&argc, &argv, NULL);
256 if (g_test_slow ()) {
257 g_test_add_func ("/bugs/gnome/673150", test_bgo673150);
258 g_test_add_func ("/bugs/gnome/682099", test_bgo682099);