From 5f44c8ca0eb66503db51e0df1b65ff173eb42f57 Mon Sep 17 00:00:00 2001 From: Rusty Russell Date: Wed, 7 Oct 2009 23:00:53 +1030 Subject: [PATCH] tools/ccanlint: build tests are now compulsory Offer to run debugger when test fails, with breakpoint. --- tools/ccanlint/ccanlint.c | 3 +- .../{tests => compulsory_tests}/build.c | 0 .../{tests => compulsory_tests}/build_objs.c | 0 .../{tests => compulsory_tests}/check_build.c | 0 .../check_depends_built.c | 0 .../check_depends_exist.c | 0 .../check_includes_build.c | 0 .../compile_test_helpers.c | 0 .../compile_tests.c | 0 tools/ccanlint/compulsory_tests/run_tests.c | 119 ++++++++++++++++++ tools/ccanlint/tests/run_tests.c | 90 ------------- tools/tools.h | 2 +- 12 files changed, 121 insertions(+), 93 deletions(-) rename tools/ccanlint/{tests => compulsory_tests}/build.c (100%) rename tools/ccanlint/{tests => compulsory_tests}/build_objs.c (100%) rename tools/ccanlint/{tests => compulsory_tests}/check_build.c (100%) rename tools/ccanlint/{tests => compulsory_tests}/check_depends_built.c (100%) rename tools/ccanlint/{tests => compulsory_tests}/check_depends_exist.c (100%) rename tools/ccanlint/{tests => compulsory_tests}/check_includes_build.c (100%) rename tools/ccanlint/{tests => compulsory_tests}/compile_test_helpers.c (100%) rename tools/ccanlint/{tests => compulsory_tests}/compile_tests.c (100%) create mode 100644 tools/ccanlint/compulsory_tests/run_tests.c delete mode 100644 tools/ccanlint/tests/run_tests.c diff --git a/tools/ccanlint/ccanlint.c b/tools/ccanlint/ccanlint.c index 4590ba8c..a0fda1a8 100644 --- a/tools/ccanlint/ccanlint.c +++ b/tools/ccanlint/ccanlint.c @@ -241,7 +241,7 @@ int main(int argc, char *argv[]) { int c; bool summary = false; - unsigned int score, total_score; + unsigned int score = 0, total_score = 0; struct manifest *m; struct ccanlint *i; const char *prefix = ""; @@ -290,7 +290,6 @@ int main(int argc, char *argv[]) if (verbose) printf("\nNormal tests:\n"); - score = total_score = 0; while ((i = get_next_test(&normal_tests)) != NULL) run_test(i, summary, &score, &total_score, m); diff --git a/tools/ccanlint/tests/build.c b/tools/ccanlint/compulsory_tests/build.c similarity index 100% rename from tools/ccanlint/tests/build.c rename to tools/ccanlint/compulsory_tests/build.c diff --git a/tools/ccanlint/tests/build_objs.c b/tools/ccanlint/compulsory_tests/build_objs.c similarity index 100% rename from tools/ccanlint/tests/build_objs.c rename to tools/ccanlint/compulsory_tests/build_objs.c diff --git a/tools/ccanlint/tests/check_build.c b/tools/ccanlint/compulsory_tests/check_build.c similarity index 100% rename from tools/ccanlint/tests/check_build.c rename to tools/ccanlint/compulsory_tests/check_build.c diff --git a/tools/ccanlint/tests/check_depends_built.c b/tools/ccanlint/compulsory_tests/check_depends_built.c similarity index 100% rename from tools/ccanlint/tests/check_depends_built.c rename to tools/ccanlint/compulsory_tests/check_depends_built.c diff --git a/tools/ccanlint/tests/check_depends_exist.c b/tools/ccanlint/compulsory_tests/check_depends_exist.c similarity index 100% rename from tools/ccanlint/tests/check_depends_exist.c rename to tools/ccanlint/compulsory_tests/check_depends_exist.c diff --git a/tools/ccanlint/tests/check_includes_build.c b/tools/ccanlint/compulsory_tests/check_includes_build.c similarity index 100% rename from tools/ccanlint/tests/check_includes_build.c rename to tools/ccanlint/compulsory_tests/check_includes_build.c diff --git a/tools/ccanlint/tests/compile_test_helpers.c b/tools/ccanlint/compulsory_tests/compile_test_helpers.c similarity index 100% rename from tools/ccanlint/tests/compile_test_helpers.c rename to tools/ccanlint/compulsory_tests/compile_test_helpers.c diff --git a/tools/ccanlint/tests/compile_tests.c b/tools/ccanlint/compulsory_tests/compile_tests.c similarity index 100% rename from tools/ccanlint/tests/compile_tests.c rename to tools/ccanlint/compulsory_tests/compile_tests.c diff --git a/tools/ccanlint/compulsory_tests/run_tests.c b/tools/ccanlint/compulsory_tests/run_tests.c new file mode 100644 index 00000000..b3c1188d --- /dev/null +++ b/tools/ccanlint/compulsory_tests/run_tests.c @@ -0,0 +1,119 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +static const char *can_run(struct manifest *m) +{ + if (safe_mode) + return "Safe mode enabled"; + return NULL; +} + +struct run_tests_result { + struct list_node list; + struct ccan_file *file; + const char *output; +}; + +static void *do_run_tests(struct manifest *m) +{ + struct list_head *list = talloc(m, struct list_head); + struct run_tests_result *res; + struct ccan_file *i; + char *cmdout; + + list_head_init(list); + + list_for_each(&m->run_tests, i, list) { + run_tests.total_score++; + /* FIXME: timeout here */ + cmdout = run_command(m, i->compiled); + if (cmdout) { + res = talloc(list, struct run_tests_result); + res->file = i; + res->output = talloc_steal(res, cmdout); + list_add_tail(list, &res->list); + } + } + + list_for_each(&m->api_tests, i, list) { + run_tests.total_score++; + /* FIXME: timeout here */ + cmdout = run_command(m, i->compiled); + if (cmdout) { + res = talloc(list, struct run_tests_result); + res->file = i; + res->output = talloc_steal(res, cmdout); + list_add_tail(list, &res->list); + } + } + + if (list_empty(list)) { + talloc_free(list); + list = NULL; + } + + return list; +} + +static unsigned int score_run_tests(struct manifest *m, void *check_result) +{ + struct list_head *list = check_result; + struct run_tests_result *i; + unsigned int score = run_tests.total_score; + + list_for_each(list, i, list) + score--; + return score; +} + +static const char *describe_run_tests(struct manifest *m, + void *check_result) +{ + struct list_head *list = check_result; + char *descrip = talloc_strdup(check_result, "Running tests failed:\n"); + struct run_tests_result *i; + + list_for_each(list, i, list) + descrip = talloc_asprintf_append(descrip, "Running %s:\n%s", + i->file->name, i->output); + return descrip; +} + +static void run_under_debugger(struct manifest *m, void *check_result) +{ + char *command; + struct list_head *list = check_result; + struct run_tests_result *first; + + if (!ask("Should I run the first failing test under the debugger?")) + return; + + first = list_top(list, struct run_tests_result, list); + command = talloc_asprintf(m, "gdb -ex 'break tap.c:136' -ex 'run' %s", + first->file->compiled); + system(command); +} + +struct ccanlint run_tests = { + .name = "run and api tests run successfully", + .score = score_run_tests, + .check = do_run_tests, + .describe = describe_run_tests, + .can_run = can_run, + .handle = run_under_debugger +}; + +REGISTER_TEST(run_tests, &compile_tests, NULL); diff --git a/tools/ccanlint/tests/run_tests.c b/tools/ccanlint/tests/run_tests.c deleted file mode 100644 index 33daff03..00000000 --- a/tools/ccanlint/tests/run_tests.c +++ /dev/null @@ -1,90 +0,0 @@ -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -static const char *can_run(struct manifest *m) -{ - if (safe_mode) - return "Safe mode enabled"; - return NULL; -} - -static void *do_run_tests(struct manifest *m) -{ - struct list_head *list = talloc(m, struct list_head); - char *failures = talloc_strdup(m, ""); - struct ccan_file *i; - - list_head_init(list); - - list_for_each(&m->run_tests, i, list) { - char *testout; - run_tests.total_score++; - /* FIXME: timeout here */ - testout = run_command(m, i->compiled); - if (!testout) - continue; - failures = talloc_asprintf_append(failures, - "Running %s failed:\n", - i->name); - failures = talloc_append_string(failures, testout); - } - - list_for_each(&m->api_tests, i, list) { - char *testout; - run_tests.total_score++; - /* FIXME: timeout here */ - testout = run_command(m, i->compiled); - if (!testout) - continue; - failures = talloc_asprintf_append(failures, - "Running %s failed:\n", - i->name); - failures = talloc_append_string(failures, testout); - } - - if (streq(failures, "")) { - talloc_free(failures); - failures = NULL; - } - - return failures; -} - -static unsigned int score_run_tests(struct manifest *m, void *check_result) -{ - /* FIXME: be cleverer here */ - return 0; -} - -static const char *describe_run_tests(struct manifest *m, - void *check_result) -{ - char *descrip = talloc_strdup(check_result, "Running tests failed:\n"); - - return talloc_append_string(descrip, check_result); -} - -/* FIXME: Handle by offering to run under debugger... */ - -struct ccanlint run_tests = { - .name = "run and api tests run successfully", - .score = score_run_tests, - .check = do_run_tests, - .describe = describe_run_tests, - .can_run = can_run, -}; - -REGISTER_TEST(run_tests, &compile_tests, NULL); diff --git a/tools/tools.h b/tools/tools.h index cc004036..b7fe9155 100644 --- a/tools/tools.h +++ b/tools/tools.h @@ -9,7 +9,7 @@ #define SPACE_CHARS " \f\n\r\t\v" /* FIXME: Remove some -I */ -#define CFLAGS "-O -Wall -Wundef -Wstrict-prototypes -Wold-style-definition -Wmissing-prototypes -Wmissing-declarations -Werror -Iccan/ -I. -I.. -I../.." +#define CFLAGS "-g -Wall -Wundef -Wstrict-prototypes -Wold-style-definition -Wmissing-prototypes -Wmissing-declarations -Werror -Iccan/ -I. -I.. -I../.." /* This actually compiles and runs the info file to get dependencies. */ char **get_deps(const void *ctx, const char *dir, const char *name, -- 2.39.2