From 6777dad9b50578ca9fa9a2922b010ac1b2332b0d Mon Sep 17 00:00:00 2001 From: Carlos Soriano Date: Thu, 13 Aug 2015 21:57:49 +0200 Subject: tests: add watch_moves monitor test --- gio/tests/monitor.c | 124 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 124 insertions(+) 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) { @@ -58,6 +88,32 @@ delete_file_idle (gpointer data) return G_SOURCE_REMOVE; } +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, @@ -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 (); } -- cgit v1.2.1