]> rtime.felk.cvut.cz Git - sojka/lightdm.git/commitdiff
Test that trying to start a Mir session from a VT seat does the right thing
authorRobert Ancell <robert.ancell@canonical.com>
Fri, 26 Jul 2013 05:14:58 +0000 (17:14 +1200)
committerRobert Ancell <robert.ancell@canonical.com>
Fri, 26 Jul 2013 05:14:58 +0000 (17:14 +1200)
13 files changed:
src/seat.c
tests/Makefile.am
tests/scripts/mir-autologin.conf
tests/scripts/mir-greeter-mir-session.conf [deleted file]
tests/scripts/mir-greeter-x-session.conf [deleted file]
tests/scripts/mir-greeter.conf [new file with mode: 0644]
tests/scripts/mir-session.conf [moved from tests/scripts/mir-session-x-greeter.conf with 70% similarity]
tests/test-mir-autologin
tests/test-mir-greeter [new file with mode: 0755]
tests/test-mir-greeter-mir-session [deleted file]
tests/test-mir-greeter-x-session [deleted file]
tests/test-mir-session [new file with mode: 0755]
tests/test-mir-session-x-greeter [deleted file]

index 8efe04b934a06b7cc90b3c8f0314851b43ab58bb..3861cded365d836811d3f8699989c728f2053574 100644 (file)
@@ -47,6 +47,9 @@ struct SeatPrivate
 
     /* The session to set active when it starts */
     Session *session_to_activate;
+  
+    /* TRUE once we have started */
+    gboolean started;
 
     /* TRUE if stopping this seat (waiting for displays to stop) */
     gboolean stopping;
@@ -318,7 +321,7 @@ display_server_stopped_cb (DisplayServer *display_server, Seat *seat)
     g_signal_handlers_disconnect_matched (display_server, G_SIGNAL_MATCH_DATA, 0, 0, NULL, NULL, seat);
     seat->priv->display_servers = g_list_remove (seat->priv->display_servers, display_server);
 
-    if (seat->priv->stopping)
+    if (seat->priv->stopping || !seat->priv->started)
     {
         check_stopped (seat);
         g_object_unref (display_server);
@@ -495,7 +498,15 @@ session_stopped_cb (Session *session, Seat *seat)
 
     g_debug ("Session stopped");
 
+    g_signal_handlers_disconnect_matched (session, G_SIGNAL_MATCH_DATA, 0, 0, NULL, NULL, seat);
+    seat->priv->sessions = g_list_remove (seat->priv->sessions, session);
+
     display_server = session_get_display_server (session);
+    if (!display_server)
+    {
+        g_object_unref (session);
+        return;
+    }
 
     /* Cleanup */
     if (!IS_GREETER (session))
@@ -506,9 +517,6 @@ session_stopped_cb (Session *session, Seat *seat)
             run_script (seat, display_server, script, session_get_user (session));
     }
 
-    g_signal_handlers_disconnect_matched (session, G_SIGNAL_MATCH_DATA, 0, 0, NULL, NULL, seat);
-    seat->priv->sessions = g_list_remove (seat->priv->sessions, session);
-
     /* We were waiting for this session, but it didn't start :( */
     // FIXME: Start a greeter on this?
     if (session == seat->priv->session_to_activate)
@@ -1082,6 +1090,9 @@ create_display_server (Seat *seat, const gchar *session_type)
     g_debug ("Creating display server of type %s", session_type);
 
     display_server = SEAT_GET_CLASS (seat)->create_display_server (seat, session_type);
+    if (!display_server)
+        return NULL;
+
     seat->priv->display_servers = g_list_append (seat->priv->display_servers, display_server);
     g_signal_connect (display_server, "ready", G_CALLBACK (display_server_ready_cb), seat);
     g_signal_connect (display_server, "stopped", G_CALLBACK (display_server_stopped_cb), seat);
@@ -1307,13 +1318,13 @@ seat_real_start (Seat *seat)
     gboolean autologin_guest;
     gboolean autologin_in_background;
     Session *session = NULL, *background_session = NULL;
-    DisplayServer *display_server;
 
     g_debug ("Starting seat");
 
     /* If this display server doesn't have a session running on it, just start it */
     if (!get_start_local_sessions (seat))
     {
+        DisplayServer *display_server;
         display_server = create_display_server (seat, "x"); // FIXME: Not necessarily an X seat, but not sure what to put here
         return display_server_start (display_server);
     }
@@ -1333,14 +1344,9 @@ seat_real_start (Seat *seat)
             session = create_guest_session (seat);
         else if (autologin_username != NULL)
             session = create_user_session (seat, autologin_username);
-      
+
         if (session)
-        {
-            if (seat->priv->session_to_activate)
-                g_object_unref (seat->priv->session_to_activate);
-            seat->priv->session_to_activate = g_object_ref (session);
             session_set_pam_service (session, AUTOLOGIN_SERVICE);
-        }
 
         /* Load in background if required */
         if (autologin_in_background && session)
@@ -1348,14 +1354,41 @@ seat_real_start (Seat *seat)
             background_session = session;
             session = NULL;
         }
+      
+        if (session)
+        {
+            DisplayServer *display_server;
+
+            if (seat->priv->session_to_activate)
+                g_object_unref (seat->priv->session_to_activate);
+            seat->priv->session_to_activate = g_object_ref (session);
+
+            display_server = create_display_server (seat, session_get_session_type (session));
+            session_set_display_server (session, display_server);
+            if (!display_server || !display_server_start (display_server))
+            {
+                g_debug ("Can't create display server for automatic login");
+                session_stop (session);
+                if (display_server)
+                    display_server_stop (display_server);
+                session = NULL;
+            }
+        }
     }
 
     /* Fallback to a greeter */
     if (!session)
     {
         Greeter *greeter_session;
+        DisplayServer *display_server;
 
         greeter_session = create_greeter_session (seat);
+        if (!greeter_session)
+        {
+            g_debug ("Failed to create greeter session");
+            return FALSE;
+        }
+
         if (seat->priv->session_to_activate)
             g_object_unref (seat->priv->session_to_activate);
         seat->priv->session_to_activate = g_object_ref (greeter_session);
@@ -1373,6 +1406,17 @@ seat_real_start (Seat *seat)
             if (autologin_guest)
                 greeter_set_hint (greeter_session, "autologin-guest", "true");
         }
+
+        display_server = create_display_server (seat, session_get_session_type (session));
+        session_set_display_server (session, display_server);
+        if (!display_server || !display_server_start (display_server))
+        {
+            g_debug ("Can't create display server for greeter");
+            session_stop (session);
+            if (display_server)
+                display_server_stop (display_server);
+            session = NULL;
+        }
     }
 
     /* Fail if can't start a session */
@@ -1382,15 +1426,6 @@ seat_real_start (Seat *seat)
         return FALSE;
     }
 
-    display_server = create_display_server (seat, session_get_session_type (session));
-    if (!display_server)
-        return FALSE;
-
-    /* Start display server to show session on */
-    session_set_display_server (session, display_server);
-    if (!display_server_start (display_server))
-        return FALSE;
-
     /* Start background session */
     if (background_session)
     {
@@ -1402,6 +1437,7 @@ seat_real_start (Seat *seat)
             g_warning ("Failed to start display server for background session");
     }
 
+    seat->priv->started = TRUE;
     return TRUE;
 }
 
index 887ddfe9420b050f9c489552d8f169b6d63fe93d..3204e2dcc6cb9af38776348cc2bec3ed7a51b4ea 100644 (file)
@@ -135,9 +135,8 @@ TESTS = \
        test-open-file-descriptors \
        test-xdmcp-server-open-file-descriptors \
        test-mir-autologin \
-       test-mir-greeter-x-session \
-       test-mir-greeter-mir-session \
-       test-mir-session-x-greeter \
+       test-mir-greeter \
+       test-mir-session \
        test-unity-compositor-command \
        test-unity-compositor-fail-start \
        test-unity-compositor-fail-ready \
@@ -355,9 +354,8 @@ EXTRA_DIST = \
        scripts/login-wrong-password.conf \
        scripts/login-xserver-crash.conf \
        scripts/mir-autologin.conf \
-       scripts/mir-greeter-x-session.conf \
-       scripts/mir-greeter-mir-session.conf \
-       scripts/mir-session-x-greeter.conf \
+       scripts/mir-greeter.conf \
+       scripts/mir-session.conf \
        scripts/no-accounts-service.conf \
        scripts/no-config.conf \
        scripts/no-console-kit.conf \
index f2a122c3c9f39c37dd616a0fe2114db91b002edc..b055b56fb88ddfb80109895004c06abdbd8be024 100644 (file)
@@ -1,5 +1,5 @@
 #
-# Check can run automatically log into a Mir session
+# Check can't automatically log into a Mir session from a VT based seat
 #
 
 [SeatDefaults]
@@ -8,10 +8,25 @@ user-session=mir
 
 #?RUNNER DAEMON-START
 
-# Session starts
-#?SESSION-MIR START VT=7 USER=have-password1
+# (session fails to start)
+
+# X server starts
+#?XSERVER-0 START VT=7
+
+# Daemon connects when X server is ready
+#?*XSERVER-0 INDICATE-READY
+#?XSERVER-0 INDICATE-READY
+#?XSERVER-0 ACCEPT-CONNECT
+
+# Greeter starts
+#?GREETER-X-0 START
+#?XSERVER-0 ACCEPT-CONNECT
+#?GREETER-X-0 CONNECT-XSERVER
+#?GREETER-X-0 CONNECT-TO-DAEMON
+#?GREETER-X-0 CONNECTED-TO-DAEMON
 
 # Cleanup
 #?*STOP-DAEMON
-#?SESSION-MIR TERMINATE SIGNAL=15
+#?GREETER-X-0 TERMINATE SIGNAL=15
+#?XSERVER-0 TERMINATE SIGNAL=15
 #?RUNNER DAEMON-EXIT STATUS=0
diff --git a/tests/scripts/mir-greeter-mir-session.conf b/tests/scripts/mir-greeter-mir-session.conf
deleted file mode 100644 (file)
index 9d03c2a..0000000
+++ /dev/null
@@ -1,32 +0,0 @@
-#
-# Check can run a Mir greeter and log into a Mir session
-#
-
-[SeatDefaults]
-user-session=mir
-
-#?RUNNER DAEMON-START
-
-# Greeter starts
-#?GREETER-MIR START VT=7
-#?GREETER-MIR CONNECT-TO-DAEMON
-#?GREETER-MIR CONNECTED-TO-DAEMON
-
-# Log into account
-#?*GREETER-MIR AUTHENTICATE USERNAME=no-password1
-#?GREETER-MIR AUTHENTICATION-COMPLETE USERNAME=no-password1 AUTHENTICATED=TRUE
-#?*GREETER-MIR START-SESSION
-
-# Session starts
-#?SESSION-MIR START VT=8 USER=no-password1
-
-# Switch to session
-#?VT ACTIVATE VT=8
-
-# Greeter quits once session ready
-#?GREETER-MIR TERMINATE SIGNAL=15
-
-# Cleanup
-#?*STOP-DAEMON
-#?SESSION-MIR TERMINATE SIGNAL=15
-#?RUNNER DAEMON-EXIT STATUS=0
diff --git a/tests/scripts/mir-greeter-x-session.conf b/tests/scripts/mir-greeter-x-session.conf
deleted file mode 100644 (file)
index fd809db..0000000
+++ /dev/null
@@ -1,43 +0,0 @@
-#
-# Check can run a Mir greeter and log into an X session
-#
-
-[SeatDefaults]
-user-session=default
-
-#?RUNNER DAEMON-START
-
-# Greeter starts
-#?GREETER-MIR START VT=7
-#?GREETER-MIR CONNECT-TO-DAEMON
-#?GREETER-MIR CONNECTED-TO-DAEMON
-
-# Log into account
-#?*GREETER-MIR AUTHENTICATE USERNAME=no-password1
-#?GREETER-MIR AUTHENTICATION-COMPLETE USERNAME=no-password1 AUTHENTICATED=TRUE
-#?*GREETER-MIR START-SESSION
-
-# X server starts for session
-#?XSERVER-0 START VT=8
-
-# Daemon connects when X server is ready
-#?*XSERVER-0 INDICATE-READY
-#?XSERVER-0 INDICATE-READY
-#?XSERVER-0 ACCEPT-CONNECT
-
-# Switch to session
-#?VT ACTIVATE VT=8
-
-# Greeter terminates
-#?GREETER-MIR TERMINATE SIGNAL=15
-
-# Session starts
-#?SESSION-X-0 START USER=no-password1
-#?XSERVER-0 ACCEPT-CONNECT
-#?SESSION-X-0 CONNECT-XSERVER
-
-# Cleanup
-#?*STOP-DAEMON
-#?SESSION-X-0 TERMINATE SIGNAL=15
-#?XSERVER-0 TERMINATE SIGNAL=15
-#?RUNNER DAEMON-EXIT STATUS=0
diff --git a/tests/scripts/mir-greeter.conf b/tests/scripts/mir-greeter.conf
new file mode 100644 (file)
index 0000000..6e78d3b
--- /dev/null
@@ -0,0 +1,10 @@
+#
+# Check can't run a Mir greeter from a VT based seat
+#
+
+#?RUNNER DAEMON-START
+
+# (greeter fails to start)
+
+# Daemon stops with error
+#?RUNNER DAEMON-EXIT STATUS=1
similarity index 70%
rename from tests/scripts/mir-session-x-greeter.conf
rename to tests/scripts/mir-session.conf
index fa1ed4e83010d069f7455943540b5f5ce9c1f730..6121b8e01fb9ec571d919ee335e97d5d02d9ad3b 100644 (file)
@@ -1,5 +1,5 @@
 #
-# Check can login to a Mir session from an X greeter
+# Check can't login into a Mir session on a VT based seat
 #
 
 [SeatDefaults]
@@ -22,22 +22,13 @@ user-session=mir
 #?GREETER-X-0 CONNECT-TO-DAEMON
 #?GREETER-X-0 CONNECTED-TO-DAEMON
 
-# Log into account
+# Attempt to log into account
 #?*GREETER-X-0 AUTHENTICATE USERNAME=no-password1
 #?GREETER-X-0 AUTHENTICATION-COMPLETE USERNAME=no-password1 AUTHENTICATED=TRUE
-#?*GREETER-X-0 START-SESSION
-
-# Session starts
-#?SESSION-MIR START VT=8 USER=no-password1
-
-# Switch to session
-#?VT ACTIVATE VT=8
-
-# Greeter quits once session ready
-#?GREETER-X-0 TERMINATE SIGNAL=15
-#?XSERVER-0 TERMINATE SIGNAL=15
+#?*GREETER-X-0 SESSION-FAILED
 
 # Cleanup
 #?*STOP-DAEMON
-#?SESSION-MIR TERMINATE SIGNAL=15
+#?GREETER-X-0 TERMINATE SIGNAL=15
+#?XSERVER-0 TERMINATE SIGNAL=15
 #?RUNNER DAEMON-EXIT STATUS=0
index 1a1e016fa153be2c402050691294db0035f31aff..54ef65a887c2ae7450c2e5c0f8fbf2ef18652b8a 100755 (executable)
@@ -1,2 +1,2 @@
 #!/bin/sh
-./src/dbus-env ./src/test-runner mir-autologin test-mir-greeter
+./src/dbus-env ./src/test-runner mir-autologin test-gobject-greeter
diff --git a/tests/test-mir-greeter b/tests/test-mir-greeter
new file mode 100755 (executable)
index 0000000..c57235d
--- /dev/null
@@ -0,0 +1,2 @@
+#!/bin/sh
+./src/dbus-env ./src/test-runner mir-greeter test-mir-greeter
diff --git a/tests/test-mir-greeter-mir-session b/tests/test-mir-greeter-mir-session
deleted file mode 100755 (executable)
index 1837e85..0000000
+++ /dev/null
@@ -1,2 +0,0 @@
-#!/bin/sh
-./src/dbus-env ./src/test-runner mir-greeter-mir-session test-mir-greeter
diff --git a/tests/test-mir-greeter-x-session b/tests/test-mir-greeter-x-session
deleted file mode 100755 (executable)
index 3c54281..0000000
+++ /dev/null
@@ -1,2 +0,0 @@
-#!/bin/sh
-./src/dbus-env ./src/test-runner mir-greeter-x-session test-mir-greeter
diff --git a/tests/test-mir-session b/tests/test-mir-session
new file mode 100755 (executable)
index 0000000..b1ec3ed
--- /dev/null
@@ -0,0 +1,2 @@
+#!/bin/sh
+./src/dbus-env ./src/test-runner mir-session test-gobject-greeter
diff --git a/tests/test-mir-session-x-greeter b/tests/test-mir-session-x-greeter
deleted file mode 100755 (executable)
index 20ba7fb..0000000
+++ /dev/null
@@ -1,2 +0,0 @@
-#!/bin/sh
-./src/dbus-env ./src/test-runner mir-session-x-greeter test-gobject-greeter