From b9406904a5d8a50a0608864160029e7bb07d04e2 Mon Sep 17 00:00:00 2001 From: Matthias Clasen Date: Sun, 2 Jun 2013 19:59:48 -0400 Subject: [PATCH] Add a directory monitoring test --- gio/tests/Makefile.am | 1 + gio/tests/monitor.c | 184 ++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 185 insertions(+) create mode 100644 gio/tests/monitor.c diff --git a/gio/tests/Makefile.am b/gio/tests/Makefile.am index 212b524..54ff553 100644 --- a/gio/tests/Makefile.am +++ b/gio/tests/Makefile.am @@ -52,6 +52,7 @@ test_programs = \ permission \ task \ credentials \ + monitor \ $(NULL) uninstalled_test_programs = \ diff --git a/gio/tests/monitor.c b/gio/tests/monitor.c new file mode 100644 index 0000000..67be3a4 --- /dev/null +++ b/gio/tests/monitor.c @@ -0,0 +1,184 @@ +#include + +typedef struct { + GFile *file; + GOutputStream *stream; + GMainLoop *loop; + gint state; +} MonitorData; + +static gboolean +create_file_idle (gpointer data) +{ + MonitorData *d = data; + GError *error = NULL; + + g_assert (d->state == 0); + + d->stream = (GOutputStream*)g_file_create (d->file, 0, NULL, &error); + g_assert_no_error (error); + + d->state = 1; + + return G_SOURCE_REMOVE; +} + +static gboolean +write_file_idle (gpointer data) +{ + MonitorData *d = data; + GError *error = NULL; + + g_assert (d->state == 2); + + g_output_stream_write (d->stream, "abcd", 4, NULL, &error); + g_assert_no_error (error); + g_object_unref (d->stream); + d->stream = NULL; + + d->state = 3; + + + return G_SOURCE_REMOVE; +} + +static gboolean +delete_file_idle (gpointer data) +{ + MonitorData *d = data; + GError *error = NULL; + + g_assert (d->state == 4); + + g_file_delete (d->file, NULL, &error); + g_assert_no_error (error); + + d->state = 5; + + return G_SOURCE_REMOVE; +} + +static void +changed_cb (GFileMonitor *monitor, + GFile *file, + GFile *other_file, + GFileMonitorEvent event, + gpointer data) +{ + MonitorData *d = data; + + switch (d->state) + { + case 1: + g_assert (event == G_FILE_MONITOR_EVENT_CREATED); + d->state = 2; + g_idle_add (write_file_idle, data); + break; + case 3: + g_assert (event == G_FILE_MONITOR_EVENT_CHANGED || + event == G_FILE_MONITOR_EVENT_CHANGES_DONE_HINT); + if (event == G_FILE_MONITOR_EVENT_CHANGES_DONE_HINT) + { + d->state = 4; + g_idle_add (delete_file_idle, data); + } + break; + case 5: + g_assert (event == G_FILE_MONITOR_EVENT_DELETED); + d->state = 6; + if (d->loop) + g_main_loop_quit (d->loop); + break; + default: + g_assert_not_reached (); + break; + } +} + +static void +file_changed_cb (GFileMonitor *monitor, + GFile *file, + GFile *other_file, + GFileMonitorEvent event, + gpointer data) +{ + gint *state = data; + + switch (*state) + { + case 0: + g_assert (event == G_FILE_MONITOR_EVENT_CREATED); + *state = 1; + break; + case 1: + g_assert (event == G_FILE_MONITOR_EVENT_CHANGED || + event == G_FILE_MONITOR_EVENT_CHANGES_DONE_HINT); + if (event == G_FILE_MONITOR_EVENT_CHANGES_DONE_HINT) + *state = 2; + break; + case 2: + g_assert (event == G_FILE_MONITOR_EVENT_DELETED); + *state = 3; + break; + default: + g_assert_not_reached (); + break; + } +} + +static void +test_directory_monitor (void) +{ + gchar *path; + GFile *file; + GFile *child; + GFileMonitor *dir_monitor; + GFileMonitor *file_monitor; + GError *error = NULL; + MonitorData data; + gint state; + GMainLoop *loop; + + path = g_mkdtemp (g_strdup ("file_monitor_XXXXXX")); + file = g_file_new_for_path (path); + dir_monitor = g_file_monitor_directory (file, 0, NULL, &error); + g_assert_no_error (error); + + child = g_file_get_child (file, "test-file"); + file_monitor = g_file_monitor_file (child, 0, NULL, &error); + g_assert_no_error (error); + + loop = g_main_loop_new (NULL, FALSE); + + g_signal_connect (dir_monitor, "changed", G_CALLBACK (changed_cb), &data); + g_signal_connect (file_monitor, "changed", G_CALLBACK (file_changed_cb), &state); + + data.loop = loop; + data.file = child; + data.state = 0; + state = 0; + + g_idle_add (create_file_idle, &data); + + g_main_loop_run (loop); + + g_assert_cmpint (data.state, ==, 6); + g_assert_cmpint (state, ==, 3); + + g_main_loop_unref (loop); + g_object_unref (dir_monitor); + g_object_unref (file_monitor); + g_object_unref (child); + g_object_unref (file); + g_free (path); +} + +int +main (int argc, char *argv[]) +{ + g_test_init (&argc, &argv, NULL); + + g_test_add_func ("/monitor/directory", test_directory_monitor); + + return g_test_run (); +} -- 2.7.4