1*387f9dfdSAndroid Build Coastguard Worker#!/usr/bin/env python3 2*387f9dfdSAndroid Build Coastguard Worker# Copyright (c) Sasha Goldshtein 3*387f9dfdSAndroid Build Coastguard Worker# Licensed under the Apache License, Version 2.0 (the "License") 4*387f9dfdSAndroid Build Coastguard Worker 5*387f9dfdSAndroid Build Coastguard Workerimport bcc 6*387f9dfdSAndroid Build Coastguard Workerimport unittest 7*387f9dfdSAndroid Build Coastguard Workerfrom time import sleep 8*387f9dfdSAndroid Build Coastguard Workerfrom utils import kernel_version_ge 9*387f9dfdSAndroid Build Coastguard Workerimport os 10*387f9dfdSAndroid Build Coastguard Workerimport subprocess 11*387f9dfdSAndroid Build Coastguard Worker 12*387f9dfdSAndroid Build Coastguard Worker@unittest.skipUnless(kernel_version_ge(4,7), "requires kernel >= 4.7") 13*387f9dfdSAndroid Build Coastguard Workerclass TestTracepoint(unittest.TestCase): 14*387f9dfdSAndroid Build Coastguard Worker def test_tracepoint(self): 15*387f9dfdSAndroid Build Coastguard Worker text = b""" 16*387f9dfdSAndroid Build Coastguard Worker BPF_HASH(switches, u32, u64); 17*387f9dfdSAndroid Build Coastguard Worker TRACEPOINT_PROBE(sched, sched_switch) { 18*387f9dfdSAndroid Build Coastguard Worker u64 val = 0; 19*387f9dfdSAndroid Build Coastguard Worker u32 pid = args->next_pid; 20*387f9dfdSAndroid Build Coastguard Worker u64 *existing = switches.lookup_or_init(&pid, &val); 21*387f9dfdSAndroid Build Coastguard Worker (*existing)++; 22*387f9dfdSAndroid Build Coastguard Worker return 0; 23*387f9dfdSAndroid Build Coastguard Worker } 24*387f9dfdSAndroid Build Coastguard Worker """ 25*387f9dfdSAndroid Build Coastguard Worker b = bcc.BPF(text=text) 26*387f9dfdSAndroid Build Coastguard Worker sleep(1) 27*387f9dfdSAndroid Build Coastguard Worker total_switches = 0 28*387f9dfdSAndroid Build Coastguard Worker for k, v in b[b"switches"].items(): 29*387f9dfdSAndroid Build Coastguard Worker total_switches += v.value 30*387f9dfdSAndroid Build Coastguard Worker self.assertNotEqual(0, total_switches) 31*387f9dfdSAndroid Build Coastguard Worker 32*387f9dfdSAndroid Build Coastguard Worker@unittest.skipUnless(kernel_version_ge(4,7), "requires kernel >= 4.7") 33*387f9dfdSAndroid Build Coastguard Workerclass TestTracepointDataLoc(unittest.TestCase): 34*387f9dfdSAndroid Build Coastguard Worker def test_tracepoint_data_loc(self): 35*387f9dfdSAndroid Build Coastguard Worker text = b""" 36*387f9dfdSAndroid Build Coastguard Worker struct value_t { 37*387f9dfdSAndroid Build Coastguard Worker char filename[64]; 38*387f9dfdSAndroid Build Coastguard Worker }; 39*387f9dfdSAndroid Build Coastguard Worker BPF_HASH(execs, u32, struct value_t); 40*387f9dfdSAndroid Build Coastguard Worker TRACEPOINT_PROBE(sched, sched_process_exec) { 41*387f9dfdSAndroid Build Coastguard Worker struct value_t val = {0}; 42*387f9dfdSAndroid Build Coastguard Worker char fn[64]; 43*387f9dfdSAndroid Build Coastguard Worker u32 pid = args->pid; 44*387f9dfdSAndroid Build Coastguard Worker struct value_t *existing = execs.lookup_or_init(&pid, &val); 45*387f9dfdSAndroid Build Coastguard Worker TP_DATA_LOC_READ_CONST(fn, filename, 64); 46*387f9dfdSAndroid Build Coastguard Worker __builtin_memcpy(existing->filename, fn, 64); 47*387f9dfdSAndroid Build Coastguard Worker return 0; 48*387f9dfdSAndroid Build Coastguard Worker } 49*387f9dfdSAndroid Build Coastguard Worker """ 50*387f9dfdSAndroid Build Coastguard Worker b = bcc.BPF(text=text) 51*387f9dfdSAndroid Build Coastguard Worker subprocess.check_output(["/bin/ls"]) 52*387f9dfdSAndroid Build Coastguard Worker sleep(1) 53*387f9dfdSAndroid Build Coastguard Worker self.assertTrue("/bin/ls" in [v.filename.decode() 54*387f9dfdSAndroid Build Coastguard Worker for v in b[b"execs"].values()]) 55*387f9dfdSAndroid Build Coastguard Worker 56*387f9dfdSAndroid Build Coastguard Workerif __name__ == "__main__": 57*387f9dfdSAndroid Build Coastguard Worker unittest.main() 58