1 #include <tools/ccanlint/ccanlint.h>
2 #include <tools/tools.h>
3 #include <ccan/talloc/talloc.h>
4 #include <ccan/str/str.h>
17 /* Note: we already test safe_mode in run_tests.c */
18 static const char *can_run_vg(struct manifest *m)
20 char *output = run_command(m, "valgrind -q true");
23 return talloc_asprintf(m, "No valgrind support: %s", output);
27 struct run_tests_result {
28 struct list_node list;
29 struct ccan_file *file;
33 static void *do_run_tests_vg(struct manifest *m)
35 struct list_head *list = talloc(m, struct list_head);
36 struct run_tests_result *res;
42 list_for_each(&m->run_tests, i, list) {
43 run_tests.total_score++;
44 /* FIXME: timeout here */
45 cmdout = run_command(m, "valgrind -q %s", i->compiled);
47 res = talloc(list, struct run_tests_result);
49 res->output = talloc_steal(res, cmdout);
50 list_add_tail(list, &res->list);
54 list_for_each(&m->api_tests, i, list) {
55 run_tests.total_score++;
56 /* FIXME: timeout here */
57 cmdout = run_command(m, "valgrind -q %s", i->compiled);
59 res = talloc(list, struct run_tests_result);
61 res->output = talloc_steal(res, cmdout);
62 list_add_tail(list, &res->list);
66 if (list_empty(list)) {
74 static unsigned int score_run_tests_vg(struct manifest *m, void *check_result)
76 struct list_head *list = check_result;
77 struct run_tests_result *i;
78 unsigned int score = run_tests.total_score;
80 list_for_each(list, i, list)
85 static const char *describe_run_tests_vg(struct manifest *m,
88 struct list_head *list = check_result;
89 char *descrip = talloc_strdup(check_result, "Running tests under valgrind failed:\n");
90 struct run_tests_result *i;
92 list_for_each(list, i, list)
93 descrip = talloc_asprintf_append(descrip, "Running %s:\n%s",
94 i->file->name, i->output);
98 static void run_under_debugger_vg(struct manifest *m, void *check_result)
100 struct list_head *list = check_result;
101 struct run_tests_result *first;
103 if (!ask("Should I run the first failing test under the debugger?"))
106 first = list_top(list, struct run_tests_result, list);
107 run_command(m, "valgrind --db-attach=yes %s", first->file->compiled);
110 struct ccanlint run_tests_vg = {
111 .name = "run and api tests under valgrind",
112 .score = score_run_tests_vg,
113 .check = do_run_tests_vg,
114 .describe = describe_run_tests_vg,
115 .can_run = can_run_vg,
116 .handle = run_under_debugger_vg
119 REGISTER_TEST(run_tests_vg, &run_tests, NULL);