test: check for the device nodes to exist before testing
authorPeter Hutterer <peter.hutterer@who-t.net>
Fri, 15 Jun 2018 05:08:53 +0000 (15:08 +1000)
committerPeter Hutterer <peter.hutterer@who-t.net>
Fri, 15 Jun 2018 05:19:05 +0000 (15:19 +1000)
Even if we're root we may be running in a container without input device
nodes. In which case we should skip the test, not fail.

Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
test/test-main.c

index 42a8802..fa4c48c 100644 (file)
 
 #include <config.h>
 #include <check.h>
+#include <errno.h>
 #include <stdio.h>
 #include <stdlib.h>
 #include <unistd.h>
 #include <sys/ptrace.h>
 #include <sys/resource.h>
 #include <sys/wait.h>
+#include <sys/stat.h>
+#include <sys/types.h>
 #include <libevdev/libevdev.h>
 
 #include "test-common.h"
@@ -60,6 +63,24 @@ is_debugger_attached(void)
        return rc;
 }
 
+static bool
+device_nodes_exist(void)
+{
+       struct stat st;
+       int rc;
+
+       rc = stat("/dev/uinput", &st);
+       if (rc == -1 && errno == ENOENT)
+               return false;
+
+       rc = stat("/dev/input", &st);
+       if (rc == -1 && errno == ENOENT)
+               return false;
+
+       /* Any issues but ENOENT we just let the test suite blow up later */
+       return true;
+}
+
 extern const struct libevdev_test __start_test_section, __stop_test_section;
 
 int main(void)
@@ -70,10 +91,16 @@ int main(void)
 
        for (t = &__start_test_section; t < &__stop_test_section; t++) {
                if (t->needs_root_privileges) {
+
                        if (getuid() != 0) {
                                fprintf(stderr, "This test needs to run as root\n");
                                return 77;
                        }
+                       if (!device_nodes_exist()) {
+                               fprintf(stderr, "This test needs /dev/input and /dev/uinput to exist\n");
+                               return 77;
+                       }
+
                        break;
                }
        }