]> rtime.felk.cvut.cz Git - sojka/lightdm.git/blob - tests/src/test-gobject-greeter.c
Add a bunch of tests; fix some small bugs
[sojka/lightdm.git] / tests / src / test-gobject-greeter.c
1 /* -*- Mode: C; indent-tabs-mode: nil; tab-width: 4 -*- */
2
3 #include <stdlib.h>
4 #include <stdio.h>
5 #include <string.h>
6 #include <xcb/xcb.h>
7 #include <lightdm.h>
8 #include <glib-unix.h>
9 #include <ctype.h>
10
11 #include "status.h"
12
13 static gchar *greeter_id;
14 static GMainLoop *loop;
15 static LightDMGreeter *greeter;
16 static xcb_connection_t *connection = NULL;
17 static GKeyFile *config;
18
19 static void
20 show_message_cb (LightDMGreeter *greeter, const gchar *text, LightDMMessageType type)
21 {
22     status_notify ("%s SHOW-MESSAGE TEXT=\"%s\"", greeter_id, text);
23 }
24
25 static void
26 show_prompt_cb (LightDMGreeter *greeter, const gchar *text, LightDMPromptType type)
27 {
28     status_notify ("%s SHOW-PROMPT TEXT=\"%s\"", greeter_id, text);
29 }
30
31 static void
32 authentication_complete_cb (LightDMGreeter *greeter)
33 {
34     if (lightdm_greeter_get_authentication_user (greeter))
35         status_notify ("%s AUTHENTICATION-COMPLETE USERNAME=%s AUTHENTICATED=%s",
36                        greeter_id,
37                        lightdm_greeter_get_authentication_user (greeter),
38                        lightdm_greeter_get_is_authenticated (greeter) ? "TRUE" : "FALSE");
39     else
40         status_notify ("%s AUTHENTICATION-COMPLETE AUTHENTICATED=%s",
41                        greeter_id,
42                        lightdm_greeter_get_is_authenticated (greeter) ? "TRUE" : "FALSE");
43 }
44
45 static void
46 autologin_timer_expired_cb (LightDMGreeter *greeter)
47 {
48     status_notify ("%s AUTOLOGIN-TIMER-EXPIRED", greeter_id);
49 }
50
51 static gboolean
52 sigint_cb (gpointer user_data)
53 {
54     status_notify ("%s TERMINATE SIGNAL=%d", greeter_id, SIGINT);
55     g_main_loop_quit (loop);
56     return TRUE;
57 }
58
59 static gboolean
60 sigterm_cb (gpointer user_data)
61 {
62     status_notify ("%s TERMINATE SIGNAL=%d", greeter_id, SIGTERM);
63     g_main_loop_quit (loop);
64     return TRUE;
65 }
66
67 static void
68 print_hints (LightDMGreeter *greeter)
69 {
70     if (lightdm_greeter_get_select_user_hint (greeter))
71         status_notify ("%s SELECT-USER-HINT USERNAME=%s", greeter_id, lightdm_greeter_get_select_user_hint (greeter));
72     if (lightdm_greeter_get_select_guest_hint (greeter))
73         status_notify ("%s SELECT-GUEST-HINT", greeter_id);
74     if (lightdm_greeter_get_lock_hint (greeter))
75         status_notify ("%s LOCK-HINT", greeter_id);
76     if (!lightdm_greeter_get_has_guest_account_hint (greeter))
77         status_notify ("%s HAS-GUEST-ACCOUNT-HINT=FALSE", greeter_id);
78     if (lightdm_greeter_get_hide_users_hint (greeter))
79         status_notify ("%s HIDE-USERS-HINT", greeter_id);
80     if (lightdm_greeter_get_show_manual_login_hint (greeter))
81         status_notify ("%s SHOW-MANUAL-LOGIN-HINT", greeter_id);
82     if (!lightdm_greeter_get_show_remote_login_hint (greeter))
83         status_notify ("%s SHOW-REMOTE-LOGIN-HINT=FALSE", greeter_id);
84 }
85
86 static void
87 idle_cb (LightDMGreeter *greeter)
88 {
89     status_notify ("%s IDLE", greeter_id);
90 }
91
92 static void
93 reset_cb (LightDMGreeter *greeter)
94 {
95     status_notify ("%s RESET", greeter_id);
96     print_hints (greeter);
97 }
98
99 static void
100 user_changed_cb (LightDMUser *user)
101 {
102     status_notify ("%s USER-CHANGED USERNAME=%s", greeter_id, lightdm_user_get_name (user));
103 }
104
105 static void
106 request_cb (const gchar *name, GHashTable *params)
107 {
108     if (!name)
109     {
110         g_main_loop_quit (loop);
111         return;
112     }
113
114     if (strcmp (name, "CRASH") == 0)
115         kill (getpid (), SIGSEGV);
116
117     else if (strcmp (name, "AUTHENTICATE") == 0)
118         lightdm_greeter_authenticate (greeter, g_hash_table_lookup (params, "USERNAME"));
119
120     else if (strcmp (name, "AUTHENTICATE-GUEST") == 0)
121         lightdm_greeter_authenticate_as_guest (greeter);
122
123     else if (strcmp (name, "AUTHENTICATE-AUTOLOGIN") == 0)
124         lightdm_greeter_authenticate_autologin (greeter);
125
126     else if (strcmp (name, "AUTHENTICATE-REMOTE") == 0)
127         lightdm_greeter_authenticate_remote (greeter, g_hash_table_lookup (params, "SESSION"), NULL);
128
129     else if (strcmp (name, "RESPOND") == 0)
130         lightdm_greeter_respond (greeter, g_hash_table_lookup (params, "TEXT"));
131
132     else if (strcmp (name, "CANCEL-AUTHENTICATION") == 0)
133         lightdm_greeter_cancel_authentication (greeter);
134
135     else if (strcmp (name, "START-SESSION") == 0)
136     {
137         if (!lightdm_greeter_start_session_sync (greeter, g_hash_table_lookup (params, "SESSION"), NULL))
138             status_notify ("%s SESSION-FAILED", greeter_id);
139     }
140
141     else if (strcmp (name, "LOG-DEFAULT-SESSION") == 0)
142         status_notify ("%s LOG-DEFAULT-SESSION SESSION=%s", greeter_id, lightdm_greeter_get_default_session_hint (greeter));
143
144     else if (strcmp (name, "LOG-USER-LIST-LENGTH") == 0)
145         status_notify ("%s LOG-USER-LIST-LENGTH N=%d", greeter_id, lightdm_user_list_get_length (lightdm_user_list_get_instance ()));
146
147     else if (strcmp (name, "WRITE-SHARED-DATA") == 0)
148     {
149         gchar *dir;
150
151         dir = lightdm_greeter_ensure_shared_data_dir_sync (greeter, g_hash_table_lookup (params, "USERNAME"));
152         if (dir)
153         {
154             gchar *path;
155             FILE *f;
156
157             g_printerr ("dir='%s'\n", dir);
158
159             path = g_build_filename (dir, "data", NULL);
160             if (!(f = fopen (path, "w")) || fprintf (f, "%s", (const gchar *) g_hash_table_lookup (params, "DATA")) < 0)
161                 status_notify ("%s WRITE-SHARED-DATA ERROR=%s", greeter_id, strerror (errno));
162             else
163                 status_notify ("%s WRITE-SHARED-DATA RESULT=TRUE", greeter_id);
164
165             if (f)
166                 fclose (f);
167             g_free (path);
168             g_free (dir);
169         }
170         else
171             status_notify ("%s WRITE-SHARED-DATA ERROR=NO_SHARED_DIR", greeter_id);
172     }
173
174     else if (strcmp (name, "READ-SHARED-DATA") == 0)
175     {
176         gchar *dir;
177
178         dir = lightdm_greeter_ensure_shared_data_dir_sync (greeter, g_hash_table_lookup (params, "USERNAME"));
179         if (dir)
180         {
181             gchar *path;
182             gchar *contents = NULL;
183             GError *error = NULL;
184
185             g_printerr ("dir='%s'\n", dir);
186
187             path = g_build_filename (dir, "data", NULL);
188             if (g_file_get_contents (path, &contents, NULL, &error))
189                 status_notify ("%s READ-SHARED-DATA DATA=%s", greeter_id, contents);
190             else
191                 status_notify ("%s READ-SHARED-DATA ERROR=%s", greeter_id, error->message);
192             g_free (path);
193             g_free (contents);
194             g_clear_error (&error);
195         }
196         else
197             status_notify ("%s READ-SHARED-DATA ERROR=NO_SHARED_DIR", greeter_id);
198     }
199
200     else if (strcmp (name, "WATCH-USER") == 0)
201     {
202         LightDMUser *user;
203         const gchar *username;
204
205         username = g_hash_table_lookup (params, "USERNAME");
206         user = lightdm_user_list_get_user_by_name (lightdm_user_list_get_instance (), username);
207         if (user)
208             g_signal_connect (user, "changed", G_CALLBACK (user_changed_cb), NULL);
209         status_notify ("%s WATCH-USER USERNAME=%s", greeter_id, username);
210     }
211
212     else if (strcmp (name, "LOG-USER") == 0)
213     {
214         LightDMUser *user;
215         const gchar *username, *image, *background, *language, *layout, *session;
216         const gchar * const * layouts;
217         gchar **fields = NULL;
218         gchar *layouts_text;
219         GString *status_text;
220         int i;
221
222         username = g_hash_table_lookup (params, "USERNAME");
223         if (g_hash_table_lookup (params, "FIELDS"))
224             fields = g_strsplit (g_hash_table_lookup (params, "FIELDS"), ",", -1);
225         if (!fields)
226         {
227             fields = g_malloc (sizeof (gchar *) * 1);
228             fields[0] = NULL;
229         }
230
231         user = lightdm_user_list_get_user_by_name (lightdm_user_list_get_instance (), username);
232         image = lightdm_user_get_image (user);
233         background = lightdm_user_get_background (user);
234         language = lightdm_user_get_language (user);
235         layout = lightdm_user_get_layout (user);
236         layouts = lightdm_user_get_layouts (user);
237         layouts_text = g_strjoinv (";", (gchar **) layouts);
238         session = lightdm_user_get_session (user);
239
240         status_text = g_string_new ("");
241         g_string_append_printf (status_text, "%s LOG-USER USERNAME=%s", greeter_id, username);
242         for (i = 0; fields[i]; i++)
243         {
244             if (strcmp (fields[i], "REAL-NAME") == 0)
245                 g_string_append_printf (status_text, " REAL-NAME=%s", lightdm_user_get_real_name (user));
246             else if (strcmp (fields[i], "DISPLAY-NAME") == 0)
247                 g_string_append_printf (status_text, " DISPLAY-NAME=%s", lightdm_user_get_display_name (user));
248             else if (strcmp (fields[i], "IMAGE") == 0)
249                 g_string_append_printf (status_text, " IMAGE=%s", image ? image : "");
250             else if (strcmp (fields[i], "BACKGROUND") == 0)
251                 g_string_append_printf (status_text, " BACKGROUND=%s", background ? background : "");
252             else if (strcmp (fields[i], "LANGUAGE") == 0)
253                 g_string_append_printf (status_text, " LANGUAGE=%s", language ? language : "");
254             else if (strcmp (fields[i], "LAYOUT") == 0)
255                 g_string_append_printf (status_text, " LAYOUT=%s", layout ? layout : "");
256             else if (strcmp (fields[i], "LAYOUTS") == 0)
257                 g_string_append_printf (status_text, " LAYOUTS=%s", layouts_text);
258             else if (strcmp (fields[i], "SESSION") == 0)
259                 g_string_append_printf (status_text, " SESSION=%s", session ? session : "");
260             else if (strcmp (fields[i], "LOGGED-IN") == 0)
261                 g_string_append_printf (status_text, " LOGGED-IN=%s", lightdm_user_get_logged_in (user) ? "TRUE" : "FALSE");
262             else if (strcmp (fields[i], "HAS-MESSAGES") == 0)
263                 g_string_append_printf (status_text, " HAS-MESSAGES=%s", lightdm_user_get_has_messages (user) ? "TRUE" : "FALSE");
264         }
265         g_strfreev (fields);
266         g_free (layouts_text);
267
268         status_notify (status_text->str);
269         g_string_free (status_text, TRUE);
270     }
271
272     else if (strcmp (name, "LOG-USER-LIST") == 0)
273     {
274         GList *users, *link;
275
276         users = lightdm_user_list_get_users (lightdm_user_list_get_instance ());
277         for (link = users; link; link = link->next)
278         {
279             LightDMUser *user = link->data;
280             status_notify ("%s LOG-USER USERNAME=%s", greeter_id, lightdm_user_get_name (user));
281         }
282     }
283
284     else if (strcmp (name, "GET-CAN-SUSPEND") == 0)
285     {
286         gboolean can_suspend = lightdm_get_can_suspend ();
287         status_notify ("%s CAN-SUSPEND ALLOWED=%s", greeter_id, can_suspend ? "TRUE" : "FALSE");
288     }
289
290     else if (strcmp (name, "SUSPEND") == 0)
291     {
292         GError *error = NULL;
293         if (!lightdm_suspend (&error))
294             status_notify ("%s FAIL-SUSPEND", greeter_id);
295         g_clear_error (&error);
296     }
297
298     else if (strcmp (name, "GET-CAN-HIBERNATE") == 0)
299     {
300         gboolean can_hibernate = lightdm_get_can_hibernate ();
301         status_notify ("%s CAN-HIBERNATE ALLOWED=%s", greeter_id, can_hibernate ? "TRUE" : "FALSE");
302     }
303
304     else if (strcmp (name, "HIBERNATE") == 0)
305     {
306         GError *error = NULL;
307         if (!lightdm_hibernate (&error))
308             status_notify ("%s FAIL-HIBERNATE", greeter_id);
309         g_clear_error (&error);
310     }
311
312     else if (strcmp (name, "GET-CAN-RESTART") == 0)
313     {
314         gboolean can_restart = lightdm_get_can_restart ();
315         status_notify ("%s CAN-RESTART ALLOWED=%s", greeter_id, can_restart ? "TRUE" : "FALSE");
316     }
317
318     else if (strcmp (name, "RESTART") == 0)
319     {
320         GError *error = NULL;
321         if (!lightdm_restart (&error))
322             status_notify ("%s FAIL-RESTART", greeter_id);
323         g_clear_error (&error);
324     }
325
326     else if (strcmp (name, "GET-CAN-SHUTDOWN") == 0)
327     {
328         gboolean can_shutdown = lightdm_get_can_shutdown ();
329         status_notify ("%s CAN-SHUTDOWN ALLOWED=%s", greeter_id, can_shutdown ? "TRUE" : "FALSE");
330     }
331
332     else if (strcmp (name, "SHUTDOWN") == 0)
333     {
334         GError *error = NULL;
335         if (!lightdm_shutdown (&error))
336             status_notify ("%s FAIL-SHUTDOWN", greeter_id);
337         g_clear_error (&error);
338     }
339 }
340
341 static void
342 user_added_cb (LightDMUserList *user_list, LightDMUser *user)
343 {
344     status_notify ("%s USER-ADDED USERNAME=%s", greeter_id, lightdm_user_get_name (user));
345 }
346
347 static void
348 user_removed_cb (LightDMUserList *user_list, LightDMUser *user)
349 {
350     status_notify ("%s USER-REMOVED USERNAME=%s", greeter_id, lightdm_user_get_name (user));
351 }
352
353 int
354 main (int argc, char **argv)
355 {
356     gchar *display, *xdg_seat, *xdg_vtnr, *xdg_session_cookie, *xdg_session_class, *mir_socket, *mir_vt, *mir_id;
357     GString *status_text;
358
359 #if !defined(GLIB_VERSION_2_36)
360     g_type_init ();
361 #endif
362
363     display = getenv ("DISPLAY");
364     xdg_seat = getenv ("XDG_SEAT");
365     xdg_vtnr = getenv ("XDG_VTNR");
366     xdg_session_cookie = getenv ("XDG_SESSION_COOKIE");
367     xdg_session_class = getenv ("XDG_SESSION_CLASS");
368     mir_socket = getenv ("MIR_SOCKET");
369     mir_vt = getenv ("MIR_SERVER_VT");
370     mir_id = getenv ("MIR_SERVER_NAME");
371     if (display)
372     {
373         if (display[0] == ':')
374             greeter_id = g_strdup_printf ("GREETER-X-%s", display + 1);
375         else
376             greeter_id = g_strdup_printf ("GREETER-X-%s", display);
377     }
378     else if (mir_id)
379         greeter_id = g_strdup_printf ("GREETER-MIR-%s", mir_id);
380     else if (mir_socket || mir_vt)
381         greeter_id = g_strdup ("GREETER-MIR");
382     else
383         greeter_id = g_strdup ("GREETER-?");
384
385     loop = g_main_loop_new (NULL, FALSE);
386
387     g_unix_signal_add (SIGINT, sigint_cb, NULL);
388     g_unix_signal_add (SIGTERM, sigterm_cb, NULL);
389
390     status_connect (request_cb, greeter_id);
391
392     status_text = g_string_new ("");
393     g_string_printf (status_text, "%s START", greeter_id);
394     if (xdg_seat)
395         g_string_append_printf (status_text, " XDG_SEAT=%s", xdg_seat);
396     if (xdg_vtnr)
397         g_string_append_printf (status_text, " XDG_VTNR=%s", xdg_vtnr);
398     if (xdg_session_cookie)
399         g_string_append_printf (status_text, " XDG_SESSION_COOKIE=%s", xdg_session_cookie);
400     if (xdg_session_class)
401         g_string_append_printf (status_text, " XDG_SESSION_CLASS=%s", xdg_session_class);
402     if (mir_vt > 0)
403         g_string_append_printf (status_text, " MIR_SERVER_VT=%s", mir_vt);
404     status_notify (status_text->str);
405     g_string_free (status_text, TRUE);
406
407     config = g_key_file_new ();
408     g_key_file_load_from_file (config, g_build_filename (g_getenv ("LIGHTDM_TEST_ROOT"), "script", NULL), G_KEY_FILE_NONE, NULL);
409
410     if (g_key_file_has_key (config, "test-greeter-config", "return-value", NULL))
411     {
412         int return_value = g_key_file_get_integer (config, "test-greeter-config", "return-value", NULL);
413         status_notify ("%s EXIT CODE=%d", greeter_id, return_value);
414         return return_value;
415     }
416
417     if (display)
418     {
419         connection = xcb_connect (NULL, NULL);
420         if (xcb_connection_has_error (connection))
421         {
422             status_notify ("%s FAIL-CONNECT-XSERVER", greeter_id);
423             return EXIT_FAILURE;
424         }
425         status_notify ("%s CONNECT-XSERVER", greeter_id);
426     }
427
428     greeter = lightdm_greeter_new ();
429     g_signal_connect (greeter, "show-message", G_CALLBACK (show_message_cb), NULL);
430     g_signal_connect (greeter, "show-prompt", G_CALLBACK (show_prompt_cb), NULL);
431     g_signal_connect (greeter, "authentication-complete", G_CALLBACK (authentication_complete_cb), NULL);
432     g_signal_connect (greeter, "autologin-timer-expired", G_CALLBACK (autologin_timer_expired_cb), NULL);
433
434     if (g_key_file_get_boolean (config, "test-greeter-config", "log-user-changes", NULL))
435     {
436         g_signal_connect (lightdm_user_list_get_instance (), "user-added", G_CALLBACK (user_added_cb), NULL);
437         g_signal_connect (lightdm_user_list_get_instance (), "user-removed", G_CALLBACK (user_removed_cb), NULL);
438     }
439
440     status_notify ("%s CONNECT-TO-DAEMON", greeter_id);
441     if (!lightdm_greeter_connect_sync (greeter, NULL))
442     {
443         status_notify ("%s FAIL-CONNECT-DAEMON", greeter_id);
444         return EXIT_FAILURE;
445     }
446
447     status_notify ("%s CONNECTED-TO-DAEMON", greeter_id);
448
449     if (g_key_file_get_boolean (config, "test-greeter-config", "resettable", NULL))
450     {
451         lightdm_greeter_set_resettable (greeter, TRUE);
452         g_signal_connect (greeter, "idle", G_CALLBACK (idle_cb), NULL);
453         g_signal_connect (greeter, "reset", G_CALLBACK (reset_cb), NULL);
454     }
455
456     print_hints (greeter);
457
458     g_main_loop_run (loop);
459
460     return EXIT_SUCCESS;
461 }