[dconf: 109/111] tests/ Rework the gvdb mock code



commit 85249b6a632c8a60127a32a0c0f485c8b967f20d
Author: Ryan Lortie <desrt desrt ca>
Date:   Fri Jul 13 13:14:27 2012 -0400

    tests/ Rework the gvdb mock code
    
    Support a table being marked as no-longer-valid.

 tests/dconf-mock-gvdb.c |  101 +++++++++++++++++++++++++++++++---------------
 tests/dconf-mock.h      |   19 +++++----
 tests/engine.c          |    6 +-
 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");



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