From f24fc53d5a1119f86a93331516471332ba7868b5 Mon Sep 17 00:00:00 2001
From: George Kiagiadakis <george.kiagiadakis@collabora.com>
Date: Thu, 7 May 2020 16:16:45 +0300
Subject: [PATCH] tests/common: add common function for ensuring an object
 manager is installed

It can be a bit tricky because the "installed" signal may be fired
from inside the context of wp_core_install_object_manager(),
in which case the main loop should not be executed (or it will never quit)
---
 tests/common/base-test-fixture.h | 12 ++++++++++++
 tests/modules/si-standard-link.c | 30 +++++++++---------------------
 2 files changed, 21 insertions(+), 21 deletions(-)

diff --git a/tests/common/base-test-fixture.h b/tests/common/base-test-fixture.h
index aa9eb838..21786ad1 100644
--- a/tests/common/base-test-fixture.h
+++ b/tests/common/base-test-fixture.h
@@ -143,3 +143,15 @@ test_si_export_finish_cb (WpSessionItem * item, GAsyncResult * res,
 
   g_main_loop_quit (f->loop);
 }
+
+static G_GNUC_UNUSED void
+test_ensure_object_manager_is_installed (WpObjectManager * om, WpCore * core,
+    GMainLoop * loop)
+{
+  gulong id = g_signal_connect_swapped (om, "installed",
+      G_CALLBACK (g_main_loop_quit), loop);
+  wp_core_install_object_manager (core, om);
+  if (!wp_object_manager_is_installed (om))
+    g_main_loop_run (loop);
+  g_signal_handler_disconnect (om, id);
+}
diff --git a/tests/modules/si-standard-link.c b/tests/modules/si-standard-link.c
index 08903bd5..fe6179de 100644
--- a/tests/modules/si-standard-link.c
+++ b/tests/modules/si-standard-link.c
@@ -156,10 +156,8 @@ test_si_standard_link_main (TestFixture * f, gconstpointer user_data)
     wp_object_manager_add_interest_1 (om, WP_TYPE_SESSION, NULL);
     wp_object_manager_request_proxy_features (om, WP_TYPE_SESSION,
         WP_SESSION_FEATURES_STANDARD);
-    g_signal_connect_swapped (om, "installed",
-        G_CALLBACK (g_main_loop_quit), f->base.loop);
-    wp_core_install_object_manager (f->base.client_core, om);
-    g_main_loop_run (f->base.loop);
+    test_ensure_object_manager_is_installed (om, f->base.client_core,
+        f->base.loop);
 
     g_assert_nonnull (session_proxy =
         wp_object_manager_lookup (om, WP_TYPE_SESSION,
@@ -253,10 +251,8 @@ test_si_standard_link_main (TestFixture * f, gconstpointer user_data)
     wp_object_manager_add_interest_1 (om, WP_TYPE_LINK, NULL);
     wp_object_manager_request_proxy_features (om, WP_TYPE_PROXY,
         WP_PROXY_FEATURES_STANDARD);
-    g_signal_connect_swapped (om, "installed",
-        G_CALLBACK (g_main_loop_quit), f->base.loop);
-    wp_core_install_object_manager (f->base.client_core, om);
-    g_main_loop_run (f->base.loop);
+    test_ensure_object_manager_is_installed (om, f->base.client_core,
+        f->base.loop);
 
     g_assert_nonnull (out_node = wp_object_manager_lookup (om, WP_TYPE_NODE,
         WP_CONSTRAINT_TYPE_PW_PROPERTY, "node.name", "=s", "audiotestsrc",
@@ -308,10 +304,8 @@ test_si_standard_link_main (TestFixture * f, gconstpointer user_data)
     wp_object_manager_add_interest_1 (om, WP_TYPE_LINK, NULL);
     wp_object_manager_request_proxy_features (om, WP_TYPE_PROXY,
         WP_PROXY_FEATURES_STANDARD);
-    g_signal_connect_swapped (om, "installed",
-        G_CALLBACK (g_main_loop_quit), f->base.loop);
-    wp_core_install_object_manager (f->base.client_core, om);
-    g_main_loop_run (f->base.loop);
+    test_ensure_object_manager_is_installed (om, f->base.client_core,
+        f->base.loop);
 
     g_assert_nonnull (out_node = wp_object_manager_lookup (om, WP_TYPE_NODE,
         WP_CONSTRAINT_TYPE_PW_PROPERTY, "node.name", "=s", "audiotestsrc",
@@ -350,10 +344,8 @@ test_si_standard_link_destroy (TestFixture * f, gconstpointer user_data)
     wp_object_manager_add_interest_1 (om, WP_TYPE_SESSION, NULL);
     wp_object_manager_request_proxy_features (om, WP_TYPE_SESSION,
         WP_SESSION_FEATURES_STANDARD);
-    g_signal_connect_swapped (om, "installed",
-        G_CALLBACK (g_main_loop_quit), f->base.loop);
-    wp_core_install_object_manager (f->base.client_core, om);
-    g_main_loop_run (f->base.loop);
+    test_ensure_object_manager_is_installed (om, f->base.client_core,
+        f->base.loop);
 
     g_assert_nonnull (session_proxy =
         wp_object_manager_lookup (om, WP_TYPE_SESSION,
@@ -424,11 +416,7 @@ test_si_standard_link_destroy (TestFixture * f, gconstpointer user_data)
     g_autoptr (WpObjectManager) om = wp_object_manager_new ();
 
     wp_object_manager_add_interest_1 (om, WP_TYPE_ENDPOINT_LINK, NULL);
-    g_signal_connect_swapped (om, "installed",
-        G_CALLBACK (g_main_loop_quit), f->base.loop);
-    wp_core_install_object_manager (f->base.core, om);
-    if (!wp_object_manager_is_installed (om))
-      g_main_loop_run (f->base.loop);
+    test_ensure_object_manager_is_installed (om, f->base.core, f->base.loop);
 
     g_assert_cmpuint (wp_object_manager_get_n_objects (om), ==, 0);
   }
-- 
GitLab