gio/tests/gdbus-proxy: Make proxy_ready test start the server after the proxy

There's a race here, as revealed by Debian's buildds.

We call g_dbus_proxy_new() to create a proxy for the test server, with
callback proxy_ready() Then we call g_spawn_command_line_async() to
start the test server, and then start the main loop.

proxy_ready() assumes that the test server hasn't been started when it
is called. But there is no guarantee that these asynchronous operations
involving spawning a process won't happen in a different order that mean
the bus name *does* have an owner.

What we can do is move starting the server inside of proxy_ready(), so
we know that the test server isn't started until after the proxy is
created. We also add an assertion to check that it is indeed not running
before we execute it.
This commit is contained in:
Iain Lane 2019-01-18 15:20:21 +00:00
parent 1a73410a96
commit 7aa83536af
No known key found for this signature in database
GPG Key ID: E352D5C51C5041D4

View File

@ -808,11 +808,19 @@ proxy_ready (GObject *source,
{
GDBusProxy *proxy;
GError *error;
gchar *owner;
error = NULL;
proxy = g_dbus_proxy_new_for_bus_finish (result, &error);
g_assert_no_error (error);
owner = g_dbus_proxy_get_name_owner (proxy);
g_assert_null (owner);
g_free (owner);
/* this is safe; we explicitly kill the service later on */
g_assert (g_spawn_command_line_async (g_test_get_filename (G_TEST_BUILT, "gdbus-testserver", NULL), NULL));
_g_assert_property_notify (proxy, "g-name-owner");
test_basic (proxy);
@ -847,9 +855,6 @@ test_async (void)
proxy_ready,
NULL);
/* this is safe; testserver will exit once the bus goes away */
g_assert (g_spawn_command_line_async (g_test_get_filename (G_TEST_BUILT, "gdbus-testserver", NULL), NULL));
id = g_timeout_add (10000, fail_test, NULL);
g_main_loop_run (loop);