xref: /aosp_15_r20/external/igt-gpu-tools/lib/tests/igt_describe.c (revision d83cc019efdc2edc6c4b16e9034a3ceb8d35d77c)
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