[evolution] Add TestKeyfileSettingsBackend for test-html-editor-units
- From: Milan Crha <mcrha src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [evolution] Add TestKeyfileSettingsBackend for test-html-editor-units
- Date: Thu, 11 Aug 2016 16:43:58 +0000 (UTC)
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]