X-Git-Url: http://git.ozlabs.org/?p=ccan;a=blobdiff_plain;f=tools%2Fccanlint%2Ftests%2Fexamples_run.c;h=18bb849d3d0076ace733c28669cd33911bbd6930;hp=522feb0a0bf320422c80f4bc5c5fb73335b159b0;hb=655bae650e868e037d3db9f6e475f59b58e3e078;hpb=5378c864f9c37f39d906f599285da25a7db0c9fe diff --git a/tools/ccanlint/tests/examples_run.c b/tools/ccanlint/tests/examples_run.c index 522feb0a..18bb849d 100644 --- a/tools/ccanlint/tests/examples_run.c +++ b/tools/ccanlint/tests/examples_run.c @@ -3,6 +3,7 @@ #include #include #include +#include #include #include #include @@ -14,19 +15,19 @@ 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);