test: detect if we're running inside gdb and disable forking
[platform/upstream/libevdev.git] / test / test-main.c
1 /*
2  * Copyright © 2013 Red Hat, Inc.
3  *
4  * Permission to use, copy, modify, distribute, and sell this software and its
5  * documentation for any purpose is hereby granted without fee, provided that
6  * the above copyright notice appear in all copies and that both that copyright
7  * notice and this permission notice appear in supporting documentation, and
8  * that the name of the copyright holders not be used in advertising or
9  * publicity pertaining to distribution of the software without specific,
10  * written prior permission.  The copyright holders make no representations
11  * about the suitability of this software for any purpose.  It is provided "as
12  * is" without express or implied warranty.
13  *
14  * THE COPYRIGHT HOLDERS DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
15  * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
16  * EVENT SHALL THE COPYRIGHT HOLDERS BE LIABLE FOR ANY SPECIAL, INDIRECT OR
17  * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
18  * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
19  * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
20  * OF THIS SOFTWARE.
21  */
22
23 #include <config.h>
24 #include <check.h>
25 #include <stdlib.h>
26 #include <unistd.h>
27 #include <sys/ptrace.h>
28 #include <sys/wait.h>
29
30 extern Suite *event_name_suite(void);
31 extern Suite *event_code_suite(void);
32 extern Suite *libevdev_init_test(void);
33 extern Suite *queue_suite(void);
34 extern Suite *libevdev_has_event_test(void);
35 extern Suite *libevdev_events(void);
36 extern Suite *uinput_suite(void);
37
38 static int
39 is_debugger_attached(void)
40 {
41         int status;
42         int rc;
43         int pid = fork();
44
45         if (pid == -1)
46                 return 0;
47
48         if (pid == 0) {
49                 int ppid = getppid();
50                 if (ptrace(PTRACE_ATTACH, ppid, NULL, NULL) == 0) {
51                         waitpid(ppid, NULL, 0);
52                         ptrace(PTRACE_CONT, NULL, NULL);
53                         ptrace(PTRACE_DETACH, ppid, NULL, NULL);
54                         rc = 0;
55                 } else
56                         rc = 1;
57                 _exit(rc);
58         } else {
59                 waitpid(pid, &status, 0);
60                 rc = WEXITSTATUS(status);
61         }
62
63         return rc;
64 }
65
66
67 int main(int argc, char **argv)
68 {
69         int failed;
70
71         if (is_debugger_attached())
72                 setenv("CK_FORK", "no", 0);
73
74         Suite *s = libevdev_has_event_test();
75         SRunner *sr = srunner_create(s);
76         srunner_add_suite(sr, libevdev_events());
77         srunner_add_suite(sr, libevdev_init_test());
78         srunner_add_suite(sr, queue_suite());
79         srunner_add_suite(sr, event_name_suite());
80         srunner_add_suite(sr, event_code_suite());
81         srunner_add_suite(sr, uinput_suite());
82         srunner_run_all(sr, CK_NORMAL);
83
84         failed = srunner_ntests_failed(sr);
85         srunner_free(sr);
86
87         return failed;
88 }