X-Git-Url: http://git.ozlabs.org/?p=ccan;a=blobdiff_plain;f=tools%2Fccanlint%2Ftests%2Ftests_coverage.c;h=a8da103f045fed21280625a1bbf9c4c4e44814c8;hp=7943071b76634bfc50ce88e962ba8dfffc4480e6;hb=c1da4104d996fe1a332e5bc01fad937b4773551a;hpb=7bb7cd58c2d9df126dd6072e5f3bec1eb4dc916b diff --git a/tools/ccanlint/tests/tests_coverage.c b/tools/ccanlint/tests/tests_coverage.c index 7943071b..a8da103f 100644 --- a/tools/ccanlint/tests/tests_coverage.c +++ b/tools/ccanlint/tests/tests_coverage.c @@ -54,7 +54,7 @@ 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", NULL); + char **lines = strsplit(score, output, "\n"); float covered_lines = 0.0; unsigned int i, total_lines = 0; bool lines_matter = false; @@ -110,6 +110,10 @@ static void analyze_coverage(struct manifest *m, bool full_gcov, score->pass = true; + if (verbose > 1) + printf("%u of %u lines covered\n", + (unsigned)covered_lines, total_lines); + /* Nothing covered? We can't tell if there's a source file which * was never executed, or there really is no code to execute, so * assume the latter: this test deserves no score. */ @@ -127,15 +131,27 @@ static void do_run_coverage_tests(struct manifest *m, unsigned int *timeleft, struct score *score) { struct ccan_file *i; - char *cmdout; + char *cmdout, *outdir; char *covcmd; 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", - talloc_dirname(score, m->info_file->compiled)); + 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); + } /* Run them all. */ foreach_ptr(list, &m->run_tests, &m->api_tests) { @@ -150,9 +166,17 @@ static void do_run_coverage_tests(struct manifest *m, " 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",