xref: /aosp_15_r20/external/bcc/tests/cc/test_queuestack_table.cc (revision 387f9dfdfa2baef462e92476d413c7bc2470293e)
1*387f9dfdSAndroid Build Coastguard Worker /*
2*387f9dfdSAndroid Build Coastguard Worker  * Copyright (c) 2020 Politecnico di Torino
3*387f9dfdSAndroid Build Coastguard Worker  *
4*387f9dfdSAndroid Build Coastguard Worker  * Licensed under the Apache License, Version 2.0 (the "License");
5*387f9dfdSAndroid Build Coastguard Worker  * you may not use this file except in compliance with the License.
6*387f9dfdSAndroid Build Coastguard Worker  * You may obtain a copy of the License at
7*387f9dfdSAndroid Build Coastguard Worker  *
8*387f9dfdSAndroid Build Coastguard Worker  * http://www.apache.org/licenses/LICENSE-2.0
9*387f9dfdSAndroid Build Coastguard Worker  *
10*387f9dfdSAndroid Build Coastguard Worker  * Unless required by applicable law or agreed to in writing, software
11*387f9dfdSAndroid Build Coastguard Worker  * distributed under the License is distributed on an "AS IS" BASIS,
12*387f9dfdSAndroid Build Coastguard Worker  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*387f9dfdSAndroid Build Coastguard Worker  * See the License for the specific language governing permissions and
14*387f9dfdSAndroid Build Coastguard Worker  * limitations under the License.
15*387f9dfdSAndroid Build Coastguard Worker  */
16*387f9dfdSAndroid Build Coastguard Worker 
17*387f9dfdSAndroid Build Coastguard Worker #include "BPF.h"
18*387f9dfdSAndroid Build Coastguard Worker #include "catch.hpp"
19*387f9dfdSAndroid Build Coastguard Worker #include <iostream>
20*387f9dfdSAndroid Build Coastguard Worker #include <linux/version.h>
21*387f9dfdSAndroid Build Coastguard Worker 
22*387f9dfdSAndroid Build Coastguard Worker //Queue/Stack types are available only from 4.20
23*387f9dfdSAndroid Build Coastguard Worker #if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 20, 0)
24*387f9dfdSAndroid Build Coastguard Worker TEST_CASE("queue table", "[queue_table]") {
25*387f9dfdSAndroid Build Coastguard Worker   const std::string BPF_PROGRAM = R"(
26*387f9dfdSAndroid Build Coastguard Worker     BPF_QUEUE(myqueue, int, 30);
27*387f9dfdSAndroid Build Coastguard Worker   )";
28*387f9dfdSAndroid Build Coastguard Worker 
29*387f9dfdSAndroid Build Coastguard Worker   ebpf::BPF bpf;
30*387f9dfdSAndroid Build Coastguard Worker   ebpf::StatusTuple res(0);
31*387f9dfdSAndroid Build Coastguard Worker   res = bpf.init(BPF_PROGRAM);
32*387f9dfdSAndroid Build Coastguard Worker   REQUIRE(res.ok());
33*387f9dfdSAndroid Build Coastguard Worker 
34*387f9dfdSAndroid Build Coastguard Worker   ebpf::BPFQueueStackTable<int> t = bpf.get_queuestack_table<int>("myqueue");
35*387f9dfdSAndroid Build Coastguard Worker 
36*387f9dfdSAndroid Build Coastguard Worker   SECTION("standard methods") {
37*387f9dfdSAndroid Build Coastguard Worker     int i, val;
38*387f9dfdSAndroid Build Coastguard Worker     std::string value;
39*387f9dfdSAndroid Build Coastguard Worker 
40*387f9dfdSAndroid Build Coastguard Worker     // insert elements
41*387f9dfdSAndroid Build Coastguard Worker     for (i=0; i<30; i++) {
42*387f9dfdSAndroid Build Coastguard Worker       res = t.push_value(i);
43*387f9dfdSAndroid Build Coastguard Worker       REQUIRE(res.ok());
44*387f9dfdSAndroid Build Coastguard Worker     }
45*387f9dfdSAndroid Build Coastguard Worker 
46*387f9dfdSAndroid Build Coastguard Worker     // checking head (peek)
47*387f9dfdSAndroid Build Coastguard Worker     res = t.get_head(val);
48*387f9dfdSAndroid Build Coastguard Worker     REQUIRE(res.ok());
49*387f9dfdSAndroid Build Coastguard Worker     REQUIRE(val == 0);
50*387f9dfdSAndroid Build Coastguard Worker 
51*387f9dfdSAndroid Build Coastguard Worker     // retrieve elements
52*387f9dfdSAndroid Build Coastguard Worker     for (i=0; i<30; i++) {
53*387f9dfdSAndroid Build Coastguard Worker       res = t.pop_value(val);
54*387f9dfdSAndroid Build Coastguard Worker       REQUIRE(res.ok());
55*387f9dfdSAndroid Build Coastguard Worker       REQUIRE(val == i);
56*387f9dfdSAndroid Build Coastguard Worker     }
57*387f9dfdSAndroid Build Coastguard Worker     // get non existing element
58*387f9dfdSAndroid Build Coastguard Worker     res = t.pop_value(val);
59*387f9dfdSAndroid Build Coastguard Worker     REQUIRE(!res.ok());
60*387f9dfdSAndroid Build Coastguard Worker   }
61*387f9dfdSAndroid Build Coastguard Worker }
62*387f9dfdSAndroid Build Coastguard Worker 
63*387f9dfdSAndroid Build Coastguard Worker TEST_CASE("stack table", "[stack_table]") {
64*387f9dfdSAndroid Build Coastguard Worker   const std::string BPF_PROGRAM = R"(
65*387f9dfdSAndroid Build Coastguard Worker     BPF_STACK(mystack, int, 30);
66*387f9dfdSAndroid Build Coastguard Worker   )";
67*387f9dfdSAndroid Build Coastguard Worker 
68*387f9dfdSAndroid Build Coastguard Worker   ebpf::BPF bpf;
69*387f9dfdSAndroid Build Coastguard Worker   ebpf::StatusTuple res(0);
70*387f9dfdSAndroid Build Coastguard Worker   res = bpf.init(BPF_PROGRAM);
71*387f9dfdSAndroid Build Coastguard Worker   REQUIRE(res.ok());
72*387f9dfdSAndroid Build Coastguard Worker 
73*387f9dfdSAndroid Build Coastguard Worker   ebpf::BPFQueueStackTable<int> t = bpf.get_queuestack_table<int>("mystack");
74*387f9dfdSAndroid Build Coastguard Worker 
75*387f9dfdSAndroid Build Coastguard Worker   SECTION("standard methods") {
76*387f9dfdSAndroid Build Coastguard Worker     int i, val;
77*387f9dfdSAndroid Build Coastguard Worker     std::string value;
78*387f9dfdSAndroid Build Coastguard Worker 
79*387f9dfdSAndroid Build Coastguard Worker     // insert elements
80*387f9dfdSAndroid Build Coastguard Worker     for (i=0; i<30; i++) {
81*387f9dfdSAndroid Build Coastguard Worker       res = t.push_value(i);
82*387f9dfdSAndroid Build Coastguard Worker       REQUIRE(res.ok());
83*387f9dfdSAndroid Build Coastguard Worker     }
84*387f9dfdSAndroid Build Coastguard Worker 
85*387f9dfdSAndroid Build Coastguard Worker     // checking head (peek)
86*387f9dfdSAndroid Build Coastguard Worker     res = t.get_head(val);
87*387f9dfdSAndroid Build Coastguard Worker     REQUIRE(res.ok());
88*387f9dfdSAndroid Build Coastguard Worker     REQUIRE(val == 29);
89*387f9dfdSAndroid Build Coastguard Worker 
90*387f9dfdSAndroid Build Coastguard Worker     // retrieve elements
91*387f9dfdSAndroid Build Coastguard Worker     for (i=0; i<30; i++) {
92*387f9dfdSAndroid Build Coastguard Worker       res = t.pop_value(val);
93*387f9dfdSAndroid Build Coastguard Worker       REQUIRE(res.ok());
94*387f9dfdSAndroid Build Coastguard Worker       REQUIRE( val == (30 - 1 - i));
95*387f9dfdSAndroid Build Coastguard Worker     }
96*387f9dfdSAndroid Build Coastguard Worker     // get non existing element
97*387f9dfdSAndroid Build Coastguard Worker     res = t.pop_value(val);
98*387f9dfdSAndroid Build Coastguard Worker     REQUIRE(!res.ok());
99*387f9dfdSAndroid Build Coastguard Worker   }
100*387f9dfdSAndroid Build Coastguard Worker }
101*387f9dfdSAndroid Build Coastguard Worker #endif
102