X-Git-Url: https://git.ozlabs.org/?p=ccan;a=blobdiff_plain;f=tools%2Fccanlint%2Ftests%2Ftests_pass.c;h=6ec17396167122eb89eee33b14c3e5bae9543e24;hp=1d3c018296d409bda74892a849ab41e25e64384a;hb=bffcda423dca2b3652ec7c6dc8e3f37e3d981be7;hpb=4a1ec39ed6624666bb857b089f219bf3adbb944f diff --git a/tools/ccanlint/tests/tests_pass.c b/tools/ccanlint/tests/tests_pass.c index 1d3c0182..6ec17396 100644 --- a/tools/ccanlint/tests/tests_pass.c +++ b/tools/ccanlint/tests/tests_pass.c @@ -14,14 +14,74 @@ #include #include #include +#include "tests_pass.h" + +bool do_valgrind = false; static const char *can_run(struct manifest *m) { + unsigned int timeleft = default_timeout_ms; + char *output; if (safe_mode) return "Safe mode enabled"; + + if (!is_excluded("tests_pass_valgrind") + && run_command(m, &timeleft, &output, + "valgrind -q true")) + do_valgrind = true; + return NULL; } +static const char *concat(struct score *score, char *bits[]) +{ + unsigned int i; + char *ret = talloc_strdup(score, ""); + + for (i = 0; bits[i]; i++) { + if (i) + ret = talloc_append_string(ret, " "); + ret = talloc_append_string(ret, bits[i]); + } + return ret; +} + +static void run_test(void *ctx, + struct manifest *m, + unsigned int *timeleft, + struct ccan_file *i) +{ + if (do_valgrind) { + const char *options; + options = concat(ctx, + per_file_options(&tests_pass_valgrind, i)); + + if (!streq(options, "FAIL")) { + /* FIXME: Valgrind's output sucks. XML is + * unreadable by humans *and* doesn't support + * children reporting. */ + i->valgrind_log = talloc_asprintf(m, + "%s.valgrind-log", + i->compiled[COMPILE_NORMAL]); + talloc_set_destructor(i->valgrind_log, + unlink_file_destructor); + + run_command_async(i, *timeleft, + "valgrind -q" + " --leak-check=full" + " --log-fd=3 %s %s" + " 3> %s", + options, + i->compiled[COMPILE_NORMAL], + i->valgrind_log); + return; + } + } + + run_command_async(i, *timeleft, "%s", + i->compiled[COMPILE_NORMAL]); +} + static void do_run_tests(struct manifest *m, bool keep, unsigned int *timeleft, @@ -30,23 +90,32 @@ static void do_run_tests(struct manifest *m, struct list_head *list; struct ccan_file *i; char *cmdout; + bool ok; score->total = 0; foreach_ptr(list, &m->run_tests, &m->api_tests) { list_for_each(list, i, list) { score->total++; - if (run_command(m, timeleft, &cmdout, "%s", - i->compiled)) - score->score++; - else - score_file_error(score, i, 0, "%s", cmdout); + if (verbose >= 2) + printf(" %s...\n", i->name); + run_test(score, m, timeleft, i); } } + while ((i = collect_command(&ok, &cmdout)) != NULL) { + if (!ok) + score_file_error(score, i, 0, "%s", cmdout); + else + score->score++; + if (verbose >= 2) + printf(" ...%s\n", i->name); + } + if (score->score == score->total) score->pass = true; } + /* Gcc's warn_unused_result is fascist bullshit. */ #define doesnt_matter() @@ -55,12 +124,13 @@ static void run_under_debugger(struct manifest *m, struct score *score) char *command; struct file_error *first; + first = list_top(&score->per_file_errors, struct file_error, list); + if (!ask("Should I run the first failing test under the debugger?")) return; - first = list_top(&score->per_file_errors, struct file_error, list); - command = talloc_asprintf(m, "gdb -ex 'break tap.c:136' -ex 'run' %s", - first->file->compiled); + command = talloc_asprintf(m, "gdb -ex 'break tap.c:139' -ex 'run' %s", + first->file->compiled[COMPILE_NORMAL]); if (system(command)) doesnt_matter(); }