1 /* check-sources:disable-copyright-check */
2 #include <stdlib.h>
3 #include <unistd.h>
4 #include <getopt.h>
5 #include <stdio.h>
6 #include <sys/stat.h>
7 #include <check.h>
8
9 #include "utest_main.h"
10
11 int verbose = 0;
12
13 /*
14 * Arrange to valgrind ourself. Normally this would be done outside in
15 * the Makefile or a shell script by just running the executable under
16 * valgrind, but using libtool and a local shared library makes this
17 * pretty much impossible. So we have to do it this way.
18 */
19 #define VALGRIND_BIN "/usr/bin/valgrind"
20 #define MAGIC_VAR "DONT_VALGRIND_YOURSELF_FOOL"
21
be_valground(int argc,char ** argv)22 static void be_valground(int argc, char** argv)
23 {
24 struct stat sb;
25 int r;
26 char** newargv;
27 int newargc = 0;
28
29 /* Note: we don't use VALGRIND_IS_RUNNING() to avoid
30 * depending on the valgrind package at build time */
31 if (getenv(MAGIC_VAR)) return;
32
33 r = stat(VALGRIND_BIN, &sb);
34 if (r < 0 || !S_ISREG(sb.st_mode)) return;
35
36 newargv = (char**)malloc((argc + 7) * sizeof(char**));
37 newargv[newargc++] = VALGRIND_BIN;
38 newargv[newargc++] = "--tool=memcheck";
39 newargv[newargc++] = "-q";
40 newargv[newargc++] = "--leak-check=full";
41 newargv[newargc++] = "--suppressions=" SRCDIR "/tools/valgrind.supp";
42 newargv[newargc++] = "--num-callers=32";
43 while (*argv) newargv[newargc++] = *argv++;
44 newargv[newargc] = NULL;
45
46 fprintf(stderr, "Running self under valgrind\n");
47 putenv(MAGIC_VAR "=yes");
48
49 execv(newargv[0], newargv);
50
51 free(newargv);
52
53 perror(VALGRIND_BIN);
54 exit(1);
55 }
56
57 /*
58 * How to run the test driver under a debugger.
59 *
60 * $ libtool --mode=execute gdb utests/.libs/alltests
61 * (gdb) set args --debug
62 * (gdb) break whichever_test
63 * (gdb) run
64 *
65 */
66
main(int argc,char ** argv)67 int main(int argc, char** argv)
68 {
69 SRunner* r;
70 int debug_flag = 0;
71 enum print_output output = CK_NORMAL;
72
73 static const struct option options[] = {{"debug", no_argument, 0, 'd'},
74 {"verbose", no_argument, 0, 'v'},
75 {NULL, 0, 0, 0}};
76
77 while (1) {
78 int c, opt_idx = 0;
79
80 c = getopt_long(argc, argv, "dv", options, &opt_idx);
81 if (c == -1) break;
82
83 switch (c) {
84 case 'v':
85 output = CK_VERBOSE;
86 break;
87 case 'd':
88 debug_flag = 1;
89 break;
90 case '?':
91 default:
92 fprintf(stderr, "ERROR %d %s\n", c, optarg);
93 exit(1);
94 }
95 }
96
97 if (debug_flag)
98 putenv("CK_DEFAULT_TIMEOUT=1000000");
99 else
100 be_valground(argc, argv);
101
102 r = srunner_create(NULL);
103 srunner_add_suite(r, dict_suite());
104 srunner_add_suite(r, getdate_suite());
105 srunner_add_suite(r, droplet_suite());
106 srunner_add_suite(r, vec_suite());
107 srunner_add_suite(r, sbuf_suite());
108 srunner_add_suite(r, dbuf_suite());
109 srunner_add_suite(r, ntinydb_suite());
110 srunner_add_suite(r, taskpool_suite());
111 srunner_add_suite(r, addrlist_suite());
112 srunner_add_suite(r, util_suite());
113 srunner_add_suite(r, sproxyd_suite());
114 srunner_add_suite(r, utest_suite());
115 #ifdef __linux__
116 srunner_add_suite(r, profile_suite());
117 #endif
118 /* srunner_add_suite(r, s3_auth_v2_suite()); */
119 srunner_add_suite(r, s3_auth_v4_suite());
120
121 if (debug_flag) srunner_set_fork_status(r, CK_NOFORK);
122 srunner_run_all(r, output);
123
124 int number_failed = srunner_ntests_failed(r);
125
126 srunner_free(r);
127
128 return (0 == number_failed) ? EXIT_SUCCESS : EXIT_FAILURE;
129 }
130