diff options
-rw-r--r-- | crawl-ref/source/Makefile | 12 | ||||
-rw-r--r-- | crawl-ref/source/util/fake_pty.c | 84 |
2 files changed, 96 insertions, 0 deletions
diff --git a/crawl-ref/source/Makefile b/crawl-ref/source/Makefile index 1a101d0349..b7566e168f 100644 --- a/crawl-ref/source/Makefile +++ b/crawl-ref/source/Makefile @@ -1735,3 +1735,15 @@ mac-app-tiles: all mac-app-console: all +$(MAKE) -j1 -C mac -f Makefile.app-bundle + +############################################################################# +# Canned tests +# + +tests: $(foreach i, 1 2 3 4 5 6 7, test-$(i)) + +test-%: $(GAME) util/fake_pty + util/fake_pty test/stress/run $* + +util/fake_pty: util/fake_pty.c + $(if $(HOSTCC),$(HOSTCC),$(CC)) -Wall $< -o $@ -lutil diff --git a/crawl-ref/source/util/fake_pty.c b/crawl-ref/source/util/fake_pty.c new file mode 100644 index 0000000000..fbf0aaa999 --- /dev/null +++ b/crawl-ref/source/util/fake_pty.c @@ -0,0 +1,84 @@ +#include <pty.h> +#include <stdio.h> +#include <unistd.h> +#include <sys/types.h> +#include <sys/wait.h> +#include <poll.h> +#include <signal.h> +#include <string.h> +#include <errno.h> + +static pid_t crawl; +static int tty; + +static void sigalrm(int signum) +{ + kill(crawl, SIGTERM); +} + +static void slurp_output() +{ + struct pollfd pfd; + char buf[1024]; + + signal(SIGALRM, sigalrm); + alarm(3600); // a hard limit of an hour (big tests on a Raspberry...) + + pfd.fd = crawl; + pfd.events = POLLIN; + + while (poll(&pfd, 1, 60000) > 0) // 60 seconds with no output -> kesim + { + if (read(tty, buf, sizeof(buf)) <= 0) + break; + } + + kill(crawl, SIGTERM); // shooting a zombie is ok, let's make sure it's dead +} + +int main(int argc, char * const *argv) +{ + struct winsize ws; + int slave; + int ret; + + if (argc <= 1) + { + fprintf(stderr, "Usage: fake_pty program [args]\n"); + return 1; + } + + ws.ws_row = 24; + ws.ws_col = 80; + ws.ws_xpixel = ws.ws_ypixel = 0; + + // We want to let stderr through, thus can't use forkpty(). + if (openpty(&tty, &slave, 0, 0, &ws)) + { + fprintf(stderr, "Can't create a pty: %s\n", strerror(errno)); + return 1; + } + + switch (crawl = fork()) + { + case -1: + fprintf(stderr, "Can't fork: %s\n", strerror(errno)); + return 1; + + case 0: + close(tty); + dup2(slave, 0); + dup2(slave, 1); // but _not_ stderr! + close(slave); + execvp(argv[1], argv + 1); + fprintf(stderr, "Can't run '%s': %s\n", argv[1], strerror(errno)); + return 1; + + default: + close(slave); + slurp_output(); + if (waitpid(crawl, &ret, 0) != crawl) + ret = 1; // can't happen + return ret; + } +} |