mirror of
https://gitlab.gnome.org/GNOME/glib.git
synced 2025-02-28 21:22:11 +01:00
tests: Use GMainContext instead of GMainLoop in gdbus-threading
This is equivalent, but makes the loop exit conditions a little clearer, since they’re actually in a `while` statement, rather than being a `g_main_loop_quit()` call in a callback somewhere else in the file. Signed-off-by: Philip Withnall <withnall@endlessm.com> Helps: #1515
This commit is contained in:
parent
79ef610f03
commit
cd0ab355cd
@ -80,54 +80,24 @@ assert_connection_has_one_ref (GDBusConnection *connection,
|
||||
|
||||
typedef struct {
|
||||
GThread *thread;
|
||||
GMainLoop *thread_loop;
|
||||
GMainContext *context;
|
||||
guint signal_count;
|
||||
gboolean unsubscribe_complete;
|
||||
GAsyncResult *async_result;
|
||||
} DeliveryData;
|
||||
|
||||
static void
|
||||
msg_cb_expect_success (GDBusConnection *connection,
|
||||
async_result_cb (GDBusConnection *connection,
|
||||
GAsyncResult *res,
|
||||
gpointer user_data)
|
||||
{
|
||||
DeliveryData *data = user_data;
|
||||
GError *error;
|
||||
GVariant *result;
|
||||
|
||||
error = NULL;
|
||||
result = g_dbus_connection_call_finish (connection,
|
||||
res,
|
||||
&error);
|
||||
g_assert_no_error (error);
|
||||
g_assert_nonnull (result);
|
||||
g_variant_unref (result);
|
||||
data->async_result = g_object_ref (res);
|
||||
|
||||
g_assert_true (g_thread_self () == data->thread);
|
||||
|
||||
g_main_loop_quit (data->thread_loop);
|
||||
}
|
||||
|
||||
static void
|
||||
msg_cb_expect_error_cancelled (GDBusConnection *connection,
|
||||
GAsyncResult *res,
|
||||
gpointer user_data)
|
||||
{
|
||||
DeliveryData *data = user_data;
|
||||
GError *error;
|
||||
GVariant *result;
|
||||
|
||||
error = NULL;
|
||||
result = g_dbus_connection_call_finish (connection,
|
||||
res,
|
||||
&error);
|
||||
g_assert_error (error, G_IO_ERROR, G_IO_ERROR_CANCELLED);
|
||||
g_assert_false (g_dbus_error_is_remote_error (error));
|
||||
g_error_free (error);
|
||||
g_assert_null (result);
|
||||
|
||||
g_assert_true (g_thread_self () == data->thread);
|
||||
|
||||
g_main_loop_quit (data->thread_loop);
|
||||
g_main_context_wakeup (data->context);
|
||||
}
|
||||
|
||||
static void
|
||||
@ -145,7 +115,7 @@ signal_handler (GDBusConnection *connection,
|
||||
|
||||
data->signal_count++;
|
||||
|
||||
g_main_loop_quit (data->thread_loop);
|
||||
g_main_context_wakeup (data->context);
|
||||
}
|
||||
|
||||
static void
|
||||
@ -157,30 +127,28 @@ signal_data_free_cb (gpointer user_data)
|
||||
|
||||
data->unsubscribe_complete = TRUE;
|
||||
|
||||
g_main_loop_quit (data->thread_loop);
|
||||
g_main_context_wakeup (data->context);
|
||||
}
|
||||
|
||||
static gpointer
|
||||
test_delivery_in_thread_func (gpointer _data)
|
||||
{
|
||||
GMainLoop *thread_loop;
|
||||
GMainContext *thread_context;
|
||||
DeliveryData data;
|
||||
GCancellable *ca;
|
||||
guint subscription_id;
|
||||
GDBusConnection *priv_c;
|
||||
GError *error;
|
||||
|
||||
error = NULL;
|
||||
GError *error = NULL;
|
||||
GVariant *result_variant = NULL;
|
||||
|
||||
thread_context = g_main_context_new ();
|
||||
thread_loop = g_main_loop_new (thread_context, FALSE);
|
||||
g_main_context_push_thread_default (thread_context);
|
||||
|
||||
data.thread = g_thread_self ();
|
||||
data.thread_loop = thread_loop;
|
||||
data.context = thread_context;
|
||||
data.signal_count = 0;
|
||||
data.unsubscribe_complete = FALSE;
|
||||
data.async_result = NULL;
|
||||
|
||||
/* ---------------------------------------------------------------------------------------------------- */
|
||||
|
||||
@ -196,9 +164,16 @@ test_delivery_in_thread_func (gpointer _data)
|
||||
G_DBUS_CALL_FLAGS_NONE,
|
||||
-1,
|
||||
NULL,
|
||||
(GAsyncReadyCallback) msg_cb_expect_success,
|
||||
(GAsyncReadyCallback) async_result_cb,
|
||||
&data);
|
||||
g_main_loop_run (thread_loop);
|
||||
while (data.async_result == NULL)
|
||||
g_main_context_iteration (thread_context, TRUE);
|
||||
|
||||
result_variant = g_dbus_connection_call_finish (c, data.async_result, &error);
|
||||
g_assert_no_error (error);
|
||||
g_assert_nonnull (result_variant);
|
||||
g_clear_pointer (&result_variant, g_variant_unref);
|
||||
g_clear_object (&data.async_result);
|
||||
|
||||
/*
|
||||
* Check that we never actually send a message if the GCancellable
|
||||
@ -216,9 +191,18 @@ test_delivery_in_thread_func (gpointer _data)
|
||||
G_DBUS_CALL_FLAGS_NONE,
|
||||
-1,
|
||||
ca,
|
||||
(GAsyncReadyCallback) msg_cb_expect_error_cancelled,
|
||||
(GAsyncReadyCallback) async_result_cb,
|
||||
&data);
|
||||
g_main_loop_run (thread_loop);
|
||||
while (data.async_result == NULL)
|
||||
g_main_context_iteration (thread_context, TRUE);
|
||||
|
||||
result_variant = g_dbus_connection_call_finish (c, data.async_result, &error);
|
||||
g_assert_error (error, G_IO_ERROR, G_IO_ERROR_CANCELLED);
|
||||
g_assert_false (g_dbus_error_is_remote_error (error));
|
||||
g_clear_error (&error);
|
||||
g_assert_null (result_variant);
|
||||
g_clear_object (&data.async_result);
|
||||
|
||||
g_object_unref (ca);
|
||||
|
||||
/*
|
||||
@ -234,10 +218,20 @@ test_delivery_in_thread_func (gpointer _data)
|
||||
G_DBUS_CALL_FLAGS_NONE,
|
||||
-1,
|
||||
ca,
|
||||
(GAsyncReadyCallback) msg_cb_expect_error_cancelled,
|
||||
(GAsyncReadyCallback) async_result_cb,
|
||||
&data);
|
||||
g_cancellable_cancel (ca);
|
||||
g_main_loop_run (thread_loop);
|
||||
|
||||
while (data.async_result == NULL)
|
||||
g_main_context_iteration (thread_context, TRUE);
|
||||
|
||||
result_variant = g_dbus_connection_call_finish (c, data.async_result, &error);
|
||||
g_assert_error (error, G_IO_ERROR, G_IO_ERROR_CANCELLED);
|
||||
g_assert_false (g_dbus_error_is_remote_error (error));
|
||||
g_clear_error (&error);
|
||||
g_assert_null (result_variant);
|
||||
g_clear_object (&data.async_result);
|
||||
|
||||
g_object_unref (ca);
|
||||
|
||||
/*
|
||||
@ -264,7 +258,8 @@ test_delivery_in_thread_func (gpointer _data)
|
||||
g_assert_no_error (error);
|
||||
g_assert_nonnull (priv_c);
|
||||
|
||||
g_main_loop_run (thread_loop);
|
||||
while (data.signal_count < 1)
|
||||
g_main_context_iteration (thread_context, TRUE);
|
||||
g_assert_cmpuint (data.signal_count, ==, 1);
|
||||
|
||||
g_object_unref (priv_c);
|
||||
@ -272,13 +267,13 @@ test_delivery_in_thread_func (gpointer _data)
|
||||
g_dbus_connection_signal_unsubscribe (c, subscription_id);
|
||||
subscription_id = 0;
|
||||
|
||||
g_main_loop_run (thread_loop);
|
||||
while (!data.unsubscribe_complete)
|
||||
g_main_context_iteration (thread_context, TRUE);
|
||||
g_assert_true (data.unsubscribe_complete);
|
||||
|
||||
/* ---------------------------------------------------------------------------------------------------- */
|
||||
|
||||
g_main_context_pop_thread_default (thread_context);
|
||||
g_main_loop_unref (thread_loop);
|
||||
g_main_context_unref (thread_context);
|
||||
|
||||
return NULL;
|
||||
|
Loading…
x
Reference in New Issue
Block a user