]> rtime.felk.cvut.cz Git - sojka/lightdm.git/blobdiff - tests/src/test-runner.c
Fix warning when tests complete
[sojka/lightdm.git] / tests / src / test-runner.c
index 631d299c80890afc0c1fb975f77a7a4ebabbb543..bcb6f8eea1d7a5a86018c4d9b7ffd91f30bd54be 100644 (file)
@@ -110,6 +110,7 @@ typedef struct
     gchar *path;
     gboolean can_graphical;
     gboolean can_multi_session;
+    gchar *active_session;
 } Login1Seat;
 
 static GList *login1_seats = NULL;
@@ -138,10 +139,12 @@ static GList *status_clients = NULL;
 
 static void ready (void);
 static void quit (int status);
+static gboolean status_timeout_cb (gpointer data);
 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)
@@ -343,6 +346,71 @@ stop_loop (gpointer user_data)
     return G_SOURCE_REMOVE;
 }
 
+static void
+switch_to_greeter_done_cb (GObject *bus, GAsyncResult *result, gpointer data)
+{
+    GVariant *r;
+    GError *error = NULL;
+
+    r = g_dbus_connection_call_finish (G_DBUS_CONNECTION (bus), result, &error);
+    if (error)
+        g_warning ("Failed to switch to greeter: %s\n", error->message);
+    g_clear_error (&error);
+
+    if (r)
+    {
+        check_status ("RUNNER SWITCH-TO-GREETER");
+        g_variant_unref (r);
+    }
+    else
+        check_status ("RUNNER SWITCH-TO-GREETER FAILED");
+}
+
+static void
+switch_to_user_done_cb (GObject *bus, GAsyncResult *result, gpointer data)
+{
+    GVariant *r;
+    GError *error = NULL;
+    gchar *username = data, *status_text;
+
+    r = g_dbus_connection_call_finish (G_DBUS_CONNECTION (bus), result, &error);
+    if (error)
+        g_warning ("Failed to switch to user: %s\n", error->message);
+    g_clear_error (&error);
+
+    if (r)
+    {
+        status_text = g_strdup_printf ("RUNNER SWITCH-TO-USER USERNAME=%s", username);
+        g_variant_unref (r);
+    }
+    else
+        status_text = g_strdup_printf ("RUNNER SWITCH-TO-USER USERNAME=%s FAILED", username);
+    check_status (status_text);
+
+    g_free (status_text);
+    g_free (username);
+}
+
+static void
+switch_to_guest_done_cb (GObject *bus, GAsyncResult *result, gpointer data)
+{
+    GVariant *r;
+    GError *error = NULL;
+
+    r = g_dbus_connection_call_finish (G_DBUS_CONNECTION (bus), result, &error);
+    if (error)
+        g_warning ("Failed to switch to guest: %s\n", error->message);
+    g_clear_error (&error);
+
+    if (r)
+    {
+        check_status ("RUNNER SWITCH-TO-GUEST");
+        g_variant_unref (r);
+    }
+    else
+        check_status ("RUNNER SWITCH-TO-GUEST FAILED");
+}
+
 static void
 handle_command (const gchar *command)
 {
@@ -455,18 +523,33 @@ handle_command (const gchar *command)
     }
     else if (strcmp (name, "WAIT") == 0)
     {
+        const gchar *v;
+        int duration;
+
+        /* Stop status timeout */
+        if (status_timeout)
+            g_source_remove (status_timeout);
+        status_timeout = 0;
+
         /* Use a main loop so that our DBus functions are still responsive */
         GMainLoop *loop = g_main_loop_new (NULL, FALSE);
-        g_timeout_add_seconds (1, stop_loop, loop);
+        v = g_hash_table_lookup (params, "DURATION");
+        duration = v ? atoi (v) : 1;
+        if (duration < 1)
+            duration = 1;
+        g_timeout_add_seconds (duration, stop_loop, loop);
         g_main_loop_run (loop);
         g_main_loop_unref (loop);
+
+        /* Restart status timeout */
+        status_timeout = g_timeout_add (status_timeout_ms, status_timeout_cb, NULL);
     }
     else if (strcmp (name, "ADD-SEAT") == 0)
     {
         const gchar *id, *v;
         Login1Seat *seat;
 
-        id = g_hash_table_lookup (params, "ID");      
+        id = g_hash_table_lookup (params, "ID");
         seat = add_login1_seat (g_bus_get_sync (G_BUS_TYPE_SYSTEM, NULL, NULL), id, TRUE);
         v = g_hash_table_lookup (params, "CAN-GRAPHICAL");
         if (v)
@@ -475,11 +558,30 @@ handle_command (const gchar *command)
         if (v)
             seat->can_multi_session = strcmp (v, "TRUE") == 0;
     }
+    else if (strcmp (name, "ADD-LOCAL-X-SEAT") == 0)
+    {
+        GVariant *result;
+        const gchar *v;
+
+        v = g_hash_table_lookup (params, "DISPLAY");
+        result = g_dbus_connection_call_sync (g_bus_get_sync (G_BUS_TYPE_SYSTEM, NULL, NULL),
+                                              "org.freedesktop.DisplayManager",
+                                              "/org/freedesktop/DisplayManager",
+                                              "org.freedesktop.DisplayManager",
+                                              "AddLocalXSeat",
+                                              g_variant_new ("(i)", v ? atoi (v) : -1),
+                                              G_VARIANT_TYPE ("(o)"),
+                                              G_DBUS_CALL_FLAGS_NONE,
+                                              G_MAXINT,
+                                              NULL,
+                                              NULL);
+        g_variant_unref (result);
+    }
     else if (strcmp (name, "UPDATE-SEAT") == 0)
     {
         Login1Seat *seat;
         const gchar *id;
-      
+
         id = g_hash_table_lookup (params, "ID");
         seat = find_login1_seat (id);
         if (seat)
@@ -502,6 +604,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,
@@ -643,82 +752,51 @@ handle_command (const gchar *command)
     }
     else if (strcmp (name, "SWITCH-TO-GREETER") == 0)
     {
-        GVariant *result;
-
-        result = g_dbus_connection_call_sync (g_bus_get_sync (G_BUS_TYPE_SYSTEM, NULL, NULL),
-                                              "org.freedesktop.DisplayManager",
-                                              "/org/freedesktop/DisplayManager/Seat0",
-                                              "org.freedesktop.DisplayManager.Seat",
-                                              "SwitchToGreeter",
-                                              g_variant_new ("()"),
-                                              G_VARIANT_TYPE ("()"),
-                                              G_DBUS_CALL_FLAGS_NONE,
-                                              G_MAXINT,
-                                              NULL,
-                                              NULL);
-        if (result)
-        {
-            check_status ("RUNNER SWITCH-TO-GREETER");
-            g_variant_unref (result);
-        }
-        else
-            check_status ("RUNNER SWITCH-TO-GREETER FAILED");
+        g_dbus_connection_call (g_bus_get_sync (G_BUS_TYPE_SYSTEM, NULL, NULL),
+                                "org.freedesktop.DisplayManager",
+                                "/org/freedesktop/DisplayManager/Seat0",
+                                "org.freedesktop.DisplayManager.Seat",
+                                "SwitchToGreeter",
+                                g_variant_new ("()"),
+                                G_VARIANT_TYPE ("()"),
+                                G_DBUS_CALL_FLAGS_NONE,
+                                G_MAXINT,
+                                NULL,
+                                switch_to_greeter_done_cb,
+                                NULL);
     }
     else if (strcmp (name, "SWITCH-TO-USER") == 0)
     {
-        GVariant *result;
         const gchar *username;
 
         username = g_hash_table_lookup (params, "USERNAME");
-        result = g_dbus_connection_call_sync (g_bus_get_sync (G_BUS_TYPE_SYSTEM, NULL, NULL),
-                                              "org.freedesktop.DisplayManager",
-                                              "/org/freedesktop/DisplayManager/Seat0",
-                                              "org.freedesktop.DisplayManager.Seat",
-                                              "SwitchToUser",
-                                              g_variant_new ("(ss)", username, ""),
-                                              G_VARIANT_TYPE ("()"),
-                                              G_DBUS_CALL_FLAGS_NONE,
-                                              G_MAXINT,
-                                              NULL,
-                                              NULL);
-        if (result)
-        {
-            gchar *status_text;
-            status_text = g_strdup_printf ("RUNNER SWITCH-TO-USER USERNAME=%s", username);
-            check_status (status_text);
-            g_free (status_text);
-            g_variant_unref (result);
-        }
-        else
-        {
-            gchar *status_text;
-            status_text = g_strdup_printf ("RUNNER SWITCH-TO-USER USERNAME=%s FAILED", username);
-            check_status (status_text);
-            g_free (status_text);
-        }
+        g_dbus_connection_call (g_bus_get_sync (G_BUS_TYPE_SYSTEM, NULL, NULL),
+                                "org.freedesktop.DisplayManager",
+                                "/org/freedesktop/DisplayManager/Seat0",
+                                "org.freedesktop.DisplayManager.Seat",
+                                "SwitchToUser",
+                                g_variant_new ("(ss)", username, ""),
+                                G_VARIANT_TYPE ("()"),
+                                G_DBUS_CALL_FLAGS_NONE,
+                                G_MAXINT,
+                                NULL,
+                                switch_to_user_done_cb,
+                                g_strdup (username));
     }
     else if (strcmp (name, "SWITCH-TO-GUEST") == 0)
     {
-        GVariant *result;
-
-        result = g_dbus_connection_call_sync (g_bus_get_sync (G_BUS_TYPE_SYSTEM, NULL, NULL),
-                                              "org.freedesktop.DisplayManager",
-                                              "/org/freedesktop/DisplayManager/Seat0",
-                                              "org.freedesktop.DisplayManager.Seat",
-                                              "SwitchToGuest",
-                                              g_variant_new ("(s)", ""),
-                                              G_VARIANT_TYPE ("()"),
-                                              G_DBUS_CALL_FLAGS_NONE,
-                                              G_MAXINT,
-                                              NULL,
-                                              NULL);
-        if (result)
-        {
-            check_status ("RUNNER SWITCH-TO-GUEST");
-            g_variant_unref (result);
-        }
-        else
-            check_status ("RUNNER SWITCH-TO-GUEST FAILED");
+        g_dbus_connection_call (g_bus_get_sync (G_BUS_TYPE_SYSTEM, NULL, NULL),
+                                "org.freedesktop.DisplayManager",
+                                "/org/freedesktop/DisplayManager/Seat0",
+                                "org.freedesktop.DisplayManager.Seat",
+                                "SwitchToGuest",
+                                g_variant_new ("(s)", ""),
+                                G_VARIANT_TYPE ("()"),
+                                G_DBUS_CALL_FLAGS_NONE,
+                                G_MAXINT,
+                                NULL,
+                                switch_to_guest_done_cb,
+                                NULL);
     }
     else if (strcmp (name, "STOP-DAEMON") == 0)
         stop_process (lightdm_process);
@@ -849,17 +927,18 @@ handle_command (const gchar *command)
                 user->xsession = g_strdup (g_hash_table_lookup (params, "SESSION"));
                 g_string_append_printf (status_text, " SESSION=%s", user->xsession);
             }
+
+            g_dbus_connection_emit_signal (accounts_connection,
+                                           NULL,
+                                           user->path,
+                                           "org.freedesktop.Accounts.User",
+                                           "Changed",
+                                           g_variant_new ("()"),
+                                           &error);
         }
         else
             g_warning ("Unknown user %s", username);
 
-        g_dbus_connection_emit_signal (accounts_connection,
-                                       NULL,
-                                       user->path,
-                                       "org.freedesktop.Accounts.User",
-                                       "Changed",
-                                       g_variant_new ("()"),
-                                       &error);
         if (error)
             g_warning ("Failed to emit Changed: %s", error->message);
         g_clear_error (&error);
@@ -883,10 +962,32 @@ 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-") ||
              g_str_has_prefix (name, "XSERVER-") ||
+             g_str_has_prefix (name, "XMIR-") ||
+             g_str_has_prefix (name, "XVNC-") ||
              strcmp (name, "UNITY-SYSTEM-COMPOSITOR") == 0)
     {
         GList *link;
@@ -942,10 +1043,12 @@ status_timeout_cb (gpointer data)
 {
     ScriptLine *line;
 
+    status_timeout = 0;
+
     line = get_script_line (NULL);
     fail ("(timeout)", line ? line->text : NULL);
 
-    return FALSE;
+    return G_SOURCE_REMOVE;
 }
 
 static void
@@ -1004,7 +1107,12 @@ status_message_cb (GSocket *socket, GIOCondition condition, StatusClient *client
     if (n_read > 0)
         n_read = g_socket_receive (socket, buffer, length, NULL, &error);
     if (error)
-        g_warning ("Error reading from socket: %s", error->message);
+    {
+        if (g_error_matches (error, G_IO_ERROR, G_IO_ERROR_CONNECTION_CLOSED))
+            n_read = 0;
+        else
+            g_warning ("Error reading from socket: %s", error->message);
+    }
     g_clear_error (&error);
     if (n_read == 0)
     {
@@ -1295,8 +1403,12 @@ handle_ck_session_call (GDBusConnection       *connection,
 {
     CKSession *session = user_data;
 
-    if (strcmp (method_name, "Lock") == 0)
-    { 
+    if (strcmp (method_name, "GetXDGRuntimeDir") == 0 && !g_key_file_get_boolean (config, "test-runner-config", "ck-no-xdg-runtime", NULL))
+    {
+        g_dbus_method_invocation_return_value (invocation, g_variant_new ("(s)", "/run/console-kit"));
+    }
+    else if (strcmp (method_name, "Lock") == 0)
+    {
         if (!session->locked)
             check_status ("CONSOLE-KIT LOCK-SESSION");
         session->locked = TRUE;
@@ -1364,9 +1476,20 @@ ck_name_acquired_cb (GDBusConnection *connection,
     {
         handle_ck_call,
     };
+    const gchar *ck_session_interface_old =
+        "<node>"
+        "  <interface name='org.freedesktop.ConsoleKit.Session'>"
+        "    <method name='Lock'/>"
+        "    <method name='Unlock'/>"
+        "    <method name='Activate'/>"
+        "  </interface>"
+        "</node>";
     const gchar *ck_session_interface =
         "<node>"
         "  <interface name='org.freedesktop.ConsoleKit.Session'>"
+        "    <method name='GetXDGRuntimeDir'>"
+        "      <arg name='dir' direction='out' type='s'/>"
+        "    </method>"
         "    <method name='Lock'/>"
         "    <method name='Unlock'/>"
         "    <method name='Activate'/>"
@@ -1381,7 +1504,10 @@ ck_name_acquired_cb (GDBusConnection *connection,
     g_clear_error (&error);
     if (!ck_info)
         return;
-    ck_session_info = g_dbus_node_info_new_for_xml (ck_session_interface, &error);
+    if (g_key_file_get_boolean (config, "test-runner-config", "ck-no-xdg-runtime", NULL))
+        ck_session_info = g_dbus_node_info_new_for_xml (ck_session_interface_old, &error);
+    else
+        ck_session_info = g_dbus_node_info_new_for_xml (ck_session_interface, &error);  
     if (error)
         g_warning ("Failed to parse D-Bus interface: %s", error->message);
     g_clear_error (&error);
@@ -1447,33 +1573,30 @@ 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
-        return NULL;
-}
-
-static gchar *
-escape_seat_id (const gchar *id)
-{
-    GString *s;
-    int i;
-
-    s = g_string_new ("");
-    for (i = 0; id[i]; i++)
+    else if (strcmp (property_name, "ActiveSession") == 0)
     {
-        if (isalnum (id[i]) || id[i] == '_')
-            g_string_append_c (s, id[i]);
-        else
-            g_string_append_printf (s, "_%02x", id[i]);
-    }
+        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 g_string_free (s, FALSE);
+            return ret;
+        }
+        else 
+            return NULL;
+    }
+    else
+        return NULL;
 }
 
 static Login1Seat *
 add_login1_seat (GDBusConnection *connection, const gchar *id, gboolean emit_signal)
 {
     Login1Seat *seat;
-    gchar *escaped_id;
     GError *error = NULL;
     GDBusNodeInfo *login1_seat_info;
 
@@ -1482,6 +1605,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>";
@@ -1491,6 +1615,14 @@ add_login1_seat (GDBusConnection *connection, const gchar *id, gboolean emit_sig
         handle_login1_seat_get_property,
     };
 
+    seat = g_malloc0 (sizeof (Login1Seat));
+    login1_seats = g_list_append (login1_seats, seat);
+    seat->id = g_strdup (id);
+    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)
         g_warning ("Failed to parse login1 seat D-Bus interface: %s", error->message);
@@ -1498,15 +1630,6 @@ add_login1_seat (GDBusConnection *connection, const gchar *id, gboolean emit_sig
     if (!login1_seat_info)
         return NULL;
 
-    seat = g_malloc0 (sizeof (Login1Seat));
-    login1_seats = g_list_append (login1_seats, seat);
-    seat->id = g_strdup (id);
-    escaped_id = escape_seat_id (seat->id);
-    seat->path = g_strdup_printf ("/org/freedesktop/login1/seat/%s", escaped_id);
-    g_free (escaped_id);
-    seat->can_graphical = TRUE;
-    seat->can_multi_session = TRUE;
-
     g_dbus_connection_register_object (connection,
                                        seat->path,
                                        login1_seat_info->interfaces[0],
@@ -1572,10 +1695,11 @@ remove_login1_seat (GDBusConnection *connection, const gchar *id)
     if (error)
         g_warning ("Failed to emit SeatNew: %s", error->message);
     g_clear_error (&error);
-  
+
     login1_seats = g_list_remove (login1_seats, seat);
     g_free (seat->id);
     g_free (seat->path);
+    g_free (seat->active_session);
     g_free (seat);
 }
 
@@ -1860,6 +1984,7 @@ login1_name_acquired_cb (GDBusConnection *connection,
         handle_login1_call,
     };
     GDBusNodeInfo *login1_info;
+    Login1Seat *seat0;
     GError *error = NULL;
 
     login1_info = g_dbus_node_info_new_for_xml (login1_interface, &error);
@@ -1880,7 +2005,11 @@ login1_name_acquired_cb (GDBusConnection *connection,
     g_dbus_node_info_unref (login1_info);
 
     /* We always have seat0 */
-    add_login1_seat (connection, "seat0", FALSE);
+    seat0 = add_login1_seat (connection, "seat0", FALSE);
+    if (g_key_file_has_key (config, "test-runner-config", "seat0-can-graphical", NULL))
+        seat0->can_graphical = g_key_file_get_boolean (config, "test-runner-config", "seat0-can-graphical", NULL);
+    if (g_key_file_has_key (config, "test-runner-config", "seat0-can-multi-session", NULL))
+        seat0->can_multi_session = g_key_file_get_boolean (config, "test-runner-config", "seat0-can-multi-session", NULL);
 
     service_count--;
     if (service_count == 0)
@@ -1912,7 +2041,7 @@ get_accounts_user_by_uid (guint uid)
         if (u->uid == uid)
             return u;
     }
-  
+
     return NULL;
 }
 
@@ -2473,7 +2602,7 @@ main (int argc, char **argv)
         if (!g_file_test (temp_dir, G_FILE_TEST_EXISTS))
             break;
         i++;
-    }  
+    }
     g_mkdir_with_parents (temp_dir, 0755);
     g_setenv ("LIGHTDM_TEST_ROOT", temp_dir, TRUE);
 
@@ -2517,6 +2646,7 @@ main (int argc, char **argv)
 
     /* Set up a skeleton file system */
     g_mkdir_with_parents (g_strdup_printf ("%s/etc", temp_dir), 0755);
+    g_mkdir_with_parents (g_strdup_printf ("%s/run", temp_dir), 0755);
     g_mkdir_with_parents (g_strdup_printf ("%s/usr/share", temp_dir), 0755);
     g_mkdir_with_parents (g_strdup_printf ("%s/usr/share/lightdm/sessions", temp_dir), 0755);
     g_mkdir_with_parents (g_strdup_printf ("%s/usr/share/lightdm/remote-sessions", temp_dir), 0755);
@@ -2531,6 +2661,8 @@ main (int argc, char **argv)
     if (!g_key_file_has_key (config, "test-runner-config", "have-config", NULL) || g_key_file_get_boolean (config, "test-runner-config", "have-config", NULL))
         if (system (g_strdup_printf ("cp %s %s/etc/lightdm/lightdm.conf", config_path, temp_dir)))
             perror ("Failed to copy configuration");
+    if (system (g_strdup_printf ("cp %s/tests/data/keys.conf %s/etc/lightdm/", SRCDIR, temp_dir)))
+        perror ("Failed to copy key configuration");
 
     additional_system_config = g_key_file_get_string (config, "test-runner-config", "additional-system-config", NULL);
     if (additional_system_config)