[Devel] [PATCH vz10 3/3] selftests/ve_devcg_bpf: add diagnostic messages to child test functions
Pavel Tikhomirov
ptikhomirov at virtuozzo.com
Tue May 19 13:44:44 MSK 2026
Reviewed-by: Pavel Tikhomirov <ptikhomirov at virtuozzo.com>
On 5/18/26 18:17, Konstantin Khorenko wrote:
> Error returns from child test functions are opaque numeric codes visible
> only via WEXITSTATUS. Add fprintf(stderr, ...) before each error return
> so the specific failure step and errno are reported in test output.
>
> https://virtuozzo.atlassian.net/browse/VSTOR-126504
> Signed-off-by: Konstantin Khorenko <khorenko at virtuozzo.com>
>
> Feature: ve: allow BPF in Containers
> ---
> .../ve_devcg_bpf/ve_devcg_bpf_test.c | 87 ++++++++++++++++---
> 1 file changed, 73 insertions(+), 14 deletions(-)
>
> diff --git a/tools/testing/selftests/ve_devcg_bpf/ve_devcg_bpf_test.c b/tools/testing/selftests/ve_devcg_bpf/ve_devcg_bpf_test.c
> index 0a04298149290..a7e6a9217b191 100644
> --- a/tools/testing/selftests/ve_devcg_bpf/ve_devcg_bpf_test.c
> +++ b/tools/testing/selftests/ve_devcg_bpf/ve_devcg_bpf_test.c
> @@ -153,8 +153,10 @@ static int test_prog_load(void)
> int fd;
>
> fd = load_devcg_prog();
> - if (fd < 0)
> + if (fd < 0) {
> + fprintf(stderr, "prog_load: load failed: %m\n");
> return 1;
> + }
>
> close(fd);
> return 0;
> @@ -166,11 +168,17 @@ static int test_prog_load_denied(void)
>
> fd = load_devcg_prog();
> if (fd >= 0) {
> + fprintf(stderr, "prog_load_denied: load unexpectedly succeeded\n");
> close(fd);
> return 1;
> }
>
> - return (errno == EPERM) ? 0 : 2;
> + if (errno != EPERM) {
> + fprintf(stderr, "prog_load_denied: expected EPERM, got %m\n");
> + return 2;
> + }
> +
> + return 0;
> }
>
> static int test_prog_load_oversized_denied(void)
> @@ -191,11 +199,17 @@ static int test_prog_load_oversized_denied(void)
>
> fd = syscall(__NR_bpf, BPF_PROG_LOAD, &attr, sizeof(attr));
> if (fd >= 0) {
> + fprintf(stderr, "prog_load_oversized: load unexpectedly succeeded\n");
> close(fd);
> return 1;
> }
>
> - return (errno == E2BIG) ? 0 : 2;
> + if (errno != E2BIG) {
> + fprintf(stderr, "prog_load_oversized: expected E2BIG, got %m\n");
> + return 2;
> + }
> +
> + return 0;
> }
>
> static int test_prog_query(int ve_cg_fd)
> @@ -203,11 +217,14 @@ static int test_prog_query(int ve_cg_fd)
> union bpf_attr attr;
> int cg_fd, ret;
>
> - if (mkdirat(ve_cg_fd, "subcg", 0755))
> + if (mkdirat(ve_cg_fd, "subcg", 0755)) {
> + fprintf(stderr, "prog_query: mkdirat failed: %m\n");
> return 1;
> + }
>
> cg_fd = openat(ve_cg_fd, "subcg", O_RDONLY | O_DIRECTORY);
> if (cg_fd < 0) {
> + fprintf(stderr, "prog_query: openat failed: %m\n");
> unlinkat(ve_cg_fd, "subcg", AT_REMOVEDIR);
> return 2;
> }
> @@ -220,7 +237,12 @@ static int test_prog_query(int ve_cg_fd)
> close(cg_fd);
> unlinkat(ve_cg_fd, "subcg", AT_REMOVEDIR);
>
> - return (ret < 0) ? 3 : 0;
> + if (ret < 0) {
> + fprintf(stderr, "prog_query: query failed: %m\n");
> + return 3;
> + }
> +
> + return 0;
> }
>
> static int test_prog_query_denied(int ve_cg_fd)
> @@ -228,11 +250,14 @@ static int test_prog_query_denied(int ve_cg_fd)
> union bpf_attr attr;
> int cg_fd, ret, saved_errno;
>
> - if (mkdirat(ve_cg_fd, "subcg", 0755))
> + if (mkdirat(ve_cg_fd, "subcg", 0755)) {
> + fprintf(stderr, "prog_query_denied: mkdirat failed: %m\n");
> return 1;
> + }
>
> cg_fd = openat(ve_cg_fd, "subcg", O_RDONLY | O_DIRECTORY);
> if (cg_fd < 0) {
> + fprintf(stderr, "prog_query_denied: openat failed: %m\n");
> unlinkat(ve_cg_fd, "subcg", AT_REMOVEDIR);
> return 2;
> }
> @@ -247,10 +272,18 @@ static int test_prog_query_denied(int ve_cg_fd)
> close(cg_fd);
> unlinkat(ve_cg_fd, "subcg", AT_REMOVEDIR);
>
> - if (ret == 0)
> + if (ret == 0) {
> + fprintf(stderr, "prog_query_denied: query unexpectedly succeeded\n");
> return 3;
> + }
>
> - return (saved_errno == EPERM) ? 0 : 4;
> + if (saved_errno != EPERM) {
> + fprintf(stderr, "prog_query_denied: expected EPERM, got errno %d\n",
> + saved_errno);
> + return 4;
> + }
> +
> + return 0;
> }
>
> static int test_prog_query_effective_denied(int ve_cg_fd)
> @@ -258,11 +291,14 @@ static int test_prog_query_effective_denied(int ve_cg_fd)
> union bpf_attr attr;
> int cg_fd, ret, saved_errno;
>
> - if (mkdirat(ve_cg_fd, "subcg", 0755))
> + if (mkdirat(ve_cg_fd, "subcg", 0755)) {
> + fprintf(stderr, "prog_query_effective: mkdirat failed: %m\n");
> return 1;
> + }
>
> cg_fd = openat(ve_cg_fd, "subcg", O_RDONLY | O_DIRECTORY);
> if (cg_fd < 0) {
> + fprintf(stderr, "prog_query_effective: openat failed: %m\n");
> unlinkat(ve_cg_fd, "subcg", AT_REMOVEDIR);
> return 2;
> }
> @@ -278,10 +314,18 @@ static int test_prog_query_effective_denied(int ve_cg_fd)
> close(cg_fd);
> unlinkat(ve_cg_fd, "subcg", AT_REMOVEDIR);
>
> - if (ret == 0)
> + if (ret == 0) {
> + fprintf(stderr, "prog_query_effective: query unexpectedly succeeded\n");
> return 3;
> + }
> +
> + if (saved_errno != EPERM) {
> + fprintf(stderr, "prog_query_effective: expected EPERM, got errno %d\n",
> + saved_errno);
> + return 4;
> + }
>
> - return (saved_errno == EPERM) ? 0 : 4;
> + return 0;
> }
>
> static int test_prog_query_root_denied(int ve_cg_fd)
> @@ -294,10 +338,17 @@ static int test_prog_query_root_denied(int ve_cg_fd)
> attr.query.attach_type = BPF_CGROUP_DEVICE;
>
> ret = syscall(__NR_bpf, BPF_PROG_QUERY, &attr, sizeof(attr));
> - if (ret == 0)
> + if (ret == 0) {
> + fprintf(stderr, "prog_query_root: query unexpectedly succeeded\n");
> return 1;
> + }
>
> - return (errno == EPERM) ? 0 : 2;
> + if (errno != EPERM) {
> + fprintf(stderr, "prog_query_root: expected EPERM, got %m\n");
> + return 2;
> + }
> +
> + return 0;
> }
>
> static int test_prog_attach_query(int ve_cg_fd)
> @@ -307,16 +358,20 @@ static int test_prog_attach_query(int ve_cg_fd)
> __u32 prog_ids[1];
>
> prog_fd = load_devcg_prog();
> - if (prog_fd < 0)
> + if (prog_fd < 0) {
> + fprintf(stderr, "prog_attach_query: load failed: %m\n");
> return 1;
> + }
>
> if (mkdirat(ve_cg_fd, "subcg", 0755)) {
> + fprintf(stderr, "prog_attach_query: mkdirat failed: %m\n");
> close(prog_fd);
> return 2;
> }
>
> cg_fd = openat(ve_cg_fd, "subcg", O_RDONLY | O_DIRECTORY);
> if (cg_fd < 0) {
> + fprintf(stderr, "prog_attach_query: openat failed: %m\n");
> close(prog_fd);
> unlinkat(ve_cg_fd, "subcg", AT_REMOVEDIR);
> return 3;
> @@ -330,6 +385,7 @@ static int test_prog_attach_query(int ve_cg_fd)
>
> ret = syscall(__NR_bpf, BPF_PROG_ATTACH, &attr, sizeof(attr));
> if (ret < 0) {
> + fprintf(stderr, "prog_attach_query: attach failed: %m\n");
> close(cg_fd);
> close(prog_fd);
> unlinkat(ve_cg_fd, "subcg", AT_REMOVEDIR);
> @@ -345,6 +401,7 @@ static int test_prog_attach_query(int ve_cg_fd)
>
> ret = syscall(__NR_bpf, BPF_PROG_QUERY, &attr, sizeof(attr));
> if (ret < 0) {
> + fprintf(stderr, "prog_attach_query: query failed: %m\n");
> close(cg_fd);
> close(prog_fd);
> unlinkat(ve_cg_fd, "subcg", AT_REMOVEDIR);
> @@ -352,6 +409,8 @@ static int test_prog_attach_query(int ve_cg_fd)
> }
>
> if (attr.query.prog_cnt != 1) {
> + fprintf(stderr, "prog_attach_query: expected 1 prog, got %u\n",
> + attr.query.prog_cnt);
> close(cg_fd);
> close(prog_fd);
> unlinkat(ve_cg_fd, "subcg", AT_REMOVEDIR);
--
Best regards, Pavel Tikhomirov
Senior Software Developer, Virtuozzo.
More information about the Devel
mailing list