[glib/wip/csoriano/movestest] tests: add watch_moves monitor test



commit 6777dad9b50578ca9fa9a2922b010ac1b2332b0d
Author: Carlos Soriano <csoriano gnome org>
Date:   Thu Aug 13 21:57:49 2015 +0200

    tests: add watch_moves monitor test

 gio/tests/monitor.c |  124 +++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 124 insertions(+), 0 deletions(-)
---
diff --git a/gio/tests/monitor.c b/gio/tests/monitor.c
index 67be3a4..ea56141 100644
--- a/gio/tests/monitor.c
+++ b/gio/tests/monitor.c
@@ -7,6 +7,36 @@ typedef struct {
   gint state;
 } MonitorData;
 
+typedef struct {
+  MonitorData *from;
+  MonitorData *to;
+} MoveMonitorsData;
+
+static gboolean
+move_file_idle (gpointer data)
+{
+  MoveMonitorsData *move_monitor_data = data;
+  MonitorData *d_from = move_monitor_data->from;
+  MonitorData *d_to = move_monitor_data->to;
+  GFile *dest;
+  GError *error = NULL;
+
+  g_assert (d_from->state == 0);
+  g_assert (d_to->state == 0);
+
+  dest = g_file_get_child  (d_to->file, g_file_get_basename (d_from->file));
+  g_print ("\nfrom %s to %s\n", g_file_get_path (d_from->file), g_file_get_path (dest));
+  g_file_move (d_from->file, dest, G_FILE_COPY_NO_FALLBACK_FOR_MOVE, NULL, NULL, NULL, &error);
+  g_assert_no_error (error);
+
+  d_from->state = 1;
+  d_to->state = 1;
+
+  g_object_unref (dest);
+
+  return G_SOURCE_REMOVE;
+}
+
 static gboolean
 create_file_idle (gpointer data)
 {
@@ -59,6 +89,32 @@ delete_file_idle (gpointer data)
 }
 
 static void
+changed_move_cb (GFileMonitor      *monitor,
+                 GFile             *file,
+                 GFile             *other_file,
+                 GFileMonitorEvent  event,
+                 gpointer           data)
+{
+  MonitorData *d = data;
+
+      g_print ("\nevent %d ----- %s ------- %s\n",
+              event,
+              g_file_get_path (file),
+              other_file != NULL ? g_file_get_path (other_file) : "no other file");
+  switch (event)
+    {
+    case G_FILE_MONITOR_EVENT_MOVED_IN:
+    case G_FILE_MONITOR_EVENT_MOVED_OUT:
+      break;
+    default:
+      //g_assert_not_reached ();
+      break;
+    }
+
+  d->state = event;
+}
+
+static void
 changed_cb (GFileMonitor      *monitor,
             GFile             *file,
             GFile             *other_file,
@@ -173,12 +229,80 @@ test_directory_monitor (void)
   g_free (path);
 }
 
+static void
+test_directory_moves_monitor (void)
+{
+  gchar *path;
+  GFile *directory_1;
+  GFile *directory_2;
+  GFile *directory_3;
+  GFileMonitor *dir_monitor_1;
+  GFileMonitor *dir_monitor_2;
+  GFileMonitor *dir_monitor_3;
+  GError *error = NULL;
+  MonitorData data_1;
+  MonitorData data_2;
+  MonitorData data_3;
+  MoveMonitorsData move_monitor_data;
+  GMainLoop *loop;
+
+  loop = g_main_loop_new (NULL, FALSE);
+
+  path = g_mkdtemp (g_strdup ("directory_1_XXXXXX"));
+  directory_1 = g_file_new_for_path (path);
+
+  data_1.loop = loop;
+  data_1.file = directory_1;
+  data_1.state = 0;
+
+  path = g_mkdtemp (g_build_path ("/", path, "directory_2_XXXXXX", NULL));
+  directory_2 = g_file_new_for_path (path);
+
+  data_2.loop = loop;
+  data_2.file = directory_2;
+  data_2.state = 0;
+
+  path = g_mkdtemp (g_build_path ("/", path, "directory_3_XXXXXX", NULL));
+  directory_3 = g_file_new_for_path (path);
+
+  data_3.loop = loop;
+  data_3.file = directory_3;
+  data_3.state = 0;
+
+  dir_monitor_1 = g_file_monitor (directory_1, G_FILE_MONITOR_WATCH_MOVES, NULL, &error);
+  g_assert_no_error (error);
+  dir_monitor_2 = g_file_monitor (directory_2, G_FILE_MONITOR_WATCH_MOVES, NULL, &error);
+  g_assert_no_error (error);
+  dir_monitor_3 = g_file_monitor (directory_3, G_FILE_MONITOR_WATCH_MOVES, NULL, &error);
+  g_assert_no_error (error);
+
+  g_signal_connect (dir_monitor_1, "changed", G_CALLBACK (changed_move_cb), &data_1);
+  g_signal_connect (dir_monitor_2, "changed", G_CALLBACK (changed_move_cb), &data_2);
+  g_signal_connect (dir_monitor_3, "changed", G_CALLBACK (changed_move_cb), &data_3);
+
+  move_monitor_data.from = &data_3;
+  move_monitor_data.to = &data_1;
+  g_idle_add (move_file_idle, &move_monitor_data);
+
+  g_main_loop_run (loop);
+
+  g_assert_cmpint (data_2.state, ==, G_FILE_MONITOR_EVENT_MOVED_OUT);
+  g_assert_cmpint (data_1.state, ==, G_FILE_MONITOR_EVENT_MOVED_IN);
+
+  g_main_loop_unref (loop);
+  g_object_unref (dir_monitor_1);
+  g_object_unref (dir_monitor_2);
+  g_object_unref (dir_monitor_3);
+  g_free (path);
+}
+
 int
 main (int argc, char *argv[])
 {
   g_test_init (&argc, &argv, NULL);
 
   g_test_add_func ("/monitor/directory", test_directory_monitor);
+  g_test_add_func ("/monitor/directory_moves", test_directory_moves_monitor);
 
   return g_test_run ();
 }


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