summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRyan Lortie <desrt@desrt.ca>2012-07-13 13:14:27 -0400
committerRyan Lortie <desrt@desrt.ca>2012-07-13 13:16:06 -0400
commit85249b6a632c8a60127a32a0c0f485c8b967f20d (patch)
tree656d7f8692ace839ea03c38692b3f42022477f78
parent21ca3015a4f89a546440699dc22a3d23401719ad (diff)
downloaddconf-85249b6a632c8a60127a32a0c0f485c8b967f20d.tar.gz
tests/ Rework the gvdb mock code
Support a table being marked as no-longer-valid.
-rw-r--r--tests/dconf-mock-gvdb.c101
-rw-r--r--tests/dconf-mock.h19
-rw-r--r--tests/engine.c6
3 files changed, 81 insertions, 45 deletions
diff --git a/tests/dconf-mock-gvdb.c b/tests/dconf-mock-gvdb.c
index 50ffbac..cb639e3 100644
--- a/tests/dconf-mock-gvdb.c
+++ b/tests/dconf-mock-gvdb.c
@@ -13,10 +13,18 @@ static GMutex dconf_mock_gvdb_lock;
typedef struct
{
- GVariant *value;
- GHashTable *table;
+ GVariant *value;
+ GvdbTable *table;
} DConfMockGvdbItem;
+struct _GvdbTable
+{
+ GHashTable *table;
+ gboolean is_valid;
+ gboolean top_level;
+ gint ref_count;
+};
+
static void
dconf_mock_gvdb_item_free (gpointer data)
{
@@ -26,7 +34,7 @@ dconf_mock_gvdb_item_free (gpointer data)
g_variant_unref (item->value);
if (item->table)
- g_hash_table_unref (item->table);
+ gvdb_table_unref (item->table);
g_slice_free (DConfMockGvdbItem, item);
}
@@ -35,47 +43,54 @@ static void
dconf_mock_gvdb_init (void)
{
if (dconf_mock_gvdb_tables == NULL)
- dconf_mock_gvdb_tables = g_hash_table_new_full (g_str_hash, g_str_equal, g_free,
- (GDestroyNotify) g_hash_table_unref);
+ dconf_mock_gvdb_tables = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, (GDestroyNotify) gvdb_table_unref);
}
-DConfMockGvdbTable *
+GvdbTable *
dconf_mock_gvdb_table_new (void)
{
- GHashTable *hash_table;
+ GvdbTable *table;
- hash_table = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, dconf_mock_gvdb_item_free);
+ table = g_slice_new (GvdbTable);
+ table->table = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, dconf_mock_gvdb_item_free);
+ table->ref_count = 1;
+ table->is_valid = TRUE;
- return (DConfMockGvdbTable *) hash_table;
+ return table;
}
void
-dconf_mock_gvdb_table_insert (DConfMockGvdbTable *table,
- const gchar *name,
- GVariant *value,
- DConfMockGvdbTable *subtable)
+dconf_mock_gvdb_table_insert (GvdbTable *table,
+ const gchar *name,
+ GVariant *value,
+ GvdbTable *subtable)
{
- GHashTable *hash_table = (GHashTable *) table;
DConfMockGvdbItem *item;
g_assert (value == NULL || subtable == NULL);
+ if (subtable)
+ subtable->top_level = FALSE;
+
item = g_slice_new (DConfMockGvdbItem);
item->value = value ? g_variant_ref_sink (value) : NULL;
- item->table = (GHashTable *) subtable;
+ item->table = subtable;
- g_hash_table_insert (hash_table, g_strdup (name), item);
+ g_hash_table_insert (table->table, g_strdup (name), item);
}
void
-dconf_mock_gvdb_install (const gchar *filename,
- DConfMockGvdbTable *table)
+dconf_mock_gvdb_install (const gchar *filename,
+ GvdbTable *table)
{
g_mutex_lock (&dconf_mock_gvdb_lock);
dconf_mock_gvdb_init ();
if (table)
- g_hash_table_insert (dconf_mock_gvdb_tables, g_strdup (filename), table);
+ {
+ table->top_level = TRUE;
+ g_hash_table_insert (dconf_mock_gvdb_tables, g_strdup (filename), table);
+ }
else
g_hash_table_remove (dconf_mock_gvdb_tables, filename);
@@ -85,31 +100,45 @@ dconf_mock_gvdb_install (const gchar *filename,
void
gvdb_table_unref (GvdbTable *table)
{
- GHashTable *hash_table = (GHashTable *) table;
+ if (g_atomic_int_dec_and_test (&table->ref_count))
+ {
+ g_hash_table_unref (table->table);
+ g_slice_free (GvdbTable, table);
+ }
+}
+
+GvdbTable *
+gvdb_table_ref (GvdbTable *table)
+{
+ g_atomic_int_inc (&table->ref_count);
- g_hash_table_unref (hash_table);
+ return table;
}
GvdbTable *
gvdb_table_get_table (GvdbTable *table,
const gchar *key)
{
- GHashTable *hash_table = (GHashTable *) table;
DConfMockGvdbItem *item;
+ GvdbTable *subtable;
- item = g_hash_table_lookup (hash_table, key);
+ item = g_hash_table_lookup (table->table, key);
+
+ if (item && item->table)
+ subtable = gvdb_table_ref (item->table);
+ else
+ subtable = NULL;
- return (GvdbTable *) (item ? g_hash_table_ref (item->table) : NULL);
+ return subtable;
}
gboolean
gvdb_table_has_value (GvdbTable *table,
const gchar *key)
{
- GHashTable *hash_table = (GHashTable *) table;
DConfMockGvdbItem *item;
- item = g_hash_table_lookup (hash_table, key);
+ item = g_hash_table_lookup (table->table, key);
return item && item->value;
}
@@ -138,23 +167,29 @@ gvdb_table_new (const gchar *filename,
gboolean trusted,
GError **error)
{
- GHashTable *hash_table;
+ GvdbTable *table;
g_mutex_lock (&dconf_mock_gvdb_lock);
dconf_mock_gvdb_init ();
- hash_table = g_hash_table_lookup (dconf_mock_gvdb_tables, filename);
- if (hash_table)
- g_hash_table_ref (hash_table);
+ table = g_hash_table_lookup (dconf_mock_gvdb_tables, filename);
+ if (table)
+ gvdb_table_ref (table);
g_mutex_unlock (&dconf_mock_gvdb_lock);
- if (hash_table == NULL)
+ if (table == NULL)
g_set_error (error, G_FILE_ERROR, G_FILE_ERROR_NOENT, "this gvdb does not exist");
- return (GvdbTable *) hash_table;
+ return table;
}
gboolean
gvdb_table_is_valid (GvdbTable *table)
{
- return TRUE;
+ return table->is_valid;
+}
+
+void
+dconf_mock_gvdb_table_invalidate (GvdbTable *table)
+{
+ table->is_valid = FALSE;
}
diff --git a/tests/dconf-mock.h b/tests/dconf-mock.h
index 81c41c4..7c8fc0b 100644
--- a/tests/dconf-mock.h
+++ b/tests/dconf-mock.h
@@ -1,18 +1,19 @@
#ifndef __dconf_mock_h__
#define __dconf_mock_h__
+#include "../gvdb/gvdb-reader.h"
+
void dconf_mock_shm_reset (void);
gint dconf_mock_shm_flag (const gchar *name);
void dconf_mock_shm_assert_log (const gchar *expected_log);
-typedef struct _DConfMockGvdbTable DConfMockGvdbTable;
-
-DConfMockGvdbTable * dconf_mock_gvdb_table_new (void);
-void dconf_mock_gvdb_table_insert (DConfMockGvdbTable *table,
- const gchar *name,
- GVariant *value,
- DConfMockGvdbTable *subtable);
-void dconf_mock_gvdb_install (const gchar *filename,
- DConfMockGvdbTable *table);
+GvdbTable * dconf_mock_gvdb_table_new (void);
+void dconf_mock_gvdb_table_insert (GvdbTable *table,
+ const gchar *name,
+ GVariant *value,
+ GvdbTable *subtable);
+void dconf_mock_gvdb_table_invalidate (GvdbTable *table);
+void dconf_mock_gvdb_install (const gchar *filename,
+ GvdbTable *table);
#endif
diff --git a/tests/engine.c b/tests/engine.c
index 84d7de5..ecc77fb 100644
--- a/tests/engine.c
+++ b/tests/engine.c
@@ -228,8 +228,8 @@ static void
test_user_source (void)
{
DConfEngineSource *source;
- DConfMockGvdbTable *table;
- DConfMockGvdbTable *locks;
+ GvdbTable *table;
+ GvdbTable *locks;
gboolean reopened;
/* Create the source from a clean slate */
@@ -328,7 +328,7 @@ static void
test_system_source (void)
{
DConfEngineSource *source;
- DConfMockGvdbTable *table;
+ GvdbTable *table;
gboolean reopened;
source = dconf_engine_source_new ("system-db:site");