mirror of
https://gitlab.gnome.org/GNOME/glib.git
synced 2025-11-04 18:18:56 +01:00
gdbus-peer test: Move creation of servers to main thread
This makes it feasible to skip the test if creation of the server fails. To get the signals emitted in the other thread, temporarily push the main context that it will use as the thread-default main context. Signed-off-by: Simon McVittie <smcv@collabora.com>
This commit is contained in:
@@ -437,53 +437,9 @@ static gpointer
|
|||||||
service_thread_func (gpointer user_data)
|
service_thread_func (gpointer user_data)
|
||||||
{
|
{
|
||||||
PeerData *data = user_data;
|
PeerData *data = user_data;
|
||||||
GDBusAuthObserver *observer, *o;
|
|
||||||
GError *error;
|
|
||||||
GDBusServerFlags f;
|
|
||||||
gchar *a, *g;
|
|
||||||
gboolean b;
|
|
||||||
|
|
||||||
g_main_context_push_thread_default (data->service_context);
|
g_main_context_push_thread_default (data->service_context);
|
||||||
|
|
||||||
error = NULL;
|
|
||||||
observer = g_dbus_auth_observer_new ();
|
|
||||||
server = g_dbus_server_new_sync (tmp_address,
|
|
||||||
G_DBUS_SERVER_FLAGS_NONE,
|
|
||||||
test_guid,
|
|
||||||
observer,
|
|
||||||
NULL, /* cancellable */
|
|
||||||
&error);
|
|
||||||
g_assert_no_error (error);
|
|
||||||
|
|
||||||
g_signal_connect (server,
|
|
||||||
"new-connection",
|
|
||||||
G_CALLBACK (on_new_connection),
|
|
||||||
data);
|
|
||||||
g_signal_connect (observer,
|
|
||||||
"authorize-authenticated-peer",
|
|
||||||
G_CALLBACK (on_authorize_authenticated_peer),
|
|
||||||
data);
|
|
||||||
|
|
||||||
g_assert_cmpint (g_dbus_server_get_flags (server), ==, G_DBUS_SERVER_FLAGS_NONE);
|
|
||||||
g_assert_cmpstr (g_dbus_server_get_guid (server), ==, test_guid);
|
|
||||||
g_object_get (server,
|
|
||||||
"flags", &f,
|
|
||||||
"address", &a,
|
|
||||||
"guid", &g,
|
|
||||||
"active", &b,
|
|
||||||
"authentication-observer", &o,
|
|
||||||
NULL);
|
|
||||||
g_assert_cmpint (f, ==, G_DBUS_SERVER_FLAGS_NONE);
|
|
||||||
g_assert_cmpstr (a, ==, tmp_address);
|
|
||||||
g_assert_cmpstr (g, ==, test_guid);
|
|
||||||
g_assert (!b);
|
|
||||||
g_assert (o == observer);
|
|
||||||
g_free (a);
|
|
||||||
g_free (g);
|
|
||||||
g_object_unref (o);
|
|
||||||
|
|
||||||
g_object_unref (observer);
|
|
||||||
|
|
||||||
g_dbus_server_start (server);
|
g_dbus_server_start (server);
|
||||||
|
|
||||||
run_service_loop (data->service_context);
|
run_service_loop (data->service_context);
|
||||||
@@ -733,6 +689,54 @@ do_test_peer (void)
|
|||||||
g_clear_error (&error);
|
g_clear_error (&error);
|
||||||
g_assert (c == NULL);
|
g_assert (c == NULL);
|
||||||
|
|
||||||
|
g_main_context_push_thread_default (data.service_context);
|
||||||
|
{
|
||||||
|
GDBusAuthObserver *observer, *o;
|
||||||
|
GDBusServerFlags f;
|
||||||
|
gchar *a, *g;
|
||||||
|
gboolean b;
|
||||||
|
|
||||||
|
error = NULL;
|
||||||
|
observer = g_dbus_auth_observer_new ();
|
||||||
|
server = g_dbus_server_new_sync (tmp_address,
|
||||||
|
G_DBUS_SERVER_FLAGS_NONE,
|
||||||
|
test_guid,
|
||||||
|
observer,
|
||||||
|
NULL, /* cancellable */
|
||||||
|
&error);
|
||||||
|
g_assert_no_error (error);
|
||||||
|
|
||||||
|
g_signal_connect (server,
|
||||||
|
"new-connection",
|
||||||
|
G_CALLBACK (on_new_connection),
|
||||||
|
&data);
|
||||||
|
g_signal_connect (observer,
|
||||||
|
"authorize-authenticated-peer",
|
||||||
|
G_CALLBACK (on_authorize_authenticated_peer),
|
||||||
|
&data);
|
||||||
|
|
||||||
|
g_assert_cmpint (g_dbus_server_get_flags (server), ==, G_DBUS_SERVER_FLAGS_NONE);
|
||||||
|
g_assert_cmpstr (g_dbus_server_get_guid (server), ==, test_guid);
|
||||||
|
g_object_get (server,
|
||||||
|
"flags", &f,
|
||||||
|
"address", &a,
|
||||||
|
"guid", &g,
|
||||||
|
"active", &b,
|
||||||
|
"authentication-observer", &o,
|
||||||
|
NULL);
|
||||||
|
g_assert_cmpint (f, ==, G_DBUS_SERVER_FLAGS_NONE);
|
||||||
|
g_assert_cmpstr (a, ==, tmp_address);
|
||||||
|
g_assert_cmpstr (g, ==, test_guid);
|
||||||
|
g_assert (!b);
|
||||||
|
g_assert (o == observer);
|
||||||
|
g_free (a);
|
||||||
|
g_free (g);
|
||||||
|
g_object_unref (o);
|
||||||
|
|
||||||
|
g_object_unref (observer);
|
||||||
|
}
|
||||||
|
g_main_context_pop_thread_default (data.service_context);
|
||||||
|
|
||||||
/* bring up a server - we run the server in a different thread to avoid deadlocks */
|
/* bring up a server - we run the server in a different thread to avoid deadlocks */
|
||||||
service_thread = g_thread_new ("test_peer",
|
service_thread = g_thread_new ("test_peer",
|
||||||
service_thread_func,
|
service_thread_func,
|
||||||
@@ -1229,25 +1233,9 @@ static gpointer
|
|||||||
dmp_thread_func (gpointer user_data)
|
dmp_thread_func (gpointer user_data)
|
||||||
{
|
{
|
||||||
DmpData *data = user_data;
|
DmpData *data = user_data;
|
||||||
GError *error;
|
|
||||||
gchar *guid;
|
|
||||||
|
|
||||||
g_main_context_push_thread_default (data->context);
|
g_main_context_push_thread_default (data->context);
|
||||||
|
|
||||||
error = NULL;
|
|
||||||
guid = g_dbus_generate_guid ();
|
|
||||||
data->server = g_dbus_server_new_sync (tmp_address,
|
|
||||||
G_DBUS_SERVER_FLAGS_NONE,
|
|
||||||
guid,
|
|
||||||
NULL, /* GDBusAuthObserver */
|
|
||||||
NULL, /* GCancellable */
|
|
||||||
&error);
|
|
||||||
g_assert_no_error (error);
|
|
||||||
g_signal_connect (data->server,
|
|
||||||
"new-connection",
|
|
||||||
G_CALLBACK (dmp_on_new_connection),
|
|
||||||
data);
|
|
||||||
|
|
||||||
g_dbus_server_start (data->server);
|
g_dbus_server_start (data->server);
|
||||||
|
|
||||||
data->loop = g_main_loop_new (data->context, FALSE);
|
data->loop = g_main_loop_new (data->context, FALSE);
|
||||||
@@ -1256,7 +1244,6 @@ dmp_thread_func (gpointer user_data)
|
|||||||
g_dbus_server_stop (data->server);
|
g_dbus_server_stop (data->server);
|
||||||
g_main_context_pop_thread_default (data->context);
|
g_main_context_pop_thread_default (data->context);
|
||||||
|
|
||||||
g_free (guid);
|
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1276,10 +1263,27 @@ delayed_message_processing (void)
|
|||||||
data = g_new0 (DmpData, 1);
|
data = g_new0 (DmpData, 1);
|
||||||
data->context = g_main_context_new ();
|
data->context = g_main_context_new ();
|
||||||
|
|
||||||
|
g_main_context_push_thread_default (data->context);
|
||||||
|
{
|
||||||
|
error = NULL;
|
||||||
|
data->server = g_dbus_server_new_sync (tmp_address,
|
||||||
|
G_DBUS_SERVER_FLAGS_NONE,
|
||||||
|
test_guid,
|
||||||
|
NULL, /* GDBusAuthObserver */
|
||||||
|
NULL, /* GCancellable */
|
||||||
|
&error);
|
||||||
|
g_assert_no_error (error);
|
||||||
|
g_signal_connect (data->server,
|
||||||
|
"new-connection",
|
||||||
|
G_CALLBACK (dmp_on_new_connection),
|
||||||
|
data);
|
||||||
|
}
|
||||||
|
g_main_context_pop_thread_default (data->context);
|
||||||
|
|
||||||
service_thread = g_thread_new ("dmp",
|
service_thread = g_thread_new ("dmp",
|
||||||
dmp_thread_func,
|
dmp_thread_func,
|
||||||
data);
|
data);
|
||||||
while (data->server == NULL || !g_dbus_server_is_active (data->server))
|
while (!g_dbus_server_is_active (data->server))
|
||||||
g_thread_yield ();
|
g_thread_yield ();
|
||||||
|
|
||||||
for (n = 0; n < 5; n++)
|
for (n = 0; n < 5; n++)
|
||||||
@@ -1366,31 +1370,9 @@ static gpointer
|
|||||||
nonce_tcp_service_thread_func (gpointer user_data)
|
nonce_tcp_service_thread_func (gpointer user_data)
|
||||||
{
|
{
|
||||||
PeerData *data = user_data;
|
PeerData *data = user_data;
|
||||||
GDBusAuthObserver *observer;
|
|
||||||
GError *error;
|
|
||||||
|
|
||||||
g_main_context_push_thread_default (data->service_context);
|
g_main_context_push_thread_default (data->service_context);
|
||||||
|
|
||||||
error = NULL;
|
|
||||||
observer = g_dbus_auth_observer_new ();
|
|
||||||
server = g_dbus_server_new_sync ("nonce-tcp:",
|
|
||||||
G_DBUS_SERVER_FLAGS_NONE,
|
|
||||||
test_guid,
|
|
||||||
observer,
|
|
||||||
NULL, /* cancellable */
|
|
||||||
&error);
|
|
||||||
g_assert_no_error (error);
|
|
||||||
|
|
||||||
g_signal_connect (server,
|
|
||||||
"new-connection",
|
|
||||||
G_CALLBACK (nonce_tcp_on_new_connection),
|
|
||||||
data);
|
|
||||||
g_signal_connect (observer,
|
|
||||||
"authorize-authenticated-peer",
|
|
||||||
G_CALLBACK (nonce_tcp_on_authorize_authenticated_peer),
|
|
||||||
data);
|
|
||||||
g_object_unref (observer);
|
|
||||||
|
|
||||||
g_dbus_server_start (server);
|
g_dbus_server_start (server);
|
||||||
|
|
||||||
run_service_loop (data->service_context);
|
run_service_loop (data->service_context);
|
||||||
@@ -1426,6 +1408,33 @@ test_nonce_tcp (void)
|
|||||||
|
|
||||||
error = NULL;
|
error = NULL;
|
||||||
server = NULL;
|
server = NULL;
|
||||||
|
|
||||||
|
g_main_context_push_thread_default (data.service_context);
|
||||||
|
{
|
||||||
|
GDBusAuthObserver *observer;
|
||||||
|
|
||||||
|
error = NULL;
|
||||||
|
observer = g_dbus_auth_observer_new ();
|
||||||
|
server = g_dbus_server_new_sync ("nonce-tcp:",
|
||||||
|
G_DBUS_SERVER_FLAGS_NONE,
|
||||||
|
test_guid,
|
||||||
|
observer,
|
||||||
|
NULL, /* cancellable */
|
||||||
|
&error);
|
||||||
|
g_assert_no_error (error);
|
||||||
|
|
||||||
|
g_signal_connect (server,
|
||||||
|
"new-connection",
|
||||||
|
G_CALLBACK (nonce_tcp_on_new_connection),
|
||||||
|
&data);
|
||||||
|
g_signal_connect (observer,
|
||||||
|
"authorize-authenticated-peer",
|
||||||
|
G_CALLBACK (nonce_tcp_on_authorize_authenticated_peer),
|
||||||
|
&data);
|
||||||
|
g_object_unref (observer);
|
||||||
|
}
|
||||||
|
g_main_context_pop_thread_default (data.service_context);
|
||||||
|
|
||||||
service_thread = g_thread_new ("nonce-tcp-service",
|
service_thread = g_thread_new ("nonce-tcp-service",
|
||||||
nonce_tcp_service_thread_func,
|
nonce_tcp_service_thread_func,
|
||||||
&data);
|
&data);
|
||||||
@@ -1576,24 +1585,9 @@ static gpointer
|
|||||||
tcp_anonymous_service_thread_func (gpointer user_data)
|
tcp_anonymous_service_thread_func (gpointer user_data)
|
||||||
{
|
{
|
||||||
PeerData *data = user_data;
|
PeerData *data = user_data;
|
||||||
GError *error;
|
|
||||||
|
|
||||||
g_main_context_push_thread_default (data->service_context);
|
g_main_context_push_thread_default (data->service_context);
|
||||||
|
|
||||||
error = NULL;
|
|
||||||
server = g_dbus_server_new_sync ("tcp:",
|
|
||||||
G_DBUS_SERVER_FLAGS_AUTHENTICATION_ALLOW_ANONYMOUS,
|
|
||||||
test_guid,
|
|
||||||
NULL, /* GDBusObserver* */
|
|
||||||
NULL, /* GCancellable* */
|
|
||||||
&error);
|
|
||||||
g_assert_no_error (error);
|
|
||||||
|
|
||||||
g_signal_connect (server,
|
|
||||||
"new-connection",
|
|
||||||
G_CALLBACK (tcp_anonymous_on_new_connection),
|
|
||||||
data);
|
|
||||||
|
|
||||||
g_dbus_server_start (server);
|
g_dbus_server_start (server);
|
||||||
|
|
||||||
run_service_loop (data->service_context);
|
run_service_loop (data->service_context);
|
||||||
@@ -1620,6 +1614,24 @@ test_tcp_anonymous (void)
|
|||||||
test_guid = g_dbus_generate_guid ();
|
test_guid = g_dbus_generate_guid ();
|
||||||
loop = g_main_loop_new (NULL, FALSE);
|
loop = g_main_loop_new (NULL, FALSE);
|
||||||
|
|
||||||
|
g_main_context_push_thread_default (data.service_context);
|
||||||
|
{
|
||||||
|
error = NULL;
|
||||||
|
server = g_dbus_server_new_sync ("tcp:",
|
||||||
|
G_DBUS_SERVER_FLAGS_AUTHENTICATION_ALLOW_ANONYMOUS,
|
||||||
|
test_guid,
|
||||||
|
NULL, /* GDBusObserver* */
|
||||||
|
NULL, /* GCancellable* */
|
||||||
|
&error);
|
||||||
|
g_assert_no_error (error);
|
||||||
|
|
||||||
|
g_signal_connect (server,
|
||||||
|
"new-connection",
|
||||||
|
G_CALLBACK (tcp_anonymous_on_new_connection),
|
||||||
|
&data);
|
||||||
|
}
|
||||||
|
g_main_context_pop_thread_default (data.service_context);
|
||||||
|
|
||||||
service_thread = g_thread_new ("tcp-anon-service",
|
service_thread = g_thread_new ("tcp-anon-service",
|
||||||
tcp_anonymous_service_thread_func,
|
tcp_anonymous_service_thread_func,
|
||||||
&data);
|
&data);
|
||||||
@@ -1732,37 +1744,14 @@ codegen_on_new_connection (GDBusServer *server,
|
|||||||
static gpointer
|
static gpointer
|
||||||
codegen_service_thread_func (gpointer user_data)
|
codegen_service_thread_func (gpointer user_data)
|
||||||
{
|
{
|
||||||
PeerData *peer_data = user_data;
|
PeerData *data = user_data;
|
||||||
ExampleAnimal *animal;
|
|
||||||
GError *error = NULL;
|
|
||||||
|
|
||||||
g_main_context_push_thread_default (data->service_context);
|
g_main_context_push_thread_default (data->service_context);
|
||||||
|
|
||||||
/* Create the animal in the right thread context */
|
|
||||||
animal = example_animal_skeleton_new ();
|
|
||||||
|
|
||||||
/* Handle Poke() D-Bus method invocations on the .Animal interface */
|
|
||||||
g_signal_connect (animal, "handle-poke",
|
|
||||||
G_CALLBACK (codegen_on_animal_poke),
|
|
||||||
NULL); /* user_data */
|
|
||||||
|
|
||||||
codegen_server = g_dbus_server_new_sync (tmp_address,
|
|
||||||
G_DBUS_SERVER_FLAGS_NONE,
|
|
||||||
test_guid,
|
|
||||||
NULL, /* observer */
|
|
||||||
NULL, /* cancellable */
|
|
||||||
&error);
|
|
||||||
g_assert_no_error (error);
|
|
||||||
g_dbus_server_start (codegen_server);
|
g_dbus_server_start (codegen_server);
|
||||||
|
|
||||||
g_signal_connect (codegen_server, "new-connection",
|
|
||||||
G_CALLBACK (codegen_on_new_connection),
|
|
||||||
animal);
|
|
||||||
|
|
||||||
run_service_loop (data->service_context);
|
run_service_loop (data->service_context);
|
||||||
|
|
||||||
g_object_unref (animal);
|
|
||||||
|
|
||||||
g_main_context_pop_thread_default (data->service_context);
|
g_main_context_pop_thread_default (data->service_context);
|
||||||
|
|
||||||
teardown_service_loop ();
|
teardown_service_loop ();
|
||||||
@@ -1792,6 +1781,7 @@ codegen_test_peer (void)
|
|||||||
GError *error = NULL;
|
GError *error = NULL;
|
||||||
GVariant *value;
|
GVariant *value;
|
||||||
const gchar *s;
|
const gchar *s;
|
||||||
|
ExampleAnimal *animal;
|
||||||
|
|
||||||
memset (&data, '\0', sizeof (PeerData));
|
memset (&data, '\0', sizeof (PeerData));
|
||||||
data.service_context = g_main_context_new ();
|
data.service_context = g_main_context_new ();
|
||||||
@@ -1802,6 +1792,30 @@ codegen_test_peer (void)
|
|||||||
setup_test_address ();
|
setup_test_address ();
|
||||||
|
|
||||||
/* bring up a server - we run the server in a different thread to avoid deadlocks */
|
/* bring up a server - we run the server in a different thread to avoid deadlocks */
|
||||||
|
g_main_context_push_thread_default (data.service_context);
|
||||||
|
{
|
||||||
|
/* Create the animal in the right thread context */
|
||||||
|
animal = example_animal_skeleton_new ();
|
||||||
|
|
||||||
|
/* Handle Poke() D-Bus method invocations on the .Animal interface */
|
||||||
|
g_signal_connect (animal, "handle-poke",
|
||||||
|
G_CALLBACK (codegen_on_animal_poke),
|
||||||
|
NULL); /* user_data */
|
||||||
|
|
||||||
|
codegen_server = g_dbus_server_new_sync (tmp_address,
|
||||||
|
G_DBUS_SERVER_FLAGS_NONE,
|
||||||
|
test_guid,
|
||||||
|
NULL, /* observer */
|
||||||
|
NULL, /* cancellable */
|
||||||
|
&error);
|
||||||
|
g_assert_no_error (error);
|
||||||
|
|
||||||
|
g_signal_connect (codegen_server, "new-connection",
|
||||||
|
G_CALLBACK (codegen_on_new_connection),
|
||||||
|
animal);
|
||||||
|
}
|
||||||
|
g_main_context_pop_thread_default (data.service_context);
|
||||||
|
|
||||||
service_thread = g_thread_new ("codegen_test_peer",
|
service_thread = g_thread_new ("codegen_test_peer",
|
||||||
codegen_service_thread_func,
|
codegen_service_thread_func,
|
||||||
NULL);
|
NULL);
|
||||||
@@ -1907,6 +1921,7 @@ codegen_test_peer (void)
|
|||||||
|
|
||||||
teardown_test_address ();
|
teardown_test_address ();
|
||||||
|
|
||||||
|
g_object_unref (animal);
|
||||||
g_main_loop_unref (loop);
|
g_main_loop_unref (loop);
|
||||||
g_free (test_guid);
|
g_free (test_guid);
|
||||||
g_main_context_unref (data.service_context);
|
g_main_context_unref (data.service_context);
|
||||||
|
|||||||
Reference in New Issue
Block a user