[libgnome-keyring] Allow predictable testing by setting up a test path and service.



commit b65653a552588bdd1c839272822fba44e988f1f0
Author: Stefan Walter <stef ws local>
Date:   Sun Feb 14 04:06:31 2010 +0000

    Allow predictable testing by setting up a test path and service.
    
    Tell the daemon which path to use for data, control sockets, and
    dbus service, during testing.

 configure.in                |    3 ++
 library/gkr-misc.c          |   11 +++++++
 library/gkr-misc.h          |    2 +
 library/gkr-operation.c     |    6 ++--
 library/gkr-session.c       |    5 ++-
 library/gnome-keyring.c     |   50 +++++++++++++++++-----------------
 library/tests/test-memory.c |    8 +++---
 tests/gtest-helpers.c       |   64 +++++++++++++++++++++++++++++++++++++------
 8 files changed, 106 insertions(+), 43 deletions(-)
---
diff --git a/configure.in b/configure.in
index 084e1d5..1391a93 100644
--- a/configure.in
+++ b/configure.in
@@ -193,6 +193,9 @@ fi
 
 AM_CONDITIONAL(WITH_TESTS, test "$enable_tests" = "yes")
 
+AC_PATH_PROG(GNOME_KEYRING_DAEMON_PATH, gnome-keyring-daemon, "gnome-keyring-daemon")
+AC_DEFINE_UNQUOTED(GNOME_KEYRING_DAEMON_PATH, "$GNOME_KEYRING_DAEMON_PATH", [Path to gnome-keyring-daemon])
+
 # ----------------------------------------------------------------------
 
 AC_SUBST(LIBRARY_CFLAGS)
diff --git a/library/gkr-misc.c b/library/gkr-misc.c
index 0c0f276..8de5921 100644
--- a/library/gkr-misc.c
+++ b/library/gkr-misc.c
@@ -29,6 +29,17 @@
 #include <stdlib.h>
 #include <string.h>
 
+const gchar*
+gkr_service_name (void)
+{
+#ifdef WITH_TESTS
+	const gchar *service = g_getenv ("GNOME_KEYRING_TEST_SERVICE");
+	if (service && service[0])
+		return service;
+#endif
+	return SECRETS_SERVICE;
+}
+
 static void
 encode_object_identifier (GString *string, const gchar* name, gssize length)
 {
diff --git a/library/gkr-misc.h b/library/gkr-misc.h
index 97efda4..195c0d4 100644
--- a/library/gkr-misc.h
+++ b/library/gkr-misc.h
@@ -26,6 +26,8 @@
 
 #include <glib.h>
 
+const gchar*            gkr_service_name                     (void);
+
 gchar*                  gkr_encode_keyring_name              (const gchar *keyring);
 
 gchar*                  gkr_encode_keyring_item_id           (const gchar *keyring,
diff --git a/library/gkr-operation.c b/library/gkr-operation.c
index ebc93d6..b03152d 100644
--- a/library/gkr-operation.c
+++ b/library/gkr-operation.c
@@ -231,7 +231,7 @@ on_name_changed_filter (DBusConnection *connection, DBusMessage *message, void *
 	                           DBUS_TYPE_INVALID)) {
 
 		/* See if it's the secret service going away */
-		if (object_name && g_str_equal (SECRETS_SERVICE, object_name) &&
+		if (object_name && g_str_equal (gkr_service_name (), object_name) &&
 		    new_owner && g_str_equal ("", new_owner)) {
 
 			/* Clear any session, when the service goes away */
@@ -480,7 +480,7 @@ on_prompt_completed (DBusConnection *connection, DBusMessage *message, void *use
 	                           DBUS_TYPE_INVALID)) {
 
 		/* See if it's the secret service going away */
-		if (object_name && g_str_equal (SECRETS_SERVICE, object_name) &&
+		if (object_name && g_str_equal (gkr_service_name (), object_name) &&
 		    new_owner && g_str_equal ("", new_owner)) {
 
 			g_message ("Secret service disappeared while waiting for prompt");
@@ -536,7 +536,7 @@ gkr_operation_prompt (GkrOperation *op, const gchar *prompt)
 	args->op->prompting = TRUE;
 	dbus_connection_add_filter (op->conn, on_prompt_completed, args, NULL);
 
-	req = dbus_message_new_method_call (SECRETS_SERVICE, prompt,
+	req = dbus_message_new_method_call (gkr_service_name (), prompt,
 	                                    PROMPT_INTERFACE, "Prompt");
 
 	window_id = "";
diff --git a/library/gkr-session.c b/library/gkr-session.c
index f5b4c81..f8ee2dc 100644
--- a/library/gkr-session.c
+++ b/library/gkr-session.c
@@ -23,6 +23,7 @@
 
 #include "config.h"
 
+#include "gkr-misc.h"
 #include "gkr-session.h"
 #include "gnome-keyring-private.h"
 
@@ -198,7 +199,7 @@ session_negotiate_plain (GkrOperation *op)
 
 	g_assert (op);
 
-	req = dbus_message_new_method_call (SECRETS_SERVICE, SERVICE_PATH,
+	req = dbus_message_new_method_call (gkr_service_name (), SERVICE_PATH,
 	                                    SERVICE_INTERFACE, "OpenSession");
 	dbus_message_iter_init_append (req, &iter);
 	dbus_message_iter_append_basic (&iter, DBUS_TYPE_STRING, &algorithm);
@@ -325,7 +326,7 @@ session_negotiate_aes (GkrOperation *op)
 	gcry_mpi_release (base);
 
 	if (ret == TRUE) {
-		req = dbus_message_new_method_call (SECRETS_SERVICE, SERVICE_PATH,
+		req = dbus_message_new_method_call (gkr_service_name (), SERVICE_PATH,
 		                                    SERVICE_INTERFACE, "OpenSession");
 
 		dbus_message_iter_init_append (req, &iter);
diff --git a/library/gnome-keyring.c b/library/gnome-keyring.c
index e58ef21..21f000e 100644
--- a/library/gnome-keyring.c
+++ b/library/gnome-keyring.c
@@ -70,7 +70,7 @@ prepare_property_get (const gchar *path, const gchar *interface, const gchar *na
 	if (!interface)
 		interface = "";
 
-	req = dbus_message_new_method_call (SECRETS_SERVICE, path,
+	req = dbus_message_new_method_call (gkr_service_name (), path,
 	                                    DBUS_INTERFACE_PROPERTIES, "Get");
 	dbus_message_append_args (req, DBUS_TYPE_STRING, &interface,
 	                          DBUS_TYPE_STRING, &name, DBUS_TYPE_INVALID);
@@ -88,7 +88,7 @@ prepare_property_getall (const gchar *path, const gchar *interface)
 	if (!interface)
 		interface = "";
 
-	req = dbus_message_new_method_call (SECRETS_SERVICE, path,
+	req = dbus_message_new_method_call (gkr_service_name (), path,
 	                                    DBUS_INTERFACE_PROPERTIES, "GetAll");
 	dbus_message_append_args (req, DBUS_TYPE_STRING, &interface, DBUS_TYPE_INVALID);
 
@@ -104,7 +104,7 @@ prepare_get_secret (GkrSession *session, const char *path)
 	g_assert (session);
 	g_assert (path);
 
-	req = dbus_message_new_method_call (SECRETS_SERVICE, path,
+	req = dbus_message_new_method_call (gkr_service_name (), path,
 	                                    ITEM_INTERFACE, "GetSecret");
 
 	spath = gkr_session_get_path (session);
@@ -121,7 +121,7 @@ prepare_get_secrets (GkrSession *session, char **paths, int n_paths)
 
 	g_assert (session);
 
-	req = dbus_message_new_method_call (SECRETS_SERVICE, SERVICE_PATH,
+	req = dbus_message_new_method_call (gkr_service_name (), SERVICE_PATH,
 	                                    SERVICE_INTERFACE, "GetSecrets");
 
 	spath = gkr_session_get_path (session);
@@ -136,7 +136,7 @@ prepare_xlock (const char *action, char **objects, int n_objects)
 {
 	DBusMessage *req;
 
-	req = dbus_message_new_method_call (SECRETS_SERVICE, SERVICE_PATH,
+	req = dbus_message_new_method_call (gkr_service_name (), SERVICE_PATH,
 	                                    SERVICE_INTERFACE, action);
 
 	dbus_message_append_args (req, DBUS_TYPE_ARRAY, DBUS_TYPE_OBJECT_PATH, &objects, n_objects,
@@ -482,7 +482,7 @@ gnome_keyring_is_available (void)
 	GkrOperation *op;
 	DBusMessage *req;
 
-	req = dbus_message_new_method_call (SECRETS_SERVICE, SERVICE_PATH,
+	req = dbus_message_new_method_call (gkr_service_name (), SERVICE_PATH,
 	                                    DBUS_INTERFACE_PEER, "Ping");
 
 	op = gkr_operation_new (gkr_callback_empty, GKR_CALLBACK_RES, NULL, NULL);
@@ -549,7 +549,7 @@ gnome_keyring_set_default_keyring (const gchar                             *keyr
 	g_return_val_if_fail (callback, NULL);
 
 	path = gkr_encode_keyring_name (keyring);
-	req = dbus_message_new_method_call (SECRETS_SERVICE, SERVICE_PATH,
+	req = dbus_message_new_method_call (gkr_service_name (), SERVICE_PATH,
 	                                    SERVICE_INTERFACE, "SetAlias");
 
 	string = "default";
@@ -653,7 +653,7 @@ gnome_keyring_get_default_keyring (GnomeKeyringOperationGetStringCallback  callb
 
 	g_return_val_if_fail (callback, NULL);
 
-	req = dbus_message_new_method_call (SECRETS_SERVICE, SERVICE_PATH,
+	req = dbus_message_new_method_call (gkr_service_name (), SERVICE_PATH,
 	                                    SERVICE_INTERFACE, "ReadAlias");
 
 	string = "default";
@@ -828,7 +828,7 @@ gnome_keyring_lock_all (GnomeKeyringOperationDoneCallback       callback,
 
 	g_return_val_if_fail (callback, NULL);
 
-	req = dbus_message_new_method_call (SECRETS_SERVICE, SERVICE_PATH,
+	req = dbus_message_new_method_call (gkr_service_name (), SERVICE_PATH,
 	                                    SERVICE_INTERFACE, "LockService");
 
 	op = gkr_operation_new (callback, GKR_CALLBACK_RES, data, destroy_data);
@@ -894,7 +894,7 @@ create_keyring_password_reply (GkrOperation *op, GkrSession *session, gpointer u
 	DBusMessageIter iter;
 	DBusMessage *req;
 
-	req = dbus_message_new_method_call (SECRETS_SERVICE, SERVICE_PATH,
+	req = dbus_message_new_method_call (gkr_service_name (), SERVICE_PATH,
 	                                    "org.gnome.keyring.InternalUnsupportedGuiltRiddenInterface",
 	                                    "CreateWithMasterPassword");
 
@@ -980,7 +980,7 @@ gnome_keyring_create (const char                                  *keyring_name,
 		gkr_session_negotiate (op);
 
 	} else {
-		req = dbus_message_new_method_call (SECRETS_SERVICE, SERVICE_PATH,
+		req = dbus_message_new_method_call (gkr_service_name (), SERVICE_PATH,
 		                                    SERVICE_INTERFACE, "CreateCollection");
 		dbus_message_iter_init_append (req, &iter);
 		create_keyring_encode_properties (&iter, keyring_name);
@@ -1122,7 +1122,7 @@ unlock_password_reply (GkrOperation *op, GkrSession *session, gpointer user_data
 	DBusMessage *req;
 	gchar *path;
 
-	req = dbus_message_new_method_call (SECRETS_SERVICE, SERVICE_PATH,
+	req = dbus_message_new_method_call (gkr_service_name (), SERVICE_PATH,
 	                                    "org.gnome.keyring.InternalUnsupportedGuiltRiddenInterface",
 	                                    "UnlockWithMasterPassword");
 
@@ -1294,7 +1294,7 @@ gnome_keyring_delete (const char                                  *keyring,
 	g_return_val_if_fail (callback, NULL);
 
 	path = gkr_encode_keyring_name (keyring);
-	req = dbus_message_new_method_call (SECRETS_SERVICE, path,
+	req = dbus_message_new_method_call (gkr_service_name (), path,
 	                                    COLLECTION_INTERFACE, "Delete");
 
 	op = gkr_operation_new (callback, GKR_CALLBACK_RES, data, destroy_data);
@@ -1349,7 +1349,7 @@ change_password_reply (GkrOperation *op, GkrSession *session, gpointer user_data
 	DBusMessage *req;
 	gchar *path;
 
-	req = dbus_message_new_method_call (SECRETS_SERVICE, SERVICE_PATH,
+	req = dbus_message_new_method_call (gkr_service_name (), SERVICE_PATH,
 	                                    "org.gnome.keyring.InternalUnsupportedGuiltRiddenInterface",
 	                                    "ChangeWithMasterPassword");
 
@@ -1463,7 +1463,7 @@ gnome_keyring_change_password (const char                                  *keyr
 		gkr_session_negotiate (op);
 
 	} else {
-		req = dbus_message_new_method_call (SECRETS_SERVICE, SERVICE_PATH,
+		req = dbus_message_new_method_call (gkr_service_name (), SERVICE_PATH,
 		                                    SERVICE_INTERFACE, "ChangeLock");
 		path = gkr_encode_keyring_name (keyring);
 		dbus_message_append_args (req, DBUS_TYPE_OBJECT_PATH, &path, DBUS_TYPE_INVALID);
@@ -2206,7 +2206,7 @@ gnome_keyring_find_items  (GnomeKeyringItemType                  type,
 	g_return_val_if_fail (attributes, NULL);
 	g_return_val_if_fail (callback, NULL);
 
-	req = dbus_message_new_method_call (SECRETS_SERVICE, SERVICE_PATH,
+	req = dbus_message_new_method_call (gkr_service_name (), SERVICE_PATH,
 	                                    SERVICE_INTERFACE, "SearchItems");
 
 	/* Encode the attribute list */
@@ -2429,7 +2429,7 @@ item_create_prepare (const gchar *path, GnomeKeyringItemType type, const gchar *
 	DBusMessage *req;
 	const char *string;
 
-	req = dbus_message_new_method_call (SECRETS_SERVICE, path,
+	req = dbus_message_new_method_call (gkr_service_name (), path,
 	                                    COLLECTION_INTERFACE, "CreateItem");
 
 	dbus_message_iter_init_append (req, iter);
@@ -2701,7 +2701,7 @@ gnome_keyring_item_delete (const char                                 *keyring,
 	gchar *path;
 
 	path = gkr_encode_keyring_item_id (keyring, id);
-	req = dbus_message_new_method_call (SECRETS_SERVICE, path,
+	req = dbus_message_new_method_call (gkr_service_name (), path,
 	                                    ITEM_INTERFACE, "Delete");
 
 	op = gkr_operation_new (callback, GKR_CALLBACK_RES, data, destroy_data);
@@ -2904,7 +2904,7 @@ item_get_info_2_reply (GkrOperation *op, GkrSession *session, gpointer data)
 	g_assert (!args->session);
 	args->session = gkr_session_ref (session);
 
-	req = dbus_message_new_method_call (SECRETS_SERVICE, args->path, ITEM_INTERFACE, "GetSecret");
+	req = dbus_message_new_method_call (gkr_service_name (), args->path, ITEM_INTERFACE, "GetSecret");
 	path = gkr_session_get_path (session);
 	dbus_message_append_args (req, DBUS_TYPE_OBJECT_PATH, &path, DBUS_TYPE_INVALID);
 
@@ -3057,7 +3057,7 @@ item_set_info_3_reply (GkrOperation *op, GkrSession *session, gpointer user_data
 	g_assert (args->info->secret);
 
 	/* Sending a secret */
-	req = dbus_message_new_method_call (SECRETS_SERVICE, args->path,
+	req = dbus_message_new_method_call (gkr_service_name (), args->path,
 	                                    ITEM_INTERFACE, "SetSecret");
 
 	dbus_message_iter_init_append (req, &iter);
@@ -3103,7 +3103,7 @@ item_set_info_1_reply (GkrOperation *op, DBusMessage *reply, gpointer user_data)
 		return;
 
 	/* Next set the type */
-	req = dbus_message_new_method_call (SECRETS_SERVICE, args->path,
+	req = dbus_message_new_method_call (gkr_service_name (), args->path,
 	                                    DBUS_INTERFACE_PROPERTIES, "Set");
 
 	dbus_message_iter_init_append (req, &iter);
@@ -3172,7 +3172,7 @@ gnome_keyring_item_set_info (const char                                 *keyring
 	args->path = gkr_encode_keyring_item_id (keyring, id);
 
 	/* First set the label */
-	req = dbus_message_new_method_call (SECRETS_SERVICE, args->path,
+	req = dbus_message_new_method_call (gkr_service_name (), args->path,
 	                                    DBUS_INTERFACE_PROPERTIES, "Set");
 
 	dbus_message_iter_init_append (req, &iter);
@@ -3324,7 +3324,7 @@ item_set_attributes_prepare (const gchar *path, GnomeKeyringAttributeList *attrs
 	DBusMessage *req;
 	const gchar *string;
 
-	req = dbus_message_new_method_call (SECRETS_SERVICE, path,
+	req = dbus_message_new_method_call (gkr_service_name (), path,
 	                                    DBUS_INTERFACE_PROPERTIES, "Set");
 
 	dbus_message_iter_init_append (req, &iter);
@@ -4308,7 +4308,7 @@ find_unlocked (GkrOperation *op, GnomeKeyringAttributeList *attributes)
 	DBusMessageIter iter;
 	DBusMessage *req;
 
-	req = dbus_message_new_method_call (SECRETS_SERVICE, SERVICE_PATH,
+	req = dbus_message_new_method_call (gkr_service_name (), SERVICE_PATH,
 	                                    SERVICE_INTERFACE, "SearchItems");
 
 	/* Encode the attribute list */
@@ -4494,7 +4494,7 @@ delete_password_reply (GkrOperation *op, const char *path, gpointer user_data)
 	if (path == NULL) {
 		gkr_operation_complete (op, GNOME_KEYRING_RESULT_NO_MATCH);
 	} else {
-		req = dbus_message_new_method_call (SECRETS_SERVICE, path,
+		req = dbus_message_new_method_call (gkr_service_name (), path,
 		                                    ITEM_INTERFACE, "Delete");
 		gkr_operation_request (op, req);
 		dbus_message_unref (req);
diff --git a/library/tests/test-memory.c b/library/tests/test-memory.c
index 5870333..7cc01b7 100644
--- a/library/tests/test-memory.c
+++ b/library/tests/test-memory.c
@@ -29,19 +29,19 @@
 
 #include "library/gnome-keyring-memory.h"
 
-#define IS_ZERO ~0
+#define IS_ZERO -1
 
-static gsize
+static int
 find_non_zero (gpointer mem, gsize len)
 {
 	guchar *b, *e;
 	gsize sz = 0;
 	for (b = (guchar*)mem, e = ((guchar*)mem) + len; b != e; ++b, ++sz) {
 		if (*b != 0x00)
-			return sz;
+			return (int)sz;
 	}
 
-	return IS_ZERO;
+	return -1;
 }
 
 DEFINE_TEST(alloc_free)
diff --git a/tests/gtest-helpers.c b/tests/gtest-helpers.c
index 422c051..a81034d 100644
--- a/tests/gtest-helpers.c
+++ b/tests/gtest-helpers.c
@@ -23,12 +23,15 @@
 
 /* This file is included into the main .c file for each gtest unit-test program */
 
+#include "config.h"
+
 #include <glib.h>
 #include <stdio.h>
 #include <unistd.h>
 #include <stdlib.h>
 #include <string.h>
 #include <errno.h>
+#include <signal.h>
 
 #include "gtest-helpers.h"
 
@@ -36,6 +39,7 @@
 
 static GStaticMutex memory_mutex = G_STATIC_MUTEX_INIT;
 static const gchar *test_path = NULL;
+static pid_t daemon_pid = 0;
 
 void
 egg_memory_lock (void)
@@ -157,21 +161,60 @@ chdir_base_dir (char* argv0)
 	g_free (dir);
 }
 
+static void
+daemon_start ()
+{
+	GError *err = NULL;
+	gchar *args[3];
+	const gchar *path, *service;
+
+	path = g_getenv ("GNOME_KEYRING_TEST_PATH");
+	if (path && !path[0])
+		path = NULL;
+
+	service = g_getenv ("GNOME_KEYRING_TEST_SERVICE");
+	if (service && !service[0])
+		service = NULL;
+
+	if (!path && !service) {
+		g_mkdir_with_parents ("/tmp/keyring-test/data", 0700);
+		g_setenv ("GNOME_KEYRING_TEST_PATH", "/tmp/keyring-test/data", TRUE);
+		g_setenv ("GNOME_KEYRING_TEST_SERVICE", "org.gnome.keyring.Test", TRUE);
+
+		g_printerr ("Starting gnome-keyring-daemon...\n");
+
+		args[0] = GNOME_KEYRING_DAEMON_PATH;
+		args[1] = "--foreground";
+		args[2] = "--control-directory";
+		args[3] = "/tmp/keyring-test";
+		args[4] = NULL;
+
+		if (!g_spawn_async (NULL, args, NULL, G_SPAWN_LEAVE_DESCRIPTORS_OPEN | G_SPAWN_DO_NOT_REAP_CHILD,
+							NULL, NULL, &daemon_pid, &err)) {
+			g_error ("couldn't start gnome-keyring-daemon for testing: %s",
+					 err && err->message ? err->message : "");
+			g_assert_not_reached ();
+		}
+
+		/* Let it startup properly */
+		sleep (2);
+	}
+}
+
+static void
+daemon_stop (void)
+{
+	if (daemon_pid)
+		kill (daemon_pid, SIGTERM);
+	daemon_pid = 0;
+}
+
 int
 main (int argc, char* argv[])
 {
 	GLogLevelFlags fatal_mask;
 	int ret;
 
-	test_path = getenv ("GNOME_KEYRING_TEST_PATH");
-	if (test_path) {
-		setenv ("GNOME_KEYRING_OUTSIDE_TEST", "TRUE", 1);
-	} else {
-		test_path = "/tmp/test-gnome-keyring";
-		setenv ("GNOME_KEYRING_TEST_PATH", test_path, 1);
-		g_mkdir_with_parents (test_path, 0777);
-	}
-
 	chdir_base_dir (argv[0]);
 	g_test_init (&argc, &argv, NULL);
 	mainloop = g_main_loop_new (NULL, FALSE);
@@ -181,10 +224,13 @@ main (int argc, char* argv[])
 	g_log_set_always_fatal (fatal_mask);
 
 	initialize_tests ();
+	daemon_start ();
 
 	start_tests ();
 	ret = g_test_run ();
 	stop_tests();
 
+	daemon_stop();
+
 	return ret;
 }



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