[tepl] Metadata unit tests: add more tests



commit 9f3dcaedc36d89ef38a0041f7d5ff91c72550ca4
Author: Sébastien Wilmet <swilmet gnome org>
Date:   Sun May 10 23:41:45 2020 +0200

    Metadata unit tests: add more tests

 testsuite/meson.build                              |   1 +
 .../expected-to-fail-00-empty.xml                  |   0
 .../expected-to-fail-01.xml                        |   2 +
 .../expected-to-fail-02.xml                        |   4 +
 .../expected-to-fail-03.xml                        |   5 +
 .../expected-to-fail-04.xml                        |   5 +
 .../expected-to-fail-05.xml                        |   5 +
 .../expected-to-fail-06.xml                        |   5 +
 .../expected-to-fail-07-garbage.xml                |   1 +
 testsuite/test-metadata-manager.c                  | 231 +++++++++++++++++++++
 testsuite/test-metadata.c                          |  41 ++++
 11 files changed, 300 insertions(+)
---
diff --git a/testsuite/meson.build b/testsuite/meson.build
index 0af9829..f61f744 100644
--- a/testsuite/meson.build
+++ b/testsuite/meson.build
@@ -9,6 +9,7 @@ unit_tests = [
   'test-fold-region',
   'test-info-bar',
   'test-metadata',
+  'test-metadata-manager',
   'test-notebook',
   'test-utils'
 ]
diff --git a/testsuite/test-metadata-manager-data/expected-to-fail-00-empty.xml 
b/testsuite/test-metadata-manager-data/expected-to-fail-00-empty.xml
new file mode 100644
index 0000000..e69de29
diff --git a/testsuite/test-metadata-manager-data/expected-to-fail-01.xml 
b/testsuite/test-metadata-manager-data/expected-to-fail-01.xml
new file mode 100644
index 0000000..da0fe3b
--- /dev/null
+++ b/testsuite/test-metadata-manager-data/expected-to-fail-01.xml
@@ -0,0 +1,2 @@
+<thats_not_a_metadata_element>
+</thats_not_a_metadata_element>
diff --git a/testsuite/test-metadata-manager-data/expected-to-fail-02.xml 
b/testsuite/test-metadata-manager-data/expected-to-fail-02.xml
new file mode 100644
index 0000000..24cc661
--- /dev/null
+++ b/testsuite/test-metadata-manager-data/expected-to-fail-02.xml
@@ -0,0 +1,4 @@
+<metadata>
+  <thats_not_a_document_element>
+  </thats_not_a_document_element>
+</metadata>
diff --git a/testsuite/test-metadata-manager-data/expected-to-fail-03.xml 
b/testsuite/test-metadata-manager-data/expected-to-fail-03.xml
new file mode 100644
index 0000000..4a272c6
--- /dev/null
+++ b/testsuite/test-metadata-manager-data/expected-to-fail-03.xml
@@ -0,0 +1,5 @@
+<metadata>
+  <document uri="file:///home/seb/test-semicolon.csv" atime="hey-not-valid-here">
+    <entry key="gcsvedit-delimiter" value=";" />
+  </document>
+</metadata>
diff --git a/testsuite/test-metadata-manager-data/expected-to-fail-04.xml 
b/testsuite/test-metadata-manager-data/expected-to-fail-04.xml
new file mode 100644
index 0000000..5e61437
--- /dev/null
+++ b/testsuite/test-metadata-manager-data/expected-to-fail-04.xml
@@ -0,0 +1,5 @@
+<metadata>
+  <document uri="file:///look/atime/will/be/missing.csv">
+    <entry key="gcsvedit-delimiter" value=";" />
+  </document>
+</metadata>
diff --git a/testsuite/test-metadata-manager-data/expected-to-fail-05.xml 
b/testsuite/test-metadata-manager-data/expected-to-fail-05.xml
new file mode 100644
index 0000000..998ac91
--- /dev/null
+++ b/testsuite/test-metadata-manager-data/expected-to-fail-05.xml
@@ -0,0 +1,5 @@
+<metadata>
+  <document uri="file:///home/seb/test-semicolon.csv" atime="1585677677045">
+    <this_is_not_an_entry_element key="gcsvedit-delimiter" value=";" />
+  </document>
+</metadata>
diff --git a/testsuite/test-metadata-manager-data/expected-to-fail-06.xml 
b/testsuite/test-metadata-manager-data/expected-to-fail-06.xml
new file mode 100644
index 0000000..1e7e5e9
--- /dev/null
+++ b/testsuite/test-metadata-manager-data/expected-to-fail-06.xml
@@ -0,0 +1,5 @@
+<metadata>
+  <document uri="file:///home/seb/test-semicolon.csv" atime="1585677677045">
+    <entry key="ho_nooooo_value_attribute" />
+  </document>
+</metadata>
diff --git a/testsuite/test-metadata-manager-data/expected-to-fail-07-garbage.xml 
b/testsuite/test-metadata-manager-data/expected-to-fail-07-garbage.xml
new file mode 100644
index 0000000..183e970
--- /dev/null
+++ b/testsuite/test-metadata-manager-data/expected-to-fail-07-garbage.xml
@@ -0,0 +1 @@
+&#!+]$/%!!
diff --git a/testsuite/test-metadata-manager.c b/testsuite/test-metadata-manager.c
new file mode 100644
index 0000000..90de5e4
--- /dev/null
+++ b/testsuite/test-metadata-manager.c
@@ -0,0 +1,231 @@
+/* SPDX-FileCopyrightText: 2020 - Sébastien Wilmet <swilmet gnome org>
+ * SPDX-License-Identifier: LGPL-3.0-or-later
+ */
+
+#include <tepl/tepl.h>
+
+static void
+check_get (TeplMetadata *metadata,
+          const gchar  *key,
+          const gchar  *expected_value)
+{
+       gchar *received_value;
+
+       received_value = tepl_metadata_get (metadata, key);
+       g_assert_cmpstr (expected_value, ==, received_value);
+       g_free (received_value);
+}
+
+static void
+test_merge_into_and_copy_from_part1 (void)
+{
+       TeplMetadataManager *manager;
+       TeplMetadata *metadata;
+       GFile *location;
+
+       manager = tepl_metadata_manager_get_singleton ();
+       metadata = tepl_metadata_new ();
+       location = g_file_new_for_path ("location");
+
+       tepl_metadata_manager_copy_from (manager, location, metadata);
+       tepl_metadata_manager_merge_into (manager, location, metadata);
+
+       tepl_metadata_set (metadata, "key", "valueA");
+       tepl_metadata_manager_copy_from (manager, location, metadata);
+       check_get (metadata, "key", "valueA"); // the value has been kept even though it is not in @manager.
+       tepl_metadata_manager_merge_into (manager, location, metadata);
+       check_get (metadata, "key", "valueA");
+
+       g_object_unref (metadata);
+       metadata = tepl_metadata_new ();
+       tepl_metadata_manager_copy_from (manager, location, metadata);
+       check_get (metadata, "key", "valueA");
+
+       tepl_metadata_set (metadata, "key", "valueB");
+       check_get (metadata, "key", "valueB");
+       tepl_metadata_manager_copy_from (manager, location, metadata);
+       check_get (metadata, "key", "valueA"); // the value has been overwritten.
+
+       g_object_unref (metadata);
+       g_object_unref (location);
+       _tepl_metadata_manager_unref_singleton ();
+}
+
+static void
+test_merge_into_and_copy_from_part2 (void)
+{
+       TeplMetadataManager *manager;
+       TeplMetadata *metadata;
+       GFile *location;
+
+       manager = tepl_metadata_manager_get_singleton ();
+       location = g_file_new_for_path ("location");
+
+       metadata = tepl_metadata_new ();
+       tepl_metadata_set (metadata, "keyA", "valueA");
+       tepl_metadata_manager_merge_into (manager, location, metadata);
+       g_object_unref (metadata);
+
+       metadata = tepl_metadata_new ();
+       tepl_metadata_set (metadata, "keyB", "valueB");
+       tepl_metadata_manager_merge_into (manager, location, metadata); // keyA is kept in @manager.
+       g_object_unref (metadata);
+
+       metadata = tepl_metadata_new ();
+       tepl_metadata_manager_copy_from (manager, location, metadata);
+       check_get (metadata, "keyA", "valueA");
+       check_get (metadata, "keyB", "valueB");
+
+       g_object_unref (metadata);
+       g_object_unref (location);
+       _tepl_metadata_manager_unref_singleton ();
+}
+
+/* Store metadata into the TeplMetadataManager for several locations. */
+static void
+test_merge_into_and_copy_from_part3 (void)
+{
+       TeplMetadataManager *manager;
+       TeplMetadata *metadataA;
+       TeplMetadata *metadataB;
+       GFile *locationA;
+       GFile *locationB;
+
+       manager = tepl_metadata_manager_get_singleton ();
+       locationA = g_file_new_for_path ("locationA");
+       locationB = g_file_new_for_path ("locationB");
+
+       metadataA = tepl_metadata_new ();
+       tepl_metadata_set (metadataA, "key", "valueA");
+       tepl_metadata_manager_merge_into (manager, locationA, metadataA);
+       g_object_unref (metadataA);
+
+       metadataB = tepl_metadata_new ();
+       tepl_metadata_set (metadataB, "key", "valueB");
+       tepl_metadata_manager_merge_into (manager, locationB, metadataB);
+       g_object_unref (metadataB);
+
+       metadataA = tepl_metadata_new ();
+       tepl_metadata_manager_copy_from (manager, locationA, metadataA);
+       check_get (metadataA, "key", "valueA");
+       g_object_unref (metadataA);
+
+       metadataB = tepl_metadata_new ();
+       tepl_metadata_manager_copy_from (manager, locationB, metadataB);
+       check_get (metadataB, "key", "valueB");
+       g_object_unref (metadataB);
+
+       g_object_unref (locationA);
+       g_object_unref (locationB);
+       _tepl_metadata_manager_unref_singleton ();
+}
+
+static void
+check_load_from_disk_expected_to_fail (const gchar *filename)
+{
+       TeplMetadataManager *manager;
+       GFile *file;
+       GError *error = NULL;
+
+       manager = tepl_metadata_manager_get_singleton ();
+
+       file = g_file_new_build_filename (UNIT_TESTS_SOURCE_DIR,
+                                         "test-metadata-manager-data",
+                                         filename,
+                                         NULL);
+
+       tepl_metadata_manager_load_from_disk (manager, file, &error);
+       g_assert_true (error != NULL);
+       g_error_free (error);
+
+       g_object_unref (file);
+       _tepl_metadata_manager_unref_singleton ();
+}
+
+static void
+test_load_from_disk_expected_to_fail (void)
+{
+       check_load_from_disk_expected_to_fail ("expected-to-fail-00-empty.xml");
+       check_load_from_disk_expected_to_fail ("expected-to-fail-01.xml");
+       check_load_from_disk_expected_to_fail ("expected-to-fail-02.xml");
+       check_load_from_disk_expected_to_fail ("expected-to-fail-03.xml");
+       check_load_from_disk_expected_to_fail ("expected-to-fail-04.xml");
+       check_load_from_disk_expected_to_fail ("expected-to-fail-05.xml");
+       check_load_from_disk_expected_to_fail ("expected-to-fail-06.xml");
+       check_load_from_disk_expected_to_fail ("expected-to-fail-07-garbage.xml");
+}
+
+static void
+check_value_round_trip (const gchar *value)
+{
+       TeplMetadataManager *manager;
+       GFile *location;
+       GFile *store_file;
+       TeplMetadata *metadata;
+       GError *error = NULL;
+
+       manager = tepl_metadata_manager_get_singleton ();
+       location = g_file_new_for_path ("location");
+
+       /* Set value */
+       metadata = tepl_metadata_new ();
+       tepl_metadata_set (metadata, "key", value);
+       tepl_metadata_manager_merge_into (manager, location, metadata);
+       g_object_unref (metadata);
+
+       /* Save to disk */
+       store_file = g_file_new_build_filename (g_get_tmp_dir (), "tepl-test-metadata-manager.xml", NULL);
+       g_file_delete (store_file, NULL, &error);
+       if (g_error_matches (error, G_IO_ERROR, G_IO_ERROR_NOT_FOUND))
+       {
+               g_clear_error (&error);
+       }
+       g_assert_no_error (error);
+
+       tepl_metadata_manager_save_to_disk (manager, store_file, TRUE, &error);
+       g_assert_no_error (error);
+       _tepl_metadata_manager_unref_singleton ();
+
+       /* Load from disk */
+       manager = tepl_metadata_manager_get_singleton ();
+       tepl_metadata_manager_load_from_disk (manager, store_file, &error);
+       g_assert_no_error (error);
+
+       /* Read value after round-trip */
+       metadata = tepl_metadata_new ();
+       tepl_metadata_manager_copy_from (manager, location, metadata);
+       check_get (metadata, "key", value);
+       g_object_unref (metadata);
+
+       g_object_unref (location);
+       g_object_unref (store_file);
+       _tepl_metadata_manager_unref_singleton ();
+}
+
+static void
+test_value_round_trip (void)
+{
+       check_value_round_trip ("");
+       check_value_round_trip ("a");
+       check_value_round_trip ("1");
+       check_value_round_trip ("Évo-UTF-8");
+       check_value_round_trip (",");
+       check_value_round_trip (";");
+       check_value_round_trip (" ");
+       //check_value_round_trip ("\t"); // FIXME: fails.
+}
+
+int
+main (int    argc,
+      char **argv)
+{
+       g_test_init (&argc, &argv, NULL);
+
+       g_test_add_func ("/metadata_manager/merge_into_and_copy_from_part1", 
test_merge_into_and_copy_from_part1);
+       g_test_add_func ("/metadata_manager/merge_into_and_copy_from_part2", 
test_merge_into_and_copy_from_part2);
+       g_test_add_func ("/metadata_manager/merge_into_and_copy_from_part3", 
test_merge_into_and_copy_from_part3);
+       g_test_add_func ("/metadata_manager/load_from_disk_expected_to_fail", 
test_load_from_disk_expected_to_fail);
+       g_test_add_func ("/metadata_manager/value_round_trip", test_value_round_trip);
+
+       return g_test_run ();
+}
diff --git a/testsuite/test-metadata.c b/testsuite/test-metadata.c
index d94f075..fb874c9 100644
--- a/testsuite/test-metadata.c
+++ b/testsuite/test-metadata.c
@@ -27,6 +27,46 @@ test_key_is_valid (void)
        g_assert_true (!_tepl_metadata_key_is_valid ("\xFF"));
 }
 
+static void
+check_get (TeplMetadata *metadata,
+          const gchar  *key,
+          const gchar  *expected_value)
+{
+       gchar *received_value;
+
+       received_value = tepl_metadata_get (metadata, key);
+       g_assert_cmpstr (expected_value, ==, received_value);
+       g_free (received_value);
+}
+
+static void
+test_get_set (void)
+{
+       TeplMetadata *metadata;
+
+       metadata = tepl_metadata_new ();
+       check_get (metadata, "keyA", NULL);
+
+       tepl_metadata_set (metadata, "keyA", "valueA1");
+       check_get (metadata, "keyA", "valueA1");
+
+       tepl_metadata_set (metadata, "keyB", "valueB");
+       check_get (metadata, "keyA", "valueA1");
+       check_get (metadata, "keyB", "valueB");
+       check_get (metadata, "keyC", NULL);
+
+       tepl_metadata_set (metadata, "keyA", "valueA2");
+       check_get (metadata, "keyA", "valueA2");
+       check_get (metadata, "keyB", "valueB");
+
+       tepl_metadata_set (metadata, "keyB", NULL);
+       check_get (metadata, "keyA", "valueA2");
+       check_get (metadata, "keyB", NULL);
+       check_get (metadata, "keyC", NULL);
+
+       g_object_unref (metadata);
+}
+
 int
 main (int    argc,
       char **argv)
@@ -34,6 +74,7 @@ main (int    argc,
        g_test_init (&argc, &argv, NULL);
 
        g_test_add_func ("/metadata/key_is_valid", test_key_is_valid);
+       g_test_add_func ("/metadata/get_set", test_get_set);
 
        return g_test_run ();
 }


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