selftests/bpf: Test_progs option for getting number of tests
authorJesper Dangaard Brouer <brouer@redhat.com>
Wed, 1 Jul 2020 21:44:12 +0000 (23:44 +0200)
committerAlexei Starovoitov <ast@kernel.org>
Wed, 1 Jul 2020 22:22:13 +0000 (15:22 -0700)
It can be practial to get the number of tests that test_progs contain.
This could for example be used to create a shell for-loop construct that
runs the individual tests.

Like:
 for N in $(seq 1 $(./test_progs -c)); do
   ./test_progs -n $N 2>&1 > result_test_${N}.log &
 done ; wait

V2: Add the ability to return the count for the selected tests. This is
useful for getting a count e.g. after excluding some tests with option -b.
The current beakers test script like to report the max test count upfront.

Signed-off-by: Jesper Dangaard Brouer <brouer@redhat.com>
Signed-off-by: Alexei Starovoitov <ast@kernel.org>
Acked-by: Andrii Nakryiko <andriin@fb.com>
Link: https://lore.kernel.org/bpf/159363985244.930467.12617117873058936829.stgit@firesoul
tools/testing/selftests/bpf/test_progs.c
tools/testing/selftests/bpf/test_progs.h

index da70a4f..a5dba14 100644 (file)
@@ -366,6 +366,7 @@ enum ARG_KEYS {
        ARG_TEST_NAME_BLACKLIST = 'b',
        ARG_VERIFIER_STATS = 's',
        ARG_VERBOSE = 'v',
+       ARG_GET_TEST_CNT = 'c',
 };
 
 static const struct argp_option opts[] = {
@@ -379,6 +380,8 @@ static const struct argp_option opts[] = {
          "Output verifier statistics", },
        { "verbose", ARG_VERBOSE, "LEVEL", OPTION_ARG_OPTIONAL,
          "Verbose output (use -vv or -vvv for progressively verbose output)" },
+       { "count", ARG_GET_TEST_CNT, NULL, 0,
+         "Get number of selected top-level tests " },
        {},
 };
 
@@ -511,6 +514,9 @@ static error_t parse_arg(int key, char *arg, struct argp_state *state)
                        }
                }
                break;
+       case ARG_GET_TEST_CNT:
+               env->get_test_cnt = true;
+               break;
        case ARGP_KEY_ARG:
                argp_usage(state);
                break;
@@ -654,6 +660,11 @@ int main(int argc, char **argv)
                                test->test_num, test->test_name))
                        continue;
 
+               if (env.get_test_cnt) {
+                       env.succ_cnt++;
+                       continue;
+               }
+
                test->run_test();
                /* ensure last sub-test is finalized properly */
                if (test->subtest_name)
@@ -677,9 +688,16 @@ int main(int argc, char **argv)
                        cleanup_cgroup_environment();
        }
        stdio_restore();
+
+       if (env.get_test_cnt) {
+               printf("%d\n", env.succ_cnt);
+               goto out;
+       }
+
        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);
index f4503c9..0030584 100644 (file)
@@ -66,6 +66,7 @@ struct test_env {
        enum verbosity verbosity;
 
        bool jit_enabled;
+       bool get_test_cnt;
 
        struct prog_test_def *test;
        FILE *stdout;