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