mirror of
https://github.com/brl/mutter.git
synced 2024-11-23 08:30:42 -05:00
tests/wayland-test-utils: Keep track of process exit
Whenever a MetaWaylandTestClient exists without success the calling test will fail. This fixes a bunch of cases where the test would get stuck waiting for some event from the client when it already died and won't be able to send the event. Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/3348>
This commit is contained in:
parent
ac2f6e8b9e
commit
8c3c29d0c0
@ -28,7 +28,7 @@ struct _MetaWaylandTestClient
|
|||||||
{
|
{
|
||||||
GSubprocess *subprocess;
|
GSubprocess *subprocess;
|
||||||
char *path;
|
char *path;
|
||||||
GMainLoop *main_loop;
|
gboolean finished;
|
||||||
};
|
};
|
||||||
|
|
||||||
static char *
|
static char *
|
||||||
@ -42,6 +42,27 @@ get_test_client_path (const char *test_client_name)
|
|||||||
NULL);
|
NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
wayland_test_client_finished (GObject *source_object,
|
||||||
|
GAsyncResult *res,
|
||||||
|
gpointer user_data)
|
||||||
|
{
|
||||||
|
MetaWaylandTestClient *wayland_test_client = user_data;
|
||||||
|
GError *error = NULL;
|
||||||
|
|
||||||
|
if (!g_subprocess_wait_finish (wayland_test_client->subprocess,
|
||||||
|
res,
|
||||||
|
&error))
|
||||||
|
{
|
||||||
|
g_error ("Failed to wait for Wayland test client '%s': %s",
|
||||||
|
wayland_test_client->path, error->message);
|
||||||
|
}
|
||||||
|
|
||||||
|
g_assert_true (g_subprocess_get_successful (wayland_test_client->subprocess));
|
||||||
|
|
||||||
|
wayland_test_client->finished = TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
MetaWaylandTestClient *
|
MetaWaylandTestClient *
|
||||||
meta_wayland_test_client_new (MetaContext *context,
|
meta_wayland_test_client_new (MetaContext *context,
|
||||||
const char *test_client_name)
|
const char *test_client_name)
|
||||||
@ -76,44 +97,29 @@ meta_wayland_test_client_new (MetaContext *context,
|
|||||||
wayland_test_client = g_new0 (MetaWaylandTestClient, 1);
|
wayland_test_client = g_new0 (MetaWaylandTestClient, 1);
|
||||||
wayland_test_client->subprocess = subprocess;
|
wayland_test_client->subprocess = subprocess;
|
||||||
wayland_test_client->path = g_strdup (test_client_name);
|
wayland_test_client->path = g_strdup (test_client_name);
|
||||||
wayland_test_client->main_loop = g_main_loop_new (NULL, FALSE);
|
|
||||||
|
g_subprocess_wait_async (wayland_test_client->subprocess, NULL,
|
||||||
|
wayland_test_client_finished,
|
||||||
|
wayland_test_client);
|
||||||
|
|
||||||
return wayland_test_client;
|
return wayland_test_client;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
wayland_test_client_finished (GObject *source_object,
|
wayland_test_client_destroy (MetaWaylandTestClient *wayland_test_client)
|
||||||
GAsyncResult *res,
|
|
||||||
gpointer user_data)
|
|
||||||
{
|
{
|
||||||
MetaWaylandTestClient *wayland_test_client = user_data;
|
g_free (wayland_test_client->path);
|
||||||
GError *error = NULL;
|
g_object_unref (wayland_test_client->subprocess);
|
||||||
|
g_free (wayland_test_client);
|
||||||
if (!g_subprocess_wait_finish (wayland_test_client->subprocess,
|
|
||||||
res,
|
|
||||||
&error))
|
|
||||||
{
|
|
||||||
g_error ("Failed to wait for Wayland test client '%s': %s",
|
|
||||||
wayland_test_client->path, error->message);
|
|
||||||
}
|
|
||||||
|
|
||||||
g_main_loop_quit (wayland_test_client->main_loop);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
meta_wayland_test_client_finish (MetaWaylandTestClient *wayland_test_client)
|
meta_wayland_test_client_finish (MetaWaylandTestClient *wayland_test_client)
|
||||||
{
|
{
|
||||||
g_subprocess_wait_async (wayland_test_client->subprocess, NULL,
|
while (!wayland_test_client->finished)
|
||||||
wayland_test_client_finished, wayland_test_client);
|
g_main_context_iteration (NULL, TRUE);
|
||||||
|
|
||||||
g_main_loop_run (wayland_test_client->main_loop);
|
wayland_test_client_destroy (wayland_test_client);
|
||||||
|
|
||||||
g_assert_true (g_subprocess_get_successful (wayland_test_client->subprocess));
|
|
||||||
|
|
||||||
g_main_loop_unref (wayland_test_client->main_loop);
|
|
||||||
g_free (wayland_test_client->path);
|
|
||||||
g_object_unref (wayland_test_client->subprocess);
|
|
||||||
g_free (wayland_test_client);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
MetaWindow *
|
MetaWindow *
|
||||||
|
Loading…
Reference in New Issue
Block a user