1*387f9dfdSAndroid Build Coastguard Worker#!/usr/bin/env python3 2*387f9dfdSAndroid Build Coastguard Worker# Copyright (c) Suchakra Sharma <[email protected]> 3*387f9dfdSAndroid Build Coastguard Worker# Licensed under the Apache License, Version 2.0 (the "License") 4*387f9dfdSAndroid Build Coastguard Worker 5*387f9dfdSAndroid Build Coastguard Workerfrom bcc import BPF, _get_num_open_probes, TRACEFS 6*387f9dfdSAndroid Build Coastguard Workerimport os 7*387f9dfdSAndroid Build Coastguard Workerimport sys 8*387f9dfdSAndroid Build Coastguard Workerfrom unittest import main, TestCase 9*387f9dfdSAndroid Build Coastguard Worker 10*387f9dfdSAndroid Build Coastguard Workerclass TestKprobeCnt(TestCase): 11*387f9dfdSAndroid Build Coastguard Worker def setUp(self): 12*387f9dfdSAndroid Build Coastguard Worker self.b = BPF(text=b""" 13*387f9dfdSAndroid Build Coastguard Worker int wololo(void *ctx) { 14*387f9dfdSAndroid Build Coastguard Worker return 0; 15*387f9dfdSAndroid Build Coastguard Worker } 16*387f9dfdSAndroid Build Coastguard Worker """) 17*387f9dfdSAndroid Build Coastguard Worker self.b.attach_kprobe(event_re=b"^vfs_.*", fn_name=b"wololo") 18*387f9dfdSAndroid Build Coastguard Worker 19*387f9dfdSAndroid Build Coastguard Worker def test_attach1(self): 20*387f9dfdSAndroid Build Coastguard Worker actual_cnt = 0 21*387f9dfdSAndroid Build Coastguard Worker with open("%s/available_filter_functions" % TRACEFS, "rb") as f: 22*387f9dfdSAndroid Build Coastguard Worker for line in f: 23*387f9dfdSAndroid Build Coastguard Worker if line.startswith(b"vfs_"): 24*387f9dfdSAndroid Build Coastguard Worker actual_cnt += 1 25*387f9dfdSAndroid Build Coastguard Worker open_cnt = self.b.num_open_kprobes() 26*387f9dfdSAndroid Build Coastguard Worker self.assertEqual(actual_cnt, open_cnt) 27*387f9dfdSAndroid Build Coastguard Worker 28*387f9dfdSAndroid Build Coastguard Worker def tearDown(self): 29*387f9dfdSAndroid Build Coastguard Worker self.b.cleanup() 30*387f9dfdSAndroid Build Coastguard Worker 31*387f9dfdSAndroid Build Coastguard Worker 32*387f9dfdSAndroid Build Coastguard Workerclass TestProbeGlobalCnt(TestCase): 33*387f9dfdSAndroid Build Coastguard Worker def setUp(self): 34*387f9dfdSAndroid Build Coastguard Worker self.b1 = BPF(text=b"""int count(void *ctx) { return 0; }""") 35*387f9dfdSAndroid Build Coastguard Worker self.b2 = BPF(text=b"""int count(void *ctx) { return 0; }""") 36*387f9dfdSAndroid Build Coastguard Worker 37*387f9dfdSAndroid Build Coastguard Worker def test_probe_quota(self): 38*387f9dfdSAndroid Build Coastguard Worker self.b1.attach_kprobe(event=b"schedule", fn_name=b"count") 39*387f9dfdSAndroid Build Coastguard Worker self.b2.attach_kprobe(event=b"submit_bio", fn_name=b"count") 40*387f9dfdSAndroid Build Coastguard Worker self.assertEqual(1, self.b1.num_open_kprobes()) 41*387f9dfdSAndroid Build Coastguard Worker self.assertEqual(1, self.b2.num_open_kprobes()) 42*387f9dfdSAndroid Build Coastguard Worker self.assertEqual(2, _get_num_open_probes()) 43*387f9dfdSAndroid Build Coastguard Worker self.b1.cleanup() 44*387f9dfdSAndroid Build Coastguard Worker self.b2.cleanup() 45*387f9dfdSAndroid Build Coastguard Worker self.assertEqual(0, _get_num_open_probes()) 46*387f9dfdSAndroid Build Coastguard Worker 47*387f9dfdSAndroid Build Coastguard Worker 48*387f9dfdSAndroid Build Coastguard Workerclass TestAutoKprobe(TestCase): 49*387f9dfdSAndroid Build Coastguard Worker def setUp(self): 50*387f9dfdSAndroid Build Coastguard Worker self.b = BPF(text=b""" 51*387f9dfdSAndroid Build Coastguard Worker int kprobe__schedule(void *ctx) { return 0; } 52*387f9dfdSAndroid Build Coastguard Worker int kretprobe__schedule(void *ctx) { return 0; } 53*387f9dfdSAndroid Build Coastguard Worker """) 54*387f9dfdSAndroid Build Coastguard Worker 55*387f9dfdSAndroid Build Coastguard Worker def test_count(self): 56*387f9dfdSAndroid Build Coastguard Worker self.assertEqual(2, self.b.num_open_kprobes()) 57*387f9dfdSAndroid Build Coastguard Worker 58*387f9dfdSAndroid Build Coastguard Worker def tearDown(self): 59*387f9dfdSAndroid Build Coastguard Worker self.b.cleanup() 60*387f9dfdSAndroid Build Coastguard Worker 61*387f9dfdSAndroid Build Coastguard Worker 62*387f9dfdSAndroid Build Coastguard Workerclass TestProbeQuota(TestCase): 63*387f9dfdSAndroid Build Coastguard Worker def setUp(self): 64*387f9dfdSAndroid Build Coastguard Worker self.b = BPF(text=b"""int count(void *ctx) { return 0; }""") 65*387f9dfdSAndroid Build Coastguard Worker 66*387f9dfdSAndroid Build Coastguard Worker def test_probe_quota(self): 67*387f9dfdSAndroid Build Coastguard Worker with self.assertRaises(Exception): 68*387f9dfdSAndroid Build Coastguard Worker self.b.attach_kprobe(event_re=b".*", fn_name=b"count") 69*387f9dfdSAndroid Build Coastguard Worker 70*387f9dfdSAndroid Build Coastguard Worker def test_uprobe_quota(self): 71*387f9dfdSAndroid Build Coastguard Worker with self.assertRaises(Exception): 72*387f9dfdSAndroid Build Coastguard Worker self.b.attach_uprobe(name=b"c", sym_re=b".*", fn_name=b"count") 73*387f9dfdSAndroid Build Coastguard Worker 74*387f9dfdSAndroid Build Coastguard Worker def tearDown(self): 75*387f9dfdSAndroid Build Coastguard Worker self.b.cleanup() 76*387f9dfdSAndroid Build Coastguard Worker 77*387f9dfdSAndroid Build Coastguard Worker 78*387f9dfdSAndroid Build Coastguard Workerclass TestProbeNotExist(TestCase): 79*387f9dfdSAndroid Build Coastguard Worker def setUp(self): 80*387f9dfdSAndroid Build Coastguard Worker self.b = BPF(text=b"""int count(void *ctx) { return 0; }""") 81*387f9dfdSAndroid Build Coastguard Worker 82*387f9dfdSAndroid Build Coastguard Worker def test_not_exist(self): 83*387f9dfdSAndroid Build Coastguard Worker with self.assertRaises(Exception): 84*387f9dfdSAndroid Build Coastguard Worker self.b.attach_kprobe(event=b"___doesnotexist", fn_name=b"count") 85*387f9dfdSAndroid Build Coastguard Worker 86*387f9dfdSAndroid Build Coastguard Worker def tearDown(self): 87*387f9dfdSAndroid Build Coastguard Worker self.b.cleanup() 88*387f9dfdSAndroid Build Coastguard Worker 89*387f9dfdSAndroid Build Coastguard Worker 90*387f9dfdSAndroid Build Coastguard Workerif __name__ == "__main__": 91*387f9dfdSAndroid Build Coastguard Worker main() 92