[glib: 1/3] tests: Drop arbitrary and flaky waits from actions tests
- From: Sebastian Dröge <sdroege src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [glib: 1/3] tests: Drop arbitrary and flaky waits from actions tests
- Date: Tue, 16 Nov 2021 14:37:25 +0000 (UTC)
commit c8fa295f6aa7ef6619891410ac12c1db1cb1cacc
Author: Philip Withnall <pwithnall endlessos org>
Date: Tue Nov 16 14:01:24 2021 +0000
tests: Drop arbitrary and flaky waits from actions tests
The `actions` test previously waited an arbitrary 100ms for various
D-Bus messages to be sent/received, before checking the results of those
messages.
Normally, this would work, but on heavily loaded CI systems, it would
sometimes fail. For example,
https://gitlab.gnome.org/GNOME/glib/-/jobs/1611701.
Fix that by waiting for the condition being checked to evaluate to true,
rather than waiting an arbitrary period of time. On faster machines,
this will speed the tests up too.
Assume that the global default `GMainContext` is in use, so a
`GMainContext*` pointer doesn’t have to be passed around.
Signed-off-by: Philip Withnall <pwithnall endlessos org>
gio/tests/actions.c | 86 ++++++++++++++++++++++++++++++++++++++++++-----------
1 file changed, 69 insertions(+), 17 deletions(-)
---
diff --git a/gio/tests/actions.c b/gio/tests/actions.c
index 91fc08074..d48c8543a 100644
--- a/gio/tests/actions.c
+++ b/gio/tests/actions.c
@@ -536,6 +536,8 @@ count_activation (const gchar *action)
count = GPOINTER_TO_INT (g_hash_table_lookup (activation_counts, action));
count++;
g_hash_table_insert (activation_counts, (gpointer)action, GINT_TO_POINTER (count));
+
+ g_main_context_wakeup (NULL);
}
static gint
@@ -742,6 +744,41 @@ call_describe (gpointer user_data)
G_GNUC_BEGIN_IGNORE_DEPRECATIONS
+static void
+action_added_removed_cb (GActionGroup *action_group,
+ char *action_name,
+ gpointer user_data)
+{
+ guint *counter = user_data;
+
+ *counter = *counter + 1;
+ g_main_context_wakeup (NULL);
+}
+
+static void
+action_enabled_changed_cb (GActionGroup *action_group,
+ char *action_name,
+ gboolean enabled,
+ gpointer user_data)
+{
+ guint *counter = user_data;
+
+ *counter = *counter + 1;
+ g_main_context_wakeup (NULL);
+}
+
+static void
+action_state_changed_cb (GActionGroup *action_group,
+ char *action_name,
+ GVariant *value,
+ gpointer user_data)
+{
+ guint *counter = user_data;
+
+ *counter = *counter + 1;
+ g_main_context_wakeup (NULL);
+}
+
static void
test_dbus_export (void)
{
@@ -754,6 +791,8 @@ test_dbus_export (void)
GVariant *v;
guint id;
gchar **actions;
+ guint n_actions_added = 0, n_actions_enabled_changed = 0, n_actions_removed = 0, n_actions_state_changed =
0;
+ gulong added_signal_id, enabled_changed_signal_id, removed_signal_id, state_changed_signal_id;
loop = g_main_loop_new (NULL, FALSE);
@@ -770,13 +809,19 @@ test_dbus_export (void)
g_assert_no_error (error);
proxy = g_dbus_action_group_get (bus, g_dbus_connection_get_unique_name (bus), "/");
+ added_signal_id = g_signal_connect (proxy, "action-added", G_CALLBACK (action_added_removed_cb),
&n_actions_added);
+ enabled_changed_signal_id = g_signal_connect (proxy, "action-enabled-changed", G_CALLBACK
(action_enabled_changed_cb), &n_actions_enabled_changed);
+ removed_signal_id = g_signal_connect (proxy, "action-removed", G_CALLBACK (action_added_removed_cb),
&n_actions_removed);
+ state_changed_signal_id = g_signal_connect (proxy, "action-state-changed", G_CALLBACK
(action_state_changed_cb), &n_actions_state_changed);
actions = g_action_group_list_actions (G_ACTION_GROUP (proxy));
g_assert_cmpint (g_strv_length (actions), ==, 0);
g_strfreev (actions);
- g_timeout_add (100, stop_loop, loop);
- g_main_loop_run (loop);
+ /* Actions are queried from the bus asynchronously after the first
+ * list_actions() call. Wait for the expected signals then check again. */
+ while (n_actions_added < G_N_ELEMENTS (exported_entries))
+ g_main_context_iteration (NULL, TRUE);
actions = g_action_group_list_actions (G_ACTION_GROUP (proxy));
g_assert_cmpint (g_strv_length (actions), ==, G_N_ELEMENTS (exported_entries));
@@ -795,54 +840,56 @@ test_dbus_export (void)
g_assert_true (compare_action_groups (G_ACTION_GROUP (group), G_ACTION_GROUP (proxy)));
/* test that various changes get propagated from group to proxy */
+ n_actions_added = 0;
action = g_simple_action_new_stateful ("italic", NULL, g_variant_new_boolean (FALSE));
g_simple_action_group_insert (group, G_ACTION (action));
g_object_unref (action);
- g_timeout_add (100, stop_loop, loop);
- g_main_loop_run (loop);
+ while (n_actions_added == 0)
+ g_main_context_iteration (NULL, TRUE);
g_assert_true (compare_action_groups (G_ACTION_GROUP (group), G_ACTION_GROUP (proxy)));
action = G_SIMPLE_ACTION (g_simple_action_group_lookup (group, "cut"));
g_simple_action_set_enabled (action, FALSE);
- g_timeout_add (100, stop_loop, loop);
- g_main_loop_run (loop);
+ while (n_actions_enabled_changed == 0)
+ g_main_context_iteration (NULL, TRUE);
g_assert_true (compare_action_groups (G_ACTION_GROUP (group), G_ACTION_GROUP (proxy)));
action = G_SIMPLE_ACTION (g_simple_action_group_lookup (group, "bold"));
g_simple_action_set_state (action, g_variant_new_boolean (FALSE));
- g_timeout_add (100, stop_loop, loop);
- g_main_loop_run (loop);
+ while (n_actions_state_changed == 0)
+ g_main_context_iteration (NULL, TRUE);
g_assert_true (compare_action_groups (G_ACTION_GROUP (group), G_ACTION_GROUP (proxy)));
g_simple_action_group_remove (group, "italic");
- g_timeout_add (100, stop_loop, loop);
- g_main_loop_run (loop);
+ while (n_actions_removed == 0)
+ g_main_context_iteration (NULL, TRUE);
g_assert_true (compare_action_groups (G_ACTION_GROUP (group), G_ACTION_GROUP (proxy)));
/* test that activations and state changes propagate the other way */
-
+ n_actions_state_changed = 0;
g_assert_cmpint (activation_count ("copy"), ==, 0);
g_action_group_activate_action (G_ACTION_GROUP (proxy), "copy", NULL);
- g_timeout_add (100, stop_loop, loop);
- g_main_loop_run (loop);
+ while (activation_count ("copy") == 0)
+ g_main_context_iteration (NULL, TRUE);
g_assert_cmpint (activation_count ("copy"), ==, 1);
g_assert_true (compare_action_groups (G_ACTION_GROUP (group), G_ACTION_GROUP (proxy)));
+ n_actions_state_changed = 0;
g_assert_cmpint (activation_count ("bold"), ==, 0);
g_action_group_activate_action (G_ACTION_GROUP (proxy), "bold", NULL);
- g_timeout_add (100, stop_loop, loop);
- g_main_loop_run (loop);
+ while (n_actions_state_changed == 0)
+ g_main_context_iteration (NULL, TRUE);
g_assert_cmpint (activation_count ("bold"), ==, 1);
g_assert_true (compare_action_groups (G_ACTION_GROUP (group), G_ACTION_GROUP (proxy)));
@@ -850,10 +897,11 @@ test_dbus_export (void)
g_assert_true (g_variant_get_boolean (v));
g_variant_unref (v);
+ n_actions_state_changed = 0;
g_action_group_change_action_state (G_ACTION_GROUP (proxy), "bold", g_variant_new_boolean (FALSE));
- g_timeout_add (100, stop_loop, loop);
- g_main_loop_run (loop);
+ while (n_actions_state_changed == 0)
+ g_main_context_iteration (NULL, TRUE);
g_assert_cmpint (activation_count ("bold"), ==, 1);
g_assert_true (compare_action_groups (G_ACTION_GROUP (group), G_ACTION_GROUP (proxy)));
@@ -863,6 +911,10 @@ test_dbus_export (void)
g_dbus_connection_unexport_action_group (bus, id);
+ g_signal_handler_disconnect (proxy, added_signal_id);
+ g_signal_handler_disconnect (proxy, enabled_changed_signal_id);
+ g_signal_handler_disconnect (proxy, removed_signal_id);
+ g_signal_handler_disconnect (proxy, state_changed_signal_id);
g_object_unref (proxy);
g_object_unref (group);
g_main_loop_unref (loop);
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]