xref: /aosp_15_r20/external/bcc/tests/cc/test_parse_tracepoint.cc (revision 387f9dfdfa2baef462e92476d413c7bc2470293e)
1*387f9dfdSAndroid Build Coastguard Worker #include "BPF.h"
2*387f9dfdSAndroid Build Coastguard Worker #include "catch.hpp"
3*387f9dfdSAndroid Build Coastguard Worker #include "common.h"
4*387f9dfdSAndroid Build Coastguard Worker 
5*387f9dfdSAndroid Build Coastguard Worker TEST_CASE("test tracepoint parser", "[TracepointParser]") {
6*387f9dfdSAndroid Build Coastguard Worker   std::string format =
7*387f9dfdSAndroid Build Coastguard Worker     "name: sys_enter_read\n"
8*387f9dfdSAndroid Build Coastguard Worker     "ID: 650\n"
9*387f9dfdSAndroid Build Coastguard Worker     "format:\n"
10*387f9dfdSAndroid Build Coastguard Worker     "   field:unsigned short common_type;       offset:0;       size:2; signed:0;\n"
11*387f9dfdSAndroid Build Coastguard Worker     "   field:unsigned char common_flags;       offset:2;       size:1; signed:0;\n"
12*387f9dfdSAndroid Build Coastguard Worker     "   field:unsigned char common_preempt_count;       offset:3;       size:1; signed:0;\n"
13*387f9dfdSAndroid Build Coastguard Worker     "   field:int common_pid;   offset:4;       size:4; signed:1;\n"
14*387f9dfdSAndroid Build Coastguard Worker     "\n"
15*387f9dfdSAndroid Build Coastguard Worker     "   field:int __syscall_nr; offset:8;       size:4; signed:1;\n"
16*387f9dfdSAndroid Build Coastguard Worker     "   field:unsigned int fd;  offset:16;      size:8; signed:0;\n"
17*387f9dfdSAndroid Build Coastguard Worker     "   field:char * buf;       offset:24;      size:8; signed:0;\n"
18*387f9dfdSAndroid Build Coastguard Worker     "   field:size_t count;     offset:32;      size:8; signed:0;\n"
19*387f9dfdSAndroid Build Coastguard Worker     "\n"
20*387f9dfdSAndroid Build Coastguard Worker     "print fmt: \"fd: 0x%08lx, buf: 0x%08lx, count: 0x%08lx\", ((unsigned long)(REC->fd)), ((unsigned long)(REC->buf)), ((unsigned long)(REC->count))\n";
21*387f9dfdSAndroid Build Coastguard Worker 
22*387f9dfdSAndroid Build Coastguard Worker   std::string expected =
23*387f9dfdSAndroid Build Coastguard Worker     "struct tracepoint__syscalls__sys_enter_read {\n"
24*387f9dfdSAndroid Build Coastguard Worker     "\tu64 __do_not_use__;\n"
25*387f9dfdSAndroid Build Coastguard Worker     "\tint __syscall_nr;\n"
26*387f9dfdSAndroid Build Coastguard Worker     "\tchar __pad_12;\n"
27*387f9dfdSAndroid Build Coastguard Worker     "\tchar __pad_13;\n"
28*387f9dfdSAndroid Build Coastguard Worker     "\tchar __pad_14;\n"
29*387f9dfdSAndroid Build Coastguard Worker     "\tchar __pad_15;\n"
30*387f9dfdSAndroid Build Coastguard Worker     "\tu64 fd;\n"
31*387f9dfdSAndroid Build Coastguard Worker     "\tchar * buf;\n"
32*387f9dfdSAndroid Build Coastguard Worker     "\tsize_t count;\n"
33*387f9dfdSAndroid Build Coastguard Worker     "};\n";
34*387f9dfdSAndroid Build Coastguard Worker 
35*387f9dfdSAndroid Build Coastguard Worker   {
36*387f9dfdSAndroid Build Coastguard Worker     std::istringstream input(format);
37*387f9dfdSAndroid Build Coastguard Worker     std::string result = ebpf::parse_tracepoint(input, "syscalls", "sys_enter_read");
38*387f9dfdSAndroid Build Coastguard Worker     REQUIRE(expected == result);
39*387f9dfdSAndroid Build Coastguard Worker   }
40*387f9dfdSAndroid Build Coastguard Worker 
41*387f9dfdSAndroid Build Coastguard Worker   format =
42*387f9dfdSAndroid Build Coastguard Worker     "name: signal_deliver\n"
43*387f9dfdSAndroid Build Coastguard Worker     "ID: 114\n"
44*387f9dfdSAndroid Build Coastguard Worker     "format:\n"
45*387f9dfdSAndroid Build Coastguard Worker     "  field:unsigned short common_type;       offset:0;       size:2; signed:0;\n"
46*387f9dfdSAndroid Build Coastguard Worker     "  field:unsigned char common_flags;       offset:2;       size:1; signed:0;\n"
47*387f9dfdSAndroid Build Coastguard Worker     "  field:unsigned char common_preempt_count;       offset:3;       size:1; signed:0;\n"
48*387f9dfdSAndroid Build Coastguard Worker     "  field:int common_pid;   offset:4;       size:4; signed:1;\n"
49*387f9dfdSAndroid Build Coastguard Worker     "\n"
50*387f9dfdSAndroid Build Coastguard Worker     "  field:int sig;  offset:8;       size:4; signed:1;\n"
51*387f9dfdSAndroid Build Coastguard Worker     "  field:int errno;        offset:12;      size:4; signed:1;\n"
52*387f9dfdSAndroid Build Coastguard Worker     "  field:int code; offset:16;      size:4; signed:1;\n"
53*387f9dfdSAndroid Build Coastguard Worker     "  field:unsigned long sa_handler; offset:24;      size:8; signed:0;\n"
54*387f9dfdSAndroid Build Coastguard Worker     "  field:unsigned long sa_flags;   offset:32;      size:8; signed:0;\n"
55*387f9dfdSAndroid Build Coastguard Worker     "\n"
56*387f9dfdSAndroid Build Coastguard Worker     "print fmt: \"sig=%d errno=%d code=%d sa_handler=%lx sa_flags=%lx\", REC->sig, REC->errno, REC->code, REC->sa_handler, REC->sa_flags\n";
57*387f9dfdSAndroid Build Coastguard Worker 
58*387f9dfdSAndroid Build Coastguard Worker   expected =
59*387f9dfdSAndroid Build Coastguard Worker     "struct tracepoint__signal__signal_deliver {\n"
60*387f9dfdSAndroid Build Coastguard Worker     "\tu64 __do_not_use__;\n"
61*387f9dfdSAndroid Build Coastguard Worker     "\tint sig;\n"
62*387f9dfdSAndroid Build Coastguard Worker     "\tint errno;\n"
63*387f9dfdSAndroid Build Coastguard Worker     "\tint code;\n"
64*387f9dfdSAndroid Build Coastguard Worker     "\tchar __pad_20;\n"
65*387f9dfdSAndroid Build Coastguard Worker     "\tchar __pad_21;\n"
66*387f9dfdSAndroid Build Coastguard Worker     "\tchar __pad_22;\n"
67*387f9dfdSAndroid Build Coastguard Worker     "\tchar __pad_23;\n"
68*387f9dfdSAndroid Build Coastguard Worker     "\tunsigned long sa_handler;\n"
69*387f9dfdSAndroid Build Coastguard Worker     "\tunsigned long sa_flags;\n"
70*387f9dfdSAndroid Build Coastguard Worker     "};\n";
71*387f9dfdSAndroid Build Coastguard Worker 
72*387f9dfdSAndroid Build Coastguard Worker   {
73*387f9dfdSAndroid Build Coastguard Worker     std::istringstream input(format);
74*387f9dfdSAndroid Build Coastguard Worker     std::string result = ebpf::parse_tracepoint(input, "signal", "signal_deliver");
75*387f9dfdSAndroid Build Coastguard Worker     REQUIRE(expected == result);
76*387f9dfdSAndroid Build Coastguard Worker   }
77*387f9dfdSAndroid Build Coastguard Worker 
78*387f9dfdSAndroid Build Coastguard Worker   format =
79*387f9dfdSAndroid Build Coastguard Worker     " field:unsigned short common_type;       offset:0;       size:2; signed:0;\n"
80*387f9dfdSAndroid Build Coastguard Worker     " field:unsigned char common_flags;       offset:2;       size:1; signed:0;\n"
81*387f9dfdSAndroid Build Coastguard Worker     " field:unsigned char common_preempt_count;       offset:3;       size:1; signed:0;\n"
82*387f9dfdSAndroid Build Coastguard Worker     " field:int common_pid;   offset:4;       size:4; signed:1;\n"
83*387f9dfdSAndroid Build Coastguard Worker     " field:unsigned char common_migrate_disable;     offset:8;       size:1; signed:0;\n"
84*387f9dfdSAndroid Build Coastguard Worker     " field:unsigned char common_preempt_lazy_count;  offset:9;       size:1; signed:0;\n"
85*387f9dfdSAndroid Build Coastguard Worker 
86*387f9dfdSAndroid Build Coastguard Worker     " field:char comm[16];    offset:12;      size:16;        signed:1;\n"
87*387f9dfdSAndroid Build Coastguard Worker     " field:pid_t pid;        offset:28;      size:4; signed:1;\n"
88*387f9dfdSAndroid Build Coastguard Worker     " field:int prio; offset:32;      size:4; signed:1;\n"
89*387f9dfdSAndroid Build Coastguard Worker     " field:int success;      offset:36;      size:4; signed:1;\n"
90*387f9dfdSAndroid Build Coastguard Worker     " field:int target_cpu;   offset:40;      size:4; signed:1;\n";
91*387f9dfdSAndroid Build Coastguard Worker 
92*387f9dfdSAndroid Build Coastguard Worker   expected =
93*387f9dfdSAndroid Build Coastguard Worker     "struct tracepoint__sched__sched_wakeup {\n"
94*387f9dfdSAndroid Build Coastguard Worker     "\tu64 __do_not_use__;\n"
95*387f9dfdSAndroid Build Coastguard Worker     "\tchar __do_not_use__8;\n"
96*387f9dfdSAndroid Build Coastguard Worker     "\tchar __do_not_use__9;\n"
97*387f9dfdSAndroid Build Coastguard Worker     "\tchar __pad_10;\n"
98*387f9dfdSAndroid Build Coastguard Worker     "\tchar __pad_11;\n"
99*387f9dfdSAndroid Build Coastguard Worker     "\tchar comm[16];\n"
100*387f9dfdSAndroid Build Coastguard Worker     "\tpid_t pid;\n"
101*387f9dfdSAndroid Build Coastguard Worker     "\tint prio;\n"
102*387f9dfdSAndroid Build Coastguard Worker     "\tint success;\n"
103*387f9dfdSAndroid Build Coastguard Worker     "\tint target_cpu;\n"
104*387f9dfdSAndroid Build Coastguard Worker     "};\n";
105*387f9dfdSAndroid Build Coastguard Worker 
106*387f9dfdSAndroid Build Coastguard Worker   {
107*387f9dfdSAndroid Build Coastguard Worker     std::istringstream input(format);
108*387f9dfdSAndroid Build Coastguard Worker     std::string result = ebpf::parse_tracepoint(input, "sched", "sched_wakeup");
109*387f9dfdSAndroid Build Coastguard Worker     REQUIRE(expected == result);
110*387f9dfdSAndroid Build Coastguard Worker   }
111*387f9dfdSAndroid Build Coastguard Worker }
112