From 028ed0685d5686ad906146da1a09dfadccbbab49 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jonas=20=C3=85dahl?= Date: Fri, 29 Oct 2021 21:18:56 +0200 Subject: [PATCH] tests/test-client: Add 'stop_after_next' and 'continue' commands The 'stop_after_next' will execeute one command, then not return to the main loop until a 'continue' command is passed. Commands will still be processed between 'stop_after_next' and 'continue'. This is intended to be used to induce race conditions. Part-of: --- src/tests/test-client.c | 45 +++++++++++++++++++++++++++++++++++++++++ src/tests/test-runner.c | 13 ++++++++++++ 2 files changed, 58 insertions(+) diff --git a/src/tests/test-client.c b/src/tests/test-client.c index 73931375e..ac2431a50 100644 --- a/src/tests/test-client.c +++ b/src/tests/test-client.c @@ -34,6 +34,7 @@ GHashTable *windows; GQuark event_source_quark; GQuark event_handlers_quark; GQuark can_take_focus_quark; +gboolean sync_after_lines = -1; typedef void (*XEventHandler) (GtkWidget *window, XEvent *event); @@ -824,6 +825,26 @@ process_line (const char *line) goto out; } } + else if (strcmp (argv[0], "stop_after_next") == 0) + { + if (sync_after_lines != -1) + { + g_print ("Can't invoke 'stop_after_next' while already stopped"); + goto out; + } + + sync_after_lines = 1; + } + else if (strcmp (argv[0], "continue") == 0) + { + if (sync_after_lines != 0) + { + g_print ("Can only invoke 'continue' while stopped"); + goto out; + } + + sync_after_lines = -1; + } else { g_print ("Unknown command %s\n", argv[0]); @@ -862,6 +883,30 @@ on_line_received (GObject *source, static void read_next_line (GDataInputStream *in) { + while (sync_after_lines == 0) + { + GdkDisplay *display = gdk_display_get_default (); + g_autoptr (GError) error = NULL; + g_autofree char *line = NULL; + size_t length; + + gdk_display_flush (display); + + line = g_data_input_stream_read_line (in, &length, NULL, &error); + if (!line) + { + if (error) + g_printerr ("Error reading from stdin: %s\n", error->message); + gtk_main_quit (); + return; + } + + process_line (line); + } + + if (sync_after_lines >= 0) + sync_after_lines--; + g_data_input_stream_read_line_async (in, G_PRIORITY_DEFAULT, NULL, on_line_received, NULL); } diff --git a/src/tests/test-runner.c b/src/tests/test-runner.c index 34cae67e4..edaf84f81 100644 --- a/src/tests/test-runner.c +++ b/src/tests/test-runner.c @@ -960,6 +960,19 @@ test_case_do (TestCase *test, return FALSE; } } + else if (strcmp (argv[0], "stop_after_next") == 0 || + strcmp (argv[0], "continue") == 0) + { + if (argc != 2) + BAD_COMMAND("usage: %s ", argv[0]); + + MetaTestClient *client = test_case_lookup_client (test, argv[1], error); + if (!client) + return FALSE; + + if (!meta_test_client_do (client, error, argv[0], NULL)) + return FALSE; + } else { BAD_COMMAND("Unknown command %s", argv[0]);