[glib] Add a directory monitoring test



commit b9406904a5d8a50a0608864160029e7bb07d04e2
Author: Matthias Clasen <mclasen redhat com>
Date:   Sun Jun 2 19:59:48 2013 -0400

    Add a directory monitoring test

 gio/tests/Makefile.am |    1 +
 gio/tests/monitor.c   |  184 +++++++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 185 insertions(+), 0 deletions(-)
---
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 <gio/gio.h>
+
+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 ();
+}


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]