12 #define T(f) void f();
17 static const char *name;
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(); }
29 void error__(const char *n, int l, const char *s, ...) {
32 if (failed == 0 && nfailed == 0)
33 dprintf(1, "FAIL\n", n);
35 dprintf(1, " ERROR %s %s:%d: ", name, n, l);
41 static void run(const char *n, void (*f)()) {
49 dprintf(1, "running %s:\n", name);
53 /* run test in a child process */
59 error("fork failed: %s\n", strerror(errno));
61 if (waitpid(pid, &s, 0) == -1)
62 error("waitpid failed: %s\n", strerror(errno));
63 else if (!WIFEXITED(s))
64 error("abnormal exit: %s\n", WIFSIGNALED(s) ? strsignal(WTERMSIG(s)) : "(unknown)");
66 failed = !!WEXITSTATUS(s);
71 dprintf(1, "FAILED %s\n", name);
73 dprintf(1, "PASSED %s\n", name);
76 static int summary() {
78 dprintf(1, "FAIL (%d out of %d tests)\n", nfailed, count);
80 dprintf(1, "ok (%d tests)\n", count);
85 dprintf(1, "usage: ./t [-vs]\n");
89 int main(int argc, char *argv[]) {
92 while((c = getopt(argc, argv, "vs")) != -1)
106 #define T(t) run(#t, t);