summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRyan Lortie <desrt@desrt.ca>2012-07-12 01:33:15 -0400
committerRyan Lortie <desrt@desrt.ca>2012-07-12 01:33:15 -0400
commitdd608d06c0868b3dc82105e4b7826ead74510d01 (patch)
tree1f7bd873ecfa43f3a71b16b3786fea3f0800754e
parentcd27413d87009d9d452c54b1b5bd65a9a5581ded (diff)
downloaddconf-dd608d06c0868b3dc82105e4b7826ead74510d01.tar.gz
tests/: implement more realistic shm mocking
Add an implementation of the mock shm based on a hash table. We can use this to check that all shm handles have been properly closed after each test. Soon will come support for flagging the shm regions, by name.
-rw-r--r--tests/dconf-mock-shm.c73
-rw-r--r--tests/dconf-mock.h6
-rw-r--r--tests/engine.c5
3 files changed, 82 insertions, 2 deletions
diff --git a/tests/dconf-mock-shm.c b/tests/dconf-mock-shm.c
index e9edb1c..3e9c38d 100644
--- a/tests/dconf-mock-shm.c
+++ b/tests/dconf-mock-shm.c
@@ -1,13 +1,82 @@
#include "../shm/dconf-shm.h"
+#include "dconf-mock.h"
+
+typedef struct
+{
+ guint8 flagged;
+ gint ref_count;
+} DConfMockShm;
+
+static GHashTable *dconf_mock_shm_table;
+static GMutex dconf_mock_shm_lock;
+
+static void
+dconf_mock_shm_unref (gpointer data)
+{
+ DConfMockShm *shm = data;
+
+ if (g_atomic_int_dec_and_test (&shm->ref_count))
+ g_slice_free (DConfMockShm, shm);
+}
+
+static DConfMockShm *
+dconf_mock_shm_ref (DConfMockShm *shm)
+{
+ g_atomic_int_inc (&shm->ref_count);
+
+ return shm;
+}
+
guint8 *
dconf_shm_open (const gchar *name)
{
- return g_malloc0 (1);
+ DConfMockShm *shm;
+
+ g_mutex_lock (&dconf_mock_shm_lock);
+
+ if G_UNLIKELY (dconf_mock_shm_table == NULL)
+ dconf_mock_shm_table = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, dconf_mock_shm_unref);
+
+ shm = g_hash_table_lookup (dconf_mock_shm_table, name);
+ if (shm == NULL)
+ {
+ shm = g_slice_new0 (DConfMockShm);
+ g_hash_table_insert (dconf_mock_shm_table, g_strdup (name), dconf_mock_shm_ref (shm));
+ }
+
+ /* before unlocking... */
+ dconf_mock_shm_ref (shm);
+
+ g_mutex_unlock (&dconf_mock_shm_lock);
+
+ return &shm->flagged;
}
void
dconf_shm_close (guint8 *shm)
{
- g_free (shm);
+ if (shm)
+ dconf_mock_shm_unref (shm);
+}
+
+void
+dconf_mock_shm_reset (void)
+{
+ g_mutex_lock (&dconf_mock_shm_lock);
+ if (dconf_mock_shm_table != NULL)
+ {
+ GHashTableIter iter;
+ gpointer value;
+
+ g_hash_table_iter_init (&iter, dconf_mock_shm_table);
+ while (g_hash_table_iter_next (&iter, NULL, &value))
+ {
+ DConfMockShm *shm = value;
+
+ g_assert_cmpint (shm->ref_count, ==, 1);
+ g_hash_table_iter_remove (&iter);
+ }
+ }
+ g_mutex_unlock (&dconf_mock_shm_lock);
}
diff --git a/tests/dconf-mock.h b/tests/dconf-mock.h
new file mode 100644
index 0000000..8ce7f1f
--- /dev/null
+++ b/tests/dconf-mock.h
@@ -0,0 +1,6 @@
+#ifndef __dconf_mock_h__
+#define __dconf_mock_h__
+
+void dconf_mock_shm_reset (void);
+
+#endif
diff --git a/tests/engine.c b/tests/engine.c
index 50d8362..ea29e37 100644
--- a/tests/engine.c
+++ b/tests/engine.c
@@ -2,6 +2,7 @@
#include "../engine/dconf-engine.h"
#include "../engine/dconf-engine-profile.h"
+#include "dconf-mock.h"
#include <stdlib.h>
#include <stdio.h>
#include <dlfcn.h>
@@ -176,6 +177,8 @@ test_profile_parser (void)
g_assert_cmpstr (sources[0]->name, ==, "user");
dconf_engine_source_free (sources[0]);
g_free (sources);
+
+ dconf_mock_shm_reset ();
}
static gpointer
@@ -217,6 +220,8 @@ test_signal_threadsafety (void)
"/ca/desrt/dconf/Writer/user",
"Notify", parameters);
g_variant_unref (parameters);
+
+ dconf_mock_shm_reset ();
}
int