[gnome-keyring/gnome-3-0] Modernize the remainder of the tests.



commit 24983752cb3e452b255306695fd7217256add905
Author: Stef Walter <stefw collabora co uk>
Date:   Sun Apr 24 00:19:42 2011 +0200

    Modernize the remainder of the tests.
    
     * Bring up to date with gtester running and individual binaries.
     * Make the tests run in make distcheck

 .gitignore                                         |   42 ++
 Makefile.am                                        |    4 +-
 daemon/control/tests/Makefile.am                   |   32 +-
 ...test-control-change.c => frob-control-change.c} |   11 +-
 .../{test-control-init.c => frob-control-init.c}   |   11 +-
 .../{test-control-quit.c => frob-control-quit.c}   |   11 +-
 ...test-control-unlock.c => frob-control-unlock.c} |   11 +-
 daemon/dbus/tests/Makefile.am                      |    4 +-
 egg/tests/Makefile.am                              |   10 +-
 egg/tests/test-asn1.c                              |   10 +-
 egg/tests/test-asn1x.c                             |   23 +-
 egg/tests/test-cleanup.c                           |    2 +-
 egg/tests/test-dh.c                                |    6 +-
 egg/tests/test-dn.c                                |   12 +-
 egg/tests/test-hex.c                               |    2 +-
 egg/tests/test-hkdf.c                              |    6 +-
 egg/tests/test-oid.c                               |    2 +-
 egg/tests/test-openssl.c                           |   10 +-
 egg/tests/test-padding.c                           |    4 +-
 egg/tests/test-secmem.c                            |    2 +-
 egg/tests/test-spawn.c                             |   20 +-
 egg/tests/test-symkey.c                            |    6 +-
 gck/tests/Makefile.am                              |    8 +-
 gck/tests/test-gck-crypto.c                        |    8 +-
 gck/tests/test-gck-enumerator.c                    |    8 +-
 gck/tests/test-gck-module.c                        |   10 +-
 gck/tests/test-gck-modules.c                       |    8 +-
 gck/tests/test-gck-object.c                        |    8 +-
 gck/tests/test-gck-session.c                       |    8 +-
 gck/tests/test-gck-slot.c                          |    8 +-
 gck/tests/test-gck-uri.c                           |    6 -
 gcr/tests/Makefile.am                              |    8 +-
 gcr/tests/frob-certificate.c                       |    2 +-
 gcr/tests/frob-key.c                               |    2 +-
 gcr/tests/test-certificate-chain.c                 |   12 +-
 gcr/tests/test-certificate.c                       |   12 +-
 gcr/tests/test-parser.c                            |   10 +-
 gcr/tests/test-pkcs11-certificate.c                |   12 +-
 gcr/tests/test-simple-certificate.c                |   10 +-
 gcr/tests/test-trust.c                             |   10 +-
 pkcs11/gkm/tests/Makefile.am                       |   10 +-
 pkcs11/gkm/tests/mock-module.c                     |    2 +-
 pkcs11/gkm/tests/test-data-asn1.c                  |    2 +-
 pkcs11/gkm/tests/test-data-der.c                   |   12 +-
 pkcs11/gkm/tests/test-object.c                     |    2 +-
 pkcs11/gnome2-store/tests/Makefile.am              |   56 ++-
 pkcs11/gnome2-store/tests/check-gnome2-module.c    |   68 ++
 .../tests/{test-data => files}/.gitempty           |    0
 .../{test-data => files}/data-file-private.store   |  Bin 494 -> 494 bytes
 .../{test-data => files}/data-file-public.store    |  Bin 216 -> 216 bytes
 .../{dump-gnome2-file.c => frob-gnome2-file.c}     |    4 +-
 pkcs11/gnome2-store/tests/test-gnome2-file.c       |  642 ++++++++++++++++++++
 pkcs11/gnome2-store/tests/test-module.c            |   34 -
 pkcs11/gnome2-store/tests/unit-test-gnome2-file.c  |  592 ------------------
 pkcs11/roots-store/tests/Makefile.am               |   40 +-
 pkcs11/roots-store/tests/check-roots-module.c      |   68 ++
 .../RSA_Root_Certificate_1.pem                     |    0
 .../{test-data => files}/RSA_Security_1024_v3.pem  |    0
 .../{test-data => files}/RSA_Security_2048_v3.pem  |    0
 .../Thawte_Personal_Basic_CA.pem                   |    0
 .../Thawte_Personal_Freemail_CA.pem                |    0
 .../Thawte_Personal_Premium_CA.pem                 |    0
 .../Thawte_Premium_Server_CA.pem                   |    0
 .../{test-data => files}/Thawte_Server_CA.pem      |    0
 .../Thawte_Time_Stamping_CA.pem                    |    0
 .../tests/{test-data => files}/ca-certificates.crt |    0
 .../tests/{test-data => files}/cacert.org.pem      |    0
 .../tests/{test-data => files}/der-certificate.crt |  Bin 747 -> 747 bytes
 pkcs11/roots-store/tests/test-module.c             |   34 -
 pkcs11/secret-store/gkm-secret-binary.c            |    4 +-
 pkcs11/secret-store/gkm-secret-binary.h            |    4 +-
 pkcs11/secret-store/gkm-secret-collection.c        |    2 +-
 pkcs11/secret-store/gkm-secret-textual.c           |    4 +-
 pkcs11/secret-store/gkm-secret-textual.h           |    4 +-
 pkcs11/secret-store/tests/Makefile.am              |   61 ++-
 .../tests/{test-data => files}/encrypted.keyring   |  Bin 733 -> 733 bytes
 .../{test-data => files}/plain-bad-number.keyring  |    0
 .../tests/{test-data => files}/plain.keyring       |    0
 .../{test-secret-module.c => mock-secret-module.c} |   55 ++-
 .../{test-secret-module.h => mock-secret-module.h} |    3 +-
 pkcs11/secret-store/tests/test-secret-binary.c     |  222 +++++++
 pkcs11/secret-store/tests/test-secret-collection.c |  598 ++++++++++++++++++
 ...t-test-secret-compat.c => test-secret-compat.c} |   31 +-
 ...{unit-test-secret-data.c => test-secret-data.c} |   56 ++-
 ...t-test-secret-fields.c => test-secret-fields.c} |  104 +++-
 pkcs11/secret-store/tests/test-secret-item.c       |  482 +++++++++++++++
 pkcs11/secret-store/tests/test-secret-object.c     |  302 +++++++++
 ...t-test-secret-search.c => test-secret-search.c} |  173 +++---
 pkcs11/secret-store/tests/test-secret-textual.c    |  205 +++++++
 .../secret-store/tests/unit-test-secret-binary.c   |  200 ------
 .../tests/unit-test-secret-collection.c            |  563 -----------------
 pkcs11/secret-store/tests/unit-test-secret-item.c  |  438 -------------
 .../secret-store/tests/unit-test-secret-object.c   |  269 --------
 .../secret-store/tests/unit-test-secret-textual.c  |  184 ------
 pkcs11/ssh-store/gkm-ssh-openssh.c                 |    5 +-
 pkcs11/ssh-store/gkm-ssh-openssh.h                 |    4 +-
 pkcs11/ssh-store/tests/Makefile.am                 |   58 ++-
 pkcs11/ssh-store/tests/check-ssh-module.c          |   68 ++
 .../tests/{test-data => files}/id_dsa_encrypted    |    0
 .../{test-data => files}/id_dsa_encrypted.pub      |    0
 .../tests/{test-data => files}/id_dsa_plain        |    0
 .../tests/{test-data => files}/id_dsa_plain.pub    |    0
 .../tests/{test-data => files}/id_dsa_test.pub     |    0
 .../tests/{test-data => files}/id_rsa_encrypted    |    0
 .../{test-data => files}/id_rsa_encrypted.pub      |    0
 .../tests/{test-data => files}/id_rsa_plain        |    0
 .../tests/{test-data => files}/id_rsa_plain.pub    |    0
 .../tests/{test-data => files}/id_rsa_test.pub     |    0
 .../tests/{test-ssh-module.c => mock-ssh-module.c} |   13 +-
 .../tests/{test-ssh-module.h => mock-ssh-module.h} |    0
 ...{unit-test-private-key.c => test-private-key.c} |   67 ++-
 ...{unit-test-ssh-openssh.c => test-ssh-openssh.c} |   49 +-
 pkcs11/wrap-layer/tests/Makefile.am                |   52 +-
 pkcs11/wrap-layer/tests/mock-secret-store.c        |    4 +-
 pkcs11/wrap-layer/tests/test-create-credential.c   |   88 ++--
 pkcs11/wrap-layer/tests/test-init-pin.c            |   60 ++-
 pkcs11/wrap-layer/tests/test-login-auto.c          |  129 +++--
 pkcs11/wrap-layer/tests/test-login-hints.c         |   19 +-
 pkcs11/wrap-layer/tests/test-login-keyring.c       |   92 ++-
 pkcs11/wrap-layer/tests/test-login-specific.c      |   74 ++-
 pkcs11/wrap-layer/tests/test-login-user.c          |   94 ++-
 pkcs11/wrap-layer/tests/test-set-pin.c             |   58 ++-
 pkcs11/xdg-store/tests/Makefile.am                 |   65 ++-
 pkcs11/xdg-store/tests/check-xdg-module.c          |   68 ++
 .../{test-data => files}/test-certificate-1.cer    |  Bin 813 -> 813 bytes
 .../{test-data => files}/test-certificate-2.cer    |  Bin 813 -> 813 bytes
 .../tests/{test-data => files}/test-refer-1.trust  |  Bin 241 -> 241 bytes
 .../{diddle-trust-file.c => frob-trust-file.c}     |    0
 pkcs11/xdg-store/tests/mock-xdg-module.c           |  214 +++++++
 .../tests/{test-xdg-module.h => mock-xdg-module.h} |   24 +-
 pkcs11/xdg-store/tests/test-xdg-module.c           |  257 +++-----
 pkcs11/xdg-store/tests/test-xdg-trust.c            |  352 +++++++-----
 testing/Makefile.am                                |   18 +-
 testing/testing-build.sh                           |  139 -----
 testing/testing.c                                  |  394 ------------
 testing/testing.h                                  |  104 ----
 testing/testing.make                               |   77 ---
 ui/tests/Makefile.am                               |   35 +-
 ui/tests/{test-data => files}/prompt-empty         |    0
 ui/tests/{test-data => files}/prompt-full          |    0
 ui/tests/{test-data => files}/prompt-test          |    0
 ui/tests/{unit-test-util.c => test-util.c}         |   72 ++-
 142 files changed, 4545 insertions(+), 4129 deletions(-)
---
diff --git a/.gitignore b/.gitignore
index 4c39497..e49a00a 100644
--- a/.gitignore
+++ b/.gitignore
@@ -95,6 +95,11 @@ run-tests
 /egg/tests/test-spawn
 /egg/tests/test-symkey
 
+/daemon/control/tests/frob-control-change
+/daemon/control/tests/frob-control-init
+/daemon/control/tests/frob-control-quit
+/daemon/control/tests/frob-control-unlock
+
 /gck/tests/test-gck-attributes
 /gck/tests/test-gck-crypto
 /gck/tests/test-gck-enumerator
@@ -129,6 +134,43 @@ run-tests
 /pkcs11/gkm/tests/test-timer
 /pkcs11/gkm/tests/test-transaction
 
+/pkcs11/gnome2-store/tests/frob-gnome2-file
+/pkcs11/gnome2-store/tests/test-gnome2-file
+/pkcs11/gnome2-store/tests/check-gnome2-module
+/pkcs11/gnome2-store/tests/check-module
+
+/pkcs11/roots-store/tests/check-roots-module
+
+/pkcs11/secret-store/tests/test-secret-binary
+/pkcs11/secret-store/tests/test-secret-collection
+/pkcs11/secret-store/tests/test-secret-compat
+/pkcs11/secret-store/tests/test-secret-data
+/pkcs11/secret-store/tests/test-secret-fields
+/pkcs11/secret-store/tests/test-secret-item
+/pkcs11/secret-store/tests/test-secret-object
+/pkcs11/secret-store/tests/test-secret-search
+/pkcs11/secret-store/tests/test-secret-textual
+
+/pkcs11/ssh-store/tests/check-ssh-module
+/pkcs11/ssh-store/tests/test-private-key
+/pkcs11/ssh-store/tests/test-ssh-openssh
+
+/pkcs11/wrap-layer/tests/test-create-credential
+/pkcs11/wrap-layer/tests/test-init-pin
+/pkcs11/wrap-layer/tests/test-login-auto
+/pkcs11/wrap-layer/tests/test-login-hints
+/pkcs11/wrap-layer/tests/test-login-keyring
+/pkcs11/wrap-layer/tests/test-login-specific
+/pkcs11/wrap-layer/tests/test-login-user
+/pkcs11/wrap-layer/tests/test-set-pin
+
+/pkcs11/xdg-store/tests/check-xdg-module
+/pkcs11/xdg-store/tests/frob-trust-file
+/pkcs11/xdg-store/tests/test-xdg-module
+/pkcs11/xdg-store/tests/test-xdg-trust
+
+/ui/tests/test-util
+
 /daemon/dbus/tests/test-secret-util
 
 /ui/gnome-keyring-prompt.desktop
diff --git a/Makefile.am b/Makefile.am
index b14f7a8..b560ab4 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -36,8 +36,8 @@ EXTRA_DIST = \
 
 DISTCHECK_CONFIGURE_FLAGS = \
 	--enable-gtk-doc \
-	--enable-tests \
-	--disable-debug \
+	--enable-tests=full \
+	--enable-debug=yes \
 	--disable-gcov
 
 DISTCLEANFILES = \
diff --git a/daemon/control/tests/Makefile.am b/daemon/control/tests/Makefile.am
index 2ab531a..5d08d9f 100644
--- a/daemon/control/tests/Makefile.am
+++ b/daemon/control/tests/Makefile.am
@@ -12,45 +12,45 @@ LIBS = \
 	$(P11_TESTS_LIBS)
 
 noinst_PROGRAMS= \
-	test-control-change \
-	test-control-init \
-	test-control-unlock \
-	test-control-quit
+	frob-control-change \
+	frob-control-init \
+	frob-control-unlock \
+	frob-control-quit
 
 # ------------------------------------------------------------------------------
 # Test unlocking the login keyring
 
-test_control_change_SOURCES = \
-	test-control-change.c
+frob_control_change_SOURCES = \
+	frob-control-change.c
 
-test_control_change_LDADD = \
+frob_control_change_LDADD = \
 	$(top_builddir)/daemon/control/libgkd-control-client.la \
 	$(top_builddir)/egg/libegg-buffer.la \
 	$(top_builddir)/egg/libegg-creds.la \
 	$(top_builddir)/egg/libegg-secure.la
 
-test_control_init_SOURCES = \
-	test-control-init.c
+frob_control_init_SOURCES = \
+	frob-control-init.c
 
-test_control_init_LDADD = \
+frob_control_init_LDADD = \
 	$(top_builddir)/daemon/control/libgkd-control-client.la \
 	$(top_builddir)/egg/libegg-buffer.la \
 	$(top_builddir)/egg/libegg-creds.la \
 	$(top_builddir)/egg/libegg-secure.la
 
-test_control_quit_SOURCES = \
-	test-control-quit.c
+frob_control_quit_SOURCES = \
+	frob-control-quit.c
 
-test_control_quit_LDADD = \
+frob_control_quit_LDADD = \
 	$(top_builddir)/daemon/control/libgkd-control-client.la \
 	$(top_builddir)/egg/libegg-buffer.la \
 	$(top_builddir)/egg/libegg-creds.la \
 	$(top_builddir)/egg/libegg-secure.la
 
-test_control_unlock_SOURCES = \
-	test-control-unlock.c
+frob_control_unlock_SOURCES = \
+	frob-control-unlock.c
 
-test_control_unlock_LDADD = \
+frob_control_unlock_LDADD = \
 	$(top_builddir)/daemon/control/libgkd-control-client.la \
 	$(top_builddir)/egg/libegg-buffer.la \
 	$(top_builddir)/egg/libegg-creds.la \
diff --git a/daemon/control/tests/test-control-change.c b/daemon/control/tests/frob-control-change.c
similarity index 82%
rename from daemon/control/tests/test-control-change.c
rename to daemon/control/tests/frob-control-change.c
index b910f77..9b9c9ba 100644
--- a/daemon/control/tests/test-control-change.c
+++ b/daemon/control/tests/frob-control-change.c
@@ -1,12 +1,15 @@
 
 #include "control/gkd-control.h"
-#include "testing/testing.h"
+
+#include "egg/egg-secure-memory.h"
 
 #include <pwd.h>
 #include <unistd.h>
 
-static int
-run (void)
+EGG_SECURE_GLIB_DEFINITIONS ();
+
+int
+main (int argc, char *argv[])
 {
 	gchar *original;
 	const char *password;
@@ -26,5 +29,3 @@ run (void)
 	g_free (original);
 	return 0;
 }
-
-#include "testing/testing.c"
diff --git a/daemon/control/tests/test-control-init.c b/daemon/control/tests/frob-control-init.c
similarity index 81%
rename from daemon/control/tests/test-control-init.c
rename to daemon/control/tests/frob-control-init.c
index 4b1d6b4..3e83d03 100644
--- a/daemon/control/tests/test-control-init.c
+++ b/daemon/control/tests/frob-control-init.c
@@ -1,13 +1,16 @@
 
 #include "control/gkd-control.h"
-#include "testing/testing.h"
+
+#include "egg/egg-secure-memory.h"
 
 #include <pwd.h>
 #include <stdlib.h>
 #include <unistd.h>
 
-static int
-run (void)
+EGG_SECURE_GLIB_DEFINITIONS ();
+
+int
+main (int argc, char *argv[])
 {
 	const char *directory;
 	const gchar *env[] = { NULL };
@@ -26,5 +29,3 @@ run (void)
 
 	return 0;
 }
-
-#include "testing/testing.c"
diff --git a/daemon/control/tests/test-control-quit.c b/daemon/control/tests/frob-control-quit.c
similarity index 75%
rename from daemon/control/tests/test-control-quit.c
rename to daemon/control/tests/frob-control-quit.c
index f3ec3cc..bf73a4e 100644
--- a/daemon/control/tests/test-control-quit.c
+++ b/daemon/control/tests/frob-control-quit.c
@@ -1,13 +1,16 @@
 
 #include "control/gkd-control.h"
-#include "testing/testing.h"
+
+#include "egg/egg-secure-memory.h"
 
 #include <pwd.h>
 #include <stdlib.h>
 #include <unistd.h>
 
-static int
-run (void)
+EGG_SECURE_GLIB_DEFINITIONS ();
+
+int
+main (int argc, char *argv[])
 {
 	const char *directory;
 
@@ -21,5 +24,3 @@ run (void)
 
 	return 0;
 }
-
-#include "testing/testing.c"
diff --git a/daemon/control/tests/test-control-unlock.c b/daemon/control/tests/frob-control-unlock.c
similarity index 76%
rename from daemon/control/tests/test-control-unlock.c
rename to daemon/control/tests/frob-control-unlock.c
index ba6cca4..b361066 100644
--- a/daemon/control/tests/test-control-unlock.c
+++ b/daemon/control/tests/frob-control-unlock.c
@@ -1,12 +1,15 @@
 
 #include "control/gkd-control.h"
-#include "testing/testing.h"
+
+#include "egg/egg-secure-memory.h"
 
 #include <pwd.h>
 #include <unistd.h>
 
-static int
-run (void)
+EGG_SECURE_GLIB_DEFINITIONS ();
+
+int
+main (int argc, char *argv[])
 {
 	const char *password;
 	const char *directory;
@@ -20,5 +23,3 @@ run (void)
 	gkd_control_unlock (directory, password);
 	return 0;
 }
-
-#include "testing/testing.c"
diff --git a/daemon/dbus/tests/Makefile.am b/daemon/dbus/tests/Makefile.am
index d5f7eb8..a4d4bf4 100644
--- a/daemon/dbus/tests/Makefile.am
+++ b/daemon/dbus/tests/Makefile.am
@@ -1,7 +1,7 @@
 
 INCLUDES = \
 	-I$(top_srcdir)/daemon/dbus \
-	-DSRCDIR=$(srcdir) \
+	-DSRCDIR="\"$(srcdir)\"" \
 	$(DAEMON_CFLAGS) \
 	$(GLIB_CFLAGS)
 
@@ -14,7 +14,7 @@ TEST_PROGS = \
 check_PROGRAMS = $(TEST_PROGS)
 
 test: $(TEST_PROGS)
-	SRCDIR='$(srcdir)' gtester -k --verbose -m $(TEST_MODE) --g-fatal-warnings $(TEST_PROGS)
+	gtester -k --verbose -m $(TEST_MODE) --g-fatal-warnings $(TEST_PROGS)
 
 check-local: test
 
diff --git a/egg/tests/Makefile.am b/egg/tests/Makefile.am
index 72f0d37..6de8baf 100644
--- a/egg/tests/Makefile.am
+++ b/egg/tests/Makefile.am
@@ -3,8 +3,9 @@ asn1-def-test.c: test.asn
 	$(ASN1PARSER) -o asn1-def-test.c $(srcdir)/test.asn
 
 INCLUDES = \
-	-I$(top_srcdir)/egg \
-	-DSRCDIR=$(srcdir) \
+	-I$(top_builddir) \
+	-I$(top_srcdir) \
+	-DSRCDIR="\"$(srcdir)\"" \
 	$(GLIB_CFLAGS)
 
 LDADD =  \
@@ -34,7 +35,7 @@ test_asn1_SOURCES = \
 check_PROGRAMS = $(TEST_PROGS)
 
 test: $(TEST_PROGS)
-	SRCDIR='$(srcdir)' gtester -k --verbose -m $(TEST_MODE) --g-fatal-warnings $(TEST_PROGS)
+	gtester -k --verbose -m $(TEST_MODE) --g-fatal-warnings $(TEST_PROGS)
 
 check-local: test
 
@@ -44,6 +45,9 @@ EXTRA_DIST = \
 	test.asn \
 	files
 
+DISTCLEANFILES = \
+	asn1-def-test.c
+
 # ------------------------------------------------------------------------------
 
 noinst_PROGRAMS = \
diff --git a/egg/tests/test-asn1.c b/egg/tests/test-asn1.c
index 39f188d..cf855da 100644
--- a/egg/tests/test-asn1.c
+++ b/egg/tests/test-asn1.c
@@ -23,9 +23,9 @@
 
 #include "config.h"
 
-#include "egg-asn1x.h"
-#include "egg-asn1-defs.h"
-#include "egg-testing.h"
+#include "egg/egg-asn1x.h"
+#include "egg/egg-asn1-defs.h"
+#include "egg/egg-testing.h"
 
 #include <glib.h>
 #include <libtasn1.h>
@@ -726,8 +726,8 @@ typedef struct {
 static void
 setup (Test *test, gconstpointer unused)
 {
-	if (!g_file_get_contents ("files/test-certificate-1.der", (gchar**)&test->data,
-	                          &test->n_data, NULL))
+	if (!g_file_get_contents (SRCDIR "/files/test-certificate-1.der",
+	                          (gchar**)&test->data, &test->n_data, NULL))
 		g_assert_not_reached ();
 
 	test->asn1 = egg_asn1x_create (pkix_asn1_tab, "Certificate");
diff --git a/egg/tests/test-asn1x.c b/egg/tests/test-asn1x.c
index 553ad6f..7556e5d 100644
--- a/egg/tests/test-asn1x.c
+++ b/egg/tests/test-asn1x.c
@@ -21,15 +21,16 @@
    Author: Stef Walter <stef memberwebs com>
 */
 
-#include "egg-asn1x.h"
+#include "config.h"
+
+#include "egg/egg-asn1x.h"
+#include "egg/egg-asn1-defs.h"
+#include "egg/egg-testing.h"
 
 #include <pwd.h>
 #include <stdlib.h>
 #include <unistd.h>
 
-#include "egg-asn1-defs.h"
-#include "egg-testing.h"
-
 #if 0
 static void
 build_personal_name (void)
@@ -101,13 +102,13 @@ main (int argc, char **argv)
 
 	egg_tests_chdir_base (argv[0]);
 
-	test_some_asn1_stuff (pkix_asn1_tab, "files/test-certificate-1.der", "Certificate");
-	test_some_asn1_stuff (pkix_asn1_tab, "files/test-pkcs8-1.der", "pkcs-8-PrivateKeyInfo");
-	test_some_asn1_stuff (pk_asn1_tab, "files/test-rsakey-1.der", "RSAPrivateKey");
-	test_some_asn1_stuff (pkix_asn1_tab, "files/test-personalname-1.der", "PersonalName");
-	test_some_asn1_stuff (pkix_asn1_tab, "files/test-pkcs7-1.der", "pkcs-7-ContentInfo");
-	test_some_asn1_stuff (pkix_asn1_tab, "files/test-pkcs7-2.der", "pkcs-7-ContentInfo");
-	test_some_asn1_stuff (pkix_asn1_tab, "files/test-pkcs12-1.der", "pkcs-12-PFX");
+	test_some_asn1_stuff (pkix_asn1_tab, SRCDIR "/files/test-certificate-1.der", "Certificate");
+	test_some_asn1_stuff (pkix_asn1_tab, SRCDIR "/files/test-pkcs8-1.der", "pkcs-8-PrivateKeyInfo");
+	test_some_asn1_stuff (pk_asn1_tab, SRCDIR "/files/test-rsakey-1.der", "RSAPrivateKey");
+	test_some_asn1_stuff (pkix_asn1_tab, SRCDIR "/files/test-personalname-1.der", "PersonalName");
+	test_some_asn1_stuff (pkix_asn1_tab, SRCDIR "/files/test-pkcs7-1.der", "pkcs-7-ContentInfo");
+	test_some_asn1_stuff (pkix_asn1_tab, SRCDIR "/files/test-pkcs7-2.der", "pkcs-7-ContentInfo");
+	test_some_asn1_stuff (pkix_asn1_tab, SRCDIR "/files/test-pkcs12-1.der", "pkcs-12-PFX");
 
 	return 0;
 }
diff --git a/egg/tests/test-cleanup.c b/egg/tests/test-cleanup.c
index 90e3477..0a89f19 100644
--- a/egg/tests/test-cleanup.c
+++ b/egg/tests/test-cleanup.c
@@ -25,7 +25,7 @@
 #include <stdio.h>
 #include <string.h>
 
-#include "egg-cleanup.h"
+#include "egg/egg-cleanup.h"
 
 #define DATA "some string"
 
diff --git a/egg/tests/test-dh.c b/egg/tests/test-dh.c
index 58098cc..ba9fcfc 100644
--- a/egg/tests/test-dh.c
+++ b/egg/tests/test-dh.c
@@ -23,9 +23,9 @@
 
 #include "config.h"
 
-#include "egg-dh.h"
-#include "egg-secure-memory.h"
-#include "egg-testing.h"
+#include "egg/egg-dh.h"
+#include "egg/egg-secure-memory.h"
+#include "egg/egg-testing.h"
 
 #include <stdlib.h>
 #include <stdio.h>
diff --git a/egg/tests/test-dn.c b/egg/tests/test-dn.c
index eae139f..98f5a43 100644
--- a/egg/tests/test-dn.c
+++ b/egg/tests/test-dn.c
@@ -23,10 +23,10 @@
 
 #include "config.h"
 
-#include "egg-asn1-defs.h"
-#include "egg-asn1x.h"
-#include "egg-dn.h"
-#include "egg-oid.h"
+#include "egg/egg-asn1-defs.h"
+#include "egg/egg-asn1x.h"
+#include "egg/egg-dn.h"
+#include "egg/egg-oid.h"
 
 #include <glib.h>
 #include <gcrypt.h>
@@ -45,8 +45,8 @@ typedef struct {
 static void
 setup (Test *test, gconstpointer unused)
 {
-	if (!g_file_get_contents ("files/test-certificate-1.der", (gchar**)&test->data,
-	                          &test->n_data, NULL))
+	if (!g_file_get_contents (SRCDIR "/files/test-certificate-1.der",
+	                          (gchar**)&test->data, &test->n_data, NULL))
 		g_assert_not_reached ();
 
 	test->asn1 = egg_asn1x_create (pkix_asn1_tab, "Certificate");
diff --git a/egg/tests/test-hex.c b/egg/tests/test-hex.c
index 713bf60..e2cb9f0 100644
--- a/egg/tests/test-hex.c
+++ b/egg/tests/test-hex.c
@@ -23,7 +23,7 @@
 
 #include "config.h"
 
-#include "egg-hex.h"
+#include "egg/egg-hex.h"
 
 #include <stdlib.h>
 #include <stdio.h>
diff --git a/egg/tests/test-hkdf.c b/egg/tests/test-hkdf.c
index 44c463d..93f16df 100644
--- a/egg/tests/test-hkdf.c
+++ b/egg/tests/test-hkdf.c
@@ -27,9 +27,9 @@
 #include <stdio.h>
 #include <string.h>
 
-#include "egg-hkdf.h"
-#include "egg-secure-memory.h"
-#include "egg-testing.h"
+#include "egg/egg-hkdf.h"
+#include "egg/egg-secure-memory.h"
+#include "egg/egg-testing.h"
 
 #include <gcrypt.h>
 
diff --git a/egg/tests/test-oid.c b/egg/tests/test-oid.c
index 189a200..37b0e2e 100644
--- a/egg/tests/test-oid.c
+++ b/egg/tests/test-oid.c
@@ -22,7 +22,7 @@
 
 #include "config.h"
 
-#include "egg-oid.h"
+#include "egg/egg-oid.h"
 
 #include <glib.h>
 
diff --git a/egg/tests/test-openssl.c b/egg/tests/test-openssl.c
index 18f9fd9..e80c1b1 100644
--- a/egg/tests/test-openssl.c
+++ b/egg/tests/test-openssl.c
@@ -23,10 +23,10 @@
 
 #include "config.h"
 
-#include "egg-symkey.h"
-#include "egg-openssl.h"
-#include "egg-secure-memory.h"
-#include "egg-testing.h"
+#include "egg/egg-symkey.h"
+#include "egg/egg-openssl.h"
+#include "egg/egg-secure-memory.h"
+#include "egg/egg-testing.h"
 
 #include <glib.h>
 
@@ -51,7 +51,7 @@ typedef struct {
 static void
 setup (Test *test, gconstpointer unused)
 {
-	if (!g_file_get_contents ("files/pem-rsa-enc.key", (gchar**)&test->input, &test->n_input, NULL))
+	if (!g_file_get_contents (SRCDIR "/files/pem-rsa-enc.key", (gchar**)&test->input, &test->n_input, NULL))
 		g_assert_not_reached ();
 }
 
diff --git a/egg/tests/test-padding.c b/egg/tests/test-padding.c
index 236d941..10a6c0e 100644
--- a/egg/tests/test-padding.c
+++ b/egg/tests/test-padding.c
@@ -23,8 +23,8 @@
 
 #include "config.h"
 
-#include "egg-padding.h"
-#include "egg-testing.h"
+#include "egg/egg-padding.h"
+#include "egg/egg-testing.h"
 
 #include <gcrypt.h>
 
diff --git a/egg/tests/test-secmem.c b/egg/tests/test-secmem.c
index ddd74a1..b5ee465 100644
--- a/egg/tests/test-secmem.c
+++ b/egg/tests/test-secmem.c
@@ -23,7 +23,7 @@
 
 #include "config.h"
 
-#include "egg-secure-memory.h"
+#include "egg/egg-secure-memory.h"
 
 #include <glib.h>
 
diff --git a/egg/tests/test-spawn.c b/egg/tests/test-spawn.c
index 07488c0..e0ac386 100644
--- a/egg/tests/test-spawn.c
+++ b/egg/tests/test-spawn.c
@@ -23,8 +23,8 @@
 
 #include "config.h"
 
-#include "egg-spawn.h"
-#include "egg-testing.h"
+#include "egg/egg-spawn.h"
+#include "egg/egg-testing.h"
 
 #include <sys/wait.h>
 
@@ -176,7 +176,7 @@ test_sync (void)
 	data.parent_pid = getpid();
 	data.index = 80;
 
-	ret = egg_spawn_sync_with_callbacks ("./files",
+	ret = egg_spawn_sync_with_callbacks (SRCDIR "/files",
 	                                     echo_argv, NULL, 0, &pid,
 	                                     &echo_callbacks, &data,
 	                                     &exit_status, &error);
@@ -197,7 +197,7 @@ test_sync_error (void)
 	GError *error = NULL;
 	gboolean ret;
 
-	ret = egg_spawn_sync_with_callbacks ("./files",
+	ret = egg_spawn_sync_with_callbacks (SRCDIR "/files",
 	                                     error_argv, NULL, 0, NULL,
 	                                     NULL, NULL,
 	                                     NULL, &error);
@@ -220,7 +220,7 @@ test_async (void)
 	data.index = 80;
 	data.is_async = TRUE;
 
-	ret = egg_spawn_async_with_callbacks ("./files",
+	ret = egg_spawn_async_with_callbacks (SRCDIR "/files",
 	                                     echo_argv, NULL, 0, &pid,
 	                                     &echo_callbacks, &data,
 	                                     NULL, &error);
@@ -247,7 +247,7 @@ test_async_none (void)
 	data.parent_pid = getpid();
 	data.is_async = TRUE;
 
-	ret = egg_spawn_async_with_callbacks ("./files",
+	ret = egg_spawn_async_with_callbacks (SRCDIR "/files",
 	                                     echo_argv, NULL, 0, NULL,
 	                                     &null_callbacks, &data,
 	                                     NULL, &error);
@@ -268,7 +268,7 @@ test_async_error (void)
 	GError *error = NULL;
 	guint ret;
 
-	ret = egg_spawn_async_with_callbacks ("./files",
+	ret = egg_spawn_async_with_callbacks (SRCDIR "/files",
 	                                     error_argv, NULL, 0, NULL,
 	                                     NULL, NULL,
 	                                     NULL, &error);
@@ -280,14 +280,8 @@ test_async_error (void)
 int
 main (int argc, char **argv)
 {
-	const gchar *srcdir;
-
 	g_test_init (&argc, &argv, NULL);
 
-	srcdir = g_getenv ("SRCDIR");
-	if (srcdir && chdir (srcdir) < 0)
-		g_error ("couldn't change directory to: %s: %s", srcdir, g_strerror (errno));
-
 	g_test_add_func ("/spawn/sync", test_sync);
 	g_test_add_func ("/spawn/sync_error", test_sync_error);
 	g_test_add_func ("/spawn/async", test_async);
diff --git a/egg/tests/test-symkey.c b/egg/tests/test-symkey.c
index c2c1b78..b65ee30 100644
--- a/egg/tests/test-symkey.c
+++ b/egg/tests/test-symkey.c
@@ -23,9 +23,9 @@
 
 #include "config.h"
 
-#include "egg-libgcrypt.h"
-#include "egg-secure-memory.h"
-#include "egg-symkey.h"
+#include "egg/egg-libgcrypt.h"
+#include "egg/egg-secure-memory.h"
+#include "egg/egg-symkey.h"
 
 #include <gcrypt.h>
 
diff --git a/gck/tests/Makefile.am b/gck/tests/Makefile.am
index b06a1e4..e43f2e6 100644
--- a/gck/tests/Makefile.am
+++ b/gck/tests/Makefile.am
@@ -1,7 +1,9 @@
 
 INCLUDES = \
-	-I$(top_srcdir)/egg \
-	-DSRCDIR=$(srcdir) \
+	-I$(top_builddir) \
+	-I$(top_srcdir) \
+	-DSRCDIR="\"$(srcdir)\"" \
+	-DBUILDDIR="\"$(builddir)\"" \
 	-DGCK_API_SUBJECT_TO_CHANGE \
 	$(GLIB_CFLAGS)
 
@@ -28,7 +30,7 @@ TEST_PROGS = \
 check_PROGRAMS = $(TEST_PROGS)
 
 test: $(TEST_PROGS)
-	SRCDIR='$(srcdir)' gtester -k --verbose -m $(TEST_MODE) --g-fatal-warnings $(TEST_PROGS)
+	gtester -k --verbose -m $(TEST_MODE) --g-fatal-warnings $(TEST_PROGS)
 
 check-local: test
 
diff --git a/gck/tests/test-gck-crypto.c b/gck/tests/test-gck-crypto.c
index d6dfc9e..208673f 100644
--- a/gck/tests/test-gck-crypto.c
+++ b/gck/tests/test-gck-crypto.c
@@ -57,7 +57,7 @@ setup (Test *test, gconstpointer unused)
 	GckSlot *slot;
 
 	/* Successful load */
-	test->module = gck_module_initialize (".libs/libmock-test-module.so", NULL, 0, &err);
+	test->module = gck_module_initialize (BUILDDIR "/.libs/libmock-test-module.so", NULL, 0, &err);
 	g_assert_no_error (err);
 	g_assert (GCK_IS_MODULE (test->module));
 
@@ -627,15 +627,9 @@ test_derive_key (Test *test, gconstpointer unused)
 int
 main (int argc, char **argv)
 {
-	const gchar *srcdir;
-
 	g_type_init ();
 	g_test_init (&argc, &argv, NULL);
 
-	srcdir = g_getenv ("SRCDIR");
-	if (srcdir && chdir (srcdir) < 0)
-		g_error ("couldn't change directory to: %s: %s", srcdir, g_strerror (errno));
-
 	g_test_add ("/gck/crypto/encrypt", Test, NULL, setup, test_encrypt, teardown);
 	g_test_add ("/gck/crypto/decrypt", Test, NULL, setup, test_decrypt, teardown);
 	g_test_add ("/gck/crypto/login_context_specific", Test, NULL, setup, test_login_context_specific, teardown);
diff --git a/gck/tests/test-gck-enumerator.c b/gck/tests/test-gck-enumerator.c
index a92128b..83458f0 100644
--- a/gck/tests/test-gck-enumerator.c
+++ b/gck/tests/test-gck-enumerator.c
@@ -48,7 +48,7 @@ setup (Test *test, gconstpointer unused)
 	GError *err = NULL;
 
 	/* Successful load */
-	test->module = gck_module_initialize (".libs/libmock-test-module.so", NULL, 0, &err);
+	test->module = gck_module_initialize (BUILDDIR "/.libs/libmock-test-module.so", NULL, 0, &err);
 	g_assert_no_error (err);
 	g_assert (GCK_IS_MODULE (test->module));
 
@@ -266,15 +266,9 @@ test_token_match (Test *test, gconstpointer unused)
 int
 main (int argc, char **argv)
 {
-	const gchar *srcdir;
-
 	g_type_init ();
 	g_test_init (&argc, &argv, NULL);
 
-	srcdir = g_getenv ("SRCDIR");
-	if (srcdir && chdir (srcdir) < 0)
-		g_error ("couldn't change directory to: %s: %s", srcdir, g_strerror (errno));
-
 	g_test_add ("/gck/enumerator/create", Test, NULL, setup, test_create, teardown);
 	g_test_add ("/gck/enumerator/create_slots", Test, NULL, setup, test_create_slots, teardown);
 	g_test_add ("/gck/enumerator/next", Test, NULL, setup, test_next, teardown);
diff --git a/gck/tests/test-gck-module.c b/gck/tests/test-gck-module.c
index 48050b2..4e6a337 100644
--- a/gck/tests/test-gck-module.c
+++ b/gck/tests/test-gck-module.c
@@ -40,7 +40,7 @@ setup (Test *test, gconstpointer unused)
 	GError *err = NULL;
 
 	/* Successful load */
-	test->module = gck_module_initialize (".libs/libmock-test-module.so", NULL, 0, &err);
+	test->module = gck_module_initialize (BUILDDIR "/.libs/libmock-test-module.so", NULL, 0, &err);
 	g_assert_no_error (err);
 	g_assert (test->module);
 }
@@ -101,7 +101,7 @@ test_module_props (Test *test, gconstpointer unused)
 
 	g_object_get (test->module, "path", &path, NULL);
 	g_assert (path != NULL && "no module-path");
-	g_assert (strcmp (".libs/libmock-test-module.so", path) == 0 && "module path wrong");
+	g_assert (strcmp (BUILDDIR "/.libs/libmock-test-module.so", path) == 0 && "module path wrong");
 	g_free (path);
 }
 
@@ -127,15 +127,9 @@ test_module_info (Test *test, gconstpointer unused)
 int
 main (int argc, char **argv)
 {
-	const gchar *srcdir;
-
 	g_type_init ();
 	g_test_init (&argc, &argv, NULL);
 
-	srcdir = g_getenv ("SRCDIR");
-	if (srcdir && chdir (srcdir) < 0)
-		g_error ("couldn't change directory to: %s: %s", srcdir, g_strerror (errno));
-
 	g_test_add ("/gck/module/invalid_modules", Test, NULL, setup, test_invalid_modules, teardown);
 	g_test_add ("/gck/module/module_equals_hash", Test, NULL, setup, test_module_equals_hash, teardown);
 	g_test_add ("/gck/module/module_props", Test, NULL, setup, test_module_props, teardown);
diff --git a/gck/tests/test-gck-modules.c b/gck/tests/test-gck-modules.c
index 0fe287e..3b38d05 100644
--- a/gck/tests/test-gck-modules.c
+++ b/gck/tests/test-gck-modules.c
@@ -48,7 +48,7 @@ setup (Test *test, gconstpointer unused)
 	GError *err = NULL;
 
 	/* Successful load */
-	module = gck_module_initialize (".libs/libmock-test-module.so", NULL, 0, &err);
+	module = gck_module_initialize (BUILDDIR "/.libs/libmock-test-module.so", NULL, 0, &err);
 	g_assert_no_error (err);
 	g_assert (GCK_IS_MODULE (module));
 
@@ -193,15 +193,9 @@ test_enumerate_uri (Test *test, gconstpointer unused)
 int
 main (int argc, char **argv)
 {
-	const gchar *srcdir;
-
 	g_type_init ();
 	g_test_init (&argc, &argv, NULL);
 
-	srcdir = g_getenv ("SRCDIR");
-	if (srcdir && chdir (srcdir) < 0)
-		g_error ("couldn't change directory to: %s: %s", srcdir, g_strerror (errno));
-
 	g_test_add ("/gck/modules/enumerate_objects", Test, NULL, setup, test_enumerate_objects, teardown);
 	g_test_add ("/gck/modules/token_for_uri", Test, NULL, setup, test_token_for_uri, teardown);
 	g_test_add ("/gck/modules/token_for_uri_not_found", Test, NULL, setup, test_token_for_uri_not_found, teardown);
diff --git a/gck/tests/test-gck-object.c b/gck/tests/test-gck-object.c
index e41e4db..672a102 100644
--- a/gck/tests/test-gck-object.c
+++ b/gck/tests/test-gck-object.c
@@ -50,7 +50,7 @@ setup (Test *test, gconstpointer unused)
 	GList *slots;
 
 	/* Successful load */
-	test->module = gck_module_initialize (".libs/libmock-test-module.so", NULL, 0, &err);
+	test->module = gck_module_initialize (BUILDDIR "/.libs/libmock-test-module.so", NULL, 0, &err);
 	g_assert_no_error (err);
 	g_assert (GCK_IS_MODULE (test->module));
 
@@ -403,15 +403,9 @@ test_find_objects (Test *test, gconstpointer unused)
 int
 main (int argc, char **argv)
 {
-	const gchar *srcdir;
-
 	g_type_init ();
 	g_test_init (&argc, &argv, NULL);
 
-	srcdir = g_getenv ("SRCDIR");
-	if (srcdir && chdir (srcdir) < 0)
-		g_error ("couldn't change directory to: %s: %s", srcdir, g_strerror (errno));
-
 	g_test_add ("/gck/object/object_props", Test, NULL, setup, test_object_props, teardown);
 	g_test_add ("/gck/object/object_equals_hash", Test, NULL, setup, test_object_equals_hash, teardown);
 	g_test_add ("/gck/object/create_object", Test, NULL, setup, test_create_object, teardown);
diff --git a/gck/tests/test-gck-session.c b/gck/tests/test-gck-session.c
index 5cc1564..356819b 100644
--- a/gck/tests/test-gck-session.c
+++ b/gck/tests/test-gck-session.c
@@ -48,7 +48,7 @@ setup (Test *test, gconstpointer unused)
 	GList *slots;
 
 	/* Successful load */
-	test->module = gck_module_initialize (".libs/libmock-test-module.so", NULL, 0, &err);
+	test->module = gck_module_initialize (BUILDDIR "/.libs/libmock-test-module.so", NULL, 0, &err);
 	g_assert_no_error (err);
 	g_assert (GCK_IS_MODULE (test->module));
 
@@ -303,15 +303,9 @@ test_auto_login (Test *test, gconstpointer unused)
 int
 main (int argc, char **argv)
 {
-	const gchar *srcdir;
-
 	g_type_init ();
 	g_test_init (&argc, &argv, NULL);
 
-	srcdir = g_getenv ("SRCDIR");
-	if (srcdir && chdir (srcdir) < 0)
-		g_error ("couldn't change directory to: %s: %s", srcdir, g_strerror (errno));
-
 	g_test_add ("/gck/session/session_props", Test, NULL, setup, test_session_props, teardown);
 	g_test_add ("/gck/session/session_info", Test, NULL, setup, test_session_info, teardown);
 	g_test_add ("/gck/session/open_close_session", Test, NULL, setup, test_open_close_session, teardown);
diff --git a/gck/tests/test-gck-slot.c b/gck/tests/test-gck-slot.c
index e36dc6d..8a61479 100644
--- a/gck/tests/test-gck-slot.c
+++ b/gck/tests/test-gck-slot.c
@@ -43,7 +43,7 @@ setup (Test *test, gconstpointer unused)
 	GList *slots;
 
 	/* Successful load */
-	test->module = gck_module_initialize (".libs/libmock-test-module.so", NULL, 0, &err);
+	test->module = gck_module_initialize (BUILDDIR "/.libs/libmock-test-module.so", NULL, 0, &err);
 	g_assert_no_error (err);
 	g_assert (GCK_IS_MODULE (test->module));
 
@@ -242,15 +242,9 @@ test_token_info_match_different (Test *test, gconstpointer unused)
 int
 main (int argc, char **argv)
 {
-	const gchar *srcdir;
-
 	g_type_init ();
 	g_test_init (&argc, &argv, NULL);
 
-	srcdir = g_getenv ("SRCDIR");
-	if (srcdir && chdir (srcdir) < 0)
-		g_error ("couldn't change directory to: %s: %s", srcdir, g_strerror (errno));
-
 	g_test_add ("/gck/slot/slot_info", Test, NULL, setup, test_slot_info, teardown);
 	g_test_add ("/gck/slot/slot_props", Test, NULL, setup, test_slot_props, teardown);
 	g_test_add ("/gck/slot/slot_equals_hash", Test, NULL, setup, test_slot_equals_hash, teardown);
diff --git a/gck/tests/test-gck-uri.c b/gck/tests/test-gck-uri.c
index 865aa0f..8483ed9 100644
--- a/gck/tests/test-gck-uri.c
+++ b/gck/tests/test-gck-uri.c
@@ -519,15 +519,9 @@ null_log_handler (const gchar *log_domain, GLogLevelFlags log_level,
 int
 main (int argc, char **argv)
 {
-	const gchar *srcdir;
-
 	g_type_init ();
 	g_test_init (&argc, &argv, NULL);
 
-	srcdir = g_getenv ("SRCDIR");
-	if (srcdir && chdir (srcdir) < 0)
-		g_error ("couldn't change directory to: %s: %s", srcdir, g_strerror (errno));
-
 	/* Suppress these messages in tests */
 	g_log_set_handler (G_LOG_DOMAIN, G_LOG_LEVEL_MESSAGE | G_LOG_LEVEL_INFO | G_LOG_LEVEL_DEBUG,
 	                   null_log_handler, NULL);
diff --git a/gcr/tests/Makefile.am b/gcr/tests/Makefile.am
index 544a406..9d16168 100644
--- a/gcr/tests/Makefile.am
+++ b/gcr/tests/Makefile.am
@@ -1,8 +1,8 @@
 
 INCLUDES = \
-	-I$(top_srcdir)/egg \
-	-I$(top_srcdir)/gcr \
-	-DSRCDIR=$(srcdir) \
+	-I$(top_builddir) \
+	-I$(top_srcdir) \
+	-DSRCDIR="\"$(srcdir)\"" \
 	-DGCR_API_SUBJECT_TO_CHANGE \
 	-DGCK_API_SUBJECT_TO_CHANGE \
 	$(GLIB_CFLAGS) \
@@ -29,7 +29,7 @@ TEST_PROGS = \
 check_PROGRAMS = $(TEST_PROGS)
 
 test: $(TEST_PROGS)
-	SRCDIR='$(srcdir)' gtester -k --verbose -m $(TEST_MODE) --g-fatal-warnings $(TEST_PROGS)
+	gtester -k --verbose -m $(TEST_MODE) --g-fatal-warnings $(TEST_PROGS)
 
 check-local: test
 
diff --git a/gcr/tests/frob-certificate.c b/gcr/tests/frob-certificate.c
index d14215c..667a42f 100644
--- a/gcr/tests/frob-certificate.c
+++ b/gcr/tests/frob-certificate.c
@@ -105,7 +105,7 @@ main(int argc, char *argv[])
 		test_certificate (argv[1]);
 	} else {
 		chdir_base_dir (argv[0]);
-		test_certificate ("files/der-certificate.crt");
+		test_certificate (SRCDIR "/files/der-certificate.crt");
 	}
 
 	return 0;
diff --git a/gcr/tests/frob-key.c b/gcr/tests/frob-key.c
index cd71b01..3292e2f 100644
--- a/gcr/tests/frob-key.c
+++ b/gcr/tests/frob-key.c
@@ -103,7 +103,7 @@ main(int argc, char *argv[])
 		test_key (argv[1]);
 	} else {
 		chdir_base_dir (argv[0]);
-		test_key ("files/pem-dsa-1024.key");
+		test_key (SRCDIR "/files/pem-dsa-1024.key");
 	}
 
 	return 0;
diff --git a/gcr/tests/test-certificate-chain.c b/gcr/tests/test-certificate-chain.c
index ade0eac..b0bedfb 100644
--- a/gcr/tests/test-certificate-chain.c
+++ b/gcr/tests/test-certificate-chain.c
@@ -155,19 +155,19 @@ setup (Test *test, gconstpointer unused)
 	gck_list_unref_free (modules);
 
 	/* A self-signed certificate */
-	if (!g_file_get_contents ("files/der-certificate.crt", &contents, &n_contents, NULL))
+	if (!g_file_get_contents (SRCDIR "/files/der-certificate.crt", &contents, &n_contents, NULL))
 		g_assert_not_reached ();
 	test->cert_self = gcr_simple_certificate_new (contents, n_contents);
 	g_free (contents);
 
 	/* A signed certificate */
-	if (!g_file_get_contents ("files/dhansak-collabora.cer", &contents, &n_contents, NULL))
+	if (!g_file_get_contents (SRCDIR "/files/dhansak-collabora.cer", &contents, &n_contents, NULL))
 		g_assert_not_reached ();
 	test->cert_signed = mock_certificate_new (contents, n_contents);
 	g_free (contents);
 
 	/* The signer for the above certificate */
-	if (!g_file_get_contents ("files/collabora-ca.cer", &contents, &n_contents, NULL))
+	if (!g_file_get_contents (SRCDIR "/files/collabora-ca.cer", &contents, &n_contents, NULL))
 		g_assert_not_reached ();
 	test->cert_ca = mock_certificate_new (contents, n_contents);
 	g_free (contents);
@@ -632,16 +632,10 @@ test_with_anchor_error_async (Test *test, gconstpointer unused)
 int
 main (int argc, char **argv)
 {
-	const gchar *srcdir;
-
 	g_type_init ();
 	g_test_init (&argc, &argv, NULL);
 	g_set_prgname ("test-certificate-chain");
 
-	srcdir = g_getenv ("SRCDIR");
-	if (srcdir && chdir (srcdir) < 0)
-		g_error ("couldn't change directory to: %s: %s", srcdir, g_strerror (errno));
-
 	g_test_add ("/gcr/certificate-chain/new", Test, NULL, setup, test_new, teardown);
 	g_test_add ("/gcr/certificate-chain/new_with_cert", Test, NULL, setup, test_new_with_cert, teardown);
 	g_test_add ("/gcr/certificate-chain/selfsigned", Test, NULL, setup, test_selfsigned, teardown);
diff --git a/gcr/tests/test-certificate.c b/gcr/tests/test-certificate.c
index 137fe2a..aed032d 100644
--- a/gcr/tests/test-certificate.c
+++ b/gcr/tests/test-certificate.c
@@ -44,19 +44,19 @@ setup (Test *test, gconstpointer unused)
 	gchar *contents;
 	gsize n_contents;
 
-	if (!g_file_get_contents ("files/der-certificate.crt", &contents, &n_contents, NULL))
+	if (!g_file_get_contents (SRCDIR "/files/der-certificate.crt", &contents, &n_contents, NULL))
 		g_assert_not_reached ();
 	test->certificate = gcr_simple_certificate_new (contents, n_contents);
 	g_assert (test->certificate);
 	g_free (contents);
 
-	if (!g_file_get_contents ("files/der-certificate-dsa.cer", &contents, &n_contents, NULL))
+	if (!g_file_get_contents (SRCDIR "/files/der-certificate-dsa.cer", &contents, &n_contents, NULL))
 		g_assert_not_reached ();
 	test->dsa_cert = gcr_simple_certificate_new (contents, n_contents);
 	g_assert (test->dsa_cert);
 	g_free (contents);
 
-	if (!g_file_get_contents ("files/dhansak-collabora.cer", &contents, &n_contents, NULL))
+	if (!g_file_get_contents (SRCDIR "/files/dhansak-collabora.cer", &contents, &n_contents, NULL))
 		g_assert_not_reached ();
 	test->dhansak_cert = gcr_simple_certificate_new (contents, n_contents);
 	g_assert (test->certificate);
@@ -255,16 +255,10 @@ test_certificate_is_issuer (Test *test, gconstpointer unused)
 int
 main (int argc, char **argv)
 {
-	const gchar *srcdir;
-
 	g_type_init ();
 	g_test_init (&argc, &argv, NULL);
 	g_set_prgname ("test-certificate");
 
-	srcdir = g_getenv ("SRCDIR");
-	if (srcdir && chdir (srcdir) < 0)
-		g_error ("couldn't change directory to: %s: %s", srcdir, g_strerror (errno));
-
 	g_test_add ("/gcr/certificate/issuer_cn", Test, NULL, setup, test_issuer_cn, teardown);
 	g_test_add ("/gcr/certificate/issuer_dn", Test, NULL, setup, test_issuer_dn, teardown);
 	g_test_add ("/gcr/certificate/issuer_part", Test, NULL, setup, test_issuer_part, teardown);
diff --git a/gcr/tests/test-parser.c b/gcr/tests/test-parser.c
index e8c5e30..39fbefc 100644
--- a/gcr/tests/test-parser.c
+++ b/gcr/tests/test-parser.c
@@ -121,7 +121,7 @@ test_parse_all (Test *test, gconstpointer unused)
 	gsize len;
 	GDir *dir;
 
-	dir = g_dir_open ("files", 0, NULL);
+	dir = g_dir_open (SRCDIR "/files", 0, NULL);
 	g_assert (dir);
 
 	for (;;) {
@@ -132,7 +132,7 @@ test_parse_all (Test *test, gconstpointer unused)
 			continue;
 
 		g_free (test->filedesc);
-		test->filedesc = g_build_filename ("files", filename, NULL);
+		test->filedesc = g_build_filename (SRCDIR "/files", filename, NULL);
 
 		if (g_file_test (test->filedesc, G_FILE_TEST_IS_DIR))
 			continue;
@@ -157,16 +157,10 @@ test_parse_all (Test *test, gconstpointer unused)
 int
 main (int argc, char **argv)
 {
-	const gchar *srcdir;
-
 	g_type_init ();
 	g_test_init (&argc, &argv, NULL);
 	g_set_prgname ("test-parser");
 
-	srcdir = g_getenv ("SRCDIR");
-	if (srcdir && chdir (srcdir) < 0)
-		g_error ("couldn't change directory to: %s: %s", srcdir, g_strerror (errno));
-
 	g_test_add ("/gcr/parser/parse_all", Test, NULL, setup, test_parse_all, teardown);
 
 	return g_test_run ();
diff --git a/gcr/tests/test-pkcs11-certificate.c b/gcr/tests/test-pkcs11-certificate.c
index c5d4c90..feed864 100644
--- a/gcr/tests/test-pkcs11-certificate.c
+++ b/gcr/tests/test-pkcs11-certificate.c
@@ -25,7 +25,7 @@
 #include "egg/egg-asn1x.h"
 #include "egg/egg-asn1-defs.h"
 
-#include "gcr.h"
+#include "gcr/gcr.h"
 #include "gcr/gcr-internal.h"
 
 #include "egg/egg-testing.h"
@@ -59,12 +59,12 @@ setup (Test *test, gconstpointer unused)
 	GNode *asn, *node;
 	CK_RV rv;
 
-	if (!g_file_get_contents ("files/der-certificate.crt", (gchar**)&test->cert_data,
+	if (!g_file_get_contents (SRCDIR "/files/der-certificate.crt", (gchar**)&test->cert_data,
 	                          &test->n_cert_data, NULL))
 		g_assert_not_reached ();
 	g_assert (test->cert_data);
 
-	if (!g_file_get_contents ("files/der-certificate-dsa.cer", (gchar**)&test->cert2_data,
+	if (!g_file_get_contents (SRCDIR "/files/der-certificate-dsa.cer", (gchar**)&test->cert2_data,
 	                          &test->n_cert2_data, NULL))
 		g_assert_not_reached ();
 	g_assert (test->cert2_data);
@@ -265,16 +265,10 @@ test_lookup_certificate_issuer_fail_async (Test *test, gconstpointer unused)
 int
 main (int argc, char **argv)
 {
-	const gchar *srcdir;
-
 	g_type_init ();
 	g_test_init (&argc, &argv, NULL);
 	g_set_prgname ("test-pkcs11-certificate");
 
-	srcdir = g_getenv ("SRCDIR");
-	if (srcdir && chdir (srcdir) < 0)
-		g_error ("couldn't change directory to: %s: %s", srcdir, g_strerror (errno));
-
 	g_test_add ("/gcr/pkcs11-certificate/lookup_certificate_issuer", Test, NULL, setup, test_lookup_certificate_issuer, teardown);
 	g_test_add ("/gcr/pkcs11-certificate/lookup_certificate_issuer_not_found", Test, NULL, setup, test_lookup_certificate_issuer_not_found, teardown);
 	g_test_add ("/gcr/pkcs11-certificate/lookup_certificate_issuer_async", Test, NULL, setup, test_lookup_certificate_issuer_async, teardown);
diff --git a/gcr/tests/test-simple-certificate.c b/gcr/tests/test-simple-certificate.c
index 707d294..f3039cb 100644
--- a/gcr/tests/test-simple-certificate.c
+++ b/gcr/tests/test-simple-certificate.c
@@ -22,7 +22,7 @@
 
 #include "config.h"
 
-#include "gcr.h"
+#include "gcr/gcr.h"
 #include "gcr/gcr-internal.h"
 
 #include "gck/gck-test.h"
@@ -43,7 +43,7 @@ typedef struct {
 static void
 setup (Test *test, gconstpointer unused)
 {
-	if (!g_file_get_contents ("files/der-certificate.crt", (gchar**)&test->cert_data,
+	if (!g_file_get_contents (SRCDIR "/files/der-certificate.crt", (gchar**)&test->cert_data,
 	                          &test->n_cert_data, NULL))
 		g_assert_not_reached ();
 	g_assert (test->cert_data);
@@ -93,16 +93,10 @@ test_new_static (Test *test, gconstpointer unused)
 int
 main (int argc, char **argv)
 {
-	const gchar *srcdir;
-
 	g_type_init ();
 	g_test_init (&argc, &argv, NULL);
 	g_set_prgname ("test-simple-certificate");
 
-	srcdir = g_getenv ("SRCDIR");
-	if (srcdir && chdir (srcdir) < 0)
-		g_error ("couldn't change directory to: %s: %s", srcdir, g_strerror (errno));
-
 	g_test_add ("/gcr/simple-certificate/new", Test, NULL, setup, test_new, teardown);
 	g_test_add ("/gcr/simple-certificate/new_static", Test, NULL, setup, test_new_static, teardown);
 
diff --git a/gcr/tests/test-trust.c b/gcr/tests/test-trust.c
index a7a33eb..1ddf8a8 100644
--- a/gcr/tests/test-trust.c
+++ b/gcr/tests/test-trust.c
@@ -22,7 +22,7 @@
 
 #include "config.h"
 
-#include "gcr.h"
+#include "gcr/gcr.h"
 #include "gcr/gcr-internal.h"
 
 #include "gck/gck-mock.h"
@@ -54,7 +54,7 @@ setup (Test *test, gconstpointer unused)
 	gsize len;
 	CK_RV rv;
 
-	if (!g_file_get_contents ("files/der-certificate.crt", &contents, &len, NULL))
+	if (!g_file_get_contents (SRCDIR "/files/der-certificate.crt", &contents, &len, NULL))
 		g_assert_not_reached ();
 	g_assert (contents);
 
@@ -309,16 +309,10 @@ test_is_certificate_anchored_async (Test *test, gconstpointer unused)
 int
 main (int argc, char **argv)
 {
-	const gchar *srcdir;
-
 	g_type_init ();
 	g_test_init (&argc, &argv, NULL);
 	g_set_prgname ("test-trust");
 
-	srcdir = g_getenv ("SRCDIR");
-	if (srcdir && chdir (srcdir) < 0)
-		g_error ("couldn't change directory to: %s: %s", srcdir, g_strerror (errno));
-
 	g_test_add ("/gcr/trust/is_pinned_none", Test, NULL, setup, test_is_pinned_none, teardown);
 	g_test_add ("/gcr/trust/add_and_is_pinned", Test, NULL, setup, test_add_and_is_pinned, teardown);
 	g_test_add ("/gcr/trust/add_certificate_pinned_fail", Test, NULL, setup, test_add_certificate_pinned_fail, teardown);
diff --git a/pkcs11/gkm/tests/Makefile.am b/pkcs11/gkm/tests/Makefile.am
index c49d4ac..27ef48d 100644
--- a/pkcs11/gkm/tests/Makefile.am
+++ b/pkcs11/gkm/tests/Makefile.am
@@ -1,8 +1,9 @@
 
 INCLUDES = \
-	-I$(top_srcdir)/egg \
+	-I$(top_builddir) \
+	-I$(top_srcdir) \
 	-I$(top_srcdir)/pkcs11 \
-	-DSRCDIR=$(srcdir) \
+	-DSRCDIR="\"$(srcdir)\"" \
 	$(GLIB_CFLAGS) \
 	$(LIBGCRYPT_CFLAGS)
 
@@ -59,7 +60,7 @@ test_timer_LDADD = \
 check_PROGRAMS = $(TEST_PROGS)
 
 test: $(TEST_PROGS)
-	SRCDIR='$(srcdir)' gtester -k --verbose -m $(TEST_MODE) --g-fatal-warnings $(TEST_PROGS)
+	gtester -k --verbose -m $(TEST_MODE) --g-fatal-warnings $(TEST_PROGS)
 
 check-local: test
 
@@ -71,3 +72,6 @@ asn1-def-test.h: test.asn
 EXTRA_DIST = \
 	test.asn \
 	files
+
+DISTCLEANFILES = \
+	$(BUILT_SOURCES)
diff --git a/pkcs11/gkm/tests/mock-module.c b/pkcs11/gkm/tests/mock-module.c
index b53544b..3abe116 100644
--- a/pkcs11/gkm/tests/mock-module.c
+++ b/pkcs11/gkm/tests/mock-module.c
@@ -110,7 +110,7 @@ mock_module_object_new (GkmSession *session)
 		{ CKA_CERTIFICATE_TYPE, &type, sizeof (type) },
 	};
 
-	if (!g_file_get_contents ("files/test-certificate-1.der", &data, &n_data, NULL))
+	if (!g_file_get_contents (SRCDIR "/files/test-certificate-1.der", &data, &n_data, NULL))
 		g_assert_not_reached ();
 
 	attrs[0].pValue = data;
diff --git a/pkcs11/gkm/tests/test-data-asn1.c b/pkcs11/gkm/tests/test-data-asn1.c
index d6e3dec..b29ea0b 100644
--- a/pkcs11/gkm/tests/test-data-asn1.c
+++ b/pkcs11/gkm/tests/test-data-asn1.c
@@ -47,7 +47,7 @@ typedef struct {
 static void
 setup (Test *test, gconstpointer unused)
 {
-	if (!g_file_get_contents ("files/test-certificate-1.der", &test->data_cert, &test->n_data_cert, NULL))
+	if (!g_file_get_contents (SRCDIR "/files/test-certificate-1.der", &test->data_cert, &test->n_data_cert, NULL))
 		g_assert_not_reached ();
 
 	test->asn1_cert = egg_asn1x_create_and_decode (pkix_asn1_tab, "Certificate", test->data_cert, test->n_data_cert);
diff --git a/pkcs11/gkm/tests/test-data-der.c b/pkcs11/gkm/tests/test-data-der.c
index 6be10c6..57823ac 100644
--- a/pkcs11/gkm/tests/test-data-der.c
+++ b/pkcs11/gkm/tests/test-data-der.c
@@ -116,11 +116,11 @@ test_der_public (gcry_sexp_t key)
 static void
 setup (Test *test, gconstpointer unused)
 {
-	if (!g_file_get_contents ("files/test-certificate-1.der", &test->certificate_data, &test->n_certificate_data, NULL))
+	if (!g_file_get_contents (SRCDIR "/files/test-certificate-1.der", &test->certificate_data, &test->n_certificate_data, NULL))
 		g_assert_not_reached ();
 	test->certificate = egg_asn1x_create_and_decode (pkix_asn1_tab, "Certificate", test->certificate_data, test->n_certificate_data);
 	g_assert (test->certificate);
-	if (!g_file_get_contents ("files/test-certificate-2.der", &test->certificate2_data, &test->n_certificate2_data, NULL))
+	if (!g_file_get_contents (SRCDIR "/files/test-certificate-2.der", &test->certificate2_data, &test->n_certificate2_data, NULL))
 		g_assert_not_reached ();
 	test->certificate2 = egg_asn1x_create_and_decode (pkix_asn1_tab, "Certificate", test->certificate2_data, test->n_certificate2_data);
 	g_assert (test->certificate2);
@@ -331,7 +331,7 @@ test_read_ca_certificates_public_key_info (Test *test, gconstpointer unused)
 	gchar *data;
 	gsize n_data;
 
-	if (!g_file_get_contents ("files/ca-certificates.crt", &data, &n_data, NULL))
+	if (!g_file_get_contents (SRCDIR "/files/ca-certificates.crt", &data, &n_data, NULL))
 		g_assert_not_reached ();
 	egg_openssl_pem_parse (data, n_data, on_ca_certificate_public_key_info, NULL);
 	g_free (data);
@@ -432,7 +432,7 @@ test_read_all_pkcs8 (Test *test, gconstpointer unused)
 	gsize n_data;
 	gchar *path;
 
-	dir = g_dir_open ("files", 0, NULL);
+	dir = g_dir_open (SRCDIR "/files", 0, NULL);
 	g_assert (dir);
 
 	for(;;) {
@@ -443,7 +443,7 @@ test_read_all_pkcs8 (Test *test, gconstpointer unused)
 		if (!g_pattern_match_simple ("der-pkcs8-*", name))
 			continue;
 
-		path = g_build_filename ("files", name, NULL);
+		path = g_build_filename (SRCDIR "/files", name, NULL);
 		if (!g_file_get_contents (path, &data, &n_data, NULL))
 			g_assert_not_reached ();
 		g_free (path);
@@ -467,7 +467,7 @@ test_read_pkcs8_bad_password (Test *test, gconstpointer unused)
 	gchar *data;
 	gsize n_data;
 
-	if (!g_file_get_contents ("files/der-pkcs8-encrypted-pkcs5.key", &data, &n_data, NULL))
+	if (!g_file_get_contents (SRCDIR "/files/der-pkcs8-encrypted-pkcs5.key", &data, &n_data, NULL))
 		g_assert_not_reached ();
 
 	res = gkm_data_der_read_private_pkcs8 (data, n_data, "wrong password", 4, &sexp);
diff --git a/pkcs11/gkm/tests/test-object.c b/pkcs11/gkm/tests/test-object.c
index 0c3c826..00fa770 100644
--- a/pkcs11/gkm/tests/test-object.c
+++ b/pkcs11/gkm/tests/test-object.c
@@ -48,7 +48,7 @@ setup (Test* test, gconstpointer unused)
 	test->module = mock_module_initialize_and_enter ();
 	test->session = mock_module_open_session (TRUE);
 
-	if (!g_file_get_contents ("files/test-certificate-1.der", &test->certificate_data, &test->n_certificate_data, NULL))
+	if (!g_file_get_contents (SRCDIR "/files/test-certificate-1.der", &test->certificate_data, &test->n_certificate_data, NULL))
 		g_assert_not_reached ();
 }
 
diff --git a/pkcs11/gnome2-store/tests/Makefile.am b/pkcs11/gnome2-store/tests/Makefile.am
index 458ee25..dbf0ade 100644
--- a/pkcs11/gnome2-store/tests/Makefile.am
+++ b/pkcs11/gnome2-store/tests/Makefile.am
@@ -1,29 +1,45 @@
 
-TESTING_FILES = \
-	unit-test-gnome2-file.c \
-	test-module.c
-
-TESTING_LIBS = \
+INCLUDES = \
+	-I$(top_builddir) \
+	-I$(top_srcdir) \
+	-I$(top_srcdir)/pkcs11 \
+	-DSRCDIR="\"$(srcdir)\"" \
+	$(GLIB_CFLAGS) \
+	$(LIBGCRYPT_CFLAGS)
+
+LDADD = \
 	$(top_builddir)/pkcs11/gnome2-store/libgkm-gnome2-store.la \
 	$(top_builddir)/pkcs11/gkm/libgkm.la \
-	$(top_builddir)/egg/libegg.la
+	$(top_builddir)/egg/libegg.la \
+	$(GLIB_LIBS) \
+	$(LIBGCRYPT_LIBS)
 
-include $(top_srcdir)/testing/testing.make
+if WITH_P11_TESTS
+CHECK_PROGS = check-gnome2-module
+else
+CHECK_PROGS =
+endif
 
-EXTRA_DIST += \
-	test-data \
-	p11-tests.conf
+TEST_PROGS = \
+	test-gnome2-file
 
-# ---------------------------------------------------------------------
+check_PROGRAMS = $(TEST_PROGS)
 
-noinst_PROGRAMS += \
-	dump-gnome2-file
+test: $(TEST_PROGS) $(CHECK_PROGS)
+	gtester -k --verbose -m $(TEST_MODE) --g-fatal-warnings $(TEST_PROGS)
+	@for prog in $(CHECK_PROGS); do SRCDIR='.' ./$$prog || exit 1; done
 
-dump_gnome2_file_SOURCES = \
-	dump-gnome2-file.c
+check-local: test
 
-dump_gnome2_file_LDADD = \
-	$(top_builddir)/pkcs11/gkm/libgkm.la \
-	$(top_builddir)/pkcs11/gnome2-store/libgkm-gnome2-store.la \
-	$(top_builddir)/egg/libegg.la \
-	$(DAEMON_LIBS)
+all-local: $(check_PROGRAMS)
+
+EXTRA_DIST = \
+	p11-tests.conf \
+	files
+
+noinst_PROGRAMS = \
+	frob-gnome2-file \
+	$(CHECK_PROGS)
+
+check_gnome2_module_CFLAGS = $(P11_TESTS_CFLAGS)
+check_gnome2_module_LDADD = $(P11_TESTS_LIBS) $(LDADD)
diff --git a/pkcs11/gnome2-store/tests/check-gnome2-module.c b/pkcs11/gnome2-store/tests/check-gnome2-module.c
new file mode 100644
index 0000000..5385778
--- /dev/null
+++ b/pkcs11/gnome2-store/tests/check-gnome2-module.c
@@ -0,0 +1,68 @@
+/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */
+/* check-module.c: Check PKCS#11 implementation
+
+   Copyright (C) 2009 Stefan Walter
+
+   The Gnome Keyring Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Library General Public License as
+   published by the Free Software Foundation; either version 2 of the
+   License, or (at your option) any later version.
+
+   The Gnome Keyring 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
+   Library General Public License for more details.
+
+   You should have received a copy of the GNU Library General Public
+   License along with the Gnome Library; see the file COPYING.LIB.  If not,
+   write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+   Boston, MA 02111-1307, USA.
+
+   Author: Stef Walter <stef memberwebs com>
+*/
+
+#include "config.h"
+
+#include "gnome2-store/gkm-gnome2-store.h"
+
+#include "egg/egg-secure-memory.h"
+
+#include <glib.h>
+#include <glib-object.h>
+
+#include <p11-tests.h>
+
+static int failures = 0;
+
+EGG_SECURE_GLIB_DEFINITIONS ();
+
+static void
+on_p11_tests_log (int level, const char *section, const char *message)
+{
+	if (level == P11_TESTS_NONE) {
+		g_message ("%s", message);
+	} else if (level != P11_TESTS_FAIL) {
+		g_message ("%s: %s", section, message);
+	} else {
+		g_print ("  /gnome2-store/%s: FAIL: %s\n", section, message);
+		++failures;
+	}
+}
+
+int
+main (int argc, const char *argv[])
+{
+	g_type_init ();
+
+	p11_tests_set_log_func (on_p11_tests_log);
+	p11_tests_set_unexpected (1);
+	p11_tests_set_verbose (0);
+	p11_tests_set_write_session (1);
+	p11_tests_load_config (SRCDIR "/p11-tests.conf");
+
+	g_print ("CHECK: check-gnome2-module...\n");
+	p11_tests_perform (gkm_gnome2_store_get_functions ());
+
+	g_print ("%s: check-gnome2-module\n", failures ? "FAIL" : "PASS");
+	return failures;
+}
diff --git a/pkcs11/gnome2-store/tests/test-data/.gitempty b/pkcs11/gnome2-store/tests/files/.gitempty
similarity index 100%
rename from pkcs11/gnome2-store/tests/test-data/.gitempty
rename to pkcs11/gnome2-store/tests/files/.gitempty
diff --git a/pkcs11/gnome2-store/tests/test-data/data-file-private.store b/pkcs11/gnome2-store/tests/files/data-file-private.store
similarity index 100%
rename from pkcs11/gnome2-store/tests/test-data/data-file-private.store
rename to pkcs11/gnome2-store/tests/files/data-file-private.store
diff --git a/pkcs11/gnome2-store/tests/test-data/data-file-public.store b/pkcs11/gnome2-store/tests/files/data-file-public.store
similarity index 100%
rename from pkcs11/gnome2-store/tests/test-data/data-file-public.store
rename to pkcs11/gnome2-store/tests/files/data-file-public.store
diff --git a/pkcs11/gnome2-store/tests/dump-gnome2-file.c b/pkcs11/gnome2-store/tests/frob-gnome2-file.c
similarity index 97%
rename from pkcs11/gnome2-store/tests/dump-gnome2-file.c
rename to pkcs11/gnome2-store/tests/frob-gnome2-file.c
index 5b2e579..e3515ef 100644
--- a/pkcs11/gnome2-store/tests/dump-gnome2-file.c
+++ b/pkcs11/gnome2-store/tests/frob-gnome2-file.c
@@ -21,7 +21,9 @@
    Author: Stef Walter <stef memberwebs com>
 */
 
-#include "gkm-gnome2-file.h"
+#include "config.h"
+
+#include "gnome2-store/gkm-gnome2-file.h"
 
 #include "gkm/gkm-crypto.h"
 
diff --git a/pkcs11/gnome2-store/tests/test-gnome2-file.c b/pkcs11/gnome2-store/tests/test-gnome2-file.c
new file mode 100644
index 0000000..7b9d9f8
--- /dev/null
+++ b/pkcs11/gnome2-store/tests/test-gnome2-file.c
@@ -0,0 +1,642 @@
+/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */
+/* unit-test-file-store.c: Test file store functionality
+
+   Copyright (C) 2008 Stefan Walter
+
+   The Gnome Keyring Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Library General Public License as
+   published by the Free Software Foundation; either version 2 of the
+   License, or (at your option) any later version.
+
+   The Gnome Keyring 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
+   Library General Public License for more details.
+
+   You should have received a copy of the GNU Library General Public
+   License along with the Gnome Library; see the file COPYING.LIB.  If not,
+   write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+   Boston, MA 02111-1307, USA.
+
+   Author: Stef Walter <stef memberwebs com>
+*/
+
+#include "config.h"
+
+#include "gnome2-store/gkm-gnome2-file.h"
+
+#include "gkm/gkm-object.h"
+
+#include "egg/egg-libgcrypt.h"
+#include "egg/egg-secure-memory.h"
+
+#include <glib/gstdio.h>
+
+#include <fcntl.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+
+typedef struct {
+	GkmGnome2File *data_file;
+	gchar *public_filename;
+	gchar *private_filename;
+	gchar *write_filename;
+	int write_fd;
+	int public_fd;
+	int private_fd;
+	GkmSecret *login;
+} Test;
+
+EGG_SECURE_GLIB_DEFINITIONS ();
+
+static void
+setup (Test *test, gconstpointer unused)
+{
+	test->public_filename = g_build_filename (SRCDIR "/files", "data-file-public.store", NULL);
+	test->private_filename = g_build_filename (SRCDIR "/files", "data-file-private.store", NULL);
+	test->write_filename = g_build_filename ("/tmp", "unit-test-file.store", NULL);
+
+	test->data_file = gkm_gnome2_file_new ();
+
+	test->public_fd = g_open (test->public_filename, O_RDONLY, 0);
+	test->private_fd = g_open (test->private_filename, O_RDONLY, 0);
+	test->write_fd = g_open (test->write_filename, O_RDWR | O_CREAT | O_TRUNC, S_IRUSR | S_IWUSR);
+	g_assert (test->write_fd != -1);
+
+	test->login = gkm_secret_new ((guchar*)"booo", 4);
+}
+
+static void
+teardown (Test *test, gconstpointer unused)
+{
+	g_free (test->public_filename);
+	g_free (test->private_filename);
+	g_free (test->write_filename);
+
+	g_object_unref (test->data_file);
+
+	if (test->public_fd != -1)
+		close (test->public_fd);
+	if (test->private_fd != -1)
+		close (test->private_fd);
+	if (test->write_fd != -1)
+		close (test->write_fd);
+	test->public_fd = test->private_fd = test->write_fd = -1;
+
+	g_object_unref (test->login);
+}
+
+static void
+test_file_create (Test *test, gconstpointer unused)
+{
+	GkmDataResult res;
+
+	res = gkm_gnome2_file_create_entry (test->data_file, "identifier-public", GKM_GNOME2_FILE_SECTION_PUBLIC);
+	g_assert (res == GKM_DATA_SUCCESS);
+
+	/* Should be able to create private in a new file */
+	res = gkm_gnome2_file_create_entry (test->data_file, "identifier-public", GKM_GNOME2_FILE_SECTION_PRIVATE);
+	g_assert (res == GKM_DATA_SUCCESS);
+}
+
+static void
+test_file_write_value (Test *test, gconstpointer unused)
+{
+	GkmDataResult res;
+
+	/* Can't write when no identifier present */
+	res = gkm_gnome2_file_write_value (test->data_file, "identifier-public", CKA_LABEL, "public-label", 12);
+	g_assert (res == GKM_DATA_UNRECOGNIZED);
+
+	res = gkm_gnome2_file_create_entry (test->data_file, "identifier-public", GKM_GNOME2_FILE_SECTION_PUBLIC);
+	g_assert (res == GKM_DATA_SUCCESS);
+
+	/* Should be able to write now */
+	res = gkm_gnome2_file_write_value (test->data_file, "identifier-public", CKA_LABEL, "public-label", 12);
+	g_assert (res == GKM_DATA_SUCCESS);
+}
+
+static void
+test_file_read_value (Test *test, gconstpointer unused)
+{
+	gconstpointer value = NULL;
+	GkmDataResult res;
+	gsize n_value;
+	guint number = 7778;
+
+	/* Write some stuff in */
+	res = gkm_gnome2_file_create_entry (test->data_file, "ident", GKM_GNOME2_FILE_SECTION_PUBLIC);
+	g_assert (res == GKM_DATA_SUCCESS);
+	res = gkm_gnome2_file_write_value (test->data_file, "ident", CKA_LABEL, "TWO-label", 10);
+	g_assert (res == GKM_DATA_SUCCESS);
+	res = gkm_gnome2_file_write_value (test->data_file, "ident", CKA_VALUE, &number, sizeof (number));
+	g_assert (res == GKM_DATA_SUCCESS);
+
+	/* Read for an invalid item */
+	res = gkm_gnome2_file_read_value (test->data_file, "non-existant", CKA_LABEL, &value, &n_value);
+	g_assert (res == GKM_DATA_UNRECOGNIZED);
+
+	/* Read for an invalid attribute */
+	res = gkm_gnome2_file_read_value (test->data_file, "ident", CKA_ID, &value, &n_value);
+	g_assert (res == GKM_DATA_UNRECOGNIZED);
+
+	/* Read out a valid number */
+	res = gkm_gnome2_file_read_value (test->data_file, "ident", CKA_VALUE, &value, &n_value);
+	g_assert (res == GKM_DATA_SUCCESS);
+	g_assert (value);
+	g_assert (n_value == sizeof (number));
+	g_assert_cmpuint (*((guint*)value), ==, number);
+
+	/* Read out the valid string */
+	res = gkm_gnome2_file_read_value (test->data_file, "ident", CKA_LABEL, &value, &n_value);
+	g_assert (res == GKM_DATA_SUCCESS);
+	g_assert (value);
+	g_assert (n_value == 10);
+	g_assert_cmpstr ((const gchar*)value, ==, "TWO-label");
+}
+
+static void
+test_file_read (Test *test, gconstpointer unused)
+{
+	GkmDataResult res;
+
+	res = gkm_gnome2_file_read_fd (test->data_file, test->public_fd, NULL);
+	g_assert (res == GKM_DATA_SUCCESS);
+}
+
+static void
+test_file_lookup (Test *test, gconstpointer unused)
+{
+	GkmDataResult res;
+	guint section;
+	gboolean ret;
+
+	/* Invalid shouldn't succeed */
+	ret = gkm_gnome2_file_lookup_entry (test->data_file, "non-existant", &section);
+	g_assert (ret == FALSE);
+
+	/* Create a test item */
+	res = gkm_gnome2_file_create_entry (test->data_file, "test-ident", GKM_GNOME2_FILE_SECTION_PUBLIC);
+	g_assert (res == GKM_DATA_SUCCESS);
+
+	ret = gkm_gnome2_file_lookup_entry (test->data_file, "test-ident", &section);
+	g_assert (ret == TRUE);
+	g_assert (section == GKM_GNOME2_FILE_SECTION_PUBLIC);
+
+	/* Should be able to call without asking for section */
+	ret = gkm_gnome2_file_lookup_entry (test->data_file, "test-ident", NULL);
+	g_assert (ret == TRUE);
+}
+
+static void
+file_read_private_without_login (Test *test, gconstpointer unused)
+{
+	GkmDataResult res;
+	guint section;
+	gconstpointer value;
+	gsize n_value;
+	gboolean ret;
+
+	res = gkm_gnome2_file_read_fd (test->data_file, test->private_fd, NULL);
+	g_assert (res == GKM_DATA_SUCCESS);
+
+	/* Items from the private section should exist */
+	ret = gkm_gnome2_file_lookup_entry (test->data_file, "identifier-private", &section);
+	g_assert (ret);
+	g_assert (section == GKM_GNOME2_FILE_SECTION_PRIVATE);
+
+	/* But we shouldn't be able to read values from those private items */
+	ret = gkm_gnome2_file_read_value (test->data_file, "identifier-private", CKA_LABEL, &value, &n_value);
+	g_assert (ret == GKM_DATA_LOCKED);
+
+	/* Shouldn't be able to create private items */
+	res = gkm_gnome2_file_create_entry (test->data_file, "dummy-private", GKM_GNOME2_FILE_SECTION_PRIVATE);
+	g_assert (res == GKM_DATA_LOCKED);
+
+	/* Shouldn't be able to write with another test->login */
+	res = gkm_gnome2_file_write_fd (test->data_file, test->write_fd, test->login);
+	g_assert (res == GKM_DATA_LOCKED);
+
+	/* Now load a public file without private bits*/
+	res = gkm_gnome2_file_read_fd (test->data_file, test->public_fd, NULL);
+	g_assert (res == GKM_DATA_SUCCESS);
+
+	/* Now we should be able to load private stuff */
+	res = gkm_gnome2_file_create_entry (test->data_file, "dummy-private", GKM_GNOME2_FILE_SECTION_PRIVATE);
+	g_assert (res == GKM_DATA_SUCCESS);
+}
+
+static void
+test_file_write (Test *test, gconstpointer unused)
+{
+	GkmDataResult res;
+
+	res = gkm_gnome2_file_create_entry (test->data_file, "identifier-public", GKM_GNOME2_FILE_SECTION_PUBLIC);
+	g_assert (res == GKM_DATA_SUCCESS);
+
+	res = gkm_gnome2_file_write_value (test->data_file, "identifier-public", CKA_LABEL, "public-label", 12);
+	g_assert (res == GKM_DATA_SUCCESS);
+
+	res = gkm_gnome2_file_create_entry (test->data_file, "identifier-two", GKM_GNOME2_FILE_SECTION_PUBLIC);
+	g_assert (res == GKM_DATA_SUCCESS);
+
+	res = gkm_gnome2_file_write_fd (test->data_file, test->write_fd, NULL);
+	g_assert (res == GKM_DATA_SUCCESS);
+}
+
+static void
+test_cant_write_private_without_login (Test *test, gconstpointer unused)
+{
+	GkmDataResult res;
+
+	res = gkm_gnome2_file_create_entry (test->data_file, "identifier_private", GKM_GNOME2_FILE_SECTION_PRIVATE);
+	g_assert (res == GKM_DATA_SUCCESS);
+
+	res = gkm_gnome2_file_write_fd (test->data_file, test->write_fd, NULL);
+	g_assert (res == GKM_DATA_LOCKED);
+}
+
+static void
+test_write_private_with_login (Test *test, gconstpointer unused)
+{
+	GkmDataResult res;
+	gulong value;
+
+	res = gkm_gnome2_file_create_entry (test->data_file, "identifier-public", GKM_GNOME2_FILE_SECTION_PUBLIC);
+	g_assert (res == GKM_DATA_SUCCESS);
+	res = gkm_gnome2_file_write_value (test->data_file, "identifier-public", CKA_LABEL, "public-label", 12);
+	g_assert (res == GKM_DATA_SUCCESS);
+
+	res = gkm_gnome2_file_create_entry (test->data_file, "identifier-two", GKM_GNOME2_FILE_SECTION_PUBLIC);
+	g_assert (res == GKM_DATA_SUCCESS);
+	res = gkm_gnome2_file_write_value (test->data_file, "identifier-two", CKA_LABEL, "TWO-label", 9);
+	g_assert (res == GKM_DATA_SUCCESS);
+	value = 555;
+	res = gkm_gnome2_file_write_value (test->data_file, "identifier-two", CKA_VALUE, &value, sizeof (value));
+	g_assert (res == GKM_DATA_SUCCESS);
+
+	res = gkm_gnome2_file_create_entry (test->data_file, "identifier-private", GKM_GNOME2_FILE_SECTION_PRIVATE);
+	g_assert (res == GKM_DATA_SUCCESS);
+	res = gkm_gnome2_file_write_value (test->data_file, "identifier-private", CKA_LABEL, "private-label", 13);
+	g_assert (res == GKM_DATA_SUCCESS);
+
+	res = gkm_gnome2_file_write_fd (test->data_file, test->write_fd, test->login);
+	g_assert (res == GKM_DATA_SUCCESS);
+}
+
+static void
+test_read_private_with_login (Test *test, gconstpointer unused)
+{
+	GkmDataResult res;
+	gconstpointer value;
+	gsize n_value;
+
+	res = gkm_gnome2_file_read_fd (test->data_file, test->private_fd, test->login);
+	g_assert (res == GKM_DATA_SUCCESS);
+
+	/* Should be able to read private items */
+	res = gkm_gnome2_file_read_value (test->data_file, "identifier-private", CKA_LABEL, &value, &n_value);
+	g_assert (res == GKM_DATA_SUCCESS);
+	g_assert_cmpuint (n_value, ==, 13);
+	g_assert (memcmp (value, "private-label", 13) == 0);
+}
+
+static void
+test_destroy_entry (Test *test, gconstpointer unused)
+{
+	GkmDataResult res;
+
+	res = gkm_gnome2_file_destroy_entry (test->data_file, "non-existant");
+	g_assert (res == GKM_DATA_UNRECOGNIZED);
+
+	res = gkm_gnome2_file_read_fd (test->data_file, test->public_fd, NULL);
+	g_assert (res == GKM_DATA_SUCCESS);
+
+	/* Make sure it's here */
+	g_assert (gkm_gnome2_file_lookup_entry (test->data_file, "identifier-public", NULL));
+
+	res = gkm_gnome2_file_destroy_entry (test->data_file, "identifier-public");
+	g_assert (res == GKM_DATA_SUCCESS);
+
+	/* Make sure it's gone */
+	g_assert (!gkm_gnome2_file_lookup_entry (test->data_file, "identifier-public", NULL));
+}
+
+static void
+test_destroy_entry_by_loading (Test *test, gconstpointer unused)
+{
+	GkmDataResult res;
+
+	/* Create some extra idenifiers */
+	res = gkm_gnome2_file_create_entry (test->data_file, "my-public", GKM_GNOME2_FILE_SECTION_PUBLIC);
+	g_assert (res == GKM_DATA_SUCCESS);
+	res = gkm_gnome2_file_create_entry (test->data_file, "my-private", GKM_GNOME2_FILE_SECTION_PRIVATE);
+	g_assert (res == GKM_DATA_SUCCESS);
+
+	/* Now read from the file */
+	res = gkm_gnome2_file_read_fd (test->data_file, test->public_fd, NULL);
+	g_assert (res == GKM_DATA_SUCCESS);
+
+	/* Both should be gone */
+	g_assert (!gkm_gnome2_file_lookup_entry (test->data_file, "my-public", NULL));
+	g_assert (!gkm_gnome2_file_lookup_entry (test->data_file, "my-private", NULL));
+}
+
+
+static void
+test_destroy_private_without_login (Test *test, gconstpointer unused)
+{
+	GkmDataResult res;
+
+	res = gkm_gnome2_file_read_fd (test->data_file, test->private_fd, NULL);
+	g_assert (res == GKM_DATA_SUCCESS);
+
+	/* Make sure it's here */
+	g_assert (gkm_gnome2_file_lookup_entry (test->data_file, "identifier-private", NULL));
+
+	/* Shouldn't be able to destroy */
+	res = gkm_gnome2_file_destroy_entry (test->data_file, "identifier-private");
+	g_assert (res == GKM_DATA_LOCKED);
+
+	/* Make sure it's still here */
+	g_assert (gkm_gnome2_file_lookup_entry (test->data_file, "identifier-private", NULL));
+}
+
+static void
+entry_added_one (GkmGnome2File *df, const gchar *identifier, gboolean *added)
+{
+	g_assert (GKM_IS_GNOME2_FILE (df));
+	g_assert (identifier);
+	g_assert (added);
+
+	/* Should only be called once */
+	g_assert (!*added);
+	*added = TRUE;
+}
+
+static void
+test_entry_added_signal (Test *test, gconstpointer unused)
+{
+	GkmDataResult res;
+	gboolean added;
+
+	g_signal_connect (test->data_file, "entry-added", G_CALLBACK (entry_added_one), &added);
+
+	/* Should fire the signal */
+	added = FALSE;
+	res = gkm_gnome2_file_create_entry (test->data_file, "identifier-public", GKM_GNOME2_FILE_SECTION_PUBLIC);
+	g_assert (res == GKM_DATA_SUCCESS);
+	g_assert (added == TRUE);
+
+	/* Another one should be added when we load */
+	added = FALSE;
+	res = gkm_gnome2_file_read_fd (test->data_file, test->public_fd, NULL);
+	g_assert (res == GKM_DATA_SUCCESS);
+	g_assert (added == TRUE);
+}
+
+static void
+entry_changed_one (GkmGnome2File *df, const gchar *identifier, gulong type, gboolean *changed)
+{
+	g_assert (GKM_IS_GNOME2_FILE (df));
+	g_assert (identifier);
+	g_assert (changed);
+	g_assert (type == CKA_LABEL);
+
+	/* Should only be called once */
+	g_assert (!*changed);
+	*changed = TRUE;
+}
+
+static void
+test_entry_changed_signal (Test *test, gconstpointer unused)
+{
+	GkmDataResult res;
+	gboolean changed;
+
+	g_signal_connect (test->data_file, "entry-changed", G_CALLBACK (entry_changed_one), &changed);
+
+	/* Loading shouldn't fire the signal */
+	changed = FALSE;
+	res = gkm_gnome2_file_read_fd (test->data_file, test->public_fd, NULL);
+	g_assert (res == GKM_DATA_SUCCESS);
+	g_assert (changed == FALSE);
+
+	/* Shouldn't fire the signal on nonexistant */
+	changed = FALSE;
+	res = gkm_gnome2_file_write_value (test->data_file, "non-existant", CKA_LABEL, "new-value", 10);
+	g_assert (res == GKM_DATA_UNRECOGNIZED);
+	g_assert (changed == FALSE);
+
+	/* Should fire the signal */
+	changed = FALSE;
+	res = gkm_gnome2_file_write_value (test->data_file, "identifier-public", CKA_LABEL, "new-value", 10);
+	g_assert (res == GKM_DATA_SUCCESS);
+	g_assert (changed == TRUE);
+
+	/* Shouldn't fire the signal, same value again */
+	changed = FALSE;
+	res = gkm_gnome2_file_write_value (test->data_file, "identifier-public", CKA_LABEL, "new-value", 10);
+	g_assert (res == GKM_DATA_SUCCESS);
+	g_assert (changed == FALSE);
+
+	/* Reload file, should revert, fire signal */
+	changed = FALSE;
+	g_assert (lseek (test->public_fd, 0, SEEK_SET) != -1);
+	res = gkm_gnome2_file_read_fd (test->data_file, test->public_fd, NULL);
+	g_assert (res == GKM_DATA_SUCCESS);
+	g_assert (changed == TRUE);
+}
+
+static void
+entry_removed_one (GkmGnome2File *df, const gchar *identifier, gboolean *removed)
+{
+	g_assert (GKM_IS_GNOME2_FILE (df));
+	g_assert (identifier);
+	g_assert (removed);
+
+	/* Should only be called once */
+	g_assert (!*removed);
+	*removed = TRUE;
+}
+
+static void
+test_entry_removed_signal (Test *test, gconstpointer unused)
+{
+	GkmDataResult res;
+	gboolean removed;
+
+	g_signal_connect (test->data_file, "entry-removed", G_CALLBACK (entry_removed_one), &removed);
+
+	/* Loading shouldn't fire the signal */
+	removed = FALSE;
+	res = gkm_gnome2_file_read_fd (test->data_file, test->public_fd, NULL);
+	g_assert (res == GKM_DATA_SUCCESS);
+	g_assert (removed == FALSE);
+
+	/* Shouldn't fire the signal on removing nonexistant */
+	removed = FALSE;
+	res = gkm_gnome2_file_destroy_entry (test->data_file, "non-existant");
+	g_assert (res == GKM_DATA_UNRECOGNIZED);
+	g_assert (removed == FALSE);
+
+	/* Remove a real entry */
+	removed = FALSE;
+	res = gkm_gnome2_file_destroy_entry (test->data_file, "identifier-public");
+	g_assert (res == GKM_DATA_SUCCESS);
+	g_assert (removed == TRUE);
+
+	/* Add a dummy entry */
+	res = gkm_gnome2_file_create_entry (test->data_file, "extra-dummy", GKM_GNOME2_FILE_SECTION_PUBLIC);
+	g_assert (res == GKM_DATA_SUCCESS);
+
+	/* That one should go away when we reload, fire signal */
+	removed = FALSE;
+	g_assert (lseek (test->public_fd, 0, SEEK_SET) != -1);
+	res = gkm_gnome2_file_read_fd (test->data_file, test->public_fd, NULL);
+	g_assert (res == GKM_DATA_SUCCESS);
+	g_assert (removed == TRUE);
+}
+
+static void
+foreach_entry (GkmGnome2File *df, const gchar *identifier, gpointer data)
+{
+	GPtrArray *array = data;
+	const gchar *ident;
+	int i;
+
+	g_assert (data);
+	g_assert (identifier);
+	g_assert (GKM_IS_GNOME2_FILE (df));
+
+	/* Check that this is unique */
+	for (i = 0; i < array->len; ++i) {
+		ident = g_ptr_array_index (array, i);
+		g_assert (ident);
+		g_assert_cmpstr (ident, !=, identifier);
+	}
+
+	/* Add it */
+	g_ptr_array_add (array, g_strdup (identifier));
+}
+
+static void
+test_data_file_foreach (Test *test, gconstpointer unused)
+{
+	GkmDataResult res;
+	GPtrArray *array;
+
+	res = gkm_gnome2_file_read_fd (test->data_file, test->private_fd, test->login);
+	g_assert (res == GKM_DATA_SUCCESS);
+
+	array = g_ptr_array_new ();
+	gkm_gnome2_file_foreach_entry (test->data_file, foreach_entry, array);
+	g_assert (array->len == 4);
+
+	g_ptr_array_add (array, NULL);
+	g_strfreev ((gchar**)g_ptr_array_free (array, FALSE));
+}
+
+static void
+test_unique_entry (Test *test, gconstpointer unused)
+{
+	GkmDataResult res;
+	gchar *identifier;
+
+	res = gkm_gnome2_file_read_fd (test->data_file, test->public_fd, NULL);
+	g_assert (res == GKM_DATA_SUCCESS);
+
+	/* Should change an identifier that conflicts */
+	identifier = g_strdup ("identifier-public");
+	res = gkm_gnome2_file_unique_entry (test->data_file, &identifier);
+	g_assert (res == GKM_DATA_SUCCESS);
+	g_assert_cmpstr (identifier, !=, "identifier-public");
+	g_free (identifier);
+
+	/* Shouldn't change a unique identifier */
+	identifier = g_strdup ("identifier-unique");
+	res = gkm_gnome2_file_unique_entry (test->data_file, &identifier);
+	g_assert (res == GKM_DATA_SUCCESS);
+	g_assert_cmpstr (identifier, ==, "identifier-unique");
+	g_free (identifier);
+
+	/* Should be able to get from NULL */
+	identifier = NULL;
+	res = gkm_gnome2_file_unique_entry (test->data_file, &identifier);
+	g_assert (res == GKM_DATA_SUCCESS);
+	g_assert (identifier != NULL);
+	g_assert (identifier[0] != 0);
+	g_free (identifier);
+}
+
+static void
+test_have_sections (Test *test, gconstpointer unused)
+{
+	GkmDataResult res;
+
+	res = gkm_gnome2_file_read_fd (test->data_file, test->public_fd, NULL);
+	g_assert (res == GKM_DATA_SUCCESS);
+
+	/* No private section */
+	g_assert (gkm_gnome2_file_have_section (test->data_file, GKM_GNOME2_FILE_SECTION_PUBLIC));
+	g_assert (!gkm_gnome2_file_have_section (test->data_file, GKM_GNOME2_FILE_SECTION_PRIVATE));
+
+	/* Read private stuff into file, without test->login */
+	res = gkm_gnome2_file_read_fd (test->data_file, test->private_fd, NULL);
+	g_assert (res == GKM_DATA_SUCCESS);
+
+	/* Should have a private section even without test->login */
+	g_assert (gkm_gnome2_file_have_section (test->data_file, GKM_GNOME2_FILE_SECTION_PUBLIC));
+	g_assert (gkm_gnome2_file_have_section (test->data_file, GKM_GNOME2_FILE_SECTION_PRIVATE));
+
+	/* Read private stuff into file, with test->login */
+	g_assert (lseek (test->private_fd, 0, SEEK_SET) == 0);
+	res = gkm_gnome2_file_read_fd (test->data_file, test->private_fd, test->login);
+	g_assert (res == GKM_DATA_SUCCESS);
+
+	/* Should have a private section now with test->login */
+	g_assert (gkm_gnome2_file_have_section (test->data_file, GKM_GNOME2_FILE_SECTION_PUBLIC));
+	g_assert (gkm_gnome2_file_have_section (test->data_file, GKM_GNOME2_FILE_SECTION_PRIVATE));
+
+	/* Read public stuff back into file*/
+	g_assert (lseek (test->public_fd, 0, SEEK_SET) == 0);
+	res = gkm_gnome2_file_read_fd (test->data_file, test->public_fd, test->login);
+	g_assert (res == GKM_DATA_SUCCESS);
+
+	/* Shouldn't have a private section now  */
+	g_assert (gkm_gnome2_file_have_section (test->data_file, GKM_GNOME2_FILE_SECTION_PUBLIC));
+	g_assert (!gkm_gnome2_file_have_section (test->data_file, GKM_GNOME2_FILE_SECTION_PRIVATE));
+}
+
+
+int
+main (int argc, char **argv)
+{
+	g_type_init ();
+	g_test_init (&argc, &argv, NULL);
+
+	egg_libgcrypt_initialize ();
+
+	g_test_add ("/gnome2-store/gnome2-file/file_create", Test, NULL, setup, test_file_create, teardown);
+	g_test_add ("/gnome2-store/gnome2-file/file_write_value", Test, NULL, setup, test_file_write_value, teardown);
+	g_test_add ("/gnome2-store/gnome2-file/file_read_value", Test, NULL, setup, test_file_read_value, teardown);
+	g_test_add ("/gnome2-store/gnome2-file/file_read", Test, NULL, setup, test_file_read, teardown);
+	g_test_add ("/gnome2-store/gnome2-file/file_lookup", Test, NULL, setup, test_file_lookup, teardown);
+	g_test_add ("/gnome2-store/gnome2-file/file_read_private_without_login", Test, NULL, setup, file_read_private_without_login, teardown);
+	g_test_add ("/gnome2-store/gnome2-file/file_write", Test, NULL, setup, test_file_write, teardown);
+	g_test_add ("/gnome2-store/gnome2-file/cant_write_private_without_login", Test, NULL, setup, test_cant_write_private_without_login, teardown);
+	g_test_add ("/gnome2-store/gnome2-file/write_private_with_login", Test, NULL, setup, test_write_private_with_login, teardown);
+	g_test_add ("/gnome2-store/gnome2-file/read_private_with_login", Test, NULL, setup, test_read_private_with_login, teardown);
+	g_test_add ("/gnome2-store/gnome2-file/destroy_entry", Test, NULL, setup, test_destroy_entry, teardown);
+	g_test_add ("/gnome2-store/gnome2-file/destroy_entry_by_loading", Test, NULL, setup, test_destroy_entry_by_loading, teardown);
+	g_test_add ("/gnome2-store/gnome2-file/destroy_private_without_login", Test, NULL, setup, test_destroy_private_without_login, teardown);
+	g_test_add ("/gnome2-store/gnome2-file/entry_added_signal", Test, NULL, setup, test_entry_added_signal, teardown);
+	g_test_add ("/gnome2-store/gnome2-file/entry_changed_signal", Test, NULL, setup, test_entry_changed_signal, teardown);
+	g_test_add ("/gnome2-store/gnome2-file/entry_removed_signal", Test, NULL, setup, test_entry_removed_signal, teardown);
+	g_test_add ("/gnome2-store/gnome2-file/data_file_foreach", Test, NULL, setup, test_data_file_foreach, teardown);
+	g_test_add ("/gnome2-store/gnome2-file/unique_entry", Test, NULL, setup, test_unique_entry, teardown);
+	g_test_add ("/gnome2-store/gnome2-file/have_sections", Test, NULL, setup, test_have_sections, teardown);
+
+	return g_test_run ();
+}
diff --git a/pkcs11/roots-store/tests/Makefile.am b/pkcs11/roots-store/tests/Makefile.am
index e80f1cd..146d9e2 100644
--- a/pkcs11/roots-store/tests/Makefile.am
+++ b/pkcs11/roots-store/tests/Makefile.am
@@ -1,14 +1,38 @@
 
-TESTING_FILES = \
-	test-module.c
+INCLUDES = \
+	-I$(top_builddir) \
+	-I$(top_srcdir) \
+	-I$(top_srcdir)/pkcs11 \
+	-DSRCDIR="\"$(srcdir)\"" \
+	$(GLIB_CFLAGS) \
+	$(LIBGCRYPT_CFLAGS)
 
-TESTING_LIBS = \
+LDADD = \
 	$(top_builddir)/pkcs11/roots-store/libgkm-roots-store.la \
 	$(top_builddir)/pkcs11/gkm/libgkm.la \
-	$(top_builddir)/egg/libegg.la
+	$(top_builddir)/egg/libegg.la \
+	$(GLIB_LIBS) \
+	$(LIBGCRYPT_LIBS)
 
-include $(top_srcdir)/testing/testing.make
+if WITH_P11_TESTS
+CHECK_PROGS = check-roots-module
+else
+CHECK_PROGS =
+endif
 
-EXTRA_DIST += \
-	test-data \
-	p11-tests.conf
+test: $(TEST_PROGS) $(CHECK_PROGS)
+	@for prog in $(CHECK_PROGS); do SRCDIR='.' ./$$prog || exit 1; done
+
+check-local: test
+
+all-local: $(check_PROGRAMS)
+
+EXTRA_DIST = \
+	p11-tests.conf \
+	files
+
+noinst_PROGRAMS = \
+	$(CHECK_PROGS)
+
+check_roots_module_CFLAGS = $(P11_TESTS_CFLAGS)
+check_roots_module_LDADD = $(P11_TESTS_LIBS) $(LDADD)
diff --git a/pkcs11/roots-store/tests/check-roots-module.c b/pkcs11/roots-store/tests/check-roots-module.c
new file mode 100644
index 0000000..1bc9e16
--- /dev/null
+++ b/pkcs11/roots-store/tests/check-roots-module.c
@@ -0,0 +1,68 @@
+/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */
+/* check-roots-module.c: Test PKCS#11 implementation
+
+   Copyright (C) 2009 Stefan Walter
+
+   The Gnome Keyring Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Library General Public License as
+   published by the Free Software Foundation; either version 2 of the
+   License, or (at your option) any later version.
+
+   The Gnome Keyring 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
+   Library General Public License for more details.
+
+   You should have received a copy of the GNU Library General Public
+   License along with the Gnome Library; see the file COPYING.LIB.  If not,
+   write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+   Boston, MA 02111-1307, USA.
+
+   Author: Stef Walter <stef memberwebs com>
+*/
+
+#include "config.h"
+
+#include "roots-store/gkm-roots-store.h"
+
+#include "egg/egg-secure-memory.h"
+
+#include <glib.h>
+#include <glib-object.h>
+
+#include <p11-tests.h>
+
+static int failures = 0;
+
+EGG_SECURE_GLIB_DEFINITIONS ();
+
+static void
+on_p11_tests_log (int level, const char *section, const char *message)
+{
+	if (level == P11_TESTS_NONE) {
+		g_message ("%s", message);
+	} else if (level != P11_TESTS_FAIL) {
+		g_message ("%s: %s", section, message);
+	} else {
+		g_print ("  /roots-store/%s: FAIL: %s\n", section, message);
+		++failures;
+	}
+}
+
+int
+main (int argc, const char *argv[])
+{
+	g_type_init ();
+
+	p11_tests_set_log_func (on_p11_tests_log);
+	p11_tests_set_unexpected (1);
+	p11_tests_set_verbose (0);
+	p11_tests_set_write_session (1);
+	p11_tests_load_config (SRCDIR "/p11-tests.conf");
+
+	g_print ("CHECK: check-roots-module...\n");
+	p11_tests_perform (gkm_roots_store_get_functions ());
+
+	g_print ("%s: check-roots-module\n", failures ? "FAIL" : "PASS");
+	return failures;
+}
diff --git a/pkcs11/roots-store/tests/test-data/RSA_Root_Certificate_1.pem b/pkcs11/roots-store/tests/files/RSA_Root_Certificate_1.pem
similarity index 100%
rename from pkcs11/roots-store/tests/test-data/RSA_Root_Certificate_1.pem
rename to pkcs11/roots-store/tests/files/RSA_Root_Certificate_1.pem
diff --git a/pkcs11/roots-store/tests/test-data/RSA_Security_1024_v3.pem b/pkcs11/roots-store/tests/files/RSA_Security_1024_v3.pem
similarity index 100%
rename from pkcs11/roots-store/tests/test-data/RSA_Security_1024_v3.pem
rename to pkcs11/roots-store/tests/files/RSA_Security_1024_v3.pem
diff --git a/pkcs11/roots-store/tests/test-data/RSA_Security_2048_v3.pem b/pkcs11/roots-store/tests/files/RSA_Security_2048_v3.pem
similarity index 100%
rename from pkcs11/roots-store/tests/test-data/RSA_Security_2048_v3.pem
rename to pkcs11/roots-store/tests/files/RSA_Security_2048_v3.pem
diff --git a/pkcs11/roots-store/tests/test-data/Thawte_Personal_Basic_CA.pem b/pkcs11/roots-store/tests/files/Thawte_Personal_Basic_CA.pem
similarity index 100%
rename from pkcs11/roots-store/tests/test-data/Thawte_Personal_Basic_CA.pem
rename to pkcs11/roots-store/tests/files/Thawte_Personal_Basic_CA.pem
diff --git a/pkcs11/roots-store/tests/test-data/Thawte_Personal_Freemail_CA.pem b/pkcs11/roots-store/tests/files/Thawte_Personal_Freemail_CA.pem
similarity index 100%
rename from pkcs11/roots-store/tests/test-data/Thawte_Personal_Freemail_CA.pem
rename to pkcs11/roots-store/tests/files/Thawte_Personal_Freemail_CA.pem
diff --git a/pkcs11/roots-store/tests/test-data/Thawte_Personal_Premium_CA.pem b/pkcs11/roots-store/tests/files/Thawte_Personal_Premium_CA.pem
similarity index 100%
rename from pkcs11/roots-store/tests/test-data/Thawte_Personal_Premium_CA.pem
rename to pkcs11/roots-store/tests/files/Thawte_Personal_Premium_CA.pem
diff --git a/pkcs11/roots-store/tests/test-data/Thawte_Premium_Server_CA.pem b/pkcs11/roots-store/tests/files/Thawte_Premium_Server_CA.pem
similarity index 100%
rename from pkcs11/roots-store/tests/test-data/Thawte_Premium_Server_CA.pem
rename to pkcs11/roots-store/tests/files/Thawte_Premium_Server_CA.pem
diff --git a/pkcs11/roots-store/tests/test-data/Thawte_Server_CA.pem b/pkcs11/roots-store/tests/files/Thawte_Server_CA.pem
similarity index 100%
rename from pkcs11/roots-store/tests/test-data/Thawte_Server_CA.pem
rename to pkcs11/roots-store/tests/files/Thawte_Server_CA.pem
diff --git a/pkcs11/roots-store/tests/test-data/Thawte_Time_Stamping_CA.pem b/pkcs11/roots-store/tests/files/Thawte_Time_Stamping_CA.pem
similarity index 100%
rename from pkcs11/roots-store/tests/test-data/Thawte_Time_Stamping_CA.pem
rename to pkcs11/roots-store/tests/files/Thawte_Time_Stamping_CA.pem
diff --git a/pkcs11/roots-store/tests/test-data/ca-certificates.crt b/pkcs11/roots-store/tests/files/ca-certificates.crt
similarity index 100%
rename from pkcs11/roots-store/tests/test-data/ca-certificates.crt
rename to pkcs11/roots-store/tests/files/ca-certificates.crt
diff --git a/pkcs11/roots-store/tests/test-data/cacert.org.pem b/pkcs11/roots-store/tests/files/cacert.org.pem
similarity index 100%
rename from pkcs11/roots-store/tests/test-data/cacert.org.pem
rename to pkcs11/roots-store/tests/files/cacert.org.pem
diff --git a/pkcs11/roots-store/tests/test-data/der-certificate.crt b/pkcs11/roots-store/tests/files/der-certificate.crt
similarity index 100%
rename from pkcs11/roots-store/tests/test-data/der-certificate.crt
rename to pkcs11/roots-store/tests/files/der-certificate.crt
diff --git a/pkcs11/secret-store/gkm-secret-binary.c b/pkcs11/secret-store/gkm-secret-binary.c
index 942ffe7..29cd9cd 100644
--- a/pkcs11/secret-store/gkm-secret-binary.c
+++ b/pkcs11/secret-store/gkm-secret-binary.c
@@ -561,7 +561,7 @@ generate_hashed_items (GkmSecretCollection *collection, EggBuffer *buffer)
 
 GkmDataResult
 gkm_secret_binary_write (GkmSecretCollection *collection, GkmSecretData *sdata,
-                         guchar **data, gsize *n_data)
+                         gpointer *data, gsize *n_data)
 {
 	GkmSecretObject *obj;
 	EggBuffer to_encrypt;
@@ -843,7 +843,7 @@ free_item_info (ItemInfo *info)
 
 gint
 gkm_secret_binary_read (GkmSecretCollection *collection, GkmSecretData *sdata,
-                        const guchar *data, gsize n_data)
+                        gconstpointer data, gsize n_data)
 {
 	gsize offset;
 	guchar major, minor, crypto, hash;
diff --git a/pkcs11/secret-store/gkm-secret-binary.h b/pkcs11/secret-store/gkm-secret-binary.h
index 05cc064..a150f1b 100644
--- a/pkcs11/secret-store/gkm-secret-binary.h
+++ b/pkcs11/secret-store/gkm-secret-binary.h
@@ -29,12 +29,12 @@
 
 GkmDataResult          gkm_secret_binary_read        (GkmSecretCollection *collection,
                                                       GkmSecretData *sdata,
-                                                      const guchar *data,
+                                                      gconstpointer data,
                                                       gsize n_data);
 
 GkmDataResult          gkm_secret_binary_write       (GkmSecretCollection *collection,
                                                       GkmSecretData *sdata,
-                                                      guchar **data,
+                                                      gpointer *data,
                                                       gsize *n_data);
 
 #endif /* __GKM_SECRET_BINARY_H__ */
diff --git a/pkcs11/secret-store/gkm-secret-collection.c b/pkcs11/secret-store/gkm-secret-collection.c
index 1157255..0aedc5c 100644
--- a/pkcs11/secret-store/gkm-secret-collection.c
+++ b/pkcs11/secret-store/gkm-secret-collection.c
@@ -888,7 +888,7 @@ gkm_secret_collection_save (GkmSecretCollection *self, GkmTransaction *transacti
 {
 	GkmSecret *master;
 	GkmDataResult res;
-	guchar *data;
+	gpointer data;
 	gsize n_data;
 
 	g_return_if_fail (GKM_IS_SECRET_COLLECTION (self));
diff --git a/pkcs11/secret-store/gkm-secret-textual.c b/pkcs11/secret-store/gkm-secret-textual.c
index 8d67117..af7bc37 100644
--- a/pkcs11/secret-store/gkm-secret-textual.c
+++ b/pkcs11/secret-store/gkm-secret-textual.c
@@ -380,7 +380,7 @@ parse_item (GKeyFile *file, GkmSecretItem *item, GkmSecretData *sdata,
 
 GkmDataResult
 gkm_secret_textual_write (GkmSecretCollection *collection, GkmSecretData *sdata,
-                          guchar **data, gsize *n_data)
+                          gpointer *data, gsize *n_data)
 {
 	GkmSecretObject *obj;
 	GList *items, *l;
@@ -445,7 +445,7 @@ remove_unavailable_item (gpointer key, gpointer dummy, gpointer user_data)
 
 GkmDataResult
 gkm_secret_textual_read (GkmSecretCollection *collection, GkmSecretData *sdata,
-                         const guchar *data, gsize n_data)
+                         gconstpointer data, gsize n_data)
 {
 	GkmSecretObject *obj;
 	GkmSecretItem *item;
diff --git a/pkcs11/secret-store/gkm-secret-textual.h b/pkcs11/secret-store/gkm-secret-textual.h
index bb96e8c..ca568e3 100644
--- a/pkcs11/secret-store/gkm-secret-textual.h
+++ b/pkcs11/secret-store/gkm-secret-textual.h
@@ -28,12 +28,12 @@
 
 GkmDataResult          gkm_secret_textual_read       (GkmSecretCollection *collection,
                                                       GkmSecretData *sdata,
-                                                      const guchar *data,
+                                                      gconstpointer data,
                                                       gsize n_data);
 
 GkmDataResult          gkm_secret_textual_write      (GkmSecretCollection *collection,
                                                       GkmSecretData *sdata,
-                                                      guchar **data,
+                                                      gpointer *data,
                                                       gsize *n_data);
 
 #endif /* __GKM_SECRET_TEXTUAL_H__ */
diff --git a/pkcs11/secret-store/tests/Makefile.am b/pkcs11/secret-store/tests/Makefile.am
index ff14313..814bcc5 100644
--- a/pkcs11/secret-store/tests/Makefile.am
+++ b/pkcs11/secret-store/tests/Makefile.am
@@ -1,25 +1,44 @@
-TESTING_SOURCES = \
-	test-secret-module.c test-secret-module.h
-
-TESTING_FILES = \
-	unit-test-secret-compat.c \
-	unit-test-secret-fields.c \
-	unit-test-secret-data.c \
-	unit-test-secret-object.c \
-	unit-test-secret-collection.c \
-	unit-test-secret-item.c \
-	unit-test-secret-search.c \
-	unit-test-secret-textual.c \
-	unit-test-secret-binary.c
-
-UNIT_PROMPT =
-
-TESTING_LIBS =  \
+
+INCLUDES = \
+	-I$(top_builddir) \
+	-I$(top_srcdir) \
+	-I$(top_srcdir)/pkcs11 \
+	-DSRCDIR="\"$(srcdir)\"" \
+	$(GLIB_CFLAGS) \
+	$(LIBGCRYPT_CFLAGS)
+
+LDADD = \
+	libgkm-mock-secret-module.a \
 	$(top_builddir)/pkcs11/secret-store/libgkm-secret-store.la \
 	$(top_builddir)/pkcs11/gkm/libgkm.la \
-	$(top_builddir)/egg/libegg.la
+	$(top_builddir)/egg/libegg.la \
+	$(GLIB_LIBS) \
+	$(LIBGCRYPT_LIBS)
+
+noinst_LIBRARIES = libgkm-mock-secret-module.a
+
+libgkm_mock_secret_module_a_SOURCES = \
+	mock-secret-module.c mock-secret-module.h
+
+TEST_PROGS = \
+	test-secret-compat \
+	test-secret-fields \
+	test-secret-data \
+	test-secret-object \
+	test-secret-collection \
+	test-secret-item \
+	test-secret-search \
+	test-secret-textual \
+	test-secret-binary
+
+check_PROGRAMS = $(TEST_PROGS)
+
+test: $(TEST_PROGS)
+	gtester -k --verbose -m $(TEST_MODE) --g-fatal-warnings $(TEST_PROGS)
+
+check-local: test
 
-include $(top_srcdir)/testing/testing.make
+all-local: $(check_PROGRAMS)
 
-EXTRA_DIST += \
-	test-data
+EXTRA_DIST = \
+	files
diff --git a/pkcs11/secret-store/tests/test-data/encrypted.keyring b/pkcs11/secret-store/tests/files/encrypted.keyring
similarity index 100%
rename from pkcs11/secret-store/tests/test-data/encrypted.keyring
rename to pkcs11/secret-store/tests/files/encrypted.keyring
diff --git a/pkcs11/secret-store/tests/test-data/plain-bad-number.keyring b/pkcs11/secret-store/tests/files/plain-bad-number.keyring
similarity index 100%
rename from pkcs11/secret-store/tests/test-data/plain-bad-number.keyring
rename to pkcs11/secret-store/tests/files/plain-bad-number.keyring
diff --git a/pkcs11/secret-store/tests/test-data/plain.keyring b/pkcs11/secret-store/tests/files/plain.keyring
similarity index 100%
rename from pkcs11/secret-store/tests/test-data/plain.keyring
rename to pkcs11/secret-store/tests/files/plain.keyring
diff --git a/pkcs11/secret-store/tests/test-secret-module.c b/pkcs11/secret-store/tests/mock-secret-module.c
similarity index 86%
rename from pkcs11/secret-store/tests/test-secret-module.c
rename to pkcs11/secret-store/tests/mock-secret-module.c
index 3215c81..6cb698c 100644
--- a/pkcs11/secret-store/tests/test-secret-module.c
+++ b/pkcs11/secret-store/tests/mock-secret-module.c
@@ -22,26 +22,54 @@
 */
 
 #include "config.h"
-#include "test-secret-module.h"
-#include "test-suite.h"
+
+#include "mock-secret-module.h"
 
 #include "gkm/gkm-secret.h"
 #include "gkm/gkm-module.h"
 
-#include "gkm-secret-collection.h"
-#include "gkm-secret-data.h"
-#include "gkm-secret-fields.h"
-#include "gkm-secret-item.h"
-#include "gkm-secret-object.h"
-#include "gkm-secret-store.h"
+#include "secret-store/gkm-secret-collection.h"
+#include "secret-store/gkm-secret-data.h"
+#include "secret-store/gkm-secret-fields.h"
+#include "secret-store/gkm-secret-item.h"
+#include "secret-store/gkm-secret-object.h"
+#include "secret-store/gkm-secret-store.h"
+
+#include "egg/egg-mkdtemp.h"
+#include "egg/egg-secure-memory.h"
+
+#include <glib.h>
 
 #include <string.h>
 
+EGG_SECURE_GLIB_DEFINITIONS ();
+
 static GMutex *mutex = NULL;
+static gchar *directory = NULL;
 
 GkmModule*  _gkm_secret_store_get_module_for_testing (void);
 GMutex* _gkm_module_get_scary_mutex_that_you_should_not_touch (GkmModule *module);
 
+static void
+copy_file_to_directory (const gchar *from, const gchar *directory)
+{
+	gchar *filename;
+	gchar *basename;
+	gchar *data;
+	gsize n_data;
+
+	if (!g_file_get_contents (from, &data, &n_data, NULL))
+		g_error ("couldn't read: %s", from);
+
+	basename = g_path_get_basename (from);
+	filename = g_build_filename (directory, basename, NULL);
+	if (!g_file_set_contents (filename, data, n_data, NULL))
+		g_error ("couldn't write: %s", filename);
+	g_free (filename);
+	g_free (basename);
+	g_free (data);
+}
+
 GkmModule*
 test_secret_module_initialize_and_enter (void)
 {
@@ -51,15 +79,17 @@ test_secret_module_initialize_and_enter (void)
 	gchar *string;
 	CK_RV rv;
 
+	directory = egg_mkdtemp (g_strdup ("/tmp/mock-secret-XXXXXX"));
+
 	/* Setup test directory to work in */
 	memset (&args, 0, sizeof (args));
-	string = g_strdup_printf ("directory='%s'", testing_scratch_directory ());
+	string = g_strdup_printf ("directory='%s'", directory);
 	args.pReserved = string;
 	args.flags = CKF_OS_LOCKING_OK;
 
 	/* Copy files from test-data to scratch */
-	testing_data_to_scratch ("encrypted.keyring", NULL);
-	testing_data_to_scratch ("plain.keyring", NULL);
+	copy_file_to_directory (SRCDIR "/files/encrypted.keyring", directory);
+	copy_file_to_directory (SRCDIR "/files/plain.keyring", directory);
 
 	funcs = gkm_secret_store_get_functions ();
 	rv = (funcs->C_Initialize) (&args);
@@ -87,6 +117,9 @@ test_secret_module_leave_and_finalize (void)
 	funcs = gkm_secret_store_get_functions ();
 	rv = (funcs->C_Finalize) (NULL);
 	g_return_if_fail (rv == CKR_OK);
+
+	g_free (directory);
+	directory = NULL;
 }
 
 void
diff --git a/pkcs11/secret-store/tests/test-secret-module.h b/pkcs11/secret-store/tests/mock-secret-module.h
similarity index 97%
rename from pkcs11/secret-store/tests/test-secret-module.h
rename to pkcs11/secret-store/tests/mock-secret-module.h
index 46413e3..72afc15 100644
--- a/pkcs11/secret-store/tests/test-secret-module.h
+++ b/pkcs11/secret-store/tests/mock-secret-module.h
@@ -27,7 +27,8 @@
 #include <glib.h>
 
 #include "gkm/gkm-types.h"
-#include "gkm-secret-types.h"
+
+#include "secret-store/gkm-secret-types.h"
 
 #include "pkcs11.h"
 
diff --git a/pkcs11/secret-store/tests/test-secret-binary.c b/pkcs11/secret-store/tests/test-secret-binary.c
new file mode 100644
index 0000000..6f2e71d
--- /dev/null
+++ b/pkcs11/secret-store/tests/test-secret-binary.c
@@ -0,0 +1,222 @@
+/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */
+/* test-secret-binary.c: Test binary keyring read and write
+
+   Copyright (C) 2009 Stefan Walter
+
+   The Gnome Keyring Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Library General Public License as
+   published by the Free Software Foundation; either version 2 of the
+   License, or (at your option) any later version.
+
+   The Gnome Keyring 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
+   Library General Public License for more details.
+
+   You should have received a copy of the GNU Library General Public
+   License along with the Gnome Library; see the file COPYING.LIB.  If not,
+   write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+   Boston, MA 02111-1307, USA.
+
+   Author: Stef Walter <stef memberwebs com>
+*/
+
+#include "config.h"
+
+#include "mock-secret-module.h"
+
+#include "secret-store/gkm-secret-binary.h"
+#include "secret-store/gkm-secret-collection.h"
+#include "secret-store/gkm-secret-data.h"
+#include "secret-store/gkm-secret-fields.h"
+#include "secret-store/gkm-secret-item.h"
+
+#include "gkm/gkm-secret.h"
+
+#include "pkcs11/pkcs11i.h"
+
+#include <glib.h>
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+
+typedef struct {
+	GkmModule *module;
+	GkmSession *session;
+	GkmSecretCollection *collection;
+	GkmSecretData *sdata;
+} Test;
+
+static void
+setup (Test *test, gconstpointer unused)
+{
+	GkmSecret *master;
+
+	test->module = test_secret_module_initialize_and_enter ();
+	test->session = test_secret_module_open_session (TRUE);
+
+	test->collection = g_object_new (GKM_TYPE_SECRET_COLLECTION,
+	                           "module", test->module,
+	                           "identifier", "test",
+	                           "label", "brigadooooooooooooon",
+	                           NULL);
+
+	test->sdata = g_object_new (GKM_TYPE_SECRET_DATA, NULL);
+	master = gkm_secret_new_from_password ("my-keyring-password");
+	gkm_secret_data_set_master (test->sdata, master);
+	g_object_unref (master);
+
+	g_assert (GKM_IS_SECRET_COLLECTION (test->collection));
+
+}
+
+static void
+teardown (Test *test, gconstpointer unused)
+{
+	g_object_unref (test->collection);
+	g_object_unref (test->sdata);
+	test_secret_module_leave_and_finalize ();
+}
+
+static void
+test_read (Test *test, gconstpointer unused)
+{
+	GkmDataResult res;
+	gchar *data;
+	gsize n_data;
+
+	if (!g_file_get_contents (SRCDIR "/files/encrypted.keyring", &data, &n_data, NULL))
+		g_assert_not_reached ();
+	res = gkm_secret_binary_read (test->collection, test->sdata, data, n_data);
+	g_free (data);
+
+	test_secret_collection_validate (test->collection, test->sdata);
+
+	g_assert (res == GKM_DATA_SUCCESS);
+}
+
+static void
+test_read_wrong_format (Test *test, gconstpointer unused)
+{
+	GkmDataResult res;
+	gchar *data;
+	gsize n_data;
+
+	if (!g_file_get_contents (SRCDIR "/files/plain.keyring", &data, &n_data, NULL))
+		g_assert_not_reached ();
+	res = gkm_secret_binary_read (test->collection, test->sdata, data, n_data);
+	g_free (data);
+
+	g_assert (res == GKM_DATA_UNRECOGNIZED);
+}
+
+static void
+test_read_wrong_master (Test *test, gconstpointer unused)
+{
+	GkmDataResult res;
+	GkmSecret *master;
+	gchar *data;
+	gsize n_data;
+
+	master = gkm_secret_new_from_password ("wrong");
+	gkm_secret_data_set_master (test->sdata, master);
+	g_object_unref (master);
+
+	if (!g_file_get_contents (SRCDIR "/files/encrypted.keyring", &data, &n_data, NULL))
+		g_assert_not_reached ();
+	res = gkm_secret_binary_read (test->collection, test->sdata, data, n_data);
+	g_free (data);
+
+	g_assert (res == GKM_DATA_LOCKED);
+}
+
+static void
+test_read_sdata_but_no_master (Test *test, gconstpointer unused)
+{
+	GkmDataResult res;
+	gchar *data;
+	gsize n_data;
+
+	gkm_secret_data_set_master (test->sdata, NULL);
+
+	if (!g_file_get_contents (SRCDIR "/files/encrypted.keyring", &data, &n_data, NULL))
+		g_assert_not_reached ();
+	res = gkm_secret_binary_read (test->collection, test->sdata, data, n_data);
+	g_free (data);
+
+	g_assert (res == GKM_DATA_LOCKED);
+}
+
+static void
+test_write (Test *test, gconstpointer unused)
+{
+	GkmDataResult res;
+	gpointer data;
+	gsize n_data;
+
+	test_secret_collection_populate (test->collection, test->sdata);
+
+	res = gkm_secret_binary_write (test->collection, test->sdata, &data, &n_data);
+	g_assert (res == GKM_DATA_SUCCESS);
+	g_assert (data);
+	g_assert (n_data);
+
+	/* Try parsing it again */
+	res = gkm_secret_binary_read (test->collection, test->sdata, data, n_data);
+	g_assert (res == GKM_DATA_SUCCESS);
+}
+
+static void
+test_remove_unavailable (Test *test, gconstpointer unused)
+{
+	GkmDataResult res;
+	GList *items;
+	gchar *data;
+	gsize n_data;
+
+	if (!g_file_get_contents (SRCDIR "/files/encrypted.keyring", &data, &n_data, NULL))
+		g_assert_not_reached ();
+	res = gkm_secret_binary_read (test->collection, test->sdata, data, n_data);
+	g_assert (res == GKM_DATA_SUCCESS);
+
+	/* Two items from the file */
+	items = gkm_secret_collection_get_items (test->collection);
+	g_assert_cmpint (g_list_length (items), ==, 2);
+	g_list_free (items);
+
+	/* Fill in some more data */
+	test_secret_collection_populate (test->collection, test->sdata);
+
+	/* Should have added three more */
+	items = gkm_secret_collection_get_items (test->collection);
+	g_assert_cmpint (g_list_length (items), ==, 5);
+	g_list_free (items);
+
+	/* Re-read the keyring */
+	res = gkm_secret_binary_read (test->collection, test->sdata, data, n_data);
+	g_assert (res == GKM_DATA_SUCCESS);
+
+	/* And we're back to two */
+	items = gkm_secret_collection_get_items (test->collection);
+	g_assert_cmpint (g_list_length (items), ==, 2);
+	g_list_free (items);
+
+	g_free (data);
+}
+
+int
+main (int argc, char **argv)
+{
+	g_type_init ();
+	g_test_init (&argc, &argv, NULL);
+
+	g_test_add ("/secret-store/binary/read", Test, NULL, setup, test_read, teardown);
+	g_test_add ("/secret-store/binary/read_wrong_format", Test, NULL, setup, test_read_wrong_format, teardown);
+	g_test_add ("/secret-store/binary/read_wrong_master", Test, NULL, setup, test_read_wrong_master, teardown);
+	g_test_add ("/secret-store/binary/read_sdata_but_no_master", Test, NULL, setup, test_read_sdata_but_no_master, teardown);
+	g_test_add ("/secret-store/binary/write", Test, NULL, setup, test_write, teardown);
+	g_test_add ("/secret-store/binary/remove_unavailable", Test, NULL, setup, test_remove_unavailable, teardown);
+
+	return g_test_run ();
+}
diff --git a/pkcs11/secret-store/tests/test-secret-collection.c b/pkcs11/secret-store/tests/test-secret-collection.c
new file mode 100644
index 0000000..203d8ab
--- /dev/null
+++ b/pkcs11/secret-store/tests/test-secret-collection.c
@@ -0,0 +1,598 @@
+/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */
+/* test-secret-test->collection.c: Test the test->collection keyring
+
+   Copyright (C) 2009 Stefan Walter
+
+   The Gnome Keyring Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Library General Public License as
+   published by the Free Software Foundation; either version 2 of the
+   License, or (at your option) any later version.
+
+   The Gnome Keyring 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
+   Library General Public License for more details.
+
+   You should have received a copy of the GNU Library General Public
+   License along with the Gnome Library; see the file COPYING.LIB.  If not,
+   write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+   Boston, MA 02111-1307, USA.
+
+   Author: Stef Walter <stef memberwebs com>
+*/
+
+#include "config.h"
+
+#include "mock-secret-module.h"
+
+#include "secret-store/gkm-secret-data.h"
+#include "secret-store/gkm-secret-collection.h"
+#include "secret-store/gkm-secret-item.h"
+
+#include "gkm/gkm-credential.h"
+#include "gkm/gkm-session.h"
+#include "gkm/gkm-transaction.h"
+
+#include "pkcs11/pkcs11i.h"
+
+#include <glib.h>
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+
+typedef struct {
+	GkmModule *module;
+	GkmSession *session;
+	CK_OBJECT_HANDLE credential;
+	CK_OBJECT_HANDLE credential2;
+	GkmSecretCollection *collection;
+} Test;
+
+static void
+setup (Test *test, gconstpointer unused)
+{
+	CK_OBJECT_CLASS klass = CKO_G_CREDENTIAL;
+	GkmObject *cred;
+
+	CK_ATTRIBUTE attrs[] = {
+		{ CKA_CLASS, &klass, sizeof (klass) },
+		{ CKA_VALUE, NULL, 0 }
+	};
+
+	test->module = test_secret_module_initialize_and_enter ();
+	test->session = test_secret_module_open_session (TRUE);
+
+	test->collection = g_object_new (GKM_TYPE_SECRET_COLLECTION,
+	                           "module", test->module,
+	                           "identifier", "test",
+	                           NULL);
+	g_assert (GKM_IS_SECRET_COLLECTION (test->collection));
+
+	/* Make two credentials */
+	cred = gkm_session_create_object_for_factory (test->session, GKM_FACTORY_CREDENTIAL, NULL,
+	                                            attrs, G_N_ELEMENTS (attrs));
+	g_assert (cred != NULL);
+	test->credential = gkm_object_get_handle (GKM_OBJECT (cred));
+	g_object_unref (cred);
+
+	cred = gkm_session_create_object_for_factory (test->session, GKM_FACTORY_CREDENTIAL, NULL,
+	                                            attrs, G_N_ELEMENTS (attrs));
+	g_assert (cred != NULL);
+	test->credential2 = gkm_object_get_handle (GKM_OBJECT (cred));
+	g_object_unref (cred);
+}
+
+static void
+teardown (Test *test, gconstpointer unused)
+{
+	if (test->collection)
+		g_object_unref (test->collection);
+	test->collection = NULL;
+
+	test_secret_module_leave_and_finalize ();
+	test->module = NULL;
+	test->session = NULL;
+	test->credential = 0;
+}
+
+static void
+test_is_locked (Test *test, gconstpointer unused)
+{
+	gboolean locked;
+
+	/* By default is locked */
+	locked = gkm_secret_object_is_locked (GKM_SECRET_OBJECT (test->collection), test->session);
+	g_assert (locked == TRUE);
+}
+
+static void
+test_unlocked_data (Test *test, gconstpointer unused)
+{
+	GkmCredential *cred;
+	GkmSecretData *sdata;
+	CK_RV rv;
+
+	/* Create test->credential, which unlocks test->collection */
+	rv = gkm_credential_create (test->module, gkm_session_get_manager (test->session), GKM_OBJECT (test->collection), NULL, 0, &cred);
+	g_assert (rv == CKR_OK);
+	gkm_session_add_session_object (test->session, NULL, GKM_OBJECT (cred));
+	g_object_unref (cred);
+
+	/* Collection should now be unlocked */
+	sdata = gkm_secret_collection_unlocked_use (test->collection, test->session);
+	g_assert (GKM_IS_SECRET_DATA (sdata));
+	g_assert (!gkm_secret_object_is_locked (GKM_SECRET_OBJECT (test->collection), test->session));
+	g_object_unref (sdata);
+}
+
+static void
+test_get_filename (Test *test, gconstpointer unused)
+{
+	GkmSecretCollection *other;
+	const gchar *filename;
+
+	other = g_object_new (GKM_TYPE_SECRET_COLLECTION,
+	                      "module", test->module,
+	                      "identifier", "test",
+	                      "filename", "/tmp/filename.keyring",
+	                      NULL);
+
+	filename = gkm_secret_collection_get_filename (other);
+	g_assert_cmpstr (filename, ==, "/tmp/filename.keyring");
+
+	g_object_unref (other);
+}
+
+static void
+test_set_filename (Test *test, gconstpointer unused)
+{
+	const gchar *filename;
+
+	gkm_secret_collection_set_filename (test->collection, "/tmp/filename.keyring");
+
+	filename = gkm_secret_collection_get_filename (test->collection);
+	g_assert_cmpstr (filename, ==, "/tmp/filename.keyring");
+}
+
+static void
+test_has_item (Test *test, gconstpointer unused)
+{
+	GkmSecretItem *item;
+
+	item = gkm_secret_collection_new_item (test->collection, "testo");
+	g_assert (gkm_secret_collection_has_item (test->collection, item));
+}
+
+static void
+test_load_unlock_plain (Test *test, gconstpointer unused)
+{
+	GkmCredential *cred;
+	GkmSecretData *sdata;
+	GkmDataResult res;
+	CK_RV rv;
+
+	gkm_secret_collection_set_filename (test->collection, SRCDIR "/files/plain.keyring");
+
+	/* Load the data in the file */
+	res = gkm_secret_collection_load (test->collection);
+	g_assert (res == GKM_DATA_SUCCESS);
+
+	/* Unlock the keyring, which should load again */
+	rv = gkm_credential_create (test->module, gkm_session_get_manager (test->session), GKM_OBJECT (test->collection), NULL, 0, &cred);
+	g_assert (rv == CKR_OK);
+	gkm_session_add_session_object (test->session, NULL, GKM_OBJECT (cred));
+	g_object_unref (cred);
+
+	sdata = gkm_secret_collection_unlocked_use (test->collection, test->session);
+	g_assert (sdata != NULL && GKM_IS_SECRET_DATA (sdata));
+	test_secret_collection_validate (test->collection, sdata);
+	g_object_unref (sdata);
+}
+
+static void
+test_load_unlock_encrypted (Test *test, gconstpointer unused)
+{
+	GkmCredential *cred;
+	GkmSecretData *sdata;
+	GkmDataResult res;
+	CK_RV rv;
+
+	gkm_secret_collection_set_filename (test->collection, SRCDIR "/files/encrypted.keyring");
+
+	/* Load the data in the file */
+	res = gkm_secret_collection_load (test->collection);
+	g_assert (res == GKM_DATA_SUCCESS);
+
+	/* Unlock the keyring, which should load again */
+	rv = gkm_credential_create (test->module, gkm_session_get_manager (test->session), GKM_OBJECT (test->collection),
+	                            (guchar*)"my-keyring-password", 19, &cred);
+	g_assert (rv == CKR_OK);
+	gkm_session_add_session_object (test->session, NULL, GKM_OBJECT (cred));
+	g_object_unref (cred);
+
+	sdata = gkm_secret_collection_unlocked_use (test->collection, test->session);
+	g_assert (sdata != NULL && GKM_IS_SECRET_DATA (sdata));
+	test_secret_collection_validate (test->collection, sdata);
+	g_object_unref (sdata);
+}
+
+static void
+test_load_unlock_bad_password (Test *test, gconstpointer unused)
+{
+	GkmCredential *cred;
+	GkmDataResult res;
+	CK_RV rv;
+
+	gkm_secret_collection_set_filename (test->collection, SRCDIR "/files/encrypted.keyring");
+
+	/* Load the data in the file */
+	res = gkm_secret_collection_load (test->collection);
+	g_assert (res == GKM_DATA_SUCCESS);
+
+	/* Unlock the keyring, which should load again */
+	rv = gkm_credential_create (test->module, gkm_session_get_manager (test->session), GKM_OBJECT (test->collection),
+	                            (guchar*)"wrong", 5, &cred);
+	g_assert (rv == CKR_PIN_INCORRECT);
+}
+
+static void
+test_unlock_without_load (Test *test, gconstpointer unused)
+{
+	GkmCredential *cred;
+	GkmSecretData *sdata;
+	CK_RV rv;
+
+	gkm_secret_collection_set_filename (test->collection, SRCDIR "/files/encrypted.keyring");
+
+	/* Unlock the keyring, which should load it */
+	rv = gkm_credential_create (test->module, gkm_session_get_manager (test->session), GKM_OBJECT (test->collection),
+	                            (guchar*)"my-keyring-password", 19, &cred);
+	g_assert (rv == CKR_OK);
+	gkm_session_add_session_object (test->session, NULL, GKM_OBJECT (cred));
+	g_object_unref (cred);
+
+	sdata = gkm_secret_collection_unlocked_use (test->collection, test->session);
+	g_assert (sdata != NULL && GKM_IS_SECRET_DATA (sdata));
+	test_secret_collection_validate (test->collection, sdata);
+	g_object_unref (sdata);
+}
+
+static void
+test_twice_unlock (Test *test, gconstpointer unused)
+{
+	GkmCredential *cred;
+	GkmSecretData *sdata;
+	CK_RV rv;
+
+	gkm_secret_collection_set_filename (test->collection, SRCDIR "/files/encrypted.keyring");
+
+	/* Unlock the keyring, which should load */
+	rv = gkm_credential_create (test->module, gkm_session_get_manager (test->session), GKM_OBJECT (test->collection),
+	                            (guchar*)"my-keyring-password", 19, &cred);
+	g_assert (rv == CKR_OK);
+	gkm_session_add_session_object (test->session, NULL, GKM_OBJECT (cred));
+	g_object_unref (cred);
+
+	/* Unlock the keyring again, which should not reload */
+	rv = gkm_credential_create (test->module, gkm_session_get_manager (test->session), GKM_OBJECT (test->collection),
+	                            (guchar*)"my-keyring-password", 19, &cred);
+	g_assert (rv == CKR_OK);
+	gkm_session_add_session_object (test->session, NULL, GKM_OBJECT (cred));
+	g_object_unref (cred);
+
+	sdata = gkm_secret_collection_unlocked_use (test->collection, test->session);
+	g_assert (sdata != NULL && GKM_IS_SECRET_DATA (sdata));
+	test_secret_collection_validate (test->collection, sdata);
+	g_object_unref (sdata);
+}
+
+static void
+test_twice_unlock_bad_password (Test *test, gconstpointer unused)
+{
+	GkmCredential *cred;
+	GkmSecretData *sdata;
+	CK_RV rv;
+
+	gkm_secret_collection_set_filename (test->collection, SRCDIR "/files/encrypted.keyring");
+
+	/* Unlock the keyring, which should load */
+	rv = gkm_credential_create (test->module, gkm_session_get_manager (test->session), GKM_OBJECT (test->collection),
+	                               (guchar*)"my-keyring-password", 19, &cred);
+	g_assert (rv == CKR_OK);
+	gkm_session_add_session_object (test->session, NULL, GKM_OBJECT (cred));
+	g_object_unref (cred);
+
+	/* Unlock the keyring again, wrong password */
+	rv = gkm_credential_create (test->module, gkm_session_get_manager (test->session), GKM_OBJECT (test->collection),
+	                            (guchar*)"wrong", 5, &cred);
+	g_assert (rv == CKR_PIN_INCORRECT);
+
+	sdata = gkm_secret_collection_unlocked_use (test->collection, test->session);
+	g_assert (sdata != NULL && GKM_IS_SECRET_DATA (sdata));
+	test_secret_collection_validate (test->collection, sdata);
+	g_object_unref (sdata);
+}
+
+static void
+test_memory_unlock (Test *test, gconstpointer unused)
+{
+	GkmCredential *cred;
+	GkmDataResult res;
+	CK_RV rv;
+
+	/* Load the data in the file */
+	res = gkm_secret_collection_load (test->collection);
+	g_assert (res == GKM_DATA_SUCCESS);
+
+	/* Unlock the keyring, which should load again */
+	rv = gkm_credential_create (test->module, gkm_session_get_manager (test->session), GKM_OBJECT (test->collection),
+	                            NULL, 0, &cred);
+	g_assert (rv == CKR_OK);
+	gkm_session_add_session_object (test->session, NULL, GKM_OBJECT (cred));
+	g_object_unref (cred);
+}
+
+static void
+test_memory_unlock_bad_password (Test *test, gconstpointer unused)
+{
+	GkmCredential *cred;
+	GkmDataResult res;
+	CK_RV rv;
+
+	/* Load the data in the file */
+	res = gkm_secret_collection_load (test->collection);
+	g_assert (res == GKM_DATA_SUCCESS);
+
+	/* Unlock the keyring, which should load again */
+	rv = gkm_credential_create (test->module, gkm_session_get_manager (test->session), GKM_OBJECT (test->collection),
+	                            (guchar*)"wrong", 5, &cred);
+	g_assert (rv == CKR_PIN_INCORRECT);
+}
+
+static void
+test_factory (Test *test, gconstpointer unused)
+{
+	CK_OBJECT_CLASS klass = CKO_G_COLLECTION;
+	GkmObject *object;
+
+	CK_ATTRIBUTE attrs[] = {
+		{ CKA_CLASS, &klass, sizeof (klass) },
+		{ CKA_LABEL, "blah", 4 },
+		{ CKA_G_CREDENTIAL, &test->credential, sizeof (test->credential) },
+	};
+
+	object = gkm_session_create_object_for_factory (test->session, GKM_FACTORY_SECRET_COLLECTION, NULL,
+	                                                attrs, G_N_ELEMENTS (attrs));
+	g_assert (object != NULL);
+	g_assert (GKM_IS_SECRET_COLLECTION (object));
+
+	g_assert_cmpstr (gkm_secret_object_get_label (GKM_SECRET_OBJECT (object)), ==, "blah");
+	g_object_unref (object);
+}
+
+static void
+test_factory_unnamed (Test *test, gconstpointer unused)
+{
+	CK_OBJECT_CLASS klass = CKO_G_COLLECTION;
+	const gchar *identifier;
+	GkmObject *object;
+
+	CK_ATTRIBUTE attrs[] = {
+		{ CKA_CLASS, &klass, sizeof (klass) },
+		{ CKA_G_CREDENTIAL, &test->credential, sizeof (test->credential) },
+	};
+
+	object = gkm_session_create_object_for_factory (test->session, GKM_FACTORY_SECRET_COLLECTION, NULL,
+	                                                attrs, G_N_ELEMENTS (attrs));
+	g_assert (object != NULL);
+	g_assert (GKM_IS_SECRET_COLLECTION (object));
+
+	identifier = gkm_secret_object_get_identifier (GKM_SECRET_OBJECT (object));
+	g_assert_cmpstr (identifier, !=, "");
+	g_object_unref (object);
+}
+
+static void
+test_factory_token (Test *test, gconstpointer unused)
+{
+	CK_OBJECT_CLASS klass = CKO_G_COLLECTION;
+	const gchar *identifier;
+	GkmObject *object;
+	CK_BBOOL token = CK_TRUE;
+
+	CK_ATTRIBUTE attrs[] = {
+		{ CKA_CLASS, &klass, sizeof (klass) },
+		{ CKA_TOKEN, &token, sizeof (token) },
+		{ CKA_LABEL, "blah", 4 },
+		{ CKA_G_CREDENTIAL, &test->credential, sizeof (test->credential) },
+	};
+
+	object = gkm_session_create_object_for_factory (test->session, GKM_FACTORY_SECRET_COLLECTION, NULL,
+	                                                attrs, G_N_ELEMENTS (attrs));
+	g_assert (object != NULL);
+	g_assert (GKM_IS_SECRET_COLLECTION (object));
+
+	identifier = gkm_secret_object_get_identifier (GKM_SECRET_OBJECT (object));
+	g_assert (strstr (identifier, "blah"));
+	g_object_unref (object);
+}
+
+static void
+test_factory_duplicate (Test *test, gconstpointer unused)
+{
+	CK_OBJECT_CLASS klass = CKO_G_COLLECTION;
+	const gchar *identifier1, *identifier2;
+	GkmObject *object;
+
+	CK_ATTRIBUTE attrs[] = {
+		{ CKA_G_CREDENTIAL, &test->credential, sizeof (test->credential) },
+		{ CKA_CLASS, &klass, sizeof (klass) },
+		{ CKA_LABEL, "blah", 4 },
+	};
+
+	object = gkm_session_create_object_for_factory (test->session, GKM_FACTORY_SECRET_COLLECTION, NULL,
+	                                                attrs, G_N_ELEMENTS (attrs));
+	g_assert (object != NULL);
+	g_assert (GKM_IS_SECRET_COLLECTION (object));
+
+	identifier1 = gkm_secret_object_get_identifier (GKM_SECRET_OBJECT (object));
+	g_assert (strstr (identifier1, "blah"));
+	g_object_unref (object);
+
+	/* Use second test->credential for second object */
+	attrs[0].pValue = &test->credential2;
+	object = gkm_session_create_object_for_factory (test->session, GKM_FACTORY_SECRET_COLLECTION, NULL,
+	                                                attrs, G_N_ELEMENTS (attrs));
+	g_assert (object != NULL);
+	g_assert (GKM_IS_SECRET_COLLECTION (object));
+
+	identifier2 = gkm_secret_object_get_identifier (GKM_SECRET_OBJECT (object));
+	g_assert (strstr (identifier2, "blah"));
+	g_object_unref (object);
+
+	g_assert_cmpstr (identifier1, !=, identifier2);
+}
+
+static void
+test_factory_item (Test *test, gconstpointer unused)
+{
+	CK_OBJECT_CLASS c_klass = CKO_G_COLLECTION;
+	CK_OBJECT_CLASS i_klass = CKO_SECRET_KEY;
+	const gchar *identifier;
+	GkmObject *object;
+	CK_BBOOL token = CK_TRUE;
+
+	CK_ATTRIBUTE c_attrs[] = {
+		{ CKA_CLASS, &c_klass, sizeof (c_klass) },
+		{ CKA_TOKEN, &token, sizeof (token) },
+		{ CKA_LABEL, "three", 5 },
+		{ CKA_G_CREDENTIAL, &test->credential, sizeof (test->credential) },
+	};
+
+	CK_ATTRIBUTE i_attrs[] = {
+		{ CKA_G_COLLECTION, NULL, 0 }, /* Filled below */
+		{ CKA_CLASS, &i_klass, sizeof (i_klass) },
+		{ CKA_TOKEN, &token, sizeof (token) },
+		{ CKA_LABEL, "Item", 4 },
+	};
+
+	object = gkm_session_create_object_for_factory (test->session, GKM_FACTORY_SECRET_COLLECTION, NULL,
+	                                                c_attrs, G_N_ELEMENTS (c_attrs));
+	g_assert (object != NULL);
+	g_assert (GKM_IS_SECRET_COLLECTION (object));
+	identifier = gkm_secret_object_get_identifier (GKM_SECRET_OBJECT (object));
+	g_object_unref (object);
+
+	i_attrs[0].pValue = (gpointer)identifier;
+	i_attrs[0].ulValueLen = strlen (identifier);
+	object = gkm_session_create_object_for_factory (test->session, GKM_FACTORY_SECRET_ITEM, NULL,
+	                                                i_attrs, G_N_ELEMENTS (i_attrs));
+	g_assert (object != NULL);
+	g_assert (GKM_IS_SECRET_ITEM (object));
+	g_object_unref (object);
+}
+
+static void
+test_token_remove (Test *test, gconstpointer unused)
+{
+	CK_OBJECT_CLASS klass = CKO_G_COLLECTION;
+	GkmTransaction *transaction;
+	GkmObject *object;
+	CK_BBOOL token = CK_TRUE;
+
+	CK_ATTRIBUTE attrs[] = {
+		{ CKA_CLASS, &klass, sizeof (klass) },
+		{ CKA_TOKEN, &token, sizeof (token) },
+		{ CKA_LABEL, "blah", 4 },
+		{ CKA_G_CREDENTIAL, &test->credential, sizeof (test->credential) },
+	};
+
+	object = gkm_session_create_object_for_factory (test->session, GKM_FACTORY_SECRET_COLLECTION, NULL,
+	                                                attrs, G_N_ELEMENTS (attrs));
+	g_assert (object != NULL);
+	g_assert (GKM_IS_SECRET_COLLECTION (object));
+
+	transaction = gkm_transaction_new ();
+	gkm_module_remove_token_object (test->module, transaction, object);
+	g_assert (!gkm_transaction_get_failed (transaction));
+	gkm_transaction_complete (transaction);
+	g_object_unref (transaction);
+	g_object_unref (object);
+}
+
+static void
+test_token_item_remove (Test *test, gconstpointer unused)
+{
+	CK_OBJECT_CLASS c_klass = CKO_G_COLLECTION;
+	CK_OBJECT_CLASS i_klass = CKO_SECRET_KEY;
+	GkmTransaction *transaction;
+	const gchar *identifier;
+	GkmObject *object;
+	CK_BBOOL token = CK_TRUE;
+
+	CK_ATTRIBUTE c_attrs[] = {
+		{ CKA_CLASS, &c_klass, sizeof (c_klass) },
+		{ CKA_TOKEN, &token, sizeof (token) },
+		{ CKA_LABEL, "three", 5 },
+		{ CKA_G_CREDENTIAL, &test->credential, sizeof (test->credential) },
+	};
+
+	CK_ATTRIBUTE i_attrs[] = {
+		{ CKA_G_COLLECTION, NULL, 0 }, /* Filled below */
+		{ CKA_CLASS, &i_klass, sizeof (i_klass) },
+		{ CKA_TOKEN, &token, sizeof (token) },
+		{ CKA_LABEL, "Item", 4 },
+	};
+
+	object = gkm_session_create_object_for_factory (test->session, GKM_FACTORY_SECRET_COLLECTION, NULL,
+	                                                c_attrs, G_N_ELEMENTS (c_attrs));
+	g_assert (object != NULL);
+	g_assert (GKM_IS_SECRET_COLLECTION (object));
+	identifier = gkm_secret_object_get_identifier (GKM_SECRET_OBJECT (object));
+	g_object_unref (object);
+
+	i_attrs[0].pValue = (gpointer)identifier;
+	i_attrs[0].ulValueLen = strlen (identifier);
+	object = gkm_session_create_object_for_factory (test->session, GKM_FACTORY_SECRET_ITEM, NULL,
+	                                                i_attrs, G_N_ELEMENTS (i_attrs));
+	g_assert (object != NULL);
+	g_assert (GKM_IS_SECRET_ITEM (object));
+
+	transaction = gkm_transaction_new ();
+	gkm_module_remove_token_object (test->module, transaction, object);
+	g_assert (!gkm_transaction_get_failed (transaction));
+	gkm_transaction_complete (transaction);
+	g_object_unref (transaction);
+	g_object_unref (object);
+}
+
+int
+main (int argc, char **argv)
+{
+	g_type_init ();
+	g_test_init (&argc, &argv, NULL);
+
+	g_test_add ("/secret-store/collection/is_locked", Test, NULL, setup, test_is_locked, teardown);
+	g_test_add ("/secret-store/collection/unlocked_data", Test, NULL, setup, test_unlocked_data, teardown);
+	g_test_add ("/secret-store/collection/get_filename", Test, NULL, setup, test_get_filename, teardown);
+	g_test_add ("/secret-store/collection/set_filename", Test, NULL, setup, test_set_filename, teardown);
+	g_test_add ("/secret-store/collection/has_item", Test, NULL, setup, test_has_item, teardown);
+	g_test_add ("/secret-store/collection/load_unlock_plain", Test, NULL, setup, test_load_unlock_plain, teardown);
+	g_test_add ("/secret-store/collection/load_unlock_encrypted", Test, NULL, setup, test_load_unlock_encrypted, teardown);
+	g_test_add ("/secret-store/collection/load_unlock_bad_password", Test, NULL, setup, test_load_unlock_bad_password, teardown);
+	g_test_add ("/secret-store/collection/unlock_without_load", Test, NULL, setup, test_unlock_without_load, teardown);
+	g_test_add ("/secret-store/collection/twice_unlock", Test, NULL, setup, test_twice_unlock, teardown);
+	g_test_add ("/secret-store/collection/twice_unlock_bad_password", Test, NULL, setup, test_twice_unlock_bad_password, teardown);
+	g_test_add ("/secret-store/collection/memory_unlock", Test, NULL, setup, test_memory_unlock, teardown);
+	g_test_add ("/secret-store/collection/memory_unlock_bad_password", Test, NULL, setup, test_memory_unlock_bad_password, teardown);
+	g_test_add ("/secret-store/collection/factory", Test, NULL, setup, test_factory, teardown);
+	g_test_add ("/secret-store/collection/factory_unnamed", Test, NULL, setup, test_factory_unnamed, teardown);
+	g_test_add ("/secret-store/collection/factory_token", Test, NULL, setup, test_factory_token, teardown);
+	g_test_add ("/secret-store/collection/factory_duplicate", Test, NULL, setup, test_factory_duplicate, teardown);
+	g_test_add ("/secret-store/collection/factory_item", Test, NULL, setup, test_factory_item, teardown);
+	g_test_add ("/secret-store/collection/token_remove", Test, NULL, setup, test_token_remove, teardown);
+	g_test_add ("/secret-store/collection/token_item_remove", Test, NULL, setup, test_token_item_remove, teardown);
+
+	return g_test_run ();
+}
diff --git a/pkcs11/secret-store/tests/unit-test-secret-compat.c b/pkcs11/secret-store/tests/test-secret-compat.c
similarity index 84%
rename from pkcs11/secret-store/tests/unit-test-secret-compat.c
rename to pkcs11/secret-store/tests/test-secret-compat.c
index 925c729..f11b0e2 100644
--- a/pkcs11/secret-store/tests/unit-test-secret-compat.c
+++ b/pkcs11/secret-store/tests/test-secret-compat.c
@@ -1,5 +1,5 @@
 /* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */
-/* unit-test-secret-compat.c: Test secret compat files
+/* test-secret-compat.c: Test secret compat files
 
    Copyright (C) 2008 Stefan Walter
 
@@ -23,9 +23,7 @@
 
 #include "config.h"
 
-#include "test-suite.h"
-
-#include "gkm-secret-compat.h"
+#include "secret-store/gkm-secret-compat.h"
 
 #include <glib.h>
 
@@ -33,7 +31,8 @@
 #include <stdio.h>
 #include <string.h>
 
-TESTING_TEST(access_free)
+static void
+test_access_free (void)
 {
 	GkmSecretAccess *ac;
 
@@ -45,7 +44,8 @@ TESTING_TEST(access_free)
 	gkm_secret_compat_access_free (ac);
 }
 
-TESTING_TEST(acl_free)
+static void
+test_acl_free (void)
 {
 	GkmSecretAccess *ac;
 	GList *acl = NULL;
@@ -62,7 +62,8 @@ TESTING_TEST(acl_free)
 	gkm_secret_compat_acl_free (acl);
 }
 
-TESTING_TEST(parse_item_type)
+static void
+test_parse_item_type (void)
 {
 	guint type;
 
@@ -88,7 +89,8 @@ TESTING_TEST(parse_item_type)
 	g_assert_cmpuint (type, ==, 0);
 }
 
-TESTING_TEST(format_item_type)
+static void
+test_format_item_type (void)
 {
 	const gchar *type;
 
@@ -113,3 +115,16 @@ TESTING_TEST(format_item_type)
 	type = gkm_secret_compat_format_item_type (32);
 	g_assert (type == NULL);
 }
+
+int
+main (int argc, char **argv)
+{
+	g_test_init (&argc, &argv, NULL);
+
+	g_test_add_func ("/secret-store/compat/access_free", test_access_free);
+	g_test_add_func ("/secret-store/compat/acl_free", test_acl_free);
+	g_test_add_func ("/secret-store/compat/parse_item_type", test_parse_item_type);
+	g_test_add_func ("/secret-store/compat/format_item_type", test_format_item_type);
+
+	return g_test_run ();
+}
diff --git a/pkcs11/secret-store/tests/unit-test-secret-data.c b/pkcs11/secret-store/tests/test-secret-data.c
similarity index 83%
rename from pkcs11/secret-store/tests/unit-test-secret-data.c
rename to pkcs11/secret-store/tests/test-secret-data.c
index efa6b25..a71e301 100644
--- a/pkcs11/secret-store/tests/unit-test-secret-data.c
+++ b/pkcs11/secret-store/tests/test-secret-data.c
@@ -1,5 +1,5 @@
 /* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */
-/* unit-test-secret-compat.c: Test secret compat files
+/* test-secret-compat.c: Test secret compat files
 
    Copyright (C) 2008 Stefan Walter
 
@@ -23,27 +23,31 @@
 
 #include "config.h"
 
-#include "test-suite.h"
-
-#include "gkm-secret-data.h"
+#include "secret-store/gkm-secret-data.h"
 
 #include "gkm/gkm-secret.h"
 #include "gkm/gkm-transaction.h"
 
+#include "egg/egg-secure-memory.h"
+
 #include <glib.h>
 
 #include <stdlib.h>
 #include <stdio.h>
 #include <string.h>
 
-TESTING_TEST(secret_data_new)
+EGG_SECURE_GLIB_DEFINITIONS ();
+
+static void
+test_new (void)
 {
 	GkmSecretData *data = g_object_new (GKM_TYPE_SECRET_DATA, NULL);
 	g_assert (GKM_IS_SECRET_DATA (data));
 	g_object_unref (data);
 }
 
-TESTING_TEST(secret_data_get_set)
+static void
+test_get_set (void)
 {
 	GkmSecretData *data = g_object_new (GKM_TYPE_SECRET_DATA, NULL);
 	GkmSecret *secret = gkm_secret_new_from_password ("barn");
@@ -60,7 +64,8 @@ TESTING_TEST(secret_data_get_set)
 	g_object_unref (data);
 }
 
-TESTING_TEST(secret_data_get_raw)
+static void
+test_get_raw (void)
 {
 	GkmSecretData *data = g_object_new (GKM_TYPE_SECRET_DATA, NULL);
 	GkmSecret *secret = gkm_secret_new_from_password ("barn");
@@ -81,7 +86,8 @@ TESTING_TEST(secret_data_get_raw)
 	g_object_unref (data);
 }
 
-TESTING_TEST(secret_data_remove)
+static void
+test_remove (void)
 {
 	GkmSecretData *data = g_object_new (GKM_TYPE_SECRET_DATA, NULL);
 	GkmSecret *secret = gkm_secret_new_from_password ("barn");
@@ -99,7 +105,8 @@ TESTING_TEST(secret_data_remove)
 	g_object_unref (data);
 }
 
-TESTING_TEST(secret_data_set_transacted)
+static void
+test_set_transacted (void)
 {
 	GkmTransaction *transaction = gkm_transaction_new ();
 	GkmSecretData *data = g_object_new (GKM_TYPE_SECRET_DATA, NULL);
@@ -120,7 +127,8 @@ TESTING_TEST(secret_data_set_transacted)
 	g_object_unref (transaction);
 }
 
-TESTING_TEST(secret_data_set_transacted_replace)
+static void
+test_set_transacted_replace (void)
 {
 	GkmTransaction *transaction = gkm_transaction_new ();
 	GkmSecretData *data = g_object_new (GKM_TYPE_SECRET_DATA, NULL);
@@ -147,7 +155,8 @@ TESTING_TEST(secret_data_set_transacted_replace)
 	g_object_unref (transaction);
 }
 
-TESTING_TEST(secret_data_set_transacted_fail)
+static void
+test_set_transacted_fail (void)
 {
 	GkmTransaction *transaction = gkm_transaction_new ();
 	GkmSecretData *data = g_object_new (GKM_TYPE_SECRET_DATA, NULL);
@@ -169,7 +178,8 @@ TESTING_TEST(secret_data_set_transacted_fail)
 	g_object_unref (transaction);
 }
 
-TESTING_TEST(secret_data_set_transacted_fail_revert)
+static void
+test_set_transacted_fail_revert (void)
 {
 	GkmTransaction *transaction = gkm_transaction_new ();
 	GkmSecretData *data = g_object_new (GKM_TYPE_SECRET_DATA, NULL);
@@ -197,7 +207,8 @@ TESTING_TEST(secret_data_set_transacted_fail_revert)
 	g_object_unref (transaction);
 }
 
-TESTING_TEST(secret_data_get_set_master)
+static void
+test_get_set_master (void)
 {
 	GkmSecretData *data = g_object_new (GKM_TYPE_SECRET_DATA, NULL);
 	GkmSecret *master = gkm_secret_new_from_password ("master");
@@ -213,3 +224,22 @@ TESTING_TEST(secret_data_get_set_master)
 
 	g_object_unref (data);
 }
+
+int
+main (int argc, char **argv)
+{
+	g_type_init ();
+	g_test_init (&argc, &argv, NULL);
+
+	g_test_add_func ("/secret-store/data/new", test_new);
+	g_test_add_func ("/secret-store/data/get_set", test_get_set);
+	g_test_add_func ("/secret-store/data/get_raw", test_get_raw);
+	g_test_add_func ("/secret-store/data/remove", test_remove);
+	g_test_add_func ("/secret-store/data/set_transacted", test_set_transacted);
+	g_test_add_func ("/secret-store/data/set_transacted_replace", test_set_transacted_replace);
+	g_test_add_func ("/secret-store/data/set_transacted_fail", test_set_transacted_fail);
+	g_test_add_func ("/secret-store/data/set_transacted_fail_revert", test_set_transacted_fail_revert);
+	g_test_add_func ("/secret-store/data/get_set_master", test_get_set_master);
+
+	return g_test_run ();
+}
diff --git a/pkcs11/secret-store/tests/unit-test-secret-fields.c b/pkcs11/secret-store/tests/test-secret-fields.c
similarity index 75%
rename from pkcs11/secret-store/tests/unit-test-secret-fields.c
rename to pkcs11/secret-store/tests/test-secret-fields.c
index d69939d..96bb607 100644
--- a/pkcs11/secret-store/tests/unit-test-secret-fields.c
+++ b/pkcs11/secret-store/tests/test-secret-fields.c
@@ -1,5 +1,5 @@
 /* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */
-/* unit-test-secret-fields.c: Test secret fields
+/* test-secret-fields.c: Test secret fields
 
    Copyright (C) 2009 Stefan Walter
 
@@ -23,9 +23,7 @@
 
 #include "config.h"
 
-#include "test-suite.h"
-
-#include "gkm-secret-fields.h"
+#include "secret-store/gkm-secret-fields.h"
 
 #include "pkcs11/pkcs11i.h"
 
@@ -35,20 +33,23 @@
 #include <stdio.h>
 #include <string.h>
 
-TESTING_TEST(fields_new)
+static void
+test_new (void)
 {
 	GHashTable *fields = gkm_secret_fields_new ();
 	g_hash_table_unref (fields);
 }
 
-TESTING_TEST(fields_boxed)
+static void
+test_boxed (void)
 {
 	GType boxed = gkm_secret_fields_boxed_type ();
 	GType check = gkm_secret_fields_boxed_type ();
 	g_assert (boxed == check);
 }
 
-TESTING_TEST(fields_add_get_values)
+static void
+test_add_get_values (void)
 {
 	GHashTable *fields = gkm_secret_fields_new ();
 	const gchar *value;
@@ -69,7 +70,8 @@ TESTING_TEST(fields_add_get_values)
 	g_hash_table_unref (fields);
 }
 
-TESTING_TEST(fields_parse)
+static void
+test_parse (void)
 {
 	CK_ATTRIBUTE attr = { CKA_G_FIELDS, "one\0value1\0two\0value2\0three\0value3\0", 35 };
 	GHashTable *fields;
@@ -90,7 +92,8 @@ TESTING_TEST(fields_parse)
 	g_hash_table_unref (fields);
 }
 
-TESTING_TEST(fields_parse_empty)
+static void
+test_parse_empty (void)
 {
 	CK_ATTRIBUTE attr = { CKA_G_FIELDS, "", 0 };
 	GHashTable *fields;
@@ -104,7 +107,8 @@ TESTING_TEST(fields_parse_empty)
 	g_hash_table_unref (fields);
 }
 
-TESTING_TEST(fields_parse_null_invalid)
+static void
+test_parse_null_invalid (void)
 {
 	CK_ATTRIBUTE attr = { CKA_G_FIELDS, NULL, 5 };
 	GHashTable *fields;
@@ -114,7 +118,8 @@ TESTING_TEST(fields_parse_null_invalid)
 	g_assert (rv == CKR_ATTRIBUTE_VALUE_INVALID);
 }
 
-TESTING_TEST(fields_parse_missing_value)
+static void
+test_parse_missing_value (void)
 {
 	CK_ATTRIBUTE attr = { CKA_G_FIELDS, "one", 3 };
 	GHashTable *fields;
@@ -124,7 +129,8 @@ TESTING_TEST(fields_parse_missing_value)
 	g_assert (rv == CKR_ATTRIBUTE_VALUE_INVALID);
 }
 
-TESTING_TEST(fields_parse_missing_terminator)
+static void
+test_parse_missing_terminator (void)
 {
 	CK_ATTRIBUTE attr = { CKA_G_FIELDS, "one\0value", 9 };
 	GHashTable *fields;
@@ -134,7 +140,8 @@ TESTING_TEST(fields_parse_missing_terminator)
 	g_assert (rv == CKR_ATTRIBUTE_VALUE_INVALID);
 }
 
-TESTING_TEST(fields_parse_not_utf8)
+static void
+test_parse_not_utf8 (void)
 {
 	CK_ATTRIBUTE attr = { CKA_G_FIELDS, "one\0not\234utf8\0", 13 };
 	GHashTable *fields;
@@ -144,7 +151,8 @@ TESTING_TEST(fields_parse_not_utf8)
 	g_assert (rv == CKR_ATTRIBUTE_VALUE_INVALID);
 }
 
-TESTING_TEST(fields_serialize)
+static void
+test_serialize (void)
 {
 	gchar buffer[32];
 	CK_ATTRIBUTE attr = { CKA_G_FIELDS, buffer, 32 };
@@ -162,7 +170,8 @@ TESTING_TEST(fields_serialize)
 	g_hash_table_unref (fields);
 }
 
-TESTING_TEST(fields_serialize_length)
+static void
+test_serialize_length (void)
 {
 	CK_ATTRIBUTE attr = { CKA_G_FIELDS, NULL, 0 };
 	GHashTable *fields;
@@ -178,7 +187,8 @@ TESTING_TEST(fields_serialize_length)
 	g_hash_table_unref (fields);
 }
 
-TESTING_TEST(fields_add_get_compat_uint32)
+static void
+test_add_get_compat_uint32 (void)
 {
 	GHashTable *fields;
 	gboolean ret;
@@ -194,7 +204,8 @@ TESTING_TEST(fields_add_get_compat_uint32)
 	g_hash_table_unref (fields);
 }
 
-TESTING_TEST(fields_get_compat_uint32_fail)
+static void
+test_get_compat_uint32_fail (void)
 {
 	GHashTable *fields;
 	gboolean ret;
@@ -209,7 +220,8 @@ TESTING_TEST(fields_get_compat_uint32_fail)
 	g_hash_table_unref (fields);
 }
 
-TESTING_TEST(fields_get_compat_hashed_string)
+static void
+test_get_compat_hashed_string (void)
 {
 	GHashTable *fields;
 	gboolean ret;
@@ -226,7 +238,8 @@ TESTING_TEST(fields_get_compat_hashed_string)
 	g_hash_table_unref (fields);
 }
 
-TESTING_TEST(fields_get_compat_hashed_already)
+static void
+test_get_compat_hashed_already (void)
 {
 	GHashTable *fields;
 	gboolean ret;
@@ -243,7 +256,8 @@ TESTING_TEST(fields_get_compat_hashed_already)
 	g_hash_table_unref (fields);
 }
 
-TESTING_TEST(fields_get_compat_hashed_uint32)
+static void
+test_get_compat_hashed_uint32 (void)
 {
 	GHashTable *fields;
 	gboolean ret;
@@ -260,7 +274,8 @@ TESTING_TEST(fields_get_compat_hashed_uint32)
 	g_hash_table_unref (fields);
 }
 
-TESTING_TEST(fields_get_compat_hashed_uint32_already)
+static void
+test_get_compat_hashed_uint32_already (void)
 {
 	GHashTable *fields;
 	gboolean ret;
@@ -277,7 +292,8 @@ TESTING_TEST(fields_get_compat_hashed_uint32_already)
 	g_hash_table_unref (fields);
 }
 
-TESTING_TEST(fields_get_names)
+static void
+test_get_names (void)
 {
 	GHashTable *fields;
 	GList *names, *l;
@@ -303,7 +319,8 @@ TESTING_TEST(fields_get_names)
 	g_hash_table_unref (fields);
 }
 
-TESTING_TEST(fields_match)
+static void
+test_match (void)
 {
 	GHashTable *haystack;
 	GHashTable *needle;
@@ -329,7 +346,8 @@ TESTING_TEST(fields_match)
 	g_hash_table_unref (needle);
 }
 
-TESTING_TEST(fields_match_mismatch_value)
+static void
+test_match_mismatch_value (void)
 {
 	GHashTable *haystack;
 	GHashTable *needle;
@@ -348,7 +366,8 @@ TESTING_TEST(fields_match_mismatch_value)
 	g_hash_table_unref (needle);
 }
 
-TESTING_TEST(fields_match_mismatch_field)
+static void
+test_match_mismatch_field (void)
 {
 	GHashTable *haystack;
 	GHashTable *needle;
@@ -367,7 +386,8 @@ TESTING_TEST(fields_match_mismatch_field)
 	g_hash_table_unref (needle);
 }
 
-TESTING_TEST(fields_match_wrong_hashed)
+static void
+test_match_wrong_hashed (void)
 {
 	GHashTable *haystack;
 	GHashTable *needle;
@@ -385,3 +405,35 @@ TESTING_TEST(fields_match_wrong_hashed)
 	g_hash_table_unref (haystack);
 	g_hash_table_unref (needle);
 }
+
+int
+main (int argc, char **argv)
+{
+	g_type_init ();
+	g_test_init (&argc, &argv, NULL);
+
+	g_test_add_func ("/secret-store/fields/new", test_new);
+	g_test_add_func ("/secret-store/fields/boxed", test_boxed);
+	g_test_add_func ("/secret-store/fields/add_get_values", test_add_get_values);
+	g_test_add_func ("/secret-store/fields/parse", test_parse);
+	g_test_add_func ("/secret-store/fields/parse_empty", test_parse_empty);
+	g_test_add_func ("/secret-store/fields/parse_null_invalid", test_parse_null_invalid);
+	g_test_add_func ("/secret-store/fields/parse_missing_value", test_parse_missing_value);
+	g_test_add_func ("/secret-store/fields/parse_missing_terminator", test_parse_missing_terminator);
+	g_test_add_func ("/secret-store/fields/parse_not_utf8", test_parse_not_utf8);
+	g_test_add_func ("/secret-store/fields/serialize", test_serialize);
+	g_test_add_func ("/secret-store/fields/serialize_length", test_serialize_length);
+	g_test_add_func ("/secret-store/fields/add_get_compat_uint32", test_add_get_compat_uint32);
+	g_test_add_func ("/secret-store/fields/get_compat_uint32_fail", test_get_compat_uint32_fail);
+	g_test_add_func ("/secret-store/fields/get_compat_hashed_string", test_get_compat_hashed_string);
+	g_test_add_func ("/secret-store/fields/get_compat_hashed_already", test_get_compat_hashed_already);
+	g_test_add_func ("/secret-store/fields/get_compat_hashed_uint32", test_get_compat_hashed_uint32);
+	g_test_add_func ("/secret-store/fields/get_compat_hashed_uint32_already", test_get_compat_hashed_uint32_already);
+	g_test_add_func ("/secret-store/fields/get_names", test_get_names);
+	g_test_add_func ("/secret-store/fields/match", test_match);
+	g_test_add_func ("/secret-store/fields/match_mismatch_value", test_match_mismatch_value);
+	g_test_add_func ("/secret-store/fields/match_mismatch_field", test_match_mismatch_field);
+	g_test_add_func ("/secret-store/fields/match_wrong_hashed", test_match_wrong_hashed);
+
+	return g_test_run ();
+}
diff --git a/pkcs11/secret-store/tests/test-secret-item.c b/pkcs11/secret-store/tests/test-secret-item.c
new file mode 100644
index 0000000..2198cf2
--- /dev/null
+++ b/pkcs11/secret-store/tests/test-secret-item.c
@@ -0,0 +1,482 @@
+/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */
+/* unit-test-secret-item.c: Test secret item
+
+   Copyright (C) 2009 Stefan Walter
+
+   The Gnome Keyring Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Library General Public License as
+   published by the Free Software Foundation; either version 2 of the
+   License, or (at your option) any later version.
+
+   The Gnome Keyring 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
+   Library General Public License for more details.
+
+   You should have received a copy of the GNU Library General Public
+   License along with the Gnome Library; see the file COPYING.LIB.  If not,
+   write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+   Boston, MA 02111-1307, USA.
+
+   Author: Stef Walter <stef memberwebs com>
+*/
+
+#include "config.h"
+
+#include "mock-secret-module.h"
+
+#include "secret-store/gkm-secret-collection.h"
+#include "secret-store/gkm-secret-fields.h"
+#include "secret-store/gkm-secret-item.h"
+
+#include "gkm/gkm-credential.h"
+#include "gkm/gkm-session.h"
+#include "gkm/gkm-transaction.h"
+
+#include "pkcs11/pkcs11i.h"
+
+#include <glib.h>
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+
+typedef struct {
+	GkmModule *module;
+	GkmSession *session;
+	GkmSecretCollection *collection;
+} Test;
+
+static void
+setup (Test *test, gconstpointer unused)
+{
+	test->module = test_secret_module_initialize_and_enter ();
+	test->session = test_secret_module_open_session (TRUE);
+
+	test->collection = g_object_new (GKM_TYPE_SECRET_COLLECTION,
+	                           "module", test->module,
+	                           "identifier", "test",
+	                           NULL);
+}
+
+static void
+teardown (Test *test, gconstpointer unused)
+{
+	if (test->collection)
+		g_object_unref (test->collection);
+	test_secret_module_leave_and_finalize ();
+}
+
+static void
+unlock_collection (Test *test)
+{
+	GkmCredential *cred;
+	GkmObject *object;
+	CK_RV rv;
+
+	/* Create credential, which unlocks test->collection */
+	object = GKM_OBJECT (test->collection);
+	rv = gkm_credential_create (gkm_object_get_module (object),
+	                            gkm_session_get_manager (test->session),
+	                            object, NULL, 0, &cred);
+	g_assert (rv == CKR_OK);
+
+	gkm_session_add_session_object (test->session, NULL, GKM_OBJECT (cred));
+	g_object_unref (cred);
+}
+
+static void
+test_new (Test *test, gconstpointer unused)
+{
+	GkmSecretItem *item;
+
+	item = gkm_secret_collection_new_item (test->collection, "the-identifier");
+	g_assert (GKM_IS_SECRET_ITEM (item));
+	g_assert_cmpstr (gkm_secret_object_get_identifier (GKM_SECRET_OBJECT (item)), ==, "the-identifier");
+}
+
+static void
+test_create (Test *test, gconstpointer unused)
+{
+	GkmTransaction *transaction;
+	GkmSecretItem *item;
+
+	transaction = gkm_transaction_new ();
+	item = gkm_secret_collection_create_item (test->collection, transaction);
+	g_assert (GKM_IS_SECRET_ITEM (item));
+	g_object_ref (item);
+	g_assert (gkm_secret_collection_has_item (test->collection, item));
+
+	gkm_transaction_complete (transaction);
+	g_object_unref (transaction);
+
+	/* Should still be there */
+	g_assert (gkm_secret_collection_has_item (test->collection, item));
+	g_object_unref (item);
+}
+
+static void
+test_create_failed (Test *test, gconstpointer unused)
+{
+	GkmTransaction *transaction;
+	GkmSecretItem *item;
+
+	transaction = gkm_transaction_new ();
+	item = gkm_secret_collection_create_item (test->collection, transaction);
+	g_assert (GKM_IS_SECRET_ITEM (item));
+	g_object_ref (item);
+	g_assert (gkm_secret_collection_has_item (test->collection, item));
+
+	gkm_transaction_fail (transaction, CKR_GENERAL_ERROR);
+	gkm_transaction_complete (transaction);
+	g_object_unref (transaction);
+
+	/* Should no longer be there */
+	g_assert (!gkm_secret_collection_has_item (test->collection, item));
+	g_object_unref (item);
+}
+
+static void
+test_destroy (Test *test, gconstpointer unused)
+{
+	GkmTransaction *transaction;
+	GkmSecretItem *item;
+
+	item = gkm_secret_collection_new_item (test->collection, "the-identifier");
+	g_assert (gkm_secret_collection_has_item (test->collection, item));
+	g_object_ref (item);
+
+	transaction = gkm_transaction_new ();
+	gkm_secret_collection_destroy_item (test->collection, transaction, item);
+	g_assert (!gkm_secret_collection_has_item (test->collection, item));
+
+	gkm_transaction_complete (transaction);
+	g_object_unref (transaction);
+
+	/* Should not be there */
+	g_assert (!gkm_secret_collection_has_item (test->collection, item));
+	g_object_unref (item);
+}
+
+static void
+test_destroy_failed (Test *test, gconstpointer unused)
+{
+	GkmTransaction *transaction;
+	GkmSecretItem *item;
+
+	item = gkm_secret_collection_new_item (test->collection, "the-identifier");
+	g_assert (gkm_secret_collection_has_item (test->collection, item));
+	g_object_ref (item);
+
+	transaction = gkm_transaction_new ();
+	gkm_secret_collection_destroy_item (test->collection, transaction, item);
+	g_assert (!gkm_secret_collection_has_item (test->collection, item));
+
+	gkm_transaction_fail (transaction, CKR_GENERAL_ERROR);
+	gkm_transaction_complete (transaction);
+	g_object_unref (transaction);
+
+	/* Should be there */
+	g_assert (gkm_secret_collection_has_item (test->collection, item));
+	g_object_unref (item);
+}
+
+static void
+test_collection_get (Test *test, gconstpointer unused)
+{
+	GkmSecretItem *item, *check;
+
+	item = gkm_secret_collection_new_item (test->collection, "the-identifier");
+	g_assert (GKM_IS_SECRET_ITEM (item));
+
+	check = gkm_secret_collection_get_item (test->collection, "the-identifier");
+	g_assert (item == check);
+}
+
+static void
+test_collection_items (Test *test, gconstpointer unused)
+{
+	GList *l, *items;
+	const gchar *identifier;
+
+	gkm_secret_collection_new_item (test->collection, "one-identifier");
+	gkm_secret_collection_new_item (test->collection, "two-identifier");
+	gkm_secret_collection_new_item (test->collection, "three-identifier");
+
+	items = gkm_secret_collection_get_items (test->collection);
+	g_assert_cmpuint (g_list_length (items), ==, 3);
+	for (l = items; l; l = g_list_next (l)) {
+		identifier = gkm_secret_object_get_identifier (l->data);
+		if (!g_str_equal (identifier, "one-identifier") &&
+		    !g_str_equal (identifier, "two-identifier") &&
+		    !g_str_equal (identifier, "three-identifier"))
+			g_assert_not_reached ();
+	}
+
+	g_list_free (items);
+}
+
+static void
+test_collection_remove (Test *test, gconstpointer unused)
+{
+	GkmSecretItem *item;
+
+	item = gkm_secret_collection_new_item (test->collection, "the-identifier");
+	g_assert (gkm_secret_collection_get_item (test->collection, "the-identifier") == item);
+
+	gkm_secret_collection_remove_item (test->collection, item);
+	g_assert (gkm_secret_collection_get_item (test->collection, "the-identifier") == NULL);
+}
+
+static void
+test_is_locked (Test *test, gconstpointer unused)
+{
+	GkmSecretItem *item;
+
+	item = gkm_secret_collection_new_item (test->collection, "the-identifier");
+	g_assert (gkm_secret_object_is_locked (GKM_SECRET_OBJECT (item), test->session) ==
+	          gkm_secret_object_is_locked (GKM_SECRET_OBJECT (test->collection), test->session));
+
+	unlock_collection (test);
+
+	g_assert (gkm_secret_object_is_locked (GKM_SECRET_OBJECT (item), test->session) == FALSE);
+}
+
+static void
+test_get_collection (Test *test, gconstpointer unused)
+{
+	GkmSecretItem *item;
+	item = gkm_secret_collection_new_item (test->collection, "the-identifier");
+	g_assert (gkm_secret_item_get_collection (item) == test->collection);
+}
+
+static void
+test_tracks_collection (Test *test, gconstpointer unused)
+{
+	GkmSecretItem *item;
+	item = gkm_secret_collection_new_item (test->collection, "the-identifier");
+	g_object_ref (item);
+
+	unlock_collection (test);
+
+	/* At this point the item should be 'unlocked' */
+	g_assert (gkm_secret_object_is_locked (GKM_SECRET_OBJECT (item), test->session) == FALSE);
+
+	g_object_unref (test->collection);
+	test->collection = NULL;
+
+	/* Collection went away */
+	g_assert (gkm_secret_item_get_collection (item) == NULL);
+	g_assert (gkm_secret_object_is_locked (GKM_SECRET_OBJECT (item), test->session) == TRUE);
+
+	g_object_unref (item);
+}
+
+static void
+test_get_set_fields (Test *test, gconstpointer unused)
+{
+	GHashTable *fields = gkm_secret_fields_new ();
+	GHashTable *check;
+	GkmSecretItem *item;
+
+	item = gkm_secret_collection_new_item (test->collection, "the-identifier");
+	gkm_secret_item_set_fields (item, fields);
+	gkm_secret_item_set_fields (item, fields);
+
+	check = gkm_secret_item_get_fields (item);
+	g_assert (check == fields);
+
+	g_hash_table_unref (fields);
+}
+
+static void
+test_collection_attr (Test *test, gconstpointer unused)
+{
+	gchar buffer[32];
+	CK_ATTRIBUTE check = { CKA_G_COLLECTION, buffer, 32 };
+	GkmSecretItem *item;
+	CK_RV rv;
+
+	item = gkm_secret_collection_new_item (test->collection, "the-identifier");
+	rv = gkm_object_get_attribute (GKM_OBJECT (item), test->session, &check);
+	g_assert (rv == CKR_OK);
+	g_assert (check.ulValueLen == 4);
+	g_assert (memcmp (buffer, "test", 4) == 0);
+}
+
+static void
+test_secret_attr (Test *test, gconstpointer unused)
+{
+	GkmTransaction *transaction = gkm_transaction_new ();
+	CK_ATTRIBUTE attr = { CKA_VALUE, "hello", 5 };
+	gchar buffer[32];
+	CK_ATTRIBUTE check = { CKA_VALUE, buffer, 32 };
+	GkmSecretItem *item;
+	CK_RV rv;
+
+	unlock_collection (test);
+
+	item = gkm_secret_collection_new_item (test->collection, "the-identifier");
+	gkm_object_set_attribute (GKM_OBJECT (item), test->session, transaction, &attr);
+	g_assert (gkm_transaction_get_failed (transaction) == FALSE);
+	gkm_transaction_complete (transaction);
+	g_assert (gkm_transaction_get_result (transaction) == CKR_OK);
+
+	g_object_unref (transaction);
+
+	rv = gkm_object_get_attribute (GKM_OBJECT (item), test->session, &check);
+	g_assert (rv == CKR_OK);
+	g_assert (check.ulValueLen == 5);
+	g_assert (memcmp (buffer, "hello", 5) == 0);
+}
+
+static void
+test_secret_attr_locked (Test *test, gconstpointer unused)
+{
+	GkmTransaction *transaction = gkm_transaction_new ();
+	CK_ATTRIBUTE attr = { CKA_VALUE, "hello", 5 };
+	gchar buffer[32];
+	CK_ATTRIBUTE check = { CKA_VALUE, buffer, 32 };
+	GkmSecretItem *item;
+	CK_RV rv;
+
+	item = gkm_secret_collection_new_item (test->collection, "the-identifier");
+	gkm_object_set_attribute (GKM_OBJECT (item), test->session, transaction, &attr);
+	g_assert (gkm_transaction_get_failed (transaction) == TRUE);
+	gkm_transaction_complete (transaction);
+	g_assert (gkm_transaction_get_result (transaction) == CKR_USER_NOT_LOGGED_IN);
+
+	g_object_unref (transaction);
+
+	rv = gkm_object_get_attribute (GKM_OBJECT (item), test->session, &check);
+	g_assert (rv == CKR_USER_NOT_LOGGED_IN);
+}
+
+static void
+test_fields_attr (Test *test, gconstpointer unused)
+{
+	GkmTransaction *transaction = gkm_transaction_new ();
+	CK_ATTRIBUTE attr = { CKA_G_FIELDS, "name1\0value1\0name2\0value2", 26 };
+	gchar buffer[32];
+	CK_ATTRIBUTE check = { CKA_G_FIELDS, buffer, 32 };
+	GkmSecretItem *item;
+	GHashTable *fields;
+	const gchar *value;
+	CK_RV rv;
+
+	unlock_collection (test);
+
+	item = gkm_secret_collection_new_item (test->collection, "the-identifier");
+	gkm_object_set_attribute (GKM_OBJECT (item), test->session, transaction, &attr);
+	g_assert (gkm_transaction_get_failed (transaction) == FALSE);
+	gkm_transaction_complete (transaction);
+	g_assert (gkm_transaction_get_result (transaction) == CKR_OK);
+
+	g_object_unref (transaction);
+
+	rv = gkm_object_get_attribute (GKM_OBJECT (item), test->session, &check);
+	g_assert (rv == CKR_OK);
+	g_assert (check.ulValueLen == 26);
+	g_assert (memcmp (buffer, "name1\0value1\0name2\0value2", 26) == 0);
+
+	fields = gkm_secret_item_get_fields (item);
+	g_assert (fields);
+	value = gkm_secret_fields_get (fields, "name1");
+	g_assert_cmpstr (value, ==, "value1");
+	value = gkm_secret_fields_get (fields, "name2");
+	g_assert_cmpstr (value, ==, "value2");
+}
+
+static void
+test_fields_attr_locked (Test *test, gconstpointer unused)
+{
+	GkmTransaction *transaction = gkm_transaction_new ();
+	CK_ATTRIBUTE attr = { CKA_G_FIELDS, "name1\0value1\0name2\0value2", 26 };
+	GkmSecretItem *item;
+
+	item = gkm_secret_collection_new_item (test->collection, "the-identifier");
+	gkm_object_set_attribute (GKM_OBJECT (item), test->session, transaction, &attr);
+	g_assert (gkm_transaction_get_failed (transaction) == TRUE);
+	gkm_transaction_complete (transaction);
+	g_assert (gkm_transaction_get_result (transaction) == CKR_USER_NOT_LOGGED_IN);
+
+	g_object_unref (transaction);
+}
+
+static void
+test_fields_attr_reverts (Test *test, gconstpointer unused)
+{
+	GkmTransaction *transaction = gkm_transaction_new ();
+	CK_ATTRIBUTE attr = { CKA_G_FIELDS, "new\0value\0", 10 };
+	gchar buffer[32];
+	CK_ATTRIBUTE check = { CKA_G_FIELDS, buffer, 32 };
+	GkmSecretItem *item;
+	GHashTable *fields;
+	CK_RV rv;
+
+	unlock_collection (test);
+
+	item = gkm_secret_collection_new_item (test->collection, "the-identifier");
+
+	/* Set the old value like so */
+	fields = gkm_secret_fields_new ();
+	gkm_secret_fields_add (fields, "old", "value");
+	gkm_secret_item_set_fields (item, fields);
+	g_hash_table_unref (fields);
+
+	/* Should show old value */
+	rv = gkm_object_get_attribute (GKM_OBJECT (item), test->session, &check);
+	g_assert (rv == CKR_OK);
+	g_assert (check.ulValueLen == 10);
+	g_assert (memcmp (buffer, "old\0value\0", 10) == 0);
+
+	/* Set the new values */
+	gkm_object_set_attribute (GKM_OBJECT (item), test->session, transaction, &attr);
+	g_assert (gkm_transaction_get_failed (transaction) == FALSE);
+
+	/* Should have the new value */
+	rv = gkm_object_get_attribute (GKM_OBJECT (item), test->session, &check);
+	g_assert (rv == CKR_OK);
+	g_assert (check.ulValueLen == 10);
+	g_assert (memcmp (buffer, "new\0value\0", 10) == 0);
+
+	/* Fail the transaction */
+	gkm_transaction_fail (transaction, CKR_CANCEL);
+	gkm_transaction_complete (transaction);
+
+	/* Should show the old value */
+	rv = gkm_object_get_attribute (GKM_OBJECT (item), test->session, &check);
+	g_assert (rv == CKR_OK);
+	g_assert (check.ulValueLen == 10);
+	g_assert (memcmp (buffer, "old\0value\0", 10) == 0);
+
+	g_object_unref (transaction);
+}
+
+int
+main (int argc, char **argv)
+{
+	g_type_init ();
+	g_test_init (&argc, &argv, NULL);
+
+	g_test_add ("/secret-store/item/new", Test, NULL, setup, test_new, teardown);
+	g_test_add ("/secret-store/item/create", Test, NULL, setup, test_create, teardown);
+	g_test_add ("/secret-store/item/create_failed", Test, NULL, setup, test_create_failed, teardown);
+	g_test_add ("/secret-store/item/destroy", Test, NULL, setup, test_destroy, teardown);
+	g_test_add ("/secret-store/item/destroy_failed", Test, NULL, setup, test_destroy_failed, teardown);
+	g_test_add ("/secret-store/item/collection_get", Test, NULL, setup, test_collection_get, teardown);
+	g_test_add ("/secret-store/item/collection_items", Test, NULL, setup, test_collection_items, teardown);
+	g_test_add ("/secret-store/item/collection_remove", Test, NULL, setup, test_collection_remove, teardown);
+	g_test_add ("/secret-store/item/is_locked", Test, NULL, setup, test_is_locked, teardown);
+	g_test_add ("/secret-store/item/get_collection", Test, NULL, setup, test_get_collection, teardown);
+	g_test_add ("/secret-store/item/tracks_collection", Test, NULL, setup, test_tracks_collection, teardown);
+	g_test_add ("/secret-store/item/get_set_fields", Test, NULL, setup, test_get_set_fields, teardown);
+	g_test_add ("/secret-store/item/collection_attr", Test, NULL, setup, test_collection_attr, teardown);
+	g_test_add ("/secret-store/item/secret_attr", Test, NULL, setup, test_secret_attr, teardown);
+	g_test_add ("/secret-store/item/secret_attr_locked", Test, NULL, setup, test_secret_attr_locked, teardown);
+	g_test_add ("/secret-store/item/fields_attr", Test, NULL, setup, test_fields_attr, teardown);
+	g_test_add ("/secret-store/item/fields_attr_locked", Test, NULL, setup, test_fields_attr_locked, teardown);
+	g_test_add ("/secret-store/item/fields_attr_reverts", Test, NULL, setup, test_fields_attr_reverts, teardown);
+
+	return g_test_run ();
+}
diff --git a/pkcs11/secret-store/tests/test-secret-object.c b/pkcs11/secret-store/tests/test-secret-object.c
new file mode 100644
index 0000000..db235cb
--- /dev/null
+++ b/pkcs11/secret-store/tests/test-secret-object.c
@@ -0,0 +1,302 @@
+/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */
+/*
+   Copyright (C) 2009 Stefan Walter
+
+   The Gnome Keyring Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Library General Public License as
+   published by the Free Software Foundation; either version 2 of the
+   License, or (at your option) any later version.
+
+   The Gnome Keyring 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
+   Library General Public License for more details.
+
+   You should have received a copy of the GNU Library General Public
+   License along with the Gnome Library; see the file COPYING.LIB.  If not,
+   write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+   Boston, MA 02111-1307, USA.
+
+   Author: Stef Walter <stef memberwebs com>
+*/
+
+#include "config.h"
+
+#include "mock-secret-module.h"
+
+#include "secret-store/gkm-secret-object.h"
+
+#include "gkm/gkm-transaction.h"
+
+#include "pkcs11/pkcs11i.h"
+
+#include <glib.h>
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+
+typedef struct {
+	GkmModule *module;
+	GkmSession *session;
+	GkmSecretObject *object;
+} Test;
+
+static void
+setup (Test *test, gconstpointer unused)
+{
+	test->module = test_secret_module_initialize_and_enter ();
+	test->session = test_secret_module_open_session (TRUE);
+
+	test->object = g_object_new (GKM_TYPE_SECRET_OBJECT,
+	                       "module", test->module,
+	                       "identifier", "my-identifier",
+	                       NULL);
+
+	g_assert (GKM_IS_SECRET_OBJECT (test->object));
+}
+
+static void
+teardown (Test *test, gconstpointer unused)
+{
+	g_object_unref (test->object);
+	test_secret_module_leave_and_finalize ();
+}
+
+static void
+test_is_locked (Test *test, gconstpointer unused)
+{
+	/* Plain GkmSecretObject is never locked */
+	g_assert (!gkm_secret_object_is_locked (test->object, test->session));
+}
+
+static void
+test_identifier_prop (Test *test, gconstpointer unused)
+{
+	const gchar *identifier;
+	identifier = gkm_secret_object_get_identifier (test->object);
+	g_assert_cmpstr (identifier, ==, "my-identifier");
+}
+
+static void
+was_notified (GObject *obj, GParamSpec *pspec, gpointer user_data)
+{
+	gboolean* notified = user_data;
+	g_assert (user_data);
+	*notified = TRUE;
+}
+
+static void
+test_created_prop (Test *test, gconstpointer unused)
+{
+	glong created;
+
+	/* Monitor for changes */
+	gboolean notified = FALSE;
+	g_signal_connect (test->object, "notify::created", G_CALLBACK (was_notified), &notified);
+
+	/* Default value */
+	created = gkm_secret_object_get_created (test->object);
+	g_assert (created == 0);
+
+	/* Set a new value */
+	gkm_secret_object_set_created (test->object, 1247930171);
+	g_assert (notified);
+	created = gkm_secret_object_get_created (test->object);
+	g_assert (created == 1247930171);
+}
+
+static void
+test_modified_prop (Test *test, gconstpointer unused)
+{
+	glong modified;
+
+	/* Monitor for changes */
+	gboolean notified = FALSE;
+	g_signal_connect (test->object, "notify::modified", G_CALLBACK (was_notified), &notified);
+
+	/* Default value */
+	modified = gkm_secret_object_get_modified (test->object);
+	g_assert (modified == 0);
+
+	/* Set a new value */
+	gkm_secret_object_set_modified (test->object, 1247930171);
+	g_assert (notified);
+	modified = gkm_secret_object_get_modified (test->object);
+	g_assert (modified == 1247930171);
+}
+
+static void
+test_was_modified (Test *test, gconstpointer unused)
+{
+	GTimeVal tv;
+	g_get_current_time (&tv);
+	gkm_secret_object_was_modified (test->object);
+	g_assert (tv.tv_sec == gkm_secret_object_get_modified (test->object));
+}
+
+static void
+test_label_prop (Test *test, gconstpointer unused)
+{
+	const gchar *label;
+
+	/* Monitor for changes */
+	gboolean notified = FALSE;
+	g_signal_connect (test->object, "notify::label", G_CALLBACK (was_notified), &notified);
+
+	/* Default value */
+	label = gkm_secret_object_get_label (test->object);
+	g_assert_cmpstr (label, ==, "");
+
+	/* Set a new value */
+	gkm_secret_object_set_label (test->object, "hello");
+	g_assert (notified);
+	label = gkm_secret_object_get_label (test->object);
+	g_assert_cmpstr (label, ==, "hello");
+}
+
+static void
+test_identifier_get_attr (Test *test, gconstpointer unused)
+{
+	gchar buffer[32];
+	CK_ATTRIBUTE attr = { CKA_ID, buffer, 32 };
+	CK_RV rv;
+
+	rv = gkm_object_get_attribute (GKM_OBJECT (test->object), test->session, &attr);
+	g_assert (rv == CKR_OK);
+	g_assert (attr.ulValueLen == 13);
+	g_assert (memcmp (buffer, "my-identifier", 13) == 0);
+}
+
+static void
+test_label_get_attr (Test *test, gconstpointer unused)
+{
+	gchar buffer[32];
+	CK_ATTRIBUTE attr = { CKA_LABEL, buffer, 32 };
+	CK_RV rv;
+
+	gkm_secret_object_set_label (test->object, "hello");
+	rv = gkm_object_get_attribute (GKM_OBJECT (test->object), test->session, &attr);
+	g_assert (rv == CKR_OK);
+	g_assert (attr.ulValueLen == 5);
+	g_assert (memcmp (buffer, "hello", 5) == 0);
+}
+
+static void
+test_label_set_attr (Test *test, gconstpointer unused)
+{
+	CK_ATTRIBUTE attr = { CKA_LABEL, "hello", 5 };
+	GkmTransaction *transaction = gkm_transaction_new ();
+
+	/* Monitor for changes */
+	gboolean notified = FALSE;
+	g_signal_connect (test->object, "notify::label", G_CALLBACK (was_notified), &notified);
+
+	gkm_object_set_attribute (GKM_OBJECT (test->object), test->session, transaction, &attr);
+	g_assert (!gkm_transaction_get_failed (transaction));
+	g_assert (!notified); /* Not notified yet */
+
+	g_assert_cmpstr (gkm_secret_object_get_label (test->object), ==, "hello");
+
+	gkm_transaction_complete (transaction);
+	g_assert_cmpstr (gkm_secret_object_get_label (test->object), ==, "hello");
+	g_assert (notified); /* Notified after transaction complete */
+
+	g_object_unref (transaction);
+}
+
+static void
+test_label_set_attr_fail (Test *test, gconstpointer unused)
+{
+	CK_ATTRIBUTE attr = { CKA_LABEL, "hello", 5 };
+	GkmTransaction *transaction = gkm_transaction_new ();
+	gboolean notified = FALSE;
+
+	/* Set an old value */
+	gkm_secret_object_set_label (test->object, "old");
+
+	/* Monitor for changes */
+	g_signal_connect (test->object, "notify::label", G_CALLBACK (was_notified), &notified);
+
+	/* Set a new value */
+	gkm_object_set_attribute (GKM_OBJECT (test->object), test->session, transaction, &attr);
+	g_assert (!gkm_transaction_get_failed (transaction));
+	g_assert (!notified); /* Not notified yet */
+
+	/* Temporarily has new value */
+	g_assert_cmpstr (gkm_secret_object_get_label (test->object), ==, "hello");
+
+	/* Fail and complete transaction */
+	gkm_transaction_fail (transaction, CKR_CANCEL);
+	gkm_transaction_complete (transaction);
+
+	/* Back to old value */
+	g_assert_cmpstr (gkm_secret_object_get_label (test->object), ==, "old");
+	g_assert (!notified); /* Should never have notified */
+
+	g_object_unref (transaction);
+}
+
+static void
+test_modified_get_attr (Test *test, gconstpointer unused)
+{
+	gchar buffer[32];
+	CK_ATTRIBUTE attr = { CKA_G_MODIFIED, buffer, 32 };
+	CK_RV rv;
+
+	gkm_secret_object_set_modified (test->object, 1247930171);
+	rv = gkm_object_get_attribute (GKM_OBJECT (test->object), test->session, &attr);
+	g_assert (rv == CKR_OK);
+	g_assert (attr.ulValueLen == 16);
+	g_assert (memcmp (buffer, "2009071815161100", 16) == 0);
+}
+
+static void
+test_created_get_attr (Test *test, gconstpointer unused)
+{
+	gchar buffer[32];
+	CK_ATTRIBUTE attr = { CKA_G_CREATED, buffer, 32 };
+	CK_RV rv;
+
+	gkm_secret_object_set_created (test->object, 1247930171);
+	rv = gkm_object_get_attribute (GKM_OBJECT (test->object), test->session, &attr);
+	g_assert (rv == CKR_OK);
+	g_assert (attr.ulValueLen == 16);
+	g_assert (memcmp (buffer, "2009071815161100", 16) == 0);
+}
+
+static void
+test_locked_get_attr (Test *test, gconstpointer unused)
+{
+	gchar buffer[32];
+	CK_ATTRIBUTE attr = { CKA_G_LOCKED, buffer, 32 };
+	CK_RV rv;
+
+	rv = gkm_object_get_attribute (GKM_OBJECT (test->object), test->session, &attr);
+	g_assert (rv == CKR_OK);
+	g_assert (attr.ulValueLen == 1);
+	g_assert (memcmp (buffer, "\0", 1) == 0);
+}
+
+int
+main (int argc, char **argv)
+{
+	g_type_init ();
+	g_test_init (&argc, &argv, NULL);
+
+	g_test_add ("/secret-store/object/is_locked", Test, NULL, setup, test_is_locked, teardown);
+	g_test_add ("/secret-store/object/identifier_prop", Test, NULL, setup, test_identifier_prop, teardown);
+	g_test_add ("/secret-store/object/created_prop", Test, NULL, setup, test_created_prop, teardown);
+	g_test_add ("/secret-store/object/modified_prop", Test, NULL, setup, test_modified_prop, teardown);
+	g_test_add ("/secret-store/object/was_modified", Test, NULL, setup, test_was_modified, teardown);
+	g_test_add ("/secret-store/object/label_prop", Test, NULL, setup, test_label_prop, teardown);
+	g_test_add ("/secret-store/object/identifier_get_attr", Test, NULL, setup, test_identifier_get_attr, teardown);
+	g_test_add ("/secret-store/object/label_get_attr", Test, NULL, setup, test_label_get_attr, teardown);
+	g_test_add ("/secret-store/object/label_set_attr", Test, NULL, setup, test_label_set_attr, teardown);
+	g_test_add ("/secret-store/object/label_set_attr_fail", Test, NULL, setup, test_label_set_attr_fail, teardown);
+	g_test_add ("/secret-store/object/modified_get_attr", Test, NULL, setup, test_modified_get_attr, teardown);
+	g_test_add ("/secret-store/object/created_get_attr", Test, NULL, setup, test_created_get_attr, teardown);
+	g_test_add ("/secret-store/object/locked_get_attr", Test, NULL, setup, test_locked_get_attr, teardown);
+
+	return g_test_run ();
+}
diff --git a/pkcs11/secret-store/tests/unit-test-secret-search.c b/pkcs11/secret-store/tests/test-secret-search.c
similarity index 55%
rename from pkcs11/secret-store/tests/unit-test-secret-search.c
rename to pkcs11/secret-store/tests/test-secret-search.c
index ead2aa2..303a314 100644
--- a/pkcs11/secret-store/tests/unit-test-secret-search.c
+++ b/pkcs11/secret-store/tests/test-secret-search.c
@@ -1,6 +1,5 @@
 /* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */
-/* unit-test-secret-collection.c: Test the collection keyring
-
+/*
    Copyright (C) 2009 Stefan Walter
 
    The Gnome Keyring Library is free software; you can redistribute it and/or
@@ -23,13 +22,12 @@
 
 #include "config.h"
 
-#include "test-suite.h"
-#include "test-secret-module.h"
+#include "mock-secret-module.h"
 
-#include "gkm-secret-collection.h"
-#include "gkm-secret-fields.h"
-#include "gkm-secret-item.h"
-#include "gkm-secret-search.h"
+#include "secret-store/gkm-secret-collection.h"
+#include "secret-store/gkm-secret-fields.h"
+#include "secret-store/gkm-secret-item.h"
+#include "secret-store/gkm-secret-search.h"
 
 #include "gkm/gkm-session.h"
 #include "gkm/gkm-transaction.h"
@@ -42,59 +40,62 @@
 #include <stdio.h>
 #include <string.h>
 
-static GkmModule *module = NULL;
-static GkmSession *session = NULL;
-static GkmFactory *factory = NULL;
-static GkmSecretCollection *collection = NULL;
-static GkmSecretItem *item = NULL;
+typedef struct {
+	GkmModule *module;
+	GkmSession *session;
+	GkmFactory *factory;
+	GkmSecretCollection *collection;
+	GkmSecretItem *item;
+} Test;
 
-TESTING_SETUP(secret_search)
+static void
+setup (Test *test, gconstpointer unused)
 {
 	GHashTable *fields;
 
-	module = test_secret_module_initialize_and_enter ();
-	session = test_secret_module_open_session (TRUE);
-	factory = GKM_FACTORY_SECRET_SEARCH;
-	g_assert (factory);
+	test->module = test_secret_module_initialize_and_enter ();
+	test->session = test_secret_module_open_session (TRUE);
+	test->factory = GKM_FACTORY_SECRET_SEARCH;
+	g_assert (test->factory);
 
-	collection = g_object_new (GKM_TYPE_SECRET_COLLECTION,
-	                           "module", module,
-	                           "manager", gkm_session_get_manager (session),
+	test->collection = g_object_new (GKM_TYPE_SECRET_COLLECTION,
+	                           "module", test->module,
+	                           "manager", gkm_session_get_manager (test->session),
 	                           "identifier", "test-collection",
 	                           NULL);
 
-	/* Create an item */
-	item = gkm_secret_collection_new_item (collection, "test-item");
+	/* Create an test->item */
+	test->item = gkm_secret_collection_new_item (test->collection, "test-item");
 	fields = gkm_secret_fields_new ();
 	gkm_secret_fields_add (fields, "name1", "value1");
 	gkm_secret_fields_add (fields, "name2", "value2");
-	gkm_secret_item_set_fields (item, fields);
+	gkm_secret_item_set_fields (test->item, fields);
 	g_hash_table_unref (fields);
 
-	gkm_object_expose (GKM_OBJECT (collection), TRUE);
+	gkm_object_expose (GKM_OBJECT (test->collection), TRUE);
 }
 
-TESTING_TEARDOWN(secret_search)
+static void
+teardown (Test *test, gconstpointer unused)
 {
-	g_object_unref (collection);
-
+	g_object_unref (test->collection);
 	test_secret_module_leave_and_finalize ();
-	module = NULL;
-	session = NULL;
 }
 
-TESTING_TEST(create_search_incomplete)
+static void
+test_incomplete (Test *test, gconstpointer unused)
 {
 	CK_ATTRIBUTE attrs[1];
 	GkmObject *object = NULL;
 	GkmTransaction *transaction = gkm_transaction_new ();
 
-	object = gkm_session_create_object_for_factory (session, factory, transaction, attrs, 0);
+	object = gkm_session_create_object_for_factory (test->session, test->factory, transaction, attrs, 0);
 	g_assert (gkm_transaction_complete_and_unref (transaction) == CKR_TEMPLATE_INCOMPLETE);
 	g_assert (object == NULL);
 }
 
-TESTING_TEST(create_search_bad_fields)
+static void
+test_bad_fields (Test *test, gconstpointer unused)
 {
 	CK_ATTRIBUTE attrs[] = {
 	        { CKA_G_FIELDS, "bad-value", 9 },
@@ -103,12 +104,13 @@ TESTING_TEST(create_search_bad_fields)
 	GkmObject *object = NULL;
 	GkmTransaction *transaction = gkm_transaction_new ();
 
-	object = gkm_session_create_object_for_factory (session, factory, transaction, attrs, 1);
+	object = gkm_session_create_object_for_factory (test->session, test->factory, transaction, attrs, 1);
 	g_assert (gkm_transaction_complete_and_unref (transaction) == CKR_ATTRIBUTE_VALUE_INVALID);
 	g_assert (object == NULL);
 }
 
-TESTING_TEST(create_search)
+static void
+test_new (Test *test, gconstpointer unused)
 {
 	CK_ATTRIBUTE attrs[] = {
 	        { CKA_G_FIELDS, "test\0value\0two\0value2", 22 },
@@ -122,30 +124,30 @@ TESTING_TEST(create_search)
 	gboolean vbool;
 	gsize vsize;
 
-	object = gkm_session_create_object_for_factory (session, factory, NULL, attrs, 1);
+	object = gkm_session_create_object_for_factory (test->session, test->factory, NULL, attrs, 1);
 	g_assert (object != NULL);
 	g_assert (GKM_IS_SECRET_SEARCH (object));
 
-	if (!gkm_object_get_attribute_ulong (object, session, CKA_CLASS, &vulong))
+	if (!gkm_object_get_attribute_ulong (object, test->session, CKA_CLASS, &vulong))
 		g_assert_not_reached ();
 	g_assert (vulong == CKO_G_SEARCH);
 
-	if (!gkm_object_get_attribute_boolean (object, session, CKA_MODIFIABLE, &vbool))
+	if (!gkm_object_get_attribute_boolean (object, test->session, CKA_MODIFIABLE, &vbool))
 		g_assert_not_reached ();
 	g_assert (vbool == CK_TRUE);
 
-	vdata = gkm_object_get_attribute_data (object, session, CKA_G_FIELDS, &vsize);
+	vdata = gkm_object_get_attribute_data (object, test->session, CKA_G_FIELDS, &vsize);
 	g_assert (vdata);
 	g_assert (vsize == attrs[0].ulValueLen);
 	g_free (vdata);
 
-	vdata = gkm_object_get_attribute_data (object, session, CKA_G_COLLECTION, &vsize);
+	vdata = gkm_object_get_attribute_data (object, test->session, CKA_G_COLLECTION, &vsize);
 	g_assert (vdata);
 	g_assert (vsize == 0);
 	g_free (vdata);
 
 	/* No objects matched */
-	vdata = gkm_object_get_attribute_data (object, session, CKA_G_MATCHED, &vsize);
+	vdata = gkm_object_get_attribute_data (object, test->session, CKA_G_MATCHED, &vsize);
 	g_assert (vdata);
 	g_assert (vsize == 0);
 	g_free (vdata);
@@ -155,14 +157,15 @@ TESTING_TEST(create_search)
 	g_assert (fields);
 	g_assert_cmpstr (gkm_secret_fields_get (fields, "test"), ==, "value");
 
-	/* No collection */
+	/* No test->collection */
 	identifier = gkm_secret_search_get_collection_id (GKM_SECRET_SEARCH (object));
 	g_assert (identifier == NULL);
 
 	g_object_unref (object);
 }
 
-TESTING_TEST(create_search_and_match)
+static void
+test_and_match (Test *test, gconstpointer unused)
 {
 	CK_ATTRIBUTE attrs[] = {
 	        { CKA_G_FIELDS, "name1\0value1\0name2\0value2", 26 },
@@ -172,21 +175,22 @@ TESTING_TEST(create_search_and_match)
 	gpointer vdata;
 	gsize vsize;
 
-	object = gkm_session_create_object_for_factory (session, factory, NULL, attrs, 1);
+	object = gkm_session_create_object_for_factory (test->session, test->factory, NULL, attrs, 1);
 	g_assert (object != NULL);
 	g_assert (GKM_IS_SECRET_SEARCH (object));
 
 	/* One object matched */
-	vdata = gkm_object_get_attribute_data (object, session, CKA_G_MATCHED, &vsize);
+	vdata = gkm_object_get_attribute_data (object, test->session, CKA_G_MATCHED, &vsize);
 	g_assert (vdata);
 	g_assert (vsize == sizeof (CK_OBJECT_HANDLE));
-	g_assert (*((CK_OBJECT_HANDLE_PTR)vdata) == gkm_object_get_handle (GKM_OBJECT (item)));
+	g_assert (*((CK_OBJECT_HANDLE_PTR)vdata) == gkm_object_get_handle (GKM_OBJECT (test->item)));
 	g_free (vdata);
 
 	g_object_unref (object);
 }
 
-TESTING_TEST(create_search_and_change_to_match)
+static void
+test_and_change_to_match (Test *test, gconstpointer unused)
 {
 	CK_ATTRIBUTE attrs[] = {
 	        { CKA_G_FIELDS, "name1\0value1", 13 },
@@ -199,15 +203,15 @@ TESTING_TEST(create_search_and_change_to_match)
 
 	/* Make it not match */
 	fields = gkm_secret_fields_new ();
-	gkm_secret_item_set_fields (item, fields);
+	gkm_secret_item_set_fields (test->item, fields);
 	g_hash_table_unref (fields);
 
-	object = gkm_session_create_object_for_factory (session, factory, NULL, attrs, 1);
+	object = gkm_session_create_object_for_factory (test->session, test->factory, NULL, attrs, 1);
 	g_assert (object != NULL);
 	g_assert (GKM_IS_SECRET_SEARCH (object));
 
 	/* Nothing matched */
-	vdata = gkm_object_get_attribute_data (object, session, CKA_G_MATCHED, &vsize);
+	vdata = gkm_object_get_attribute_data (object, test->session, CKA_G_MATCHED, &vsize);
 	g_assert (vsize == 0);
 	g_free (vdata);
 
@@ -215,20 +219,21 @@ TESTING_TEST(create_search_and_change_to_match)
 	fields = gkm_secret_fields_new ();
 	gkm_secret_fields_add (fields, "name1", "value1");
 	gkm_secret_fields_add (fields, "name2", "value2");
-	gkm_secret_item_set_fields (item, fields);
+	gkm_secret_item_set_fields (test->item, fields);
 	g_hash_table_unref (fields);
 
 	/* One object matched */
-	vdata = gkm_object_get_attribute_data (object, session, CKA_G_MATCHED, &vsize);
+	vdata = gkm_object_get_attribute_data (object, test->session, CKA_G_MATCHED, &vsize);
 	g_assert (vdata);
 	g_assert (vsize == sizeof (CK_OBJECT_HANDLE));
-	g_assert (*((CK_OBJECT_HANDLE_PTR)vdata) == gkm_object_get_handle (GKM_OBJECT (item)));
+	g_assert (*((CK_OBJECT_HANDLE_PTR)vdata) == gkm_object_get_handle (GKM_OBJECT (test->item)));
 	g_free (vdata);
 
 	g_object_unref (object);
 }
 
-TESTING_TEST(create_search_and_change_to_not_match)
+static void
+test_and_change_to_not_match (Test *test, gconstpointer unused)
 {
 	CK_ATTRIBUTE attrs[] = {
 	        { CKA_G_FIELDS, "name1\0value1", 13 },
@@ -239,47 +244,49 @@ TESTING_TEST(create_search_and_change_to_not_match)
 	gpointer vdata;
 	gsize vsize;
 
-	object = gkm_session_create_object_for_factory (session, factory, NULL, attrs, 1);
+	object = gkm_session_create_object_for_factory (test->session, test->factory, NULL, attrs, 1);
 	g_assert (object != NULL);
 	g_assert (GKM_IS_SECRET_SEARCH (object));
 
 	/* One object matched */
-	vdata = gkm_object_get_attribute_data (object, session, CKA_G_MATCHED, &vsize);
+	vdata = gkm_object_get_attribute_data (object, test->session, CKA_G_MATCHED, &vsize);
 	g_assert (vdata);
 	g_assert (vsize == sizeof (CK_OBJECT_HANDLE));
-	g_assert (*((CK_OBJECT_HANDLE_PTR)vdata) == gkm_object_get_handle (GKM_OBJECT (item)));
+	g_assert (*((CK_OBJECT_HANDLE_PTR)vdata) == gkm_object_get_handle (GKM_OBJECT (test->item)));
 	g_free (vdata);
 
 	/* Make it not match */
 	fields = gkm_secret_fields_new ();
-	gkm_secret_item_set_fields (item, fields);
+	gkm_secret_item_set_fields (test->item, fields);
 	g_hash_table_unref (fields);
 
 	/* Nothing matched */
-	vdata = gkm_object_get_attribute_data (object, session, CKA_G_MATCHED, &vsize);
+	vdata = gkm_object_get_attribute_data (object, test->session, CKA_G_MATCHED, &vsize);
 	g_assert (vsize == 0);
 	g_free (vdata);
 
 	g_object_unref (object);
 }
 
-TESTING_TEST(create_search_for_bad_collection)
+static void
+test_for_bad_collection (Test *test, gconstpointer unused)
 {
 	CK_ATTRIBUTE attrs[] = {
 	        { CKA_G_FIELDS, "name1\0value1", 13 },
-	        { CKA_G_COLLECTION, "bad-collection", 14 },
+	        { CKA_G_COLLECTION, "bad-test->collection", 14 },
 	};
 
 	GkmObject *object = NULL;
 	GkmTransaction *transaction = gkm_transaction_new ();
 
-	object = gkm_session_create_object_for_factory (session, factory, transaction, attrs, 2);
+	object = gkm_session_create_object_for_factory (test->session, test->factory, transaction, attrs, 2);
 	g_assert (gkm_transaction_complete_and_unref (transaction) == CKR_OK);
 
 	g_object_unref (object);
 }
 
-TESTING_TEST(create_search_for_collection)
+static void
+test_for_collection (Test *test, gconstpointer unused)
 {
 	CK_ATTRIBUTE attrs[] = {
 	        { CKA_G_FIELDS, "name1\0value1", 13 },
@@ -290,28 +297,29 @@ TESTING_TEST(create_search_for_collection)
 	gpointer vdata;
 	gsize vsize;
 
-	object = gkm_session_create_object_for_factory (session, factory, NULL, attrs, 2);
+	object = gkm_session_create_object_for_factory (test->session, test->factory, NULL, attrs, 2);
 	g_assert (object != NULL);
 	g_assert (GKM_IS_SECRET_SEARCH (object));
 
-	/* Should have the collection set properly */
-	vdata = gkm_object_get_attribute_data (object, session, CKA_G_COLLECTION , &vsize);
+	/* Should have the test->collection set properly */
+	vdata = gkm_object_get_attribute_data (object, test->session, CKA_G_COLLECTION , &vsize);
 	g_assert (vdata);
 	g_assert (vsize == 15);
 	g_assert (memcmp (vdata, "test-collection", 15) == 0);
 	g_free (vdata);
 
 	/* One object matched */
-	vdata = gkm_object_get_attribute_data (object, session, CKA_G_MATCHED, &vsize);
+	vdata = gkm_object_get_attribute_data (object, test->session, CKA_G_MATCHED, &vsize);
 	g_assert (vdata);
 	g_assert (vsize == sizeof (CK_OBJECT_HANDLE));
-	g_assert (*((CK_OBJECT_HANDLE_PTR)vdata) == gkm_object_get_handle (GKM_OBJECT (item)));
+	g_assert (*((CK_OBJECT_HANDLE_PTR)vdata) == gkm_object_get_handle (GKM_OBJECT (test->item)));
 	g_free (vdata);
 
 	g_object_unref (object);
 }
 
-TESTING_TEST(create_search_for_collection_no_match)
+static void
+test_for_collection_no_match (Test *test, gconstpointer unused)
 {
 	CK_ATTRIBUTE attrs[] = {
 	        { CKA_G_FIELDS, "test\0value", 11 },
@@ -326,8 +334,8 @@ TESTING_TEST(create_search_for_collection_no_match)
 	gsize vsize;
 
 	ocoll = g_object_new (GKM_TYPE_SECRET_COLLECTION,
-	                      "module", module,
-	                      "manager", gkm_session_get_manager (session),
+	                      "module", test->module,
+	                      "manager", gkm_session_get_manager (test->session),
 	                      "identifier", "other-collection",
 	                      NULL);
 	oitem = gkm_secret_collection_new_item (ocoll, "other-item");
@@ -339,15 +347,34 @@ TESTING_TEST(create_search_for_collection_no_match)
 	gkm_secret_item_set_fields (oitem, fields);
 	g_hash_table_unref (fields);
 
-	object = gkm_session_create_object_for_factory (session, factory, NULL, attrs, 2);
+	object = gkm_session_create_object_for_factory (test->session, test->factory, NULL, attrs, 2);
 	g_assert (object != NULL);
 	g_assert (GKM_IS_SECRET_SEARCH (object));
 
 	/* No objects matched */
-	vdata = gkm_object_get_attribute_data (object, session, CKA_G_MATCHED, &vsize);
+	vdata = gkm_object_get_attribute_data (object, test->session, CKA_G_MATCHED, &vsize);
 	g_assert (vsize == 0);
 	g_free (vdata);
 
 	g_object_unref (object);
 	g_object_unref (ocoll);
 }
+
+int
+main (int argc, char **argv)
+{
+	g_type_init ();
+	g_test_init (&argc, &argv, NULL);
+
+	g_test_add ("/secret-store/search/new", Test, NULL, setup, test_new, teardown);
+	g_test_add ("/secret-store/search/incomplete", Test, NULL, setup, test_incomplete, teardown);
+	g_test_add ("/secret-store/search/bad_fields", Test, NULL, setup, test_bad_fields, teardown);
+	g_test_add ("/secret-store/search/and_match", Test, NULL, setup, test_and_match, teardown);
+	g_test_add ("/secret-store/search/and_change_to_match", Test, NULL, setup, test_and_change_to_match, teardown);
+	g_test_add ("/secret-store/search/and_change_to_not_match", Test, NULL, setup, test_and_change_to_not_match, teardown);
+	g_test_add ("/secret-store/search/for_bad_collection", Test, NULL, setup, test_for_bad_collection, teardown);
+	g_test_add ("/secret-store/search/for_collection", Test, NULL, setup, test_for_collection, teardown);
+	g_test_add ("/secret-store/search/for_collection_no_match", Test, NULL, setup, test_for_collection_no_match, teardown);
+
+	return g_test_run ();
+}
diff --git a/pkcs11/secret-store/tests/test-secret-textual.c b/pkcs11/secret-store/tests/test-secret-textual.c
new file mode 100644
index 0000000..4c8a5ae
--- /dev/null
+++ b/pkcs11/secret-store/tests/test-secret-textual.c
@@ -0,0 +1,205 @@
+/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */
+/*
+   Copyright (C) 2009 Stefan Walter
+
+   The Gnome Keyring Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Library General Public License as
+   published by the Free Software Foundation; either version 2 of the
+   License, or (at your option) any later version.
+
+   The Gnome Keyring 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
+   Library General Public License for more details.
+
+   You should have received a copy of the GNU Library General Public
+   License along with the Gnome Library; see the file COPYING.LIB.  If not,
+   write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+   Boston, MA 02111-1307, USA.
+
+   Author: Stef Walter <stef memberwebs com>
+*/
+
+#include "config.h"
+
+#include "mock-secret-module.h"
+
+#include "secret-store/gkm-secret-collection.h"
+#include "secret-store/gkm-secret-data.h"
+#include "secret-store/gkm-secret-fields.h"
+#include "secret-store/gkm-secret-item.h"
+#include "secret-store/gkm-secret-textual.h"
+
+#include "gkm/gkm-secret.h"
+
+#include "pkcs11/pkcs11i.h"
+
+#include <glib.h>
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+
+typedef struct {
+	GkmModule *module;
+	GkmSession *session;
+	GkmSecretCollection *collection;
+	GkmSecretData *sdata;
+} Test;
+
+static void
+setup (Test *test, gconstpointer unused)
+{
+	test->module = test_secret_module_initialize_and_enter ();
+	test->session = test_secret_module_open_session (TRUE);
+
+	test->collection = g_object_new (GKM_TYPE_SECRET_COLLECTION,
+	                           "module", test->module,
+	                           "identifier", "test",
+	                           "label", "brigadooooooooooooon",
+	                           NULL);
+
+	test->sdata = g_object_new (GKM_TYPE_SECRET_DATA, NULL);
+
+	g_assert (GKM_IS_SECRET_COLLECTION (test->collection));
+
+}
+
+static void
+teardown (Test *test, gconstpointer unused)
+{
+	if (test->collection)
+		g_object_unref (test->collection);
+	if (test->sdata)
+		g_object_unref (test->sdata);
+	test_secret_module_leave_and_finalize ();
+}
+
+static void
+test_read (Test *test, gconstpointer unused)
+{
+	GkmDataResult res;
+	gchar *data;
+	gsize n_data;
+
+	if (!g_file_get_contents (SRCDIR "/files/plain.keyring", &data, &n_data, NULL))
+		g_assert_not_reached ();
+	res = gkm_secret_textual_read (test->collection, test->sdata, data, n_data);
+	g_free (data);
+
+	test_secret_collection_validate (test->collection, test->sdata);
+
+	g_assert (res == GKM_DATA_SUCCESS);
+}
+
+static void
+test_read_wrong_format (Test *test, gconstpointer unused)
+{
+	GkmDataResult res;
+	gchar *data;
+	gsize n_data;
+
+	if (!g_file_get_contents (SRCDIR "/files/encrypted.keyring", &data, &n_data, NULL))
+		g_assert_not_reached ();
+
+	res = gkm_secret_textual_read (test->collection, test->sdata, data, n_data);
+	g_free (data);
+
+	g_assert (res == GKM_DATA_UNRECOGNIZED);
+}
+
+static void
+test_read_bad_number (Test *test, gconstpointer unused)
+{
+	GkmSecretItem *item;
+	GkmDataResult res;
+	const gchar *value;
+	gchar *data;
+	gsize n_data;
+
+	if (!g_file_get_contents (SRCDIR "/files/plain-bad-number.keyring", &data, &n_data, NULL))
+		g_assert_not_reached ();
+	res = gkm_secret_textual_read (test->collection, test->sdata, data, n_data);
+	g_free (data);
+
+	g_assert (res == GKM_DATA_SUCCESS);
+
+	item = gkm_secret_collection_get_item (test->collection, "1");
+	g_assert (GKM_IS_SECRET_ITEM (item));
+	value = gkm_secret_fields_get (gkm_secret_item_get_fields (item), "bad-number");
+	g_assert (value == NULL);
+	value = gkm_secret_fields_get (gkm_secret_item_get_fields (item), "missing-number");
+	g_assert (value == NULL);
+}
+
+static void
+test_write (Test *test, gconstpointer unused)
+{
+	GkmDataResult res;
+	gpointer data;
+	gsize n_data;
+
+	test_secret_collection_populate (test->collection, test->sdata);
+
+	res = gkm_secret_textual_write (test->collection, test->sdata, &data, &n_data);
+	g_assert (res == GKM_DATA_SUCCESS);
+	g_assert (data);
+	g_assert (n_data);
+
+	/* Try parsing it again */
+	res = gkm_secret_textual_read (test->collection, test->sdata, data, n_data);
+	g_assert (res == GKM_DATA_SUCCESS);
+}
+
+static void
+test_remove_unavailable (Test *test, gconstpointer unused)
+{
+	GkmDataResult res;
+	GList *items;
+	gchar *data;
+	gsize n_data;
+
+	if (!g_file_get_contents (SRCDIR "/files/plain.keyring", &data, &n_data, NULL))
+		g_assert_not_reached ();
+	res = gkm_secret_textual_read (test->collection, test->sdata, data, n_data);
+	g_assert (res == GKM_DATA_SUCCESS);
+
+	/* Two items from the file */
+	items = gkm_secret_collection_get_items (test->collection);
+	g_assert_cmpint (g_list_length (items), ==, 2);
+	g_list_free (items);
+
+	/* Fill in some more data */
+	test_secret_collection_populate (test->collection, test->sdata);
+
+	/* Should have added three more */
+	items = gkm_secret_collection_get_items (test->collection);
+	g_assert_cmpint (g_list_length (items), ==, 5);
+	g_list_free (items);
+
+	/* Re-read the keyring */
+	res = gkm_secret_textual_read (test->collection, test->sdata, data, n_data);
+	g_assert (res == GKM_DATA_SUCCESS);
+
+	/* And we're back to two */
+	items = gkm_secret_collection_get_items (test->collection);
+	g_assert_cmpint (g_list_length (items), ==, 2);
+	g_list_free (items);
+
+	g_free (data);
+}
+
+int
+main (int argc, char **argv)
+{
+	g_type_init ();
+	g_test_init (&argc, &argv, NULL);
+
+	g_test_add ("/secret-store/search/read", Test, NULL, setup, test_read, teardown);
+	g_test_add ("/secret-store/search/read_wrong_format", Test, NULL, setup, test_read_wrong_format, teardown);
+	g_test_add ("/secret-store/search/read_bad_number", Test, NULL, setup, test_read_bad_number, teardown);
+	g_test_add ("/secret-store/search/write", Test, NULL, setup, test_write, teardown);
+	g_test_add ("/secret-store/search/remove_unavailable", Test, NULL, setup, test_remove_unavailable, teardown);
+
+	return g_test_run ();
+}
diff --git a/pkcs11/ssh-store/gkm-ssh-openssh.c b/pkcs11/ssh-store/gkm-ssh-openssh.c
index c165cd2..46e8660 100644
--- a/pkcs11/ssh-store/gkm-ssh-openssh.c
+++ b/pkcs11/ssh-store/gkm-ssh-openssh.c
@@ -255,7 +255,7 @@ digest_pem_block (GQuark type, const guchar *data, gsize n_data,
  */
 
 GkmDataResult
-gkm_ssh_openssh_parse_public_key (const guchar *data, gsize n_data,
+gkm_ssh_openssh_parse_public_key (gconstpointer input, gsize n_data,
                                   gcry_sexp_t *sexp, gchar **comment)
 {
 	EggBuffer buf;
@@ -267,6 +267,7 @@ gkm_ssh_openssh_parse_public_key (const guchar *data, gsize n_data,
 	gboolean ret;
 	gint state, algo;
 	guint save;
+	const guchar *data = input;
 
 	g_return_val_if_fail (data, FALSE);
 	g_return_val_if_fail (sexp, FALSE);
@@ -360,7 +361,7 @@ gkm_ssh_openssh_parse_public_key (const guchar *data, gsize n_data,
 }
 
 GkmDataResult
-gkm_ssh_openssh_parse_private_key (const guchar *data, gsize n_data,
+gkm_ssh_openssh_parse_private_key (gconstpointer data, gsize n_data,
                                    const gchar *password, gssize n_password,
                                    gcry_sexp_t *sexp)
 {
diff --git a/pkcs11/ssh-store/gkm-ssh-openssh.h b/pkcs11/ssh-store/gkm-ssh-openssh.h
index 2a2a7d0..fe8db8e 100644
--- a/pkcs11/ssh-store/gkm-ssh-openssh.h
+++ b/pkcs11/ssh-store/gkm-ssh-openssh.h
@@ -7,12 +7,12 @@
 
 #include "gkm/gkm-data-types.h"
 
-GkmDataResult         gkm_ssh_openssh_parse_public_key                   (const guchar *data,
+GkmDataResult         gkm_ssh_openssh_parse_public_key                   (gconstpointer data,
                                                                           gsize n_data,
                                                                           gcry_sexp_t *sexp,
                                                                           gchar **comment);
 
-GkmDataResult         gkm_ssh_openssh_parse_private_key                  (const guchar *data,
+GkmDataResult         gkm_ssh_openssh_parse_private_key                  (gconstpointer data,
                                                                           gsize n_data,
                                                                           const gchar *password,
                                                                           gssize n_password,
diff --git a/pkcs11/ssh-store/tests/Makefile.am b/pkcs11/ssh-store/tests/Makefile.am
index 8f962d2..15a9975 100644
--- a/pkcs11/ssh-store/tests/Makefile.am
+++ b/pkcs11/ssh-store/tests/Makefile.am
@@ -1,19 +1,51 @@
-TESTING_SOURCES = \
-	test-ssh-module.h
 
-TESTING_FILES = \
-	unit-test-ssh-openssh.c \
-	unit-test-private-key.c \
-	test-ssh-module.c
+INCLUDES = \
+	-I$(top_builddir) \
+	-I$(top_srcdir) \
+	-I$(top_srcdir)/pkcs11 \
+	-DSRCDIR="\"$(srcdir)\"" \
+	$(GLIB_CFLAGS) \
+	$(LIBGCRYPT_CFLAGS)
 
-UNIT_PROMPT =
-
-TESTING_LIBS =  \
+LDADD = \
+	libgkm-mock-ssh-module.a \
 	$(top_builddir)/pkcs11/ssh-store/libgkm-ssh-store.la \
 	$(top_builddir)/pkcs11/gkm/libgkm.la \
-	$(top_builddir)/egg/libegg.la
+	$(top_builddir)/egg/libegg.la \
+	$(GLIB_LIBS) \
+	$(LIBGCRYPT_LIBS)
+
+if WITH_P11_TESTS
+CHECK_PROGS = check-ssh-module
+else
+CHECK_PROGS =
+endif
+
+TEST_PROGS = \
+	test-ssh-openssh \
+	test-private-key
+
+check_PROGRAMS = $(TEST_PROGS)
+
+test: $(TEST_PROGS) $(CHECK_PROGS)
+	gtester -k --verbose -m $(TEST_MODE) --g-fatal-warnings $(TEST_PROGS)
+	@for prog in $(CHECK_PROGS); do SRCDIR='.' ./$$prog || exit 1; done
+
+check-local: test
+
+all-local: $(check_PROGRAMS)
+
+EXTRA_DIST = \
+	p11-tests.conf \
+	files
+
+noinst_PROGRAMS = \
+	$(CHECK_PROGS)
+
+check_ssh_module_CFLAGS = $(P11_TESTS_CFLAGS)
+check_ssh_module_LDADD = $(P11_TESTS_LIBS) $(LDADD)
 
-include $(top_srcdir)/testing/testing.make
+noinst_LIBRARIES = libgkm-mock-ssh-module.a
 
-EXTRA_DIST += \
-	test-data
+libgkm_mock_ssh_module_a_SOURCES = \
+	mock-ssh-module.c mock-ssh-module.h
diff --git a/pkcs11/ssh-store/tests/check-ssh-module.c b/pkcs11/ssh-store/tests/check-ssh-module.c
new file mode 100644
index 0000000..eeeb2de
--- /dev/null
+++ b/pkcs11/ssh-store/tests/check-ssh-module.c
@@ -0,0 +1,68 @@
+/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */
+/* check-module.c: Check PKCS#11 implementation
+
+   Copyright (C) 2009 Stefan Walter
+
+   The Gnome Keyring Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Library General Public License as
+   published by the Free Software Foundation; either version 2 of the
+   License, or (at your option) any later version.
+
+   The Gnome Keyring 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
+   Library General Public License for more details.
+
+   You should have received a copy of the GNU Library General Public
+   License along with the Gnome Library; see the file COPYING.LIB.  If not,
+   write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+   Boston, MA 02111-1307, USA.
+
+   Author: Stef Walter <stef memberwebs com>
+*/
+
+#include "config.h"
+
+#include "ssh-store/gkm-ssh-store.h"
+
+#include "egg/egg-secure-memory.h"
+
+#include <glib.h>
+#include <glib-object.h>
+
+#include <p11-tests.h>
+
+static int failures = 0;
+
+EGG_SECURE_GLIB_DEFINITIONS ();
+
+static void
+on_p11_tests_log (int level, const char *section, const char *message)
+{
+	if (level == P11_TESTS_NONE) {
+		g_message ("%s", message);
+	} else if (level != P11_TESTS_FAIL) {
+		g_message ("%s: %s", section, message);
+	} else {
+		g_print ("  /ssh-store/%s: FAIL: %s\n", section, message);
+		++failures;
+	}
+}
+
+int
+main (int argc, const char *argv[])
+{
+	g_type_init ();
+
+	p11_tests_set_log_func (on_p11_tests_log);
+	p11_tests_set_unexpected (1);
+	p11_tests_set_verbose (0);
+	p11_tests_set_write_session (1);
+	p11_tests_load_config (SRCDIR "/p11-tests.conf");
+
+	g_print ("CHECK: check-ssh-module...\n");
+	p11_tests_perform (gkm_ssh_store_get_functions ());
+
+	g_print ("%s: check-ssh-module\n", failures ? "FAIL" : "PASS");
+	return failures;
+}
diff --git a/pkcs11/ssh-store/tests/test-data/id_dsa_encrypted b/pkcs11/ssh-store/tests/files/id_dsa_encrypted
similarity index 100%
rename from pkcs11/ssh-store/tests/test-data/id_dsa_encrypted
rename to pkcs11/ssh-store/tests/files/id_dsa_encrypted
diff --git a/pkcs11/ssh-store/tests/test-data/id_dsa_encrypted.pub b/pkcs11/ssh-store/tests/files/id_dsa_encrypted.pub
similarity index 100%
rename from pkcs11/ssh-store/tests/test-data/id_dsa_encrypted.pub
rename to pkcs11/ssh-store/tests/files/id_dsa_encrypted.pub
diff --git a/pkcs11/ssh-store/tests/test-data/id_dsa_plain b/pkcs11/ssh-store/tests/files/id_dsa_plain
similarity index 100%
rename from pkcs11/ssh-store/tests/test-data/id_dsa_plain
rename to pkcs11/ssh-store/tests/files/id_dsa_plain
diff --git a/pkcs11/ssh-store/tests/test-data/id_dsa_plain.pub b/pkcs11/ssh-store/tests/files/id_dsa_plain.pub
similarity index 100%
rename from pkcs11/ssh-store/tests/test-data/id_dsa_plain.pub
rename to pkcs11/ssh-store/tests/files/id_dsa_plain.pub
diff --git a/pkcs11/ssh-store/tests/test-data/id_dsa_test.pub b/pkcs11/ssh-store/tests/files/id_dsa_test.pub
similarity index 100%
rename from pkcs11/ssh-store/tests/test-data/id_dsa_test.pub
rename to pkcs11/ssh-store/tests/files/id_dsa_test.pub
diff --git a/pkcs11/ssh-store/tests/test-data/id_rsa_encrypted b/pkcs11/ssh-store/tests/files/id_rsa_encrypted
similarity index 100%
rename from pkcs11/ssh-store/tests/test-data/id_rsa_encrypted
rename to pkcs11/ssh-store/tests/files/id_rsa_encrypted
diff --git a/pkcs11/ssh-store/tests/test-data/id_rsa_encrypted.pub b/pkcs11/ssh-store/tests/files/id_rsa_encrypted.pub
similarity index 100%
rename from pkcs11/ssh-store/tests/test-data/id_rsa_encrypted.pub
rename to pkcs11/ssh-store/tests/files/id_rsa_encrypted.pub
diff --git a/pkcs11/ssh-store/tests/test-data/id_rsa_plain b/pkcs11/ssh-store/tests/files/id_rsa_plain
similarity index 100%
rename from pkcs11/ssh-store/tests/test-data/id_rsa_plain
rename to pkcs11/ssh-store/tests/files/id_rsa_plain
diff --git a/pkcs11/ssh-store/tests/test-data/id_rsa_plain.pub b/pkcs11/ssh-store/tests/files/id_rsa_plain.pub
similarity index 100%
rename from pkcs11/ssh-store/tests/test-data/id_rsa_plain.pub
rename to pkcs11/ssh-store/tests/files/id_rsa_plain.pub
diff --git a/pkcs11/ssh-store/tests/test-data/id_rsa_test.pub b/pkcs11/ssh-store/tests/files/id_rsa_test.pub
similarity index 100%
rename from pkcs11/ssh-store/tests/test-data/id_rsa_test.pub
rename to pkcs11/ssh-store/tests/files/id_rsa_test.pub
diff --git a/pkcs11/ssh-store/tests/test-ssh-module.c b/pkcs11/ssh-store/tests/mock-ssh-module.c
similarity index 92%
rename from pkcs11/ssh-store/tests/test-ssh-module.c
rename to pkcs11/ssh-store/tests/mock-ssh-module.c
index 76b2501..2cec728 100644
--- a/pkcs11/ssh-store/tests/test-ssh-module.c
+++ b/pkcs11/ssh-store/tests/mock-ssh-module.c
@@ -22,13 +22,16 @@
 */
 
 #include "config.h"
-#include "test-ssh-module.h"
+
+#include "mock-ssh-module.h"
+
+#include "egg/egg-secure-memory.h"
 
 #include "gkm/gkm-module.h"
 
 #include "ssh-store/gkm-ssh-store.h"
 
-#include "test-suite.h"
+EGG_SECURE_GLIB_DEFINITIONS ();
 
 static GMutex *mutex = NULL;
 
@@ -105,9 +108,3 @@ test_ssh_module_open_session (gboolean writable)
 
 	return session;
 }
-
-TESTING_EXTERNAL(ssh_module)
-{
-	CK_FUNCTION_LIST_PTR funcs = gkm_ssh_store_get_functions ();
-	testing_test_p11_module (funcs, "p11-tests.conf");
-}
diff --git a/pkcs11/ssh-store/tests/test-ssh-module.h b/pkcs11/ssh-store/tests/mock-ssh-module.h
similarity index 100%
rename from pkcs11/ssh-store/tests/test-ssh-module.h
rename to pkcs11/ssh-store/tests/mock-ssh-module.h
diff --git a/pkcs11/ssh-store/tests/unit-test-private-key.c b/pkcs11/ssh-store/tests/test-private-key.c
similarity index 55%
rename from pkcs11/ssh-store/tests/unit-test-private-key.c
rename to pkcs11/ssh-store/tests/test-private-key.c
index e8d6959..182f848 100644
--- a/pkcs11/ssh-store/tests/unit-test-private-key.c
+++ b/pkcs11/ssh-store/tests/test-private-key.c
@@ -21,8 +21,9 @@
    Author: Stef Walter <stef memberwebs com>
 */
 
-#include "test-suite.h"
-#include "test-ssh-module.h"
+#include "config.h"
+
+#include "mock-ssh-module.h"
 
 #include "gkm/gkm-credential.h"
 #include "gkm/gkm-session.h"
@@ -32,66 +33,70 @@
 
 #include "pkcs11i.h"
 
-static GkmModule *module = NULL;
-static GkmSession *session = NULL;
+typedef struct {
+	GkmModule *module;
+	GkmSession *session;
+} Test;
 
-TESTING_SETUP(private_key_setup)
+static void
+setup (Test *test, gconstpointer unused)
 {
-	module = test_ssh_module_initialize_and_enter ();
-	session = test_ssh_module_open_session (TRUE);
+	test->module = test_ssh_module_initialize_and_enter ();
+	test->session = test_ssh_module_open_session (TRUE);
 }
 
-TESTING_TEARDOWN(private_key_teardown)
+static void
+teardown (Test *test, gconstpointer unused)
 {
 	test_ssh_module_leave_and_finalize ();
-	module = NULL;
-	session = NULL;
 }
 
-TESTING_TEST(private_key_parse_plain)
+static void
+test_parse_plain (Test *test, gconstpointer unused)
 {
 	GkmSshPrivateKey *key;
-	gchar *pub_path, *priv_path;
 	gboolean ret;
 
-	key = gkm_ssh_private_key_new (module, "my-unique");
+	key = gkm_ssh_private_key_new (test->module, "my-unique");
 	g_assert (GKM_IS_SSH_PRIVATE_KEY (key));
 
-	pub_path = testing_data_filename ("id_dsa_plain.pub");
-	priv_path = testing_data_filename ("id_dsa_plain");
-
-	ret = gkm_ssh_private_key_parse (key, pub_path, priv_path, NULL);
+	ret = gkm_ssh_private_key_parse (key, SRCDIR "/files/id_dsa_plain.pub",
+	                                 SRCDIR "/files/id_dsa_plain", NULL);
 	g_assert (ret == TRUE);
 
 	g_object_unref (key);
-	g_free (pub_path);
-	g_free (priv_path);
 }
 
-
-TESTING_TEST(private_key_parse_and_unlock)
+static void
+test_parse_and_unlock (Test *test, gconstpointer unused)
 {
 	GkmSshPrivateKey *key;
 	GkmCredential *cred;
-	gchar *pub_path, *priv_path;
 	gboolean ret;
 	CK_RV rv;
 
-	key = gkm_ssh_private_key_new (module, "my-unique");
+	key = gkm_ssh_private_key_new (test->module, "my-unique");
 	g_assert (GKM_IS_SSH_PRIVATE_KEY (key));
 
-	pub_path = testing_data_filename ("id_dsa_encrypted.pub");
-	priv_path = testing_data_filename ("id_dsa_encrypted");
-
-	ret = gkm_ssh_private_key_parse (key, pub_path, priv_path, NULL);
+	ret = gkm_ssh_private_key_parse (key, SRCDIR "/files/id_dsa_encrypted.pub",
+	                                 SRCDIR "/files/id_dsa_encrypted", NULL);
 	g_assert (ret == TRUE);
 
-	g_free (pub_path);
-	g_free (priv_path);
-
-	rv = gkm_credential_create (module, NULL, GKM_OBJECT (key), (guchar*)"password", 8, &cred);
+	rv = gkm_credential_create (test->module, NULL, GKM_OBJECT (key), (guchar*)"password", 8, &cred);
 	g_assert (rv == CKR_OK);
 
 	g_object_unref (cred);
 	g_object_unref (key);
 }
+
+int
+main (int argc, char **argv)
+{
+	g_type_init ();
+	g_test_init (&argc, &argv, NULL);
+
+	g_test_add ("/ssh-store/private-key/parse_plain", Test, NULL, setup, test_parse_plain, teardown);
+	g_test_add ("/ssh-store/private-key/parse_and_unlock", Test, NULL, setup, test_parse_and_unlock, teardown);
+
+	return g_test_run ();
+}
diff --git a/pkcs11/ssh-store/tests/unit-test-ssh-openssh.c b/pkcs11/ssh-store/tests/test-ssh-openssh.c
similarity index 74%
rename from pkcs11/ssh-store/tests/unit-test-ssh-openssh.c
rename to pkcs11/ssh-store/tests/test-ssh-openssh.c
index c243a4c..12fc0cc 100644
--- a/pkcs11/ssh-store/tests/unit-test-ssh-openssh.c
+++ b/pkcs11/ssh-store/tests/test-ssh-openssh.c
@@ -1,6 +1,5 @@
 /* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */
-/* unit-test-ssh-openssh.c: Test OpenSSH parsing
-
+/*
    Copyright (C) 2008 Stefan Walter
 
    The Gnome Keyring Library is free software; you can redistribute it and/or
@@ -23,9 +22,9 @@
 
 #include "config.h"
 
-#include "test-suite.h"
+#include "egg/egg-secure-memory.h"
 
-#include "gkm-ssh-openssh.h"
+#include "ssh-store/gkm-ssh-openssh.h"
 
 #include "gkm/gkm-sexp.h"
 
@@ -35,25 +34,28 @@
 #include <stdio.h>
 #include <string.h>
 
+EGG_SECURE_GLIB_DEFINITIONS ();
+
 static const gchar *PRIVATE_FILES[] = {
-	"id_rsa_encrypted",
-	"id_rsa_plain",
-	"id_dsa_encrypted",
-	"id_dsa_plain"
+	SRCDIR "/files/id_rsa_encrypted",
+	SRCDIR "/files/id_rsa_plain",
+	SRCDIR "/files/id_dsa_encrypted",
+	SRCDIR "/files/id_dsa_plain"
 };
 
 static const gchar *PUBLIC_FILES[] = {
-	"id_rsa_test.pub",
-	"id_dsa_test.pub"
+	SRCDIR "/files/id_rsa_test.pub",
+	SRCDIR "/files/id_dsa_test.pub"
 };
 
 #define COMMENT "A public key comment"
 
-TESTING_TEST(parse_public)
+static void
+test_parse_public (void)
 {
 	gcry_sexp_t sexp;
 	gchar *comment;
-	guchar *data;
+	gchar *data;
 	gsize n_data;
 	int algorithm;
 	gboolean is_private;
@@ -63,7 +65,8 @@ TESTING_TEST(parse_public)
 
 	for (i = 0; i < G_N_ELEMENTS (PUBLIC_FILES); ++i) {
 
-		data = testing_data_read (PUBLIC_FILES[i], &n_data);
+		if (!g_file_get_contents (PUBLIC_FILES[i], &data, &n_data, NULL))
+			g_assert_not_reached ();
 
 		res = gkm_ssh_openssh_parse_public_key (data, n_data, &sexp, &comment);
 		if (res != GKM_DATA_SUCCESS) {
@@ -84,10 +87,11 @@ TESTING_TEST(parse_public)
 	}
 }
 
-TESTING_TEST(parse_private)
+static void
+test_parse_private (void)
 {
 	gcry_sexp_t sexp;
-	guchar *data;
+	gchar *data;
 	gsize n_data;
 	int algorithm;
 	gboolean is_private;
@@ -97,7 +101,8 @@ TESTING_TEST(parse_private)
 
 	for (i = 0; i < G_N_ELEMENTS (PRIVATE_FILES); ++i) {
 
-		data = testing_data_read (PRIVATE_FILES[i], &n_data);
+		if (!g_file_get_contents (PRIVATE_FILES[i], &data, &n_data, NULL))
+			g_assert_not_reached ();
 
 		res = gkm_ssh_openssh_parse_private_key (data, n_data, "password", 8, &sexp);
 		if (res != GKM_DATA_SUCCESS) {
@@ -115,3 +120,15 @@ TESTING_TEST(parse_private)
 		gcry_sexp_release (sexp);
 	}
 }
+
+int
+main (int argc, char **argv)
+{
+	g_type_init ();
+	g_test_init (&argc, &argv, NULL);
+
+	g_test_add_func ("/ssh-store/openssh/parse_private", test_parse_private);
+	g_test_add_func ("/ssh-store/openssh/parse_public", test_parse_public);
+
+	return g_test_run ();
+}
diff --git a/pkcs11/wrap-layer/tests/Makefile.am b/pkcs11/wrap-layer/tests/Makefile.am
index fb3ee7b..bf4ab92 100644
--- a/pkcs11/wrap-layer/tests/Makefile.am
+++ b/pkcs11/wrap-layer/tests/Makefile.am
@@ -1,24 +1,40 @@
 
-TESTING_SOURCES = \
-	mock-secret-store.c
-
-TESTING_FILES = \
-	test-create-credential.c \
-	test-init-pin.c \
-	test-login-auto.c \
-	test-login-hints.c \
-	test-login-keyring.c \
-	test-login-specific.c \
-	test-login-user.c \
-	test-set-pin.c
-
-TESTING_LIBS = \
+INCLUDES = \
+	-I$(top_builddir) \
+	-I$(top_srcdir) \
+	-I$(top_srcdir)/pkcs11 \
+	-DSRCDIR="\"$(srcdir)\"" \
+	$(GLIB_CFLAGS) \
+	-DWITH_TESTABLE
+
+LDADD = \
 	$(top_builddir)/pkcs11/wrap-layer/libgkm-wrap-layer.la \
+	libgkm-mock-secret-store.a \
 	$(top_builddir)/pkcs11/gkm/libgkm.la \
 	$(top_builddir)/ui/libgku-prompt-testable.la \
-	$(top_builddir)/egg/libegg.la
+	$(top_builddir)/egg/libegg.la \
+	$(GLIB_LIBS)
 
-TESTING_FLAGS = \
-	-DWITH_TESTABLE
+TEST_PROGS = \
+	test-create-credential \
+	test-init-pin \
+	test-login-auto \
+	test-login-hints \
+	test-login-keyring \
+	test-login-specific \
+	test-login-user \
+	test-set-pin
+
+check_PROGRAMS = $(TEST_PROGS)
+
+test: $(TEST_PROGS) $(CHECK_PROGS)
+	gtester -k --verbose -m $(TEST_MODE) --g-fatal-warnings $(TEST_PROGS)
+
+check-local: test
+
+all-local: $(check_PROGRAMS)
+
+noinst_LIBRARIES = libgkm-mock-secret-store.a
 
-include $(top_srcdir)/testing/testing.make
\ No newline at end of file
+libgkm_mock_secret_store_a_SOURCES = \
+	mock-secret-store.c
\ No newline at end of file
diff --git a/pkcs11/wrap-layer/tests/mock-secret-store.c b/pkcs11/wrap-layer/tests/mock-secret-store.c
index d724919..cb57b7f 100644
--- a/pkcs11/wrap-layer/tests/mock-secret-store.c
+++ b/pkcs11/wrap-layer/tests/mock-secret-store.c
@@ -21,7 +21,7 @@
 
 #include "config.h"
 
-#include "test-suite.h"
+#include "egg/egg-secure-memory.h"
 
 #include "gkm/gkm-attributes.h"
 #include "gkm/gkm-mock.h"
@@ -33,6 +33,8 @@
 
 static guint secret_identifier = 8800;
 
+EGG_SECURE_GLIB_DEFINITIONS ();
+
 static CK_RV
 mock_secret_C_Initialize (CK_VOID_PTR pInitArgs)
 {
diff --git a/pkcs11/wrap-layer/tests/test-create-credential.c b/pkcs11/wrap-layer/tests/test-create-credential.c
index c4e7bd6..5a3b7c9 100644
--- a/pkcs11/wrap-layer/tests/test-create-credential.c
+++ b/pkcs11/wrap-layer/tests/test-create-credential.c
@@ -21,21 +21,26 @@
 
 #include "config.h"
 
-#include "test-suite.h"
-
 #include "gkm/gkm-mock.h"
 #include "gkm/gkm-test.h"
 
+#include "egg/egg-testing.h"
+
 #include "wrap-layer/gkm-wrap-layer.h"
 
 #include "ui/gku-prompt.h"
 
-static CK_FUNCTION_LIST test_functions;
-static CK_FUNCTION_LIST_PTR module = NULL;
-static CK_SESSION_HANDLE session = 0;
-static CK_OBJECT_HANDLE object = 0;
+#include <string.h>
+
+typedef struct {
+	CK_FUNCTION_LIST functions;
+	CK_FUNCTION_LIST_PTR module;
+	CK_SESSION_HANDLE session;
+	CK_OBJECT_HANDLE object;
+} Test;
 
-TESTING_SETUP (create_credential)
+static void
+setup (Test *test, gconstpointer unused)
 {
 	CK_FUNCTION_LIST_PTR funcs;
 	CK_SLOT_ID slot_id;
@@ -51,60 +56,58 @@ TESTING_SETUP (create_credential)
 	/* Always start off with test functions */
 	rv = gkm_mock_C_GetFunctionList (&funcs);
 	gkm_assert_cmprv (rv, ==, CKR_OK);
-	memcpy (&test_functions, funcs, sizeof (test_functions));
+	memcpy (&test->functions, funcs, sizeof (test->functions));
 
 	gkm_wrap_layer_reset_modules ();
-	gkm_wrap_layer_add_module (&test_functions);
-	module = gkm_wrap_layer_get_functions ();
+	gkm_wrap_layer_add_module (&test->functions);
+	test->module = gkm_wrap_layer_get_functions ();
 
 	gku_prompt_dummy_prepare_response ();
 
-	/* Open a session */
-	rv = (module->C_Initialize) (NULL);
+	/* Open a test->session */
+	rv = (test->module->C_Initialize) (NULL);
 	gkm_assert_cmprv (rv, ==, CKR_OK);
 
-	rv = (module->C_GetSlotList) (CK_TRUE, &slot_id, &n_slots);
+	rv = (test->module->C_GetSlotList) (CK_TRUE, &slot_id, &n_slots);
 	gkm_assert_cmprv (rv, ==, CKR_OK);
 
-	rv = (module->C_OpenSession) (slot_id, CKF_SERIAL_SESSION, NULL, NULL, &session);
+	rv = (test->module->C_OpenSession) (slot_id, CKF_SERIAL_SESSION, NULL, NULL, &test->session);
 	gkm_assert_cmprv (rv, ==, CKR_OK);
 
-	/* Find the always authenticate object */
-	rv = (module->C_FindObjectsInit) (session, attrs, 1);
+	/* Find the always authenticate test->object */
+	rv = (test->module->C_FindObjectsInit) (test->session, attrs, 1);
 	gkm_assert_cmprv (rv, ==, CKR_OK);
 
-	rv = (module->C_FindObjects) (session, &object, 1, &count);
+	rv = (test->module->C_FindObjects) (test->session, &test->object, 1, &count);
 	gkm_assert_cmprv (rv, ==, CKR_OK);
 	gkm_assert_cmpulong (count, ==, 1);
-	gkm_assert_cmpulong (object, !=, 0);
+	gkm_assert_cmpulong (test->object, !=, 0);
 
-	rv = (module->C_FindObjectsFinal) (session);
+	rv = (test->module->C_FindObjectsFinal) (test->session);
 	gkm_assert_cmprv (rv, ==, CKR_OK);
 }
 
-TESTING_TEARDOWN (create_credential)
+static void
+teardown (Test *test, gconstpointer unused)
 {
 	CK_RV rv;
 
 	g_assert (!gku_prompt_dummy_have_response ());
 
-	object = 0;
-
-	rv = (module->C_CloseSession) (session);
+	rv = (test->module->C_CloseSession) (test->session);
 	gkm_assert_cmprv (rv, ==, CKR_OK);
-	session = 0;
 
-	rv = (module->C_Finalize) (NULL);
+	rv = (test->module->C_Finalize) (NULL);
 	gkm_assert_cmprv (rv, ==, CKR_OK);
-	module = NULL;
 }
 
-TESTING_TEST (create_credential_ok_password)
+static void
+test_ok_password (Test *test, gconstpointer unused)
 {
 	CK_OBJECT_CLASS klass = CKO_G_CREDENTIAL;
 	CK_ATTRIBUTE attrs[] = {
 		{ CKA_CLASS, &klass, sizeof (klass) },
-		{ CKA_G_OBJECT, &object, sizeof (object) },
+		{ CKA_G_OBJECT, &test->object, sizeof (test->object) },
 		{ CKA_VALUE, NULL, 0 }
 	};
 
@@ -113,17 +116,18 @@ TESTING_TEST (create_credential_ok_password)
 
 	gku_prompt_dummy_queue_ok_password ("booo");
 
-	rv = (module->C_CreateObject) (session, attrs, G_N_ELEMENTS (attrs), &cred);
+	rv = (test->module->C_CreateObject) (test->session, attrs, G_N_ELEMENTS (attrs), &cred);
 	gkm_assert_cmprv (rv, ==, CKR_OK);
 	gkm_assert_cmpulong (cred, !=, 0);
 }
 
-TESTING_TEST (create_credential_bad_password_then_cancel)
+static void
+test_bad_password_then_cancel (Test *test, gconstpointer unused)
 {
 	CK_OBJECT_CLASS klass = CKO_G_CREDENTIAL;
 	CK_ATTRIBUTE attrs[] = {
 		{ CKA_CLASS, &klass, sizeof (klass) },
-		{ CKA_G_OBJECT, &object, sizeof (object) },
+		{ CKA_G_OBJECT, &test->object, sizeof (test->object) },
 		{ CKA_VALUE, NULL, 0 }
 	};
 
@@ -133,16 +137,17 @@ TESTING_TEST (create_credential_bad_password_then_cancel)
 	gku_prompt_dummy_queue_ok_password ("bad password");
 	gku_prompt_dummy_queue_no ();
 
-	rv = (module->C_CreateObject) (session, attrs, G_N_ELEMENTS (attrs), &cred);
+	rv = (test->module->C_CreateObject) (test->session, attrs, G_N_ELEMENTS (attrs), &cred);
 	gkm_assert_cmprv (rv, ==, CKR_PIN_INCORRECT);
 }
 
-TESTING_TEST (create_credentiaol_cancel_immediately)
+static void
+test_cancel_immediately (Test *test, gconstpointer unused)
 {
 	CK_OBJECT_CLASS klass = CKO_G_CREDENTIAL;
 	CK_ATTRIBUTE attrs[] = {
 		{ CKA_CLASS, &klass, sizeof (klass) },
-		{ CKA_G_OBJECT, &object, sizeof (object) },
+		{ CKA_G_OBJECT, &test->object, sizeof (test->object) },
 		{ CKA_VALUE, NULL, 0 }
 	};
 
@@ -151,6 +156,19 @@ TESTING_TEST (create_credentiaol_cancel_immediately)
 
 	gku_prompt_dummy_queue_no ();
 
-	rv = (module->C_CreateObject) (session, attrs, G_N_ELEMENTS (attrs), &cred);
+	rv = (test->module->C_CreateObject) (test->session, attrs, G_N_ELEMENTS (attrs), &cred);
 	gkm_assert_cmprv (rv, ==, CKR_PIN_INCORRECT);
 }
+
+int
+main (int argc, char **argv)
+{
+	g_type_init ();
+	g_test_init (&argc, &argv, NULL);
+
+	g_test_add ("/wrap-layer/create-credential/ok_password", Test, NULL, setup, test_ok_password, teardown);
+	g_test_add ("/wrap-layer/create-credential/bad_password_then_cancel", Test, NULL, setup, test_bad_password_then_cancel, teardown);
+	g_test_add ("/wrap-layer/create-credential/cancel_immediately", Test, NULL, setup, test_cancel_immediately, teardown);
+
+	return egg_tests_run_in_thread_with_loop ();
+}
diff --git a/pkcs11/wrap-layer/tests/test-init-pin.c b/pkcs11/wrap-layer/tests/test-init-pin.c
index 58b02c5..1f9e7a1 100644
--- a/pkcs11/wrap-layer/tests/test-init-pin.c
+++ b/pkcs11/wrap-layer/tests/test-init-pin.c
@@ -21,7 +21,7 @@
 
 #include "config.h"
 
-#include "test-suite.h"
+#include "egg/egg-testing.h"
 
 #include "gkm/gkm-mock.h"
 #include "gkm/gkm-test.h"
@@ -30,63 +30,81 @@
 
 #include "ui/gku-prompt.h"
 
-static CK_FUNCTION_LIST functions;
-static CK_FUNCTION_LIST_PTR module = NULL;
-static CK_SESSION_HANDLE session = 0;
+#include <string.h>
 
-TESTING_SETUP (init_pin)
+typedef struct {
+	CK_FUNCTION_LIST functions;
+	CK_FUNCTION_LIST_PTR module;
+	CK_SESSION_HANDLE session;
+} Test;
+
+static void
+setup (Test *test, gconstpointer unused)
 {
 	CK_FUNCTION_LIST_PTR funcs;
 	CK_SLOT_ID slot_id;
 	CK_ULONG n_slots = 1;
 	CK_RV rv;
 
-	/* Always start off with test functions */
+	/* Always start off with test test->functions */
 	rv = gkm_mock_C_GetFunctionList (&funcs);
 	gkm_assert_cmprv (rv, ==, CKR_OK);
-	memcpy (&functions, funcs, sizeof (functions));
+	memcpy (&test->functions, funcs, sizeof (test->functions));
 
 	gkm_wrap_layer_reset_modules ();
-	gkm_wrap_layer_add_module (&functions);
-	module = gkm_wrap_layer_get_functions ();
+	gkm_wrap_layer_add_module (&test->functions);
+	test->module = gkm_wrap_layer_get_functions ();
 
 	gku_prompt_dummy_prepare_response ();
 
-	/* Open a session */
-	rv = (module->C_Initialize) (NULL);
+	/* Open a test->session */
+	rv = (test->module->C_Initialize) (NULL);
 	gkm_assert_cmprv (rv, ==, CKR_OK);
 
-	rv = (module->C_GetSlotList) (CK_TRUE, &slot_id, &n_slots);
+	rv = (test->module->C_GetSlotList) (CK_TRUE, &slot_id, &n_slots);
 	gkm_assert_cmprv (rv, ==, CKR_OK);
 
-	rv = (module->C_OpenSession) (slot_id, CKF_SERIAL_SESSION, NULL, NULL, &session);
+	rv = (test->module->C_OpenSession) (slot_id, CKF_SERIAL_SESSION, NULL, NULL, &test->session);
 	gkm_assert_cmprv (rv, ==, CKR_OK);
 }
 
-TESTING_TEARDOWN (init_pin)
+static void
+teardown (Test *test, gconstpointer unused)
 {
 	CK_RV rv;
 
 	g_assert (!gku_prompt_dummy_have_response ());
 
-	rv = (module->C_CloseSession) (session);
+	rv = (test->module->C_CloseSession) (test->session);
 	gkm_assert_cmprv (rv, ==, CKR_OK);
-	session = 0;
+	test->session = 0;
 
-	rv = (module->C_Finalize) (NULL);
+	rv = (test->module->C_Finalize) (NULL);
 	gkm_assert_cmprv (rv, ==, CKR_OK);
-	module = NULL;
+	test->module = NULL;
 }
 
-TESTING_TEST (init_pin_ok_password)
+static void
+test_ok_password (Test *test, gconstpointer unused)
 {
 	CK_RV rv;
 
 	gku_prompt_dummy_queue_ok_password ("new");
 
-	rv = (module->C_InitPIN) (session, NULL, 0);
+	rv = (test->module->C_InitPIN) (test->session, NULL, 0);
 	gkm_assert_cmprv (rv, ==, CKR_OK);
 
-	rv = (module->C_Login) (session, CKU_USER, (guchar*)"new", 3);
+	rv = (test->module->C_Login) (test->session, CKU_USER, (guchar*)"new", 3);
 	gkm_assert_cmprv (rv, ==, CKR_OK);
 }
+
+int
+main (int argc, char **argv)
+{
+	g_type_init ();
+	g_test_init (&argc, &argv, NULL);
+
+	g_test_add ("/wrap-layer/init-pin/ok_password", Test, NULL, setup, test_ok_password, teardown);
+
+	return egg_tests_run_in_thread_with_loop ();
+}
diff --git a/pkcs11/wrap-layer/tests/test-login-auto.c b/pkcs11/wrap-layer/tests/test-login-auto.c
index 56bcfc2..8ab80d9 100644
--- a/pkcs11/wrap-layer/tests/test-login-auto.c
+++ b/pkcs11/wrap-layer/tests/test-login-auto.c
@@ -21,7 +21,7 @@
 
 #include "config.h"
 
-#include "test-suite.h"
+#include "egg/egg-testing.h"
 
 #include "gkm/gkm-mock.h"
 #include "gkm/gkm-test.h"
@@ -30,15 +30,21 @@
 
 #include "ui/gku-prompt.h"
 
+#include <string.h>
+
 extern CK_FUNCTION_LIST mock_secret_store;
-static CK_FUNCTION_LIST functions;
-static CK_FUNCTION_LIST_PTR module = NULL;
-static CK_SESSION_HANDLE session = 0;
-static CK_OBJECT_HANDLE key = 0;
-static CK_OBJECT_HANDLE collection = 0;
-static CK_MECHANISM mech = { CKM_MOCK_PREFIX, NULL, 0 };
-
-TESTING_SETUP (login_auto)
+
+typedef struct {
+	CK_FUNCTION_LIST functions;
+	CK_FUNCTION_LIST_PTR module;
+	CK_SESSION_HANDLE session;
+	CK_OBJECT_HANDLE key;
+	CK_OBJECT_HANDLE collection;
+	CK_MECHANISM mech;
+} Test;
+
+static void
+setup (Test *test, gconstpointer unused)
 {
 	CK_SLOT_ID slot_id;
 	CK_ULONG n_slots = 1;
@@ -56,115 +62,120 @@ TESTING_SETUP (login_auto)
 		{ CKA_ID, "other", 5 },
 	};
 
-	/* Always start off with test functions */
-	memcpy (&functions, &mock_secret_store, sizeof (functions));
+	test->mech.mechanism = CKM_MOCK_PREFIX;
+
+	/* Always start off with test test->functions */
+	memcpy (&test->functions, &mock_secret_store, sizeof (test->functions));
 
 	gkm_wrap_layer_reset_modules ();
-	gkm_wrap_layer_add_module (&functions);
-	module = gkm_wrap_layer_get_functions ();
+	gkm_wrap_layer_add_module (&test->functions);
+	test->module = gkm_wrap_layer_get_functions ();
 
 	gku_prompt_dummy_prepare_response ();
 
-	/* Open a session */
-	rv = (module->C_Initialize) (NULL);
+	/* Open a test->session */
+	rv = (test->module->C_Initialize) (NULL);
 	gkm_assert_cmprv (rv, ==, CKR_OK);
 
-	rv = (module->C_GetSlotList) (CK_TRUE, &slot_id, &n_slots);
+	rv = (test->module->C_GetSlotList) (CK_TRUE, &slot_id, &n_slots);
 	gkm_assert_cmprv (rv, ==, CKR_OK);
 
-	rv = (module->C_OpenSession) (slot_id, CKF_SERIAL_SESSION, NULL, NULL, &session);
+	rv = (test->module->C_OpenSession) (slot_id, CKF_SERIAL_SESSION, NULL, NULL, &test->session);
 	gkm_assert_cmprv (rv, ==, CKR_OK);
 
 	/* Find keyring object */
-	rv = (module->C_FindObjectsInit) (session, fattrs, 1);
+	rv = (test->module->C_FindObjectsInit) (test->session, fattrs, 1);
 	gkm_assert_cmprv (rv, ==, CKR_OK);
-	rv = (module->C_FindObjects) (session, &collection, 1, &count);
+	rv = (test->module->C_FindObjects) (test->session, &test->collection, 1, &count);
 	gkm_assert_cmprv (rv, ==, CKR_OK);
 	gkm_assert_cmpulong (count, ==, 1);
-	gkm_assert_cmpulong (collection, !=, 0);
-	rv = (module->C_FindObjectsFinal) (session);
+	gkm_assert_cmpulong (test->collection, !=, 0);
+	rv = (test->module->C_FindObjectsFinal) (test->session);
 	gkm_assert_cmprv (rv, ==, CKR_OK);
 
-	/* Find the key object */
-	rv = (module->C_FindObjectsInit) (session, kattrs, 1);
+	/* Find the test->key object */
+	rv = (test->module->C_FindObjectsInit) (test->session, kattrs, 1);
 	gkm_assert_cmprv (rv, ==, CKR_OK);
-	rv = (module->C_FindObjects) (session, &key, 1, &count);
+	rv = (test->module->C_FindObjects) (test->session, &test->key, 1, &count);
 	gkm_assert_cmprv (rv, ==, CKR_OK);
 	gkm_assert_cmpulong (count, ==, 1);
-	gkm_assert_cmpulong (key, !=, 0);
-	rv = (module->C_FindObjectsFinal) (session);
+	gkm_assert_cmpulong (test->key, !=, 0);
+	rv = (test->module->C_FindObjectsFinal) (test->session);
 	gkm_assert_cmprv (rv, ==, CKR_OK);
 
 	/* Start a signing operation, that needs to be authenticated */
-	rv = (module->C_SignInit) (session, &mech, key);
+	rv = (test->module->C_SignInit) (test->session, &test->mech, test->key);
 	gkm_assert_cmprv (rv, ==, CKR_OK);
 }
 
-TESTING_TEARDOWN (login_auto)
+static void
+teardown (Test *test, gconstpointer unused)
 {
 	CK_RV rv;
 
 	g_assert (!gku_prompt_dummy_have_response ());
 
-	key = 0;
-	collection = 0;
+	test->key = 0;
+	test->collection = 0;
 
-	rv = (module->C_CloseSession) (session);
+	rv = (test->module->C_CloseSession) (test->session);
 	gkm_assert_cmprv (rv, ==, CKR_OK);
-	session = 0;
+	test->session = 0;
 
-	rv = (module->C_Finalize) (NULL);
+	rv = (test->module->C_Finalize) (NULL);
 	gkm_assert_cmprv (rv, ==, CKR_OK);
-	module = NULL;
+	test->module = NULL;
 }
 
-TESTING_TEST (login_auto_specific)
+static void
+test_specific (Test *test, gconstpointer unused)
 {
 	CK_RV rv;
 
 	/* Login with prompt */
 	gku_prompt_dummy_queue_auto_password ("booo");
-	rv = (module->C_Login) (session, CKU_CONTEXT_SPECIFIC, NULL, 0);
+	rv = (test->module->C_Login) (test->session, CKU_CONTEXT_SPECIFIC, NULL, 0);
 	gkm_assert_cmprv (rv, ==, CKR_OK);
 
 	/* Start a signing operation, that needs to be authenticated */
-	rv = (module->C_SignInit) (session, &mech, key);
+	rv = (test->module->C_SignInit) (test->session, &test->mech, test->key);
 	gkm_assert_cmprv (rv, ==, CKR_OK);
 
 	/* No further prompting should be shown, uses stored password */
 	gku_prompt_dummy_prepare_response ();
-	rv = (module->C_Login) (session, CKU_CONTEXT_SPECIFIC, NULL, 0);
+	rv = (test->module->C_Login) (test->session, CKU_CONTEXT_SPECIFIC, NULL, 0);
 	gkm_assert_cmprv (rv, ==, CKR_OK);
 
 	/* Change the password */
 	gkm_mock_module_set_pin ("other");
 
 	/* Start a signing operation, that needs to be authenticated */
-	rv = (module->C_SignInit) (session, &mech, key);
+	rv = (test->module->C_SignInit) (test->session, &test->mech, test->key);
 	gkm_assert_cmprv (rv, ==, CKR_OK);
 
 	/* This should prompt again, as stored password is now wrong */
 	gku_prompt_dummy_queue_ok_password ("other");
-	rv = (module->C_Login) (session, CKU_CONTEXT_SPECIFIC, NULL, 0);
+	rv = (test->module->C_Login) (test->session, CKU_CONTEXT_SPECIFIC, NULL, 0);
 	gkm_assert_cmprv (rv, ==, CKR_OK);
 }
 
-TESTING_TEST (login_auto_user_token)
+static void
+test_user_token (Test *test, gconstpointer unused)
 {
 	CK_RV rv;
 
 	/* Login with prompt */
 	gku_prompt_dummy_queue_auto_password ("booo");
-	rv = (module->C_Login) (session, CKU_USER, NULL, 0);
+	rv = (test->module->C_Login) (test->session, CKU_USER, NULL, 0);
 	gkm_assert_cmprv (rv, ==, CKR_OK);
-	rv = (module->C_Logout) (session);
+	rv = (test->module->C_Logout) (test->session);
 	gkm_assert_cmprv (rv, ==, CKR_OK);
 
 	/* No further prompting should be shown, uses stored password */
 	gku_prompt_dummy_prepare_response ();
-	rv = (module->C_Login) (session, CKU_USER, NULL, 0);
+	rv = (test->module->C_Login) (test->session, CKU_USER, NULL, 0);
 	gkm_assert_cmprv (rv, ==, CKR_OK);
-	rv = (module->C_Logout) (session);
+	rv = (test->module->C_Logout) (test->session);
 	gkm_assert_cmprv (rv, ==, CKR_OK);
 
 	/* Change the password */
@@ -172,11 +183,12 @@ TESTING_TEST (login_auto_user_token)
 
 	/* This should prompt again, as stored password is now wrong */
 	gku_prompt_dummy_queue_ok_password ("other");
-	rv = (module->C_Login) (session, CKU_USER, NULL, 0);
+	rv = (test->module->C_Login) (test->session, CKU_USER, NULL, 0);
 	gkm_assert_cmprv (rv, ==, CKR_OK);
 }
 
-TESTING_TEST (login_auto_unlock_keyring)
+static void
+test_unlock_keyring (Test *test, gconstpointer unused)
 {
 	CK_OBJECT_HANDLE credential;
 	CK_RV rv;
@@ -185,19 +197,19 @@ TESTING_TEST (login_auto_unlock_keyring)
 	CK_ATTRIBUTE attrs[] = {
 		{ CKA_CLASS, &klass, sizeof (klass) },
 		{ CKA_VALUE, NULL, 0 },
-		{ CKA_G_OBJECT, &collection, sizeof (collection) },
+		{ CKA_G_OBJECT, &test->collection, sizeof (test->collection) },
 	};
 
 	/* Create credential with prompt */
 	gku_prompt_dummy_queue_auto_password ("booo");
-	rv = (module->C_CreateObject) (session, attrs, G_N_ELEMENTS (attrs), &credential);
+	rv = (test->module->C_CreateObject) (test->session, attrs, G_N_ELEMENTS (attrs), &credential);
 	gkm_assert_cmprv (rv, ==, CKR_OK);
-	rv = (module->C_DestroyObject) (session, credential);
+	rv = (test->module->C_DestroyObject) (test->session, credential);
 	gkm_assert_cmprv (rv, ==, CKR_OK);
 
 	/* No further prompting should be shown, uses stored password */
 	gku_prompt_dummy_prepare_response ();
-	rv = (module->C_CreateObject) (session, attrs, G_N_ELEMENTS (attrs), &credential);
+	rv = (test->module->C_CreateObject) (test->session, attrs, G_N_ELEMENTS (attrs), &credential);
 	gkm_assert_cmprv (rv, ==, CKR_OK);
 
 	/* Change the password */
@@ -205,6 +217,19 @@ TESTING_TEST (login_auto_unlock_keyring)
 
 	/* This should prompt again, as stored password is now wrong */
 	gku_prompt_dummy_queue_ok_password ("other");
-	rv = (module->C_CreateObject) (session, attrs, G_N_ELEMENTS (attrs), &credential);
+	rv = (test->module->C_CreateObject) (test->session, attrs, G_N_ELEMENTS (attrs), &credential);
 	gkm_assert_cmprv (rv, ==, CKR_OK);
 }
+
+int
+main (int argc, char **argv)
+{
+	g_type_init ();
+	g_test_init (&argc, &argv, NULL);
+
+	g_test_add ("/wrap-layer/login-auto/specific", Test, NULL, setup, test_specific, teardown);
+	g_test_add ("/wrap-layer/login-auto/user_token", Test, NULL, setup, test_user_token, teardown);
+	g_test_add ("/wrap-layer/login-auto/unlock_keyring", Test, NULL, setup, test_unlock_keyring, teardown);
+
+	return egg_tests_run_in_thread_with_loop ();
+}
diff --git a/pkcs11/wrap-layer/tests/test-login-hints.c b/pkcs11/wrap-layer/tests/test-login-hints.c
index eb8d135..48bb830 100644
--- a/pkcs11/wrap-layer/tests/test-login-hints.c
+++ b/pkcs11/wrap-layer/tests/test-login-hints.c
@@ -21,14 +21,16 @@
 
 #include "config.h"
 
-#include "test-suite.h"
-
 #include "egg/egg-secure-memory.h"
+#include "egg/egg-testing.h"
 
 #include "wrap-layer/gkm-wrap-layer.h"
 #include "wrap-layer/gkm-wrap-login.h"
 
-TESTING_TEST (login_did_unlock_fail)
+#include <glib-object.h>
+
+static void
+test_did_unlock_fail (void)
 {
 	gchar *password;
 	gboolean ret;
@@ -49,3 +51,14 @@ TESTING_TEST (login_did_unlock_fail)
 	ret = gkm_wrap_login_did_unlock_fail ();
 	g_assert (ret == FALSE);
 }
+
+int
+main (int argc, char **argv)
+{
+	g_type_init ();
+	g_test_init (&argc, &argv, NULL);
+
+	g_test_add_func ("/wrap-layer/login-hints/did_unlock_fail", test_did_unlock_fail);
+
+	return egg_tests_run_in_thread_with_loop ();
+}
diff --git a/pkcs11/wrap-layer/tests/test-login-keyring.c b/pkcs11/wrap-layer/tests/test-login-keyring.c
index ad43001..3c8fe5b 100644
--- a/pkcs11/wrap-layer/tests/test-login-keyring.c
+++ b/pkcs11/wrap-layer/tests/test-login-keyring.c
@@ -21,9 +21,8 @@
 
 #include "config.h"
 
-#include "test-suite.h"
-
 #include "egg/egg-secure-memory.h"
+#include "egg/egg-testing.h"
 
 #include "gkm/gkm-attributes.h"
 #include "gkm/gkm-mock.h"
@@ -32,35 +31,43 @@
 #include "wrap-layer/gkm-wrap-layer.h"
 #include "wrap-layer/gkm-wrap-login.h"
 
+#include <glib-object.h>
+
 extern CK_FUNCTION_LIST mock_secret_store;
-static CK_FUNCTION_LIST functions;
-static CK_FUNCTION_LIST_PTR module = NULL;
 
-TESTING_SETUP (login_keyring)
+typedef struct {
+	CK_FUNCTION_LIST functions;
+	CK_FUNCTION_LIST_PTR module;
+} Test;
+
+static void
+setup (Test *test, gconstpointer unused)
 {
 	CK_RV rv;
 
-	/* Always start off with test functions */
-	memcpy (&functions, &mock_secret_store, sizeof (functions));
+	/* Always start off with test test->functions */
+	memcpy (&test->functions, &mock_secret_store, sizeof (test->functions));
 	gkm_wrap_layer_reset_modules ();
-	gkm_wrap_layer_add_module (&functions);
-	module = gkm_wrap_layer_get_functions ();
+	gkm_wrap_layer_add_module (&test->functions);
+	test->module = gkm_wrap_layer_get_functions ();
 
 	/* Initialize */
-	rv = (module->C_Initialize) (NULL);
+	rv = (test->module->C_Initialize) (NULL);
 	gkm_assert_cmprv (rv, ==, CKR_OK);
 }
 
-TESTING_TEARDOWN (login_keyring)
+static void
+teardown (Test *test, gconstpointer unused)
 {
 	CK_RV rv;
 
-	rv = (module->C_Finalize) (NULL);
+	rv = (test->module->C_Finalize) (NULL);
 	gkm_assert_cmprv (rv, ==, CKR_OK);
-	module = NULL;
+	test->module = NULL;
 }
 
-TESTING_TEST (login_is_usable)
+static void
+test_is_usable (Test *test, gconstpointer unused)
 {
 	gboolean ret;
 
@@ -68,16 +75,18 @@ TESTING_TEST (login_is_usable)
 	g_assert (ret == TRUE);
 }
 
-TESTING_TEST (login_usable_fail_open_session)
+static void
+test_usable_fail_open_session (Test *test, gconstpointer unused)
 {
 	gboolean ret;
 
-	functions.C_OpenSession = gkm_mock_fail_C_OpenSession;
+	test->functions.C_OpenSession = gkm_mock_fail_C_OpenSession;
 	ret = gkm_wrap_login_is_usable ();
 	g_assert (ret == FALSE);
 }
 
-TESTING_TEST (login_usable_fail_not_trusted)
+static void
+test_usable_fail_not_trusted (Test *test, gconstpointer unused)
 {
 	CK_OBJECT_HANDLE object;
 	CK_ATTRIBUTE attr;
@@ -107,7 +116,8 @@ TESTING_TEST (login_usable_fail_not_trusted)
 	g_assert (ret == FALSE);
 }
 
-TESTING_TEST (login_usable_fail_locked)
+static void
+test_usable_fail_locked (Test *test, gconstpointer unused)
 {
 	CK_OBJECT_HANDLE object;
 	CK_ATTRIBUTE attr;
@@ -137,7 +147,8 @@ TESTING_TEST (login_usable_fail_locked)
 	g_assert (ret == FALSE);
 }
 
-TESTING_TEST (login_lookup_secret_no_match)
+static void
+test_lookup_secret_no_match (Test *test, gconstpointer unused)
 {
 	gchar *password;
 
@@ -146,7 +157,8 @@ TESTING_TEST (login_lookup_secret_no_match)
 	g_assert_cmpstr (password, ==, NULL);
 }
 
-TESTING_TEST (login_lookup_secret_and_match)
+static void
+test_lookup_secret_and_match (Test *test, gconstpointer unused)
 {
 	gchar *password;
 
@@ -158,7 +170,8 @@ TESTING_TEST (login_lookup_secret_and_match)
 	egg_secure_free (password);
 }
 
-TESTING_TEST (login_lookup_store_secret)
+static void
+test_lookup_store_secret (Test *test, gconstpointer unused)
 {
 	CK_OBJECT_CLASS klass = CKO_SECRET_KEY;
 	CK_BBOOL tval = CK_TRUE;
@@ -182,7 +195,8 @@ TESTING_TEST (login_lookup_store_secret)
 	gkm_assert_cmpulong (object, !=, 0);
 }
 
-TESTING_TEST (login_lookup_store_secret_overwrite)
+static void
+test_lookup_store_secret_overwrite (Test *test, gconstpointer unused)
 {
 	CK_OBJECT_CLASS klass = CKO_SECRET_KEY;
 	CK_BBOOL tval = CK_TRUE;
@@ -220,7 +234,8 @@ TESTING_TEST (login_lookup_store_secret_overwrite)
 	gkm_assert_cmpulong (object1, ==, object2);
 }
 
-TESTING_TEST (login_lookup_store_null_secret)
+static void
+test_lookup_store_null_secret (Test *test, gconstpointer unused)
 {
 	CK_OBJECT_CLASS klass = CKO_SECRET_KEY;
 	CK_BBOOL tval = CK_TRUE;
@@ -243,7 +258,8 @@ TESTING_TEST (login_lookup_store_null_secret)
 	gkm_assert_cmpulong (object, !=, 0);
 }
 
-TESTING_TEST (login_lookup_store_no_attributes_not_stored)
+static void
+test_lookup_store_no_attributes_not_stored (Test *test, gconstpointer unused)
 {
 	CK_OBJECT_CLASS klass = CKO_SECRET_KEY;
 	CK_BBOOL tval = CK_TRUE;
@@ -265,7 +281,8 @@ TESTING_TEST (login_lookup_store_no_attributes_not_stored)
 }
 
 
-TESTING_TEST (login_lookup_remove_present)
+static void
+test_lookup_remove_present (Test *test, gconstpointer unused)
 {
 	CK_OBJECT_CLASS klass = CKO_SECRET_KEY;
 	CK_BBOOL tval = CK_TRUE;
@@ -291,7 +308,8 @@ TESTING_TEST (login_lookup_remove_present)
 	gkm_assert_cmpulong (object, ==, 0);
 }
 
-TESTING_TEST (login_lookup_remove_no_attributes)
+static void
+test_lookup_remove_no_attributes (Test *test, gconstpointer unused)
 {
 	guint n_objects, check;
 
@@ -304,3 +322,25 @@ TESTING_TEST (login_lookup_remove_no_attributes)
 	check = gkm_mock_module_count_objects (0);
 	g_assert_cmpuint (check, ==, n_objects);
 }
+
+int
+main (int argc, char **argv)
+{
+	g_type_init ();
+	g_test_init (&argc, &argv, NULL);
+
+	g_test_add ("/wrap-layer/login-keyring/is_usable", Test, NULL, setup, test_is_usable, teardown);
+	g_test_add ("/wrap-layer/login-keyring/usable_fail_open_session", Test, NULL, setup, test_usable_fail_open_session, teardown);
+	g_test_add ("/wrap-layer/login-keyring/usable_fail_not_trusted", Test, NULL, setup, test_usable_fail_not_trusted, teardown);
+	g_test_add ("/wrap-layer/login-keyring/usable_fail_locked", Test, NULL, setup, test_usable_fail_locked, teardown);
+	g_test_add ("/wrap-layer/login-keyring/lookup_secret_no_match", Test, NULL, setup, test_lookup_secret_no_match, teardown);
+	g_test_add ("/wrap-layer/login-keyring/lookup_secret_and_match", Test, NULL, setup, test_lookup_secret_and_match, teardown);
+	g_test_add ("/wrap-layer/login-keyring/lookup_store_secret", Test, NULL, setup, test_lookup_store_secret, teardown);
+	g_test_add ("/wrap-layer/login-keyring/lookup_store_secret_overwrite", Test, NULL, setup, test_lookup_store_secret_overwrite, teardown);
+	g_test_add ("/wrap-layer/login-keyring/lookup_store_null_secret", Test, NULL, setup, test_lookup_store_null_secret, teardown);
+	g_test_add ("/wrap-layer/login-keyring/lookup_store_no_attributes_not_stored", Test, NULL, setup, test_lookup_store_no_attributes_not_stored, teardown);
+	g_test_add ("/wrap-layer/login-keyring/lookup_remove_present", Test, NULL, setup, test_lookup_remove_present, teardown);
+	g_test_add ("/wrap-layer/login-keyring/lookup_remove_no_attributes", Test, NULL, setup, test_lookup_remove_no_attributes, teardown);
+
+	return egg_tests_run_in_thread_with_loop ();
+}
diff --git a/pkcs11/wrap-layer/tests/test-login-specific.c b/pkcs11/wrap-layer/tests/test-login-specific.c
index 3957404..a91480e 100644
--- a/pkcs11/wrap-layer/tests/test-login-specific.c
+++ b/pkcs11/wrap-layer/tests/test-login-specific.c
@@ -21,7 +21,7 @@
 
 #include "config.h"
 
-#include "test-suite.h"
+#include "egg/egg-testing.h"
 
 #include "gkm/gkm-mock.h"
 #include "gkm/gkm-test.h"
@@ -30,11 +30,14 @@
 
 #include "ui/gku-prompt.h"
 
-static CK_FUNCTION_LIST prompt_login_functions;
-static CK_FUNCTION_LIST_PTR module = NULL;
-static CK_SESSION_HANDLE session = 0;
+typedef struct {
+	CK_FUNCTION_LIST prompt_login_functions;
+	CK_FUNCTION_LIST_PTR module;
+	CK_SESSION_HANDLE session;
+} Test;
 
-TESTING_SETUP (login_specific)
+static void
+setup (Test *test, gconstpointer unused)
 {
 	CK_FUNCTION_LIST_PTR funcs;
 	CK_OBJECT_HANDLE key;
@@ -53,83 +56,100 @@ TESTING_SETUP (login_specific)
 	/* Always start off with test functions */
 	rv = gkm_mock_C_GetFunctionList (&funcs);
 	gkm_assert_cmprv (rv, ==, CKR_OK);
-	memcpy (&prompt_login_functions, funcs, sizeof (prompt_login_functions));
+	memcpy (&test->prompt_login_functions, funcs, sizeof (test->prompt_login_functions));
 
 	gkm_wrap_layer_reset_modules ();
-	gkm_wrap_layer_add_module (&prompt_login_functions);
-	module = gkm_wrap_layer_get_functions ();
+	gkm_wrap_layer_add_module (&test->prompt_login_functions);
+	test->module = gkm_wrap_layer_get_functions ();
 
 	gku_prompt_dummy_prepare_response ();
 
-	/* Open a session */
-	rv = (module->C_Initialize) (NULL);
+	/* Open a test->session */
+	rv = (test->module->C_Initialize) (NULL);
 	gkm_assert_cmprv (rv, ==, CKR_OK);
 
-	rv = (module->C_GetSlotList) (CK_TRUE, &slot_id, &n_slots);
+	rv = (test->module->C_GetSlotList) (CK_TRUE, &slot_id, &n_slots);
 	gkm_assert_cmprv (rv, ==, CKR_OK);
 
-	rv = (module->C_OpenSession) (slot_id, CKF_SERIAL_SESSION, NULL, NULL, &session);
+	rv = (test->module->C_OpenSession) (slot_id, CKF_SERIAL_SESSION, NULL, NULL, &test->session);
 	gkm_assert_cmprv (rv, ==, CKR_OK);
 
 	/* Find the always authenticate object */
-	rv = (module->C_FindObjectsInit) (session, attrs, 1);
+	rv = (test->module->C_FindObjectsInit) (test->session, attrs, 1);
 	gkm_assert_cmprv (rv, ==, CKR_OK);
 
-	rv = (module->C_FindObjects) (session, &key, 1, &count);
+	rv = (test->module->C_FindObjects) (test->session, &key, 1, &count);
 	gkm_assert_cmprv (rv, ==, CKR_OK);
 	gkm_assert_cmpulong (count, ==, 1);
 	gkm_assert_cmpulong (key, !=, 0);
 
-	rv = (module->C_FindObjectsFinal) (session);
+	rv = (test->module->C_FindObjectsFinal) (test->session);
 	gkm_assert_cmprv (rv, ==, CKR_OK);
 
 	/* Start a signing operation, that needs to be authenticated */
-	rv = (module->C_SignInit) (session, &mech, key);
+	rv = (test->module->C_SignInit) (test->session, &mech, key);
 	gkm_assert_cmprv (rv, ==, CKR_OK);
 }
 
-TESTING_TEARDOWN (login_specific)
+static void
+teardown (Test *test, gconstpointer unused)
 {
 	CK_RV rv;
 
 	g_assert (!gku_prompt_dummy_have_response ());
 
-	rv = (module->C_CloseSession) (session);
+	rv = (test->module->C_CloseSession) (test->session);
 	gkm_assert_cmprv (rv, ==, CKR_OK);
-	session = 0;
+	test->session = 0;
 
-	rv = (module->C_Finalize) (NULL);
+	rv = (test->module->C_Finalize) (NULL);
 	gkm_assert_cmprv (rv, ==, CKR_OK);
-	module = NULL;
+	test->module = NULL;
 }
 
-TESTING_TEST (login_specific_ok_password)
+static void
+test_ok_password (Test *test, gconstpointer unused)
 {
 	CK_RV rv;
 
 	gku_prompt_dummy_queue_ok_password ("booo");
 
-	rv = (module->C_Login) (session, CKU_CONTEXT_SPECIFIC, NULL, 0);
+	rv = (test->module->C_Login) (test->session, CKU_CONTEXT_SPECIFIC, NULL, 0);
 	gkm_assert_cmprv (rv, ==, CKR_OK);
 }
 
-TESTING_TEST (login_specific_bad_password_then_cancel)
+static void
+test_bad_password_then_cancel (Test *test, gconstpointer unused)
 {
 	CK_RV rv;
 
 	gku_prompt_dummy_queue_ok_password ("bad password");
 	gku_prompt_dummy_queue_no ();
 
-	rv = (module->C_Login) (session, CKU_CONTEXT_SPECIFIC, NULL, 0);
+	rv = (test->module->C_Login) (test->session, CKU_CONTEXT_SPECIFIC, NULL, 0);
 	gkm_assert_cmprv (rv, ==, CKR_PIN_INCORRECT);
 }
 
-TESTING_TEST (login_specific_cancel_immediately)
+static void
+test_cancel_immediately (Test *test, gconstpointer unused)
 {
 	CK_RV rv;
 
 	gku_prompt_dummy_queue_no ();
 
-	rv = (module->C_Login) (session, CKU_CONTEXT_SPECIFIC, NULL, 0);
+	rv = (test->module->C_Login) (test->session, CKU_CONTEXT_SPECIFIC, NULL, 0);
 	gkm_assert_cmprv (rv, ==, CKR_PIN_INCORRECT);
 }
+
+int
+main (int argc, char **argv)
+{
+	g_type_init ();
+	g_test_init (&argc, &argv, NULL);
+
+	g_test_add ("/wrap-layer/login-specific/ok_password", Test, NULL, setup, test_ok_password, teardown);
+	g_test_add ("/wrap-layer/login-specific/bad_password_then_cancel", Test, NULL, setup, test_bad_password_then_cancel, teardown);
+	g_test_add ("/wrap-layer/login-specific/cancel_immediately", Test, NULL, setup, test_cancel_immediately, teardown);
+
+	return egg_tests_run_in_thread_with_loop ();
+}
diff --git a/pkcs11/wrap-layer/tests/test-login-user.c b/pkcs11/wrap-layer/tests/test-login-user.c
index d2d47c4..61bd34c 100644
--- a/pkcs11/wrap-layer/tests/test-login-user.c
+++ b/pkcs11/wrap-layer/tests/test-login-user.c
@@ -21,7 +21,7 @@
 
 #include "config.h"
 
-#include "test-suite.h"
+#include "egg/egg-testing.h"
 
 #include "gkm/gkm-mock.h"
 #include "gkm/gkm-test.h"
@@ -30,11 +30,14 @@
 
 #include "ui/gku-prompt.h"
 
-static CK_FUNCTION_LIST prompt_login_functions;
-static CK_FUNCTION_LIST_PTR module = NULL;
-static CK_SESSION_HANDLE session = 0;
+typedef struct {
+	CK_FUNCTION_LIST prompt_login_functions;
+	CK_FUNCTION_LIST_PTR module;
+	CK_SESSION_HANDLE session;
+} Test;
 
-TESTING_SETUP (login_user)
+static void
+setup (Test *test, gconstpointer unused)
 {
 	CK_FUNCTION_LIST_PTR funcs;
 	CK_SLOT_ID slot_id;
@@ -44,101 +47,126 @@ TESTING_SETUP (login_user)
 	/* Always start off with test functions */
 	rv = gkm_mock_C_GetFunctionList (&funcs);
 	gkm_assert_cmprv (rv, ==, CKR_OK);
-	memcpy (&prompt_login_functions, funcs, sizeof (prompt_login_functions));
+	memcpy (&test->prompt_login_functions, funcs, sizeof (test->prompt_login_functions));
 
 	gkm_wrap_layer_reset_modules ();
-	gkm_wrap_layer_add_module (&prompt_login_functions);
-	module = gkm_wrap_layer_get_functions ();
+	gkm_wrap_layer_add_module (&test->prompt_login_functions);
+	test->module = gkm_wrap_layer_get_functions ();
 
 	gku_prompt_dummy_prepare_response ();
 
-	/* Open a session */
-	rv = (module->C_Initialize) (NULL);
+	/* Open a test->session */
+	rv = (test->module->C_Initialize) (NULL);
 	gkm_assert_cmprv (rv, ==, CKR_OK);
 
-	rv = (module->C_GetSlotList) (CK_TRUE, &slot_id, &n_slots);
+	rv = (test->module->C_GetSlotList) (CK_TRUE, &slot_id, &n_slots);
 	gkm_assert_cmprv (rv, ==, CKR_OK);
 
-	rv = (module->C_OpenSession) (slot_id, CKF_SERIAL_SESSION, NULL, NULL, &session);
+	rv = (test->module->C_OpenSession) (slot_id, CKF_SERIAL_SESSION, NULL, NULL, &test->session);
 	gkm_assert_cmprv (rv, ==, CKR_OK);
 }
 
-TESTING_TEARDOWN (login_user)
+static void
+teardown (Test *test, gconstpointer unused)
 {
 	CK_RV rv;
 
 	g_assert (!gku_prompt_dummy_have_response ());
 
-	rv = (module->C_CloseSession) (session);
+	rv = (test->module->C_CloseSession) (test->session);
 	gkm_assert_cmprv (rv, ==, CKR_OK);
-	session = 0;
+	test->session = 0;
 
-	rv = (module->C_Finalize) (NULL);
+	rv = (test->module->C_Finalize) (NULL);
 	gkm_assert_cmprv (rv, ==, CKR_OK);
-	module = NULL;
+	test->module = NULL;
 }
 
-TESTING_TEST (login_fail_unsupported_so)
+static void
+test_fail_unsupported_so (Test *test, gconstpointer unused)
 {
 	CK_RV rv;
 
-	rv = (module->C_Login) (session, CKU_SO, NULL, 0);
+	rv = (test->module->C_Login) (test->session, CKU_SO, NULL, 0);
 	gkm_assert_cmprv (rv, ==, CKR_PIN_INCORRECT);
 }
 
-TESTING_TEST (login_skip_prompt_because_pin)
+static void
+test_skip_prompt_because_pin (Test *test, gconstpointer unused)
 {
 	CK_RV rv;
 
-	rv = (module->C_Login) (session, CKU_USER, (guchar*)"booo", 4);
+	rv = (test->module->C_Login) (test->session, CKU_USER, (guchar*)"booo", 4);
 	gkm_assert_cmprv (rv, ==, CKR_OK);
 }
 
-TESTING_TEST (login_user_ok_password)
+static void
+test_ok_password (Test *test, gconstpointer unused)
 {
 	CK_RV rv;
 
 	gku_prompt_dummy_queue_ok_password ("booo");
 
-	rv = (module->C_Login) (session, CKU_USER, NULL, 0);
+	rv = (test->module->C_Login) (test->session, CKU_USER, NULL, 0);
 	gkm_assert_cmprv (rv, ==, CKR_OK);
 }
 
-TESTING_TEST (login_user_bad_password_then_cancel)
+static void
+test_bad_password_then_cancel (Test *test, gconstpointer unused)
 {
 	CK_RV rv;
 
 	gku_prompt_dummy_queue_ok_password ("bad password");
 	gku_prompt_dummy_queue_no ();
 
-	rv = (module->C_Login) (session, CKU_USER, NULL, 0);
+	rv = (test->module->C_Login) (test->session, CKU_USER, NULL, 0);
 	gkm_assert_cmprv (rv, ==, CKR_PIN_INCORRECT);
 }
 
-TESTING_TEST (login_user_cancel_immediately)
+static void
+test_cancel_immediately (Test *test, gconstpointer unused)
 {
 	CK_RV rv;
 
 	gku_prompt_dummy_queue_no ();
 
-	rv = (module->C_Login) (session, CKU_USER, NULL, 0);
+	rv = (test->module->C_Login) (test->session, CKU_USER, NULL, 0);
 	gkm_assert_cmprv (rv, ==, CKR_PIN_INCORRECT);
 }
 
-TESTING_TEST (login_user_fail_get_session_info)
+static void
+test_fail_get_session_info (Test *test, gconstpointer unused)
 {
 	CK_RV rv;
 
-	prompt_login_functions.C_GetSessionInfo = gkm_mock_fail_C_GetSessionInfo;
-	rv = (module->C_Login) (session, CKU_USER, NULL, 0);
+	test->prompt_login_functions.C_GetSessionInfo = gkm_mock_fail_C_GetSessionInfo;
+	rv = (test->module->C_Login) (test->session, CKU_USER, NULL, 0);
 	gkm_assert_cmprv (rv, ==, CKR_PIN_INCORRECT);
 }
 
-TESTING_TEST (login_user_fail_get_token_info)
+static void
+test_fail_get_token_info (Test *test, gconstpointer unused)
 {
 	CK_RV rv;
 
-	prompt_login_functions.C_GetTokenInfo = gkm_mock_fail_C_GetTokenInfo;
-	rv = (module->C_Login) (session, CKU_USER, NULL, 0);
+	test->prompt_login_functions.C_GetTokenInfo = gkm_mock_fail_C_GetTokenInfo;
+	rv = (test->module->C_Login) (test->session, CKU_USER, NULL, 0);
 	gkm_assert_cmprv (rv, ==, CKR_PIN_INCORRECT);
 }
+
+int
+main (int argc, char **argv)
+{
+	g_type_init ();
+	g_test_init (&argc, &argv, NULL);
+
+	g_test_add ("/wrap-layer/login-user/fail_unsupported_so", Test, NULL, setup, test_fail_unsupported_so, teardown);
+	g_test_add ("/wrap-layer/login-user/skip_prompt_because_pin", Test, NULL, setup, test_skip_prompt_because_pin, teardown);
+	g_test_add ("/wrap-layer/login-user/ok_password", Test, NULL, setup, test_ok_password, teardown);
+	g_test_add ("/wrap-layer/login-user/bad_password_then_cancel", Test, NULL, setup, test_bad_password_then_cancel, teardown);
+	g_test_add ("/wrap-layer/login-user/cancel_immediately", Test, NULL, setup, test_cancel_immediately, teardown);
+	g_test_add ("/wrap-layer/login-user/fail_get_session_info", Test, NULL, setup, test_fail_get_session_info, teardown);
+	g_test_add ("/wrap-layer/login-user/fail_get_token_info", Test, NULL, setup, test_fail_get_token_info, teardown);
+
+	return egg_tests_run_in_thread_with_loop ();
+}
diff --git a/pkcs11/wrap-layer/tests/test-set-pin.c b/pkcs11/wrap-layer/tests/test-set-pin.c
index 766f8b8..164bde1 100644
--- a/pkcs11/wrap-layer/tests/test-set-pin.c
+++ b/pkcs11/wrap-layer/tests/test-set-pin.c
@@ -21,7 +21,7 @@
 
 #include "config.h"
 
-#include "test-suite.h"
+#include "egg/egg-testing.h"
 
 #include "gkm/gkm-mock.h"
 #include "gkm/gkm-test.h"
@@ -30,63 +30,79 @@
 
 #include "ui/gku-prompt.h"
 
-static CK_FUNCTION_LIST functions;
-static CK_FUNCTION_LIST_PTR module = NULL;
-static CK_SESSION_HANDLE session = 0;
+typedef struct {
+	CK_FUNCTION_LIST functions;
+	CK_FUNCTION_LIST_PTR module;
+	CK_SESSION_HANDLE session;
+} Test;
 
-TESTING_SETUP (set_pin)
+static void
+setup (Test *test, gconstpointer unused)
 {
 	CK_FUNCTION_LIST_PTR funcs;
 	CK_SLOT_ID slot_id;
 	CK_ULONG n_slots = 1;
 	CK_RV rv;
 
-	/* Always start off with test functions */
+	/* Always start off with test test->functions */
 	rv = gkm_mock_C_GetFunctionList (&funcs);
 	gkm_assert_cmprv (rv, ==, CKR_OK);
-	memcpy (&functions, funcs, sizeof (functions));
+	memcpy (&test->functions, funcs, sizeof (test->functions));
 
 	gkm_wrap_layer_reset_modules ();
-	gkm_wrap_layer_add_module (&functions);
-	module = gkm_wrap_layer_get_functions ();
+	gkm_wrap_layer_add_module (&test->functions);
+	test->module = gkm_wrap_layer_get_functions ();
 
 	gku_prompt_dummy_prepare_response ();
 
-	/* Open a session */
-	rv = (module->C_Initialize) (NULL);
+	/* Open a test->session */
+	rv = (test->module->C_Initialize) (NULL);
 	gkm_assert_cmprv (rv, ==, CKR_OK);
 
-	rv = (module->C_GetSlotList) (CK_TRUE, &slot_id, &n_slots);
+	rv = (test->module->C_GetSlotList) (CK_TRUE, &slot_id, &n_slots);
 	gkm_assert_cmprv (rv, ==, CKR_OK);
 
-	rv = (module->C_OpenSession) (slot_id, CKF_SERIAL_SESSION, NULL, NULL, &session);
+	rv = (test->module->C_OpenSession) (slot_id, CKF_SERIAL_SESSION, NULL, NULL, &test->session);
 	gkm_assert_cmprv (rv, ==, CKR_OK);
 }
 
-TESTING_TEARDOWN (set_pin)
+static void
+teardown (Test *test, gconstpointer unused)
 {
 	CK_RV rv;
 
 	g_assert (!gku_prompt_dummy_have_response ());
 
-	rv = (module->C_CloseSession) (session);
+	rv = (test->module->C_CloseSession) (test->session);
 	gkm_assert_cmprv (rv, ==, CKR_OK);
-	session = 0;
+	test->session = 0;
 
-	rv = (module->C_Finalize) (NULL);
+	rv = (test->module->C_Finalize) (NULL);
 	gkm_assert_cmprv (rv, ==, CKR_OK);
-	module = NULL;
+	test->module = NULL;
 }
 
-TESTING_TEST (set_pin_ok_passwords)
+static void
+test_ok_passwords (Test *test, gconstpointer unused)
 {
 	CK_RV rv;
 
 	gku_prompt_dummy_queue_ok_passwords ("booo", "new");
 
-	rv = (module->C_SetPIN) (session, NULL, 0, NULL, 0);
+	rv = (test->module->C_SetPIN) (test->session, NULL, 0, NULL, 0);
 	gkm_assert_cmprv (rv, ==, CKR_OK);
 
-	rv = (module->C_Login) (session, CKU_USER, (guchar*)"new", 3);
+	rv = (test->module->C_Login) (test->session, CKU_USER, (guchar*)"new", 3);
 	gkm_assert_cmprv (rv, ==, CKR_OK);
 }
+
+int
+main (int argc, char **argv)
+{
+	g_type_init ();
+	g_test_init (&argc, &argv, NULL);
+
+	g_test_add ("/wrap-layer/set-pin/ok_passwords", Test, NULL, setup, test_ok_passwords, teardown);
+
+	return egg_tests_run_in_thread_with_loop ();
+}
diff --git a/pkcs11/xdg-store/tests/Makefile.am b/pkcs11/xdg-store/tests/Makefile.am
index 51ef887..d009a63 100644
--- a/pkcs11/xdg-store/tests/Makefile.am
+++ b/pkcs11/xdg-store/tests/Makefile.am
@@ -1,30 +1,53 @@
 
-TESTING_SOURCES = \
-	test-xdg-module.h
-
-# Test files should be listed in order they need to run
-TESTING_FILES = \
-	test-xdg-module.c \
-	test-xdg-trust.c
-
-TESTING_LIBS =  \
+INCLUDES = \
+	-I$(top_builddir) \
+	-I$(top_srcdir) \
+	-I$(top_srcdir)/pkcs11 \
+	-DSRCDIR="\"$(srcdir)\"" \
+	$(GLIB_CFLAGS) \
+	$(LIBGCRYPT_CFLAGS)
+
+LDADD = \
+	libgkm-mock-xdg-module.a \
 	$(top_builddir)/pkcs11/xdg-store/libgkm-xdg-store.la \
 	$(top_builddir)/pkcs11/gkm/libgkm.la \
-	$(top_builddir)/egg/libegg.la
+	$(top_builddir)/egg/libegg.la \
+	$(GLIB_LIBS) \
+	$(LIBGCRYPT_LIBS)
+
+if WITH_P11_TESTS
+CHECK_PROGS = check-xdg-module
+else
+CHECK_PROGS =
+endif
+
+TEST_PROGS = \
+	test-xdg-module \
+	test-xdg-trust
 
-include $(top_srcdir)/testing/testing.make
+check_PROGRAMS = $(TEST_PROGS)
 
-EXTRA_DIST += \
+test: $(TEST_PROGS) $(CHECK_PROGS)
+	gtester -k --verbose -m $(TEST_MODE) --g-fatal-warnings $(TEST_PROGS)
+	@for prog in $(CHECK_PROGS); do SRCDIR='.' ./$$prog || exit 1; done
+
+check-local: test
+
+all-local: $(check_PROGRAMS)
+
+EXTRA_DIST = \
 	p11-tests.conf \
-	test-data
+	files
+
+noinst_PROGRAMS = \
+	frob-trust-file \
+	dump-trust-file \
+	$(CHECK_PROGS)
 
-# ------------------------------------------------------------------------------
+check_xdg_module_CFLAGS = $(P11_TESTS_CFLAGS)
+check_xdg_module_LDADD = $(P11_TESTS_LIBS) $(LDADD)
 
-noinst_PROGRAMS += \
-	diddle-trust-file \
-	dump-trust-file
+noinst_LIBRARIES = libgkm-mock-xdg-module.a
 
-diddle_trust_file_LDADD =  \
-	$(top_builddir)/egg/libegg.la
-dump_trust_file_LDADD =  \
-	$(top_builddir)/egg/libegg.la
+libgkm_mock_xdg_module_a_SOURCES = \
+	mock-xdg-module.c mock-xdg-module.h
diff --git a/pkcs11/xdg-store/tests/check-xdg-module.c b/pkcs11/xdg-store/tests/check-xdg-module.c
new file mode 100644
index 0000000..64ea387
--- /dev/null
+++ b/pkcs11/xdg-store/tests/check-xdg-module.c
@@ -0,0 +1,68 @@
+/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */
+/* check-module.c: Check PKCS#11 implementation
+
+   Copyright (C) 2009 Stefan Walter
+
+   The Gnome Keyring Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Library General Public License as
+   published by the Free Software Foundation; either version 2 of the
+   License, or (at your option) any later version.
+
+   The Gnome Keyring 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
+   Library General Public License for more details.
+
+   You should have received a copy of the GNU Library General Public
+   License along with the Gnome Library; see the file COPYING.LIB.  If not,
+   write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+   Boston, MA 02111-1307, USA.
+
+   Author: Stef Walter <stef memberwebs com>
+*/
+
+#include "config.h"
+
+#include "xdg-store/gkm-xdg-store.h"
+
+#include "egg/egg-secure-memory.h"
+
+#include <glib.h>
+#include <glib-object.h>
+
+#include <p11-tests.h>
+
+static int failures = 0;
+
+EGG_SECURE_GLIB_DEFINITIONS ();
+
+static void
+on_p11_tests_log (int level, const char *section, const char *message)
+{
+	if (level == P11_TESTS_NONE) {
+		g_message ("%s", message);
+	} else if (level != P11_TESTS_FAIL) {
+		g_message ("%s: %s", section, message);
+	} else {
+		g_print ("  /xdg-store/%s: FAIL: %s\n", section, message);
+		++failures;
+	}
+}
+
+int
+main (int argc, const char *argv[])
+{
+	g_type_init ();
+
+	p11_tests_set_log_func (on_p11_tests_log);
+	p11_tests_set_unexpected (1);
+	p11_tests_set_verbose (0);
+	p11_tests_set_write_session (1);
+	p11_tests_load_config (SRCDIR "/p11-tests.conf");
+
+	g_print ("CHECK: check-xdg-module...\n");
+	p11_tests_perform (gkm_xdg_store_get_functions ());
+
+	g_print ("%s: check-xdg-module\n", failures ? "FAIL" : "PASS");
+	return failures;
+}
diff --git a/pkcs11/xdg-store/tests/test-data/test-certificate-1.cer b/pkcs11/xdg-store/tests/files/test-certificate-1.cer
similarity index 100%
rename from pkcs11/xdg-store/tests/test-data/test-certificate-1.cer
rename to pkcs11/xdg-store/tests/files/test-certificate-1.cer
diff --git a/pkcs11/xdg-store/tests/test-data/test-certificate-2.cer b/pkcs11/xdg-store/tests/files/test-certificate-2.cer
similarity index 100%
rename from pkcs11/xdg-store/tests/test-data/test-certificate-2.cer
rename to pkcs11/xdg-store/tests/files/test-certificate-2.cer
diff --git a/pkcs11/xdg-store/tests/test-data/test-refer-1.trust b/pkcs11/xdg-store/tests/files/test-refer-1.trust
similarity index 100%
rename from pkcs11/xdg-store/tests/test-data/test-refer-1.trust
rename to pkcs11/xdg-store/tests/files/test-refer-1.trust
diff --git a/pkcs11/xdg-store/tests/diddle-trust-file.c b/pkcs11/xdg-store/tests/frob-trust-file.c
similarity index 100%
rename from pkcs11/xdg-store/tests/diddle-trust-file.c
rename to pkcs11/xdg-store/tests/frob-trust-file.c
diff --git a/pkcs11/xdg-store/tests/mock-xdg-module.c b/pkcs11/xdg-store/tests/mock-xdg-module.c
new file mode 100644
index 0000000..f8271c2
--- /dev/null
+++ b/pkcs11/xdg-store/tests/mock-xdg-module.c
@@ -0,0 +1,214 @@
+/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */
+/* test-xdg-module.c: A test PKCS#11 module implementation
+
+   Copyright (C) 2010 Stefan Walter
+   Copyright (C) 2010 Collabora Ltd
+
+   The Gnome Keyring Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Library General Public License as
+   published by the Free Software Foundation; either version 2 of the
+   License, or (at your option) any later version.
+
+   The Gnome Keyring 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
+   Library General Public License for more details.
+
+   You should have received a copy of the GNU Library General Public
+   License along with the Gnome Library; see the file COPYING.LIB.  If not,
+   write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+   Boston, MA 02111-1307, USA.
+
+   Author: Stef Walter <stef memberwebs com>
+*/
+
+#include "config.h"
+
+#include "mock-xdg-module.h"
+
+#include "xdg-store/gkm-xdg-store.h"
+
+#include "egg/egg-mkdtemp.h"
+#include "egg/egg-secure-memory.h"
+
+#include "gkm/gkm-session.h"
+#include "gkm/gkm-module.h"
+
+#include <glib/gstdio.h>
+
+#include <errno.h>
+#include <sys/times.h>
+
+#include <string.h>
+
+EGG_SECURE_GLIB_DEFINITIONS ();
+
+static GMutex *mutex = NULL;
+static gchar *directory = NULL;
+
+GkmModule*  _gkm_xdg_store_get_module_for_testing (void);
+GMutex* _gkm_module_get_scary_mutex_that_you_should_not_touch (GkmModule *module);
+
+static void
+copy_file_to_directory (const gchar *from, const gchar *directory)
+{
+	gchar *filename;
+	gchar *basename;
+	gchar *data;
+	gsize n_data;
+
+	if (!g_file_get_contents (from, &data, &n_data, NULL))
+		g_error ("couldn't read: %s", from);
+
+	basename = g_path_get_basename (from);
+	filename = g_build_filename (directory, basename, NULL);
+	if (!g_file_set_contents (filename, data, n_data, NULL))
+		g_error ("couldn't write: %s", filename);
+	g_free (filename);
+	g_free (basename);
+	g_free (data);
+}
+
+void
+mock_xdg_module_remove_file (const gchar *name)
+{
+	gchar *filename;
+	gchar *basename;
+
+	basename = g_path_get_basename (name);
+	filename = g_build_filename (directory, basename, NULL);
+	if (g_unlink (filename) < 0)
+		g_error ("couldn't remove: %s", filename);
+	g_free (filename);
+	g_free (basename);
+}
+
+
+void
+mock_xdg_module_empty_file (const gchar *name)
+{
+	gchar *filename;
+	gchar *basename;
+
+	basename = g_path_get_basename (name);
+	filename = g_build_filename (directory, basename, NULL);
+	if (!g_file_set_contents (filename, "", 0, NULL))
+		g_error ("couldn't write: %s", filename);
+	g_free (filename);
+	g_free (basename);
+}
+
+void
+mock_xdg_module_touch_file (const gchar *name, gint future)
+{
+	gchar *basename;
+	gchar *filename;
+	struct timeval tv[2];
+
+	basename = g_path_get_basename (name);
+	filename = g_build_filename (directory, basename, NULL);
+
+	/* Initialize the access and modification times */
+	gettimeofday (tv, NULL);
+	tv[0].tv_sec += future;
+	memcpy (tv + 1, tv, sizeof (struct timeval));
+
+	if (utimes (filename, tv) < 0)
+		g_error ("couldn't update file time: %s: %s", filename, g_strerror (errno));
+
+	g_free (basename);
+	g_free (filename);
+}
+
+GkmModule*
+mock_xdg_module_initialize_and_enter (void)
+{
+	CK_FUNCTION_LIST_PTR funcs;
+	CK_C_INITIALIZE_ARGS args;
+	GkmModule *module;
+	gchar *string;
+	CK_RV rv;
+
+	directory = egg_mkdtemp (g_strdup ("/tmp/mock-secret-XXXXXX"));
+
+	/* Setup test directory to work in */
+	memset (&args, 0, sizeof (args));
+	string = g_strdup_printf ("directory='%s'", directory);
+	args.pReserved = string;
+	args.flags = CKF_OS_LOCKING_OK;
+
+	/* Copy files from test-data to scratch */
+	copy_file_to_directory (SRCDIR "/files/test-refer-1.trust", directory);
+	copy_file_to_directory (SRCDIR "/files/test-certificate-1.cer", directory);
+	mock_xdg_module_empty_file  ("invalid-without-ext");
+	mock_xdg_module_empty_file ("test-file.unknown");
+	mock_xdg_module_empty_file ("test-invalid.trust");
+
+	funcs = gkm_xdg_store_get_functions ();
+	rv = (funcs->C_Initialize) (&args);
+	g_return_val_if_fail (rv == CKR_OK, NULL);
+
+	module = _gkm_xdg_store_get_module_for_testing ();
+	g_return_val_if_fail (module, NULL);
+
+	mutex = _gkm_module_get_scary_mutex_that_you_should_not_touch (module);
+	mock_xdg_module_enter ();
+
+	g_free (string);
+
+	return module;
+}
+
+void
+mock_xdg_module_leave_and_finalize (void)
+{
+	CK_FUNCTION_LIST_PTR funcs;
+	CK_RV rv;
+
+	mock_xdg_module_leave ();
+
+	funcs = gkm_xdg_store_get_functions ();
+	rv = (funcs->C_Finalize) (NULL);
+	g_return_if_fail (rv == CKR_OK);
+
+	g_free (directory);
+	directory = NULL;
+}
+
+void
+mock_xdg_module_leave (void)
+{
+	g_assert (mutex);
+	g_mutex_unlock (mutex);
+}
+
+void
+mock_xdg_module_enter (void)
+{
+	g_assert (mutex);
+	g_mutex_lock (mutex);
+}
+
+GkmSession*
+mock_xdg_module_open_session (gboolean writable)
+{
+	CK_ULONG flags = CKF_SERIAL_SESSION;
+	CK_SESSION_HANDLE handle;
+	GkmModule *module;
+	GkmSession *session;
+	CK_RV rv;
+
+	module = _gkm_xdg_store_get_module_for_testing ();
+	g_return_val_if_fail (module, NULL);
+
+	if (writable)
+		flags |= CKF_RW_SESSION;
+
+	rv = gkm_module_C_OpenSession (module, 1, flags, NULL, NULL, &handle);
+	g_assert (rv == CKR_OK);
+
+	session = gkm_module_lookup_session (module, handle);
+	g_assert (session);
+
+	return session;
+}
diff --git a/pkcs11/xdg-store/tests/test-xdg-module.h b/pkcs11/xdg-store/tests/mock-xdg-module.h
similarity index 61%
rename from pkcs11/xdg-store/tests/test-xdg-module.h
rename to pkcs11/xdg-store/tests/mock-xdg-module.h
index 8a6b78b..d2a7b81 100644
--- a/pkcs11/xdg-store/tests/test-xdg-module.h
+++ b/pkcs11/xdg-store/tests/mock-xdg-module.h
@@ -21,8 +21,8 @@
    Author: Stef Walter <stef memberwebs com>
 */
 
-#ifndef TEST_XDG_MODULE_H_
-#define TEST_XDG_MODULE_H_
+#ifndef MOCK_XDG_MODULE_H_
+#define MOCK_XDG_MODULE_H_
 
 #include <glib.h>
 
@@ -30,16 +30,22 @@
 #include "gkm/gkm-types.h"
 
 #include "pkcs11.h"
-#include "test-suite.h"
 
-void                   test_xdg_module_leave                    (void);
+void                   mock_xdg_module_leave                    (void);
 
-void                   test_xdg_module_enter                    (void);
+void                   mock_xdg_module_enter                    (void);
 
-GkmModule*             test_xdg_module_initialize_and_enter     (void);
+GkmModule*             mock_xdg_module_initialize_and_enter     (void);
 
-void                   test_xdg_module_leave_and_finalize       (void);
+void                   mock_xdg_module_leave_and_finalize       (void);
 
-GkmSession*            test_xdg_module_open_session             (gboolean writable);
+GkmSession*            mock_xdg_module_open_session             (gboolean writable);
 
-#endif /* TEST_XDG_MODULE_H_ */
+void                   mock_xdg_module_empty_file               (const gchar *name);
+
+void                   mock_xdg_module_touch_file               (const gchar *name,
+                                                                 gint future);
+
+void                   mock_xdg_module_remove_file              (const gchar *name);
+
+#endif /* MOCK_XDG_MODULE_H_ */
diff --git a/pkcs11/xdg-store/tests/test-xdg-module.c b/pkcs11/xdg-store/tests/test-xdg-module.c
index d254173..86eedf8 100644
--- a/pkcs11/xdg-store/tests/test-xdg-module.c
+++ b/pkcs11/xdg-store/tests/test-xdg-module.c
@@ -1,5 +1,5 @@
 /* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */
-/* test-xdg-module.c: A test PKCS#11 module implementation
+/* test-xdg-test->module.c: A test PKCS#11 test->module implementation
 
    Copyright (C) 2010 Stefan Walter
    Copyright (C) 2010 Collabora Ltd
@@ -24,249 +24,154 @@
 
 #include "config.h"
 
-#include "test-xdg-module.h"
-#include "gkm-xdg-store.h"
+#include "mock-xdg-module.h"
+
+#include "xdg-store/gkm-xdg-store.h"
 
 #include "gkm/gkm-session.h"
 #include "gkm/gkm-module.h"
 
+#include "egg/egg-testing.h"
+
 #include <errno.h>
 #include <sys/times.h>
 
 #include <string.h>
 
-static GMutex *mutex = NULL;
-
-GkmModule*  _gkm_xdg_store_get_module_for_testing (void);
-GMutex* _gkm_module_get_scary_mutex_that_you_should_not_touch (GkmModule *module);
-
-GkmModule*
-test_xdg_module_initialize_and_enter (void)
-{
-	CK_FUNCTION_LIST_PTR funcs;
-	CK_C_INITIALIZE_ARGS args;
-	GkmModule *module;
-	gchar *string;
-	CK_RV rv;
-
-	/* Setup test directory to work in */
-	memset (&args, 0, sizeof (args));
-	string = g_strdup_printf ("directory='%s'", testing_scratch_directory ());
-	args.pReserved = string;
-	args.flags = CKF_OS_LOCKING_OK;
-
-	/* Delete all files in this directory */
-	testing_scratch_remove_all ();
-
-	/* Copy files from test-data to scratch */
-	testing_data_to_scratch ("test-refer-1.trust", NULL);
-	testing_data_to_scratch ("test-certificate-1.cer", NULL);
-	testing_scratch_empty ("invalid-without-ext");
-	testing_scratch_empty ("test-file.unknown");
-	testing_scratch_empty ("test-invalid.trust");
-
-	funcs = gkm_xdg_store_get_functions ();
-	rv = (funcs->C_Initialize) (&args);
-	g_return_val_if_fail (rv == CKR_OK, NULL);
-
-	module = _gkm_xdg_store_get_module_for_testing ();
-	g_return_val_if_fail (module, NULL);
-
-	mutex = _gkm_module_get_scary_mutex_that_you_should_not_touch (module);
-	test_xdg_module_enter ();
-
-	g_free (string);
-
-	return module;
-}
-
-void
-test_xdg_module_leave_and_finalize (void)
-{
-	CK_FUNCTION_LIST_PTR funcs;
-	CK_RV rv;
-
-	test_xdg_module_leave ();
-
-	funcs = gkm_xdg_store_get_functions ();
-	rv = (funcs->C_Finalize) (NULL);
-	g_return_if_fail (rv == CKR_OK);
-}
-
-void
-test_xdg_module_leave (void)
-{
-	g_assert (mutex);
-	g_mutex_unlock (mutex);
-}
-
-void
-test_xdg_module_enter (void)
-{
-	g_assert (mutex);
-	g_mutex_lock (mutex);
-}
-
-GkmSession*
-test_xdg_module_open_session (gboolean writable)
-{
-	CK_ULONG flags = CKF_SERIAL_SESSION;
-	CK_SESSION_HANDLE handle;
+typedef struct {
 	GkmModule *module;
 	GkmSession *session;
-	CK_RV rv;
-
-	module = _gkm_xdg_store_get_module_for_testing ();
-	g_return_val_if_fail (module, NULL);
-
-	if (writable)
-		flags |= CKF_RW_SESSION;
-
-	rv = gkm_module_C_OpenSession (module, 1, flags, NULL, NULL, &handle);
-	g_assert (rv == CKR_OK);
-
-	session = gkm_module_lookup_session (module, handle);
-	g_assert (session);
-
-	return session;
-}
-
-/* --------------------------------------------------------------------------------------
- * MODULE TESTS
- */
-
-static GkmModule *module = NULL;
-static GkmSession *session = NULL;
-static CK_SLOT_ID slot_id = 0;
+	CK_SLOT_ID slot_id;
+} Test;
 
-TESTING_EXTERNAL(xdg_module)
-{
-	CK_FUNCTION_LIST_PTR funcs = gkm_xdg_store_get_functions ();
-	testing_test_p11_module (funcs, "p11-tests.conf");
-}
-
-TESTING_SETUP(xdg_module_setup)
+static void
+setup (Test *test, gconstpointer unused)
 {
 	CK_SESSION_INFO info;
 	CK_RV rv;
 
-	module = test_xdg_module_initialize_and_enter ();
-	session = test_xdg_module_open_session (TRUE);
+	test->module = mock_xdg_module_initialize_and_enter ();
+	test->session = mock_xdg_module_open_session (TRUE);
 
-	rv = gkm_module_C_Login (module, gkm_session_get_handle (session), CKU_USER, NULL, 0);
+	rv = gkm_module_C_Login (test->module, gkm_session_get_handle (test->session), CKU_USER, NULL, 0);
 	gkm_assert_cmprv (rv, ==, CKR_OK);
 
-	rv = gkm_session_C_GetSessionInfo (session, &info);
+	rv = gkm_session_C_GetSessionInfo (test->session, &info);
 	gkm_assert_cmprv (rv, ==, CKR_OK);
 
-	slot_id = info.slotID;
+	test->slot_id = info.slotID;
 }
 
-TESTING_TEARDOWN(xdg_module_teardown)
+static void
+teardown (Test *test, gconstpointer unused)
 {
-	test_xdg_module_leave_and_finalize ();
-	module = NULL;
-	session = NULL;
+	mock_xdg_module_leave_and_finalize ();
+	test->module = NULL;
+	test->session = NULL;
 }
 
-TESTING_TEST (xdg_module_find_twice_is_same)
+static void
+test_module_find_twice_is_same (Test *test, gconstpointer unused)
 {
 	CK_OBJECT_HANDLE objects[256];
 	CK_ULONG n_objects;
 	CK_ULONG n_check;
 	CK_RV rv;
 
-	rv = gkm_session_C_FindObjectsInit (session, NULL, 0);
+	rv = gkm_session_C_FindObjectsInit (test->session, NULL, 0);
 	gkm_assert_cmprv (rv, ==, CKR_OK);
-	rv = gkm_session_C_FindObjects (session, objects, G_N_ELEMENTS (objects), &n_objects);
+	rv = gkm_session_C_FindObjects (test->session, objects, G_N_ELEMENTS (objects), &n_objects);
 	gkm_assert_cmprv (rv, ==, CKR_OK);
-	rv = gkm_session_C_FindObjectsFinal (session);
+	rv = gkm_session_C_FindObjectsFinal (test->session);
 	gkm_assert_cmprv (rv, ==, CKR_OK);
 
 	gkm_assert_cmpulong (n_objects, >, 0);
 
 	/* Update the time on the file */
-	testing_scratch_touch ("test-refer-1.trust", 1);
+	mock_xdg_module_touch_file ("test-refer-1.trust", 1);
 
-	rv = gkm_session_C_FindObjectsInit (session, NULL, 0);
+	rv = gkm_session_C_FindObjectsInit (test->session, NULL, 0);
 	gkm_assert_cmprv (rv, ==, CKR_OK);
-	rv = gkm_session_C_FindObjects (session, objects, G_N_ELEMENTS (objects), &n_check);
+	rv = gkm_session_C_FindObjects (test->session, objects, G_N_ELEMENTS (objects), &n_check);
 	gkm_assert_cmprv (rv, ==, CKR_OK);
-	rv = gkm_session_C_FindObjectsFinal (session);
+	rv = gkm_session_C_FindObjectsFinal (test->session);
 	gkm_assert_cmprv (rv, ==, CKR_OK);
 
 	/* Should have same objects after reload */
 	gkm_assert_cmpulong (n_check, ==, n_objects);
 }
 
-TESTING_TEST (xdg_module_file_becomes_invalid)
+static void
+test_module_file_becomes_invalid (Test *test, gconstpointer unused)
 {
 	CK_OBJECT_HANDLE objects[256];
 	CK_ULONG n_objects;
 	CK_ULONG n_check;
 	CK_RV rv;
 
-	rv = gkm_session_C_FindObjectsInit (session, NULL, 0);
+	rv = gkm_session_C_FindObjectsInit (test->session, NULL, 0);
 	gkm_assert_cmprv (rv, ==, CKR_OK);
-	rv = gkm_session_C_FindObjects (session, objects, G_N_ELEMENTS (objects), &n_objects);
+	rv = gkm_session_C_FindObjects (test->session, objects, G_N_ELEMENTS (objects), &n_objects);
 	gkm_assert_cmprv (rv, ==, CKR_OK);
-	rv = gkm_session_C_FindObjectsFinal (session);
+	rv = gkm_session_C_FindObjectsFinal (test->session);
 	gkm_assert_cmprv (rv, ==, CKR_OK);
 
 	gkm_assert_cmpulong (n_objects, >, 0);
 
 	/* Overwrite the file with empty */
-	testing_scratch_empty ("test-refer-1.trust");
-	testing_scratch_touch ("test-refer-1.trust", 2);
+	mock_xdg_module_empty_file ("test-refer-1.trust");
+	mock_xdg_module_touch_file ("test-refer-1.trust", 2);
 
-	rv = gkm_session_C_FindObjectsInit (session, NULL, 0);
+	rv = gkm_session_C_FindObjectsInit (test->session, NULL, 0);
 	gkm_assert_cmprv (rv, ==, CKR_OK);
-	rv = gkm_session_C_FindObjects (session, objects, G_N_ELEMENTS (objects), &n_check);
+	rv = gkm_session_C_FindObjects (test->session, objects, G_N_ELEMENTS (objects), &n_check);
 	gkm_assert_cmprv (rv, ==, CKR_OK);
-	rv = gkm_session_C_FindObjectsFinal (session);
+	rv = gkm_session_C_FindObjectsFinal (test->session);
 	gkm_assert_cmprv (rv, ==, CKR_OK);
 
 	/* Should have less objects */
 	gkm_assert_cmpulong (n_check, <, n_objects);
 }
 
-TESTING_TEST (xdg_module_file_remove)
+static void
+test_module_file_remove (Test *test, gconstpointer unused)
 {
 	CK_OBJECT_HANDLE objects[256];
 	CK_ULONG n_objects;
 	CK_ULONG n_check;
 	CK_RV rv;
 
-	rv = gkm_session_C_FindObjectsInit (session, NULL, 0);
+	rv = gkm_session_C_FindObjectsInit (test->session, NULL, 0);
 	gkm_assert_cmprv (rv, ==, CKR_OK);
-	rv = gkm_session_C_FindObjects (session, objects, G_N_ELEMENTS (objects), &n_objects);
+	rv = gkm_session_C_FindObjects (test->session, objects, G_N_ELEMENTS (objects), &n_objects);
 	gkm_assert_cmprv (rv, ==, CKR_OK);
-	rv = gkm_session_C_FindObjectsFinal (session);
+	rv = gkm_session_C_FindObjectsFinal (test->session);
 	gkm_assert_cmprv (rv, ==, CKR_OK);
 
 	gkm_assert_cmpulong (n_objects, >, 0);
 
 	/* This file goes away */
-	testing_scratch_remove ("test-refer-1.trust");
+	mock_xdg_module_remove_file ("test-refer-1.trust");
 
-	rv = gkm_session_C_FindObjectsInit (session, NULL, 0);
+	rv = gkm_session_C_FindObjectsInit (test->session, NULL, 0);
 	gkm_assert_cmprv (rv, ==, CKR_OK);
-	rv = gkm_session_C_FindObjects (session, objects, G_N_ELEMENTS (objects), &n_check);
+	rv = gkm_session_C_FindObjects (test->session, objects, G_N_ELEMENTS (objects), &n_check);
 	gkm_assert_cmprv (rv, ==, CKR_OK);
-	rv = gkm_session_C_FindObjectsFinal (session);
+	rv = gkm_session_C_FindObjectsFinal (test->session);
 	gkm_assert_cmprv (rv, ==, CKR_OK);
 
 	/* Should have less objects */
 	gkm_assert_cmpulong (n_check, <, n_objects);
 }
 
-TESTING_TEST (xdg_create_and_add_object)
+static void
+test_create_and_add_object (Test *test, gconstpointer unused)
 {
 	CK_OBJECT_HANDLE object = 0;
 	CK_OBJECT_CLASS klass = CKO_CERTIFICATE;
 	CK_CERTIFICATE_TYPE ctype = CKC_X_509;
 	CK_BBOOL tval = CK_TRUE;
-	gpointer data;
+	gchar *data;
 	gsize n_data;
 	CK_RV rv;
 
@@ -277,16 +182,19 @@ TESTING_TEST (xdg_create_and_add_object)
 		{ CKA_CERTIFICATE_TYPE, &ctype, sizeof (ctype) }
 	};
 
-	data = testing_data_read ("test-certificate-2.cer", &n_data);
+	if (!g_file_get_contents (SRCDIR "/files/test-certificate-2.cer", &data, &n_data, NULL))
+		g_assert_not_reached ();
+
 	attrs[0].pValue = data;
 	attrs[0].ulValueLen = n_data;
 
-	rv = gkm_session_C_CreateObject (session, attrs, G_N_ELEMENTS (attrs), &object);
+	rv = gkm_session_C_CreateObject (test->session, attrs, G_N_ELEMENTS (attrs), &object);
 	gkm_assert_cmprv (rv, ==, CKR_OK);
 	gkm_assert_cmpulong (object, !=, 0);
 }
 
-TESTING_TEST (xdg_destroy_object)
+static void
+test_destroy_object (Test *test, gconstpointer unused)
 {
 	CK_OBJECT_HANDLE object = 0;
 	CK_CERTIFICATE_TYPE ctype = CKC_X_509;
@@ -299,30 +207,31 @@ TESTING_TEST (xdg_destroy_object)
 		{ CKA_TOKEN, &tval, sizeof (tval) }
 	};
 
-	rv = gkm_session_C_FindObjectsInit (session, attrs, G_N_ELEMENTS (attrs));
+	rv = gkm_session_C_FindObjectsInit (test->session, attrs, G_N_ELEMENTS (attrs));
 	gkm_assert_cmprv (rv, ==, CKR_OK);
-	rv = gkm_session_C_FindObjects (session, &object, 1, &n_objects);
+	rv = gkm_session_C_FindObjects (test->session, &object, 1, &n_objects);
 	gkm_assert_cmprv (rv, ==, CKR_OK);
 	gkm_assert_cmpulong (n_objects, ==, 1);
-	rv = gkm_session_C_FindObjectsFinal (session);
+	rv = gkm_session_C_FindObjectsFinal (test->session);
 	gkm_assert_cmprv (rv, ==, CKR_OK);
 
 	/* Destroy this object, which should be stored on the disk */
-	rv = gkm_session_C_DestroyObject (session, object);
+	rv = gkm_session_C_DestroyObject (test->session, object);
 	gkm_assert_cmprv (rv, ==, CKR_OK);
 
 	/* Make sure it's really gone */
-	rv = gkm_session_C_DestroyObject (session, object);
+	rv = gkm_session_C_DestroyObject (test->session, object);
 	gkm_assert_cmprv (rv, ==, CKR_OBJECT_HANDLE_INVALID);
 }
 
-TESTING_TEST (xdg_get_slot_info)
+static void
+test_get_slot_info (Test *test, gconstpointer unused)
 {
 	CK_SLOT_INFO info;
 	const gchar *str;
 	CK_RV rv;
 
-	rv = gkm_module_C_GetSlotInfo (module, slot_id, &info);
+	rv = gkm_module_C_GetSlotInfo (test->module, test->slot_id, &info);
 	gkm_assert_cmprv (rv, ==, CKR_OK);
 
 	str = g_strstr_len ((gchar*)info.slotDescription, sizeof (info.slotDescription),
@@ -330,16 +239,46 @@ TESTING_TEST (xdg_get_slot_info)
 	g_assert (str != NULL);
 }
 
-TESTING_TEST (xdg_get_token_info)
+static void
+test_get_token_info (Test *test, gconstpointer unused)
 {
 	CK_TOKEN_INFO info;
 	const gchar *str;
 	CK_RV rv;
 
-	rv = gkm_module_C_GetTokenInfo (module, slot_id, &info);
+	rv = gkm_module_C_GetTokenInfo (test->module, test->slot_id, &info);
 	gkm_assert_cmprv (rv, ==, CKR_OK);
 
 	str = g_strstr_len ((gchar*)info.label, sizeof (info.label),
 	                    "User Key Storage");
 	g_assert (str != NULL);
 }
+
+
+static void
+null_log_handler (const gchar *log_domain, GLogLevelFlags log_level,
+                  const gchar *message, gpointer user_data)
+{
+
+}
+
+int
+main (int argc, char **argv)
+{
+	g_type_init ();
+	g_test_init (&argc, &argv, NULL);
+
+	/* Suppress these messages in tests */
+	g_log_set_handler (G_LOG_DOMAIN, G_LOG_LEVEL_MESSAGE | G_LOG_LEVEL_INFO | G_LOG_LEVEL_DEBUG,
+	                   null_log_handler, NULL);
+
+	g_test_add ("/xdg-store/module/module_find_twice_is_same", Test, NULL, setup, test_module_find_twice_is_same, teardown);
+	g_test_add ("/xdg-store/module/module_file_becomes_invalid", Test, NULL, setup, test_module_file_becomes_invalid, teardown);
+	g_test_add ("/xdg-store/module/module_file_remove", Test, NULL, setup, test_module_file_remove, teardown);
+	g_test_add ("/xdg-store/module/create_and_add_object", Test, NULL, setup, test_create_and_add_object, teardown);
+	g_test_add ("/xdg-store/module/destroy_object", Test, NULL, setup, test_destroy_object, teardown);
+	g_test_add ("/xdg-store/module/get_slot_info", Test, NULL, setup, test_get_slot_info, teardown);
+	g_test_add ("/xdg-store/module/get_token_info", Test, NULL, setup, test_get_token_info, teardown);
+
+	return egg_tests_run_in_thread_with_loop ();
+}
diff --git a/pkcs11/xdg-store/tests/test-xdg-trust.c b/pkcs11/xdg-store/tests/test-xdg-trust.c
index bb2d329..7fb993b 100644
--- a/pkcs11/xdg-store/tests/test-xdg-trust.c
+++ b/pkcs11/xdg-store/tests/test-xdg-trust.c
@@ -23,7 +23,9 @@
 
 #include "config.h"
 
-#include "test-xdg-module.h"
+#include "mock-xdg-module.h"
+
+#include "egg/egg-testing.h"
 
 #include "gkm/gkm-module.h"
 #include "gkm/gkm-session.h"
@@ -32,10 +34,12 @@
 #include "pkcs11/pkcs11n.h"
 #include "pkcs11/pkcs11x.h"
 
-static GkmModule *module = NULL;
-static GkmSession *session = NULL;
-static gpointer cert_data = NULL;
-static gsize n_cert_data;
+typedef struct {
+	GkmModule *module;
+	GkmSession *session;
+	gchar *cert_data;
+	gsize n_cert_data;
+} Test;
 
 /*
  * C=ZA, ST=Western Cape, L=Cape Town, O=Thawte Consulting, OU=Certification Services Division,
@@ -114,32 +118,35 @@ debug_print_certificate_info (const gchar *path)
 
 #endif
 
-TESTING_SETUP (trust_setup)
+static void
+setup (Test *test, gconstpointer unused)
 {
 	CK_RV rv;
 
-	module = test_xdg_module_initialize_and_enter ();
-	session = test_xdg_module_open_session (TRUE);
+	test->module = mock_xdg_module_initialize_and_enter ();
+	test->session = mock_xdg_module_open_session (TRUE);
 
-	rv = gkm_module_C_Login (module, gkm_session_get_handle (session), CKU_USER, NULL, 0);
+	rv = gkm_module_C_Login (test->module, gkm_session_get_handle (test->session), CKU_USER, NULL, 0);
 	g_assert (rv == CKR_OK);
 
-	cert_data = testing_data_read ("test-certificate-2.cer", &n_cert_data);
-	g_assert (cert_data);
+	if (!g_file_get_contents (SRCDIR "/files/test-certificate-2.cer", &test->cert_data, &test->n_cert_data, NULL))
+		g_assert_not_reached ();
 }
 
-TESTING_TEARDOWN (trust_teardown)
+static void
+teardown (Test *test, gconstpointer unused)
 {
-	test_xdg_module_leave_and_finalize ();
-	module = NULL;
-	session = NULL;
+	mock_xdg_module_leave_and_finalize ();
+	test->module = NULL;
+	test->session = NULL;
 
-	g_free (cert_data);
-	cert_data = NULL;
-	n_cert_data = 0;
+	g_free (test->cert_data);
+	test->cert_data = NULL;
+	test->n_cert_data = 0;
 }
 
-TESTING_TEST (trust_load_objects)
+static void
+test_load_objects (Test *test, gconstpointer unused)
 {
 	CK_OBJECT_CLASS klass = CKO_NETSCAPE_TRUST;
 
@@ -151,17 +158,18 @@ TESTING_TEST (trust_load_objects)
 	CK_OBJECT_HANDLE objects[16];
 	CK_RV rv;
 
-	rv = gkm_session_C_FindObjectsInit (session, attrs, G_N_ELEMENTS (attrs));
+	rv = gkm_session_C_FindObjectsInit (test->session, attrs, G_N_ELEMENTS (attrs));
 	g_assert (rv == CKR_OK);
-	rv = gkm_session_C_FindObjects (session, objects, G_N_ELEMENTS (objects), &n_objects);
+	rv = gkm_session_C_FindObjects (test->session, objects, G_N_ELEMENTS (objects), &n_objects);
 	g_assert (rv == CKR_OK);
-	rv = gkm_session_C_FindObjectsFinal (session);
+	rv = gkm_session_C_FindObjectsFinal (test->session);
 	g_assert (rv == CKR_OK);
 
 	gkm_assert_cmpulong (n_objects, >=, 1);
 }
 
-TESTING_TEST (trust_create_assertion_complete)
+static void
+test_create_assertion_complete (Test *test, gconstpointer unused)
 {
 	CK_OBJECT_CLASS klass = CKO_X_TRUST_ASSERTION;
 	CK_X_ASSERTION_TYPE atype = CKT_X_ANCHORED_CERTIFICATE;
@@ -171,28 +179,29 @@ TESTING_TEST (trust_create_assertion_complete)
 	CK_RV rv;
 
 	CK_ATTRIBUTE attrs[] = {
-		{ CKA_X_CERTIFICATE_VALUE, cert_data, n_cert_data },
+		{ CKA_X_CERTIFICATE_VALUE, test->cert_data, test->n_cert_data },
 		{ CKA_CLASS, &klass, sizeof (klass) },
 		{ CKA_X_ASSERTION_TYPE, &atype, sizeof (atype) },
 		{ CKA_X_PURPOSE, "test-purpose", 12 },
 	};
 
-	rv = gkm_session_C_CreateObject (session, attrs, G_N_ELEMENTS (attrs), &object);
+	rv = gkm_session_C_CreateObject (test->session, attrs, G_N_ELEMENTS (attrs), &object);
 	gkm_assert_cmprv (rv, ==, CKR_OK);
 	gkm_assert_cmpulong (object, !=, 0);
 
-	rv = gkm_session_C_FindObjectsInit (session, attrs, G_N_ELEMENTS (attrs));
+	rv = gkm_session_C_FindObjectsInit (test->session, attrs, G_N_ELEMENTS (attrs));
 	gkm_assert_cmprv (rv, ==, CKR_OK);
-	rv = gkm_session_C_FindObjects (session, &check, 1, &n_objects);
+	rv = gkm_session_C_FindObjects (test->session, &check, 1, &n_objects);
 	gkm_assert_cmprv (rv, ==, CKR_OK);
-	rv = gkm_session_C_FindObjectsFinal (session);
+	rv = gkm_session_C_FindObjectsFinal (test->session);
 	gkm_assert_cmprv (rv, ==, CKR_OK);
 
 	gkm_assert_cmpulong (n_objects, ==, 1);
 	gkm_assert_cmpulong (check, ==, object);
 }
 
-TESTING_TEST (trust_complete_assertion_has_no_serial_or_issuer)
+static void
+test_complete_assertion_has_no_serial_or_issuer (Test *test, gconstpointer unused)
 {
 	CK_OBJECT_CLASS klass = CKO_X_TRUST_ASSERTION;
 	CK_X_ASSERTION_TYPE atype = CKT_X_ANCHORED_CERTIFICATE;
@@ -201,30 +210,31 @@ TESTING_TEST (trust_complete_assertion_has_no_serial_or_issuer)
 	CK_RV rv;
 
 	CK_ATTRIBUTE attrs[] = {
-		{ CKA_X_CERTIFICATE_VALUE, cert_data, n_cert_data },
+		{ CKA_X_CERTIFICATE_VALUE, test->cert_data, test->n_cert_data },
 		{ CKA_CLASS, &klass, sizeof (klass) },
 		{ CKA_X_ASSERTION_TYPE, &atype, sizeof (atype) },
 		{ CKA_X_PURPOSE, "test-purpose", 12 },
 	};
 
-	rv = gkm_session_C_CreateObject (session, attrs, G_N_ELEMENTS (attrs), &object);
+	rv = gkm_session_C_CreateObject (test->session, attrs, G_N_ELEMENTS (attrs), &object);
 	gkm_assert_cmprv (rv, ==, CKR_OK);
 	gkm_assert_cmpulong (object, !=, 0);
 
 	check.type = CKA_SERIAL_NUMBER;
 	check.pValue = NULL;
 	check.ulValueLen = 0;
-	rv = gkm_session_C_GetAttributeValue (session, object, &check, 1);
+	rv = gkm_session_C_GetAttributeValue (test->session, object, &check, 1);
 	gkm_assert_cmprv (rv, ==, CKR_ATTRIBUTE_TYPE_INVALID);
 
 	check.type = CKA_ISSUER;
 	check.pValue = NULL;
 	check.ulValueLen = 0;
-	rv = gkm_session_C_GetAttributeValue (session, object, &check, 1);
+	rv = gkm_session_C_GetAttributeValue (test->session, object, &check, 1);
 	gkm_assert_cmprv (rv, ==, CKR_ATTRIBUTE_TYPE_INVALID);
 }
 
-TESTING_TEST (trust_complete_assertion_netscape_md5_hash)
+static void
+test_complete_assertion_netscape_md5_hash (Test *test, gconstpointer unused)
 {
 	CK_OBJECT_CLASS klass = CKO_X_TRUST_ASSERTION;
 	CK_OBJECT_CLASS nklass = CKO_NETSCAPE_TRUST;
@@ -235,7 +245,7 @@ TESTING_TEST (trust_complete_assertion_netscape_md5_hash)
 	CK_RV rv;
 
 	CK_ATTRIBUTE attrs[] = {
-		{ CKA_X_CERTIFICATE_VALUE, cert_data, n_cert_data },
+		{ CKA_X_CERTIFICATE_VALUE, test->cert_data, test->n_cert_data },
 		{ CKA_CLASS, &klass, sizeof (klass) },
 		{ CKA_X_ASSERTION_TYPE, &atype, sizeof (atype) },
 		{ CKA_X_PURPOSE, "test-purpose", 12 },
@@ -246,22 +256,23 @@ TESTING_TEST (trust_complete_assertion_netscape_md5_hash)
 		{ CKA_CLASS, &nklass, sizeof (nklass) },
 	};
 
-	rv = gkm_session_C_CreateObject (session, attrs, G_N_ELEMENTS (attrs), &object);
+	rv = gkm_session_C_CreateObject (test->session, attrs, G_N_ELEMENTS (attrs), &object);
 	gkm_assert_cmprv (rv, ==, CKR_OK);
 	gkm_assert_cmpulong (object, !=, 0);
 
-	rv = gkm_session_C_FindObjectsInit (session, lookup, G_N_ELEMENTS (lookup));
+	rv = gkm_session_C_FindObjectsInit (test->session, lookup, G_N_ELEMENTS (lookup));
 	gkm_assert_cmprv (rv, ==, CKR_OK);
-	rv = gkm_session_C_FindObjects (session, &check, 1, &n_objects);
+	rv = gkm_session_C_FindObjects (test->session, &check, 1, &n_objects);
 	gkm_assert_cmprv (rv, ==, CKR_OK);
-	rv = gkm_session_C_FindObjectsFinal (session);
+	rv = gkm_session_C_FindObjectsFinal (test->session);
 	gkm_assert_cmprv (rv, ==, CKR_OK);
 
 	gkm_assert_cmpulong (check, !=, 0);
 	gkm_assert_cmpulong (n_objects, >, 0);
 }
 
-TESTING_TEST (trust_complete_assertion_netscape_sha1_hash)
+static void
+test_complete_assertion_netscape_sha1_hash (Test *test, gconstpointer unused)
 {
 	CK_OBJECT_CLASS klass = CKO_X_TRUST_ASSERTION;
 	CK_OBJECT_CLASS nklass = CKO_NETSCAPE_TRUST;
@@ -272,7 +283,7 @@ TESTING_TEST (trust_complete_assertion_netscape_sha1_hash)
 	CK_RV rv;
 
 	CK_ATTRIBUTE attrs[] = {
-		{ CKA_X_CERTIFICATE_VALUE, cert_data, n_cert_data },
+		{ CKA_X_CERTIFICATE_VALUE, test->cert_data, test->n_cert_data },
 		{ CKA_CLASS, &klass, sizeof (klass) },
 		{ CKA_X_ASSERTION_TYPE, &atype, sizeof (atype) },
 		{ CKA_X_PURPOSE, "test-purpose", 12 },
@@ -283,22 +294,23 @@ TESTING_TEST (trust_complete_assertion_netscape_sha1_hash)
 		{ CKA_CLASS, &nklass, sizeof (nklass) },
 	};
 
-	rv = gkm_session_C_CreateObject (session, attrs, G_N_ELEMENTS (attrs), &object);
+	rv = gkm_session_C_CreateObject (test->session, attrs, G_N_ELEMENTS (attrs), &object);
 	gkm_assert_cmprv (rv, ==, CKR_OK);
 	gkm_assert_cmpulong (object, !=, 0);
 
-	rv = gkm_session_C_FindObjectsInit (session, lookup, G_N_ELEMENTS (lookup));
+	rv = gkm_session_C_FindObjectsInit (test->session, lookup, G_N_ELEMENTS (lookup));
 	gkm_assert_cmprv (rv, ==, CKR_OK);
-	rv = gkm_session_C_FindObjects (session, &check, 1, &n_objects);
+	rv = gkm_session_C_FindObjects (test->session, &check, 1, &n_objects);
 	gkm_assert_cmprv (rv, ==, CKR_OK);
-	rv = gkm_session_C_FindObjectsFinal (session);
+	rv = gkm_session_C_FindObjectsFinal (test->session);
 	gkm_assert_cmprv (rv, ==, CKR_OK);
 
 	gkm_assert_cmpulong (check, !=, 0);
 	gkm_assert_cmpulong (n_objects, >, 0);
 }
 
-TESTING_TEST (trust_create_assertion_missing_type)
+static void
+test_create_assertion_missing_type (Test *test, gconstpointer unused)
 {
 	CK_OBJECT_CLASS klass = CKO_X_TRUST_ASSERTION;
 	CK_OBJECT_HANDLE object = 0;
@@ -306,16 +318,17 @@ TESTING_TEST (trust_create_assertion_missing_type)
 
 	/* Missing CKT_X_ANCHORED_CERTIFICATE */
 	CK_ATTRIBUTE attrs[] = {
-		{ CKA_X_CERTIFICATE_VALUE, cert_data, n_cert_data },
+		{ CKA_X_CERTIFICATE_VALUE, test->cert_data, test->n_cert_data },
 		{ CKA_CLASS, &klass, sizeof (klass) },
 		{ CKA_X_PURPOSE, "test-purpose", 12 },
 	};
 
-	rv = gkm_session_C_CreateObject (session, attrs, G_N_ELEMENTS (attrs), &object);
+	rv = gkm_session_C_CreateObject (test->session, attrs, G_N_ELEMENTS (attrs), &object);
 	gkm_assert_cmprv (rv, ==, CKR_TEMPLATE_INCOMPLETE);
 }
 
-TESTING_TEST (trust_create_assertion_bad_type)
+static void
+test_create_assertion_bad_type (Test *test, gconstpointer unused)
 {
 	CK_OBJECT_CLASS klass = CKO_X_TRUST_ASSERTION;
 	CK_X_ASSERTION_TYPE atype = 0xFFFF;
@@ -329,11 +342,12 @@ TESTING_TEST (trust_create_assertion_bad_type)
 		{ CKA_X_PURPOSE, "test-purpose", 12 },
 	};
 
-	rv = gkm_session_C_CreateObject (session, attrs, G_N_ELEMENTS (attrs), &object);
+	rv = gkm_session_C_CreateObject (test->session, attrs, G_N_ELEMENTS (attrs), &object);
 	gkm_assert_cmprv (rv, ==, CKR_TEMPLATE_INCONSISTENT);
 }
 
-TESTING_TEST (trust_create_assertion_missing_cert_value)
+static void
+test_create_assertion_missing_cert_value (Test *test, gconstpointer unused)
 {
 	CK_OBJECT_CLASS klass = CKO_X_TRUST_ASSERTION;
 	CK_X_ASSERTION_TYPE atype = CKT_X_ANCHORED_CERTIFICATE;
@@ -347,11 +361,12 @@ TESTING_TEST (trust_create_assertion_missing_cert_value)
 		{ CKA_X_PURPOSE, "test-purpose", 12 },
 	};
 
-	rv = gkm_session_C_CreateObject (session, attrs, G_N_ELEMENTS (attrs), &object);
+	rv = gkm_session_C_CreateObject (test->session, attrs, G_N_ELEMENTS (attrs), &object);
 	gkm_assert_cmprv (rv, ==, CKR_TEMPLATE_INCOMPLETE);
 }
 
-TESTING_TEST (trust_create_assertion_bad_cert_value)
+static void
+test_create_assertion_bad_cert_value (Test *test, gconstpointer unused)
 {
 	CK_OBJECT_CLASS klass = CKO_X_TRUST_ASSERTION;
 	CK_X_ASSERTION_TYPE atype = CKT_X_ANCHORED_CERTIFICATE;
@@ -366,11 +381,12 @@ TESTING_TEST (trust_create_assertion_bad_cert_value)
 		{ CKA_X_PURPOSE, "test-purpose", 12 },
 	};
 
-	rv = gkm_session_C_CreateObject (session, attrs, G_N_ELEMENTS (attrs), &object);
+	rv = gkm_session_C_CreateObject (test->session, attrs, G_N_ELEMENTS (attrs), &object);
 	gkm_assert_cmprv (rv, ==, CKR_ATTRIBUTE_VALUE_INVALID);
 }
 
-TESTING_TEST (trust_create_assertion_null_cert_value)
+static void
+test_create_assertion_null_cert_value (Test *test, gconstpointer unused)
 {
 	CK_OBJECT_CLASS klass = CKO_X_TRUST_ASSERTION;
 	CK_X_ASSERTION_TYPE atype = CKT_X_ANCHORED_CERTIFICATE;
@@ -385,11 +401,12 @@ TESTING_TEST (trust_create_assertion_null_cert_value)
 		{ CKA_X_PURPOSE, "test-purpose", 12 },
 	};
 
-	rv = gkm_session_C_CreateObject (session, attrs, G_N_ELEMENTS (attrs), &object);
+	rv = gkm_session_C_CreateObject (test->session, attrs, G_N_ELEMENTS (attrs), &object);
 	gkm_assert_cmprv (rv, ==, CKR_ATTRIBUTE_VALUE_INVALID);
 }
 
-TESTING_TEST (trust_create_assertion_for_distrusted)
+static void
+test_create_assertion_for_distrusted (Test *test, gconstpointer unused)
 {
 	CK_OBJECT_CLASS klass = CKO_X_TRUST_ASSERTION;
 	CK_X_ASSERTION_TYPE atype = CKT_X_DISTRUSTED_CERTIFICATE;
@@ -406,22 +423,23 @@ TESTING_TEST (trust_create_assertion_for_distrusted)
 		{ CKA_ISSUER, (void*)DER_ISSUER, XL (DER_ISSUER) }
 	};
 
-	rv = gkm_session_C_CreateObject (session, attrs, G_N_ELEMENTS (attrs), &object);
+	rv = gkm_session_C_CreateObject (test->session, attrs, G_N_ELEMENTS (attrs), &object);
 	gkm_assert_cmprv (rv, ==, CKR_OK);
 	gkm_assert_cmpulong (object, !=, 0);
 
-	rv = gkm_session_C_FindObjectsInit (session, attrs, G_N_ELEMENTS (attrs));
+	rv = gkm_session_C_FindObjectsInit (test->session, attrs, G_N_ELEMENTS (attrs));
 	gkm_assert_cmprv (rv, ==, CKR_OK);
-	rv = gkm_session_C_FindObjects (session, &check, 1, &n_objects);
+	rv = gkm_session_C_FindObjects (test->session, &check, 1, &n_objects);
 	gkm_assert_cmprv (rv, ==, CKR_OK);
-	rv = gkm_session_C_FindObjectsFinal (session);
+	rv = gkm_session_C_FindObjectsFinal (test->session);
 	gkm_assert_cmprv (rv, ==, CKR_OK);
 
 	gkm_assert_cmpulong (n_objects, ==, 1);
 	gkm_assert_cmpulong (check, ==, object);
 }
 
-TESTING_TEST (trust_create_assertion_for_distrusted_no_purpose)
+static void
+test_create_assertion_for_distrusted_no_purpose (Test *test, gconstpointer unused)
 {
 	CK_OBJECT_CLASS klass = CKO_X_TRUST_ASSERTION;
 	CK_X_ASSERTION_TYPE atype = CKT_X_DISTRUSTED_CERTIFICATE;
@@ -435,11 +453,12 @@ TESTING_TEST (trust_create_assertion_for_distrusted_no_purpose)
 		{ CKA_ISSUER, (void*)DER_ISSUER, XL (DER_ISSUER) }
 	};
 
-	rv = gkm_session_C_CreateObject (session, attrs, G_N_ELEMENTS (attrs), &object);
+	rv = gkm_session_C_CreateObject (test->session, attrs, G_N_ELEMENTS (attrs), &object);
 	gkm_assert_cmprv (rv, ==, CKR_TEMPLATE_INCOMPLETE);
 }
 
-TESTING_TEST (trust_create_assertion_for_distrusted_no_serial)
+static void
+test_create_assertion_for_distrusted_no_serial (Test *test, gconstpointer unused)
 {
 	CK_OBJECT_CLASS klass = CKO_X_TRUST_ASSERTION;
 	CK_X_ASSERTION_TYPE atype = CKT_X_DISTRUSTED_CERTIFICATE;
@@ -453,11 +472,12 @@ TESTING_TEST (trust_create_assertion_for_distrusted_no_serial)
 		{ CKA_ISSUER, (void*)DER_ISSUER, XL (DER_ISSUER) }
 	};
 
-	rv = gkm_session_C_CreateObject (session, attrs, G_N_ELEMENTS (attrs), &object);
+	rv = gkm_session_C_CreateObject (test->session, attrs, G_N_ELEMENTS (attrs), &object);
 	gkm_assert_cmprv (rv, ==, CKR_TEMPLATE_INCOMPLETE);
 }
 
-TESTING_TEST (trust_create_assertion_twice)
+static void
+test_create_assertion_twice (Test *test, gconstpointer unused)
 {
 	CK_OBJECT_CLASS klass = CKO_X_TRUST_ASSERTION;
 	CK_X_ASSERTION_TYPE atype = CKT_X_DISTRUSTED_CERTIFICATE;
@@ -475,22 +495,23 @@ TESTING_TEST (trust_create_assertion_twice)
 
 	/* First object should go away when we create an overlapping assertion */
 
-	rv = gkm_session_C_CreateObject (session, attrs, G_N_ELEMENTS (attrs), &object_1);
+	rv = gkm_session_C_CreateObject (test->session, attrs, G_N_ELEMENTS (attrs), &object_1);
 	gkm_assert_cmprv (rv, ==, CKR_OK);
 	gkm_assert_cmpulong (object_1, !=, 0);
 
-	rv = gkm_session_C_CreateObject (session, attrs, G_N_ELEMENTS (attrs), &object_2);
+	rv = gkm_session_C_CreateObject (test->session, attrs, G_N_ELEMENTS (attrs), &object_2);
 	gkm_assert_cmprv (rv, ==, CKR_OK);
 	gkm_assert_cmpulong (object_2, !=, 0);
 
 	gkm_assert_cmpulong (object_1, !=, object_2);
 
 	/* First object no longer exists */
-	rv = gkm_session_C_DestroyObject (session, object_1);
+	rv = gkm_session_C_DestroyObject (test->session, object_1);
 	gkm_assert_cmprv (rv, ==, CKR_OBJECT_HANDLE_INVALID);
 }
 
-TESTING_TEST (trust_distrusted_assertion_has_no_cert_value)
+static void
+test_distrusted_assertion_has_no_cert_value (Test *test, gconstpointer unused)
 {
 	CK_OBJECT_CLASS klass = CKO_X_TRUST_ASSERTION;
 	CK_X_ASSERTION_TYPE atype = CKT_X_DISTRUSTED_CERTIFICATE;
@@ -508,18 +529,19 @@ TESTING_TEST (trust_distrusted_assertion_has_no_cert_value)
 
 	/* Created as distrusted, should have no CKA_X_CERTIFICATE_VALUE */
 
-	rv = gkm_session_C_CreateObject (session, attrs, G_N_ELEMENTS (attrs), &object);
+	rv = gkm_session_C_CreateObject (test->session, attrs, G_N_ELEMENTS (attrs), &object);
 	gkm_assert_cmprv (rv, ==, CKR_OK);
 	gkm_assert_cmpulong (object, !=, 0);
 
 	check.type = CKA_X_CERTIFICATE_VALUE;
 	check.pValue = NULL;
 	check.ulValueLen = 0;
-	rv = gkm_session_C_GetAttributeValue (session, object, &check, 1);
+	rv = gkm_session_C_GetAttributeValue (test->session, object, &check, 1);
 	gkm_assert_cmprv (rv, ==, CKR_ATTRIBUTE_TYPE_INVALID);
 }
 
-TESTING_TEST (trust_create_assertion_complete_on_token)
+static void
+test_create_assertion_complete_on_token (Test *test, gconstpointer unused)
 {
 	CK_OBJECT_CLASS klass = CKO_X_TRUST_ASSERTION;
 	CK_X_ASSERTION_TYPE atype = CKT_X_PINNED_CERTIFICATE;
@@ -531,26 +553,26 @@ TESTING_TEST (trust_create_assertion_complete_on_token)
 	CK_RV rv;
 
 	CK_ATTRIBUTE attrs[] = {
-		{ CKA_X_CERTIFICATE_VALUE, cert_data, n_cert_data },
+		{ CKA_X_CERTIFICATE_VALUE, test->cert_data, test->n_cert_data },
 		{ CKA_CLASS, &klass, sizeof (klass) },
 		{ CKA_X_ASSERTION_TYPE, &atype, sizeof (atype) },
 		{ CKA_X_PURPOSE, "other", 5 },
 		{ CKA_TOKEN, &token, sizeof (token) },
 	};
 
-	rv = gkm_session_C_CreateObject (session, attrs, G_N_ELEMENTS (attrs), &object);
+	rv = gkm_session_C_CreateObject (test->session, attrs, G_N_ELEMENTS (attrs), &object);
 	gkm_assert_cmprv (rv, ==, CKR_OK);
 	gkm_assert_cmpulong (object, !=, 0);
 
-	rv = gkm_session_C_CreateObject (session, attrs, G_N_ELEMENTS (attrs), &check);
+	rv = gkm_session_C_CreateObject (test->session, attrs, G_N_ELEMENTS (attrs), &check);
 	gkm_assert_cmprv (rv, ==, CKR_OK);
 	gkm_assert_cmpulong (check, !=, 0);
 
-	rv = gkm_session_C_FindObjectsInit (session, attrs, G_N_ELEMENTS (attrs));
+	rv = gkm_session_C_FindObjectsInit (test->session, attrs, G_N_ELEMENTS (attrs));
 	gkm_assert_cmprv (rv, ==, CKR_OK);
-	rv = gkm_session_C_FindObjects (session, results, G_N_ELEMENTS (results), &n_objects);
+	rv = gkm_session_C_FindObjects (test->session, results, G_N_ELEMENTS (results), &n_objects);
 	gkm_assert_cmprv (rv, ==, CKR_OK);
-	rv = gkm_session_C_FindObjectsFinal (session);
+	rv = gkm_session_C_FindObjectsFinal (test->session);
 	gkm_assert_cmprv (rv, ==, CKR_OK);
 
 	/* Second should have overwritten the first */
@@ -558,7 +580,8 @@ TESTING_TEST (trust_create_assertion_complete_on_token)
 	gkm_assert_cmpulong (results[0], ==, check);
 }
 
-TESTING_TEST (trust_destroy_assertion_on_token)
+static void
+test_destroy_assertion_on_token (Test *test, gconstpointer unused)
 {
 	CK_X_ASSERTION_TYPE atype = CKT_X_PINNED_CERTIFICATE;
 	CK_OBJECT_HANDLE results[8];
@@ -571,30 +594,30 @@ TESTING_TEST (trust_destroy_assertion_on_token)
 		{ CKA_TOKEN, &token, sizeof (token) },
 	};
 
-	rv = gkm_session_C_FindObjectsInit (session, attrs, G_N_ELEMENTS (attrs));
+	rv = gkm_session_C_FindObjectsInit (test->session, attrs, G_N_ELEMENTS (attrs));
 	gkm_assert_cmprv (rv, ==, CKR_OK);
-	rv = gkm_session_C_FindObjects (session, results, G_N_ELEMENTS (results), &n_objects);
+	rv = gkm_session_C_FindObjects (test->session, results, G_N_ELEMENTS (results), &n_objects);
 	gkm_assert_cmprv (rv, ==, CKR_OK);
-	rv = gkm_session_C_FindObjectsFinal (session);
+	rv = gkm_session_C_FindObjectsFinal (test->session);
 	gkm_assert_cmprv (rv, ==, CKR_OK);
 
 	gkm_assert_cmpulong (n_objects, ==, 1);
 
-	rv = gkm_session_C_DestroyObject (session, results[0]);
+	rv = gkm_session_C_DestroyObject (test->session, results[0]);
 	gkm_assert_cmprv (rv, ==, CKR_OK);
 
-	rv = gkm_session_C_FindObjectsInit (session, attrs, G_N_ELEMENTS (attrs));
+	rv = gkm_session_C_FindObjectsInit (test->session, attrs, G_N_ELEMENTS (attrs));
 	gkm_assert_cmprv (rv, ==, CKR_OK);
-	rv = gkm_session_C_FindObjects (session, results, G_N_ELEMENTS (results), &n_objects);
+	rv = gkm_session_C_FindObjects (test->session, results, G_N_ELEMENTS (results), &n_objects);
 	gkm_assert_cmprv (rv, ==, CKR_OK);
-	rv = gkm_session_C_FindObjectsFinal (session);
+	rv = gkm_session_C_FindObjectsFinal (test->session);
 	gkm_assert_cmprv (rv, ==, CKR_OK);
 
 	gkm_assert_cmpulong (n_objects, ==, 0);
 }
 
 static void
-_assert_positive_netscape (CK_X_ASSERTION_TYPE assertion_type, const gchar *purpose,
+_assert_positive_netscape (Test *test, CK_X_ASSERTION_TYPE assertion_type, const gchar *purpose,
                            CK_ATTRIBUTE_TYPE netscape_type, CK_TRUST netscape_trust,
                            const gchar *description)
 {
@@ -612,7 +635,7 @@ _assert_positive_netscape (CK_X_ASSERTION_TYPE assertion_type, const gchar *purp
 	CK_RV rv;
 
 	CK_ATTRIBUTE attrs[] = {
-		{ CKA_X_CERTIFICATE_VALUE, cert_data, n_cert_data },
+		{ CKA_X_CERTIFICATE_VALUE, test->cert_data, test->n_cert_data },
 		{ CKA_CLASS, &aklass, sizeof (aklass) },
 		{ CKA_X_ASSERTION_TYPE, &assertion_type, sizeof (assertion_type) },
 		{ CKA_X_PURPOSE, (void*)purpose, strlen (purpose) },
@@ -625,21 +648,21 @@ _assert_positive_netscape (CK_X_ASSERTION_TYPE assertion_type, const gchar *purp
 		{ CKA_CERT_SHA1_HASH, checksum, sizeof (checksum) },
 	};
 
-	rv = gkm_session_C_CreateObject (session, attrs, G_N_ELEMENTS (attrs), &object);
+	rv = gkm_session_C_CreateObject (test->session, attrs, G_N_ELEMENTS (attrs), &object);
 	gkm_assert_cmprv (rv, ==, CKR_OK);
 	gkm_assert_cmpulong (object, !=, 0);
 
 	md = g_checksum_new (G_CHECKSUM_SHA1);
-	g_checksum_update (md, cert_data, n_cert_data);
+	g_checksum_update (md, (guchar*)test->cert_data, test->n_cert_data);
 	n_checksum = sizeof (checksum);
 	g_checksum_get_digest (md, checksum, &n_checksum);
 	g_assert (n_checksum == sizeof (checksum));
 
-	rv = gkm_session_C_FindObjectsInit (session, lookup, G_N_ELEMENTS (lookup));
+	rv = gkm_session_C_FindObjectsInit (test->session, lookup, G_N_ELEMENTS (lookup));
 	gkm_assert_cmprv (rv, ==, CKR_OK);
-	rv = gkm_session_C_FindObjects (session, results, G_N_ELEMENTS (results), &n_results);
+	rv = gkm_session_C_FindObjects (test->session, results, G_N_ELEMENTS (results), &n_results);
 	gkm_assert_cmprv (rv, ==, CKR_OK);
-	rv = gkm_session_C_FindObjectsFinal (session);
+	rv = gkm_session_C_FindObjectsFinal (test->session);
 	gkm_assert_cmprv (rv, ==, CKR_OK);
 
 	gkm_assert_cmpulong (n_results, ==, 1);
@@ -649,7 +672,7 @@ _assert_positive_netscape (CK_X_ASSERTION_TYPE assertion_type, const gchar *purp
 	attr.pValue = &check;
 	attr.ulValueLen = sizeof (check);
 
-	rv = gkm_session_C_GetAttributeValue (session, results[0], &attr, 1);
+	rv = gkm_session_C_GetAttributeValue (test->session, results[0], &attr, 1);
 	gkm_assert_cmprv (rv, ==, CKR_OK);
 
 	if (check != netscape_trust)
@@ -658,7 +681,7 @@ _assert_positive_netscape (CK_X_ASSERTION_TYPE assertion_type, const gchar *purp
 }
 
 static void
-_assert_negative_netscape (CK_X_ASSERTION_TYPE assertion_type, const gchar *purpose,
+_assert_negative_netscape (Test *test, CK_X_ASSERTION_TYPE assertion_type, const gchar *purpose,
                            CK_ATTRIBUTE_TYPE netscape_type, CK_TRUST netscape_trust,
                            const gchar *description)
 {
@@ -688,15 +711,15 @@ _assert_negative_netscape (CK_X_ASSERTION_TYPE assertion_type, const gchar *purp
 		{ CKA_ISSUER, (void*)DER_ISSUER, XL (DER_ISSUER) },
 	};
 
-	rv = gkm_session_C_CreateObject (session, attrs, G_N_ELEMENTS (attrs), &object);
+	rv = gkm_session_C_CreateObject (test->session, attrs, G_N_ELEMENTS (attrs), &object);
 	gkm_assert_cmprv (rv, ==, CKR_OK);
 	gkm_assert_cmpulong (object, !=, 0);
 
-	rv = gkm_session_C_FindObjectsInit (session, lookup, G_N_ELEMENTS (lookup));
+	rv = gkm_session_C_FindObjectsInit (test->session, lookup, G_N_ELEMENTS (lookup));
 	gkm_assert_cmprv (rv, ==, CKR_OK);
-	rv = gkm_session_C_FindObjects (session, results, G_N_ELEMENTS (results), &n_results);
+	rv = gkm_session_C_FindObjects (test->session, results, G_N_ELEMENTS (results), &n_results);
 	gkm_assert_cmprv (rv, ==, CKR_OK);
-	rv = gkm_session_C_FindObjectsFinal (session);
+	rv = gkm_session_C_FindObjectsFinal (test->session);
 	gkm_assert_cmprv (rv, ==, CKR_OK);
 
 	gkm_assert_cmpulong (n_results, ==, 1);
@@ -706,7 +729,7 @@ _assert_negative_netscape (CK_X_ASSERTION_TYPE assertion_type, const gchar *purp
 	attr.pValue = &check;
 	attr.ulValueLen = sizeof (check);
 
-	rv = gkm_session_C_GetAttributeValue (session, results[0], &attr, 1);
+	rv = gkm_session_C_GetAttributeValue (test->session, results[0], &attr, 1);
 	gkm_assert_cmprv (rv, ==, CKR_OK);
 
 	if (check != netscape_trust)
@@ -715,87 +738,142 @@ _assert_negative_netscape (CK_X_ASSERTION_TYPE assertion_type, const gchar *purp
 }
 
 /* Some macros for intelligent failure messages */
-#define assert_positive_netscape(a, b, c, d) \
-	_assert_positive_netscape (a, b, c, d, #a ", " #b ", " #c ", " #d)
-#define assert_negative_netscape(a, b, c, d) \
-	_assert_negative_netscape (a, b, c, d, #a ", " #b ", " #c ", " #d)
+#define assert_positive_netscape(test, a, b, c, d) \
+	_assert_positive_netscape (test, a, b, c, d, #a ", " #b ", " #c ", " #d)
+#define assert_negative_netscape(test, a, b, c, d) \
+	_assert_negative_netscape (test, a, b, c, d, #a ", " #b ", " #c ", " #d)
 
-TESTING_TEST (trust_netscape_map_server_auth)
+static void
+test_netscape_map_server_auth (Test *test, gconstpointer unused)
 {
-	assert_positive_netscape (CKT_X_PINNED_CERTIFICATE, "1.3.6.1.5.5.7.3.1",
+	assert_positive_netscape (test, CKT_X_PINNED_CERTIFICATE, "1.3.6.1.5.5.7.3.1",
 	                          CKA_TRUST_SERVER_AUTH, CKT_NETSCAPE_TRUSTED);
-	assert_positive_netscape (CKT_X_ANCHORED_CERTIFICATE, "1.3.6.1.5.5.7.3.1",
+	assert_positive_netscape (test, CKT_X_ANCHORED_CERTIFICATE, "1.3.6.1.5.5.7.3.1",
 	                          CKA_TRUST_SERVER_AUTH, CKT_NETSCAPE_TRUSTED_DELEGATOR);
-	assert_negative_netscape (CKT_X_DISTRUSTED_CERTIFICATE, "1.3.6.1.5.5.7.3.1",
+	assert_negative_netscape (test, CKT_X_DISTRUSTED_CERTIFICATE, "1.3.6.1.5.5.7.3.1",
 	                          CKA_TRUST_SERVER_AUTH, CKT_NETSCAPE_UNTRUSTED);
 }
 
-TESTING_TEST (trust_netscape_map_client_auth)
+static void
+test_netscape_map_client_auth (Test *test, gconstpointer unused)
 {
-	assert_positive_netscape (CKT_X_PINNED_CERTIFICATE, "1.3.6.1.5.5.7.3.2",
+	assert_positive_netscape (test, CKT_X_PINNED_CERTIFICATE, "1.3.6.1.5.5.7.3.2",
 	                          CKA_TRUST_CLIENT_AUTH, CKT_NETSCAPE_TRUSTED);
-	assert_positive_netscape (CKT_X_ANCHORED_CERTIFICATE, "1.3.6.1.5.5.7.3.2",
+	assert_positive_netscape (test, CKT_X_ANCHORED_CERTIFICATE, "1.3.6.1.5.5.7.3.2",
 	                          CKA_TRUST_CLIENT_AUTH, CKT_NETSCAPE_TRUSTED_DELEGATOR);
-	assert_negative_netscape (CKT_X_DISTRUSTED_CERTIFICATE, "1.3.6.1.5.5.7.3.2",
+	assert_negative_netscape (test, CKT_X_DISTRUSTED_CERTIFICATE, "1.3.6.1.5.5.7.3.2",
 	                          CKA_TRUST_CLIENT_AUTH, CKT_NETSCAPE_UNTRUSTED);
 }
 
-TESTING_TEST (trust_netscape_map_code_signing)
+static void
+test_netscape_map_code_signing (Test *test, gconstpointer unused)
 {
-	assert_positive_netscape (CKT_X_PINNED_CERTIFICATE, "1.3.6.1.5.5.7.3.3",
+	assert_positive_netscape (test, CKT_X_PINNED_CERTIFICATE, "1.3.6.1.5.5.7.3.3",
 	                          CKA_TRUST_CODE_SIGNING, CKT_NETSCAPE_TRUSTED);
-	assert_positive_netscape (CKT_X_ANCHORED_CERTIFICATE, "1.3.6.1.5.5.7.3.3",
+	assert_positive_netscape (test, CKT_X_ANCHORED_CERTIFICATE, "1.3.6.1.5.5.7.3.3",
 	                          CKA_TRUST_CODE_SIGNING, CKT_NETSCAPE_TRUSTED_DELEGATOR);
-	assert_negative_netscape (CKT_X_DISTRUSTED_CERTIFICATE, "1.3.6.1.5.5.7.3.3",
+	assert_negative_netscape (test, CKT_X_DISTRUSTED_CERTIFICATE, "1.3.6.1.5.5.7.3.3",
 	                          CKA_TRUST_CODE_SIGNING, CKT_NETSCAPE_UNTRUSTED);
 }
 
-TESTING_TEST (trust_netscape_map_email)
+static void
+test_netscape_map_email (Test *test, gconstpointer unused)
 {
-	assert_positive_netscape (CKT_X_PINNED_CERTIFICATE, "1.3.6.1.5.5.7.3.4",
+	assert_positive_netscape (test, CKT_X_PINNED_CERTIFICATE, "1.3.6.1.5.5.7.3.4",
 	                          CKA_TRUST_EMAIL_PROTECTION, CKT_NETSCAPE_TRUSTED);
-	assert_positive_netscape (CKT_X_ANCHORED_CERTIFICATE, "1.3.6.1.5.5.7.3.4",
+	assert_positive_netscape (test, CKT_X_ANCHORED_CERTIFICATE, "1.3.6.1.5.5.7.3.4",
 	                          CKA_TRUST_EMAIL_PROTECTION, CKT_NETSCAPE_TRUSTED_DELEGATOR);
-	assert_negative_netscape (CKT_X_DISTRUSTED_CERTIFICATE, "1.3.6.1.5.5.7.3.4",
+	assert_negative_netscape (test, CKT_X_DISTRUSTED_CERTIFICATE, "1.3.6.1.5.5.7.3.4",
 	                          CKA_TRUST_EMAIL_PROTECTION, CKT_NETSCAPE_UNTRUSTED);
 }
 
-TESTING_TEST (trust_netscape_map_ipsec_endpoint)
+static void
+test_netscape_map_ipsec_endpoint (Test *test, gconstpointer unused)
 {
-	assert_positive_netscape (CKT_X_PINNED_CERTIFICATE, "1.3.6.1.5.5.7.3.5",
+	assert_positive_netscape (test, CKT_X_PINNED_CERTIFICATE, "1.3.6.1.5.5.7.3.5",
 	                          CKA_TRUST_IPSEC_END_SYSTEM, CKT_NETSCAPE_TRUSTED);
-	assert_positive_netscape (CKT_X_ANCHORED_CERTIFICATE, "1.3.6.1.5.5.7.3.5",
+	assert_positive_netscape (test, CKT_X_ANCHORED_CERTIFICATE, "1.3.6.1.5.5.7.3.5",
 	                          CKA_TRUST_IPSEC_END_SYSTEM, CKT_NETSCAPE_TRUSTED_DELEGATOR);
-	assert_negative_netscape (CKT_X_DISTRUSTED_CERTIFICATE, "1.3.6.1.5.5.7.3.5",
+	assert_negative_netscape (test, CKT_X_DISTRUSTED_CERTIFICATE, "1.3.6.1.5.5.7.3.5",
 	                          CKA_TRUST_IPSEC_END_SYSTEM, CKT_NETSCAPE_UNTRUSTED);
 }
 
-TESTING_TEST (trust_netscape_map_ipsec_tunnel)
+static void
+test_netscape_map_ipsec_tunnel (Test *test, gconstpointer unused)
 {
-	assert_positive_netscape (CKT_X_PINNED_CERTIFICATE, "1.3.6.1.5.5.7.3.6",
+	assert_positive_netscape (test, CKT_X_PINNED_CERTIFICATE, "1.3.6.1.5.5.7.3.6",
 	                          CKA_TRUST_IPSEC_TUNNEL, CKT_NETSCAPE_TRUSTED);
-	assert_positive_netscape (CKT_X_ANCHORED_CERTIFICATE, "1.3.6.1.5.5.7.3.6",
+	assert_positive_netscape (test, CKT_X_ANCHORED_CERTIFICATE, "1.3.6.1.5.5.7.3.6",
 	                          CKA_TRUST_IPSEC_TUNNEL, CKT_NETSCAPE_TRUSTED_DELEGATOR);
-	assert_negative_netscape (CKT_X_DISTRUSTED_CERTIFICATE, "1.3.6.1.5.5.7.3.6",
+	assert_negative_netscape (test, CKT_X_DISTRUSTED_CERTIFICATE, "1.3.6.1.5.5.7.3.6",
 	                          CKA_TRUST_IPSEC_TUNNEL, CKT_NETSCAPE_UNTRUSTED);
 }
 
-TESTING_TEST (trust_netscape_map_ipsec_user)
+static void
+test_netscape_map_ipsec_user (Test *test, gconstpointer unused)
 {
-	assert_positive_netscape (CKT_X_PINNED_CERTIFICATE, "1.3.6.1.5.5.7.3.7",
+	assert_positive_netscape (test, CKT_X_PINNED_CERTIFICATE, "1.3.6.1.5.5.7.3.7",
 	                          CKA_TRUST_IPSEC_USER, CKT_NETSCAPE_TRUSTED);
-	assert_positive_netscape (CKT_X_ANCHORED_CERTIFICATE, "1.3.6.1.5.5.7.3.7",
+	assert_positive_netscape (test, CKT_X_ANCHORED_CERTIFICATE, "1.3.6.1.5.5.7.3.7",
 	                          CKA_TRUST_IPSEC_USER, CKT_NETSCAPE_TRUSTED_DELEGATOR);
-	assert_negative_netscape (CKT_X_DISTRUSTED_CERTIFICATE, "1.3.6.1.5.5.7.3.7",
+	assert_negative_netscape (test, CKT_X_DISTRUSTED_CERTIFICATE, "1.3.6.1.5.5.7.3.7",
 	                          CKA_TRUST_IPSEC_USER, CKT_NETSCAPE_UNTRUSTED);
 }
 
-TESTING_TEST (trust_netscape_map_time_stamping)
+static void
+test_netscape_map_time_stamping (Test *test, gconstpointer unused)
 {
-	assert_positive_netscape (CKT_X_PINNED_CERTIFICATE, "1.3.6.1.5.5.7.3.8",
+	assert_positive_netscape (test, CKT_X_PINNED_CERTIFICATE, "1.3.6.1.5.5.7.3.8",
 	                          CKA_TRUST_TIME_STAMPING, CKT_NETSCAPE_TRUSTED);
-	assert_positive_netscape (CKT_X_ANCHORED_CERTIFICATE, "1.3.6.1.5.5.7.3.8",
+	assert_positive_netscape (test, CKT_X_ANCHORED_CERTIFICATE, "1.3.6.1.5.5.7.3.8",
 	                          CKA_TRUST_TIME_STAMPING, CKT_NETSCAPE_TRUSTED_DELEGATOR);
-	assert_negative_netscape (CKT_X_DISTRUSTED_CERTIFICATE, "1.3.6.1.5.5.7.3.8",
+	assert_negative_netscape (test, CKT_X_DISTRUSTED_CERTIFICATE, "1.3.6.1.5.5.7.3.8",
 	                          CKA_TRUST_TIME_STAMPING, CKT_NETSCAPE_UNTRUSTED);
 }
+
+
+static void
+null_log_handler (const gchar *log_domain, GLogLevelFlags log_level,
+                  const gchar *message, gpointer user_data)
+{
+
+}
+
+int
+main (int argc, char **argv)
+{
+	g_type_init ();
+	g_test_init (&argc, &argv, NULL);
+
+	/* Suppress these messages in tests */
+	g_log_set_handler (G_LOG_DOMAIN, G_LOG_LEVEL_MESSAGE | G_LOG_LEVEL_INFO | G_LOG_LEVEL_DEBUG,
+	                   null_log_handler, NULL);
+
+	g_test_add ("/xdg-store/trust/load_objects", Test, NULL, setup, test_load_objects, teardown);
+	g_test_add ("/xdg-store/trust/create_assertion_complete", Test, NULL, setup, test_create_assertion_complete, teardown);
+	g_test_add ("/xdg-store/trust/complete_assertion_has_no_serial_or_issuer", Test, NULL, setup, test_complete_assertion_has_no_serial_or_issuer, teardown);
+	g_test_add ("/xdg-store/trust/complete_assertion_netscape_md5_hash", Test, NULL, setup, test_complete_assertion_netscape_md5_hash, teardown);
+	g_test_add ("/xdg-store/trust/complete_assertion_netscape_sha1_hash", Test, NULL, setup, test_complete_assertion_netscape_sha1_hash, teardown);
+	g_test_add ("/xdg-store/trust/create_assertion_missing_type", Test, NULL, setup, test_create_assertion_missing_type, teardown);
+	g_test_add ("/xdg-store/trust/create_assertion_bad_type", Test, NULL, setup, test_create_assertion_bad_type, teardown);
+	g_test_add ("/xdg-store/trust/create_assertion_missing_cert_value", Test, NULL, setup, test_create_assertion_missing_cert_value, teardown);
+	g_test_add ("/xdg-store/trust/create_assertion_bad_cert_value", Test, NULL, setup, test_create_assertion_bad_cert_value, teardown);
+	g_test_add ("/xdg-store/trust/create_assertion_null_cert_value", Test, NULL, setup, test_create_assertion_null_cert_value, teardown);
+	g_test_add ("/xdg-store/trust/create_assertion_for_distrusted", Test, NULL, setup, test_create_assertion_for_distrusted, teardown);
+	g_test_add ("/xdg-store/trust/create_assertion_for_distrusted_no_purpose", Test, NULL, setup, test_create_assertion_for_distrusted_no_purpose, teardown);
+	g_test_add ("/xdg-store/trust/create_assertion_for_distrusted_no_serial", Test, NULL, setup, test_create_assertion_for_distrusted_no_serial, teardown);
+	g_test_add ("/xdg-store/trust/create_assertion_twice", Test, NULL, setup, test_create_assertion_twice, teardown);
+	g_test_add ("/xdg-store/trust/distrusted_assertion_has_no_cert_value", Test, NULL, setup, test_distrusted_assertion_has_no_cert_value, teardown);
+	g_test_add ("/xdg-store/trust/create_assertion_complete_on_token", Test, NULL, setup, test_create_assertion_complete_on_token, teardown);
+	g_test_add ("/xdg-store/trust/destroy_assertion_on_token", Test, NULL, setup, test_destroy_assertion_on_token, teardown);
+	g_test_add ("/xdg-store/trust/netscape_map_server_auth", Test, NULL, setup, test_netscape_map_server_auth, teardown);
+	g_test_add ("/xdg-store/trust/netscape_map_client_auth", Test, NULL, setup, test_netscape_map_client_auth, teardown);
+	g_test_add ("/xdg-store/trust/netscape_map_code_signing", Test, NULL, setup, test_netscape_map_code_signing, teardown);
+	g_test_add ("/xdg-store/trust/netscape_map_email", Test, NULL, setup, test_netscape_map_email, teardown);
+	g_test_add ("/xdg-store/trust/netscape_map_ipsec_endpoint", Test, NULL, setup, test_netscape_map_ipsec_endpoint, teardown);
+	g_test_add ("/xdg-store/trust/netscape_map_ipsec_tunnel", Test, NULL, setup, test_netscape_map_ipsec_tunnel, teardown);
+	g_test_add ("/xdg-store/trust/netscape_map_ipsec_user", Test, NULL, setup, test_netscape_map_ipsec_user, teardown);
+	g_test_add ("/xdg-store/trust/netscape_map_time_stamping", Test, NULL, setup, test_netscape_map_time_stamping, teardown);
+
+	return egg_tests_run_in_thread_with_loop ();
+}
diff --git a/testing/Makefile.am b/testing/Makefile.am
index 6304d6f..926eaaf 100644
--- a/testing/Makefile.am
+++ b/testing/Makefile.am
@@ -1,22 +1,6 @@
 
 EXTRA_DIST = \
-	ca-example \
-	testing.c testing.h \
-	testing-build.sh \
-	testing.make
-
-INCLUDES = \
-	-I$(top_srcdir) \
-	-I$(top_builddir) \
-	$(GTK_CFLAGS) \
-	$(GLIB_CFLAGS)
-
-LIBS = \
-	$(GTK_LIBS) \
-	$(GLIB_LIBS) \
-	$(GTHREAD_LIBS)
-
-noinst_PROGRAMS =
+	ca-example
 
 CLEANFILES = \
 	coverage \
diff --git a/ui/tests/Makefile.am b/ui/tests/Makefile.am
index cf2c530..46f7b35 100644
--- a/ui/tests/Makefile.am
+++ b/ui/tests/Makefile.am
@@ -1,14 +1,29 @@
-# Test files should be listed in order they need to run
-TESTING_FILES = \
-	unit-test-util.c
 
-UNIT_PROMPT =
+INCLUDES = \
+	-I$(top_builddir) \
+	-I$(top_srcdir) \
+	-DSRCDIR="\"$(srcdir)\"" \
+	$(GLIB_CFLAGS) \
+	$(LIBGCRYPT_CFLAGS)
 
-TESTING_LIBS =  \
-	$(top_builddir)/ui/libgku-prompt.la \
-	$(top_builddir)/egg/libegg-prompt.la
+LDADD = \
+	$(top_builddir)/ui/libgku-prompt-testable.la \
+	$(top_builddir)/egg/libegg.la \
+	$(GLIB_LIBS) \
+	$(GOBJECT_LIBS) \
+	$(LIBGCRYPT_LIBS)
 
-include $(top_srcdir)/testing/testing.make
+TEST_PROGS = \
+	test-util
 
-EXTRA_DIST += \
-	test-data
\ No newline at end of file
+check_PROGRAMS = $(TEST_PROGS)
+
+test: $(TEST_PROGS) $(CHECK_PROGS)
+	gtester -k --verbose -m $(TEST_MODE) --g-fatal-warnings $(TEST_PROGS)
+
+check-local: test
+
+all-local: $(check_PROGRAMS)
+
+EXTRA_DIST = \
+	files
diff --git a/ui/tests/test-data/prompt-empty b/ui/tests/files/prompt-empty
similarity index 100%
rename from ui/tests/test-data/prompt-empty
rename to ui/tests/files/prompt-empty
diff --git a/ui/tests/test-data/prompt-full b/ui/tests/files/prompt-full
similarity index 100%
rename from ui/tests/test-data/prompt-full
rename to ui/tests/files/prompt-full
diff --git a/ui/tests/test-data/prompt-test b/ui/tests/files/prompt-test
similarity index 100%
rename from ui/tests/test-data/prompt-test
rename to ui/tests/files/prompt-test
diff --git a/ui/tests/unit-test-util.c b/ui/tests/test-util.c
similarity index 57%
rename from ui/tests/unit-test-util.c
rename to ui/tests/test-util.c
index 6c9d1cd..0cb9212 100644
--- a/ui/tests/unit-test-util.c
+++ b/ui/tests/test-util.c
@@ -21,39 +21,48 @@
    Author: Stef Walter <stef memberwebs com>
 */
 
-#include "test-suite.h"
+#include "config.h"
 
-#include "gku-prompt-util.h"
+#include "ui/gku-prompt-util.h"
 
-#include <egg/egg-dh.h>
-#include <egg/egg-libgcrypt.h>
-#include <egg/egg-secure-memory.h>
+#include "egg/egg-dh.h"
+#include "egg/egg-libgcrypt.h"
+#include "egg/egg-secure-memory.h"
 
 #include <gcrypt.h>
 
-static GKeyFile *key_file = NULL;
+#include <glib-object.h>
 
-TESTING_SETUP(prompt_util)
+EGG_SECURE_GLIB_DEFINITIONS ();
+
+typedef struct {
+	GKeyFile *key_file;
+} Test;
+
+static void
+setup (Test *test, gconstpointer unused)
 {
 	egg_libgcrypt_initialize ();
-	key_file = g_key_file_new ();
+	test->key_file = g_key_file_new ();
 }
 
-TESTING_TEARDOWN(prompt_util)
+static void
+teardown (Test *test, gconstpointer unused)
 {
-	g_key_file_free (key_file);
-	key_file = NULL;
+	g_key_file_free (test->key_file);
+	test->key_file = NULL;
 }
 
-TESTING_TEST(encode_decode_mpi)
+static void
+test_encode_decode_mpi (Test *test, gconstpointer unused)
 {
 	gcry_mpi_t mpi, check;
 
 	mpi = gcry_mpi_new (512);
 	gcry_mpi_randomize (mpi, 512, GCRY_WEAK_RANDOM);
 
-	gku_prompt_util_encode_mpi (key_file, "section", "field", mpi);
-	if (!gku_prompt_util_decode_mpi (key_file, "section", "field", &check))
+	gku_prompt_util_encode_mpi (test->key_file, "section", "field", mpi);
+	if (!gku_prompt_util_decode_mpi (test->key_file, "section", "field", &check))
 		g_assert_not_reached ();
 
 	g_assert (gcry_mpi_cmp (mpi, check) == 0);
@@ -61,23 +70,25 @@ TESTING_TEST(encode_decode_mpi)
 	gcry_mpi_release (check);
 }
 
-TESTING_TEST(decode_nonexistant_mpi)
+static void
+test_decode_nonexistant_mpi (Test *test, gconstpointer unused)
 {
 	gcry_mpi_t mpi;
 
-	if (gku_prompt_util_decode_mpi (key_file, "nonexist", "nope", &mpi))
+	if (gku_prompt_util_decode_mpi (test->key_file, "nonexist", "nope", &mpi))
 		g_assert_not_reached ();
 }
 
-TESTING_TEST(encode_decode_hex)
+static void
+test_encode_decode_hex (Test *test, gconstpointer unused)
 {
 	gchar buffer[32];
 	gpointer check;
 	gsize n_check;
 
 	gcry_create_nonce (buffer, 32);
-	gku_prompt_util_encode_hex (key_file, "section", "field", buffer, 32);
-	check = gku_prompt_util_decode_hex (key_file, "section", "field", &n_check);
+	gku_prompt_util_encode_hex (test->key_file, "section", "field", buffer, 32);
+	check = gku_prompt_util_decode_hex (test->key_file, "section", "field", &n_check);
 	g_assert (check);
 	g_assert (n_check == 32);
 	g_assert (memcmp (buffer, check, 32) == 0);
@@ -85,11 +96,12 @@ TESTING_TEST(encode_decode_hex)
 	g_free (check);
 }
 
-TESTING_TEST(decode_nonexistant_hex)
+static void
+test_decode_nonexistant_hex (Test *test, gconstpointer unused)
 {
 	gsize n_data;
 
-	if (gku_prompt_util_decode_hex (key_file, "nonexist", "nope", &n_data))
+	if (gku_prompt_util_decode_hex (test->key_file, "nonexist", "nope", &n_data))
 		g_assert_not_reached ();
 }
 
@@ -126,7 +138,8 @@ do_encrypt_decrypt_text (const gchar *text)
 	g_assert_cmpstr (check, ==, text);
 }
 
-TESTING_TEST(encrypt_decrypt_text)
+static void
+test_encrypt_decrypt_text (Test *test, gconstpointer unused)
 {
 	do_encrypt_decrypt_text ("");
 	do_encrypt_decrypt_text ("blah");
@@ -134,3 +147,18 @@ TESTING_TEST(encrypt_decrypt_text)
 	do_encrypt_decrypt_text ("0123456789ABCDE");
 	do_encrypt_decrypt_text ("0123456789ABCDEF 12345");
 }
+
+int
+main (int argc, char **argv)
+{
+	g_type_init ();
+	g_test_init (&argc, &argv, NULL);
+
+	g_test_add ("/ui/util/encode_decode_mpi", Test, NULL, setup, test_encode_decode_mpi, teardown);
+	g_test_add ("/ui/util/decode_nonexistant_mpi", Test, NULL, setup, test_decode_nonexistant_mpi, teardown);
+	g_test_add ("/ui/util/encode_decode_hex", Test, NULL, setup, test_encode_decode_hex, teardown);
+	g_test_add ("/ui/util/decode_nonexistant_hex", Test, NULL, setup, test_decode_nonexistant_hex, teardown);
+	g_test_add ("/ui/util/encrypt_decrypt_text", Test, NULL, setup, test_encrypt_decrypt_text, teardown);
+
+	return g_test_run ();
+}



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