1*387f9dfdSAndroid Build Coastguard Worker#!/usr/bin/env python3 2*387f9dfdSAndroid Build Coastguard Worker# Copyright (c) PLUMgrid, Inc. 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 6*387f9dfdSAndroid Build Coastguard Workerfrom simulation import Simulation 7*387f9dfdSAndroid Build Coastguard Workerimport sys 8*387f9dfdSAndroid Build Coastguard Workerimport os 9*387f9dfdSAndroid Build Coastguard Workerimport tempfile 10*387f9dfdSAndroid Build Coastguard Workerfrom unittest import main, TestCase 11*387f9dfdSAndroid Build Coastguard Worker 12*387f9dfdSAndroid Build Coastguard Worker 13*387f9dfdSAndroid Build Coastguard Workererror_msg = "R0 invalid mem access 'map_value_or_null'\n" 14*387f9dfdSAndroid Build Coastguard Worker 15*387f9dfdSAndroid Build Coastguard Workertext = b""" 16*387f9dfdSAndroid Build Coastguard Worker #include <uapi/linux/ptrace.h> 17*387f9dfdSAndroid Build Coastguard Worker #include <bcc/proto.h> 18*387f9dfdSAndroid Build Coastguard Worker BPF_HASH(t1, int, int, 10); 19*387f9dfdSAndroid Build Coastguard Worker int sim_port(struct __sk_buff *skb) { 20*387f9dfdSAndroid Build Coastguard Worker int x = 0, *y; 21*387f9dfdSAndroid Build Coastguard Worker """ 22*387f9dfdSAndroid Build Coastguard Workerrepeat = b""" 23*387f9dfdSAndroid Build Coastguard Worker y = t1.lookup(&x); 24*387f9dfdSAndroid Build Coastguard Worker if (!y) return 0; 25*387f9dfdSAndroid Build Coastguard Worker x = *y; 26*387f9dfdSAndroid Build Coastguard Worker """ 27*387f9dfdSAndroid Build Coastguard Workerend = b""" 28*387f9dfdSAndroid Build Coastguard Worker y = t1.lookup(&x); 29*387f9dfdSAndroid Build Coastguard Worker x = *y; 30*387f9dfdSAndroid Build Coastguard Worker return 0; 31*387f9dfdSAndroid Build Coastguard Worker } 32*387f9dfdSAndroid Build Coastguard Worker """ 33*387f9dfdSAndroid Build Coastguard Workerfor i in range(0,300): 34*387f9dfdSAndroid Build Coastguard Worker text += repeat 35*387f9dfdSAndroid Build Coastguard Workertext += end 36*387f9dfdSAndroid Build Coastguard Worker 37*387f9dfdSAndroid Build Coastguard Workerclass TestBPFProgLoad(TestCase): 38*387f9dfdSAndroid Build Coastguard Worker 39*387f9dfdSAndroid Build Coastguard Worker def setUp(self): 40*387f9dfdSAndroid Build Coastguard Worker self.fp = tempfile.TemporaryFile() 41*387f9dfdSAndroid Build Coastguard Worker os.dup2(self.fp.fileno(), sys.stderr.fileno()) 42*387f9dfdSAndroid Build Coastguard Worker 43*387f9dfdSAndroid Build Coastguard Worker def tearDown(self): 44*387f9dfdSAndroid Build Coastguard Worker self.fp.close() 45*387f9dfdSAndroid Build Coastguard Worker 46*387f9dfdSAndroid Build Coastguard Worker 47*387f9dfdSAndroid Build Coastguard Worker def test_log_debug(self): 48*387f9dfdSAndroid Build Coastguard Worker b = BPF(text=text, debug=2) 49*387f9dfdSAndroid Build Coastguard Worker try: 50*387f9dfdSAndroid Build Coastguard Worker ingress = b.load_func(b"sim_port",BPF.SCHED_CLS) 51*387f9dfdSAndroid Build Coastguard Worker except Exception: 52*387f9dfdSAndroid Build Coastguard Worker self.fp.flush() 53*387f9dfdSAndroid Build Coastguard Worker self.fp.seek(0) 54*387f9dfdSAndroid Build Coastguard Worker self.assertEqual(error_msg in self.fp.read().decode(), True) 55*387f9dfdSAndroid Build Coastguard Worker 56*387f9dfdSAndroid Build Coastguard Worker 57*387f9dfdSAndroid Build Coastguard Worker def test_log_no_debug(self): 58*387f9dfdSAndroid Build Coastguard Worker b = BPF(text=text, debug=0) 59*387f9dfdSAndroid Build Coastguard Worker try: 60*387f9dfdSAndroid Build Coastguard Worker ingress = b.load_func(b"sim_port",BPF.SCHED_CLS) 61*387f9dfdSAndroid Build Coastguard Worker except Exception: 62*387f9dfdSAndroid Build Coastguard Worker self.fp.flush() 63*387f9dfdSAndroid Build Coastguard Worker self.fp.seek(0) 64*387f9dfdSAndroid Build Coastguard Worker self.assertEqual(error_msg in self.fp.read().decode(), True) 65*387f9dfdSAndroid Build Coastguard Worker 66*387f9dfdSAndroid Build Coastguard Worker 67*387f9dfdSAndroid Build Coastguard Workerif __name__ == "__main__": 68*387f9dfdSAndroid Build Coastguard Worker main() 69*387f9dfdSAndroid Build Coastguard Worker 70*387f9dfdSAndroid Build Coastguard Worker 71