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.
This commit is contained in:
Alexandru Fazakas 2018-05-27 17:03:37 +03:00 committed by Carlos Soriano
parent 67b6843130
commit ab31018cda
7 changed files with 883 additions and 78 deletions

View file

@ -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;
/* 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;
fallbacks = NULL;
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

View file

@ -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,

View file

@ -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

View file

@ -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,

View file

@ -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'
]]
]

View file

@ -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 ();
}

View file

@ -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')