[gcr] gcr: Add tests for new-prompt signal on GcrSystemPrompter



commit ff3aea653e8bf828941e351e32c42d4fb26a0a54
Author: Stef Walter <stefw collabora co uk>
Date:   Mon Jan 9 16:08:14 2012 +0100

    gcr: Add tests for new-prompt signal on GcrSystemPrompter

 gcr/gcr-mock-prompter.c   |   52 +++++++++++++++++++++++++++++++++++++++++---
 gcr/gcr-system-prompter.c |   21 +++++++++++++----
 2 files changed, 64 insertions(+), 9 deletions(-)
---
diff --git a/gcr/gcr-mock-prompter.c b/gcr/gcr-mock-prompter.c
index 55aadcf..ccd6a4d 100644
--- a/gcr/gcr-mock-prompter.c
+++ b/gcr/gcr-mock-prompter.c
@@ -676,7 +676,7 @@ gcr_mock_prompter_expect_confirm_ok (const gchar *first_property_name,
 	response->password = NULL;
 	response->proceed = TRUE;
 
-	klass = g_type_class_ref (gcr_system_prompter_get_prompt_type (running->prompter));
+	klass = g_type_class_ref (GCR_TYPE_MOCK_PROMPT);
 
 	va_start (var_args, first_property_name);
 	response->properties = build_properties (G_OBJECT_CLASS (klass), first_property_name, var_args);
@@ -750,7 +750,7 @@ gcr_mock_prompter_expect_password_ok (const gchar *password,
 	response->password = g_strdup (password);
 	response->proceed = TRUE;
 
-	klass = g_type_class_ref (gcr_system_prompter_get_prompt_type (running->prompter));
+	klass = g_type_class_ref (GCR_TYPE_MOCK_PROMPT);
 
 	va_start (var_args, first_property_name);
 	response->properties = build_properties (G_OBJECT_CLASS (klass), first_property_name, var_args);
@@ -821,6 +821,35 @@ on_idle_signal_cond (gpointer user_data)
 	return FALSE; /* Don't run again */
 }
 
+/*
+ * These next few functions test the new-prompt signals of
+ * GcrSystemPrompter. They should probably be in tests, but
+ * don't fit there nicely.
+ */
+static GcrPrompt *
+on_new_prompt_skipped (GcrSystemPrompter *prompter,
+                       gpointer user_data)
+{
+	g_return_val_if_fail (GCR_IS_SYSTEM_PROMPTER (prompter), NULL);
+	return NULL;
+}
+
+static GcrPrompt *
+on_new_prompt_creates (GcrSystemPrompter *prompter,
+                       gpointer user_data)
+{
+	g_return_val_if_fail (GCR_IS_SYSTEM_PROMPTER (prompter), NULL);
+	return g_object_new (GCR_TYPE_MOCK_PROMPT, NULL);
+}
+
+static GcrPrompt *
+on_new_prompt_not_called (GcrSystemPrompter *prompter,
+                          gpointer user_data)
+{
+	g_return_val_if_fail (GCR_IS_SYSTEM_PROMPTER (prompter), NULL);
+	g_return_val_if_reached (NULL);
+}
+
 static gpointer
 mock_prompter_thread (gpointer data)
 {
@@ -835,8 +864,23 @@ mock_prompter_thread (gpointer data)
 	context = g_main_context_new ();
 	g_main_context_push_thread_default (context);
 
-	thread_data->prompter = gcr_system_prompter_new (GCR_SYSTEM_PROMPTER_SINGLE,
-	                                                 GCR_TYPE_MOCK_PROMPT);
+	/*
+	 * Random choice between signals, and prompt-gtype style of creating
+	 * GcrPrompt objects.
+	 */
+
+	if (g_random_boolean ()) {
+		/* Allows GcrSystemPrompter to create the prompts directly */
+		thread_data->prompter = gcr_system_prompter_new (GCR_SYSTEM_PROMPTER_SINGLE,
+		                                                 GCR_TYPE_MOCK_PROMPT);
+
+	} else {
+		/* Create the prompt objects in signal handler */
+		thread_data->prompter = gcr_system_prompter_new (GCR_SYSTEM_PROMPTER_SINGLE, 0);
+		g_signal_connect (thread_data->prompter, "new-prompt", G_CALLBACK (on_new_prompt_skipped), NULL);
+		g_signal_connect (thread_data->prompter, "new-prompt", G_CALLBACK (on_new_prompt_creates), NULL);
+		g_signal_connect (thread_data->prompter, "new-prompt", G_CALLBACK (on_new_prompt_not_called), NULL);
+	}
 
 	address = g_dbus_address_get_for_bus_sync (G_BUS_TYPE_SESSION, NULL, &error);
 	if (error == NULL) {
diff --git a/gcr/gcr-system-prompter.c b/gcr/gcr-system-prompter.c
index c86e97c..b094f01 100644
--- a/gcr/gcr-system-prompter.c
+++ b/gcr/gcr-system-prompter.c
@@ -991,7 +991,11 @@ gcr_system_prompter_unregister (GcrSystemPrompter *self,
  * Create a new system prompter service. This prompter won't do anything unless
  * you connect to its signals and show appropriate prompts.
  *
- * The @prompt_type #GType must implement the #GcrPrompt interface.
+ * If @prompt_type is zero, then the new-prompt signal must be handled and
+ * return a valid prompt object implementing the #GcrPrompt interface.
+ *
+ * If @prompt_type is non-zero then the #GType must implement the #GcrPrompt
+ * interface.
  *
  * Returns: (transfer full): a new prompter service
  */
@@ -999,10 +1003,17 @@ GcrSystemPrompter *
 gcr_system_prompter_new (GcrSystemPrompterMode mode,
                          GType prompt_type)
 {
-	return g_object_new (GCR_TYPE_SYSTEM_PROMPTER,
-	                     "mode", mode,
-	                     "prompt-type", prompt_type,
-	                     NULL);
+	if (prompt_type == 0) {
+		return g_object_new (GCR_TYPE_SYSTEM_PROMPTER,
+		                     "mode", mode,
+		                     NULL);
+
+	} else {
+		return g_object_new (GCR_TYPE_SYSTEM_PROMPTER,
+		                     "mode", mode,
+		                     "prompt-type", prompt_type,
+		                     NULL);
+	}
 }
 
 /**



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