From c47d522e23fff7cabb0d0e962f475b76053a2019 Mon Sep 17 00:00:00 2001 From: Jens Georg Date: Sat, 18 Aug 2012 11:41:12 +0200 Subject: [PATCH] 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 + +#include #include #include +#include #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, -- 2.7.4