summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCarlos Soriano <csoriano@gnome.org>2015-08-13 21:57:49 +0200
committerCarlos Soriano <csoriano@gnome.org>2015-08-13 21:57:49 +0200
commit6777dad9b50578ca9fa9a2922b010ac1b2332b0d (patch)
treef6c2cf210c47e40fbf063a0b5498d04951823565
parent23d8cc57634945d4fcd86eba26e8bdbe1ecf2fa1 (diff)
downloadglib-wip/csoriano/movestest.tar.gz
tests: add watch_moves monitor testwip/csoriano/movestest
-rw-r--r--gio/tests/monitor.c124
1 files changed, 124 insertions, 0 deletions
diff --git a/gio/tests/monitor.c b/gio/tests/monitor.c
index 67be3a440..ea56141dc 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 ();
}