[tepl] FileMetadata unit tests: simulate several apps with same GFile opened
- From: Sébastien Wilmet <swilmet src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [tepl] FileMetadata unit tests: simulate several apps with same GFile opened
- Date: Sat, 18 Apr 2020 17:16:09 +0000 (UTC)
commit 5f518d10e2a708310a427ada557170a4cad514e2
Author: Sébastien Wilmet <swilmet gnome org>
Date: Wed Apr 8 23:09:57 2020 +0200
FileMetadata unit tests: simulate several apps with same GFile opened
This unit test currently fails. I will fix the problem in
TeplFileMetadata to save only *modified* metadata, not all the metadata
that were loaded.
testsuite/test-file-metadata.c | 92 ++++++++++++++++++++++++++++++++++++++++++
1 file changed, 92 insertions(+)
---
diff --git a/testsuite/test-file-metadata.c b/testsuite/test-file-metadata.c
index 98b057a..1f504f7 100644
--- a/testsuite/test-file-metadata.c
+++ b/testsuite/test-file-metadata.c
@@ -387,6 +387,97 @@ test_for_remote_file_failure (void)
g_test_trap_assert_failed ();
}
+/* Simulate several apps writing both metadata for the same GFile.
+ * Or the same GFile being opened several times in the same app.
+ * App1: load() -> set() -> save()
+ * App2: load() -> set() -> ... save().
+ * [-----------------------------------------> time
+ * The save() done by App2 must not erase the metadata set by App1 if the
+ * metadata keys are different.
+ * S(t)imulating!
+ */
+static void
+test_simulate_several_apps (void)
+{
+ TeplFileMetadata *metadata1;
+ TeplFileMetadata *metadata2;
+ gchar *path;
+ GFile *location;
+ gchar *value;
+ GError *error = NULL;
+ gboolean ok;
+
+ metadata1 = tepl_file_metadata_new ();
+ metadata2 = tepl_file_metadata_new ();
+
+ path = g_build_filename (g_get_tmp_dir (), "tepl-file-metadata-stimulating-test", NULL);
+ location = g_file_new_for_path (path);
+ g_file_set_contents (path, "blum", -1, &error);
+ g_assert_no_error (error);
+
+ /* Set and save an initial metadata from App1. */
+
+ tepl_file_metadata_set (metadata1, "app1-key", "app1-value1");
+ ok = save_sync (metadata1, location, &error);
+ g_assert_no_error (error);
+ g_assert_true (ok); // OK indeed, so far so good.
+
+ /* Load (for App1 it's not needed). */
+
+ ok = load_sync (metadata2, location, &error);
+ g_assert_no_error (error);
+ g_assert_true (ok);
+
+ value = tepl_file_metadata_get (metadata2, "app1-key");
+ g_assert_cmpstr (value, ==, "app1-value1");
+ g_free (value);
+
+ /* Now set/change values */
+
+ tepl_file_metadata_set (metadata1, "app1-key", "app1-value2");
+ tepl_file_metadata_set (metadata2, "app2-key", "app2-value");
+
+ /* And save */
+
+ ok = save_sync (metadata1, location, &error);
+ g_assert_no_error (error);
+ g_assert_true (ok);
+
+ ok = save_sync (metadata2, location, &error);
+ g_assert_no_error (error);
+ g_assert_true (ok);
+
+ g_object_unref (metadata1);
+ g_object_unref (metadata2);
+
+ /* Now what's the value of "app1-key"? */
+
+ metadata1 = tepl_file_metadata_new ();
+ ok = load_sync (metadata1, location, &error);
+ g_assert_no_error (error);
+ g_assert_true (ok);
+
+ value = tepl_file_metadata_get (metadata1, "app1-key");
+ // It must be "app1-value2", because App2 didn't set the "app1-key".
+ g_assert_cmpstr (value, ==, "app1-value2");
+ g_free (value);
+
+ /* Clean-up */
+
+ tepl_file_metadata_set (metadata1, "app1-key", NULL);
+ tepl_file_metadata_set (metadata1, "app2-key", NULL);
+ ok = save_sync (metadata1, location, &error);
+ g_assert_no_error (error);
+ g_assert_true (ok);
+
+ g_file_delete (location, NULL, &error);
+ g_assert_no_error (error);
+
+ g_object_unref (metadata1);
+ g_free (path);
+ g_object_unref (location);
+}
+
int
main (int argc,
char **argv)
@@ -402,6 +493,7 @@ main (int argc,
g_test_add_func ("/file_metadata/arbitrary_keys_and_values_failure_04",
test_arbitrary_keys_and_values_failure_04);
g_test_add_func ("/file_metadata/for_remote_file_success", test_for_remote_file_success);
g_test_add_func ("/file_metadata/for_remote_file_failure", test_for_remote_file_failure);
+ g_test_add_func ("/file_metadata/simulate_several_apps", test_simulate_several_apps);
return g_test_run ();
}
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]