Commit 5f44c8ca authored by Rusty Russell's avatar Rusty Russell

tools/ccanlint: build tests are now compulsory

Offer to run debugger when test fails, with breakpoint.
parent 382e1e29
......@@ -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);
......
......@@ -21,63 +21,91 @@ static const char *can_run(struct manifest *m)
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);
char *failures = talloc_strdup(m, "");
struct run_tests_result *res;
struct ccan_file *i;
char *cmdout;
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);
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) {
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);
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 (streq(failures, "")) {
talloc_free(failures);
failures = NULL;
if (list_empty(list)) {
talloc_free(list);
list = NULL;
}
return failures;
return list;
}
static unsigned int score_run_tests(struct manifest *m, void *check_result)
{
/* FIXME: be cleverer here */
return 0;
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;
return talloc_append_string(descrip, check_result);
list_for_each(list, i, list)
descrip = talloc_asprintf_append(descrip, "Running %s:\n%s",
i->file->name, i->output);
return descrip;
}
/* FIXME: Handle by offering to run under debugger... */
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",
......@@ -85,6 +113,7 @@ struct ccanlint 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);
......@@ -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,
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment