testsuite.c revision 658e0471b39087a9914184748eb45fa1ddfc7c9e
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", 430658e0471b39087a9914184748eb45fa1ddfc7c9eLucas De Marchi ANSI_HIGHLIGHT_RED_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 448f31d49c8b3a8ef863a6d6401b98b9e59a29ea53dDave Reisnerstatic int prepend_path(const char *extra) 449f31d49c8b3a8ef863a6d6401b98b9e59a29ea53dDave Reisner{ 450f31d49c8b3a8ef863a6d6401b98b9e59a29ea53dDave Reisner char *oldpath, *newpath; 451f31d49c8b3a8ef863a6d6401b98b9e59a29ea53dDave Reisner int r; 452f31d49c8b3a8ef863a6d6401b98b9e59a29ea53dDave Reisner 453f31d49c8b3a8ef863a6d6401b98b9e59a29ea53dDave Reisner if (extra == NULL) 454f31d49c8b3a8ef863a6d6401b98b9e59a29ea53dDave Reisner return 0; 455f31d49c8b3a8ef863a6d6401b98b9e59a29ea53dDave Reisner 456f31d49c8b3a8ef863a6d6401b98b9e59a29ea53dDave Reisner oldpath = getenv("PATH"); 457f31d49c8b3a8ef863a6d6401b98b9e59a29ea53dDave Reisner if (oldpath == NULL) 458f31d49c8b3a8ef863a6d6401b98b9e59a29ea53dDave Reisner return setenv("PATH", extra, 1); 459f31d49c8b3a8ef863a6d6401b98b9e59a29ea53dDave Reisner 460f31d49c8b3a8ef863a6d6401b98b9e59a29ea53dDave Reisner if (asprintf(&newpath, "%s:%s", extra, oldpath) < 0) { 461f31d49c8b3a8ef863a6d6401b98b9e59a29ea53dDave Reisner ERR("failed to allocate memory to new PATH"); 462f31d49c8b3a8ef863a6d6401b98b9e59a29ea53dDave Reisner return -1; 463f31d49c8b3a8ef863a6d6401b98b9e59a29ea53dDave Reisner } 464f31d49c8b3a8ef863a6d6401b98b9e59a29ea53dDave Reisner 465f31d49c8b3a8ef863a6d6401b98b9e59a29ea53dDave Reisner r = setenv("PATH", newpath, 1); 466f31d49c8b3a8ef863a6d6401b98b9e59a29ea53dDave Reisner free(newpath); 467f31d49c8b3a8ef863a6d6401b98b9e59a29ea53dDave Reisner 468f31d49c8b3a8ef863a6d6401b98b9e59a29ea53dDave Reisner return r; 469f31d49c8b3a8ef863a6d6401b98b9e59a29ea53dDave Reisner} 470f31d49c8b3a8ef863a6d6401b98b9e59a29ea53dDave Reisner 47145481ee28c44c66a25015b7682f355d093c3b94aLucas De Marchiint test_run(const struct test *t) 47245481ee28c44c66a25015b7682f355d093c3b94aLucas De Marchi{ 47380f9e02382fa9e65ec903dd53d62f949078205eeLucas De Marchi pid_t pid; 4743dbb8dea5ff4fb23484b604d0c4b9c9ae77a03a5Lucas De Marchi int fdout[2]; 4753dbb8dea5ff4fb23484b604d0c4b9c9ae77a03a5Lucas De Marchi int fderr[2]; 47680f9e02382fa9e65ec903dd53d62f949078205eeLucas De Marchi 477ed2df4e9845d58f46ec4405855036f25e8f72876Lucas De Marchi if (t->need_spawn && oneshot) 478ed2df4e9845d58f46ec4405855036f25e8f72876Lucas De Marchi test_run_spawned(t); 479ed2df4e9845d58f46ec4405855036f25e8f72876Lucas De Marchi 4803dbb8dea5ff4fb23484b604d0c4b9c9ae77a03a5Lucas De Marchi if (t->output.stdout != NULL) { 4813dbb8dea5ff4fb23484b604d0c4b9c9ae77a03a5Lucas De Marchi if (pipe(fdout) != 0) { 4823dbb8dea5ff4fb23484b604d0c4b9c9ae77a03a5Lucas De Marchi ERR("could not create out pipe for %s\n", t->name); 4833dbb8dea5ff4fb23484b604d0c4b9c9ae77a03a5Lucas De Marchi return EXIT_FAILURE; 4843dbb8dea5ff4fb23484b604d0c4b9c9ae77a03a5Lucas De Marchi } 4853dbb8dea5ff4fb23484b604d0c4b9c9ae77a03a5Lucas De Marchi } 4863dbb8dea5ff4fb23484b604d0c4b9c9ae77a03a5Lucas De Marchi 4873dbb8dea5ff4fb23484b604d0c4b9c9ae77a03a5Lucas De Marchi if (t->output.stderr != NULL) { 4883dbb8dea5ff4fb23484b604d0c4b9c9ae77a03a5Lucas De Marchi if (pipe(fderr) != 0) { 4893dbb8dea5ff4fb23484b604d0c4b9c9ae77a03a5Lucas De Marchi ERR("could not create err pipe for %s\n", t->name); 4903dbb8dea5ff4fb23484b604d0c4b9c9ae77a03a5Lucas De Marchi return EXIT_FAILURE; 4913dbb8dea5ff4fb23484b604d0c4b9c9ae77a03a5Lucas De Marchi } 4923dbb8dea5ff4fb23484b604d0c4b9c9ae77a03a5Lucas De Marchi } 4933dbb8dea5ff4fb23484b604d0c4b9c9ae77a03a5Lucas De Marchi 494f31d49c8b3a8ef863a6d6401b98b9e59a29ea53dDave Reisner if (prepend_path(t->path) < 0) { 495f31d49c8b3a8ef863a6d6401b98b9e59a29ea53dDave Reisner ERR("failed to prepend '%s' to PATH\n", t->path); 496f31d49c8b3a8ef863a6d6401b98b9e59a29ea53dDave Reisner return EXIT_FAILURE; 497f31d49c8b3a8ef863a6d6401b98b9e59a29ea53dDave Reisner } 498f31d49c8b3a8ef863a6d6401b98b9e59a29ea53dDave Reisner 49980f9e02382fa9e65ec903dd53d62f949078205eeLucas De Marchi LOG("running %s, in forked context\n", t->name); 50080f9e02382fa9e65ec903dd53d62f949078205eeLucas De Marchi 50180f9e02382fa9e65ec903dd53d62f949078205eeLucas De Marchi pid = fork(); 50280f9e02382fa9e65ec903dd53d62f949078205eeLucas De Marchi if (pid < 0) { 50380f9e02382fa9e65ec903dd53d62f949078205eeLucas De Marchi ERR("could not fork(): %m\n"); 50480f9e02382fa9e65ec903dd53d62f949078205eeLucas De Marchi LOG("FAILED: %s\n", t->name); 50580f9e02382fa9e65ec903dd53d62f949078205eeLucas De Marchi return EXIT_FAILURE; 50680f9e02382fa9e65ec903dd53d62f949078205eeLucas De Marchi } 50780f9e02382fa9e65ec903dd53d62f949078205eeLucas De Marchi 50845481ee28c44c66a25015b7682f355d093c3b94aLucas De Marchi if (pid > 0) 5093dbb8dea5ff4fb23484b604d0c4b9c9ae77a03a5Lucas De Marchi return test_run_parent(t, fdout, fderr); 51080f9e02382fa9e65ec903dd53d62f949078205eeLucas De Marchi 5113dbb8dea5ff4fb23484b604d0c4b9c9ae77a03a5Lucas De Marchi return test_run_child(t, fdout, fderr); 51280f9e02382fa9e65ec903dd53d62f949078205eeLucas De Marchi} 513