testsuite.c revision fa0046ba83bdb6d7e7a6c5285ab0082294a2ff5a
1e701e381faac8977f472b881d426335b869998dcLucas De Marchi/*
2e701e381faac8977f472b881d426335b869998dcLucas De Marchi * Copyright (C) 2012  ProFUSION embedded systems
3e701e381faac8977f472b881d426335b869998dcLucas De Marchi *
4e701e381faac8977f472b881d426335b869998dcLucas De Marchi * This program is free software: you can redistribute it and/or modify
5e701e381faac8977f472b881d426335b869998dcLucas De Marchi * it under the terms of the GNU General Public License as published by
6e701e381faac8977f472b881d426335b869998dcLucas De Marchi * the Free Software Foundation, either version 2 of the License, or
7e701e381faac8977f472b881d426335b869998dcLucas De Marchi * (at your option) any later version.
8e701e381faac8977f472b881d426335b869998dcLucas De Marchi *
9e701e381faac8977f472b881d426335b869998dcLucas De Marchi * This program is distributed in the hope that it will be useful,
10e701e381faac8977f472b881d426335b869998dcLucas De Marchi * but WITHOUT ANY WARRANTY; without even the implied warranty of
11e701e381faac8977f472b881d426335b869998dcLucas De Marchi * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12e701e381faac8977f472b881d426335b869998dcLucas De Marchi * GNU General Public License for more details.
13e701e381faac8977f472b881d426335b869998dcLucas De Marchi *
14e701e381faac8977f472b881d426335b869998dcLucas De Marchi * You should have received a copy of the GNU General Public License
15e701e381faac8977f472b881d426335b869998dcLucas De Marchi * along with this program.  If not, see <http://www.gnu.org/licenses/>.
16e701e381faac8977f472b881d426335b869998dcLucas De Marchi */
17e701e381faac8977f472b881d426335b869998dcLucas De Marchi
1880f9e02382fa9e65ec903dd53d62f949078205eeLucas De Marchi#include <errno.h>
1980f9e02382fa9e65ec903dd53d62f949078205eeLucas De Marchi#include <fcntl.h>
2080f9e02382fa9e65ec903dd53d62f949078205eeLucas De Marchi#include <getopt.h>
2180f9e02382fa9e65ec903dd53d62f949078205eeLucas De Marchi#include <limits.h>
2280f9e02382fa9e65ec903dd53d62f949078205eeLucas De Marchi#include <stdio.h>
2380f9e02382fa9e65ec903dd53d62f949078205eeLucas De Marchi#include <stdarg.h>
2480f9e02382fa9e65ec903dd53d62f949078205eeLucas De Marchi#include <stdlib.h>
2580f9e02382fa9e65ec903dd53d62f949078205eeLucas De Marchi#include <string.h>
2680f9e02382fa9e65ec903dd53d62f949078205eeLucas De Marchi#include <unistd.h>
273dbb8dea5ff4fb23484b604d0c4b9c9ae77a03a5Lucas De Marchi#include <sys/epoll.h>
2880f9e02382fa9e65ec903dd53d62f949078205eeLucas De Marchi#include <sys/prctl.h>
2980f9e02382fa9e65ec903dd53d62f949078205eeLucas De Marchi#include <sys/wait.h>
3080f9e02382fa9e65ec903dd53d62f949078205eeLucas De Marchi
3180f9e02382fa9e65ec903dd53d62f949078205eeLucas De Marchi#include "testsuite.h"
3280f9e02382fa9e65ec903dd53d62f949078205eeLucas De Marchi
3351b1d1ab28b594ab1369fe411a6be3bce40da51cLucas De Marchistatic const char *ANSI_HIGHLIGHT_GREEN_ON = "\x1B[1;32m";
3451b1d1ab28b594ab1369fe411a6be3bce40da51cLucas De Marchistatic const char *ANSI_HIGHLIGHT_RED_ON =  "\x1B[1;31m";
3551b1d1ab28b594ab1369fe411a6be3bce40da51cLucas De Marchistatic const char *ANSI_HIGHLIGHT_OFF = "\x1B[0m";
3651b1d1ab28b594ab1369fe411a6be3bce40da51cLucas De Marchi
3780f9e02382fa9e65ec903dd53d62f949078205eeLucas De Marchistatic const char *progname;
38ed2df4e9845d58f46ec4405855036f25e8f72876Lucas De Marchistatic int oneshot = 0;
3980f9e02382fa9e65ec903dd53d62f949078205eeLucas De Marchistatic const char options_short[] = "lhn";
4080f9e02382fa9e65ec903dd53d62f949078205eeLucas De Marchistatic const struct option options[] = {
4180f9e02382fa9e65ec903dd53d62f949078205eeLucas De Marchi	{ "list", no_argument, 0, 'l' },
4280f9e02382fa9e65ec903dd53d62f949078205eeLucas De Marchi	{ "help", no_argument, 0, 'h' },
4380f9e02382fa9e65ec903dd53d62f949078205eeLucas De Marchi	{ NULL, 0, 0, 0 }
4480f9e02382fa9e65ec903dd53d62f949078205eeLucas De Marchi};
4580f9e02382fa9e65ec903dd53d62f949078205eeLucas De Marchi
46d2c2b8b500bfea8882dea0b6f0b68d8531860ea8Lucas De Marchi#define OVERRIDE_LIBDIR ABS_TOP_BUILDDIR "/testsuite/.libs/"
47d2c2b8b500bfea8882dea0b6f0b68d8531860ea8Lucas De Marchi
48395478cbbbd5b68a65514ee1e41e634d3d5d62dbLucas De Marchistruct _env_config {
49395478cbbbd5b68a65514ee1e41e634d3d5d62dbLucas De Marchi	const char *key;
50395478cbbbd5b68a65514ee1e41e634d3d5d62dbLucas De Marchi	const char *ldpreload;
51395478cbbbd5b68a65514ee1e41e634d3d5d62dbLucas De Marchi} env_config[_TC_LAST] = {
52d2c2b8b500bfea8882dea0b6f0b68d8531860ea8Lucas De Marchi	[TC_UNAME_R] = { S_TC_UNAME_R, OVERRIDE_LIBDIR  "uname.so" },
53d2c2b8b500bfea8882dea0b6f0b68d8531860ea8Lucas De Marchi	[TC_ROOTFS] = { S_TC_ROOTFS, OVERRIDE_LIBDIR "path.so" },
54d2c2b8b500bfea8882dea0b6f0b68d8531860ea8Lucas De Marchi	[TC_INIT_MODULE_RETCODES] = { S_TC_INIT_MODULE_RETCODES, OVERRIDE_LIBDIR "init_module.so" },
55f6ef5d6b5fa47ab5fa9c9275eaa38916b92ca5a4Lucas De Marchi	[TC_DELETE_MODULE_RETCODES] = { S_TC_DELETE_MODULE_RETCODES, OVERRIDE_LIBDIR "delete_module.so" },
56395478cbbbd5b68a65514ee1e41e634d3d5d62dbLucas De Marchi};
57395478cbbbd5b68a65514ee1e41e634d3d5d62dbLucas De Marchi
5880f9e02382fa9e65ec903dd53d62f949078205eeLucas De Marchistatic void help(void)
5980f9e02382fa9e65ec903dd53d62f949078205eeLucas De Marchi{
6080f9e02382fa9e65ec903dd53d62f949078205eeLucas De Marchi	const struct option *itr;
6180f9e02382fa9e65ec903dd53d62f949078205eeLucas De Marchi	const char *itr_short;
6280f9e02382fa9e65ec903dd53d62f949078205eeLucas De Marchi
6380f9e02382fa9e65ec903dd53d62f949078205eeLucas De Marchi	printf("Usage:\n"
6480f9e02382fa9e65ec903dd53d62f949078205eeLucas De Marchi	       "\t%s [options] <test>\n"
6580f9e02382fa9e65ec903dd53d62f949078205eeLucas De Marchi	       "Options:\n", basename(progname));
6680f9e02382fa9e65ec903dd53d62f949078205eeLucas De Marchi
6780f9e02382fa9e65ec903dd53d62f949078205eeLucas De Marchi	for (itr = options, itr_short = options_short;
6880f9e02382fa9e65ec903dd53d62f949078205eeLucas De Marchi				itr->name != NULL; itr++, itr_short++)
6980f9e02382fa9e65ec903dd53d62f949078205eeLucas De Marchi		printf("\t-%c, --%s\n", *itr_short, itr->name);
7080f9e02382fa9e65ec903dd53d62f949078205eeLucas De Marchi}
7180f9e02382fa9e65ec903dd53d62f949078205eeLucas De Marchi
7280f9e02382fa9e65ec903dd53d62f949078205eeLucas De Marchistatic void test_list(const struct test *tests[])
7380f9e02382fa9e65ec903dd53d62f949078205eeLucas De Marchi{
7480f9e02382fa9e65ec903dd53d62f949078205eeLucas De Marchi	size_t i;
7580f9e02382fa9e65ec903dd53d62f949078205eeLucas De Marchi
7680f9e02382fa9e65ec903dd53d62f949078205eeLucas De Marchi	printf("Available tests:\n");
7780f9e02382fa9e65ec903dd53d62f949078205eeLucas De Marchi	for (i = 0; tests[i] != NULL; i++)
7880f9e02382fa9e65ec903dd53d62f949078205eeLucas De Marchi		printf("\t%s, %s\n", tests[i]->name, tests[i]->description);
7980f9e02382fa9e65ec903dd53d62f949078205eeLucas De Marchi}
8080f9e02382fa9e65ec903dd53d62f949078205eeLucas De Marchi
8180f9e02382fa9e65ec903dd53d62f949078205eeLucas De Marchiint test_init(int argc, char *const argv[], const struct test *tests[])
8280f9e02382fa9e65ec903dd53d62f949078205eeLucas De Marchi{
8380f9e02382fa9e65ec903dd53d62f949078205eeLucas De Marchi	progname = argv[0];
8480f9e02382fa9e65ec903dd53d62f949078205eeLucas De Marchi
8580f9e02382fa9e65ec903dd53d62f949078205eeLucas De Marchi	for (;;) {
8680f9e02382fa9e65ec903dd53d62f949078205eeLucas De Marchi		int c, idx = 0;
8780f9e02382fa9e65ec903dd53d62f949078205eeLucas De Marchi		c = getopt_long(argc, argv, options_short, options, &idx);
8880f9e02382fa9e65ec903dd53d62f949078205eeLucas De Marchi		if (c == -1)
8980f9e02382fa9e65ec903dd53d62f949078205eeLucas De Marchi			break;
9080f9e02382fa9e65ec903dd53d62f949078205eeLucas De Marchi		switch (c) {
9180f9e02382fa9e65ec903dd53d62f949078205eeLucas De Marchi		case 'l':
9280f9e02382fa9e65ec903dd53d62f949078205eeLucas De Marchi			test_list(tests);
9380f9e02382fa9e65ec903dd53d62f949078205eeLucas De Marchi			return 0;
9480f9e02382fa9e65ec903dd53d62f949078205eeLucas De Marchi		case 'h':
9580f9e02382fa9e65ec903dd53d62f949078205eeLucas De Marchi			help();
9680f9e02382fa9e65ec903dd53d62f949078205eeLucas De Marchi			return 0;
9780f9e02382fa9e65ec903dd53d62f949078205eeLucas De Marchi		case 'n':
9880f9e02382fa9e65ec903dd53d62f949078205eeLucas De Marchi			oneshot = 1;
9980f9e02382fa9e65ec903dd53d62f949078205eeLucas De Marchi			break;
10080f9e02382fa9e65ec903dd53d62f949078205eeLucas De Marchi		case '?':
10180f9e02382fa9e65ec903dd53d62f949078205eeLucas De Marchi			return -1;
10280f9e02382fa9e65ec903dd53d62f949078205eeLucas De Marchi		default:
10380f9e02382fa9e65ec903dd53d62f949078205eeLucas De Marchi			ERR("unexpected getopt_long() value %c\n", c);
10480f9e02382fa9e65ec903dd53d62f949078205eeLucas De Marchi			return -1;
10580f9e02382fa9e65ec903dd53d62f949078205eeLucas De Marchi		}
10680f9e02382fa9e65ec903dd53d62f949078205eeLucas De Marchi	}
10780f9e02382fa9e65ec903dd53d62f949078205eeLucas De Marchi
10851b1d1ab28b594ab1369fe411a6be3bce40da51cLucas De Marchi	if (isatty(STDOUT_FILENO) == 0) {
10951b1d1ab28b594ab1369fe411a6be3bce40da51cLucas De Marchi		ANSI_HIGHLIGHT_OFF = "";
11051b1d1ab28b594ab1369fe411a6be3bce40da51cLucas De Marchi		ANSI_HIGHLIGHT_RED_ON = "";
11151b1d1ab28b594ab1369fe411a6be3bce40da51cLucas De Marchi		ANSI_HIGHLIGHT_GREEN_ON = "";
11251b1d1ab28b594ab1369fe411a6be3bce40da51cLucas De Marchi	}
11351b1d1ab28b594ab1369fe411a6be3bce40da51cLucas De Marchi
11480f9e02382fa9e65ec903dd53d62f949078205eeLucas De Marchi	return optind;
11580f9e02382fa9e65ec903dd53d62f949078205eeLucas De Marchi}
11680f9e02382fa9e65ec903dd53d62f949078205eeLucas De Marchi
11780f9e02382fa9e65ec903dd53d62f949078205eeLucas De Marchiconst struct test *test_find(const struct test *tests[], const char *name)
11880f9e02382fa9e65ec903dd53d62f949078205eeLucas De Marchi{
11980f9e02382fa9e65ec903dd53d62f949078205eeLucas De Marchi	size_t i;
12080f9e02382fa9e65ec903dd53d62f949078205eeLucas De Marchi
12180f9e02382fa9e65ec903dd53d62f949078205eeLucas De Marchi	for (i = 0; tests[i] != NULL; i++) {
12280f9e02382fa9e65ec903dd53d62f949078205eeLucas De Marchi		if (strcmp(tests[i]->name, name) == 0)
12380f9e02382fa9e65ec903dd53d62f949078205eeLucas De Marchi			return tests[i];
12480f9e02382fa9e65ec903dd53d62f949078205eeLucas De Marchi	}
12580f9e02382fa9e65ec903dd53d62f949078205eeLucas De Marchi
12680f9e02382fa9e65ec903dd53d62f949078205eeLucas De Marchi	return NULL;
12780f9e02382fa9e65ec903dd53d62f949078205eeLucas De Marchi}
12880f9e02382fa9e65ec903dd53d62f949078205eeLucas De Marchi
129ed2df4e9845d58f46ec4405855036f25e8f72876Lucas De Marchistatic int test_spawn_test(const struct test *t)
13080f9e02382fa9e65ec903dd53d62f949078205eeLucas De Marchi{
13180f9e02382fa9e65ec903dd53d62f949078205eeLucas De Marchi	const char *const args[] = { progname, "-n", t->name, NULL };
13280f9e02382fa9e65ec903dd53d62f949078205eeLucas De Marchi
13380f9e02382fa9e65ec903dd53d62f949078205eeLucas De Marchi	execv(progname, (char *const *) args);
13480f9e02382fa9e65ec903dd53d62f949078205eeLucas De Marchi
13580f9e02382fa9e65ec903dd53d62f949078205eeLucas De Marchi	ERR("failed to spawn %s for %s: %m\n", progname, t->name);
13680f9e02382fa9e65ec903dd53d62f949078205eeLucas De Marchi	return EXIT_FAILURE;
13780f9e02382fa9e65ec903dd53d62f949078205eeLucas De Marchi}
13880f9e02382fa9e65ec903dd53d62f949078205eeLucas De Marchi
139ed2df4e9845d58f46ec4405855036f25e8f72876Lucas De Marchistatic int test_run_spawned(const struct test *t)
140ed2df4e9845d58f46ec4405855036f25e8f72876Lucas De Marchi{
141ed2df4e9845d58f46ec4405855036f25e8f72876Lucas De Marchi	int err = t->func(t);
142ed2df4e9845d58f46ec4405855036f25e8f72876Lucas De Marchi	exit(err);
143ed2df4e9845d58f46ec4405855036f25e8f72876Lucas De Marchi
144ed2df4e9845d58f46ec4405855036f25e8f72876Lucas De Marchi	return EXIT_FAILURE;
145ed2df4e9845d58f46ec4405855036f25e8f72876Lucas De Marchi}
146ed2df4e9845d58f46ec4405855036f25e8f72876Lucas De Marchi
1479e3b9d2e8cf295957ddad359abc80228a027ebf7Lucas De Marchiint test_spawn_prog(const char *prog, const char *const args[])
14880f9e02382fa9e65ec903dd53d62f949078205eeLucas De Marchi{
14980f9e02382fa9e65ec903dd53d62f949078205eeLucas De Marchi	execv(prog, (char *const *) args);
15080f9e02382fa9e65ec903dd53d62f949078205eeLucas De Marchi
1519e3b9d2e8cf295957ddad359abc80228a027ebf7Lucas De Marchi	ERR("failed to spawn %s\n", prog);
1529e3b9d2e8cf295957ddad359abc80228a027ebf7Lucas De Marchi	ERR("did you forget to build tools?\n");
15380f9e02382fa9e65ec903dd53d62f949078205eeLucas De Marchi	return EXIT_FAILURE;
15480f9e02382fa9e65ec903dd53d62f949078205eeLucas De Marchi}
15580f9e02382fa9e65ec903dd53d62f949078205eeLucas De Marchi
156395478cbbbd5b68a65514ee1e41e634d3d5d62dbLucas De Marchistatic void test_export_environ(const struct test *t)
15780f9e02382fa9e65ec903dd53d62f949078205eeLucas De Marchi{
158395478cbbbd5b68a65514ee1e41e634d3d5d62dbLucas De Marchi	char *preload = NULL;
159395478cbbbd5b68a65514ee1e41e634d3d5d62dbLucas De Marchi	size_t preloadlen = 0;
160395478cbbbd5b68a65514ee1e41e634d3d5d62dbLucas De Marchi	size_t i;
161395478cbbbd5b68a65514ee1e41e634d3d5d62dbLucas De Marchi
162395478cbbbd5b68a65514ee1e41e634d3d5d62dbLucas De Marchi	unsetenv("LD_PRELOAD");
163395478cbbbd5b68a65514ee1e41e634d3d5d62dbLucas De Marchi
164395478cbbbd5b68a65514ee1e41e634d3d5d62dbLucas De Marchi	for (i = 0; i < _TC_LAST; i++) {
165395478cbbbd5b68a65514ee1e41e634d3d5d62dbLucas De Marchi		const char *ldpreload;
166395478cbbbd5b68a65514ee1e41e634d3d5d62dbLucas De Marchi		size_t ldpreloadlen;
167395478cbbbd5b68a65514ee1e41e634d3d5d62dbLucas De Marchi		char *tmp;
168395478cbbbd5b68a65514ee1e41e634d3d5d62dbLucas De Marchi
169395478cbbbd5b68a65514ee1e41e634d3d5d62dbLucas De Marchi		if (t->config[i] == NULL)
170395478cbbbd5b68a65514ee1e41e634d3d5d62dbLucas De Marchi			continue;
171395478cbbbd5b68a65514ee1e41e634d3d5d62dbLucas De Marchi
172395478cbbbd5b68a65514ee1e41e634d3d5d62dbLucas De Marchi		setenv(env_config[i].key, t->config[i], 1);
173395478cbbbd5b68a65514ee1e41e634d3d5d62dbLucas De Marchi
174395478cbbbd5b68a65514ee1e41e634d3d5d62dbLucas De Marchi		ldpreload = env_config[i].ldpreload;
175395478cbbbd5b68a65514ee1e41e634d3d5d62dbLucas De Marchi		ldpreloadlen = strlen(ldpreload);
176395478cbbbd5b68a65514ee1e41e634d3d5d62dbLucas De Marchi		tmp = realloc(preload, preloadlen + 2 + ldpreloadlen);
177395478cbbbd5b68a65514ee1e41e634d3d5d62dbLucas De Marchi		if (tmp == NULL) {
178395478cbbbd5b68a65514ee1e41e634d3d5d62dbLucas De Marchi			ERR("oom: test_export_environ()\n");
179395478cbbbd5b68a65514ee1e41e634d3d5d62dbLucas De Marchi			return;
180395478cbbbd5b68a65514ee1e41e634d3d5d62dbLucas De Marchi		}
181395478cbbbd5b68a65514ee1e41e634d3d5d62dbLucas De Marchi		preload = tmp;
182395478cbbbd5b68a65514ee1e41e634d3d5d62dbLucas De Marchi
183395478cbbbd5b68a65514ee1e41e634d3d5d62dbLucas De Marchi		if (preloadlen > 0)
184395478cbbbd5b68a65514ee1e41e634d3d5d62dbLucas De Marchi			preload[preloadlen++] = ' ';
185395478cbbbd5b68a65514ee1e41e634d3d5d62dbLucas De Marchi		memcpy(preload + preloadlen, ldpreload, ldpreloadlen);
186395478cbbbd5b68a65514ee1e41e634d3d5d62dbLucas De Marchi		preloadlen += ldpreloadlen;
187395478cbbbd5b68a65514ee1e41e634d3d5d62dbLucas De Marchi		preload[preloadlen] = '\0';
188395478cbbbd5b68a65514ee1e41e634d3d5d62dbLucas De Marchi	}
189395478cbbbd5b68a65514ee1e41e634d3d5d62dbLucas De Marchi
190395478cbbbd5b68a65514ee1e41e634d3d5d62dbLucas De Marchi	if (preload != NULL)
191395478cbbbd5b68a65514ee1e41e634d3d5d62dbLucas De Marchi		setenv("LD_PRELOAD", preload, 1);
192395478cbbbd5b68a65514ee1e41e634d3d5d62dbLucas De Marchi
193395478cbbbd5b68a65514ee1e41e634d3d5d62dbLucas De Marchi	free(preload);
19480f9e02382fa9e65ec903dd53d62f949078205eeLucas De Marchi}
19580f9e02382fa9e65ec903dd53d62f949078205eeLucas De Marchi
1963dbb8dea5ff4fb23484b604d0c4b9c9ae77a03a5Lucas De Marchistatic inline int test_run_child(const struct test *t, int fdout[2],
1973dbb8dea5ff4fb23484b604d0c4b9c9ae77a03a5Lucas De Marchi								int fderr[2])
19880f9e02382fa9e65ec903dd53d62f949078205eeLucas De Marchi{
19945481ee28c44c66a25015b7682f355d093c3b94aLucas De Marchi	/* kill child if parent dies */
20045481ee28c44c66a25015b7682f355d093c3b94aLucas De Marchi	prctl(PR_SET_PDEATHSIG, SIGTERM);
20145481ee28c44c66a25015b7682f355d093c3b94aLucas De Marchi
20245481ee28c44c66a25015b7682f355d093c3b94aLucas De Marchi	test_export_environ(t);
20345481ee28c44c66a25015b7682f355d093c3b94aLucas De Marchi
2043dbb8dea5ff4fb23484b604d0c4b9c9ae77a03a5Lucas De Marchi	/* Close read-fds and redirect std{out,err} to the write-fds */
2053dbb8dea5ff4fb23484b604d0c4b9c9ae77a03a5Lucas De Marchi	if (t->output.stdout != NULL) {
2063dbb8dea5ff4fb23484b604d0c4b9c9ae77a03a5Lucas De Marchi		close(fdout[0]);
2073dbb8dea5ff4fb23484b604d0c4b9c9ae77a03a5Lucas De Marchi		if (dup2(fdout[1], STDOUT_FILENO) < 0) {
2083dbb8dea5ff4fb23484b604d0c4b9c9ae77a03a5Lucas De Marchi			ERR("could not redirect stdout to pipe: %m");
2093dbb8dea5ff4fb23484b604d0c4b9c9ae77a03a5Lucas De Marchi			exit(EXIT_FAILURE);
2103dbb8dea5ff4fb23484b604d0c4b9c9ae77a03a5Lucas De Marchi		}
2113dbb8dea5ff4fb23484b604d0c4b9c9ae77a03a5Lucas De Marchi	}
2123dbb8dea5ff4fb23484b604d0c4b9c9ae77a03a5Lucas De Marchi
2133dbb8dea5ff4fb23484b604d0c4b9c9ae77a03a5Lucas De Marchi	if (t->output.stderr != NULL) {
2143dbb8dea5ff4fb23484b604d0c4b9c9ae77a03a5Lucas De Marchi		close(fderr[0]);
2153dbb8dea5ff4fb23484b604d0c4b9c9ae77a03a5Lucas De Marchi		if (dup2(fderr[1], STDERR_FILENO) < 0) {
2163dbb8dea5ff4fb23484b604d0c4b9c9ae77a03a5Lucas De Marchi			ERR("could not redirect stdout to pipe: %m");
2173dbb8dea5ff4fb23484b604d0c4b9c9ae77a03a5Lucas De Marchi			exit(EXIT_FAILURE);
2183dbb8dea5ff4fb23484b604d0c4b9c9ae77a03a5Lucas De Marchi		}
2193dbb8dea5ff4fb23484b604d0c4b9c9ae77a03a5Lucas De Marchi	}
2203dbb8dea5ff4fb23484b604d0c4b9c9ae77a03a5Lucas De Marchi
22145481ee28c44c66a25015b7682f355d093c3b94aLucas De Marchi	if (t->need_spawn)
22245481ee28c44c66a25015b7682f355d093c3b94aLucas De Marchi		return test_spawn_test(t);
22345481ee28c44c66a25015b7682f355d093c3b94aLucas De Marchi	else
22445481ee28c44c66a25015b7682f355d093c3b94aLucas De Marchi		return test_run_spawned(t);
22545481ee28c44c66a25015b7682f355d093c3b94aLucas De Marchi}
22645481ee28c44c66a25015b7682f355d093c3b94aLucas De Marchi
2273dbb8dea5ff4fb23484b604d0c4b9c9ae77a03a5Lucas De Marchistatic inline bool test_run_parent_check_outputs(const struct test *t,
2283dbb8dea5ff4fb23484b604d0c4b9c9ae77a03a5Lucas De Marchi							int fdout, int fderr)
2293dbb8dea5ff4fb23484b604d0c4b9c9ae77a03a5Lucas De Marchi{
2303dbb8dea5ff4fb23484b604d0c4b9c9ae77a03a5Lucas De Marchi	struct epoll_event ep_outpipe, ep_errpipe;
2313dbb8dea5ff4fb23484b604d0c4b9c9ae77a03a5Lucas De Marchi	int err, fd_ep, fd_matchout = -1, fd_matcherr = -1;
2323dbb8dea5ff4fb23484b604d0c4b9c9ae77a03a5Lucas De Marchi
2333dbb8dea5ff4fb23484b604d0c4b9c9ae77a03a5Lucas De Marchi	if (t->output.stdout == NULL && t->output.stderr == NULL)
2343dbb8dea5ff4fb23484b604d0c4b9c9ae77a03a5Lucas De Marchi		return true;
2353dbb8dea5ff4fb23484b604d0c4b9c9ae77a03a5Lucas De Marchi
2363dbb8dea5ff4fb23484b604d0c4b9c9ae77a03a5Lucas De Marchi	fd_ep = epoll_create1(EPOLL_CLOEXEC);
2373dbb8dea5ff4fb23484b604d0c4b9c9ae77a03a5Lucas De Marchi	if (fd_ep < 0) {
2383dbb8dea5ff4fb23484b604d0c4b9c9ae77a03a5Lucas De Marchi		ERR("could not create epoll fd: %m\n");
2393dbb8dea5ff4fb23484b604d0c4b9c9ae77a03a5Lucas De Marchi		return false;
2403dbb8dea5ff4fb23484b604d0c4b9c9ae77a03a5Lucas De Marchi	}
2413dbb8dea5ff4fb23484b604d0c4b9c9ae77a03a5Lucas De Marchi
2423dbb8dea5ff4fb23484b604d0c4b9c9ae77a03a5Lucas De Marchi	if (t->output.stdout != NULL) {
2433dbb8dea5ff4fb23484b604d0c4b9c9ae77a03a5Lucas De Marchi		fd_matchout = open(t->output.stdout, O_RDONLY);
2443dbb8dea5ff4fb23484b604d0c4b9c9ae77a03a5Lucas De Marchi		if (fd_matchout < 0) {
2453dbb8dea5ff4fb23484b604d0c4b9c9ae77a03a5Lucas De Marchi			err = -errno;
2463dbb8dea5ff4fb23484b604d0c4b9c9ae77a03a5Lucas De Marchi			ERR("could not open %s for read: %m\n",
2473dbb8dea5ff4fb23484b604d0c4b9c9ae77a03a5Lucas De Marchi							t->output.stdout);
2483dbb8dea5ff4fb23484b604d0c4b9c9ae77a03a5Lucas De Marchi			goto out;
2493dbb8dea5ff4fb23484b604d0c4b9c9ae77a03a5Lucas De Marchi		}
2503dbb8dea5ff4fb23484b604d0c4b9c9ae77a03a5Lucas De Marchi		memset(&ep_outpipe, 0, sizeof(struct epoll_event));
2513dbb8dea5ff4fb23484b604d0c4b9c9ae77a03a5Lucas De Marchi		ep_outpipe.events = EPOLLIN;
2523dbb8dea5ff4fb23484b604d0c4b9c9ae77a03a5Lucas De Marchi		ep_outpipe.data.ptr = &fdout;
2533dbb8dea5ff4fb23484b604d0c4b9c9ae77a03a5Lucas De Marchi		if (epoll_ctl(fd_ep, EPOLL_CTL_ADD, fdout, &ep_outpipe) < 0) {
2543dbb8dea5ff4fb23484b604d0c4b9c9ae77a03a5Lucas De Marchi			err = -errno;
2553dbb8dea5ff4fb23484b604d0c4b9c9ae77a03a5Lucas De Marchi			ERR("could not add fd to epoll: %m\n");
2563dbb8dea5ff4fb23484b604d0c4b9c9ae77a03a5Lucas De Marchi			goto out;
2573dbb8dea5ff4fb23484b604d0c4b9c9ae77a03a5Lucas De Marchi		}
2583dbb8dea5ff4fb23484b604d0c4b9c9ae77a03a5Lucas De Marchi	} else
2593dbb8dea5ff4fb23484b604d0c4b9c9ae77a03a5Lucas De Marchi		fdout = -1;
2603dbb8dea5ff4fb23484b604d0c4b9c9ae77a03a5Lucas De Marchi
2613dbb8dea5ff4fb23484b604d0c4b9c9ae77a03a5Lucas De Marchi	if (t->output.stderr != NULL) {
2623dbb8dea5ff4fb23484b604d0c4b9c9ae77a03a5Lucas De Marchi		fd_matcherr = open(t->output.stderr, O_RDONLY);
2633dbb8dea5ff4fb23484b604d0c4b9c9ae77a03a5Lucas De Marchi		if (fd_matcherr < 0) {
2643dbb8dea5ff4fb23484b604d0c4b9c9ae77a03a5Lucas De Marchi			err = -errno;
2653dbb8dea5ff4fb23484b604d0c4b9c9ae77a03a5Lucas De Marchi			ERR("could not open %s for read: %m\n",
2663dbb8dea5ff4fb23484b604d0c4b9c9ae77a03a5Lucas De Marchi					t->output.stderr);
2673dbb8dea5ff4fb23484b604d0c4b9c9ae77a03a5Lucas De Marchi			goto out;
2683dbb8dea5ff4fb23484b604d0c4b9c9ae77a03a5Lucas De Marchi
2693dbb8dea5ff4fb23484b604d0c4b9c9ae77a03a5Lucas De Marchi		}
2703dbb8dea5ff4fb23484b604d0c4b9c9ae77a03a5Lucas De Marchi		memset(&ep_errpipe, 0, sizeof(struct epoll_event));
2713dbb8dea5ff4fb23484b604d0c4b9c9ae77a03a5Lucas De Marchi		ep_errpipe.events = EPOLLIN;
2723dbb8dea5ff4fb23484b604d0c4b9c9ae77a03a5Lucas De Marchi		ep_errpipe.data.ptr = &fderr;
2733dbb8dea5ff4fb23484b604d0c4b9c9ae77a03a5Lucas De Marchi		if (epoll_ctl(fd_ep, EPOLL_CTL_ADD, fderr, &ep_errpipe) < 0) {
2743dbb8dea5ff4fb23484b604d0c4b9c9ae77a03a5Lucas De Marchi			err = -errno;
2753dbb8dea5ff4fb23484b604d0c4b9c9ae77a03a5Lucas De Marchi			ERR("could not add fd to epoll: %m\n");
2763dbb8dea5ff4fb23484b604d0c4b9c9ae77a03a5Lucas De Marchi			goto out;
2773dbb8dea5ff4fb23484b604d0c4b9c9ae77a03a5Lucas De Marchi		}
2783dbb8dea5ff4fb23484b604d0c4b9c9ae77a03a5Lucas De Marchi	} else
2793dbb8dea5ff4fb23484b604d0c4b9c9ae77a03a5Lucas De Marchi		fderr = -1;
2803dbb8dea5ff4fb23484b604d0c4b9c9ae77a03a5Lucas De Marchi
2813dbb8dea5ff4fb23484b604d0c4b9c9ae77a03a5Lucas De Marchi	for (err = 0; fdout >= 0 || fderr >= 0;) {
2823dbb8dea5ff4fb23484b604d0c4b9c9ae77a03a5Lucas De Marchi		int fdcount, i;
2833dbb8dea5ff4fb23484b604d0c4b9c9ae77a03a5Lucas De Marchi		struct epoll_event ev[4];
2843dbb8dea5ff4fb23484b604d0c4b9c9ae77a03a5Lucas De Marchi
2853dbb8dea5ff4fb23484b604d0c4b9c9ae77a03a5Lucas De Marchi		fdcount = epoll_wait(fd_ep, ev, 4, -1);
2863dbb8dea5ff4fb23484b604d0c4b9c9ae77a03a5Lucas De Marchi		if (fdcount < 0) {
2873dbb8dea5ff4fb23484b604d0c4b9c9ae77a03a5Lucas De Marchi			if (errno == EINTR)
2883dbb8dea5ff4fb23484b604d0c4b9c9ae77a03a5Lucas De Marchi				continue;
2893dbb8dea5ff4fb23484b604d0c4b9c9ae77a03a5Lucas De Marchi			err = -errno;
2903dbb8dea5ff4fb23484b604d0c4b9c9ae77a03a5Lucas De Marchi			ERR("could not poll: %m\n");
2913dbb8dea5ff4fb23484b604d0c4b9c9ae77a03a5Lucas De Marchi			goto out;
2923dbb8dea5ff4fb23484b604d0c4b9c9ae77a03a5Lucas De Marchi		}
2933dbb8dea5ff4fb23484b604d0c4b9c9ae77a03a5Lucas De Marchi
2943dbb8dea5ff4fb23484b604d0c4b9c9ae77a03a5Lucas De Marchi		for (i = 0;  i < fdcount; i++) {
2953dbb8dea5ff4fb23484b604d0c4b9c9ae77a03a5Lucas De Marchi			int *fd = ev[i].data.ptr;
2963dbb8dea5ff4fb23484b604d0c4b9c9ae77a03a5Lucas De Marchi
2973dbb8dea5ff4fb23484b604d0c4b9c9ae77a03a5Lucas De Marchi			if (ev[i].events & EPOLLIN) {
2983dbb8dea5ff4fb23484b604d0c4b9c9ae77a03a5Lucas De Marchi				ssize_t r, done = 0;
2993dbb8dea5ff4fb23484b604d0c4b9c9ae77a03a5Lucas De Marchi				char buf[4096];
3003dbb8dea5ff4fb23484b604d0c4b9c9ae77a03a5Lucas De Marchi				char bufmatch[4096];
3013dbb8dea5ff4fb23484b604d0c4b9c9ae77a03a5Lucas De Marchi				int fd_match;
3023dbb8dea5ff4fb23484b604d0c4b9c9ae77a03a5Lucas De Marchi
3033dbb8dea5ff4fb23484b604d0c4b9c9ae77a03a5Lucas De Marchi				/*
3043dbb8dea5ff4fb23484b604d0c4b9c9ae77a03a5Lucas De Marchi				 * compare the output from child with the one
3053dbb8dea5ff4fb23484b604d0c4b9c9ae77a03a5Lucas De Marchi				 * saved as correct
3063dbb8dea5ff4fb23484b604d0c4b9c9ae77a03a5Lucas De Marchi				 */
3073dbb8dea5ff4fb23484b604d0c4b9c9ae77a03a5Lucas De Marchi
3083dbb8dea5ff4fb23484b604d0c4b9c9ae77a03a5Lucas De Marchi				r = read(*fd, buf, sizeof(buf) - 1);
3093dbb8dea5ff4fb23484b604d0c4b9c9ae77a03a5Lucas De Marchi				if (r <= 0)
3103dbb8dea5ff4fb23484b604d0c4b9c9ae77a03a5Lucas De Marchi					continue;
3113dbb8dea5ff4fb23484b604d0c4b9c9ae77a03a5Lucas De Marchi
3123dbb8dea5ff4fb23484b604d0c4b9c9ae77a03a5Lucas De Marchi				if (*fd == fdout)
3133dbb8dea5ff4fb23484b604d0c4b9c9ae77a03a5Lucas De Marchi					fd_match = fd_matchout;
3143dbb8dea5ff4fb23484b604d0c4b9c9ae77a03a5Lucas De Marchi				else
3153dbb8dea5ff4fb23484b604d0c4b9c9ae77a03a5Lucas De Marchi					fd_match = fd_matcherr;
3163dbb8dea5ff4fb23484b604d0c4b9c9ae77a03a5Lucas De Marchi
3173dbb8dea5ff4fb23484b604d0c4b9c9ae77a03a5Lucas De Marchi				for (;;) {
3183dbb8dea5ff4fb23484b604d0c4b9c9ae77a03a5Lucas De Marchi					int rmatch = read(fd_match,
3193dbb8dea5ff4fb23484b604d0c4b9c9ae77a03a5Lucas De Marchi						bufmatch + done, r - done);
3203dbb8dea5ff4fb23484b604d0c4b9c9ae77a03a5Lucas De Marchi					if (rmatch == 0)
3213dbb8dea5ff4fb23484b604d0c4b9c9ae77a03a5Lucas De Marchi						break;
3223dbb8dea5ff4fb23484b604d0c4b9c9ae77a03a5Lucas De Marchi
3233dbb8dea5ff4fb23484b604d0c4b9c9ae77a03a5Lucas De Marchi					if (rmatch < 0) {
3243dbb8dea5ff4fb23484b604d0c4b9c9ae77a03a5Lucas De Marchi						if (errno == EINTR)
3253dbb8dea5ff4fb23484b604d0c4b9c9ae77a03a5Lucas De Marchi							continue;
3263dbb8dea5ff4fb23484b604d0c4b9c9ae77a03a5Lucas De Marchi						err = -errno;
3273dbb8dea5ff4fb23484b604d0c4b9c9ae77a03a5Lucas De Marchi						ERR("could not read match fd %d\n",
3283dbb8dea5ff4fb23484b604d0c4b9c9ae77a03a5Lucas De Marchi								fd_match);
3293dbb8dea5ff4fb23484b604d0c4b9c9ae77a03a5Lucas De Marchi						goto out;
3303dbb8dea5ff4fb23484b604d0c4b9c9ae77a03a5Lucas De Marchi					}
3313dbb8dea5ff4fb23484b604d0c4b9c9ae77a03a5Lucas De Marchi
3323dbb8dea5ff4fb23484b604d0c4b9c9ae77a03a5Lucas De Marchi					done += rmatch;
3333dbb8dea5ff4fb23484b604d0c4b9c9ae77a03a5Lucas De Marchi				}
3343dbb8dea5ff4fb23484b604d0c4b9c9ae77a03a5Lucas De Marchi
3353dbb8dea5ff4fb23484b604d0c4b9c9ae77a03a5Lucas De Marchi				buf[r] = '\0';
3363dbb8dea5ff4fb23484b604d0c4b9c9ae77a03a5Lucas De Marchi				bufmatch[r] = '\0';
3373dbb8dea5ff4fb23484b604d0c4b9c9ae77a03a5Lucas De Marchi				if (strcmp(buf, bufmatch) != 0) {
3383dbb8dea5ff4fb23484b604d0c4b9c9ae77a03a5Lucas De Marchi					ERR("Outputs do not match on %s:\n",
3393dbb8dea5ff4fb23484b604d0c4b9c9ae77a03a5Lucas De Marchi						fd_match == fd_matchout ? "stdout" : "stderr");
3403dbb8dea5ff4fb23484b604d0c4b9c9ae77a03a5Lucas De Marchi					ERR("correct:\n%s\n", bufmatch);
3413dbb8dea5ff4fb23484b604d0c4b9c9ae77a03a5Lucas De Marchi					ERR("wrong:\n%s\n", buf);
3423dbb8dea5ff4fb23484b604d0c4b9c9ae77a03a5Lucas De Marchi					err = -1;
3433dbb8dea5ff4fb23484b604d0c4b9c9ae77a03a5Lucas De Marchi					goto out;
3443dbb8dea5ff4fb23484b604d0c4b9c9ae77a03a5Lucas De Marchi				}
3453dbb8dea5ff4fb23484b604d0c4b9c9ae77a03a5Lucas De Marchi			} else if (ev[i].events & EPOLLHUP) {
3463dbb8dea5ff4fb23484b604d0c4b9c9ae77a03a5Lucas De Marchi				if (epoll_ctl(fd_ep, EPOLL_CTL_DEL,
3473dbb8dea5ff4fb23484b604d0c4b9c9ae77a03a5Lucas De Marchi							*fd, NULL) < 0) {
3483dbb8dea5ff4fb23484b604d0c4b9c9ae77a03a5Lucas De Marchi					ERR("could not remove fd %d from epoll: %m\n",
3493dbb8dea5ff4fb23484b604d0c4b9c9ae77a03a5Lucas De Marchi									*fd);
3503dbb8dea5ff4fb23484b604d0c4b9c9ae77a03a5Lucas De Marchi				}
3513dbb8dea5ff4fb23484b604d0c4b9c9ae77a03a5Lucas De Marchi				*fd = -1;
3523dbb8dea5ff4fb23484b604d0c4b9c9ae77a03a5Lucas De Marchi			}
3533dbb8dea5ff4fb23484b604d0c4b9c9ae77a03a5Lucas De Marchi		}
3543dbb8dea5ff4fb23484b604d0c4b9c9ae77a03a5Lucas De Marchi
3553dbb8dea5ff4fb23484b604d0c4b9c9ae77a03a5Lucas De Marchi	}
3563dbb8dea5ff4fb23484b604d0c4b9c9ae77a03a5Lucas De Marchiout:
3573dbb8dea5ff4fb23484b604d0c4b9c9ae77a03a5Lucas De Marchi	if (fd_matchout >= 0)
3583dbb8dea5ff4fb23484b604d0c4b9c9ae77a03a5Lucas De Marchi		close(fd_matchout);
3593dbb8dea5ff4fb23484b604d0c4b9c9ae77a03a5Lucas De Marchi	if (fd_matcherr >= 0)
3603dbb8dea5ff4fb23484b604d0c4b9c9ae77a03a5Lucas De Marchi		close(fd_matcherr);
3613dbb8dea5ff4fb23484b604d0c4b9c9ae77a03a5Lucas De Marchi	if (fd_ep >= 0)
3623dbb8dea5ff4fb23484b604d0c4b9c9ae77a03a5Lucas De Marchi		close(fd_ep);
3633dbb8dea5ff4fb23484b604d0c4b9c9ae77a03a5Lucas De Marchi	return err == 0;
3643dbb8dea5ff4fb23484b604d0c4b9c9ae77a03a5Lucas De Marchi}
3653dbb8dea5ff4fb23484b604d0c4b9c9ae77a03a5Lucas De Marchi
3663dbb8dea5ff4fb23484b604d0c4b9c9ae77a03a5Lucas De Marchistatic inline int test_run_parent(const struct test *t, int fdout[2],
3673dbb8dea5ff4fb23484b604d0c4b9c9ae77a03a5Lucas De Marchi								int fderr[2])
36845481ee28c44c66a25015b7682f355d093c3b94aLucas De Marchi{
36945481ee28c44c66a25015b7682f355d093c3b94aLucas De Marchi	pid_t pid;
37080f9e02382fa9e65ec903dd53d62f949078205eeLucas De Marchi	int err;
3713dbb8dea5ff4fb23484b604d0c4b9c9ae77a03a5Lucas De Marchi	bool matchout;
3723dbb8dea5ff4fb23484b604d0c4b9c9ae77a03a5Lucas De Marchi
3733dbb8dea5ff4fb23484b604d0c4b9c9ae77a03a5Lucas De Marchi	/* Close write-fds */
3743dbb8dea5ff4fb23484b604d0c4b9c9ae77a03a5Lucas De Marchi	if (t->output.stdout != NULL)
3753dbb8dea5ff4fb23484b604d0c4b9c9ae77a03a5Lucas De Marchi		close(fdout[1]);
3763dbb8dea5ff4fb23484b604d0c4b9c9ae77a03a5Lucas De Marchi	if (t->output.stderr != NULL)
3773dbb8dea5ff4fb23484b604d0c4b9c9ae77a03a5Lucas De Marchi		close(fderr[1]);
3783dbb8dea5ff4fb23484b604d0c4b9c9ae77a03a5Lucas De Marchi
3793dbb8dea5ff4fb23484b604d0c4b9c9ae77a03a5Lucas De Marchi	matchout = test_run_parent_check_outputs(t, fdout[0], fderr[0]);
3803dbb8dea5ff4fb23484b604d0c4b9c9ae77a03a5Lucas De Marchi
3813dbb8dea5ff4fb23484b604d0c4b9c9ae77a03a5Lucas De Marchi	/*
3823dbb8dea5ff4fb23484b604d0c4b9c9ae77a03a5Lucas De Marchi	 * break pipe on the other end: either child already closed or we want
3833dbb8dea5ff4fb23484b604d0c4b9c9ae77a03a5Lucas De Marchi	 * to stop it
3843dbb8dea5ff4fb23484b604d0c4b9c9ae77a03a5Lucas De Marchi	 */
3853dbb8dea5ff4fb23484b604d0c4b9c9ae77a03a5Lucas De Marchi	if (t->output.stdout != NULL)
3863dbb8dea5ff4fb23484b604d0c4b9c9ae77a03a5Lucas De Marchi		close(fdout[0]);
3873dbb8dea5ff4fb23484b604d0c4b9c9ae77a03a5Lucas De Marchi	if (t->output.stderr != NULL)
3883dbb8dea5ff4fb23484b604d0c4b9c9ae77a03a5Lucas De Marchi		close(fderr[0]);
38945481ee28c44c66a25015b7682f355d093c3b94aLucas De Marchi
39045481ee28c44c66a25015b7682f355d093c3b94aLucas De Marchi	do {
39145481ee28c44c66a25015b7682f355d093c3b94aLucas De Marchi		pid = wait(&err);
39245481ee28c44c66a25015b7682f355d093c3b94aLucas De Marchi		if (pid == -1) {
39345481ee28c44c66a25015b7682f355d093c3b94aLucas De Marchi			ERR("error waitpid(): %m\n");
39445481ee28c44c66a25015b7682f355d093c3b94aLucas De Marchi			return EXIT_FAILURE;
39545481ee28c44c66a25015b7682f355d093c3b94aLucas De Marchi		}
39645481ee28c44c66a25015b7682f355d093c3b94aLucas De Marchi	} while (!WIFEXITED(err) && !WIFSIGNALED(err));
39745481ee28c44c66a25015b7682f355d093c3b94aLucas De Marchi
3983dbb8dea5ff4fb23484b604d0c4b9c9ae77a03a5Lucas De Marchi	if (WIFEXITED(err)) {
3993dbb8dea5ff4fb23484b604d0c4b9c9ae77a03a5Lucas De Marchi		if (WEXITSTATUS(err) != 0)
4003dbb8dea5ff4fb23484b604d0c4b9c9ae77a03a5Lucas De Marchi			ERR("'%s' [%u] exited with return code %d\n",
4013dbb8dea5ff4fb23484b604d0c4b9c9ae77a03a5Lucas De Marchi					t->name, pid, WEXITSTATUS(err));
4023dbb8dea5ff4fb23484b604d0c4b9c9ae77a03a5Lucas De Marchi		else
4033dbb8dea5ff4fb23484b604d0c4b9c9ae77a03a5Lucas De Marchi			LOG("'%s' [%u] exited with return code %d\n",
4043dbb8dea5ff4fb23484b604d0c4b9c9ae77a03a5Lucas De Marchi					t->name, pid, WEXITSTATUS(err));
4053dbb8dea5ff4fb23484b604d0c4b9c9ae77a03a5Lucas De Marchi	} else if (WIFSIGNALED(err)) {
4063dbb8dea5ff4fb23484b604d0c4b9c9ae77a03a5Lucas De Marchi		ERR("'%s' [%u] terminated by signal %d (%s)\n", t->name, pid,
4073dbb8dea5ff4fb23484b604d0c4b9c9ae77a03a5Lucas De Marchi				WTERMSIG(err), strsignal(WTERMSIG(err)));
4083dbb8dea5ff4fb23484b604d0c4b9c9ae77a03a5Lucas De Marchi	}
4093dbb8dea5ff4fb23484b604d0c4b9c9ae77a03a5Lucas De Marchi
410fa0046ba83bdb6d7e7a6c5285ab0082294a2ff5aDave Reisner	if (t->expected_fail == false) {
411fa0046ba83bdb6d7e7a6c5285ab0082294a2ff5aDave Reisner		if (err == 0) {
412fa0046ba83bdb6d7e7a6c5285ab0082294a2ff5aDave Reisner			if (matchout)
413fa0046ba83bdb6d7e7a6c5285ab0082294a2ff5aDave Reisner				LOG("%sPASSED%s: %s\n",
414fa0046ba83bdb6d7e7a6c5285ab0082294a2ff5aDave Reisner					ANSI_HIGHLIGHT_GREEN_ON, ANSI_HIGHLIGHT_OFF,
415fa0046ba83bdb6d7e7a6c5285ab0082294a2ff5aDave Reisner					t->name);
416fa0046ba83bdb6d7e7a6c5285ab0082294a2ff5aDave Reisner			else {
417fa0046ba83bdb6d7e7a6c5285ab0082294a2ff5aDave Reisner				ERR("%sFAILED%s: exit ok but outputs do not match: %s\n",
418fa0046ba83bdb6d7e7a6c5285ab0082294a2ff5aDave Reisner					ANSI_HIGHLIGHT_RED_ON, ANSI_HIGHLIGHT_OFF,
419fa0046ba83bdb6d7e7a6c5285ab0082294a2ff5aDave Reisner					t->name);
420fa0046ba83bdb6d7e7a6c5285ab0082294a2ff5aDave Reisner				err = EXIT_FAILURE;
421fa0046ba83bdb6d7e7a6c5285ab0082294a2ff5aDave Reisner			}
422fa0046ba83bdb6d7e7a6c5285ab0082294a2ff5aDave Reisner		} else
423fa0046ba83bdb6d7e7a6c5285ab0082294a2ff5aDave Reisner			ERR("%sFAILED%s: %s\n",
424fa0046ba83bdb6d7e7a6c5285ab0082294a2ff5aDave Reisner					ANSI_HIGHLIGHT_RED_ON, ANSI_HIGHLIGHT_OFF,
425fa0046ba83bdb6d7e7a6c5285ab0082294a2ff5aDave Reisner					t->name);
426fa0046ba83bdb6d7e7a6c5285ab0082294a2ff5aDave Reisner	} else {
427fa0046ba83bdb6d7e7a6c5285ab0082294a2ff5aDave Reisner		if (err == 0) {
428fa0046ba83bdb6d7e7a6c5285ab0082294a2ff5aDave Reisner			if (matchout) {
429fa0046ba83bdb6d7e7a6c5285ab0082294a2ff5aDave Reisner				LOG("%sUNEXPECTED PASS%s: %s\n",
430fa0046ba83bdb6d7e7a6c5285ab0082294a2ff5aDave Reisner					ANSI_HIGHLIGHT_GREEN_ON, ANSI_HIGHLIGHT_OFF,
431fa0046ba83bdb6d7e7a6c5285ab0082294a2ff5aDave Reisner					t->name);
432fa0046ba83bdb6d7e7a6c5285ab0082294a2ff5aDave Reisner				err = EXIT_FAILURE;
433fa0046ba83bdb6d7e7a6c5285ab0082294a2ff5aDave Reisner			} else
434fa0046ba83bdb6d7e7a6c5285ab0082294a2ff5aDave Reisner				LOG("%sEXPECTED FAIL%s: exit ok but outputs do not match: %s\n",
435fa0046ba83bdb6d7e7a6c5285ab0082294a2ff5aDave Reisner					ANSI_HIGHLIGHT_GREEN_ON, ANSI_HIGHLIGHT_OFF,
436fa0046ba83bdb6d7e7a6c5285ab0082294a2ff5aDave Reisner					t->name);
437fa0046ba83bdb6d7e7a6c5285ab0082294a2ff5aDave Reisner		} else {
438fa0046ba83bdb6d7e7a6c5285ab0082294a2ff5aDave Reisner			ERR("%sEXPECTED FAIL%s: %s\n",
439fa0046ba83bdb6d7e7a6c5285ab0082294a2ff5aDave Reisner					ANSI_HIGHLIGHT_GREEN_ON, ANSI_HIGHLIGHT_OFF,
440fa0046ba83bdb6d7e7a6c5285ab0082294a2ff5aDave Reisner					t->name);
441fa0046ba83bdb6d7e7a6c5285ab0082294a2ff5aDave Reisner			err = EXIT_SUCCESS;
4423dbb8dea5ff4fb23484b604d0c4b9c9ae77a03a5Lucas De Marchi		}
443fa0046ba83bdb6d7e7a6c5285ab0082294a2ff5aDave Reisner	}
44445481ee28c44c66a25015b7682f355d093c3b94aLucas De Marchi
44545481ee28c44c66a25015b7682f355d093c3b94aLucas De Marchi	return err;
44645481ee28c44c66a25015b7682f355d093c3b94aLucas De Marchi}
44745481ee28c44c66a25015b7682f355d093c3b94aLucas De Marchi
44845481ee28c44c66a25015b7682f355d093c3b94aLucas De Marchiint test_run(const struct test *t)
44945481ee28c44c66a25015b7682f355d093c3b94aLucas De Marchi{
45080f9e02382fa9e65ec903dd53d62f949078205eeLucas De Marchi	pid_t pid;
4513dbb8dea5ff4fb23484b604d0c4b9c9ae77a03a5Lucas De Marchi	int fdout[2];
4523dbb8dea5ff4fb23484b604d0c4b9c9ae77a03a5Lucas De Marchi	int fderr[2];
45380f9e02382fa9e65ec903dd53d62f949078205eeLucas De Marchi
454ed2df4e9845d58f46ec4405855036f25e8f72876Lucas De Marchi	if (t->need_spawn && oneshot)
455ed2df4e9845d58f46ec4405855036f25e8f72876Lucas De Marchi		test_run_spawned(t);
456ed2df4e9845d58f46ec4405855036f25e8f72876Lucas De Marchi
4573dbb8dea5ff4fb23484b604d0c4b9c9ae77a03a5Lucas De Marchi	if (t->output.stdout != NULL) {
4583dbb8dea5ff4fb23484b604d0c4b9c9ae77a03a5Lucas De Marchi		if (pipe(fdout) != 0) {
4593dbb8dea5ff4fb23484b604d0c4b9c9ae77a03a5Lucas De Marchi			ERR("could not create out pipe for %s\n", t->name);
4603dbb8dea5ff4fb23484b604d0c4b9c9ae77a03a5Lucas De Marchi			return EXIT_FAILURE;
4613dbb8dea5ff4fb23484b604d0c4b9c9ae77a03a5Lucas De Marchi		}
4623dbb8dea5ff4fb23484b604d0c4b9c9ae77a03a5Lucas De Marchi	}
4633dbb8dea5ff4fb23484b604d0c4b9c9ae77a03a5Lucas De Marchi
4643dbb8dea5ff4fb23484b604d0c4b9c9ae77a03a5Lucas De Marchi	if (t->output.stderr != NULL) {
4653dbb8dea5ff4fb23484b604d0c4b9c9ae77a03a5Lucas De Marchi		if (pipe(fderr) != 0) {
4663dbb8dea5ff4fb23484b604d0c4b9c9ae77a03a5Lucas De Marchi			ERR("could not create err pipe for %s\n", t->name);
4673dbb8dea5ff4fb23484b604d0c4b9c9ae77a03a5Lucas De Marchi			return EXIT_FAILURE;
4683dbb8dea5ff4fb23484b604d0c4b9c9ae77a03a5Lucas De Marchi		}
4693dbb8dea5ff4fb23484b604d0c4b9c9ae77a03a5Lucas De Marchi	}
4703dbb8dea5ff4fb23484b604d0c4b9c9ae77a03a5Lucas De Marchi
47180f9e02382fa9e65ec903dd53d62f949078205eeLucas De Marchi	LOG("running %s, in forked context\n", t->name);
47280f9e02382fa9e65ec903dd53d62f949078205eeLucas De Marchi
47380f9e02382fa9e65ec903dd53d62f949078205eeLucas De Marchi	pid = fork();
47480f9e02382fa9e65ec903dd53d62f949078205eeLucas De Marchi	if (pid < 0) {
47580f9e02382fa9e65ec903dd53d62f949078205eeLucas De Marchi		ERR("could not fork(): %m\n");
47680f9e02382fa9e65ec903dd53d62f949078205eeLucas De Marchi		LOG("FAILED: %s\n", t->name);
47780f9e02382fa9e65ec903dd53d62f949078205eeLucas De Marchi		return EXIT_FAILURE;
47880f9e02382fa9e65ec903dd53d62f949078205eeLucas De Marchi	}
47980f9e02382fa9e65ec903dd53d62f949078205eeLucas De Marchi
48045481ee28c44c66a25015b7682f355d093c3b94aLucas De Marchi	if (pid > 0)
4813dbb8dea5ff4fb23484b604d0c4b9c9ae77a03a5Lucas De Marchi		return test_run_parent(t, fdout, fderr);
48280f9e02382fa9e65ec903dd53d62f949078205eeLucas De Marchi
4833dbb8dea5ff4fb23484b604d0c4b9c9ae77a03a5Lucas De Marchi	return test_run_child(t, fdout, fderr);
48480f9e02382fa9e65ec903dd53d62f949078205eeLucas De Marchi}
485