From 148f731748a586ecc2d6e15afcc760a46e929a84 Mon Sep 17 00:00:00 2001 From: Ryan Lortie Date: Wed, 16 Nov 2011 10:38:04 +0000 Subject: [PATCH] Add test case and fix some bugs Add the first test case for the schema source functionality and fix a couple of bugs that got uncovered by that. --- gio/gsettings.c | 3 +- gio/gsettingsschema.c | 3 +- gio/tests/gsettings.c | 89 +++++++++++++++++++ .../org.gtk.schemasourcecheck.gschema.xml | 7 ++ 4 files changed, 100 insertions(+), 2 deletions(-) create mode 100644 gio/tests/org.gtk.schemasourcecheck.gschema.xml diff --git a/gio/gsettings.c b/gio/gsettings.c index 442412e01..0e6517e71 100644 --- a/gio/gsettings.c +++ b/gio/gsettings.c @@ -974,7 +974,8 @@ g_settings_new_full (GSettingsSchema *schema, return g_object_new (G_TYPE_SETTINGS, "settings-schema", schema, "backend", backend, - "path", path); + "path", path, + NULL); } /* Internal read/write utilities {{{1 */ diff --git a/gio/gsettingsschema.c b/gio/gsettingsschema.c index 17875e362..1ec97ecb6 100644 --- a/gio/gsettingsschema.c +++ b/gio/gsettingsschema.c @@ -86,7 +86,8 @@ g_settings_schema_source_unref (GSettingsSchemaSource *source) if (source == schema_sources) g_error ("g_settings_schema_source_unref() called too many times on the default schema source"); - g_settings_schema_source_unref (source->parent); + if (source->parent) + g_settings_schema_source_unref (source->parent); gvdb_table_unref (source->table); g_slice_free (GSettingsSchemaSource, source); diff --git a/gio/tests/gsettings.c b/gio/tests/gsettings.c index 45d1065f2..968a5ee09 100644 --- a/gio/tests/gsettings.c +++ b/gio/tests/gsettings.c @@ -1888,6 +1888,87 @@ test_get_range (void) g_object_unref (settings); } +static void +test_schema_source (void) +{ + GSettingsSchemaSource *parent; + GSettingsSchemaSource *source; + GSettingsBackend *backend; + GSettingsSchema *schema; + GError *error = NULL; + GSettings *settings; + gboolean enabled; + + backend = g_settings_backend_get_default (); + + /* make sure it fails properly */ + parent = g_settings_schema_source_get_default (); + source = g_settings_schema_source_new_from_directory (parent, "/path/that/does/not/exist", TRUE, &error); + g_assert (source == NULL); + g_clear_error (&error); + + /* create a source with the parent */ + source = g_settings_schema_source_new_from_directory (parent, "schema-source", TRUE, &error); + g_assert_no_error (error); + g_assert (source != NULL); + + /* check recursive lookups are working */ + schema = g_settings_schema_source_lookup (source, "org.gtk.test", TRUE); + g_assert (schema != NULL); + g_settings_schema_unref (schema); + + /* check recursive lookups for non-existent schemas */ + schema = g_settings_schema_source_lookup (source, "org.gtk.doesnotexist", TRUE); + g_assert (schema == NULL); + + /* check non-recursive for schema that only exists in lower layers */ + schema = g_settings_schema_source_lookup (source, "org.gtk.test", FALSE); + g_assert (schema == NULL); + + /* check non-recursive lookup for non-existent */ + schema = g_settings_schema_source_lookup (source, "org.gtk.doesnotexist", FALSE); + g_assert (schema == NULL); + + /* check non-recursive for schema that exists in toplevel */ + schema = g_settings_schema_source_lookup (source, "org.gtk.schemasourcecheck", FALSE); + g_assert (schema != NULL); + g_settings_schema_unref (schema); + + /* check recursive for schema that exists in toplevel */ + schema = g_settings_schema_source_lookup (source, "org.gtk.schemasourcecheck", TRUE); + g_assert (schema != NULL); + + /* try to use it for something */ + settings = g_settings_new_full (schema, backend, g_settings_schema_get_path (schema)); + g_settings_schema_unref (schema); + enabled = FALSE; + g_settings_get (settings, "enabled", "b", &enabled); + g_assert (enabled); + g_object_unref (settings); + + g_settings_schema_source_unref (source); + + /* try again, but with no parent */ + source = g_settings_schema_source_new_from_directory (NULL, "schema-source", FALSE, NULL); + g_assert (source != NULL); + + /* should not find it this time, even if recursive... */ + schema = g_settings_schema_source_lookup (source, "org.gtk.test", FALSE); + g_assert (schema == NULL); + schema = g_settings_schema_source_lookup (source, "org.gtk.test", TRUE); + g_assert (schema == NULL); + + /* should still find our own... */ + schema = g_settings_schema_source_lookup (source, "org.gtk.schemasourcecheck", TRUE); + g_assert (schema != NULL); + g_settings_schema_unref (schema); + schema = g_settings_schema_source_lookup (source, "org.gtk.schemasourcecheck", FALSE); + g_assert (schema != NULL); + g_settings_schema_unref (schema); + + g_settings_schema_source_unref (source); +} + int main (int argc, char *argv[]) { @@ -1923,6 +2004,13 @@ main (int argc, char *argv[]) NULL, NULL, &result, NULL)); g_assert (result == 0); + g_remove ("schema-source/gschemas.compiled"); + g_mkdir ("schema-source", 0777); + g_assert (g_spawn_command_line_sync ("../glib-compile-schemas --targetdir=schema-source " + "--schema-file=" SRCDIR "/org.gtk.schemasourcecheck.gschema.xml", + NULL, NULL, &result, NULL)); + g_assert (result == 0); + g_test_add_func ("/gsettings/basic", test_basic); if (!backend_set) @@ -1972,6 +2060,7 @@ main (int argc, char *argv[]) g_test_add_func ("/gsettings/list-schemas", test_list_schemas); g_test_add_func ("/gsettings/mapped", test_get_mapped); g_test_add_func ("/gsettings/get-range", test_get_range); + g_test_add_func ("/gsettings/schema-source", test_schema_source); result = g_test_run (); diff --git a/gio/tests/org.gtk.schemasourcecheck.gschema.xml b/gio/tests/org.gtk.schemasourcecheck.gschema.xml new file mode 100644 index 000000000..42c9c5104 --- /dev/null +++ b/gio/tests/org.gtk.schemasourcecheck.gschema.xml @@ -0,0 +1,7 @@ + + + + true + + +