On Wed, Dec 18, 2019 at 6:14 PM Andrey Ignatov <rdna@xxxxxx> wrote: > > Convert test_cgroup_attach to prog_tests. > > This change does a lot of things but in many cases it's pretty expensive > to separate them, so they go in one commit. Nevertheless the logic is > ketp as is and changes made are just moving things around, simplifying > them (w/o changing the meaning of the tests) and making prog_tests > compatible: > > * split the 3 tests in the file into 3 separate files in prog_tests/; > > * rename the test functions to test_<file_base_name>; > > * remove unused includes, constants, variables and functions from every > test; > > * replace `if`-s with or `if (CHECK())` where additional context should > be logged and with `if (CHECK_FAIL())` where line number is enough; > > * switch from `log_err()` to logging via `CHECK()`; > > * replace `assert`-s with `CHECK_FAIL()` to avoid crashing the whole > test_progs if one assertion fails; > > * replace cgroup_helpers with test__join_cgroup() in > cgroup_attach_override only, other tests need more fine-grained > control for cgroup creation/deletion so cgroup_helpers are still used > there; > > * simplify cgroup_attach_autodetach by switching to easiest possible > program since this test doesn't really need such a complicated program > as cgroup_attach_multi does; > > * remove test_cgroup_attach.c itself. > > Signed-off-by: Andrey Ignatov <rdna@xxxxxx> > --- > tools/testing/selftests/bpf/.gitignore | 1 - > tools/testing/selftests/bpf/Makefile | 3 +- > .../bpf/prog_tests/cgroup_attach_autodetach.c | 111 ++++ > .../bpf/prog_tests/cgroup_attach_multi.c | 238 ++++++++ > .../bpf/prog_tests/cgroup_attach_override.c | 148 +++++ > .../selftests/bpf/test_cgroup_attach.c | 571 ------------------ > 6 files changed, 498 insertions(+), 574 deletions(-) > create mode 100644 tools/testing/selftests/bpf/prog_tests/cgroup_attach_autodetach.c > create mode 100644 tools/testing/selftests/bpf/prog_tests/cgroup_attach_multi.c > create mode 100644 tools/testing/selftests/bpf/prog_tests/cgroup_attach_override.c > delete mode 100644 tools/testing/selftests/bpf/test_cgroup_attach.c > [...] > + > + if (CHECK_FAIL(setup_cgroup_environment())) > + goto err; > + > + cg1 = create_and_get_cgroup("/cg1"); > + if (CHECK_FAIL(cg1 < 0)) > + goto err; > + cg2 = create_and_get_cgroup("/cg1/cg2"); > + if (CHECK_FAIL(cg2 < 0)) > + goto err; > + cg3 = create_and_get_cgroup("/cg1/cg2/cg3"); > + if (CHECK_FAIL(cg3 < 0)) > + goto err; > + cg4 = create_and_get_cgroup("/cg1/cg2/cg3/cg4"); > + if (CHECK_FAIL(cg4 < 0)) > + goto err; > + cg5 = create_and_get_cgroup("/cg1/cg2/cg3/cg4/cg5"); > + if (CHECK_FAIL(cg5 < 0)) > + goto err; > + > + if (CHECK_FAIL(join_cgroup("/cg1/cg2/cg3/cg4/cg5"))) > + goto err; > + > + if (CHECK(bpf_prog_attach(allow_prog[0], cg1, BPF_CGROUP_INET_EGRESS, > + BPF_F_ALLOW_MULTI), > + "prog0_attach_to_cg1_multi", "errno=%d\n", errno)) > + goto err; > + > + if (CHECK(!bpf_prog_attach(allow_prog[0], cg1, BPF_CGROUP_INET_EGRESS, > + BPF_F_ALLOW_MULTI), > + "fail_same_prog_attach_to_cg1", "unexpected success\n")) > + goto err; > + > + if (CHECK(bpf_prog_attach(allow_prog[1], cg1, BPF_CGROUP_INET_EGRESS, > + BPF_F_ALLOW_MULTI), > + "prog1_attach_to_cg1_multi", "errno=%d\n", errno)) > + goto err; > + > + if (CHECK(bpf_prog_attach(allow_prog[2], cg2, BPF_CGROUP_INET_EGRESS, > + BPF_F_ALLOW_OVERRIDE), > + "prog2_attach_to_cg2_override", "errno=%d\n", errno)) > + goto err; > + > + if (CHECK(bpf_prog_attach(allow_prog[3], cg3, BPF_CGROUP_INET_EGRESS, > + BPF_F_ALLOW_MULTI), > + "prog3_attach_to_cg3_multi", "errno=%d\n", errno)) > + goto err; > + > + if (CHECK(bpf_prog_attach(allow_prog[4], cg4, BPF_CGROUP_INET_EGRESS, > + BPF_F_ALLOW_OVERRIDE), > + "prog4_attach_to_cg4_override", "errno=%d\n", errno)) > + goto err; > + > + if (CHECK(bpf_prog_attach(allow_prog[5], cg5, BPF_CGROUP_INET_EGRESS, 0), > + "prog5_attach_to_cg5_none", "errno=%d\n", errno)) > + goto err; nit: this looks like a good candidate for a loop... > + > + CHECK_FAIL(system(PING_CMD)); > + CHECK_FAIL(bpf_map_lookup_elem(map_fd, &key, &value)); > + CHECK_FAIL(value != 1 + 2 + 8 + 32); > + [...] > -int main(void) > -{ > - int (*tests[])(void) = { > - test_foo_bar, > - test_multiprog, > - test_autodetach, > - }; > - int errors = 0; > - int i; > - > - for (i = 0; i < ARRAY_SIZE(tests); i++) > - if (tests[i]()) > - errors++; Depending on what you think is better structure (I couldn't follow through entire test logic...), you could have done this as a single test with 3 subtests. Search for test__start_subtest(). If that saves you some duplication, I think it's worth converting (which will be 1-to-1 with original structure). But either way thanks a lot for doing the convertion, brings as another step closer to more uniform and consolidated testing infra. > - > - if (errors) > - printf("test_cgroup_attach:FAIL\n"); > - else > - printf("test_cgroup_attach:PASS\n"); > - > - return errors ? EXIT_FAILURE : EXIT_SUCCESS; > -} > -- > 2.17.1 >