[glib/fix-gnulib-msvc-isnan: 28/37] tests: Speed up the file test and make it more reliable
- From: Chun-wei Fan <fanchunwei src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [glib/fix-gnulib-msvc-isnan: 28/37] tests: Speed up the file test and make it more reliable
- Date: Tue, 9 Jun 2020 10:23:31 +0000 (UTC)
commit d0f953949b21ee6baffa206a7a4aa9d951e86088
Author: Philip Withnall <withnall endlessm com>
Date: Fri May 22 11:05:27 2020 +0100
tests: Speed up the file test and make it more reliable
Sometimes this test was timing out due to the file monitor notifications
taking longer than the arbitrary 2s delay before ending the test and
checking its results at the end of `iclosed_cb()`.
Avoid that timing-dependence by ending the test when the expected file
monitor notifications are seen, or after a 10s timeout (if so, the test
is failed).
This makes the test run 4× faster in the normal case, as it’s no longer
waiting for a timeout to elapse if the file monitor notifications come
in sooner.
Signed-off-by: Philip Withnall <withnall endlessm com>
gio/tests/file.c | 51 ++++++++++++++++++++++++++-------------------------
1 file changed, 26 insertions(+), 25 deletions(-)
---
diff --git a/gio/tests/file.c b/gio/tests/file.c
index 06ff24908..c3877af4b 100644
--- a/gio/tests/file.c
+++ b/gio/tests/file.c
@@ -144,11 +144,11 @@ test_parse_name (void)
typedef struct
{
+ GMainContext *context;
GFile *file;
GFileMonitor *monitor;
GOutputStream *ostream;
GInputStream *istream;
- GMainLoop *loop;
gint buffersize;
gint monitor_created;
gint monitor_deleted;
@@ -158,6 +158,8 @@ typedef struct
const gchar *data;
gchar *buffer;
guint timeout;
+ gboolean file_deleted;
+ gboolean timed_out;
} CreateDeleteData;
static void
@@ -183,18 +185,8 @@ monitor_changed (GFileMonitor *monitor,
data->monitor_deleted++;
if (event_type == G_FILE_MONITOR_EVENT_CHANGED)
data->monitor_changed++;
-}
-
-
-static gboolean
-quit_idle (gpointer user_data)
-{
- CreateDeleteData *data = user_data;
-
- g_source_remove (data->timeout);
- g_main_loop_quit (data->loop);
- return FALSE;
+ g_main_context_wakeup (data->context);
}
static void
@@ -217,11 +209,8 @@ iclosed_cb (GObject *source,
g_assert_true (ret);
g_assert_no_error (error);
- /* work around file monitor bug:
- * inotify events are only processed every 1000 ms, regardless
- * of the rate limit set on the file monitor
- */
- g_timeout_add (2000, quit_idle, data);
+ data->file_deleted = TRUE;
+ g_main_context_wakeup (data->context);
}
static void
@@ -435,11 +424,14 @@ created_cb (GObject *source,
}
static gboolean
-stop_timeout (gpointer data)
+stop_timeout (gpointer user_data)
{
- g_assert_not_reached ();
+ CreateDeleteData *data = user_data;
- return FALSE;
+ data->timed_out = TRUE;
+ g_main_context_wakeup (data->context);
+
+ return G_SOURCE_REMOVE;
}
/*
@@ -495,14 +487,23 @@ test_create_delete (gconstpointer d)
g_signal_connect (data->monitor, "changed", G_CALLBACK (monitor_changed), data);
- data->loop = g_main_loop_new (NULL, FALSE);
-
- data->timeout = g_timeout_add (10000, stop_timeout, NULL);
+ /* Use the global default main context */
+ data->context = NULL;
+ data->timeout = g_timeout_add_seconds (10, stop_timeout, data);
g_file_create_async (data->file, 0, 0, NULL, created_cb, data);
- g_main_loop_run (data->loop);
+ while (!data->timed_out &&
+ (data->monitor_created == 0 ||
+ data->monitor_deleted == 0 ||
+ data->monitor_changed == 0 ||
+ !data->file_deleted))
+ g_main_context_iteration (data->context, TRUE);
+ g_source_remove (data->timeout);
+
+ g_assert_false (data->timed_out);
+ g_assert_true (data->file_deleted);
g_assert_cmpint (data->monitor_created, ==, 1);
g_assert_cmpint (data->monitor_deleted, ==, 1);
g_assert_cmpint (data->monitor_changed, >, 0);
@@ -511,7 +512,7 @@ test_create_delete (gconstpointer d)
g_file_monitor_cancel (data->monitor);
g_assert_true (g_file_monitor_is_cancelled (data->monitor));
- g_main_loop_unref (data->loop);
+ g_clear_pointer (&data->context, g_main_context_unref);
g_object_unref (data->ostream);
g_object_unref (data->istream);
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]