Timeout the test if dbus sevice has not appeared in due time.
authorJosep Puigdemont <josep.puigdemont@enea.com>
Tue, 21 May 2013 14:46:25 +0000 (16:46 +0200)
committerColin Walters <walters@verbum.org>
Tue, 21 May 2013 15:18:08 +0000 (11:18 -0400)
The test /gdbus/connection/large_message waits for a dbus name to appear.
The dbus name is created by a another process executed in the background.
If for some reason this fails, the test will likely wait forever.
This will avoid this situation by making the test fail if the dbus service
has not appeared after 10 seconds.

https://bugzilla.gnome.org/show_bug.cgi?id=698981

gio/tests/gdbus-connection-slow.c

index 889a75e..e4b79df 100644 (file)
@@ -120,6 +120,18 @@ test_connection_flush (void)
  * is fragmented when shoved across any transport
  */
 #define LARGE_MESSAGE_STRING_LENGTH (20*1024*1024)
+/* the test will fail if the service name has not appeared after this amount of seconds */
+#define LARGE_MESSAGE_TIMEOUT_SECONDS 10
+
+static gboolean
+large_message_timeout_cb (gpointer data)
+{
+  (void)data;
+
+  g_error ("Error: timeout waiting for dbus name to appear\n");
+
+  return FALSE;
+}
 
 static void
 large_message_on_name_appeared (GDBusConnection *connection,
@@ -133,6 +145,8 @@ large_message_on_name_appeared (GDBusConnection *connection,
   GVariant *result;
   guint n;
 
+  g_assert (g_source_remove (GPOINTER_TO_UINT (user_data)));
+
   request = g_new (gchar, LARGE_MESSAGE_STRING_LENGTH + 1);
   for (n = 0; n < LARGE_MESSAGE_STRING_LENGTH; n++)
     request[n] = '0' + (n%10);
@@ -175,6 +189,7 @@ test_connection_large_message (void)
 {
   guint watcher_id;
   gchar *path;
+  guint timeout_id;
 
   session_bus_up ();
 
@@ -183,12 +198,16 @@ test_connection_large_message (void)
   g_assert (g_spawn_command_line_async (path, NULL));
   g_free (path);
 
+  timeout_id = g_timeout_add_seconds (LARGE_MESSAGE_TIMEOUT_SECONDS,
+                                      large_message_timeout_cb,
+                                      NULL);
+
   watcher_id = g_bus_watch_name (G_BUS_TYPE_SESSION,
                                  "com.example.TestService",
                                  G_BUS_NAME_WATCHER_FLAGS_NONE,
                                  large_message_on_name_appeared,
                                  large_message_on_name_vanished,
-                                 NULL,  /* user_data */
+                                 GUINT_TO_POINTER (timeout_id),  /* user_data */
                                  NULL); /* GDestroyNotify */
   g_main_loop_run (loop);
   g_bus_unwatch_name (watcher_id);