f57cc6fe6f8f944bda12847a6dfeba897fdac6d2
[profile/ivi/GSSDP.git] / tests / gtest / test-regression.c
1 /*
2  * Copyright (C) 2012 Openismus GmbH
3  *
4  * Author: Jens Georg <jensg@openismus.com>
5  *
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.
10  *
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.
15  *
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.
20  */
21
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
26
27 #include <string.h>
28
29 #include <gio/gio.h>
30
31 #include <libgssdp/gssdp-resource-browser.h>
32 #include <libgssdp/gssdp-resource-group.h>
33 #include <libgssdp/gssdp-protocol.h>
34
35 #include "test-util.h"
36
37 /* Utility functions */
38
39 static GSocket *
40 create_socket()
41 {
42         GSocket *socket;
43         GError *error = NULL;
44         GSocketAddress *sock_addr;
45         GInetAddress *address;
46
47         socket = g_socket_new (G_SOCKET_FAMILY_IPV4,
48                                G_SOCKET_TYPE_DATAGRAM,
49                                G_SOCKET_PROTOCOL_DEFAULT,
50                                &error);
51         g_assert (error == NULL);
52
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);
56
57         g_socket_bind (socket, sock_addr, TRUE, &error);
58         g_assert (error == NULL);
59         g_object_unref (sock_addr);
60
61         return socket;
62 }
63
64 char *
65 create_alive_message (const char *nt, int max_life)
66 {
67         char *usn, *msg;
68
69         if (strcmp (nt, UUID_1) == 0)
70                 usn = g_strdup (UUID_1);
71         else
72                 usn = g_strconcat (UUID_1, "::", nt, NULL);
73
74         msg = g_strdup_printf (SSDP_ALIVE_MESSAGE,
75                                max_life,
76                                "http://127.0.0.1:1234",
77                                "",
78                                "Linux/3.0 UPnP/1.0 GSSDPTesting/0.0.0",
79                                nt,
80                                usn);
81         g_free (usn);
82
83         return msg;
84 }
85
86
87 static gboolean
88 send_packet (gpointer user_data)
89 {
90         GSocket *socket;
91         GError *error = NULL;
92         GSocketAddress *sock_addr;
93         GInetAddress *address;
94         char *msg = (char *) user_data;
95
96         socket = create_socket ();
97
98         address = g_inet_address_new_from_string (SSDP_ADDR);
99
100         sock_addr = g_inet_socket_address_new (address, SSDP_PORT);
101         g_object_unref (address);
102
103         g_socket_send_to (socket, sock_addr, msg, strlen (msg), NULL, &error);
104         g_assert (error == NULL);
105
106         g_object_unref (sock_addr);
107         g_object_unref (socket);
108
109         g_free (msg);
110
111         return FALSE;
112 }
113
114 /* BEGIN Regression test
115  * https://bugzilla.gnome.org/show_bug.cgi?id=673150
116  */
117
118 static gboolean
119 on_test_bgo673150_delay_timeout (gpointer user_data)
120 {
121         GSSDPResourceBrowser *browser = GSSDP_RESOURCE_BROWSER (user_data);
122
123         gssdp_resource_browser_set_active (browser, TRUE);
124         g_assert (gssdp_resource_browser_get_active (browser));
125
126         return FALSE;
127 }
128
129 static void
130 test_bgo673150 (void)
131 {
132         GSSDPClient *dest, *src;
133         GSSDPResourceBrowser *browser;
134         GSSDPResourceGroup *group;
135         GError *error = NULL;
136         GMainLoop *loop;
137         gulong signal_id;
138
139         dest = gssdp_client_new (NULL, "lo", &error);
140         g_assert (dest != NULL);
141         g_assert (error == NULL);
142
143         src = gssdp_client_new (NULL, "lo", &error);
144         g_assert (src != NULL);
145         g_assert (error == NULL);
146
147         group = gssdp_resource_group_new (src);
148         gssdp_resource_group_add_resource_simple (group,
149                                                   USN,
150                                                   UUID_1"::"USN,
151                                                   "http://127.0.0.1:3456");
152         gssdp_resource_group_set_max_age (group, 10);
153
154         browser = gssdp_resource_browser_new (dest, USN_1);
155
156         signal_id = g_signal_connect (browser,
157                                       "resource-unavailable",
158                                       G_CALLBACK (on_resource_unavailable_assert_not_reached),
159                                       NULL);
160
161         /* Delay resource browser until ressource group sent its initial
162          * announcement */
163         g_timeout_add_seconds (5, on_test_bgo673150_delay_timeout, browser);
164
165         gssdp_resource_group_set_available (group, TRUE);
166
167         g_assert (gssdp_resource_group_get_available (group));
168
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);
172
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);
180 }
181
182 /* END Regression test
183  * https://bugzilla.gnome.org/show_bug.cgi?id=673150
184  * ============================================================================
185  */
186
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
191  *   5 s.
192  * - Check that there is a "resource-unavailable" signal.
193  * - Shut down the ResourceBrowser and assert that there is NO
194  *   "resource-unavailable" signal.
195  */
196
197 static gboolean
198 announce_ressource_bgo682099 (gpointer user_data)
199 {
200         send_packet (create_alive_message (USN_1, 5));
201
202         return FALSE;
203 }
204
205 static void
206 resource_unavailabe_bgo682099 (GSSDPResourceBrowser *src,
207                                const char           *usn,
208                                gpointer              user_data)
209 {
210         g_assert_cmpstr (usn, ==, NT_1);
211         g_main_loop_quit ((GMainLoop *) user_data);
212 }
213
214 void test_bgo682099 (void)
215 {
216         GSSDPClient *dest;
217         GSSDPResourceBrowser *browser;
218         GError *error = NULL;
219         GMainLoop *loop;
220         gulong signal_id;
221
222         loop = g_main_loop_new (NULL, FALSE);
223
224         dest = gssdp_client_new (NULL, "lo", &error);
225         g_assert (dest != NULL);
226         g_assert (error == NULL);
227
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),
232                                       loop);
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),
240                                       NULL);
241         g_idle_add (unref_object, browser);
242         g_timeout_add_seconds (10, quit_loop, loop);
243         g_main_loop_run (loop);
244 }
245
246 /* END Regression test
247  * https://bugzilla.gnome.org/show_bug.cgi?id=682099
248  * ============================================================================
249  */
250
251 int main (int argc, char *argv[])
252 {
253         g_type_init ();
254         g_test_init (&argc, &argv, NULL);
255
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);
259         }
260
261         g_test_run ();
262
263         return 0;
264 }