[evolution] Add TestKeyfileSettingsBackend for test-html-editor-units



commit b0d2d84af88e152f1f060b4dd4df450ed461a01e
Author: Milan Crha <mcrha redhat com>
Date:   Thu Aug 11 18:43:55 2016 +0200

    Add TestKeyfileSettingsBackend for test-html-editor-units
    
    It used a 'memory' GSettings backend, but this one is not shared
    between processes, thus the UI process settings changes were not
    propagated into the WebProcess and vice versa, which could break
    tests easily (notably the /emoticon tests, which expect magic-
    smileys being set, but the default is unset). This test keyfile
    settings backend shared settings through a temporary file between
    the processes, as expected.

 doc/reference/evolution-util/Makefile.am |    1 +
 e-util/Makefile.am                       |   26 +++
 e-util/test-html-editor-units.c          |   29 +++-
 e-util/test-keyfile-settings-backend.c   |  292 ++++++++++++++++++++++++++++++
 e-util/test-keyfile-settings-backend.h   |   38 ++++
 5 files changed, 382 insertions(+), 4 deletions(-)
---
diff --git a/doc/reference/evolution-util/Makefile.am b/doc/reference/evolution-util/Makefile.am
index e39e404..372299a 100644
--- a/doc/reference/evolution-util/Makefile.am
+++ b/doc/reference/evolution-util/Makefile.am
@@ -49,6 +49,7 @@ IGNORE_HFILES = \
        gal-a11y-factory.h \
        gal-a11y-util.h \
        test-html-editor-units-utils.h \
+       test-keyfile-settings-backend.h \
        $(NULL)
 
 GITIGNOREFILES = \
diff --git a/e-util/Makefile.am b/e-util/Makefile.am
index 4c9db7b..4ce6a1a 100644
--- a/e-util/Makefile.am
+++ b/e-util/Makefile.am
@@ -73,6 +73,31 @@ noinst_PROGRAMS = \
        test-tree-view-frame \
        $(NULL)
 
+privbuilddir = $(abs_builddir)
+privbuild_LTLIBRARIES = libevolutiontestsettings.la
+
+GITIGNOREFILES = libevolutiontestsettings.so
+
+libevolutiontestsettings_la_SOURCES = \
+       test-keyfile-settings-backend.h \
+       test-keyfile-settings-backend.c \
+       $(PLATFORM_SOURCES) \
+       $(NULL)
+
+libevolutiontestsettings_la_CPPFLAGS = \
+       $(AM_CPPFLAGS) \
+       -I$(top_srcdir) \
+       -I$(top_builddir) \
+       -DG_LOG_DOMAIN=\"evolution-test-settings\" \
+       $(EVOLUTION_DATA_SERVER_CFLAGS) \
+       $(NULL)
+
+libevolutiontestsettings_la_LDFLAGS = -no-install -module -avoid-version $(NO_UNDEFINED) 
$(CODE_COVERAGE_LDFLAGS)
+
+libevolutiontestsettings_la_LIBADD =  \
+       $(EVOLUTION_DATA_SERVER_LIBS) \
+       $(NULL)
+
 libevolution_util_la_CPPFLAGS = \
        $(AM_CPPFLAGS) \
        -I$(top_srcdir) \
@@ -99,6 +124,7 @@ libevolution_util_la_CPPFLAGS = \
        -DEVOLUTION_UIDIR=\""$(uidir)"\" \
        -DEVOLUTION_RULEDIR=\"$(ruledir)\" \
        -DEVOLUTION_WEB_EXTENSIONS_DIR=\""$(webextensionsdir)"\" \
+       -DABS_BUILDDIR=\"$(abs_builddir)\" \
        -DG_LOG_DOMAIN=\"evolution-util\" \
        $(EVOLUTION_DATA_SERVER_CFLAGS) \
        $(GNOME_PLATFORM_CFLAGS) \
diff --git a/e-util/test-html-editor-units.c b/e-util/test-html-editor-units.c
index c72a9a2..372e1c6 100644
--- a/e-util/test-html-editor-units.c
+++ b/e-util/test-html-editor-units.c
@@ -18,11 +18,15 @@
 #include <config.h>
 #endif
 
+#include <glib.h>
+#include <glib/gstdio.h>
+
 #include <locale.h>
 #include <e-util/e-util.h>
 
 #include "e-html-editor-private.h"
 #include "test-html-editor-units-utils.h"
+#include "test-keyfile-settings-backend.h"
 
 #define HTML_PREFIX "<html><head></head><body>"
 #define HTML_PREFIX_PLAIN "<html><head></head><body style=\"font-family: Monospace;\">"
@@ -935,6 +939,9 @@ test_h_rule_insert_text_after (TestFixture *fixture)
 static void
 test_emoticon_insert_typed (TestFixture *fixture)
 {
+       test_utils_fixture_change_setting_boolean (fixture, "org.gnome.evolution.mail", 
"composer-magic-smileys", TRUE);
+       test_utils_fixture_change_setting_boolean (fixture, "org.gnome.evolution.mail", 
"composer-unicode-smileys", FALSE);
+
        if (!test_utils_run_simple_test (fixture,
                "mode:html\n"
                "type:before :)after\n",
@@ -970,6 +977,9 @@ test_emoticon_insert_typed (TestFixture *fixture)
 static void
 test_emoticon_insert_typed_dash (TestFixture *fixture)
 {
+       test_utils_fixture_change_setting_boolean (fixture, "org.gnome.evolution.mail", 
"composer-magic-smileys", TRUE);
+       test_utils_fixture_change_setting_boolean (fixture, "org.gnome.evolution.mail", 
"composer-unicode-smileys", FALSE);
+
        if (!test_utils_run_simple_test (fixture,
                "mode:html\n"
                "type:before :-)after\n",
@@ -2664,6 +2674,7 @@ gint
 main (gint argc,
       gchar *argv[])
 {
+       gchar *test_keyfile_filename;
        gint cmd_delay = -1;
        GOptionEntry entries[] = {
                { "cmd-delay", '\0', 0,
@@ -2679,10 +2690,17 @@ main (gint argc,
 
        setlocale (LC_ALL, "");
 
-       /* Force the memory GSettings backend, to not overwrite user settings
-          when playing with them. It also ensures that the test will run with
-          default settings, until changed. */
-       g_setenv ("GSETTINGS_BACKEND", "memory", TRUE);
+       test_keyfile_filename = e_mktemp ("evolution-XXXXXX.settings");
+       g_return_val_if_fail (test_keyfile_filename != NULL, -1);
+
+       /* Start with clean settings file, to run with default settings. */
+       g_unlink (test_keyfile_filename);
+
+       /* Force the Evolution's test-keyfile GSettings backend, to not overwrite
+          user settings when playing with them. */
+       g_setenv ("GIO_EXTRA_MODULES", ABS_BUILDDIR, TRUE);
+       g_setenv ("GSETTINGS_BACKEND", TEST_KEYFILE_SETTINGS_BACKEND_NAME, TRUE);
+       g_setenv (TEST_KEYFILE_SETTINGS_FILENAME_ENVVAR, test_keyfile_filename, TRUE);
 
        g_test_init (&argc, &argv, NULL);
        g_test_bug_base ("http://bugzilla.gnome.org/show_bug.cgi?id=";);
@@ -2819,5 +2837,8 @@ main (gint argc,
        e_util_cleanup_settings ();
        e_spell_checker_free_global_memory ();
 
+       g_unlink (test_keyfile_filename);
+       g_free (test_keyfile_filename);
+
        return res;
 }
diff --git a/e-util/test-keyfile-settings-backend.c b/e-util/test-keyfile-settings-backend.c
new file mode 100644
index 0000000..9e28b23
--- /dev/null
+++ b/e-util/test-keyfile-settings-backend.c
@@ -0,0 +1,292 @@
+/*
+ * Copyright (C) 2016 Red Hat, Inc. (www.redhat.com)
+ *
+ * This library is free software: you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as published by
+ * the Free Software Foundation.
+ *
+ * This library is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this library. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include <stdio.h>
+#include <gio/gio.h>
+
+#define G_SETTINGS_ENABLE_BACKEND
+#include <gio/gsettingsbackend.h>
+#undef G_SETTINGS_ENABLE_BACKEND
+
+#include <libedataserver/libedataserver.h>
+
+#include "test-keyfile-settings-backend.h"
+
+#define TEST_TYPE_KEYFILE_SETTINGS_BACKEND  (test_keyfile_settings_backend_get_type())
+#define TEST_KEYFILE_SETTINGS_BACKEND(inst) (G_TYPE_CHECK_INSTANCE_CAST ((inst), \
+                                         TEST_TYPE_KEYFILE_SETTINGS_BACKEND,     \
+                                         TestKeyfileSettingsBackend))
+
+typedef GSettingsBackendClass TestKeyfileSettingsBackendClass;
+typedef struct {
+       GSettingsBackend parent_instance;
+
+       GSettingsBackend *kf_backend;
+       GHashTable *change_listeners; /* GSettings * ~> gchar *path */
+} TestKeyfileSettingsBackend;
+
+static GType test_keyfile_settings_backend_get_type (void);
+
+G_DEFINE_TYPE_WITH_CODE (TestKeyfileSettingsBackend,
+                         test_keyfile_settings_backend,
+                         G_TYPE_SETTINGS_BACKEND,
+                         g_io_extension_point_implement (G_SETTINGS_BACKEND_EXTENSION_POINT_NAME,
+                                                         g_define_type_id, 
TEST_KEYFILE_SETTINGS_BACKEND_NAME, 5))
+
+static void
+test_keyfile_settings_backend_changed_cb (GSettings *settings,
+                                         const gchar *key,
+                                         gpointer user_data)
+{
+       TestKeyfileSettingsBackend *tk_backend = user_data;
+       const gchar *path;
+       gchar *key_path;
+
+       g_return_if_fail (tk_backend != NULL);
+
+       path = g_hash_table_lookup (tk_backend->change_listeners, settings);
+       g_return_if_fail (path != NULL);
+
+       key_path = g_strconcat (path, key, NULL);
+
+       g_settings_backend_changed (G_SETTINGS_BACKEND (tk_backend), key_path, NULL);
+
+       g_free (key_path);
+}
+
+static void
+test_keyfile_settings_backend_writable_changed_cb (GSettings *settings,
+                                                  const gchar *key,
+                                                  gpointer user_data)
+{
+       TestKeyfileSettingsBackend *tk_backend = user_data;
+       const gchar *path;
+       gchar *key_path;
+
+       g_return_if_fail (tk_backend != NULL);
+
+       path = g_hash_table_lookup (tk_backend->change_listeners, settings);
+       g_return_if_fail (path != NULL);
+
+       key_path = g_strconcat (path, key, NULL);
+
+       g_settings_backend_writable_changed (G_SETTINGS_BACKEND (tk_backend), key_path);
+
+       g_free (key_path);
+}
+
+static void
+test_keyfile_settings_backend_add_change_listener (TestKeyfileSettingsBackend *tk_backend,
+                                                  const gchar *schema_id)
+{
+       GSettings *settings;
+       gchar *path;
+       gint ii;
+
+       g_return_if_fail (tk_backend != NULL);
+       g_return_if_fail (schema_id != NULL);
+
+       path = g_strconcat ("/", schema_id, "/", NULL);
+       for (ii = 0; path[ii]; ii++) {
+               if (path[ii] == '.')
+                       path[ii] = '.';
+       }
+
+       settings = g_settings_new_with_backend (schema_id, tk_backend->kf_backend);
+
+       g_hash_table_insert (tk_backend->change_listeners, settings, path);
+
+       g_signal_connect (settings, "changed", G_CALLBACK (test_keyfile_settings_backend_changed_cb), 
tk_backend);
+       g_signal_connect (settings, "writable-changed", G_CALLBACK 
(test_keyfile_settings_backend_writable_changed_cb), tk_backend);
+}
+
+static GVariant *
+test_keyfile_settings_backend_read (GSettingsBackend *backend,
+                                   const gchar *key,
+                                   const GVariantType *expected_type,
+                                   gboolean default_value)
+{
+       TestKeyfileSettingsBackend *tk_backend = TEST_KEYFILE_SETTINGS_BACKEND (backend);
+       GSettingsBackendClass *klass;
+
+       klass = G_SETTINGS_BACKEND_GET_CLASS (tk_backend->kf_backend);
+       g_return_val_if_fail (klass != NULL, NULL);
+       g_return_val_if_fail (klass->read != NULL, NULL);
+
+       return klass->read (tk_backend->kf_backend, key, expected_type, default_value);
+}
+
+static gboolean
+test_keyfile_settings_backend_get_writable (GSettingsBackend *backend,
+                                           const gchar *name)
+{
+       TestKeyfileSettingsBackend *tk_backend = TEST_KEYFILE_SETTINGS_BACKEND (backend);
+       GSettingsBackendClass *klass;
+
+       klass = G_SETTINGS_BACKEND_GET_CLASS (tk_backend->kf_backend);
+       g_return_val_if_fail (klass != NULL, FALSE);
+       g_return_val_if_fail (klass->get_writable != NULL, FALSE);
+
+       return klass->get_writable (tk_backend->kf_backend, name);
+}
+
+static gboolean
+test_keyfile_settings_backend_write (GSettingsBackend *backend,
+                                    const gchar *key,
+                                    GVariant *value,
+                                    gpointer origin_tag)
+{
+       TestKeyfileSettingsBackend *tk_backend = TEST_KEYFILE_SETTINGS_BACKEND (backend);
+       GSettingsBackendClass *klass;
+       gboolean success;
+
+       klass = G_SETTINGS_BACKEND_GET_CLASS (tk_backend->kf_backend);
+       g_return_val_if_fail (klass != NULL, FALSE);
+       g_return_val_if_fail (klass->write != NULL, FALSE);
+
+       success = klass->write (tk_backend->kf_backend, key, value, origin_tag);
+
+       g_settings_backend_changed (backend, key, origin_tag);
+
+       return success;
+}
+
+static gboolean
+test_keyfile_settings_backend_write_tree (GSettingsBackend *backend,
+                                         GTree *tree,
+                                         gpointer origin_tag)
+{
+       TestKeyfileSettingsBackend *tk_backend = TEST_KEYFILE_SETTINGS_BACKEND (backend);
+       GSettingsBackendClass *klass;
+       gboolean success;
+
+       klass = G_SETTINGS_BACKEND_GET_CLASS (tk_backend->kf_backend);
+       g_return_val_if_fail (klass != NULL, FALSE);
+       g_return_val_if_fail (klass->write_tree != NULL, FALSE);
+
+       success = klass->write_tree (tk_backend->kf_backend, tree, origin_tag);
+
+       g_settings_backend_changed_tree (backend, tree, origin_tag);
+
+       return success;
+}
+
+static void
+test_keyfile_settings_backend_reset (GSettingsBackend *backend,
+                                    const gchar *key,
+                                    gpointer origin_tag)
+{
+       TestKeyfileSettingsBackend *tk_backend = TEST_KEYFILE_SETTINGS_BACKEND (backend);
+       GSettingsBackendClass *klass;
+
+       klass = G_SETTINGS_BACKEND_GET_CLASS (tk_backend->kf_backend);
+       g_return_if_fail (klass != NULL);
+       g_return_if_fail (klass->reset != NULL);
+
+       klass->reset (tk_backend->kf_backend, key, origin_tag);
+
+       g_settings_backend_changed (backend, key, origin_tag);
+}
+
+static GPermission *
+test_keyfile_settings_backend_get_permission (GSettingsBackend *backend,
+                                             const gchar *path)
+{
+       TestKeyfileSettingsBackend *tk_backend = TEST_KEYFILE_SETTINGS_BACKEND (backend);
+       GSettingsBackendClass *klass;
+
+       klass = G_SETTINGS_BACKEND_GET_CLASS (tk_backend->kf_backend);
+       g_return_val_if_fail (klass != NULL, NULL);
+       g_return_val_if_fail (klass->get_permission != NULL, NULL);
+
+       return klass->get_permission (tk_backend->kf_backend, path);
+}
+
+static void
+test_keyfile_settings_backend_finalize (GObject *object)
+{
+       TestKeyfileSettingsBackend *tk_backend = TEST_KEYFILE_SETTINGS_BACKEND (object);
+
+       g_clear_object (&tk_backend->kf_backend);
+
+       if (tk_backend->change_listeners) {
+               g_hash_table_destroy (tk_backend->change_listeners);
+               tk_backend->change_listeners = NULL;
+       }
+
+       G_OBJECT_CLASS (test_keyfile_settings_backend_parent_class)->finalize (object);
+}
+
+static void
+test_keyfile_settings_backend_init (TestKeyfileSettingsBackend *tk_backend)
+{
+       gchar **non_relocatable_schemas = NULL, **relocatable_schemas = NULL;
+       gint ii;
+
+       tk_backend->kf_backend = g_keyfile_settings_backend_new (g_getenv 
(TEST_KEYFILE_SETTINGS_FILENAME_ENVVAR), "/", "root");
+       tk_backend->change_listeners = g_hash_table_new_full (g_direct_hash, g_direct_equal, g_object_unref, 
g_free);
+
+       g_settings_schema_source_list_schemas (g_settings_schema_source_get_default (), TRUE, 
&non_relocatable_schemas, &relocatable_schemas);
+
+       for (ii = 0; non_relocatable_schemas && non_relocatable_schemas[ii]; ii++) {
+               if (e_util_strstrcase (non_relocatable_schemas[ii], "evolution")) {
+                       test_keyfile_settings_backend_add_change_listener (tk_backend, 
non_relocatable_schemas[ii]);
+               }
+       }
+       g_strfreev (non_relocatable_schemas);
+       g_strfreev (relocatable_schemas);
+}
+
+static void
+test_keyfile_settings_backend_class_init (TestKeyfileSettingsBackendClass *class)
+{
+       GSettingsBackendClass *backend_class;
+       GObjectClass *object_class;
+
+       backend_class = G_SETTINGS_BACKEND_CLASS (class);
+       backend_class->read = test_keyfile_settings_backend_read;
+       backend_class->get_writable = test_keyfile_settings_backend_get_writable;
+       backend_class->write = test_keyfile_settings_backend_write;
+       backend_class->write_tree = test_keyfile_settings_backend_write_tree;
+       backend_class->reset = test_keyfile_settings_backend_reset;
+       backend_class->get_permission = test_keyfile_settings_backend_get_permission;
+
+       object_class = G_OBJECT_CLASS (class);
+       object_class->finalize = test_keyfile_settings_backend_finalize;
+}
+
+void
+g_io_module_load (GIOModule *module)
+{
+       g_type_module_use (G_TYPE_MODULE (module));
+       g_type_ensure (test_keyfile_settings_backend_get_type ());
+}
+
+void
+g_io_module_unload (GIOModule *module)
+{
+       g_warn_if_reached ();
+}
+
+gchar **
+g_io_module_query (void)
+{
+       return g_strsplit (G_SETTINGS_BACKEND_EXTENSION_POINT_NAME, "!", 0);
+}
diff --git a/e-util/test-keyfile-settings-backend.h b/e-util/test-keyfile-settings-backend.h
new file mode 100644
index 0000000..7a3af22
--- /dev/null
+++ b/e-util/test-keyfile-settings-backend.h
@@ -0,0 +1,38 @@
+/*
+ * Copyright (C) 2016 Red Hat, Inc. (www.redhat.com)
+ *
+ * This library is free software: you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as published by
+ * the Free Software Foundation.
+ *
+ * This library is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this library. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef TEST_KEYFILE_SETTINGS_BACKEND_H
+#define TEST_KEYFILE_SETTINGS_BACKEND_H
+
+#include <glib.h>
+#include <glib-object.h>
+#include <gio/gio.h>
+
+G_BEGIN_DECLS
+
+/* This is a private GSettingsBackend implementation,
+   meant for testing purposes only.
+
+   It requires set 'TEST_KEYFILE_SETTINGS_FILENAME' environment variable,
+   with a file name to use for the settings backend.
+*/
+
+#define TEST_KEYFILE_SETTINGS_BACKEND_NAME "evolution-test-keyfile"
+#define TEST_KEYFILE_SETTINGS_FILENAME_ENVVAR "TEST_KEYFILE_SETTINGS_FILENAME"
+
+G_END_DECLS
+
+#endif /* TEST_KEYFILE_SETTINGS_BACKEND_H */


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