[gssdp] Add regression test for bgo#682099



commit c47d522e23fff7cabb0d0e962f475b76053a2019
Author: Jens Georg <mail jensge org>
Date:   Sat Aug 18 11:41:12 2012 +0200

    Add regression test for bgo#682099

 tests/gtest/test-regression.c |  160 ++++++++++++++++++++++++++++++++++++++++-
 tests/gtest/test-util.c       |    8 ++
 tests/gtest/test-util.h       |    3 +
 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,



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]