[Devel] [PATCH vz10 3/3] selftests/ve_devcg_bpf: add diagnostic messages to child test functions

Konstantin Khorenko khorenko at virtuozzo.com
Mon May 18 19:17:10 MSK 2026


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);
-- 
2.43.0



More information about the Devel mailing list