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