1*d83cc019SAndroid Build Coastguard Worker /*
2*d83cc019SAndroid Build Coastguard Worker * Copyright © 2015 Intel Corporation
3*d83cc019SAndroid Build Coastguard Worker *
4*d83cc019SAndroid Build Coastguard Worker * Permission is hereby granted, free of charge, to any person obtaining a
5*d83cc019SAndroid Build Coastguard Worker * copy of this software and associated documentation files (the "Software"),
6*d83cc019SAndroid Build Coastguard Worker * to deal in the Software without restriction, including without limitation
7*d83cc019SAndroid Build Coastguard Worker * the rights to use, copy, modify, merge, publish, distribute, sublicense,
8*d83cc019SAndroid Build Coastguard Worker * and/or sell copies of the Software, and to permit persons to whom the
9*d83cc019SAndroid Build Coastguard Worker * Software is furnished to do so, subject to the following conditions:
10*d83cc019SAndroid Build Coastguard Worker *
11*d83cc019SAndroid Build Coastguard Worker * The above copyright notice and this permission notice (including the next
12*d83cc019SAndroid Build Coastguard Worker * paragraph) shall be included in all copies or substantial portions of the
13*d83cc019SAndroid Build Coastguard Worker * Software.
14*d83cc019SAndroid Build Coastguard Worker *
15*d83cc019SAndroid Build Coastguard Worker * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16*d83cc019SAndroid Build Coastguard Worker * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17*d83cc019SAndroid Build Coastguard Worker * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
18*d83cc019SAndroid Build Coastguard Worker * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19*d83cc019SAndroid Build Coastguard Worker * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
20*d83cc019SAndroid Build Coastguard Worker * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
21*d83cc019SAndroid Build Coastguard Worker * IN THE SOFTWARE.
22*d83cc019SAndroid Build Coastguard Worker *
23*d83cc019SAndroid Build Coastguard Worker * Authors:
24*d83cc019SAndroid Build Coastguard Worker * Derek Morton <[email protected]>
25*d83cc019SAndroid Build Coastguard Worker *
26*d83cc019SAndroid Build Coastguard Worker */
27*d83cc019SAndroid Build Coastguard Worker
28*d83cc019SAndroid Build Coastguard Worker /*
29*d83cc019SAndroid Build Coastguard Worker * Testcase: Test the framework catches a segfault and returns an error.
30*d83cc019SAndroid Build Coastguard Worker *
31*d83cc019SAndroid Build Coastguard Worker * 1. Test a crashing simple test is reported.
32*d83cc019SAndroid Build Coastguard Worker * 2. Test a crashing subtest is reported.
33*d83cc019SAndroid Build Coastguard Worker * 3. Test a crashing subtest following a passing subtest is reported.
34*d83cc019SAndroid Build Coastguard Worker * 4. Test a crashing subtest preceeding a passing subtest is reported.
35*d83cc019SAndroid Build Coastguard Worker */
36*d83cc019SAndroid Build Coastguard Worker
37*d83cc019SAndroid Build Coastguard Worker #include <signal.h>
38*d83cc019SAndroid Build Coastguard Worker #include <stdlib.h>
39*d83cc019SAndroid Build Coastguard Worker #include <sys/wait.h>
40*d83cc019SAndroid Build Coastguard Worker #include <sys/types.h>
41*d83cc019SAndroid Build Coastguard Worker #include <errno.h>
42*d83cc019SAndroid Build Coastguard Worker
43*d83cc019SAndroid Build Coastguard Worker #include "drmtest.h"
44*d83cc019SAndroid Build Coastguard Worker #include "igt_core.h"
45*d83cc019SAndroid Build Coastguard Worker
46*d83cc019SAndroid Build Coastguard Worker #include "igt_tests_common.h"
47*d83cc019SAndroid Build Coastguard Worker
48*d83cc019SAndroid Build Coastguard Worker bool simple;
49*d83cc019SAndroid Build Coastguard Worker bool runa;
50*d83cc019SAndroid Build Coastguard Worker bool runc;
51*d83cc019SAndroid Build Coastguard Worker char test[] = "test";
52*d83cc019SAndroid Build Coastguard Worker char *argv_run[] = { test };
53*d83cc019SAndroid Build Coastguard Worker
crashme(void)54*d83cc019SAndroid Build Coastguard Worker static void crashme(void)
55*d83cc019SAndroid Build Coastguard Worker {
56*d83cc019SAndroid Build Coastguard Worker raise(SIGSEGV);
57*d83cc019SAndroid Build Coastguard Worker }
58*d83cc019SAndroid Build Coastguard Worker
do_fork(void)59*d83cc019SAndroid Build Coastguard Worker static int do_fork(void)
60*d83cc019SAndroid Build Coastguard Worker {
61*d83cc019SAndroid Build Coastguard Worker int pid, status;
62*d83cc019SAndroid Build Coastguard Worker int argc;
63*d83cc019SAndroid Build Coastguard Worker
64*d83cc019SAndroid Build Coastguard Worker switch (pid = fork()) {
65*d83cc019SAndroid Build Coastguard Worker case -1:
66*d83cc019SAndroid Build Coastguard Worker internal_assert(0);
67*d83cc019SAndroid Build Coastguard Worker case 0:
68*d83cc019SAndroid Build Coastguard Worker argc = ARRAY_SIZE(argv_run);
69*d83cc019SAndroid Build Coastguard Worker if (simple) {
70*d83cc019SAndroid Build Coastguard Worker igt_simple_init(argc, argv_run);
71*d83cc019SAndroid Build Coastguard Worker crashme();
72*d83cc019SAndroid Build Coastguard Worker
73*d83cc019SAndroid Build Coastguard Worker igt_exit();
74*d83cc019SAndroid Build Coastguard Worker } else {
75*d83cc019SAndroid Build Coastguard Worker igt_subtest_init(argc, argv_run);
76*d83cc019SAndroid Build Coastguard Worker
77*d83cc019SAndroid Build Coastguard Worker if(runa)
78*d83cc019SAndroid Build Coastguard Worker igt_subtest("A")
79*d83cc019SAndroid Build Coastguard Worker ;
80*d83cc019SAndroid Build Coastguard Worker
81*d83cc019SAndroid Build Coastguard Worker igt_subtest("B")
82*d83cc019SAndroid Build Coastguard Worker crashme();
83*d83cc019SAndroid Build Coastguard Worker
84*d83cc019SAndroid Build Coastguard Worker if(runc)
85*d83cc019SAndroid Build Coastguard Worker igt_subtest("C")
86*d83cc019SAndroid Build Coastguard Worker ;
87*d83cc019SAndroid Build Coastguard Worker
88*d83cc019SAndroid Build Coastguard Worker igt_exit();
89*d83cc019SAndroid Build Coastguard Worker }
90*d83cc019SAndroid Build Coastguard Worker default:
91*d83cc019SAndroid Build Coastguard Worker while (waitpid(pid, &status, 0) == -1 &&
92*d83cc019SAndroid Build Coastguard Worker errno == EINTR)
93*d83cc019SAndroid Build Coastguard Worker ;
94*d83cc019SAndroid Build Coastguard Worker
95*d83cc019SAndroid Build Coastguard Worker return status;
96*d83cc019SAndroid Build Coastguard Worker }
97*d83cc019SAndroid Build Coastguard Worker }
98*d83cc019SAndroid Build Coastguard Worker
main(int argc,char ** argv)99*d83cc019SAndroid Build Coastguard Worker int main(int argc, char **argv)
100*d83cc019SAndroid Build Coastguard Worker {
101*d83cc019SAndroid Build Coastguard Worker /* Test Crash in simple test is reported */
102*d83cc019SAndroid Build Coastguard Worker simple = true;
103*d83cc019SAndroid Build Coastguard Worker runa=false;
104*d83cc019SAndroid Build Coastguard Worker runc=false;
105*d83cc019SAndroid Build Coastguard Worker igt_info("Simple test.\n");
106*d83cc019SAndroid Build Coastguard Worker fflush(stdout);
107*d83cc019SAndroid Build Coastguard Worker internal_assert_wsignaled(do_fork(), SIGSEGV);
108*d83cc019SAndroid Build Coastguard Worker
109*d83cc019SAndroid Build Coastguard Worker /* Test crash in a single subtest is reported */
110*d83cc019SAndroid Build Coastguard Worker simple = false;
111*d83cc019SAndroid Build Coastguard Worker igt_info("Single subtest.\n");
112*d83cc019SAndroid Build Coastguard Worker fflush(stdout);
113*d83cc019SAndroid Build Coastguard Worker internal_assert_wexited(do_fork(), SIGSEGV + 128);
114*d83cc019SAndroid Build Coastguard Worker
115*d83cc019SAndroid Build Coastguard Worker /* Test crash in a subtest following a pass is reported */
116*d83cc019SAndroid Build Coastguard Worker simple = false;
117*d83cc019SAndroid Build Coastguard Worker runa=true;
118*d83cc019SAndroid Build Coastguard Worker igt_info("Passing then crashing subtest.\n");
119*d83cc019SAndroid Build Coastguard Worker fflush(stdout);
120*d83cc019SAndroid Build Coastguard Worker internal_assert_wexited(do_fork(), SIGSEGV + 128);
121*d83cc019SAndroid Build Coastguard Worker
122*d83cc019SAndroid Build Coastguard Worker /* Test crash in a subtest preceeding a pass is reported */
123*d83cc019SAndroid Build Coastguard Worker simple = false;
124*d83cc019SAndroid Build Coastguard Worker runa=false;
125*d83cc019SAndroid Build Coastguard Worker runc=true;
126*d83cc019SAndroid Build Coastguard Worker igt_info("Crashing then passing subtest.\n");
127*d83cc019SAndroid Build Coastguard Worker fflush(stdout);
128*d83cc019SAndroid Build Coastguard Worker internal_assert_wexited(do_fork(), SIGSEGV + 128);
129*d83cc019SAndroid Build Coastguard Worker
130*d83cc019SAndroid Build Coastguard Worker return 0;
131*d83cc019SAndroid Build Coastguard Worker }
132