summaryrefslogtreecommitdiff
path: root/tests
diff options
context:
space:
mode:
authorJens Georg <mail@jensge.org>2012-08-18 11:41:12 +0200
committerJens Georg <mail@jensge.org>2012-08-18 12:00:45 +0200
commitc47d522e23fff7cabb0d0e962f475b76053a2019 (patch)
tree276066d9255471a2586857b623125833b36e403c /tests
parent13568732afa3cef4107c993c533ae7aa07a9c13b (diff)
downloadgssdp-c47d522e23fff7cabb0d0e962f475b76053a2019.tar.gz
Add regression test for bgo#682099
Diffstat (limited to 'tests')
-rw-r--r--tests/gtest/test-regression.c160
-rw-r--r--tests/gtest/test-util.c8
-rw-r--r--tests/gtest/test-util.h3
3 files changed, 169 insertions, 2 deletions
diff --git a/tests/gtest/test-regression.c b/tests/gtest/test-regression.c
index c93b9fc..f57cc6f 100644
--- a/tests/gtest/test-regression.c
+++ b/tests/gtest/test-regression.c
@@ -22,12 +22,99 @@
#define UUID_1 "uuid:81909e94-ebf4-469e-ac68-81f2f189de1b"
#define USN "urn:org-gupnp:device:RegressionTest673150:2"
#define USN_1 "urn:org-gupnp:device:RegressionTest673150:1"
+#define NT_1 UUID_1"::"USN_1
+
+#include <string.h>
+
+#include <gio/gio.h>
#include <libgssdp/gssdp-resource-browser.h>
#include <libgssdp/gssdp-resource-group.h>
+#include <libgssdp/gssdp-protocol.h>
#include "test-util.h"
+/* Utility functions */
+
+static GSocket *
+create_socket()
+{
+ GSocket *socket;
+ GError *error = NULL;
+ GSocketAddress *sock_addr;
+ GInetAddress *address;
+
+ socket = g_socket_new (G_SOCKET_FAMILY_IPV4,
+ G_SOCKET_TYPE_DATAGRAM,
+ G_SOCKET_PROTOCOL_DEFAULT,
+ &error);
+ g_assert (error == NULL);
+
+ address = g_inet_address_new_from_string ("127.0.0.1");
+ sock_addr = g_inet_socket_address_new (address, 0);
+ g_object_unref (address);
+
+ g_socket_bind (socket, sock_addr, TRUE, &error);
+ g_assert (error == NULL);
+ g_object_unref (sock_addr);
+
+ return socket;
+}
+
+char *
+create_alive_message (const char *nt, int max_life)
+{
+ char *usn, *msg;
+
+ if (strcmp (nt, UUID_1) == 0)
+ usn = g_strdup (UUID_1);
+ else
+ usn = g_strconcat (UUID_1, "::", nt, NULL);
+
+ msg = g_strdup_printf (SSDP_ALIVE_MESSAGE,
+ max_life,
+ "http://127.0.0.1:1234",
+ "",
+ "Linux/3.0 UPnP/1.0 GSSDPTesting/0.0.0",
+ nt,
+ usn);
+ g_free (usn);
+
+ return msg;
+}
+
+
+static gboolean
+send_packet (gpointer user_data)
+{
+ GSocket *socket;
+ GError *error = NULL;
+ GSocketAddress *sock_addr;
+ GInetAddress *address;
+ char *msg = (char *) user_data;
+
+ socket = create_socket ();
+
+ address = g_inet_address_new_from_string (SSDP_ADDR);
+
+ sock_addr = g_inet_socket_address_new (address, SSDP_PORT);
+ g_object_unref (address);
+
+ g_socket_send_to (socket, sock_addr, msg, strlen (msg), NULL, &error);
+ g_assert (error == NULL);
+
+ g_object_unref (sock_addr);
+ g_object_unref (socket);
+
+ g_free (msg);
+
+ return FALSE;
+}
+
+/* BEGIN Regression test
+ * https://bugzilla.gnome.org/show_bug.cgi?id=673150
+ */
+
static gboolean
on_test_bgo673150_delay_timeout (gpointer user_data)
{
@@ -92,14 +179,83 @@ test_bgo673150 (void)
g_main_loop_unref (loop);
}
+/* END Regression test
+ * https://bugzilla.gnome.org/show_bug.cgi?id=673150
+ * ============================================================================
+ */
+
+/* BEGIN Regression test
+ * https://bugzilla.gnome.org/show_bug.cgi?id=682099
+ * ============================================================================
+ * - Start a resource browser and send a single SSDP packet with a lifetime of
+ * 5 s.
+ * - Check that there is a "resource-unavailable" signal.
+ * - Shut down the ResourceBrowser and assert that there is NO
+ * "resource-unavailable" signal.
+ */
+
+static gboolean
+announce_ressource_bgo682099 (gpointer user_data)
+{
+ send_packet (create_alive_message (USN_1, 5));
+
+ return FALSE;
+}
+
+static void
+resource_unavailabe_bgo682099 (GSSDPResourceBrowser *src,
+ const char *usn,
+ gpointer user_data)
+{
+ g_assert_cmpstr (usn, ==, NT_1);
+ g_main_loop_quit ((GMainLoop *) user_data);
+}
+
+void test_bgo682099 (void)
+{
+ GSSDPClient *dest;
+ GSSDPResourceBrowser *browser;
+ GError *error = NULL;
+ GMainLoop *loop;
+ gulong signal_id;
+
+ loop = g_main_loop_new (NULL, FALSE);
+
+ dest = gssdp_client_new (NULL, "lo", &error);
+ g_assert (dest != NULL);
+ g_assert (error == NULL);
+
+ browser = gssdp_resource_browser_new (dest, USN_1);
+ signal_id = g_signal_connect (browser,
+ "resource-unavailable",
+ G_CALLBACK (resource_unavailabe_bgo682099),
+ loop);
+ gssdp_resource_browser_set_active (browser, TRUE);
+ g_timeout_add_seconds (2, announce_ressource_bgo682099, NULL);
+ g_main_loop_run (loop);
+ g_signal_handler_disconnect (browser, signal_id);
+ signal_id = g_signal_connect (browser,
+ "resource-unavailable",
+ G_CALLBACK (on_resource_unavailable_assert_not_reached),
+ NULL);
+ g_idle_add (unref_object, browser);
+ g_timeout_add_seconds (10, quit_loop, loop);
+ g_main_loop_run (loop);
+}
+
+/* END Regression test
+ * https://bugzilla.gnome.org/show_bug.cgi?id=682099
+ * ============================================================================
+ */
+
int main (int argc, char *argv[])
{
g_type_init ();
g_test_init (&argc, &argv, NULL);
if (g_test_slow ()) {
- g_test_add_func ("/bugs/gnome/673150",
- test_bgo673150);
+ g_test_add_func ("/bugs/gnome/673150", test_bgo673150);
+ g_test_add_func ("/bugs/gnome/682099", test_bgo682099);
}
g_test_run ();
diff --git a/tests/gtest/test-util.c b/tests/gtest/test-util.c
index 8a620e6..e85aa42 100644
--- a/tests/gtest/test-util.c
+++ b/tests/gtest/test-util.c
@@ -24,3 +24,11 @@ quit_loop (gpointer user_data)
return FALSE;
}
+
+gboolean
+unref_object (gpointer object)
+{
+ g_object_unref ((GObject *) object);
+
+ return FALSE;
+}
diff --git a/tests/gtest/test-util.h b/tests/gtest/test-util.h
index bd35b33..9d0bf45 100644
--- a/tests/gtest/test-util.h
+++ b/tests/gtest/test-util.h
@@ -30,6 +30,9 @@ G_BEGIN_DECLS
gboolean
quit_loop (gpointer user_data);
+gboolean
+unref_object (gpointer object);
+
void
on_resource_available_assert_not_reached (GSSDPResourceBrowser *src,
const char *usn,