diff options
author | Wayne Davison <wayned@samba.org> | 2009-12-13 14:14:38 -0800 |
---|---|---|
committer | Wayne Davison <wayned@samba.org> | 2009-12-13 14:14:38 -0800 |
commit | 45426a7604e05eb8f322e7728680b29eafdfcc3f (patch) | |
tree | 67c6552559eb343d0dc22be1cd6d6525c5f9a58d /testrun.c | |
parent | dc2a0923a26a03bf9d0e5bc537f47dc513aabdee (diff) | |
download | rsync-45426a7604e05eb8f322e7728680b29eafdfcc3f.tar.gz |
Run each testsuite test with a timeout.
Diffstat (limited to 'testrun.c')
-rw-r--r-- | testrun.c | 54 |
1 files changed, 54 insertions, 0 deletions
diff --git a/testrun.c b/testrun.c new file mode 100644 index 00000000..e1f08318 --- /dev/null +++ b/testrun.c @@ -0,0 +1,54 @@ +/* Run a testsuite script with a timeout. */ + +#include "rsync.h" + +#define MAX_TEST_SECONDS (3*60) + + int main(int argc, char *argv[]) +{ + pid_t pid; + int status, slept = 0; + + if (argc < 2) { + fprintf(stderr, "Usage: testrun [SHELL_OPTIONS] TESTSUITE_SCRIPT [ARGS]\n"); + exit(1); + } + + if ((pid = fork()) < 0) { + fprintf(stderr, "TESTRUN ERROR: fork failed: %s\n", strerror(errno)); + exit(1); + } + + if (pid == 0) { + argv[0] = "sh"; + execvp(argv[0], argv); + fprintf(stderr, "TESTRUN ERROR: failed to exec %s: %s\n", argv[0], strerror(errno)); + _exit(1); + } + + while (1) { + int ret = waitpid(pid, &status, WNOHANG); + if (ret > 0) + break; + if (ret < 0) { + if (errno == EINTR) + continue; + fprintf(stderr, "TESTRUN ERROR: waitpid failed: %s\n", strerror(errno)); + exit(1); + } + if (slept++ > MAX_TEST_SECONDS) { + fprintf(stderr, "TESTRUN TIMEOUT: test took over %d seconds.\n", MAX_TEST_SECONDS); + if (kill(pid, SIGTERM) < 0) + fprintf(stderr, "TESTRUN ERROR: failed to kill pid %ld: %s\n", (long)pid, strerror(errno)); + else + fprintf(stderr, "TESTRUN INFO: killed pid %ld\n", (long)pid); + exit(1); + } + sleep(1); + } + + if (!WIFEXITED(status)) + exit(255); + + return WEXITSTATUS(status); +} |