ecaaf7fedf1ff2501699ab797fa7e7bf4f9bbba7
[libc-test] / common / t.c
1 #include <stdlib.h>
2 #include <stdio.h>
3 #include <stdarg.h>
4 #include <string.h>
5 #include <errno.h>
6 #include <sys/types.h>
7 #include <sys/wait.h>
8 #include <unistd.h>
9 #include "test.h"
10
11 #define B(f)
12 #define T(f) void f();
13 #include "tests.h"
14 #undef T
15
16 static int failed;
17 static const char *name;
18
19 static int slow;
20 static int verbose;
21 static int count;
22 static int nfailed;
23
24 static void errtimer() { error("use *_timer in benchmarks only\n"); }
25 void start_timer() { errtimer(); }
26 void stop_timer() { errtimer(); }
27 void reset_timer() { errtimer(); }
28
29 void error__(const char *n, int l, const char *s, ...) {
30         va_list ap;
31
32         failed = 1;
33         fprintf(stderr, " ERROR %s %s:%d: ", name, n, l);
34         va_start(ap, s);
35         vfprintf(stderr, s, ap);
36         va_end(ap);
37 }
38
39 static void run(const char *n, void (*f)()) {
40         pid_t pid;
41         int s;
42
43         count++;
44         failed = 0;
45         name = n;
46         if (verbose)
47                 fprintf(stderr, "running %s:\n", name);
48
49         pid = fork();
50         if (pid == 0) {
51                 /* run test in a child process */
52                 f();
53                 exit(failed);
54         }
55
56         if (pid == -1)
57                 error("fork failed: %s\n", strerror(errno));
58         else {
59                 if (waitpid(pid, &s, 0) == -1)
60                         error("waitpid failed: %s\n", strerror(errno));
61                 else if (!WIFEXITED(s))
62                         error("abnormal exit: %s\n", WIFSIGNALED(s) ? strsignal(WTERMSIG(s)) : "(unknown)");
63                 else
64                         failed = !!WEXITSTATUS(s);
65         }
66
67         if (failed) {
68                 nfailed++;
69                 fprintf(stderr, "FAILED %s\n", name);
70         } else if (verbose)
71                 fprintf(stderr, "PASSED %s\n", name);
72 }
73
74 static int summary() {
75         if (nfailed)
76                 fprintf(stderr, "FAIL:%d (all: %d)\n", nfailed, count);
77         else
78                 fprintf(stderr, "PASS (all: %d)\n", count);
79         return !!nfailed;
80 }
81
82 static void usage() {
83         fprintf(stderr, "usage: ./t [-vs]\n");
84         exit(1);
85 }
86
87 int main(int argc, char *argv[]) {
88         int c;
89
90         while((c = getopt(argc, argv, "vs")) != -1)
91                 switch(c) {
92                 case 'v':
93                         verbose = 1;
94                         break;
95                 case 's':
96                         slow = 1; /* TODO */
97                         break;
98                 default:
99                         usage();
100                 }
101         if (optind != argc)
102                 usage();
103
104 #define T(t) run(#t, t);
105 #include "tests.h"
106         return summary();
107 }