X-Git-Url: http://git.ozlabs.org/?p=ccan;a=blobdiff_plain;f=tools%2Fccanlint%2Ftests%2Ftests_coverage.c;h=e29572019141e81fd8b77a4abc4e1d7931170860;hp=67829e96918f8fe4e1509ac8830fd27a83e2b9cb;hb=HEAD;hpb=37e247dbcb57f4b2effd44b37b96dc679ee525d0 diff --git a/tools/ccanlint/tests/tests_coverage.c b/tools/ccanlint/tests/tests_coverage.c index 67829e96..e2957201 100644 --- a/tools/ccanlint/tests/tests_coverage.c +++ b/tools/ccanlint/tests/tests_coverage.c @@ -1,9 +1,8 @@ #include #include -#include -#include -#include #include +#include +#include #include #include #include @@ -54,19 +53,25 @@ static unsigned int score_coverage(float covered, unsigned total) static void analyze_coverage(struct manifest *m, bool full_gcov, const char *output, struct score *score) { - char **lines = strsplit(score, output, "\n"); + char **lines = tal_strsplit(score, output, "\n", STR_EMPTY_OK); float covered_lines = 0.0; unsigned int i, total_lines = 0; bool lines_matter = false; /* - Output looks like: + Output looks like: (gcov 4.6.3) File '../../../ccan/tdb2/private.h' Lines executed:0.00% of 8 /home/ccan/ccan/tdb2/test/run-simple-delete.c:creating 'run-simple-delete.c.gcov' File '../../../ccan/tdb2/tdb.c' Lines executed:0.00% of 450 + + For gcov 4.7.2: + + File '/home/dwg/src/ccan/ccan/rfc822/test/run-check-check.c' + Lines executed:100.00% of 19 + Creating 'run-check-check.c.gcov' */ for (i = 0; lines[i]; i++) { @@ -86,18 +91,20 @@ static void analyze_coverage(struct manifest *m, bool full_gcov, errx(1, "Could not parse line '%s'", lines[i]); total_lines += of; covered_lines += ex / 100.0 * of; - } else if (full_gcov && strstr(lines[i], ":creating '")) { + } else if (full_gcov + && (strstr(lines[i], ":creating '") + || strstarts(lines[i], "Creating '"))) { char *file, *filename, *apostrophe; apostrophe = strchr(lines[i], '\''); filename = apostrophe + 1; apostrophe = strchr(filename, '\''); *apostrophe = '\0'; if (lines_matter) { - file = grab_file(score, filename, NULL); + file = grab_file(score, filename); if (!file) { - score->error = talloc_asprintf(score, - "Reading %s", - filename); + score->error = tal_fmt(score, + "Reading %s", + filename); return; } printf("%s", file); @@ -127,51 +134,46 @@ static void analyze_coverage(struct manifest *m, bool full_gcov, } static void do_run_coverage_tests(struct manifest *m, - bool keep, unsigned int *timeleft, struct score *score) { struct ccan_file *i; char *cmdout, *outdir; - char *covcmd; + char *covargs; bool full_gcov = (verbose > 1); struct list_head *list; + bool ran_some = false; /* This tells gcov where we put those .gcno files. */ - outdir = talloc_dirname(score, m->info_file->compiled); - covcmd = talloc_asprintf(m, "gcov %s -o %s", - full_gcov ? "" : "-n", - outdir); - - /* Unlink these files afterwards. */ - if (!keep) { - talloc_set_destructor(talloc_asprintf(score, - "%s/run.gcno", outdir), - unlink_file_destructor); - talloc_set_destructor(talloc_asprintf(score, - "%s/run.gcda", outdir), - unlink_file_destructor); - } + outdir = path_dirname(score, + m->info_file->compiled[COMPILE_NORMAL]); + covargs = tal_fmt(m, "%s -o %s", full_gcov ? "" : "-n", outdir); /* Run them all. */ foreach_ptr(list, &m->run_tests, &m->api_tests) { list_for_each(list, i, list) { if (run_command(score, timeleft, &cmdout, - "%s", i->cov_compiled)) { - covcmd = talloc_asprintf_append(covcmd, " %s", - i->fullname); + "%s", i->compiled[COMPILE_COVERAGE])) { + tal_append_fmt(&covargs, " %s", i->fullname); } else { score_file_error(score, i, 0, "Running test with coverage" " failed: %s", cmdout); return; } + ran_some = true; } } + /* No tests at all? 0 out of 0 for you... */ + if (!ran_some) { + score->total = score->score = 0; + score->pass = true; + return; + } + /* Now run gcov: we want output even if it succeeds. */ - if (!run_command(score, timeleft, &cmdout, "%s", covcmd)) { - score->error = talloc_asprintf(score, "Running gcov: %s", - cmdout); + if (!run_gcov(score, timeleft, &cmdout, "%s", covargs)) { + score->error = tal_fmt(score, "Running gcov: %s", cmdout); return; }