1*d83cc019SAndroid Build Coastguard Worker /*
2*d83cc019SAndroid Build Coastguard Worker * Copyright © 2019 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
24*d83cc019SAndroid Build Coastguard Worker #include <sys/wait.h>
25*d83cc019SAndroid Build Coastguard Worker #include <string.h>
26*d83cc019SAndroid Build Coastguard Worker #include <stdlib.h>
27*d83cc019SAndroid Build Coastguard Worker
28*d83cc019SAndroid Build Coastguard Worker #include "drmtest.h"
29*d83cc019SAndroid Build Coastguard Worker #include "igt_tests_common.h"
30*d83cc019SAndroid Build Coastguard Worker
31*d83cc019SAndroid Build Coastguard Worker IGT_TEST_DESCRIPTION("the top level description");
fake_main(int argc,char ** argv)32*d83cc019SAndroid Build Coastguard Worker static void fake_main(int argc, char **argv) {
33*d83cc019SAndroid Build Coastguard Worker igt_subtest_init(argc, argv);
34*d83cc019SAndroid Build Coastguard Worker
35*d83cc019SAndroid Build Coastguard Worker igt_describe("Basic A");
36*d83cc019SAndroid Build Coastguard Worker igt_subtest("A")
37*d83cc019SAndroid Build Coastguard Worker ;
38*d83cc019SAndroid Build Coastguard Worker
39*d83cc019SAndroid Build Coastguard Worker igt_fixture
40*d83cc019SAndroid Build Coastguard Worker printf("should not be executed!\n");
41*d83cc019SAndroid Build Coastguard Worker
42*d83cc019SAndroid Build Coastguard Worker igt_describe("Group with B, C & D");
43*d83cc019SAndroid Build Coastguard Worker igt_subtest_group {
44*d83cc019SAndroid Build Coastguard Worker igt_describe("Basic B");
45*d83cc019SAndroid Build Coastguard Worker igt_subtest("B")
46*d83cc019SAndroid Build Coastguard Worker ;
47*d83cc019SAndroid Build Coastguard Worker
48*d83cc019SAndroid Build Coastguard Worker if (!igt_only_list_subtests())
49*d83cc019SAndroid Build Coastguard Worker printf("should not be executed!\n");
50*d83cc019SAndroid Build Coastguard Worker
51*d83cc019SAndroid Build Coastguard Worker igt_describe("Group with C & D");
52*d83cc019SAndroid Build Coastguard Worker igt_subtest_group {
53*d83cc019SAndroid Build Coastguard Worker igt_describe("Basic C");
54*d83cc019SAndroid Build Coastguard Worker igt_subtest("C")
55*d83cc019SAndroid Build Coastguard Worker printf("should not be executed!\n");
56*d83cc019SAndroid Build Coastguard Worker
57*d83cc019SAndroid Build Coastguard Worker // NO DOC
58*d83cc019SAndroid Build Coastguard Worker igt_subtest("D")
59*d83cc019SAndroid Build Coastguard Worker ;
60*d83cc019SAndroid Build Coastguard Worker }
61*d83cc019SAndroid Build Coastguard Worker }
62*d83cc019SAndroid Build Coastguard Worker
63*d83cc019SAndroid Build Coastguard Worker // NO DOC
64*d83cc019SAndroid Build Coastguard Worker igt_subtest_group {
65*d83cc019SAndroid Build Coastguard Worker // NO DOC
66*d83cc019SAndroid Build Coastguard Worker igt_subtest("E")
67*d83cc019SAndroid Build Coastguard Worker ;
68*d83cc019SAndroid Build Coastguard Worker }
69*d83cc019SAndroid Build Coastguard Worker
70*d83cc019SAndroid Build Coastguard Worker // NO DOC
71*d83cc019SAndroid Build Coastguard Worker igt_subtest("F")
72*d83cc019SAndroid Build Coastguard Worker ;
73*d83cc019SAndroid Build Coastguard Worker
74*d83cc019SAndroid Build Coastguard Worker igt_describe("this description should be so long that it wraps itself nicely in the terminal "
75*d83cc019SAndroid Build Coastguard Worker "this description should be so long that it wraps itself nicely in the terminal "
76*d83cc019SAndroid Build Coastguard Worker "this description should be so long that it wraps itself nicely in the terminal "
77*d83cc019SAndroid Build Coastguard Worker "this description should be so long that it wraps itself nicely in the terminal "
78*d83cc019SAndroid Build Coastguard Worker "this description should be so long that it wraps itself nicely in the terminal "
79*d83cc019SAndroid Build Coastguard Worker "this description should be so long that it wraps itself nicely in the terminal");
80*d83cc019SAndroid Build Coastguard Worker igt_subtest("G")
81*d83cc019SAndroid Build Coastguard Worker ;
82*d83cc019SAndroid Build Coastguard Worker
83*d83cc019SAndroid Build Coastguard Worker igt_describe("verylongwordthatshoudlbeprintedeventhoughitspastthewrppinglimit"
84*d83cc019SAndroid Build Coastguard Worker "verylongwordthatshoudlbeprintedeventhoughitspastthewrappinglimit "
85*d83cc019SAndroid Build Coastguard Worker "verylongwordthatshoudlbeprintedeventhoughitspastthewrappinglimit"
86*d83cc019SAndroid Build Coastguard Worker "verylongwordthatshoudlbeprintedeventhoughitspastthewrappinglimit");
87*d83cc019SAndroid Build Coastguard Worker igt_subtest("F")
88*d83cc019SAndroid Build Coastguard Worker ;
89*d83cc019SAndroid Build Coastguard Worker
90*d83cc019SAndroid Build Coastguard Worker igt_exit();
91*d83cc019SAndroid Build Coastguard Worker }
92*d83cc019SAndroid Build Coastguard Worker
93*d83cc019SAndroid Build Coastguard Worker static const char DESCRIBE_ALL_OUTPUT[] = \
94*d83cc019SAndroid Build Coastguard Worker "the top level description\n"
95*d83cc019SAndroid Build Coastguard Worker "\n"
96*d83cc019SAndroid Build Coastguard Worker "SUB A ../lib/tests/igt_describe.c:36:\n"
97*d83cc019SAndroid Build Coastguard Worker " Basic A\n"
98*d83cc019SAndroid Build Coastguard Worker "\n"
99*d83cc019SAndroid Build Coastguard Worker "SUB B ../lib/tests/igt_describe.c:45:\n"
100*d83cc019SAndroid Build Coastguard Worker " Group with B, C & D\n"
101*d83cc019SAndroid Build Coastguard Worker "\n"
102*d83cc019SAndroid Build Coastguard Worker " Basic B\n"
103*d83cc019SAndroid Build Coastguard Worker "\n"
104*d83cc019SAndroid Build Coastguard Worker "SUB C ../lib/tests/igt_describe.c:54:\n"
105*d83cc019SAndroid Build Coastguard Worker " Group with B, C & D\n"
106*d83cc019SAndroid Build Coastguard Worker "\n"
107*d83cc019SAndroid Build Coastguard Worker " Group with C & D\n"
108*d83cc019SAndroid Build Coastguard Worker "\n"
109*d83cc019SAndroid Build Coastguard Worker " Basic C\n"
110*d83cc019SAndroid Build Coastguard Worker "\n"
111*d83cc019SAndroid Build Coastguard Worker "SUB D ../lib/tests/igt_describe.c:58:\n"
112*d83cc019SAndroid Build Coastguard Worker " Group with B, C & D\n"
113*d83cc019SAndroid Build Coastguard Worker "\n"
114*d83cc019SAndroid Build Coastguard Worker " Group with C & D\n"
115*d83cc019SAndroid Build Coastguard Worker "\n"
116*d83cc019SAndroid Build Coastguard Worker "SUB E ../lib/tests/igt_describe.c:66:\n"
117*d83cc019SAndroid Build Coastguard Worker " NO DOCUMENTATION!\n"
118*d83cc019SAndroid Build Coastguard Worker "\n"
119*d83cc019SAndroid Build Coastguard Worker "SUB F ../lib/tests/igt_describe.c:71:\n"
120*d83cc019SAndroid Build Coastguard Worker " NO DOCUMENTATION!\n"
121*d83cc019SAndroid Build Coastguard Worker "\n"
122*d83cc019SAndroid Build Coastguard Worker "SUB G ../lib/tests/igt_describe.c:80:\n"
123*d83cc019SAndroid Build Coastguard Worker " this description should be so long that it wraps itself nicely in the terminal this\n"
124*d83cc019SAndroid Build Coastguard Worker " description should be so long that it wraps itself nicely in the terminal this description\n"
125*d83cc019SAndroid Build Coastguard Worker " should be so long that it wraps itself nicely in the terminal this description should be so\n"
126*d83cc019SAndroid Build Coastguard Worker " long that it wraps itself nicely in the terminal this description should be so long that it\n"
127*d83cc019SAndroid Build Coastguard Worker " wraps itself nicely in the terminal this description should be so long that it wraps itself\n"
128*d83cc019SAndroid Build Coastguard Worker " nicely in the terminal\n"
129*d83cc019SAndroid Build Coastguard Worker "\n"
130*d83cc019SAndroid Build Coastguard Worker "SUB F ../lib/tests/igt_describe.c:87:\n"
131*d83cc019SAndroid Build Coastguard Worker " verylongwordthatshoudlbeprintedeventhoughitspastthewrppinglimitverylongwordthatshoudlbeprintedeventhoughitspastthewrappinglimit\n"
132*d83cc019SAndroid Build Coastguard Worker " verylongwordthatshoudlbeprintedeventhoughitspastthewrappinglimitverylongwordthatshoudlbeprintedeventhoughitspastthewrappinglimit\n\n";
133*d83cc019SAndroid Build Coastguard Worker
134*d83cc019SAndroid Build Coastguard Worker static const char JUST_C_OUTPUT[] = \
135*d83cc019SAndroid Build Coastguard Worker "the top level description\n"
136*d83cc019SAndroid Build Coastguard Worker "\n"
137*d83cc019SAndroid Build Coastguard Worker "SUB C ../lib/tests/igt_describe.c:54:\n"
138*d83cc019SAndroid Build Coastguard Worker " Group with B, C & D\n"
139*d83cc019SAndroid Build Coastguard Worker "\n"
140*d83cc019SAndroid Build Coastguard Worker " Group with C & D\n"
141*d83cc019SAndroid Build Coastguard Worker "\n"
142*d83cc019SAndroid Build Coastguard Worker " Basic C\n"
143*d83cc019SAndroid Build Coastguard Worker "\n";
144*d83cc019SAndroid Build Coastguard Worker
assert_pipe_empty(int fd)145*d83cc019SAndroid Build Coastguard Worker static void assert_pipe_empty(int fd)
146*d83cc019SAndroid Build Coastguard Worker {
147*d83cc019SAndroid Build Coastguard Worker char buf[5];
148*d83cc019SAndroid Build Coastguard Worker internal_assert(0 == read(fd, buf, sizeof(buf)));
149*d83cc019SAndroid Build Coastguard Worker }
150*d83cc019SAndroid Build Coastguard Worker
read_whole_pipe(int fd,char * buf,size_t buflen)151*d83cc019SAndroid Build Coastguard Worker static void read_whole_pipe(int fd, char *buf, size_t buflen)
152*d83cc019SAndroid Build Coastguard Worker {
153*d83cc019SAndroid Build Coastguard Worker ssize_t readlen;
154*d83cc019SAndroid Build Coastguard Worker off_t offset;
155*d83cc019SAndroid Build Coastguard Worker
156*d83cc019SAndroid Build Coastguard Worker offset = 0;
157*d83cc019SAndroid Build Coastguard Worker while ((readlen = read(fd, buf+offset, buflen-offset))) {
158*d83cc019SAndroid Build Coastguard Worker if (readlen == -1) {
159*d83cc019SAndroid Build Coastguard Worker if (errno == EINTR) {
160*d83cc019SAndroid Build Coastguard Worker continue;
161*d83cc019SAndroid Build Coastguard Worker } else {
162*d83cc019SAndroid Build Coastguard Worker printf("read failed with %s\n", strerror(errno));
163*d83cc019SAndroid Build Coastguard Worker exit(1);
164*d83cc019SAndroid Build Coastguard Worker }
165*d83cc019SAndroid Build Coastguard Worker }
166*d83cc019SAndroid Build Coastguard Worker internal_assert(readlen != -1);
167*d83cc019SAndroid Build Coastguard Worker offset += readlen;
168*d83cc019SAndroid Build Coastguard Worker }
169*d83cc019SAndroid Build Coastguard Worker }
170*d83cc019SAndroid Build Coastguard Worker
do_fork(int argc,char ** argv,int * out,int * err)171*d83cc019SAndroid Build Coastguard Worker static pid_t do_fork(int argc, char **argv, int *out, int *err)
172*d83cc019SAndroid Build Coastguard Worker {
173*d83cc019SAndroid Build Coastguard Worker int outfd[2], errfd[2];
174*d83cc019SAndroid Build Coastguard Worker pid_t pid;
175*d83cc019SAndroid Build Coastguard Worker
176*d83cc019SAndroid Build Coastguard Worker internal_assert(pipe(outfd) != -1);
177*d83cc019SAndroid Build Coastguard Worker internal_assert(pipe(errfd) != -1);
178*d83cc019SAndroid Build Coastguard Worker
179*d83cc019SAndroid Build Coastguard Worker pid = fork();
180*d83cc019SAndroid Build Coastguard Worker internal_assert(pid != -1);
181*d83cc019SAndroid Build Coastguard Worker
182*d83cc019SAndroid Build Coastguard Worker if (pid == 0) {
183*d83cc019SAndroid Build Coastguard Worker while (dup2(outfd[1], STDOUT_FILENO) == -1 && errno == EINTR) {}
184*d83cc019SAndroid Build Coastguard Worker while (dup2(errfd[1], STDERR_FILENO) == -1 && errno == EINTR) {}
185*d83cc019SAndroid Build Coastguard Worker
186*d83cc019SAndroid Build Coastguard Worker close(outfd[0]);
187*d83cc019SAndroid Build Coastguard Worker close(outfd[1]);
188*d83cc019SAndroid Build Coastguard Worker close(errfd[0]);
189*d83cc019SAndroid Build Coastguard Worker close(errfd[1]);
190*d83cc019SAndroid Build Coastguard Worker
191*d83cc019SAndroid Build Coastguard Worker fake_main(argc, argv);
192*d83cc019SAndroid Build Coastguard Worker
193*d83cc019SAndroid Build Coastguard Worker exit(-1);
194*d83cc019SAndroid Build Coastguard Worker } else {
195*d83cc019SAndroid Build Coastguard Worker /* close the writing ends */
196*d83cc019SAndroid Build Coastguard Worker close(outfd[1]);
197*d83cc019SAndroid Build Coastguard Worker close(errfd[1]);
198*d83cc019SAndroid Build Coastguard Worker
199*d83cc019SAndroid Build Coastguard Worker *out = outfd[0];
200*d83cc019SAndroid Build Coastguard Worker *err = errfd[0];
201*d83cc019SAndroid Build Coastguard Worker
202*d83cc019SAndroid Build Coastguard Worker return pid;
203*d83cc019SAndroid Build Coastguard Worker }
204*d83cc019SAndroid Build Coastguard Worker }
205*d83cc019SAndroid Build Coastguard Worker
_wait(pid_t pid,int * status)206*d83cc019SAndroid Build Coastguard Worker static int _wait(pid_t pid, int *status) {
207*d83cc019SAndroid Build Coastguard Worker int ret;
208*d83cc019SAndroid Build Coastguard Worker
209*d83cc019SAndroid Build Coastguard Worker do {
210*d83cc019SAndroid Build Coastguard Worker ret = waitpid(pid, status, 0);
211*d83cc019SAndroid Build Coastguard Worker } while (ret == -1 && errno == EINTR);
212*d83cc019SAndroid Build Coastguard Worker
213*d83cc019SAndroid Build Coastguard Worker return ret;
214*d83cc019SAndroid Build Coastguard Worker }
215*d83cc019SAndroid Build Coastguard Worker
main(int argc,char ** argv)216*d83cc019SAndroid Build Coastguard Worker int main(int argc, char **argv)
217*d83cc019SAndroid Build Coastguard Worker {
218*d83cc019SAndroid Build Coastguard Worker char prog[] = "igt_describe";
219*d83cc019SAndroid Build Coastguard Worker int status;
220*d83cc019SAndroid Build Coastguard Worker int outfd, errfd;
221*d83cc019SAndroid Build Coastguard Worker
222*d83cc019SAndroid Build Coastguard Worker /* describe all subtest */ {
223*d83cc019SAndroid Build Coastguard Worker static char out[4096];
224*d83cc019SAndroid Build Coastguard Worker char arg[] = "--describe";
225*d83cc019SAndroid Build Coastguard Worker char *fake_argv[] = {prog, arg};
226*d83cc019SAndroid Build Coastguard Worker int fake_argc = ARRAY_SIZE(fake_argv);
227*d83cc019SAndroid Build Coastguard Worker
228*d83cc019SAndroid Build Coastguard Worker pid_t pid = do_fork(fake_argc, fake_argv, &outfd, &errfd);
229*d83cc019SAndroid Build Coastguard Worker
230*d83cc019SAndroid Build Coastguard Worker read_whole_pipe(outfd, out, sizeof(out));
231*d83cc019SAndroid Build Coastguard Worker assert_pipe_empty(errfd);
232*d83cc019SAndroid Build Coastguard Worker
233*d83cc019SAndroid Build Coastguard Worker internal_assert(_wait(pid, &status) != -1);
234*d83cc019SAndroid Build Coastguard Worker internal_assert(WIFEXITED(status));
235*d83cc019SAndroid Build Coastguard Worker internal_assert(WEXITSTATUS(status) == IGT_EXIT_SUCCESS);
236*d83cc019SAndroid Build Coastguard Worker internal_assert(0 == strcmp(DESCRIBE_ALL_OUTPUT, out));
237*d83cc019SAndroid Build Coastguard Worker
238*d83cc019SAndroid Build Coastguard Worker close(outfd);
239*d83cc019SAndroid Build Coastguard Worker close(errfd);
240*d83cc019SAndroid Build Coastguard Worker }
241*d83cc019SAndroid Build Coastguard Worker
242*d83cc019SAndroid Build Coastguard Worker /* describe C using a pattern */ {
243*d83cc019SAndroid Build Coastguard Worker static char out[4096];
244*d83cc019SAndroid Build Coastguard Worker char arg[] = "--describe=C";
245*d83cc019SAndroid Build Coastguard Worker char *fake_argv[] = {prog, arg};
246*d83cc019SAndroid Build Coastguard Worker int fake_argc = ARRAY_SIZE(fake_argv);
247*d83cc019SAndroid Build Coastguard Worker
248*d83cc019SAndroid Build Coastguard Worker pid_t pid = do_fork(fake_argc, fake_argv, &outfd, &errfd);
249*d83cc019SAndroid Build Coastguard Worker
250*d83cc019SAndroid Build Coastguard Worker read_whole_pipe(outfd, out, sizeof(out));
251*d83cc019SAndroid Build Coastguard Worker assert_pipe_empty(errfd);
252*d83cc019SAndroid Build Coastguard Worker
253*d83cc019SAndroid Build Coastguard Worker internal_assert(_wait(pid, &status) != -1);
254*d83cc019SAndroid Build Coastguard Worker internal_assert(WIFEXITED(status));
255*d83cc019SAndroid Build Coastguard Worker internal_assert(WEXITSTATUS(status) == IGT_EXIT_SUCCESS);
256*d83cc019SAndroid Build Coastguard Worker internal_assert(0 == strcmp(JUST_C_OUTPUT, out));
257*d83cc019SAndroid Build Coastguard Worker
258*d83cc019SAndroid Build Coastguard Worker close(outfd);
259*d83cc019SAndroid Build Coastguard Worker close(errfd);
260*d83cc019SAndroid Build Coastguard Worker }
261*d83cc019SAndroid Build Coastguard Worker
262*d83cc019SAndroid Build Coastguard Worker /* fail describing with a bad pattern */ {
263*d83cc019SAndroid Build Coastguard Worker static char err[4096];
264*d83cc019SAndroid Build Coastguard Worker char arg[] = "--describe=Z";
265*d83cc019SAndroid Build Coastguard Worker char *fake_argv[] = {prog, arg};
266*d83cc019SAndroid Build Coastguard Worker int fake_argc = ARRAY_SIZE(fake_argv);
267*d83cc019SAndroid Build Coastguard Worker
268*d83cc019SAndroid Build Coastguard Worker pid_t pid = do_fork(fake_argc, fake_argv, &outfd, &errfd);
269*d83cc019SAndroid Build Coastguard Worker
270*d83cc019SAndroid Build Coastguard Worker read_whole_pipe(errfd, err, sizeof(err));
271*d83cc019SAndroid Build Coastguard Worker
272*d83cc019SAndroid Build Coastguard Worker internal_assert(_wait(pid, &status) != -1);
273*d83cc019SAndroid Build Coastguard Worker internal_assert(WIFEXITED(status));
274*d83cc019SAndroid Build Coastguard Worker internal_assert(WEXITSTATUS(status) == IGT_EXIT_INVALID);
275*d83cc019SAndroid Build Coastguard Worker internal_assert(strstr(err, "Unknown subtest: Z"));
276*d83cc019SAndroid Build Coastguard Worker
277*d83cc019SAndroid Build Coastguard Worker close(outfd);
278*d83cc019SAndroid Build Coastguard Worker close(errfd);
279*d83cc019SAndroid Build Coastguard Worker }
280*d83cc019SAndroid Build Coastguard Worker
281*d83cc019SAndroid Build Coastguard Worker return 0;
282*d83cc019SAndroid Build Coastguard Worker }
283