[nautilus] test: Add file-operations-move test



commit ab31018cdaeb1c592e1c46402c5ae1facc503151
Author: Alexandru Fazakas <alex fazakas97 gmail com>
Date:   Sun May 27 17:03:37 2018 +0300

    test: Add file-operations-move test
    
    This patch includes the addition of the sync alternative to the
    file-operations-move function and a test for it.

 src/nautilus-file-operations.c                     | 168 +++--
 src/nautilus-file-operations.h                     |  15 +-
 src/nautilus-file-undo-operations.c                |  20 +-
 src/nautilus-file-utilities.c                      |   2 +-
 test/automated/displayless/meson.build             |   3 +
 .../displayless/test-file-operations-move-files.c  | 750 +++++++++++++++++++++
 test/meson.build                                   |   3 +-
 7 files changed, 883 insertions(+), 78 deletions(-)
---
diff --git a/src/nautilus-file-operations.c b/src/nautilus-file-operations.c
index b94b7c995..888075613 100644
--- a/src/nautilus-file-operations.c
+++ b/src/nautilus-file-operations.c
@@ -256,6 +256,11 @@ static void empty_trash_task_done (GObject      *source_object,
 static char *query_fs_type (GFile        *file,
                             GCancellable *cancellable);
 
+static void nautilus_file_operations_move (GTask        *task,
+                                           gpointer      source_object,
+                                           gpointer      task_data,
+                                           GCancellable *cancellable);
+
 /* keep in time with get_formatted_time ()
  *
  * This counts and outputs the number of “time units”
@@ -6240,11 +6245,69 @@ move_task_done (GObject      *source_object,
     nautilus_file_changes_consume_changes (TRUE);
 }
 
+static CopyMoveJob *
+move_job_setup (GList                *files,
+                GFile                *target_dir,
+                GtkWindow            *parent_window,
+                NautilusCopyCallback  done_callback,
+                gpointer              done_callback_data)
+{
+    CopyMoveJob *job;
+
+    job = op_job_new (CopyMoveJob, parent_window);
+    job->is_move = TRUE;
+    job->done_callback = done_callback;
+    job->done_callback_data = done_callback_data;
+    job->files = g_list_copy_deep (files, (GCopyFunc) g_object_ref, NULL);
+    job->destination = g_object_ref (target_dir);
+
+    /* Need to indicate the destination for the operation notification open
+     * button. */
+    nautilus_progress_info_set_destination (((CommonJob *) job)->progress, job->destination);
+    job->debuting_files = g_hash_table_new_full (g_file_hash, (GEqualFunc) g_file_equal, g_object_unref, 
NULL);
+
+    return job;
+}
+
+void
+nautilus_file_operations_move_sync (GList                *files,
+                                    GFile                *target_dir,
+                                    GtkWindow            *parent_window,
+                                    NautilusCopyCallback  done_callback,
+                                    gpointer              done_callback_data)
+{
+    GTask *task;
+    CopyMoveJob *job;
+
+    job = move_job_setup (files, target_dir, parent_window, done_callback, done_callback_data);
+    task = g_task_new (NULL, job->common.cancellable, move_task_done, job);
+    g_task_set_task_data (task, job, NULL);
+    g_task_run_in_thread_sync (task, nautilus_file_operations_move);
+    g_object_unref (task);
+}
+
+void
+nautilus_file_operations_move_async (GList                *files,
+                                     GFile                *target_dir,
+                                     GtkWindow            *parent_window,
+                                     NautilusCopyCallback  done_callback,
+                                     gpointer              done_callback_data)
+{
+    GTask *task;
+    CopyMoveJob *job;
+
+    job = move_job_setup (files, target_dir, parent_window, done_callback, done_callback_data);
+    task = g_task_new (NULL, job->common.cancellable, move_task_done, job);
+    g_task_set_task_data (task, job, NULL);
+    g_task_run_in_thread (task, nautilus_file_operations_move);
+    g_object_unref (task);
+}
+
 static void
-move_task_thread_func (GTask        *task,
-                       gpointer      source_object,
-                       gpointer      task_data,
-                       GCancellable *cancellable)
+nautilus_file_operations_move (GTask        *task,
+                               gpointer      source_object,
+                               gpointer      task_data,
+                               GCancellable *cancellable)
 {
     CopyMoveJob *job;
     CommonJob *common;
@@ -6256,12 +6319,46 @@ move_task_thread_func (GTask        *task,
     GList *fallback_files;
 
     job = task_data;
-    common = &job->common;
 
-    fallbacks = NULL;
+    /* Since we never initiate the app (in the case of
+     * testing), we can't inhibit its power manager.
+     * This would terminate the testing. So we avoid
+     * doing this by checking if the RUNNING_TESTS
+     * environment variable is set to "TRUE".
+     */
+    if (g_strcmp0 (g_getenv ("RUNNING_TESTS"), "TRUE"))
+    {
+        inhibit_power_manager ((CommonJob *) job, _("Moving Files"));
+    }
+
+    if (!nautilus_file_undo_manager_is_operating ())
+    {
+        GFile *src_dir;
+
+        src_dir = g_file_get_parent ((job->files)->data);
+
+        if (g_file_has_uri_scheme (g_list_first (job->files)->data, "trash"))
+        {
+            job->common.undo_info = nautilus_file_undo_info_ext_new 
(NAUTILUS_FILE_UNDO_OP_RESTORE_FROM_TRASH,
+                                                                     g_list_length (job->files),
+                                                                     src_dir, job->destination);
+        }
+        else
+        {
+            job->common.undo_info = nautilus_file_undo_info_ext_new (NAUTILUS_FILE_UNDO_OP_MOVE,
+                                                                     g_list_length (job->files),
+                                                                     src_dir, job->destination);
+        }
+
+        g_object_unref (src_dir);
+    }
+
+    common = &job->common;
 
     nautilus_progress_info_start (job->common.progress);
 
+    fallbacks = NULL;
+
     verify_destination (&job->common,
                         job->destination,
                         &dest_fs_id,
@@ -6313,57 +6410,6 @@ aborted:
     g_list_free_full (fallbacks, g_free);
 }
 
-void
-nautilus_file_operations_move (GList                *files,
-                               GFile                *target_dir,
-                               GtkWindow            *parent_window,
-                               NautilusCopyCallback  done_callback,
-                               gpointer              done_callback_data)
-{
-    GTask *task;
-    CopyMoveJob *job;
-
-    job = op_job_new (CopyMoveJob, parent_window);
-    job->is_move = TRUE;
-    job->done_callback = done_callback;
-    job->done_callback_data = done_callback_data;
-    job->files = g_list_copy_deep (files, (GCopyFunc) g_object_ref, NULL);
-    job->destination = g_object_ref (target_dir);
-    /* Need to indicate the destination for the operation notification open
-     * button. */
-    nautilus_progress_info_set_destination (((CommonJob *) job)->progress, target_dir);
-    job->debuting_files = g_hash_table_new_full (g_file_hash, (GEqualFunc) g_file_equal, g_object_unref, 
NULL);
-
-    inhibit_power_manager ((CommonJob *) job, _("Moving Files"));
-
-    if (!nautilus_file_undo_manager_is_operating ())
-    {
-        GFile *src_dir;
-
-        src_dir = g_file_get_parent (files->data);
-
-        if (g_file_has_uri_scheme (g_list_first (files)->data, "trash"))
-        {
-            job->common.undo_info = nautilus_file_undo_info_ext_new 
(NAUTILUS_FILE_UNDO_OP_RESTORE_FROM_TRASH,
-                                                                     g_list_length (files),
-                                                                     src_dir, target_dir);
-        }
-        else
-        {
-            job->common.undo_info = nautilus_file_undo_info_ext_new (NAUTILUS_FILE_UNDO_OP_MOVE,
-                                                                     g_list_length (files),
-                                                                     src_dir, target_dir);
-        }
-
-        g_object_unref (src_dir);
-    }
-
-    task = g_task_new (NULL, job->common.cancellable, move_task_done, job);
-    g_task_set_task_data (task, job, NULL);
-    g_task_run_in_thread (task, move_task_thread_func);
-    g_object_unref (task);
-}
-
 static void
 report_preparing_link_progress (CopyMoveJob *link_job,
                                 int          total,
@@ -7029,10 +7075,10 @@ nautilus_file_operations_copy_move (const GList          *item_uris,
         }
         else
         {
-            nautilus_file_operations_move (locations,
-                                           dest,
-                                           parent_window,
-                                           done_callback, done_callback_data);
+            nautilus_file_operations_move_async (locations,
+                                                 dest,
+                                                 parent_window,
+                                                 done_callback, done_callback_data);
         }
     }
     else
diff --git a/src/nautilus-file-operations.h b/src/nautilus-file-operations.h
index 147e36b8d..5118bf7db 100644
--- a/src/nautilus-file-operations.h
+++ b/src/nautilus-file-operations.h
@@ -123,11 +123,16 @@ void nautilus_file_operations_copy      (GList                *files,
                                         GtkWindow            *parent_window,
                                         NautilusCopyCallback  done_callback,
                                         gpointer              done_callback_data);
-void nautilus_file_operations_move      (GList                *files,
-                                        GFile                *target_dir,
-                                        GtkWindow            *parent_window,
-                                        NautilusCopyCallback  done_callback,
-                                        gpointer              done_callback_data);
+void nautilus_file_operations_move_async      (GList                *files,
+                                               GFile                *target_dir,
+                                               GtkWindow            *parent_window,
+                                               NautilusCopyCallback  done_callback,
+                                               gpointer              done_callback_data);
+void nautilus_file_operations_move_sync      (GList                *files,
+                                              GFile                *target_dir,
+                                              GtkWindow            *parent_window,
+                                              NautilusCopyCallback  done_callback,
+                                              gpointer              done_callback_data);
 void nautilus_file_operations_duplicate (GList                *files,
                                         GtkWindow            *parent_window,
                                         NautilusCopyCallback  done_callback,
diff --git a/src/nautilus-file-undo-operations.c b/src/nautilus-file-undo-operations.c
index 5e24a12c2..8842de058 100644
--- a/src/nautilus-file-undo-operations.c
+++ b/src/nautilus-file-undo-operations.c
@@ -572,11 +572,11 @@ static void
 ext_move_restore_redo_func (NautilusFileUndoInfoExt *self,
                             GtkWindow               *parent_window)
 {
-    nautilus_file_operations_move (g_queue_peek_head_link (self->priv->sources),
-                                   self->priv->dest_dir,
-                                   parent_window,
-                                   file_undo_info_transfer_callback,
-                                   self);
+    nautilus_file_operations_move_async (g_queue_peek_head_link (self->priv->sources),
+                                         self->priv->dest_dir,
+                                         parent_window,
+                                         file_undo_info_transfer_callback,
+                                         self);
 }
 
 static void
@@ -624,11 +624,11 @@ static void
 ext_move_undo_func (NautilusFileUndoInfoExt *self,
                     GtkWindow               *parent_window)
 {
-    nautilus_file_operations_move (g_queue_peek_head_link (self->priv->destinations),
-                                   self->priv->src_dir,
-                                   parent_window,
-                                   file_undo_info_transfer_callback,
-                                   self);
+    nautilus_file_operations_move_async (g_queue_peek_head_link (self->priv->destinations),
+                                         self->priv->src_dir,
+                                         parent_window,
+                                         file_undo_info_transfer_callback,
+                                         self);
 }
 
 static void
diff --git a/src/nautilus-file-utilities.c b/src/nautilus-file-utilities.c
index 03c06b73d..5f0f348f7 100644
--- a/src/nautilus-file-utilities.c
+++ b/src/nautilus-file-utilities.c
@@ -817,7 +817,7 @@ ensure_dirs_task_ready_cb (GObject      *_source,
         files = g_hash_table_lookup (data->original_dirs_hash, original_dir);
         locations = locations_from_file_list (files);
 
-        nautilus_file_operations_move
+        nautilus_file_operations_move_sync
             (locations,
             original_dir_location,
             data->parent_window,
diff --git a/test/automated/displayless/meson.build b/test/automated/displayless/meson.build
index 08b06de10..b05b591b1 100644
--- a/test/automated/displayless/meson.build
+++ b/test/automated/displayless/meson.build
@@ -10,6 +10,9 @@ tests = [
   ]],
   ['test-file-operations-dir-has-files', [
     'test-file-operations-dir-has-files.c'
+  ]],
+  ['test-file-operations-move-files', [
+    'test-file-operations-move-files.c'
   ]]
 ]
 
diff --git a/test/automated/displayless/test-file-operations-move-files.c 
b/test/automated/displayless/test-file-operations-move-files.c
new file mode 100644
index 000000000..1b2e678aa
--- /dev/null
+++ b/test/automated/displayless/test-file-operations-move-files.c
@@ -0,0 +1,750 @@
+#include <glib.h>
+#include <glib/gprintf.h>
+#include "src/nautilus-directory.h"
+#include "src/nautilus-file-utilities.h"
+#include "src/nautilus-search-directory.h"
+#include "src/nautilus-directory.h"
+#include "src/nautilus-file-operations.c"
+#include "src/nautilus-file-undo-manager.h"
+#include <unistd.h>
+#include "eel/eel-string.h"
+
+static void
+test_move_one_file (void)
+{
+    g_autoptr (GFile) root = NULL;
+    g_autoptr (GFile) first_dir = NULL;
+    g_autoptr (GFile) second_dir = NULL;
+    g_autoptr (GFile) file = NULL;
+    g_autoptr (GFile) result_file = NULL;
+    g_autolist (GFile) files = NULL;
+    GFileOutputStream *out = NULL;
+    g_autoptr (GError) error = NULL;
+
+    root = g_file_new_for_path (g_get_tmp_dir ());
+    first_dir = g_file_get_child (root, "first_dir");
+    g_assert_true (first_dir != NULL);
+    g_file_make_directory (first_dir, NULL, NULL);
+
+    file = g_file_get_child (first_dir, "first_dir_child");
+    g_assert_true (file != NULL);
+    out = g_file_create (file, G_FILE_CREATE_NONE, NULL, &error);
+    if (!g_error_matches (error, G_IO_ERROR, G_IO_ERROR_EXISTS))
+    {
+        g_object_unref (out);
+    }
+    files = g_list_prepend (files, g_object_ref (file));
+
+    second_dir = g_file_get_child (root, "second_dir");
+    g_assert_true (second_dir != NULL);
+    g_file_make_directory (second_dir, NULL, NULL);
+
+    nautilus_file_operations_move_sync (files,
+                                        second_dir,
+                                        NULL,
+                                        NULL,
+                                        NULL);
+
+    result_file = g_file_get_child (second_dir, "first_dir_child");
+    g_assert_true (g_file_query_exists (result_file, NULL));
+    g_assert_false (g_file_query_exists (file, NULL));
+
+    g_assert_true (g_file_delete (result_file, NULL, NULL));
+    g_assert_true (g_file_delete (first_dir, NULL, NULL));
+    g_assert_true (g_file_delete (second_dir, NULL, NULL));
+}
+
+static void
+test_move_one_empty_directory (void)
+{
+    g_autoptr (GFile) root = NULL;
+    g_autoptr (GFile) first_dir = NULL;
+    g_autoptr (GFile) second_dir = NULL;
+    g_autoptr (GFile) file = NULL;
+    g_autoptr (GFile) result_file = NULL;
+    g_autolist (GFile) files = NULL;
+
+    root = g_file_new_for_path (g_get_tmp_dir ());
+    first_dir = g_file_get_child (root, "first_dir");
+    g_assert_true (first_dir != NULL);
+    g_file_make_directory (first_dir, NULL, NULL);
+
+    file = g_file_get_child (first_dir, "first_dir_child");
+    g_assert_true (file != NULL);
+    g_file_make_directory (file, NULL, NULL);
+    files = g_list_prepend (files, g_object_ref (file));
+
+    second_dir = g_file_get_child (root, "second_dir");
+    g_assert_true (second_dir != NULL);
+    g_file_make_directory (second_dir, NULL, NULL);
+
+    nautilus_file_operations_move_sync (files,
+                                        second_dir,
+                                        NULL,
+                                        NULL,
+                                        NULL);
+
+    result_file = g_file_get_child (second_dir, "first_dir_child");
+    g_assert_true (g_file_query_exists (result_file, NULL));
+    g_assert_false (g_file_query_exists (file, NULL));
+
+    g_assert_true (g_file_delete (result_file, NULL, NULL));
+    g_assert_true (g_file_delete (first_dir, NULL, NULL));
+    g_assert_true (g_file_delete (second_dir, NULL, NULL));
+}
+
+static void
+test_move_directories_small (void)
+{
+    g_autoptr (GFile) root = NULL;
+    g_autoptr (GFile) file = NULL;
+    g_autoptr (GFile) dir = NULL;
+    g_autolist (GFile) files = NULL;
+    g_autofree gchar *file_name = NULL;
+
+    root = g_file_new_for_path (g_get_tmp_dir ());
+
+    for (int i = 0; i < 10; i++)
+    {
+        file_name = g_strdup_printf ("file_%i", i);
+        file = g_file_get_child (root, file_name);
+        g_assert_true (file != NULL);
+        g_file_make_directory (file, NULL, NULL);
+        files = g_list_prepend (files, g_object_ref (file));
+    }
+
+    dir = g_file_get_child (root, "dir");
+    g_assert_true (dir != NULL);
+    g_file_make_directory (dir, NULL, NULL);
+
+    nautilus_file_operations_move_sync (files,
+                                        dir,
+                                        NULL,
+                                        NULL,
+                                        NULL);
+
+    for (int i = 0; i < 10; i++)
+    {
+        file_name = g_strdup_printf ("file_%i", i);
+        file = g_file_get_child (dir, file_name);
+        g_assert_true (g_file_query_exists (file, NULL));
+        g_assert_true (g_file_delete (file, NULL, NULL));
+    }
+
+    g_assert_true (g_file_query_exists (dir, NULL));
+    g_assert_true (g_file_delete (dir, NULL, NULL));
+}
+
+static void
+test_move_directories_medium (void)
+{
+    g_autoptr (GFile) root = NULL;
+    g_autoptr (GFile) file = NULL;
+    g_autoptr (GFile) dir = NULL;
+    g_autolist (GFile) files = NULL;
+    g_autofree gchar *file_name = NULL;
+
+    root = g_file_new_for_path (g_get_tmp_dir ());
+
+    for (int i = 0; i < 1000; i++)
+    {
+        file_name = g_strdup_printf ("file_%i", i);
+        file = g_file_get_child (root, file_name);
+        g_assert_true (file != NULL);
+        g_file_make_directory (file, NULL, NULL);
+        files = g_list_prepend (files, g_object_ref (file));
+    }
+
+    dir = g_file_get_child (root, "dir");
+    g_assert_true (dir != NULL);
+    g_file_make_directory (dir, NULL, NULL);
+
+    nautilus_file_operations_move_sync (files,
+                                        dir,
+                                        NULL,
+                                        NULL,
+                                        NULL);
+
+    for (int i = 0; i < 1000; i++)
+    {
+        file_name = g_strdup_printf ("file_%i", i);
+        file = g_file_get_child (dir, file_name);
+        g_assert_true (g_file_query_exists (file, NULL));
+        g_assert_true (g_file_delete (file, NULL, NULL));
+    }
+
+    g_assert_true (g_file_query_exists (dir, NULL));
+    g_assert_true (g_file_delete (dir, NULL, NULL));
+}
+
+/* Test not included as it would timeout on the CI. */
+
+/*static void
+test_move_directories_large (void)
+{
+    g_autoptr (GFile) root = NULL;
+    g_autoptr (GFile) file = NULL;
+    g_autoptr (GFile) dir = NULL;
+    g_autolist (GFile) files = NULL;
+    g_autofree gchar *file_name = NULL;
+
+    root = g_file_new_for_path (g_get_tmp_dir ());
+
+    for (int i = 0; i < 10000; i++)
+    {
+        file_name = g_strdup_printf ("file_%i", i);
+        file = g_file_get_child (root, file_name);
+        g_assert_true (file != NULL);
+        g_file_make_directory (file, NULL, NULL);
+        files = g_list_prepend (files, g_object_ref (file));
+    }
+
+    dir = g_file_get_child (root, "dir");
+    g_assert_true (dir != NULL);
+    g_file_make_directory (dir, NULL, NULL);
+
+    nautilus_file_operations_move_sync (files,
+                                        dir,
+                                        NULL,
+                                        NULL,
+                                        NULL);
+
+    for (int i = 0; i < 10000; i++)
+    {
+        file_name = g_strdup_printf ("file_%i", i);
+        file = g_file_get_child (dir, file_name);
+        g_assert_true (g_file_query_exists (file, NULL));
+        g_assert_true (g_file_delete (file, NULL, NULL));
+    }
+
+    g_assert_true (g_file_query_exists (dir, NULL));
+    g_assert_true (g_file_delete (dir, NULL, NULL));
+}*/
+
+
+static void
+test_move_files_small (void)
+{
+    g_autoptr (GFile) root = NULL;
+    g_autoptr (GFile) file = NULL;
+    g_autoptr (GFile) dir = NULL;
+    g_autolist (GFile) files = NULL;
+    g_autofree gchar *file_name = NULL;
+    GFileOutputStream *out = NULL;
+
+    root = g_file_new_for_path (g_get_tmp_dir ());
+
+    for (int i = 0; i < 10; i++)
+    {
+        g_autoptr (GError) error = NULL;
+
+        file_name = g_strdup_printf ("file_%i", i);
+        file = g_file_get_child (root, file_name);
+        g_assert_true (file != NULL);
+        out = g_file_create (file, G_FILE_CREATE_NONE, NULL, &error);
+        if (!g_error_matches (error, G_IO_ERROR, G_IO_ERROR_EXISTS))
+        {
+            g_object_unref (out);
+        }
+        files = g_list_prepend (files, g_object_ref (file));
+    }
+
+    dir = g_file_get_child (root, "dir");
+    g_assert_true (dir != NULL);
+    g_file_make_directory (dir, NULL, NULL);
+
+    nautilus_file_operations_move_sync (files,
+                                        dir,
+                                        NULL,
+                                        NULL,
+                                        NULL);
+
+    for (int i = 0; i < 10; i++)
+    {
+        file_name = g_strdup_printf ("file_%i", i);
+        file = g_file_get_child (dir, file_name);
+        g_assert_true (g_file_query_exists (file, NULL));
+        g_assert_true (g_file_delete (file, NULL, NULL));
+    }
+
+    g_assert_true (g_file_query_exists (dir, NULL));
+    g_assert_true (g_file_delete (dir, NULL, NULL));
+}
+
+static void
+test_move_files_medium (void)
+{
+    g_autoptr (GFile) root = NULL;
+    g_autoptr (GFile) file = NULL;
+    g_autoptr (GFile) dir = NULL;
+    g_autolist (GFile) files = NULL;
+    g_autofree gchar *file_name = NULL;
+    GFileOutputStream *out = NULL;
+
+    root = g_file_new_for_path (g_get_tmp_dir ());
+
+    for (int i = 0; i < 1000; i++)
+    {
+        g_autoptr (GError) error = NULL;
+
+        file_name = g_strdup_printf ("file_%i", i);
+        file = g_file_get_child (root, file_name);
+        g_assert_true (file != NULL);
+        out = g_file_create (file, G_FILE_CREATE_NONE, NULL, &error);
+        if (!g_error_matches (error, G_IO_ERROR, G_IO_ERROR_EXISTS))
+        {
+            g_object_unref (out);
+        }
+        files = g_list_prepend (files, g_object_ref (file));
+    }
+
+    dir = g_file_get_child (root, "dir");
+    g_assert_true (dir != NULL);
+    g_file_make_directory (dir, NULL, NULL);
+
+    nautilus_file_operations_move_sync (files,
+                                        dir,
+                                        NULL,
+                                        NULL,
+                                        NULL);
+
+    for (int i = 0; i < 1000; i++)
+    {
+        file_name = g_strdup_printf ("file_%i", i);
+        file = g_file_get_child (dir, file_name);
+        g_assert_true (g_file_query_exists (file, NULL));
+        g_assert_true (g_file_delete (file, NULL, NULL));
+    }
+
+    g_assert_true (g_file_query_exists (dir, NULL));
+    g_assert_true (g_file_delete (dir, NULL, NULL));
+}
+
+
+/* Test not included as it would timeout on the CI. */
+
+/*static void
+test_move_files_large (void)
+{
+    g_autoptr (GFile) root = NULL;
+    g_autoptr (GFile) file = NULL;
+    g_autoptr (GFile) dir = NULL;
+    g_autolist (GFile) files = NULL;
+    g_autofree gchar *file_name = NULL;
+    GFileOutputStream *out = NULL;
+
+    root = g_file_new_for_path (g_get_tmp_dir ());
+
+    for (int i = 0; i < 10000; i++)
+    {
+        g_autoptr (GError) error = NULL;
+
+        file_name = g_strdup_printf ("file_%i", i);
+        file = g_file_get_child (root, file_name);
+        g_assert_true (file != NULL);
+        out = g_file_create (file, G_FILE_CREATE_NONE, NULL, &error);
+        if (!g_error_matches (error, G_IO_ERROR, G_IO_ERROR_EXISTS))
+        {
+            g_object_unref (out);
+        }
+        files = g_list_prepend (files, g_object_ref (file));
+    }
+
+    dir = g_file_get_child (root, "dir");
+    g_assert_true (dir != NULL);
+    g_file_make_directory (dir, NULL, NULL);
+
+    nautilus_file_operations_move_sync (files,
+                                        dir,
+                                        NULL,
+                                        NULL,
+                                        NULL);
+
+    for (int i = 0; i < 10000; i++)
+    {
+        file_name = g_strdup_printf ("file_%i", i);
+        file = g_file_get_child (dir, file_name);
+        g_assert_true (g_file_query_exists (file, NULL));
+        g_assert_true (g_file_delete (file, NULL, NULL));
+    }
+
+    g_assert_true (g_file_query_exists (dir, NULL));
+    g_assert_true (g_file_delete (dir, NULL, NULL));
+}*/
+
+/* The hierarchy looks like this:
+ * /tmp/first_dir/first_dir_child
+ * /tmp/second_dir
+ * We're moving first_dir to second_dir.
+ */
+static void
+test_move_first_hierarchy (void)
+{
+    g_autoptr (GFile) root = NULL;
+    g_autoptr (GFile) first_dir = NULL;
+    g_autoptr (GFile) second_dir = NULL;
+    g_autoptr (GFile) file = NULL;
+    g_autoptr (GFile) result_file = NULL;
+    g_autolist (GFile) files = NULL;
+
+    root = g_file_new_for_path (g_get_tmp_dir ());
+    first_dir = g_file_get_child (root, "first_dir");
+    files = g_list_prepend (files, g_object_ref (first_dir));
+    g_assert_true (first_dir != NULL);
+    g_file_make_directory (first_dir, NULL, NULL);
+
+    file = g_file_get_child (first_dir, "first_dir_child");
+    g_assert_true (file != NULL);
+    g_file_make_directory (file, NULL, NULL);
+
+    second_dir = g_file_get_child (root, "second_dir");
+    g_assert_true (second_dir != NULL);
+    g_file_make_directory (second_dir, NULL, NULL);
+
+    nautilus_file_operations_move_sync (files,
+                                        second_dir,
+                                        NULL,
+                                        NULL,
+                                        NULL);
+
+    result_file = g_file_get_child (second_dir, "first_dir");
+    g_assert_true (g_file_query_exists (result_file, NULL));
+    file = g_file_get_child (result_file, "first_dir_child");
+    g_assert_true (g_file_query_exists (file, NULL));
+
+    g_assert_true (g_file_delete (file, NULL, NULL));
+    g_assert_true (g_file_delete (result_file, NULL, NULL));
+    g_assert_true (g_file_delete (second_dir, NULL, NULL));
+
+    file = g_file_get_child (first_dir, "first_dir_child");
+    g_assert_false (g_file_query_exists (file, NULL));
+    g_assert_false (g_file_query_exists (first_dir, NULL));
+}
+
+/* The hierarchy looks like this:
+ * /tmp/first_dir/first_child
+ * /tmp/first_dir/second_child
+ * /tmp/second_dir
+ * We're moving first_dir to second_dir.
+ */
+static void
+test_move_second_hierarchy (void)
+{
+    g_autoptr (GFile) root = NULL;
+    g_autoptr (GFile) first_dir = NULL;
+    g_autoptr (GFile) second_dir = NULL;
+    g_autoptr (GFile) file = NULL;
+    g_autoptr (GFile) result_file = NULL;
+    g_autolist (GFile) files = NULL;
+
+    root = g_file_new_for_path (g_get_tmp_dir ());
+    first_dir = g_file_get_child (root, "first_dir");
+    files = g_list_prepend (files, g_object_ref (first_dir));
+    g_assert_true (first_dir != NULL);
+    g_file_make_directory (first_dir, NULL, NULL);
+
+    file = g_file_get_child (first_dir, "first_child");
+    g_assert_true (file != NULL);
+    g_file_make_directory (file, NULL, NULL);
+    file = g_file_get_child (first_dir, "second_child");
+    g_assert_true (file != NULL);
+    g_file_make_directory (file, NULL, NULL);
+
+    second_dir = g_file_get_child (root, "second_dir");
+    g_assert_true (second_dir != NULL);
+    g_file_make_directory (second_dir, NULL, NULL);
+
+    nautilus_file_operations_move_sync (files,
+                                        second_dir,
+                                        NULL,
+                                        NULL,
+                                        NULL);
+
+    result_file = g_file_get_child (second_dir, "first_dir");
+    g_assert_true (g_file_query_exists (result_file, NULL));
+    file = g_file_get_child (result_file, "first_child");
+    g_assert_true (g_file_query_exists (file, NULL));
+    g_assert_true (g_file_delete (file, NULL, NULL));
+
+    file = g_file_get_child (result_file, "second_child");
+    g_assert_true (g_file_query_exists (file, NULL));
+    g_assert_true (g_file_delete (file, NULL, NULL));
+
+    g_assert_true (g_file_delete (result_file, NULL, NULL));
+
+    file = g_file_get_child (first_dir, "first_child");
+    g_assert_false (g_file_query_exists (file, NULL));
+
+    file = g_file_get_child (first_dir, "second_child");
+    g_assert_false (g_file_query_exists (file, NULL));    
+
+    g_assert_false (g_file_query_exists (first_dir, NULL));
+    g_assert_true (g_file_delete (second_dir, NULL, NULL));
+}
+
+/* The hierarchy looks like this:
+ * /tmp/first_dir/first_child/second_child
+ * /tmp/second_dir
+ * We're moving first_dir to second_dir.
+ */
+static void
+test_move_third_hierarchy (void)
+{
+    g_autoptr (GFile) root = NULL;
+    g_autoptr (GFile) first_dir = NULL;
+    g_autoptr (GFile) second_dir = NULL;
+    g_autoptr (GFile) file = NULL;
+    g_autoptr (GFile) result_file = NULL;
+    g_autolist (GFile) files = NULL;
+
+    root = g_file_new_for_path (g_get_tmp_dir ());
+    first_dir = g_file_get_child (root, "first_dir");
+    files = g_list_prepend (files, g_object_ref (first_dir));
+    g_assert_true (first_dir != NULL);
+    g_file_make_directory (first_dir, NULL, NULL);
+
+    file = g_file_get_child (first_dir, "first_child");
+    g_assert_true (file != NULL);
+    g_file_make_directory (file, NULL, NULL);
+    file = g_file_get_child (file, "second_child");
+    g_assert_true (file != NULL);
+    g_file_make_directory (file, NULL, NULL);
+
+    second_dir = g_file_get_child (root, "second_dir");
+    g_assert_true (second_dir != NULL);
+    g_file_make_directory (second_dir, NULL, NULL);
+
+    nautilus_file_operations_move_sync (files,
+                                        second_dir,
+                                        NULL,
+                                        NULL,
+                                        NULL);
+
+    result_file = g_file_get_child (second_dir, "first_dir");
+    g_assert_true (g_file_query_exists (result_file, NULL));
+    file = g_file_get_child (result_file, "first_child");
+    g_assert_true (g_file_query_exists (file, NULL));
+
+    file = g_file_get_child (file, "second_child");
+    g_assert_true (g_file_query_exists (file, NULL));
+    g_assert_true (g_file_delete (file, NULL, NULL));
+
+    file = g_file_get_child (result_file, "first_child");
+    g_assert_true (g_file_query_exists (file, NULL));
+    g_assert_true (g_file_delete (file, NULL, NULL));
+
+    g_assert_true (g_file_delete (result_file, NULL, NULL));
+
+    file = g_file_get_child (first_dir, "first_child");
+    g_assert_false (g_file_query_exists (file, NULL));
+    file = g_file_get_child (file, "second_child");
+    g_assert_false (g_file_query_exists (file, NULL));
+
+    g_assert_false (g_file_query_exists (first_dir, NULL));
+
+    g_assert_true (g_file_delete (second_dir, NULL, NULL));
+}
+
+/* The hierarchy looks like this:
+ * /tmp/first_dir/first_dir_dir1/dir1_child
+ * /tmp/first_dir/first_dir_dir2/dir2_child
+ * /tmp/second_dir
+ * We're moving first_dir to second_dir.
+ */
+static void
+test_move_fourth_hierarchy (void)
+{
+    g_autoptr (GFile) root = NULL;
+    g_autoptr (GFile) first_dir = NULL;
+    g_autoptr (GFile) second_dir = NULL;
+    g_autoptr (GFile) file = NULL;
+    g_autoptr (GFile) result_file = NULL;
+    g_autolist (GFile) files = NULL;
+
+    root = g_file_new_for_path (g_get_tmp_dir ());
+    first_dir = g_file_get_child (root, "first_dir");
+    files = g_list_prepend (files, g_object_ref (first_dir));
+    g_assert_true (first_dir != NULL);
+    g_file_make_directory (first_dir, NULL, NULL);
+
+    file = g_file_get_child (first_dir, "first_dir_dir1");
+    g_assert_true (file != NULL);
+    g_file_make_directory (file, NULL, NULL);
+
+    file = g_file_get_child (file, "dir1_child");
+    g_assert_true (file != NULL);
+    g_file_make_directory (file, NULL, NULL);
+
+    file = g_file_get_child (first_dir, "first_dir_dir2");
+    g_assert_true (file != NULL);
+    g_file_make_directory (file, NULL, NULL);
+
+    file = g_file_get_child (file, "dir2_child");
+    g_assert_true (file != NULL);
+    g_file_make_directory (file, NULL, NULL);
+
+    second_dir = g_file_get_child (root, "second_dir");
+    g_assert_true (second_dir != NULL);
+    g_file_make_directory (second_dir, NULL, NULL);
+
+    nautilus_file_operations_move_sync (files,
+                                        second_dir,
+                                        NULL,
+                                        NULL,
+                                        NULL);
+
+    result_file = g_file_get_child (second_dir, "first_dir");
+
+    g_assert_true (g_file_query_exists (result_file, NULL));
+    file = g_file_get_child (result_file, "first_dir_dir1");
+    g_assert_true (g_file_query_exists (file, NULL));
+    file = g_file_get_child (file, "dir1_child");
+    g_assert_true (g_file_delete (file, NULL, NULL));
+    file = g_file_get_child (result_file, "first_dir_dir1");
+    g_assert_true (g_file_delete (file, NULL, NULL));
+
+    file = g_file_get_child (result_file, "first_dir_dir2");
+    g_assert_true (g_file_query_exists (file, NULL));
+    file = g_file_get_child (file, "dir2_child");
+    g_assert_true (g_file_query_exists (file, NULL));
+    g_assert_true (g_file_delete (file, NULL, NULL));
+    file = g_file_get_child (result_file, "first_dir_dir2");
+    g_assert_true (g_file_delete (file, NULL, NULL));
+
+    g_assert_true (g_file_delete (result_file, NULL, NULL));
+
+    file = g_file_get_child (first_dir, "first_dir_dir1");
+    g_assert_false (g_file_query_exists (file, NULL));
+    file = g_file_get_child (file, "dir1_child");
+    g_assert_false (g_file_query_exists (file, NULL));
+    file = g_file_get_child (first_dir, "first_dir_dir1");
+    g_assert_false (g_file_delete (file, NULL, NULL));
+
+    file = g_file_get_child (first_dir, "first_dir_dir2");
+    g_assert_false (g_file_query_exists (file, NULL));
+    file = g_file_get_child (file, "dir2_child");
+    g_assert_false (g_file_query_exists (file, NULL));
+    file = g_file_get_child (first_dir, "first_dir_dir2");
+    g_assert_false (g_file_query_exists (file, NULL));
+
+    g_assert_false (g_file_query_exists (first_dir, NULL));
+
+    g_assert_true (g_file_delete (second_dir, NULL, NULL));
+}
+
+/* The hierarchy looks like this:
+ * /tmp/first_dir/first_dir_child
+ * /tmp/second_dir/second_dir_child
+ * /tmp/third_dir
+ * We're moving first_dir and second_dir to third_dir.
+ */
+static void
+test_move_fifth_hierarchy (void)
+{
+    g_autoptr (GFile) root = NULL;
+    g_autoptr (GFile) first_dir = NULL;
+    g_autoptr (GFile) second_dir = NULL;
+    g_autoptr (GFile) third_dir = NULL;
+    g_autoptr (GFile) file = NULL;
+    g_autoptr (GFile) result_file = NULL;
+    g_autolist (GFile) files = NULL;
+
+    root = g_file_new_for_path (g_get_tmp_dir ());
+    first_dir = g_file_get_child (root, "first_dir");
+    files = g_list_prepend (files, g_object_ref (first_dir));
+    g_assert_true (first_dir != NULL);
+    g_file_make_directory (first_dir, NULL, NULL);
+
+    file = g_file_get_child (first_dir, "first_dir_child");
+    g_assert_true (file != NULL);
+    g_file_make_directory (file, NULL, NULL);
+
+    second_dir = g_file_get_child (root, "second_dir");
+    files = g_list_prepend (files, g_object_ref (second_dir));
+    g_assert_true (second_dir != NULL);
+    g_file_make_directory (second_dir, NULL, NULL);
+
+    file = g_file_get_child (second_dir, "second_dir_child");
+    g_assert_true (file != NULL);
+    g_file_make_directory (file, NULL, NULL);
+
+    third_dir = g_file_get_child (root, "third_dir");
+    g_assert_true (third_dir != NULL);
+    g_file_make_directory (third_dir, NULL, NULL);
+
+    nautilus_file_operations_move_sync (files,
+                                        third_dir,
+                                        NULL,
+                                        NULL,
+                                        NULL);
+
+    result_file = g_file_get_child (third_dir, "first_dir");
+    g_assert_true (g_file_query_exists (result_file, NULL));
+    file = g_file_get_child (result_file, "first_dir_child");
+    g_assert_true (g_file_query_exists (file, NULL));
+    g_assert_true (g_file_delete (file, NULL, NULL));
+    g_assert_true (g_file_delete (result_file, NULL, NULL));
+
+    result_file = g_file_get_child (third_dir, "second_dir");
+    g_assert_true (g_file_query_exists (result_file, NULL));
+    file = g_file_get_child (result_file, "second_dir_child");
+    g_assert_true (g_file_query_exists (file, NULL));
+    g_assert_true (g_file_delete (file, NULL, NULL));
+    g_assert_true (g_file_delete (result_file, NULL, NULL));
+
+    file = g_file_get_child (first_dir, "first_dir_child");
+    g_assert_false (g_file_query_exists (file, NULL));
+    g_assert_false (g_file_query_exists (first_dir, NULL));
+
+    file = g_file_get_child (second_dir, "second_dir_child");
+    g_assert_false (g_file_query_exists (file, NULL));
+    g_assert_false (g_file_query_exists (second_dir, NULL));
+
+    g_assert_true (g_file_delete (third_dir, NULL, NULL));
+}
+
+static void
+setup_test_suite (void)
+{
+    g_test_add_func ("/test-move-one-file/1.0",
+                     test_move_one_file);
+    g_test_add_func ("/test-move-one-empty-directory/1.0",
+                     test_move_one_empty_directory);
+    g_test_add_func ("/test-move-files/1.0",
+                     test_move_files_small);
+    g_test_add_func ("/test-move-files/1.1",
+                     test_move_files_medium);
+    // g_test_add_func ("/test-move-files/1.2",
+    //                  test_move_files_large);
+    g_test_add_func ("/test-move-directories/1.0",
+                     test_move_directories_small);
+    g_test_add_func ("/test-move-directories/1.1",
+                     test_move_directories_medium);
+    // g_test_add_func ("/test-move-directories/1.2",
+    //                  test_move_directories_large);
+    g_test_add_func ("/test-move-hierarchy/1.0",
+                     test_move_first_hierarchy);
+    g_test_add_func ("/test-move-hierarchy/1.1",
+                     test_move_second_hierarchy);
+    g_test_add_func ("/test-move-hierarchy/1.2",
+                     test_move_third_hierarchy);
+    g_test_add_func ("/test-move-hierarchy/1.3",
+                     test_move_fourth_hierarchy);
+    g_test_add_func ("/test-move-hierarchy/1.4",
+                     test_move_fifth_hierarchy);
+}
+
+int
+main (int argc, char *argv[])
+{
+    g_autoptr (NautilusFileUndoManager) undo_manager = NULL;
+
+    g_test_init (&argc, &argv, NULL);
+    g_test_set_nonfatal_assertions ();
+    nautilus_ensure_extension_points();
+    undo_manager = nautilus_file_undo_manager_new ();
+
+    setup_test_suite ();
+
+    return g_test_run ();
+}
\ No newline at end of file
diff --git a/test/meson.build b/test/meson.build
index 815705509..ab588efd3 100644
--- a/test/meson.build
+++ b/test/meson.build
@@ -14,7 +14,8 @@
 # G_TEST_BUILDDIR and G_TEST_SRCDIR cannot be preset, since
 # the test sources are scattered.
 test_env = [
-  'GSETTINGS_SCHEMA_DIR=@0@'.format(join_paths(meson.build_root(), 'data'))
+  'GSETTINGS_SCHEMA_DIR=@0@'.format(join_paths(meson.build_root(), 'data')),
+  'RUNNING_TESTS=@0@'.format('TRUE')
 ]
 
 subdir('automated')



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