xref: /linux/tools/testing/selftests/bpf/prog_tests/prepare.c (revision 4f9786035f9e519db41375818e1d0b5f20da2f10)
1 // SPDX-License-Identifier: GPL-2.0
2 /* Copyright (c) 2025 Meta */
3 
4 #include <test_progs.h>
5 #include <network_helpers.h>
6 #include "prepare.skel.h"
7 
8 static bool check_prepared(struct bpf_object *obj)
9 {
10 	bool is_prepared = true;
11 	const struct bpf_map *map;
12 
13 	bpf_object__for_each_map(map, obj) {
14 		if (bpf_map__fd(map) < 0)
15 			is_prepared = false;
16 	}
17 
18 	return is_prepared;
19 }
20 
21 static void test_prepare_no_load(void)
22 {
23 	struct prepare *skel;
24 	int err;
25 	LIBBPF_OPTS(bpf_test_run_opts, topts,
26 		    .data_in = &pkt_v4,
27 		    .data_size_in = sizeof(pkt_v4),
28 	);
29 
30 	skel = prepare__open();
31 	if (!ASSERT_OK_PTR(skel, "prepare__open"))
32 		return;
33 
34 	if (!ASSERT_FALSE(check_prepared(skel->obj), "not check_prepared"))
35 		goto cleanup;
36 
37 	err = bpf_object__prepare(skel->obj);
38 
39 	if (!ASSERT_TRUE(check_prepared(skel->obj), "check_prepared"))
40 		goto cleanup;
41 
42 	if (!ASSERT_OK(err, "bpf_object__prepare"))
43 		goto cleanup;
44 
45 cleanup:
46 	prepare__destroy(skel);
47 }
48 
49 static void test_prepare_load(void)
50 {
51 	struct prepare *skel;
52 	int err, prog_fd;
53 	LIBBPF_OPTS(bpf_test_run_opts, topts,
54 		    .data_in = &pkt_v4,
55 		    .data_size_in = sizeof(pkt_v4),
56 	);
57 
58 	skel = prepare__open();
59 	if (!ASSERT_OK_PTR(skel, "prepare__open"))
60 		return;
61 
62 	if (!ASSERT_FALSE(check_prepared(skel->obj), "not check_prepared"))
63 		goto cleanup;
64 
65 	err = bpf_object__prepare(skel->obj);
66 	if (!ASSERT_OK(err, "bpf_object__prepare"))
67 		goto cleanup;
68 
69 	err = prepare__load(skel);
70 	if (!ASSERT_OK(err, "prepare__load"))
71 		goto cleanup;
72 
73 	if (!ASSERT_TRUE(check_prepared(skel->obj), "check_prepared"))
74 		goto cleanup;
75 
76 	prog_fd = bpf_program__fd(skel->progs.program);
77 	if (!ASSERT_GE(prog_fd, 0, "prog_fd"))
78 		goto cleanup;
79 
80 	err = bpf_prog_test_run_opts(prog_fd, &topts);
81 	if (!ASSERT_OK(err, "test_run_opts err"))
82 		goto cleanup;
83 
84 	if (!ASSERT_OK(topts.retval, "test_run_opts retval"))
85 		goto cleanup;
86 
87 	ASSERT_EQ(skel->bss->err, 0, "err");
88 
89 cleanup:
90 	prepare__destroy(skel);
91 }
92 
93 void test_prepare(void)
94 {
95 	if (test__start_subtest("prepare_load"))
96 		test_prepare_load();
97 	if (test__start_subtest("prepare_no_load"))
98 		test_prepare_no_load();
99 }
100