]> git.ozlabs.org Git - ccan/blobdiff - tools/ccanlint/tests/examples_run.c
configurator: HAVE_PROC_SELF_MAPS
[ccan] / tools / ccanlint / tests / examples_run.c
index 522feb0a0bf320422c80f4bc5c5fb73335b159b0..18bb849d3d0076ace733c28669cd33911bbd6930 100644 (file)
@@ -3,6 +3,7 @@
 #include <ccan/talloc/talloc.h>
 #include <ccan/foreach/foreach.h>
 #include <ccan/str/str.h>
+#include <ccan/cast/cast.h>
 #include <sys/types.h>
 #include <sys/stat.h>
 #include <fcntl.h>
 
 static const char *can_run(struct manifest *m)
 {
+       struct list_head *list;
+
        if (safe_mode)
                return "Safe mode enabled";
-       return NULL;
+       foreach_ptr(list, &m->examples, &m->mangled_examples)
+               if (!list_empty(list))
+                       return NULL;
+       return "No examples";
 }
 
-struct score {
-       unsigned int score;
-       char *errors;
-};
-
 /* Very dumb scanner, allocates %s-strings. */
 static bool scan_forv(const void *ctx,
-                     const char *input, const char *fmt, const va_list *args)
+                     const char *input, const char *fmt, va_list *args)
 {
        va_list ap;
        bool ret;
@@ -36,10 +37,10 @@ static bool scan_forv(const void *ctx,
 
        va_copy(ap, *args);
 
-       if (isspace(fmt[0])) {
+       if (cisspace(fmt[0])) {
                /* One format space can swallow many input spaces */
                ret = false;
-               while (isspace(input[0])) {
+               while (cisspace(input[0])) {
                        if (scan_forv(ctx, ++input, fmt+1, &ap)) {
                                ret = true;
                                break;
@@ -116,7 +117,7 @@ static char *find_expect(struct ccan_file *file,
 
                foreach_ptr(fmt, "outputs '%s'", "outputs \"%s\"") {
                        if (scan_for(file, p, fmt, &expect)) {
-                               *input = "";
+                               *input = cast_const(char *, "");
                                *exact = true;
                                return expect;
                        }
@@ -173,7 +174,7 @@ static char *find_expect(struct ccan_file *file,
                            "outputs \"%s\"",
                            "outputs %s") {
                        if (scan_for(file, p, fmt, &expect)) {
-                               *input = "";
+                               *input = cast_const(char *, "");
                                *exact = true;
                                return expect;
                        }
@@ -184,7 +185,7 @@ static char *find_expect(struct ccan_file *file,
                            "output contains \"%s\"",
                            "output contains %s") {
                        if (scan_for(file, p, fmt, &expect)) {
-                               *input = "";
+                               *input = cast_const(char *, "");
                                *exact = false;
                                return expect;
                        }
@@ -208,7 +209,7 @@ static char *unexpected(struct ccan_file *i, const char *input,
        unsigned int default_time = default_timeout_ms;
 
        cmd = talloc_asprintf(i, "echo '%s' | %s %s",
-                             input, i->compiled, input);
+                             input, i->compiled[COMPILE_NORMAL], input);
 
        output = run_with_timeout(i, cmd, &ok, &default_time);
        if (!ok)
@@ -224,26 +225,21 @@ static char *unexpected(struct ccan_file *i, const char *input,
        return output;
 }
 
-static void *run_examples(struct manifest *m, bool keep,
-                         unsigned int *timeleft)
+static void run_examples(struct manifest *m,
+                        unsigned int *timeleft, struct score *score)
 {
        struct ccan_file *i;
        struct list_head *list;
-       struct score *score = talloc(m, struct score);
 
-       score->score = 0;
-       score->errors = talloc_strdup(score, "");
+       score->total = 0;
+       score->pass = true;
 
-       examples_run.total_score = 0;
        foreach_ptr(list, &m->examples, &m->mangled_examples) {
                list_for_each(list, i, list) {
                        char **lines, *expect, *input, *output;
                        unsigned int linenum = 0;
                        bool exact;
 
-                       if (i->compiled == NULL)
-                               continue;
-
                        lines = get_ccan_file_lines(i);
 
                        for (expect = find_expect(i, lines, &input, &exact,
@@ -252,53 +248,33 @@ static void *run_examples(struct manifest *m, bool keep,
                             linenum++,
                                     expect = find_expect(i, lines, &input,
                                                          &exact, &linenum)) {
-                               examples_run.total_score++;
+                               if (i->compiled[COMPILE_NORMAL] == NULL)
+                                       continue;
+
+                               score->total++;
                                output = unexpected(i, input, expect, exact);
-                               if (!output)
+                               if (!output) {
                                        score->score++;
-                               else {
-                                       score->errors = talloc_asprintf_append(
-                                               score->errors,
-                                               "%s: output '%s' didn't"
-                                               " %s '%s'\n",
-                                               i->name, output,
-                                               exact ? "match" : "contain",
-                                               expect);
+                                       continue;
                                }
+                               score_file_error(score, i, linenum+1,
+                                                "output '%s' didn't %s '%s'\n",
+                                                output,
+                                                exact ? "match" : "contain",
+                                                expect);
+                               score->pass = false;
                        }
                }
        }
-
-       if (strcmp(score->errors, "") == 0) {
-               talloc_free(score);
-               return NULL;
-       }
-       return score;
-}
-
-static unsigned int score_examples(struct manifest *m, void *check_result)
-{
-       struct score *score = check_result;
-       return score->score;
-}
-
-static const char *describe(struct manifest *m, void *check_result)
-{
-       struct score *score = check_result;
-       if (verbose)
-               return talloc_asprintf(m, "Wrong output running examples:\n"
-                                      "%s", score->errors);
-       return NULL;
 }
 
+/* FIXME: Test with reduced features, valgrind! */
 struct ccanlint examples_run = {
-       .key = "examples-run",
+       .key = "examples_run",
        .name = "Module examples with expected output give that output",
-       .score = score_examples,
-       .total_score = 3, /* This gets changed to # testable, if we run. */
        .check = run_examples,
-       .describe = describe,
        .can_run = can_run,
+       .needs = "examples_compile"
 };
 
-REGISTER_TEST(examples_run, &examples_compile, NULL);
+REGISTER_TEST(examples_run);