diff options
author | Jesús González <jgonzalez@gdr-sistemas.com> | 2014-11-27 04:02:29 +0100 |
---|---|---|
committer | Jesús González <jgonzalez@gdr-sistemas.com> | 2014-11-27 04:02:29 +0100 |
commit | 587b21e9209541bc6714449b1ad4ee6721310a8b (patch) | |
tree | b3f810030a5a4586b1c15533364b41593ca84ea4 /tests | |
parent | 8c983e2dc4a2ff013c3ae01532fd872b93100ee5 (diff) | |
download | lightdm-587b21e9209541bc6714449b1ad4ee6721310a8b.tar.gz |
Added a test that checks that a seat is locked properly when it has been unlocked by switching back to the user session and using the screensaver to unlock it (bug #1371378).
Diffstat (limited to 'tests')
-rw-r--r-- | tests/Makefile.am | 1 | ||||
-rw-r--r-- | tests/scripts/lock-seat-after-vt-switch.conf | 86 | ||||
-rw-r--r-- | tests/src/test-runner.c | 52 | ||||
-rwxr-xr-x | tests/test-lock-seat-after-vt-switch | 2 |
4 files changed, 141 insertions, 0 deletions
diff --git a/tests/Makefile.am b/tests/Makefile.am index 8bfd1add..70e35bba 100644 --- a/tests/Makefile.am +++ b/tests/Makefile.am @@ -129,6 +129,7 @@ TESTS = \ test-upstart-login \ test-dbus \ test-lock-seat \ + test-lock-seat-after-vt-switch \ test-lock-seat-resettable \ test-lock-seat-return-session \ test-lock-session \ diff --git a/tests/scripts/lock-seat-after-vt-switch.conf b/tests/scripts/lock-seat-after-vt-switch.conf new file mode 100644 index 00000000..82266db8 --- /dev/null +++ b/tests/scripts/lock-seat-after-vt-switch.conf @@ -0,0 +1,86 @@ +# +# Check that a seat is locked properly when it has been unlocked by switching +# back to the user session and using the screensaver to unlock it. +# + +[SeatDefaults] +autologin-user=have-password1 +user-session=default + +#?*START-DAEMON +#?RUNNER DAEMON-START + +# X server starts +#?XSERVER-0 START VT=7 SEAT=seat0 + +# Daemon connects when X server is ready +#?*XSERVER-0 INDICATE-READY +#?XSERVER-0 INDICATE-READY +#?XSERVER-0 ACCEPT-CONNECT + +# Session starts +#?SESSION-X-0 START XDG_SEAT=seat0 XDG_VTNR=7 XDG_GREETER_DATA_DIR=.*/have-password1 XDG_SESSION_TYPE=x11 XDG_SESSION_DESKTOP=default USER=have-password1 +#?LOGIN1 ACTIVATE-SESSION SESSION=c0 +#?XSERVER-0 ACCEPT-CONNECT +#?SESSION-X-0 CONNECT-XSERVER + +# Lock the seat +#?*SESSION-X-0 LOCK-SEAT +#?SESSION-X-0 LOCK-SEAT + +# New X server starts +#?XSERVER-1 START VT=8 SEAT=seat0 + +# Daemon connects when X server is ready +#?*XSERVER-1 INDICATE-READY +#?XSERVER-1 INDICATE-READY +#?XSERVER-1 ACCEPT-CONNECT + +# Session is locked +#?LOGIN1 LOCK-SESSION SESSION=c0 + +# Greeter starts +#?GREETER-X-1 START XDG_SEAT=seat0 XDG_VTNR=8 XDG_SESSION_CLASS=greeter +#?XSERVER-1 ACCEPT-CONNECT +#?GREETER-X-1 CONNECT-XSERVER +#?GREETER-X-1 CONNECT-TO-DAEMON +#?GREETER-X-1 CONNECTED-TO-DAEMON +#?GREETER-X-1 LOCK-HINT + +# Session is switched to greeter +#?LOGIN1 ACTIVATE-SESSION SESSION=c1 +#?VT ACTIVATE VT=8 + +# External program switches back to the first session +#?*UPDATE-SEAT ID=seat0 ACTIVE-SESSION=c0 + +# Session is unlocked using the screensaver +#?*UNLOCK-SESSION SESSION=c0 +#?RUNNER UNLOCK-SESSION SESSION=c0 + +# Lock the seat again +#?*SESSION-X-0 LOCK-SEAT +#?SESSION-X-0 LOCK-SEAT + +# New X server starts (this is a "bug") +#?XSERVER-2 START VT=9 SEAT=seat0 +#?*XSERVER-2 INDICATE-READY +#?XSERVER-2 INDICATE-READY +#?XSERVER-2 ACCEPT-CONNECT + +# Session is locked +#?LOGIN1 LOCK-SESSION SESSION=c0 + +# Session is switched to greeter +#?LOGIN1 ACTIVATE-SESSION SESSION=c1 + +# The unnecessary X server is killed +#?XSERVER-2 TERMINATE SIGNAL=15 + +# Cleanup +#?*STOP-DAEMON +#?SESSION-X-0 TERMINATE SIGNAL=15 +#?XSERVER-0 TERMINATE SIGNAL=15 +#?GREETER-X-1 TERMINATE SIGNAL=15 +#?XSERVER-1 TERMINATE SIGNAL=15 +#?RUNNER DAEMON-EXIT STATUS=0 diff --git a/tests/src/test-runner.c b/tests/src/test-runner.c index abad4865..4c62e6fa 100644 --- a/tests/src/test-runner.c +++ b/tests/src/test-runner.c @@ -110,6 +110,7 @@ typedef struct gchar *path; gboolean can_graphical; gboolean can_multi_session; + gchar *active_session; } Login1Seat; static GList *login1_seats = NULL; @@ -142,6 +143,7 @@ static void check_status (const gchar *status); static AccountsUser *get_accounts_user_by_uid (guint uid); static AccountsUser *get_accounts_user_by_name (const gchar *username); static void accounts_user_set_hidden (AccountsUser *user, gboolean hidden, gboolean emit_signal); +static Login1Session *find_login1_session (const gchar *id); static gboolean kill_timeout_cb (gpointer data) @@ -567,6 +569,13 @@ handle_command (const gchar *command) seat->can_multi_session = strcmp (v, "TRUE") == 0; g_variant_builder_add (&invalidated_properties, "s", "CanMultiSession"); } + v = g_hash_table_lookup (params, "ACTIVE-SESSION"); + if (v) + { + g_free (seat->active_session); + seat->active_session = g_strdup (v); + g_variant_builder_add (&invalidated_properties, "s", "ActiveSession"); + } g_dbus_connection_emit_signal (g_bus_get_sync (G_BUS_TYPE_SYSTEM, NULL, NULL), NULL, @@ -917,6 +926,26 @@ handle_command (const gchar *command) check_status (status_text); g_free (status_text); } + else if (strcmp (name, "UNLOCK-SESSION") == 0) + { + gchar *status_text, *id; + Login1Session *session; + + id = g_hash_table_lookup (params, "SESSION"); + session = find_login1_session (id); + if (session) + { + if (!session->locked) + g_warning ("Session %s is not locked", id); + session->locked = FALSE; + } + else + g_warning ("Unknown session %s", id); + + status_text = g_strdup_printf ("RUNNER UNLOCK-SESSION SESSION=%s", id); + check_status (status_text); + g_free (status_text); + } /* Forward to external processes */ else if (g_str_has_prefix (name, "SESSION-") || g_str_has_prefix (name, "GREETER-") || @@ -962,6 +991,10 @@ run_commands (void) statuses = g_list_append (statuses, g_strdup (line->text)); line->done = TRUE; + + if (getenv ("DEBUG")) + g_print ("%s\n", line->text); + handle_command (line->text + 1); } @@ -1481,6 +1514,22 @@ handle_login1_seat_get_property (GDBusConnection *connection, return g_variant_new_boolean (seat->can_multi_session); else if (strcmp (property_name, "Id") == 0) return g_variant_new_string (seat->id); + else if (strcmp (property_name, "ActiveSession") == 0) + { + if (seat->active_session) + { + gchar *path; + GVariant *ret; + + path = g_strdup_printf ("/org/freedesktop/login1/session/%s", seat->active_session); + ret = g_variant_new ("(so)", seat->active_session, path); + g_free (path); + + return ret; + } + else + return NULL; + } else return NULL; } @@ -1497,6 +1546,7 @@ add_login1_seat (GDBusConnection *connection, const gchar *id, gboolean emit_sig " <interface name='org.freedesktop.login1.Seat'>" " <property name='CanGraphical' type='b' access='read'/>" " <property name='CanMultiSession' type='b' access='read'/>" + " <property name='ActiveSession' type='(so)' access='read'/>" " <property name='Id' type='s' access='read'/>" " </interface>" "</node>"; @@ -1512,6 +1562,7 @@ add_login1_seat (GDBusConnection *connection, const gchar *id, gboolean emit_sig seat->path = g_strdup_printf ("/org/freedesktop/login1/seat/%s", seat->id); seat->can_graphical = TRUE; seat->can_multi_session = TRUE; + seat->active_session = NULL; login1_seat_info = g_dbus_node_info_new_for_xml (login1_seat_interface, &error); if (error) @@ -1589,6 +1640,7 @@ remove_login1_seat (GDBusConnection *connection, const gchar *id) login1_seats = g_list_remove (login1_seats, seat); g_free (seat->id); g_free (seat->path); + g_free (seat->active_session); g_free (seat); } diff --git a/tests/test-lock-seat-after-vt-switch b/tests/test-lock-seat-after-vt-switch new file mode 100755 index 00000000..1689fe3d --- /dev/null +++ b/tests/test-lock-seat-after-vt-switch @@ -0,0 +1,2 @@ +#!/bin/sh +./src/dbus-env ./src/test-runner lock-seat-after-vt-switch test-gobject-greeter |