On Tue, Jun 30, 2020 at 8:40 AM Jesper Dangaard Brouer <brouer@xxxxxxxxxx> wrote: > > The program test_progs have some very useful ability to specify a list of > test name substrings for selecting which tests to run. > > This patch add the ability to list the selected test names without running > them. This is practical for seeing which tests gets selected with given > select arguments (which can also contain a exclude list via --name-blacklist). > > This output can also be used by shell-scripts in a for-loop: > > for N in $(./test_progs --list -t xdp); do \ > ./test_progs -t $N 2>&1 > result_test_${N}.log & \ > done ; wait > > Signed-off-by: Jesper Dangaard Brouer <brouer@xxxxxxxxxx> > --- > tools/testing/selftests/bpf/test_progs.c | 20 ++++++++++++++++++++ > tools/testing/selftests/bpf/test_progs.h | 1 + > 2 files changed, 21 insertions(+) > > diff --git a/tools/testing/selftests/bpf/test_progs.c b/tools/testing/selftests/bpf/test_progs.c > index 1aa5360c427f..36abc3d4a8e2 100644 > --- a/tools/testing/selftests/bpf/test_progs.c > +++ b/tools/testing/selftests/bpf/test_progs.c > @@ -367,6 +367,7 @@ enum ARG_KEYS { > ARG_VERIFIER_STATS = 's', > ARG_VERBOSE = 'v', > ARG_GET_TEST_CNT = 'c', > + ARG_LIST_TEST_NAMES = 'l', > }; > > static const struct argp_option opts[] = { > @@ -382,6 +383,8 @@ static const struct argp_option opts[] = { > "Verbose output (use -vv or -vvv for progressively verbose output)" }, > { "count", ARG_GET_TEST_CNT, NULL, 0, > "Get number of top-level tests " }, > + { "list", ARG_LIST_TEST_NAMES, NULL, 0, > + "List test names that would run (without running them) " }, > {}, > }; > > @@ -517,6 +520,9 @@ static error_t parse_arg(int key, char *arg, struct argp_state *state) > case ARG_GET_TEST_CNT: > env->get_test_cnt = true; > break; > + case ARG_LIST_TEST_NAMES: > + env->list_test_names = true; > + break; > case ARGP_KEY_ARG: > argp_usage(state); > break; > @@ -665,6 +671,12 @@ int main(int argc, char **argv) > test->test_num, test->test_name)) > continue; > > + if (env.list_test_names) { > + fprintf(env.stdout, "%s\n", test->test_name); > + env.succ_cnt++; > + continue; > + } > + > test->run_test(); > /* ensure last sub-test is finalized properly */ > if (test->subtest_name) > @@ -688,9 +700,17 @@ int main(int argc, char **argv) > cleanup_cgroup_environment(); > } > stdio_restore(); > + > + if (env.list_test_names) { > + if (env.succ_cnt == 0) > + env.fail_cnt = 1; > + goto out; > + } > + Why failure if no test matched? Is that to catch bugs in whitelisting? > fprintf(stdout, "Summary: %d/%d PASSED, %d SKIPPED, %d FAILED\n", > env.succ_cnt, env.sub_succ_cnt, env.skip_cnt, env.fail_cnt); > > +out: > free_str_set(&env.test_selector.blacklist); > free_str_set(&env.test_selector.whitelist); > free(env.test_selector.num_set); > diff --git a/tools/testing/selftests/bpf/test_progs.h b/tools/testing/selftests/bpf/test_progs.h > index 0030584619c3..ec31f382e7fd 100644 > --- a/tools/testing/selftests/bpf/test_progs.h > +++ b/tools/testing/selftests/bpf/test_progs.h > @@ -67,6 +67,7 @@ struct test_env { > > bool jit_enabled; > bool get_test_cnt; > + bool list_test_names; > > struct prog_test_def *test; > FILE *stdout; > >