1 // SPDX-License-Identifier: GPL-2.0
2 /* Copyright (c) 2022 Meta Platforms, Inc. and affiliates. */
3
4 #include <test_progs.h>
5 #include <network_helpers.h>
6
7 #include "rbtree.skel.h"
8 #include "rbtree_fail.skel.h"
9 #include "rbtree_btf_fail__wrong_node_type.skel.h"
10 #include "rbtree_btf_fail__add_wrong_type.skel.h"
11
test_rbtree_add_nodes(void)12 static void test_rbtree_add_nodes(void)
13 {
14 LIBBPF_OPTS(bpf_test_run_opts, opts,
15 .data_in = &pkt_v4,
16 .data_size_in = sizeof(pkt_v4),
17 .repeat = 1,
18 );
19 struct rbtree *skel;
20 int ret;
21
22 skel = rbtree__open_and_load();
23 if (!ASSERT_OK_PTR(skel, "rbtree__open_and_load"))
24 return;
25
26 ret = bpf_prog_test_run_opts(bpf_program__fd(skel->progs.rbtree_add_nodes), &opts);
27 ASSERT_OK(ret, "rbtree_add_nodes run");
28 ASSERT_OK(opts.retval, "rbtree_add_nodes retval");
29 ASSERT_EQ(skel->data->less_callback_ran, 1, "rbtree_add_nodes less_callback_ran");
30
31 rbtree__destroy(skel);
32 }
33
test_rbtree_add_and_remove(void)34 static void test_rbtree_add_and_remove(void)
35 {
36 LIBBPF_OPTS(bpf_test_run_opts, opts,
37 .data_in = &pkt_v4,
38 .data_size_in = sizeof(pkt_v4),
39 .repeat = 1,
40 );
41 struct rbtree *skel;
42 int ret;
43
44 skel = rbtree__open_and_load();
45 if (!ASSERT_OK_PTR(skel, "rbtree__open_and_load"))
46 return;
47
48 ret = bpf_prog_test_run_opts(bpf_program__fd(skel->progs.rbtree_add_and_remove), &opts);
49 ASSERT_OK(ret, "rbtree_add_and_remove");
50 ASSERT_OK(opts.retval, "rbtree_add_and_remove retval");
51 ASSERT_EQ(skel->data->removed_key, 5, "rbtree_add_and_remove first removed key");
52
53 rbtree__destroy(skel);
54 }
55
test_rbtree_first_and_remove(void)56 static void test_rbtree_first_and_remove(void)
57 {
58 LIBBPF_OPTS(bpf_test_run_opts, opts,
59 .data_in = &pkt_v4,
60 .data_size_in = sizeof(pkt_v4),
61 .repeat = 1,
62 );
63 struct rbtree *skel;
64 int ret;
65
66 skel = rbtree__open_and_load();
67 if (!ASSERT_OK_PTR(skel, "rbtree__open_and_load"))
68 return;
69
70 ret = bpf_prog_test_run_opts(bpf_program__fd(skel->progs.rbtree_first_and_remove), &opts);
71 ASSERT_OK(ret, "rbtree_first_and_remove");
72 ASSERT_OK(opts.retval, "rbtree_first_and_remove retval");
73 ASSERT_EQ(skel->data->first_data[0], 2, "rbtree_first_and_remove first rbtree_first()");
74 ASSERT_EQ(skel->data->removed_key, 1, "rbtree_first_and_remove first removed key");
75 ASSERT_EQ(skel->data->first_data[1], 4, "rbtree_first_and_remove second rbtree_first()");
76
77 rbtree__destroy(skel);
78 }
79
test_rbtree_success(void)80 void test_rbtree_success(void)
81 {
82 if (test__start_subtest("rbtree_add_nodes"))
83 test_rbtree_add_nodes();
84 if (test__start_subtest("rbtree_add_and_remove"))
85 test_rbtree_add_and_remove();
86 if (test__start_subtest("rbtree_first_and_remove"))
87 test_rbtree_first_and_remove();
88 }
89
90 #define BTF_FAIL_TEST(suffix) \
91 void test_rbtree_btf_fail__##suffix(void) \
92 { \
93 struct rbtree_btf_fail__##suffix *skel; \
94 \
95 skel = rbtree_btf_fail__##suffix##__open_and_load(); \
96 if (!ASSERT_ERR_PTR(skel, \
97 "rbtree_btf_fail__" #suffix "__open_and_load unexpected success")) \
98 rbtree_btf_fail__##suffix##__destroy(skel); \
99 }
100
101 #define RUN_BTF_FAIL_TEST(suffix) \
102 if (test__start_subtest("rbtree_btf_fail__" #suffix)) \
103 test_rbtree_btf_fail__##suffix();
104
105 BTF_FAIL_TEST(wrong_node_type);
106 BTF_FAIL_TEST(add_wrong_type);
107
test_rbtree_btf_fail(void)108 void test_rbtree_btf_fail(void)
109 {
110 RUN_BTF_FAIL_TEST(wrong_node_type);
111 RUN_BTF_FAIL_TEST(add_wrong_type);
112 }
113
test_rbtree_fail(void)114 void test_rbtree_fail(void)
115 {
116 RUN_TESTS(rbtree_fail);
117 }
118