[gnome-autoar/wip/razvan/extract-refactor: 4/4] Add tests for the extract operation



commit a7ab20d02c6ad9279acdc5c91be420be4f93311d
Author: Razvan Chitu <razvan ch95 gmail com>
Date:   Tue Jun 7 11:53:01 2016 +0300

    Add tests for the extract operation

 .gitignore                                         |    1 +
 Makefile.am                                        |    5 +
 .../in/arextract.zip                               |  Bin 0 -> 930 bytes
 .../out/arextract/arextract.txt                    |    1 +
 .../out/arextract/arextract/arextract.txt          |    1 +
 .../arextract/arextract_nested/arextract.txt       |    1 +
 .../ref/arextract/arextract.txt                    |    1 +
 .../ref/arextract/arextract/arextract.txt          |    1 +
 .../arextract/arextract_nested/arextract.txt       |    1 +
 .../test-multiple-files-same-name/in/arextract.zip |  Bin 0 -> 762 bytes
 .../out/arextract/arextract.txt                    |    1 +
 .../out/arextract/arextract_nested/arextract.txt   |    1 +
 .../ref/arextract/arextract.txt                    |    1 +
 .../ref/arextract/arextract_nested/arextract.txt   |    1 +
 .../test-one-file-different-name/in/arextract.zip  |  Bin 0 -> 208 bytes
 .../out/arextract/arextractdifferent.txt           |    1 +
 .../ref/arextract/arextractdifferent.txt           |    1 +
 .../test-one-file-same-name/in/arextract.zip       |  Bin 0 -> 190 bytes
 .../test-one-file-same-name/out/arextract.txt      |    1 +
 .../test-one-file-same-name/ref/arextract.txt      |    1 +
 tests/test-extract-unit.c                          |  672 ++++++++++++++++++++
 21 files changed, 692 insertions(+), 0 deletions(-)
---
diff --git a/.gitignore b/.gitignore
index 899beeb..db5f7d4 100644
--- a/.gitignore
+++ b/.gitignore
@@ -45,6 +45,7 @@ gnome-autoar/gnome-autoar.pc
 gnome-autoar/gnome-autoar-gtk.pc
 
 tests/test-extract
+tests/test-extract-unit
 tests/test-extract-memory
 tests/test-create
 tests/test-pref
diff --git a/Makefile.am b/Makefile.am
index e75aef8..1d278b2 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -185,6 +185,7 @@ EXTRA_DIST += $(gsettings_SCHEMAS)
 # Directory: tests
 noinst_PROGRAMS = \
        tests/test-extract      \
+       tests/test-extract-unit
        tests/test-pref         \
        tests/test-create       \
        $(NULL)
@@ -204,6 +205,10 @@ tests_test_extract_SOURCES = tests/test-extract.c
 tests_test_extract_CFLAGS = $(test_cflags)
 tests_test_extract_LDADD = $(test_libs)
 
+tests_test_extract_unit_SOURCES = tests/test-extract-unit.c
+tests_test_extract_unit_CFLAGS = $(test_cflags)
+tests_test_extract_unit_LDADD = $(test_libs)
+
 tests_test_pref_SOURCES = tests/test-pref.c
 tests_test_pref_CFLAGS = $(test_cflags)
 tests_test_pref_LDADD = $(test_libs)
diff --git a/tests/files/extract/test-multiple-files-different-name/in/arextract.zip 
b/tests/files/extract/test-multiple-files-different-name/in/arextract.zip
new file mode 100644
index 0000000..4f5f42a
Binary files /dev/null and b/tests/files/extract/test-multiple-files-different-name/in/arextract.zip differ
diff --git a/tests/files/extract/test-multiple-files-different-name/out/arextract/arextract.txt 
b/tests/files/extract/test-multiple-files-different-name/out/arextract/arextract.txt
new file mode 100644
index 0000000..12466e2
--- /dev/null
+++ b/tests/files/extract/test-multiple-files-different-name/out/arextract/arextract.txt
@@ -0,0 +1 @@
+AutoarExtract
diff --git a/tests/files/extract/test-multiple-files-different-name/out/arextract/arextract/arextract.txt 
b/tests/files/extract/test-multiple-files-different-name/out/arextract/arextract/arextract.txt
new file mode 100644
index 0000000..12466e2
--- /dev/null
+++ b/tests/files/extract/test-multiple-files-different-name/out/arextract/arextract/arextract.txt
@@ -0,0 +1 @@
+AutoarExtract
diff --git 
a/tests/files/extract/test-multiple-files-different-name/out/arextract/arextract/arextract_nested/arextract.txt
 
b/tests/files/extract/test-multiple-files-different-name/out/arextract/arextract/arextract_nested/arextract.txt
new file mode 100644
index 0000000..12466e2
--- /dev/null
+++ 
b/tests/files/extract/test-multiple-files-different-name/out/arextract/arextract/arextract_nested/arextract.txt
@@ -0,0 +1 @@
+AutoarExtract
diff --git a/tests/files/extract/test-multiple-files-different-name/ref/arextract/arextract.txt 
b/tests/files/extract/test-multiple-files-different-name/ref/arextract/arextract.txt
new file mode 100644
index 0000000..12466e2
--- /dev/null
+++ b/tests/files/extract/test-multiple-files-different-name/ref/arextract/arextract.txt
@@ -0,0 +1 @@
+AutoarExtract
diff --git a/tests/files/extract/test-multiple-files-different-name/ref/arextract/arextract/arextract.txt 
b/tests/files/extract/test-multiple-files-different-name/ref/arextract/arextract/arextract.txt
new file mode 100644
index 0000000..12466e2
--- /dev/null
+++ b/tests/files/extract/test-multiple-files-different-name/ref/arextract/arextract/arextract.txt
@@ -0,0 +1 @@
+AutoarExtract
diff --git 
a/tests/files/extract/test-multiple-files-different-name/ref/arextract/arextract/arextract_nested/arextract.txt
 
b/tests/files/extract/test-multiple-files-different-name/ref/arextract/arextract/arextract_nested/arextract.txt
new file mode 100644
index 0000000..12466e2
--- /dev/null
+++ 
b/tests/files/extract/test-multiple-files-different-name/ref/arextract/arextract/arextract_nested/arextract.txt
@@ -0,0 +1 @@
+AutoarExtract
diff --git a/tests/files/extract/test-multiple-files-same-name/in/arextract.zip 
b/tests/files/extract/test-multiple-files-same-name/in/arextract.zip
new file mode 100644
index 0000000..83d30b3
Binary files /dev/null and b/tests/files/extract/test-multiple-files-same-name/in/arextract.zip differ
diff --git a/tests/files/extract/test-multiple-files-same-name/out/arextract/arextract.txt 
b/tests/files/extract/test-multiple-files-same-name/out/arextract/arextract.txt
new file mode 100644
index 0000000..12466e2
--- /dev/null
+++ b/tests/files/extract/test-multiple-files-same-name/out/arextract/arextract.txt
@@ -0,0 +1 @@
+AutoarExtract
diff --git a/tests/files/extract/test-multiple-files-same-name/out/arextract/arextract_nested/arextract.txt 
b/tests/files/extract/test-multiple-files-same-name/out/arextract/arextract_nested/arextract.txt
new file mode 100644
index 0000000..12466e2
--- /dev/null
+++ b/tests/files/extract/test-multiple-files-same-name/out/arextract/arextract_nested/arextract.txt
@@ -0,0 +1 @@
+AutoarExtract
diff --git a/tests/files/extract/test-multiple-files-same-name/ref/arextract/arextract.txt 
b/tests/files/extract/test-multiple-files-same-name/ref/arextract/arextract.txt
new file mode 100644
index 0000000..12466e2
--- /dev/null
+++ b/tests/files/extract/test-multiple-files-same-name/ref/arextract/arextract.txt
@@ -0,0 +1 @@
+AutoarExtract
diff --git a/tests/files/extract/test-multiple-files-same-name/ref/arextract/arextract_nested/arextract.txt 
b/tests/files/extract/test-multiple-files-same-name/ref/arextract/arextract_nested/arextract.txt
new file mode 100644
index 0000000..12466e2
--- /dev/null
+++ b/tests/files/extract/test-multiple-files-same-name/ref/arextract/arextract_nested/arextract.txt
@@ -0,0 +1 @@
+AutoarExtract
diff --git a/tests/files/extract/test-one-file-different-name/in/arextract.zip 
b/tests/files/extract/test-one-file-different-name/in/arextract.zip
new file mode 100644
index 0000000..1c24bdc
Binary files /dev/null and b/tests/files/extract/test-one-file-different-name/in/arextract.zip differ
diff --git a/tests/files/extract/test-one-file-different-name/out/arextract/arextractdifferent.txt 
b/tests/files/extract/test-one-file-different-name/out/arextract/arextractdifferent.txt
new file mode 100644
index 0000000..12466e2
--- /dev/null
+++ b/tests/files/extract/test-one-file-different-name/out/arextract/arextractdifferent.txt
@@ -0,0 +1 @@
+AutoarExtract
diff --git a/tests/files/extract/test-one-file-different-name/ref/arextract/arextractdifferent.txt 
b/tests/files/extract/test-one-file-different-name/ref/arextract/arextractdifferent.txt
new file mode 100644
index 0000000..12466e2
--- /dev/null
+++ b/tests/files/extract/test-one-file-different-name/ref/arextract/arextractdifferent.txt
@@ -0,0 +1 @@
+AutoarExtract
diff --git a/tests/files/extract/test-one-file-same-name/in/arextract.zip 
b/tests/files/extract/test-one-file-same-name/in/arextract.zip
new file mode 100644
index 0000000..8c2eeb6
Binary files /dev/null and b/tests/files/extract/test-one-file-same-name/in/arextract.zip differ
diff --git a/tests/files/extract/test-one-file-same-name/out/arextract.txt 
b/tests/files/extract/test-one-file-same-name/out/arextract.txt
new file mode 100644
index 0000000..12466e2
--- /dev/null
+++ b/tests/files/extract/test-one-file-same-name/out/arextract.txt
@@ -0,0 +1 @@
+AutoarExtract
diff --git a/tests/files/extract/test-one-file-same-name/ref/arextract.txt 
b/tests/files/extract/test-one-file-same-name/ref/arextract.txt
new file mode 100644
index 0000000..12466e2
--- /dev/null
+++ b/tests/files/extract/test-one-file-same-name/ref/arextract.txt
@@ -0,0 +1 @@
+AutoarExtract
diff --git a/tests/test-extract-unit.c b/tests/test-extract-unit.c
new file mode 100644
index 0000000..c2c01d4
--- /dev/null
+++ b/tests/test-extract-unit.c
@@ -0,0 +1,672 @@
+#include <gnome-autoar/autoar.h>
+#include <gio/gio.h>
+#include <glib/gstdio.h>
+#include <errno.h>
+#include <string.h>
+
+
+typedef void (*FileScannedCallback) (GFile *scanned_file,
+                                     GFileInfo *scanned_file_info,
+                                     gpointer user_data);
+
+typedef struct {
+  GFile *in;
+  GFile *out;
+  GFile *ref;
+
+  GHashTable *unmatched_files;
+} ExtractTest;
+
+typedef struct {
+  GCancellable *cancellable;
+
+  guint number_of_files;
+
+  GFile *suggested_destination;
+  GFile *destination_to_suggest;
+
+  guint64 completed_size;
+  guint completed_files;
+
+  gboolean completed;
+
+  GError *error;
+
+  gboolean cancelled;
+} ExtractTestData;
+
+
+#define TESTS_DIR_NAME "tests"
+#define EXTRACT_TESTS_DIR_NAME "files/extract"
+
+GFile *extract_tests_dir;
+
+AutoarPref *arpref;
+
+
+static gboolean
+remove_dir (GFile *dir)
+{
+  gboolean success = TRUE;
+  GFileEnumerator *enumerator;
+  GError *error = NULL;
+
+  enumerator = g_file_enumerate_children (dir,
+                                          G_FILE_ATTRIBUTE_STANDARD_NAME,
+                                          G_FILE_QUERY_INFO_NONE,
+                                          NULL, NULL);
+
+  if (enumerator) {
+    GFileInfo *info;
+
+    while ((info = g_file_enumerator_next_file (enumerator, NULL, NULL)) != NULL) {
+      g_autoptr(GFile) child;
+
+      child = g_file_get_child (dir, g_file_info_get_name (info));
+
+      if (!g_file_delete (child, NULL, &error)) {
+        if (g_error_matches (error, G_IO_ERROR, G_IO_ERROR_NOT_EMPTY)) {
+          success &= remove_dir (child);
+        } else {
+          success = FALSE;
+        }
+
+        g_error_free (error);
+        error = NULL;
+      }
+
+      g_object_unref (info);
+    }
+
+    g_object_unref (enumerator);
+  }
+
+  g_file_delete (dir, NULL, &error);
+
+  if (error) {
+    success = FALSE;
+    g_error_free (error);
+  }
+
+  return success;
+}
+
+static ExtractTest*
+extract_test_new (const char *test_name)
+{
+  ExtractTest *extract_test;
+  GFile *workdir;
+  GFile *in;
+  GFile *out;
+  GFile *ref;
+
+  workdir = g_file_get_child (extract_tests_dir, test_name);
+  if (g_file_query_file_type (workdir, G_FILE_QUERY_INFO_NONE, NULL) != G_FILE_TYPE_DIRECTORY) {
+    g_printerr ("%s: workdir does not exist", test_name);
+
+    g_object_unref (workdir);
+
+    return NULL;
+  }
+
+  in = g_file_get_child (workdir, "in");
+  ref = g_file_get_child (workdir, "ref");
+
+  if (g_file_query_file_type (in, G_FILE_QUERY_INFO_NONE, NULL) != G_FILE_TYPE_DIRECTORY ||
+      g_file_query_file_type (ref, G_FILE_QUERY_INFO_NONE, NULL) != G_FILE_TYPE_DIRECTORY) {
+    g_printerr ("%s: input or output directory does not exist\n", test_name);
+
+    g_object_unref (workdir);
+    g_object_unref (in);
+
+    return NULL;
+  }
+
+  out = g_file_get_child (workdir, "out");
+
+  remove_dir (out);
+
+  g_file_make_directory_with_parents (out, NULL, NULL);
+
+  extract_test = g_new0 (ExtractTest, 1);
+
+  extract_test->in = in;
+  extract_test->ref = ref;
+  extract_test->out = out;
+
+  extract_test->unmatched_files = g_hash_table_new_full (g_str_hash,
+                                                         g_str_equal,
+                                                         g_free,
+                                                         g_object_unref);
+
+  return extract_test;
+}
+
+static void
+extract_test_free (ExtractTest *extract_test)
+{
+  g_object_unref (extract_test->in);
+  g_object_unref (extract_test->ref);
+  g_object_unref (extract_test->out);
+
+  g_hash_table_destroy (extract_test->unmatched_files);
+
+  g_free (extract_test);
+}
+
+static void
+scanned_handler (AutoarExtract *arextract,
+                 guint files,
+                 gpointer user_data)
+{
+  ExtractTestData *data = user_data;
+
+  data->number_of_files = files;
+}
+
+static GFile*
+confirm_dest_handler (AutoarExtract *arextract,
+                      GFile *dest,
+                      GList *files,
+                      gpointer user_data)
+{
+  ExtractTestData *data = user_data;
+
+  data->suggested_destination = g_object_ref (dest);
+
+  return data->destination_to_suggest;
+}
+
+static void
+progress_handler (AutoarExtract *arextract,
+                  guint64 completed_size,
+                  guint completed_files,
+                  gpointer user_data)
+{
+  ExtractTestData *data = user_data;
+
+  data->completed_size = completed_size;
+  data->completed_files = completed_files;
+}
+
+static GFile*
+conflict_handler (AutoarExtract *arextract,
+                  GFile *file,
+                  gpointer user_data)
+{
+  return NULL;
+}
+
+static void
+error_handler (AutoarExtract *arextract,
+               GError *error,
+               gpointer user_data)
+{
+  ExtractTestData *data = user_data;
+
+  data->error = g_error_copy (error);
+}
+
+static void
+completed_handler (AutoarExtract *arextract,
+                   gpointer user_data)
+{
+  ExtractTestData *data = user_data;
+
+  data->completed = TRUE;
+}
+
+static void
+cancelled_handler (AutoarExtract *arextract,
+                   gpointer user_data)
+{
+  ExtractTestData *data = user_data;
+
+  data->cancelled = TRUE;
+}
+
+static ExtractTestData*
+extract_test_data_new_for_extract (AutoarExtract *arextract)
+{
+  ExtractTestData *data;
+
+  data = g_new0 (ExtractTestData, 1);
+
+  data->cancellable = g_cancellable_new ();
+
+  g_signal_connect (arextract, "scanned",
+                    G_CALLBACK (scanned_handler), data);
+  g_signal_connect (arextract, "confirm-dest",
+                    G_CALLBACK (confirm_dest_handler), data);
+  g_signal_connect (arextract, "progress",
+                    G_CALLBACK (progress_handler), data);
+  g_signal_connect (arextract, "conflict",
+                    G_CALLBACK (conflict_handler), data);
+  g_signal_connect (arextract, "completed",
+                    G_CALLBACK (completed_handler), data);
+  g_signal_connect (arextract, "error",
+                    G_CALLBACK (error_handler), data);
+  g_signal_connect (arextract, "cancelled",
+                    G_CALLBACK (cancelled_handler), data);
+
+  return data;
+}
+
+static void
+extract_test_data_free (ExtractTestData *data)
+{
+  g_object_unref (data->cancellable);
+
+  if (data->suggested_destination) {
+    g_object_unref (data->suggested_destination);
+  }
+
+  if (data->destination_to_suggest) {
+    g_object_unref (data->destination_to_suggest);
+  }
+
+  if (data->error) {
+    g_error_free (data->error);
+  }
+
+  g_free (data);
+}
+
+static gboolean
+setup_extract_tests_dir (const char *executable_path)
+{
+  GFile *tests_dir;
+  gboolean found;
+
+  tests_dir = g_file_new_for_commandline_arg (executable_path);
+
+  found = FALSE;
+  while (!found && g_file_has_parent (tests_dir, NULL)) {
+    GFile *parent;
+    gchar *parent_basename;
+
+    parent = g_file_get_parent (tests_dir);
+    parent_basename = g_file_get_basename (parent);
+
+    if (g_strcmp0 (parent_basename, TESTS_DIR_NAME) == 0) {
+      found = TRUE;
+    }
+
+    g_object_unref (tests_dir);
+    g_free (parent_basename);
+
+    tests_dir = parent;
+  }
+
+  if (!found) {
+    g_printerr ("Tests directory not in executable path\n");
+    g_object_unref (tests_dir);
+    return FALSE;
+  }
+
+  extract_tests_dir = g_file_get_child (tests_dir, EXTRACT_TESTS_DIR_NAME);
+
+  if (!g_file_query_exists (extract_tests_dir, NULL)) {
+    g_printerr ("Extract tests directory does not exist in tests directory\n");
+    g_object_unref (tests_dir);
+    return FALSE;
+  }
+
+  g_object_unref (tests_dir);
+
+  return TRUE;
+}
+
+/* Asserts that all files in @included are also in @including */
+static void
+scan_directory (GFile *directory,
+                FileScannedCallback scanned_callback,
+                gpointer callback_data)
+{
+  GQueue *files;
+  GQueue *file_infos;
+  GFileEnumerator *enumerator;
+
+  files = g_queue_new ();
+  file_infos = g_queue_new ();
+
+  g_queue_push_tail (files, g_object_ref (directory));
+  g_queue_push_tail (file_infos,
+                     g_file_query_info (directory,
+                                        G_FILE_ATTRIBUTE_STANDARD_NAME","
+                                        G_FILE_ATTRIBUTE_STANDARD_TYPE,
+                                        G_FILE_QUERY_INFO_NOFOLLOW_SYMLINKS,
+                                        NULL, NULL));
+
+  while (!g_queue_is_empty (files)) {
+    g_autoptr (GFile) file;
+    g_autoptr (GFileInfo) file_info;
+
+    file = g_queue_pop_tail (files);
+    file_info = g_queue_pop_tail (file_infos);
+
+    if (scanned_callback) {
+      scanned_callback (file, file_info, callback_data);
+    }
+
+    if (g_file_info_get_file_type (file_info) == G_FILE_TYPE_DIRECTORY) {
+      enumerator = g_file_enumerate_children (file,
+                                              G_FILE_ATTRIBUTE_STANDARD_NAME","
+                                              G_FILE_ATTRIBUTE_STANDARD_TYPE,
+                                              G_FILE_QUERY_INFO_NOFOLLOW_SYMLINKS,
+                                              NULL, NULL);
+
+      if (enumerator) {
+        GFile *child;
+        GFileInfo *child_info;
+
+        child_info = g_file_enumerator_next_file (enumerator, NULL, NULL);
+        while (child_info != NULL) {
+          child = g_file_get_child (file, g_file_info_get_name (child_info));
+
+          g_queue_push_tail (files, child);
+          g_queue_push_tail (file_infos, child_info);
+
+          child_info = g_file_enumerator_next_file (enumerator, NULL, NULL);
+        }
+
+        g_object_unref (enumerator);
+      }
+    }
+  }
+
+  g_queue_free_full (files, g_object_unref);
+  g_queue_free_full (file_infos, g_object_unref);
+}
+
+static void
+output_file_scanned (GFile *scanned_file,
+                     GFileInfo *scanned_file_info,
+                     gpointer user_data)
+{
+  ExtractTest *extract_test = user_data;
+  char *relative_path;
+
+  relative_path = scanned_file == extract_test->out ?
+                                  g_strdup ("") :
+                                  g_file_get_relative_path (extract_test->out,
+                                                            scanned_file);
+
+  g_hash_table_insert (extract_test->unmatched_files, relative_path,
+                       g_object_ref (scanned_file_info));
+}
+
+static void
+reference_file_scanned (GFile *scanned_file,
+                        GFileInfo *scanned_file_info,
+                        gpointer user_data)
+{
+  ExtractTest *extract_test = user_data;
+  char *relative_path;
+  GFileInfo *corresponding_file_info;
+
+  relative_path = scanned_file == extract_test->ref ?
+                                  g_strdup ("") :
+                                  g_file_get_relative_path (extract_test->ref,
+                                                            scanned_file);
+
+  corresponding_file_info = g_hash_table_lookup (extract_test->unmatched_files,
+                                                 relative_path);
+
+  g_assert_nonnull (corresponding_file_info);
+  if (corresponding_file_info != NULL) {
+    g_assert_cmpuint (g_file_info_get_file_type (scanned_file_info),
+                      ==,
+                      g_file_info_get_file_type (corresponding_file_info));
+
+    g_hash_table_remove (extract_test->unmatched_files, relative_path);
+  }
+}
+
+/* Asserts that the output and reference directory match */
+static void
+assert_ref_and_output_match (ExtractTest *extract_test)
+{
+  scan_directory (extract_test->out, output_file_scanned, extract_test);
+  scan_directory (extract_test->ref, reference_file_scanned, extract_test);
+  g_assert_cmpuint (g_hash_table_size (extract_test->unmatched_files), ==, 0);
+}
+
+static void
+test_one_file_same_name (void)
+{
+  /* arextract.zip
+   * └── arextract.txt
+   * 
+   * 0 directories, 1 file
+   * 
+   * 
+   * ref
+   * └── arextract.txt
+   * 
+   * 0 directories, 1 file
+   */
+
+  ExtractTest *extract_test;
+  ExtractTestData *data;
+  GFile *archive;
+  AutoarExtract *arextract;
+
+  extract_test = extract_test_new ("test-one-file-same-name");
+
+  if (!extract_test) {
+    g_assert_nonnull (extract_test);
+    return;
+  }
+
+  archive = g_file_get_child (extract_test->in, "arextract.zip");
+
+  arextract = autoar_extract_new_file (archive, extract_test->out, arpref);
+
+  data = extract_test_data_new_for_extract (arextract);
+
+  autoar_extract_start (arextract, data->cancellable);
+
+  g_assert_cmpuint (data->number_of_files, ==, 1);
+  g_assert_no_error (data->error);
+  assert_ref_and_output_match (extract_test);
+
+  extract_test_free (extract_test);
+  extract_test_data_free (data);
+  g_object_unref (archive);
+  g_object_unref (arextract);
+}
+
+static void
+test_one_file_different_name (void)
+{
+  /* arextract.zip
+   * └── arextractdifferent.txt
+   * 
+   * 0 directories, 1 file
+   * 
+   * 
+   * ref
+   * └── arextract
+   *     └── arextractdifferent.txt
+   * 
+   * 1 directory, 1 file
+   */
+
+  ExtractTest *extract_test;
+  ExtractTestData *data;
+  GFile *archive;
+  AutoarExtract *arextract;
+
+  extract_test = extract_test_new ("test-one-file-different-name");
+
+  if (!extract_test) {
+    g_assert_nonnull (extract_test);
+    return;
+  }
+
+  archive = g_file_get_child (extract_test->in, "arextract.zip");
+
+  arextract = autoar_extract_new_file (archive, extract_test->out, arpref);
+
+  data = extract_test_data_new_for_extract (arextract);
+
+  autoar_extract_start (arextract, data->cancellable);
+
+  g_assert_cmpuint (data->number_of_files, ==, 1);
+  g_assert_no_error (data->error);
+  assert_ref_and_output_match (extract_test);
+
+  extract_test_free (extract_test);
+  extract_test_data_free (data);
+  g_object_unref (archive);
+  g_object_unref (arextract);
+}
+
+static void
+test_multiple_files_same_name (void)
+{
+  /* arextract.zip
+   * └── arextract
+   *     ├── arextract_nested
+   *     │   └── arextract.txt
+   *     └── arextract.txt
+   * 
+   * 2 directories, 2 files
+   * 
+   * 
+   * ref
+   * └── arextract
+   *     ├── arextract_nested
+   *     │   └── arextract.txt
+   *     └── arextract.txt
+   * 
+   * 2 directories, 2 files
+   */
+
+  ExtractTest *extract_test;
+  ExtractTestData *data;
+  GFile *archive;
+  AutoarExtract *arextract;
+
+  extract_test = extract_test_new ("test-multiple-files-same-name");
+
+  if (!extract_test) {
+    g_assert_nonnull (extract_test);
+    return;
+  }
+
+  archive = g_file_get_child (extract_test->in, "arextract.zip");
+
+  arextract = autoar_extract_new_file (archive, extract_test->out, arpref);
+
+  data = extract_test_data_new_for_extract (arextract);
+
+  autoar_extract_start (arextract, data->cancellable);
+
+  g_assert_cmpuint (data->number_of_files, ==, 4);
+  g_assert_no_error (data->error);
+  assert_ref_and_output_match (extract_test);
+
+  extract_test_free (extract_test);
+  extract_test_data_free (data);
+  g_object_unref (archive);
+  g_object_unref (arextract);
+
+}
+
+static void
+test_multiple_files_different_name (void)
+{
+  /* arextract.zip
+   * ├── arextract
+   * │   ├── arextract_nested
+   * │   │   └── arextract.txt
+   * │   └── arextract.txt
+   * └── arextract.txt
+   * 
+   * 2 directories, 3 files
+   * 
+   * 
+   * ref
+   * └── arextract
+   *     ├── arextract
+   *     │   ├── arextract_nested
+   *     │   │   └── arextract.txt
+   *     │   └── arextract.txt
+   *     └── arextract.txt
+   * 
+   * 3 directories, 3 files
+   */
+
+  ExtractTest *extract_test;
+  ExtractTestData *data;
+  GFile *archive;
+  AutoarExtract *arextract;
+
+  extract_test = extract_test_new ("test-multiple-files-different-name");
+
+  if (!extract_test) {
+    g_assert_nonnull (extract_test);
+    return;
+  }
+
+  archive = g_file_get_child (extract_test->in, "arextract.zip");
+
+  arextract = autoar_extract_new_file (archive, extract_test->out, arpref);
+
+  data = extract_test_data_new_for_extract (arextract);
+
+  autoar_extract_start (arextract, data->cancellable);
+
+  g_assert_cmpuint (data->number_of_files, ==, 5);
+  g_assert_no_error (data->error);
+  assert_ref_and_output_match (extract_test);
+
+  extract_test_free (extract_test);
+  extract_test_data_free (data);
+  g_object_unref (archive);
+  g_object_unref (arextract);
+
+}
+
+static void
+setup_test_suite (void)
+{
+  g_test_add_func ("/autoar-extract/test-one-file-same-name",
+                   test_one_file_same_name);
+  g_test_add_func ("/autoar-extract/test-one-file-different-name",
+                   test_one_file_different_name);
+  g_test_add_func ("/autoar-extract/test-multiple-files-same-name",
+                   test_multiple_files_same_name);
+  g_test_add_func ("/autoar-extract/test-multiple-files-different-name",
+                   test_multiple_files_different_name);
+}
+
+int
+main (int argc,
+      char *argv[])
+{
+  GSettings *settings;
+
+  if (!setup_extract_tests_dir (argv[0])) {
+    return -1;
+  }
+
+  settings = g_settings_new (AUTOAR_PREF_DEFAULT_GSCHEMA_ID);
+  arpref = autoar_pref_new_with_gsettings (settings);
+  autoar_pref_set_delete_if_succeed (arpref, FALSE);
+
+  g_test_init (&argc, &argv, NULL);
+  g_test_set_nonfatal_assertions ();
+
+  setup_test_suite ();
+
+  g_test_run ();
+
+  g_object_unref (settings);
+  g_object_unref (arpref);
+  g_object_unref (extract_tests_dir);
+
+  return 0;
+}


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