Having the system suspend or shutdown halfway through a test run is a tad
annoying. So let's talk to logind and tell it to inhibit the various keys
we're testing.

https://bugs.freedesktop.org/show_bug.cgi?id=104720

Signed-off-by: Peter Hutterer <peter.hutte...@who-t.net>
---
 meson.build   |  7 ++++++-
 test/litest.c | 57 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 63 insertions(+), 1 deletion(-)

diff --git a/meson.build b/meson.build
index 3a14681c..5b8317a4 100644
--- a/meson.build
+++ b/meson.build
@@ -521,6 +521,10 @@ if get_option('tests')
        dep_libunwind = dependency('libunwind', required : false)
        config_h.set10('HAVE_LIBUNWIND', dep_libunwind.found())
 
+       # for inhibit support during test run
+       dep_libsystemd = dependency('libsystemd', required : false)
+       config_h.set10('HAVE_LIBSYSTEMD', dep_libsystemd.found())
+
        lib_litest_sources = [
                'test/litest.h',
                'test/litest-int.h',
@@ -609,7 +613,8 @@ if get_option('tests')
                dep_udev,
                dep_libevdev,
                dep_dl,
-               dep_lm
+               dep_lm,
+               dep_libsystemd,
        ]
 
        configure_file(input : 'udev/80-libinput-test-device.rules',
diff --git a/test/litest.c b/test/litest.c
index d4874d43..befb486a 100644
--- a/test/litest.c
+++ b/test/litest.c
@@ -48,6 +48,9 @@
 #include <sys/stat.h>
 #include <sys/types.h>
 #include <libudev.h>
+#if HAVE_LIBSYSTEMD
+#include <systemd/sd-bus.h>
+#endif
 
 #include "litest.h"
 #include "litest-int.h"
@@ -942,10 +945,60 @@ litest_fork_subtests(struct list *tests, int max_forks)
        return failed;
 }
 
+static inline int
+inhibit(void)
+{
+       int lock_fd = -1;
+#if HAVE_LIBSYSTEMD
+       sd_bus_error error = SD_BUS_ERROR_NULL;
+       sd_bus_message *m = NULL;
+       sd_bus *bus = NULL;
+       int rc;
+
+       rc = sd_bus_open_system(&bus);
+       if (rc != 0) {
+               fprintf(stderr, "Warning: inhibit failed: %s\n", strerror(-rc));
+               goto out;
+       }
+
+       rc = sd_bus_call_method(bus,
+                               "org.freedesktop.login1",
+                               "/org/freedesktop/login1",
+                               "org.freedesktop.login1.Manager",
+                               "Inhibit",
+                               &error,
+                               &m,
+                               "ssss",
+                               
"handle-lid-switch:handle-power-key:handle-suspend-key:handle-hibernate-key",
+                               "libinput test-suite runner",
+                               "testing in progress",
+                               "block");
+       if (rc < 0) {
+               fprintf(stderr, "Warning: inhibit failed: %s\n", error.message);
+               goto out;
+       }
+
+       rc = sd_bus_message_read(m, "h", &lock_fd);
+       if (rc < 0) {
+               fprintf(stderr, "Warning: inhibit failed: %s\n", strerror(-rc));
+               goto out;
+       }
+
+       lock_fd = dup(lock_fd);
+out:
+       sd_bus_error_free(&error);
+       sd_bus_message_unref(m);
+       sd_bus_close(bus);
+       sd_bus_unref(bus);
+#endif
+       return lock_fd;
+}
+
 static inline int
 litest_run(int argc, char **argv)
 {
        int failed = 0;
+       int inhibit_lock_fd;
 
        list_init(&created_files_list);
 
@@ -962,11 +1015,15 @@ litest_run(int argc, char **argv)
 
        litest_setup_sighandler(SIGINT);
 
+       inhibit_lock_fd = inhibit();
+
        if (jobs == 1)
                failed = litest_run_suite(&all_tests, 1, 1, STDERR_FILENO);
        else
                failed = litest_fork_subtests(&all_tests, jobs);
 
+       close(inhibit_lock_fd);
+
        litest_free_test_list(&all_tests);
 
        litest_remove_udev_rules(&created_files_list);
-- 
2.14.3

_______________________________________________
wayland-devel mailing list
wayland-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/wayland-devel

Reply via email to