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
check_prepared(struct bpf_object * obj)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
test_prepare_no_load(void)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
test_prepare_load(void)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
test_prepare(void)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