From d84efcb4b6d2ff8a57ce27c43c1cadec84d88100 Mon Sep 17 00:00:00 2001 From: Peter Hutterer Date: Tue, 15 Oct 2024 15:28:56 +1000 Subject: [PATCH] test: add --exit-first to the litest test suite runner Exits upon the first failed test. Part-of: --- test/litest-runner.c | 27 +++++++++++++++++++++++++++ test/litest-runner.h | 1 + test/litest.c | 12 +++++++++++- 3 files changed, 39 insertions(+), 1 deletion(-) diff --git a/test/litest-runner.c b/test/litest-runner.c index afa9fe66..03f5c6b0 100644 --- a/test/litest-runner.c +++ b/test/litest-runner.c @@ -80,6 +80,7 @@ struct litest_runner { size_t max_forks; unsigned int timeout; bool verbose; + bool exit_on_fail; int terminating; @@ -684,6 +685,12 @@ litest_runner_set_verbose(struct litest_runner *runner, runner->verbose = verbose; } +void +litest_runner_set_exit_on_fail(struct litest_runner *runner, bool do_exit) +{ + runner->exit_on_fail = do_exit; +} + void litest_runner_add_test(struct litest_runner *runner, const struct litest_runner_test_description *desc) @@ -801,6 +808,26 @@ litest_runner_run_tests(struct litest_runner *runner) if (runner->terminating) { break; } + + if (runner->exit_on_fail) { + bool do_exit = false; + struct litest_runner_test *complete; + list_for_each(complete, &runner->tests_complete, node) { + switch (complete->result) { + case LITEST_FAIL: + case LITEST_SYSTEM_ERROR: + case LITEST_TIMEOUT: + do_exit = true; + break; + default: + break; + } + if (do_exit) + break; + } + if (do_exit) + break; + } } while (!runner->terminating && !list_empty(&runner->tests_running)) { diff --git a/test/litest-runner.h b/test/litest-runner.h index d88b6442..b2ca02e3 100644 --- a/test/litest-runner.h +++ b/test/litest-runner.h @@ -77,6 +77,7 @@ struct litest_runner *litest_runner_new(void); void litest_runner_set_num_parallel(struct litest_runner *runner, size_t num_jobs); void litest_runner_set_timeout(struct litest_runner *runner, unsigned int timeout); void litest_runner_set_verbose(struct litest_runner *runner, bool verbose); +void litest_runner_set_exit_on_fail(struct litest_runner *runner, bool do_exit); void litest_runner_add_test(struct litest_runner *runner, const struct litest_runner_test_description *t); enum litest_runner_result litest_runner_run_tests(struct litest_runner *runner); diff --git a/test/litest.c b/test/litest.c index 5aff0d57..392e61a8 100644 --- a/test/litest.c +++ b/test/litest.c @@ -82,6 +82,7 @@ static bool in_debugger = false; static bool verbose = false; static bool run_deviceless = false; static bool use_system_rules_quirks = false; +static bool exit_first = false; static const char *filter_test = NULL; static const char *filter_device = NULL; static const char *filter_group = NULL; @@ -997,6 +998,7 @@ litest_run_suite(struct list *suites, int njobs) litest_runner_set_num_parallel(runner, jobs > 0 ? jobs : 0); litest_runner_set_verbose(runner, verbose); litest_runner_set_timeout(runner, 30); + litest_runner_set_exit_on_fail(runner, exit_first); list_for_each(s, suites, node) { struct test *t; @@ -4518,6 +4520,7 @@ static inline enum litest_mode litest_parse_argv(int argc, char **argv) { enum { + OPT_EXIT_FIRST, OPT_FILTER_TEST, OPT_FILTER_DEVICE, OPT_FILTER_GROUP, @@ -4532,6 +4535,7 @@ litest_parse_argv(int argc, char **argv) { "filter-device", 1, 0, OPT_FILTER_DEVICE }, { "filter-group", 1, 0, OPT_FILTER_GROUP }, { "filter-deviceless", 0, 0, OPT_FILTER_DEVICELESS }, + { "exitfirst", 0, 0, OPT_EXIT_FIRST }, { "xml-output", 1, 0, OPT_XML_PREFIX }, { "jobs", 1, 0, OPT_JOBS }, { "list", 0, 0, OPT_LIST }, @@ -4568,7 +4572,7 @@ litest_parse_argv(int argc, char **argv) int c; int option_index = 0; - c = getopt_long(argc, argv, "j:", opts, &option_index); + c = getopt_long(argc, argv, "j:x", opts, &option_index); if (c == -1) break; switch(c) { @@ -4577,6 +4581,8 @@ litest_parse_argv(int argc, char **argv) printf("Usage: %s [--verbose] [--jobs] [--filter-...]\n" "\n" "Options:\n" + " -x | --exitfirst\n" + " Exit instantly on first failed test\n" " --filter-test=.... \n" " Glob to filter on test names\n" " --filter-device=.... \n" @@ -4630,6 +4636,10 @@ litest_parse_argv(int argc, char **argv) case OPT_FILTER_DEVICELESS: run_deviceless = true; break; + case 'x': + case OPT_EXIT_FIRST: + exit_first = true; + break; } } -- 2.34.1