]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
test: add test for org.freedesktop.login1.Session SetType
authorDavid Tardon <dtardon@redhat.com>
Mon, 27 Jun 2022 06:37:22 +0000 (08:37 +0200)
committerDavid Tardon <dtardon@redhat.com>
Wed, 13 Jul 2022 11:53:13 +0000 (13:53 +0200)
src/login/meson.build
src/login/test-session-properties.c [new file with mode: 0644]
test/units/testsuite-35.sh

index 8be238254a9c12b0b4d179ce4d2cd5b12a58f7d5..1245c050d92dcacd8c4f671d119c75d5aa5816f8 100644 (file)
@@ -103,4 +103,7 @@ tests += [
          [liblogind_core,
           libshared],
          [threads]],
+
+        [files('test-session-properties.c'),
+         [], [], [], '', 'manual'],
 ]
diff --git a/src/login/test-session-properties.c b/src/login/test-session-properties.c
new file mode 100644 (file)
index 0000000..8406147
--- /dev/null
@@ -0,0 +1,71 @@
+/* SPDX-License-Identifier: LGPL-2.1-or-later */
+
+/* Usage:
+ * ./test-session-properties <SESSION-OBJECT-PATH>
+ * e.g.,
+ * ./test-session-properties /org/freedesktop/login1/session/_32
+ */
+
+#include "alloc-util.h"
+#include "bus-common-errors.h"
+#include "bus-locator.h"
+#include "string-util.h"
+#include "tests.h"
+
+static BusLocator session;
+
+/* Tests org.freedesktop.logind.Session SetType */
+TEST(set_type) {
+        _cleanup_(sd_bus_flush_close_unrefp) sd_bus* bus = NULL;
+        _cleanup_(sd_bus_error_free) sd_bus_error error = SD_BUS_ERROR_NULL;
+        const char* types[] = {"tty", "x11", "wayland", "mir", "web"};
+        _cleanup_free_ char *type = NULL, *type2 = NULL;
+
+        assert_se(sd_bus_open_system(&bus) >= 0);
+
+        /* Default type is set */
+        assert_se(bus_get_property_string(bus, &session, "Type", NULL, &type) >= 0);
+        assert_se(streq(type, "tty"));
+
+        /* Type can only be set by the session controller (which we're not ATM) */
+        assert_se(bus_call_method(bus, &session, "SetType", &error, NULL, "s", "x11") < 0);
+        assert_se(sd_bus_error_has_name(&error, BUS_ERROR_NOT_IN_CONTROL));
+
+        assert_se(bus_call_method(bus, &session, "TakeControl", NULL, NULL, "b", true) >= 0);
+
+        /* All defined session types can be set */
+        for (size_t i = 0; i < ELEMENTSOF(types); i++) {
+                type = mfree(type);
+                assert_se(bus_call_method(bus, &session, "SetType", NULL, NULL, "s", types[i]) >= 0);
+                assert_se(bus_get_property_string(bus, &session, "Type", NULL, &type) >= 0);
+                assert_se(streq(type, types[i]));
+        }
+
+        /* An unknown type is rejected */
+        sd_bus_error_free(&error);
+        assert_se(bus_call_method(bus, &session, "SetType", &error, NULL, "s", "hello") < 0);
+        assert_se(sd_bus_error_has_name(&error, SD_BUS_ERROR_INVALID_ARGS));
+        assert_se(bus_get_property_string(bus, &session, "Type", NULL, &type2) >= 0);
+
+        /* Type is reset to the original value when we release control of the session */
+        assert_se(!streq(type, "tty"));
+        assert_se(bus_call_method(bus, &session, "ReleaseControl", NULL, NULL, "") >= 0);
+        type = mfree(type);
+        assert_se(bus_get_property_string(bus, &session, "Type", NULL, &type) >= 0);
+        assert_se(streq(type, "tty"));
+}
+
+static int intro(void) {
+        if (saved_argc <= 1)
+                return EXIT_FAILURE;
+
+        session = (BusLocator) {
+                .destination = "org.freedesktop.login1",
+                .path = saved_argv[1],
+                .interface = "org.freedesktop.login1.Session",
+        };
+
+        return EXIT_SUCCESS;
+}
+
+DEFINE_TEST_MAIN_WITH_INTRO(LOG_DEBUG, intro);
index a1b7ee26872dfb288263eaad55df489733596075..33b5fbf1ee3f0873f3e944f83fd99ae62fce54b4 100755 (executable)
@@ -474,6 +474,21 @@ EOF
     assert_eq "$(systemctl --property SubState --value show user@"$(id -u logind-test-user)".service)" "dead"
 }
 
+test_session_properties() {
+    local s
+
+    if [[ ! -c /dev/tty2 ]]; then
+        echo "/dev/tty2 does not exist, skipping test ${FUNCNAME[0]}."
+        return
+    fi
+
+    trap cleanup_session RETURN
+    create_session
+
+    s=$(loginctl list-sessions --no-legend | awk '$3 == "logind-test-user" { print $1 }')
+    /usr/lib/systemd/tests/manual/test-session-properties "/org/freedesktop/login1/session/_3${s?}"
+}
+
 : >/failed
 
 setup_test_user
@@ -485,6 +500,7 @@ test_shutdown
 test_session
 test_lock_idle_action
 test_no_user_instance_for_cron
+test_session_properties
 
 touch /testok
 rm /failed