utf8: don't allow NUL in decoded strings.
[ccan] / tools / ccanlint / tests / tests_coverage.c
index a8da103f045fed21280625a1bbf9c4c4e44814c8..e29572019141e81fd8b77a4abc4e1d7931170860 100644 (file)
@@ -1,9 +1,8 @@
 #include <tools/ccanlint/ccanlint.h>
 #include <tools/tools.h>
-#include <ccan/talloc/talloc.h>
-#include <ccan/str_talloc/str_talloc.h>
-#include <ccan/grab_file/grab_file.h>
 #include <ccan/str/str.h>
+#include <ccan/tal/path/path.h>
+#include <ccan/tal/grab_file/grab_file.h>
 #include <ccan/foreach/foreach.h>
 #include <sys/types.h>
 #include <sys/stat.h>
@@ -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,39 +134,26 @@ 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"
@@ -178,9 +172,8 @@ static void do_run_coverage_tests(struct manifest *m,
        }
 
        /* 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;
        }