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