More reliable means of checking if object was finalized
[platform/upstream/libsecret.git] / libsecret / tests / test-prompt.c
1 /* libsecret - GLib wrapper for Secret Service
2  *
3  * Copyright 2011 Red Hat Inc.
4  *
5  * This program is free software: you can redistribute it and/or modify
6  * it under the terms of the GNU Lesser General Public License as published
7  * by the Free Software Foundation; either version 2 of the licence or (at
8  * your option) any later version.
9  *
10  * See the included COPYING file for more information.
11  *
12  * Author: Stef Walter <stefw@gnome.org>
13  */
14
15
16 #include "config.h"
17
18 #include "secret-item.h"
19 #include "secret-service.h"
20 #include "secret-private.h"
21 #include "secret-prompt.h"
22
23 #include "mock-service.h"
24
25 #include "egg/egg-testing.h"
26
27 #include <glib.h>
28
29 #include <errno.h>
30 #include <stdlib.h>
31
32 typedef struct {
33         SecretService *service;
34 } Test;
35
36 static void
37 setup (Test *test,
38        gconstpointer data)
39 {
40         GError *error = NULL;
41         const gchar *mock_script = data;
42
43         mock_service_start (mock_script, &error);
44         g_assert_no_error (error);
45
46         test->service = secret_service_get_sync (SECRET_SERVICE_NONE, NULL, &error);
47         g_assert_no_error (error);
48         g_object_add_weak_pointer (G_OBJECT (test->service), (gpointer *)&test->service);
49 }
50
51 static void
52 teardown (Test *test,
53           gconstpointer unused)
54 {
55         g_object_unref (test->service);
56         secret_service_disconnect ();
57         g_assert (test->service == NULL);
58
59         mock_service_stop ();
60 }
61
62 static void
63 on_async_result (GObject *source,
64                  GAsyncResult *result,
65                  gpointer user_data)
66 {
67         GAsyncResult **ret = user_data;
68         g_assert (ret != NULL);
69         g_assert (*ret == NULL);
70         *ret = g_object_ref (result);
71         egg_test_wait_stop ();
72 }
73
74 static gboolean
75 on_idle_increment (gpointer user_data)
76 {
77         guint *value = user_data;
78         ++(*value);
79         return TRUE;
80 }
81
82 static void
83 test_perform_sync (Test *test,
84                    gconstpointer unused)
85 {
86         SecretPrompt *prompt;
87         GError *error = NULL;
88         GVariant *retval;
89         guint value = 0;
90         guint increment_id;
91
92         /* Verify that main loop does not run during this call */
93         increment_id = g_idle_add (on_idle_increment, &value);
94
95         prompt = _secret_prompt_instance (test->service, "/org/freedesktop/secrets/prompts/simple");
96
97         retval = secret_prompt_perform_sync (prompt, 0, NULL, NULL, &error);
98         g_assert_no_error (error);
99         g_assert (retval != NULL);
100         g_variant_unref (retval);
101         g_object_add_weak_pointer (G_OBJECT (prompt), (gpointer *)&prompt);
102
103         g_assert_cmpuint (value, ==, 0);
104         g_source_remove (increment_id);
105
106         g_object_unref (prompt);
107         g_assert (prompt == NULL);
108 }
109
110 static void
111 test_perform_run (Test *test,
112                   gconstpointer unused)
113 {
114         SecretPrompt *prompt;
115         GError *error = NULL;
116         GVariant *retval;
117         guint value = 0;
118         guint increment_id;
119
120         /* Verify that main loop does run during this call */
121         increment_id = g_idle_add (on_idle_increment, &value);
122
123         prompt = _secret_prompt_instance (test->service, "/org/freedesktop/secrets/prompts/simple");
124
125         retval = secret_prompt_run (prompt, 0, NULL, NULL, &error);
126         g_assert_no_error (error);
127         g_assert (retval != NULL);
128         g_variant_unref (retval);
129         g_object_add_weak_pointer (G_OBJECT (prompt), (gpointer *)&prompt);
130
131         g_assert_cmpuint (value, >, 0);
132         g_source_remove (increment_id);
133
134         /* Make sure everything completes */
135         egg_test_wait_idle ();
136
137         g_object_unref (prompt);
138         g_assert (prompt == NULL);
139 }
140
141 static void
142 test_perform_async (Test *test,
143                     gconstpointer unused)
144 {
145         SecretPrompt *prompt;
146         GError *error = NULL;
147         GAsyncResult *result = NULL;
148         GVariant *retval;
149
150         prompt = _secret_prompt_instance (test->service, "/org/freedesktop/secrets/prompts/simple");
151         g_object_add_weak_pointer (G_OBJECT (prompt), (gpointer *)&prompt);
152
153         secret_prompt_perform (prompt, 0, NULL, NULL, on_async_result, &result);
154         g_assert (result == NULL);
155
156         egg_test_wait ();
157
158         retval = secret_prompt_perform_finish (prompt, result, &error);
159         g_assert_no_error (error);
160         g_assert (retval != NULL);
161         g_variant_unref (retval);
162         g_object_unref (result);
163
164         /* Make sure everything completes */
165         egg_test_wait_idle ();
166
167         g_object_unref (prompt);
168         g_assert (prompt == NULL);
169 }
170
171 static void
172 test_perform_cancel (Test *test,
173                      gconstpointer unused)
174 {
175         SecretPrompt *prompt;
176         GError *error = NULL;
177         GAsyncResult *result = NULL;
178         GCancellable *cancellable;
179         GVariant *retval;
180
181         prompt = _secret_prompt_instance (test->service, "/org/freedesktop/secrets/prompts/delay");
182         g_object_add_weak_pointer (G_OBJECT (prompt), (gpointer *)&prompt);
183
184         cancellable = g_cancellable_new ();
185         secret_prompt_perform (prompt, 0, NULL, cancellable, on_async_result, &result);
186         g_assert (result == NULL);
187
188         g_cancellable_cancel (cancellable);
189         g_object_unref (cancellable);
190
191         egg_test_wait ();
192
193         retval = secret_prompt_perform_finish (prompt, result, &error);
194         g_assert_no_error (error);
195         g_assert (retval != NULL);
196         g_variant_unref (retval);
197
198         g_object_unref (result);
199         g_object_unref (prompt);
200
201         /* Due to GDBus threading races */
202         egg_test_wait_until (100);
203
204         g_assert (prompt == NULL);
205 }
206
207 static void
208 test_perform_fail (Test *test,
209                    gconstpointer unused)
210 {
211         SecretPrompt *prompt;
212         GError *error = NULL;
213         GVariant *retval;
214
215         prompt = _secret_prompt_instance (test->service, "/org/freedesktop/secrets/prompts/error");
216         g_object_add_weak_pointer (G_OBJECT (prompt), (gpointer *)&prompt);
217
218         retval = secret_prompt_perform_sync (prompt, 0, NULL, NULL, &error);
219         g_assert_error (error, G_DBUS_ERROR, G_DBUS_ERROR_NOT_SUPPORTED);
220         g_assert (retval == NULL);
221
222         g_object_unref (prompt);
223         g_assert (prompt == NULL);
224 }
225
226 static void
227 test_perform_vanish (Test *test,
228                      gconstpointer unused)
229 {
230         SecretPrompt *prompt;
231         GError *error = NULL;
232         GVariant *retval;
233
234         prompt = _secret_prompt_instance (test->service, "/org/freedesktop/secrets/prompts/vanish");
235         g_object_add_weak_pointer (G_OBJECT (prompt), (gpointer *)&prompt);
236
237         retval = secret_prompt_perform_sync (prompt, 0, NULL, NULL, &error);
238         g_assert_no_error (error);
239         g_assert (retval == NULL);
240
241         g_object_unref (prompt);
242         g_assert (prompt == NULL);
243 }
244
245 static void
246 test_prompt_result (Test *test,
247                     gconstpointer unused)
248 {
249         SecretPrompt *prompt;
250         GError *error = NULL;
251         GVariant *retval;
252
253         prompt = _secret_prompt_instance (test->service, "/org/freedesktop/secrets/prompts/result");
254         g_object_add_weak_pointer (G_OBJECT (prompt), (gpointer *)&prompt);
255
256         retval = secret_prompt_perform_sync (prompt, 0, NULL, G_VARIANT_TYPE_STRING, &error);
257         g_assert_no_error (error);
258         g_assert (retval != NULL);
259         g_assert_cmpstr (g_variant_get_string (retval, NULL), ==, "Special Result");
260         g_variant_unref (retval);
261
262         g_object_unref (prompt);
263         g_assert (prompt == NULL);
264 }
265
266 static void
267 test_prompt_window_id (Test *test,
268                        gconstpointer unused)
269 {
270         SecretPrompt *prompt;
271         GError *error = NULL;
272         GVariant *retval;
273
274         prompt = _secret_prompt_instance (test->service, "/org/freedesktop/secrets/prompts/window");
275         g_object_add_weak_pointer (G_OBJECT (prompt), (gpointer *)&prompt);
276
277         retval = secret_prompt_perform_sync (prompt, 555, NULL, G_VARIANT_TYPE_STRING, &error);
278         g_assert_no_error (error);
279         g_assert (retval != NULL);
280         g_assert_cmpstr (g_variant_get_string (retval, NULL), ==, "555");
281         g_variant_unref (retval);
282
283         g_object_unref (prompt);
284         g_assert (prompt == NULL);
285 }
286
287 static void
288 test_service_sync (Test *test,
289                    gconstpointer unused)
290 {
291         SecretPrompt *prompt;
292         GError *error = NULL;
293         GVariant *retval;
294
295         prompt = _secret_prompt_instance (test->service, "/org/freedesktop/secrets/prompts/simple");
296         g_object_add_weak_pointer (G_OBJECT (prompt), (gpointer *)&prompt);
297
298         retval = secret_service_prompt_sync (test->service, prompt, NULL, NULL, &error);
299         g_assert_no_error (error);
300         g_assert (retval != NULL);
301         g_variant_unref (retval);
302
303         g_object_unref (prompt);
304         g_assert (prompt == NULL);
305 }
306
307 static void
308 test_service_async (Test *test,
309                     gconstpointer unused)
310 {
311         SecretPrompt *prompt;
312         GError *error = NULL;
313         GAsyncResult *result = NULL;
314         GVariant *retval;
315
316         prompt = _secret_prompt_instance (test->service, "/org/freedesktop/secrets/prompts/simple");
317         g_object_add_weak_pointer (G_OBJECT (prompt), (gpointer *)&prompt);
318
319         secret_service_prompt (test->service, prompt, NULL, NULL, on_async_result, &result);
320         g_assert (result == NULL);
321
322         egg_test_wait ();
323
324         retval = secret_service_prompt_finish (test->service, result, &error);
325         g_assert_no_error (error);
326         g_assert (retval != NULL);
327         g_variant_unref (retval);
328         g_object_unref (result);
329
330         /* Make sure everything completes */
331         egg_test_wait_idle ();
332
333         g_object_unref (prompt);
334         g_assert (prompt == NULL);
335 }
336
337 static void
338 test_service_fail (Test *test,
339                     gconstpointer unused)
340 {
341         SecretPrompt *prompt;
342         GError *error = NULL;
343         GAsyncResult *result = NULL;
344         GVariant *retval;
345
346         prompt = _secret_prompt_instance (test->service, "/org/freedesktop/secrets/prompts/error");
347         g_object_add_weak_pointer (G_OBJECT (prompt), (gpointer *)&prompt);
348
349         secret_service_prompt (test->service, prompt, NULL, NULL, on_async_result, &result);
350         g_assert (result == NULL);
351
352         egg_test_wait ();
353
354         retval = secret_service_prompt_finish (test->service, result, &error);
355         g_assert_error (error, G_DBUS_ERROR, G_DBUS_ERROR_NOT_SUPPORTED);
356         g_assert (retval == NULL);
357         g_object_unref (result);
358
359         /* Make sure everything completes */
360         egg_test_wait_idle ();
361
362         g_object_unref (prompt);
363         g_assert (prompt == NULL);
364 }
365
366 static void
367 test_service_path (Test *test,
368                     gconstpointer unused)
369 {
370         GError *error = NULL;
371         GAsyncResult *result = NULL;
372         SecretPrompt *prompt;
373         GVariant *retval;
374
375         prompt = _secret_prompt_instance (test->service, "/org/freedesktop/secrets/prompts/simple");
376
377         secret_service_prompt (test->service, prompt, NULL, NULL, on_async_result, &result);
378         g_assert (result == NULL);
379
380         g_object_unref (prompt);
381         egg_test_wait ();
382
383         retval = secret_service_prompt_finish (test->service, result, &error);
384         g_assert_no_error (error);
385         g_assert (retval != NULL);
386         g_variant_unref (retval);
387         g_object_unref (result);
388
389         /* Make sure everything completes */
390         egg_test_wait_idle ();
391 }
392
393 static void
394 null_log_handler (const gchar *log_domain, GLogLevelFlags log_level,
395                   const gchar *message, gpointer user_data)
396 {
397
398 }
399
400 int
401 main (int argc, char **argv)
402 {
403         g_test_init (&argc, &argv, NULL);
404         g_set_prgname ("test-prompt");
405 #if !GLIB_CHECK_VERSION(2,35,0)
406         g_type_init ();
407 #endif
408
409         /* Suppress these messages in tests */
410         g_log_set_handler (G_LOG_DOMAIN, G_LOG_LEVEL_MESSAGE | G_LOG_LEVEL_INFO | G_LOG_LEVEL_DEBUG,
411                            null_log_handler, NULL);
412
413         g_test_add ("/prompt/run", Test, "mock-service-prompt.py", setup, test_perform_run, teardown);
414         g_test_add ("/prompt/perform-sync", Test, "mock-service-prompt.py", setup, test_perform_sync, teardown);
415         g_test_add ("/prompt/perform-async", Test, "mock-service-prompt.py", setup, test_perform_async, teardown);
416         g_test_add ("/prompt/perform-cancel", Test, "mock-service-prompt.py", setup, test_perform_cancel, teardown);
417         g_test_add ("/prompt/perform-fail", Test, "mock-service-prompt.py", setup, test_perform_fail, teardown);
418         g_test_add ("/prompt/perform-vanish", Test, "mock-service-prompt.py", setup, test_perform_vanish, teardown);
419         g_test_add ("/prompt/result", Test, "mock-service-prompt.py", setup, test_prompt_result, teardown);
420         g_test_add ("/prompt/window-id", Test, "mock-service-prompt.py", setup, test_prompt_window_id, teardown);
421
422         g_test_add ("/prompt/service-sync", Test, "mock-service-prompt.py", setup, test_service_sync, teardown);
423         g_test_add ("/prompt/service-async", Test, "mock-service-prompt.py", setup, test_service_async, teardown);
424         g_test_add ("/prompt/service-path", Test, "mock-service-prompt.py", setup, test_service_path, teardown);
425         g_test_add ("/prompt/service-fail", Test, "mock-service-prompt.py", setup, test_service_fail, teardown);
426
427         return egg_tests_run_with_loop ();
428 }