5 #include <glib-object.h>
7 #include <QLightDM/Greeter>
8 #include <QLightDM/Power>
9 #include <QLightDM/UsersModel>
10 #include <QtCore/QSettings>
11 #include <QtCore/QDebug>
12 #include <QtCore/QCoreApplication>
14 #include "test-qt-greeter.h"
17 static gchar *greeter_id;
18 static QCoreApplication *app = NULL;
19 static QSettings *config = NULL;
20 static QLightDM::PowerInterface *power = NULL;
21 static TestGreeter *greeter = NULL;
22 static QLightDM::UsersModel *users_model = NULL;
24 TestGreeter::TestGreeter ()
26 connect (this, SIGNAL(showMessage(QString, QLightDM::Greeter::MessageType)), SLOT(showMessage(QString, QLightDM::Greeter::MessageType)));
27 connect (this, SIGNAL(showPrompt(QString, QLightDM::Greeter::PromptType)), SLOT(showPrompt(QString, QLightDM::Greeter::PromptType)));
28 connect (this, SIGNAL(authenticationComplete()), SLOT(authenticationComplete()));
29 connect (this, SIGNAL(autologinTimerExpired()), SLOT(autologinTimerExpired()));
32 void TestGreeter::showMessage (QString text, QLightDM::Greeter::MessageType type)
34 status_notify ("%s SHOW-MESSAGE TEXT=\"%s\"", greeter_id, text.toAscii ().constData ());
37 void TestGreeter::showPrompt (QString text, QLightDM::Greeter::PromptType type)
39 status_notify ("%s SHOW-PROMPT TEXT=\"%s\"", greeter_id, text.toAscii ().constData ());
42 void TestGreeter::authenticationComplete ()
44 if (authenticationUser () != "")
45 status_notify ("%s AUTHENTICATION-COMPLETE USERNAME=%s AUTHENTICATED=%s",
47 authenticationUser ().toAscii ().constData (), isAuthenticated () ? "TRUE" : "FALSE");
49 status_notify ("%s AUTHENTICATION-COMPLETE AUTHENTICATED=%s", greeter_id, isAuthenticated () ? "TRUE" : "FALSE");
52 void TestGreeter::autologinTimerExpired ()
54 status_notify ("%s AUTOLOGIN-TIMER-EXPIRED", greeter_id);
57 void TestGreeter::printHints ()
59 if (selectUserHint() != "")
60 status_notify ("%s SELECT-USER-HINT USERNAME=%s", greeter_id, greeter->selectUserHint ().toAscii ().constData ());
61 if (selectGuestHint())
62 status_notify ("%s SELECT-GUEST-HINT", greeter_id);
64 status_notify ("%s LOCK-HINT", greeter_id);
65 if (!hasGuestAccountHint ())
66 status_notify ("%s HAS-GUEST-ACCOUNT-HINT=FALSE", greeter_id);
68 status_notify ("%s HIDE-USERS-HINT", greeter_id);
69 if (showManualLoginHint ())
70 status_notify ("%s SHOW-MANUAL-LOGIN-HINT", greeter_id);
71 if (!showRemoteLoginHint ())
72 status_notify ("%s SHOW-REMOTE-LOGIN-HINT=FALSE", greeter_id);
76 void TestGreeter::idle ()
78 status_notify ("%s IDLE", greeter_id);
81 void TestGreeter::reset ()
83 status_notify ("%s RESET", greeter_id);
87 void TestGreeter::userRowsInserted (const QModelIndex & parent, int start, int end)
89 for (int i = start; i <= end; i++)
91 QString name = users_model->data (users_model->index (i, 0), QLightDM::UsersModel::NameRole).toString ();
92 status_notify ("%s USER-ADDED USERNAME=%s", greeter_id, qPrintable (name));
96 void TestGreeter::userRowsRemoved (const QModelIndex & parent, int start, int end)
98 for (int i = start; i <= end; i++)
100 QString name = users_model->data (users_model->index (i, 0), QLightDM::UsersModel::NameRole).toString ();
101 status_notify ("%s USER-REMOVED USERNAME=%s", greeter_id, qPrintable (name));
106 signal_cb (int signum)
108 status_notify ("%s TERMINATE SIGNAL=%d", greeter_id, signum);
109 _exit (EXIT_SUCCESS);
113 request_cb (const gchar *name, GHashTable *params)
123 if (strcmp (name, "AUTHENTICATE") == 0)
125 if (g_hash_table_lookup (params, "USERNAME"))
126 greeter->authenticate ((const gchar *) g_hash_table_lookup (params, "USERNAME"));
128 greeter->authenticate ();
131 else if (strcmp (name, "AUTHENTICATE-GUEST") == 0)
132 greeter->authenticateAsGuest ();
134 else if (strcmp (name, "AUTHENTICATE-AUTOLOGIN") == 0)
135 greeter->authenticateAutologin ();
137 else if (strcmp (name, "AUTHENTICATE-REMOTE") == 0)
138 greeter->authenticateRemote ((const gchar *) g_hash_table_lookup (params, "SESSION"), NULL);
140 else if (strcmp (name, "RESPOND") == 0)
141 greeter->respond ((const gchar *) g_hash_table_lookup (params, "TEXT"));
143 else if (strcmp (name, "CANCEL-AUTHENTICATION") == 0)
144 greeter->cancelAuthentication ();
146 else if (strcmp (name, "START-SESSION") == 0)
148 if (g_hash_table_lookup (params, "SESSION"))
150 if (!greeter->startSessionSync ((const gchar *) g_hash_table_lookup (params, "SESSION")))
151 status_notify ("%s SESSION-FAILED", greeter_id);
155 if (!greeter->startSessionSync ())
156 status_notify ("%s SESSION-FAILED", greeter_id);
160 else if (strcmp (name, "LOG-USER-LIST-LENGTH") == 0)
161 status_notify ("%s LOG-USER-LIST-LENGTH N=%d", greeter_id, users_model->rowCount (QModelIndex ()));
163 else if (strcmp (name, "LOG-USER") == 0)
165 const gchar *username = (const gchar *) g_hash_table_lookup (params, "USERNAME");
166 for (int i = 0; i < users_model->rowCount (QModelIndex ()); i++)
168 QString name = users_model->data (users_model->index (i, 0), QLightDM::UsersModel::NameRole).toString ();
169 if (name == username)
170 status_notify ("%s LOG-USER USERNAME=%s", greeter_id, qPrintable (name));
174 else if (strcmp (name, "LOG-USER-LIST") == 0)
176 for (int i = 0; i < users_model->rowCount (QModelIndex ()); i++)
178 QString name = users_model->data (users_model->index (i, 0), QLightDM::UsersModel::NameRole).toString ();
179 status_notify ("%s LOG-USER USERNAME=%s", greeter_id, qPrintable (name));
183 else if (strcmp (name, "GET-CAN-SUSPEND") == 0)
185 gboolean can_suspend = power->canSuspend ();
186 status_notify ("%s CAN-SUSPEND ALLOWED=%s", greeter_id, can_suspend ? "TRUE" : "FALSE");
189 else if (strcmp (name, "SUSPEND") == 0)
191 if (!power->suspend ())
192 status_notify ("%s FAIL-SUSPEND", greeter_id);
195 else if (strcmp (name, "GET-CAN-HIBERNATE") == 0)
197 gboolean can_hibernate = power->canHibernate ();
198 status_notify ("%s CAN-HIBERNATE ALLOWED=%s", greeter_id, can_hibernate ? "TRUE" : "FALSE");
201 else if (strcmp (name, "HIBERNATE") == 0)
203 if (!power->hibernate ())
204 status_notify ("%s FAIL-HIBERNATE", greeter_id);
207 else if (strcmp (name, "GET-CAN-RESTART") == 0)
209 gboolean can_restart = power->canRestart ();
210 status_notify ("%s CAN-RESTART ALLOWED=%s", greeter_id, can_restart ? "TRUE" : "FALSE");
213 else if (strcmp (name, "RESTART") == 0)
215 if (!power->restart ())
216 status_notify ("%s FAIL-RESTART", greeter_id);
219 else if (strcmp (name, "GET-CAN-SHUTDOWN") == 0)
221 gboolean can_shutdown = power->canShutdown ();
222 status_notify ("%s CAN-SHUTDOWN ALLOWED=%s", greeter_id, can_shutdown ? "TRUE" : "FALSE");
225 else if (strcmp (name, "SHUTDOWN") == 0)
227 if (!power->shutdown ())
228 status_notify ("%s FAIL-SHUTDOWN", greeter_id);
233 main(int argc, char *argv[])
235 gchar *display, *xdg_seat, *xdg_vtnr, *xdg_session_cookie, *xdg_session_class;
236 GString *status_text;
238 #if !defined(GLIB_VERSION_2_36)
242 display = getenv ("DISPLAY");
243 xdg_seat = getenv ("XDG_SEAT");
244 xdg_vtnr = getenv ("XDG_VTNR");
245 xdg_session_cookie = getenv ("XDG_SESSION_COOKIE");
246 xdg_session_class = getenv ("XDG_SESSION_CLASS");
249 if (display[0] == ':')
250 greeter_id = g_strdup_printf ("GREETER-X-%s", display + 1);
252 greeter_id = g_strdup_printf ("GREETER-X-%s", display);
255 greeter_id = g_strdup ("GREETER-?");
257 status_connect (request_cb, greeter_id);
259 app = new QCoreApplication (argc, argv);
261 signal (SIGINT, signal_cb);
262 signal (SIGTERM, signal_cb);
264 status_text = g_string_new ("");
265 g_string_printf (status_text, "%s START", greeter_id);
267 g_string_append_printf (status_text, " XDG_SEAT=%s", xdg_seat);
269 g_string_append_printf (status_text, " XDG_VTNR=%s", xdg_vtnr);
270 if (xdg_session_cookie)
271 g_string_append_printf (status_text, " XDG_SESSION_COOKIE=%s", xdg_session_cookie);
272 if (xdg_session_class)
273 g_string_append_printf (status_text, " XDG_SESSION_CLASS=%s", xdg_session_class);
274 status_notify (status_text->str);
275 g_string_free (status_text, TRUE);
277 config = new QSettings (g_build_filename (getenv ("LIGHTDM_TEST_ROOT"), "script", NULL), QSettings::IniFormat);
281 xcb_connection_t *connection = xcb_connect (NULL, NULL);
282 if (xcb_connection_has_error (connection))
284 status_notify ("%s FAIL-CONNECT-XSERVER", greeter_id);
287 status_notify ("%s CONNECT-XSERVER", greeter_id);
290 power = new QLightDM::PowerInterface();
292 greeter = new TestGreeter();
294 users_model = new QLightDM::UsersModel();
295 if (config->value ("test-greeter-config/log-user-changes", "false") == "true")
297 QObject::connect (users_model, SIGNAL(rowsInserted(const QModelIndex&, int, int)), greeter, SLOT(userRowsInserted(const QModelIndex&, int, int)));
298 QObject::connect (users_model, SIGNAL(rowsAboutToBeRemoved(const QModelIndex&, int, int)), greeter, SLOT(userRowsRemoved(const QModelIndex&, int, int)));
301 if (config->value ("test-greeter-config/resettable", "false") == "true")
303 greeter->setResettable (true);
304 QObject::connect (greeter, SIGNAL(idle()), greeter, SLOT(idle()));
305 QObject::connect (greeter, SIGNAL(reset()), greeter, SLOT(reset()));
308 status_notify ("%s CONNECT-TO-DAEMON", greeter_id);
309 if (!greeter->connectSync())
311 status_notify ("%s FAIL-CONNECT-DAEMON", greeter_id);
315 status_notify ("%s CONNECTED-TO-DAEMON", greeter_id);
317 greeter->printHints();