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 Workerimport os 6*387f9dfdSAndroid Build Coastguard Workerimport ctypes as ct 7*387f9dfdSAndroid Build Coastguard Worker 8*387f9dfdSAndroid Build Coastguard Workerfrom bcc import BPF 9*387f9dfdSAndroid Build Coastguard Worker 10*387f9dfdSAndroid Build Coastguard Workerfrom unittest import main, TestCase, skipUnless 11*387f9dfdSAndroid Build Coastguard Workerfrom utils import kernel_version_ge 12*387f9dfdSAndroid Build Coastguard Worker 13*387f9dfdSAndroid Build Coastguard Worker@skipUnless(kernel_version_ge(4,20), "requires kernel >= 4.20") 14*387f9dfdSAndroid Build Coastguard Workerclass TestQueueStack(TestCase): 15*387f9dfdSAndroid Build Coastguard Worker 16*387f9dfdSAndroid Build Coastguard Worker def test_stack(self): 17*387f9dfdSAndroid Build Coastguard Worker text = b""" 18*387f9dfdSAndroid Build Coastguard Worker BPF_STACK(stack, u64, 10); 19*387f9dfdSAndroid Build Coastguard Worker """ 20*387f9dfdSAndroid Build Coastguard Worker b = BPF(text=text) 21*387f9dfdSAndroid Build Coastguard Worker stack = b[b'stack'] 22*387f9dfdSAndroid Build Coastguard Worker 23*387f9dfdSAndroid Build Coastguard Worker for i in range(10): 24*387f9dfdSAndroid Build Coastguard Worker stack.push(ct.c_uint64(i)) 25*387f9dfdSAndroid Build Coastguard Worker 26*387f9dfdSAndroid Build Coastguard Worker with self.assertRaises(Exception): 27*387f9dfdSAndroid Build Coastguard Worker stack.push(ct.c_uint(10)) 28*387f9dfdSAndroid Build Coastguard Worker 29*387f9dfdSAndroid Build Coastguard Worker assert stack.peek().value == 9 30*387f9dfdSAndroid Build Coastguard Worker 31*387f9dfdSAndroid Build Coastguard Worker for i in reversed(range(10)): 32*387f9dfdSAndroid Build Coastguard Worker assert stack.pop().value == i 33*387f9dfdSAndroid Build Coastguard Worker 34*387f9dfdSAndroid Build Coastguard Worker with self.assertRaises(KeyError): 35*387f9dfdSAndroid Build Coastguard Worker stack.peek() 36*387f9dfdSAndroid Build Coastguard Worker 37*387f9dfdSAndroid Build Coastguard Worker with self.assertRaises(KeyError): 38*387f9dfdSAndroid Build Coastguard Worker stack.pop() 39*387f9dfdSAndroid Build Coastguard Worker 40*387f9dfdSAndroid Build Coastguard Worker for i in reversed(range(10)): 41*387f9dfdSAndroid Build Coastguard Worker stack.push(ct.c_uint64(i)) 42*387f9dfdSAndroid Build Coastguard Worker 43*387f9dfdSAndroid Build Coastguard Worker # testing itervalues() 44*387f9dfdSAndroid Build Coastguard Worker for i,v in enumerate(stack.values()): 45*387f9dfdSAndroid Build Coastguard Worker assert v.value == i 46*387f9dfdSAndroid Build Coastguard Worker 47*387f9dfdSAndroid Build Coastguard Worker b.cleanup() 48*387f9dfdSAndroid Build Coastguard Worker 49*387f9dfdSAndroid Build Coastguard Worker def test_queue(self): 50*387f9dfdSAndroid Build Coastguard Worker text = b""" 51*387f9dfdSAndroid Build Coastguard Worker BPF_QUEUE(queue, u64, 10); 52*387f9dfdSAndroid Build Coastguard Worker """ 53*387f9dfdSAndroid Build Coastguard Worker b = BPF(text=text) 54*387f9dfdSAndroid Build Coastguard Worker queue = b[b'queue'] 55*387f9dfdSAndroid Build Coastguard Worker 56*387f9dfdSAndroid Build Coastguard Worker for i in range(10): 57*387f9dfdSAndroid Build Coastguard Worker queue.push(ct.c_uint64(i)) 58*387f9dfdSAndroid Build Coastguard Worker 59*387f9dfdSAndroid Build Coastguard Worker with self.assertRaises(Exception): 60*387f9dfdSAndroid Build Coastguard Worker queue.push(ct.c_uint(10)) 61*387f9dfdSAndroid Build Coastguard Worker 62*387f9dfdSAndroid Build Coastguard Worker assert queue.peek().value == 0 63*387f9dfdSAndroid Build Coastguard Worker 64*387f9dfdSAndroid Build Coastguard Worker for i in range(10): 65*387f9dfdSAndroid Build Coastguard Worker assert queue.pop().value == i 66*387f9dfdSAndroid Build Coastguard Worker 67*387f9dfdSAndroid Build Coastguard Worker with self.assertRaises(KeyError): 68*387f9dfdSAndroid Build Coastguard Worker queue.peek() 69*387f9dfdSAndroid Build Coastguard Worker 70*387f9dfdSAndroid Build Coastguard Worker with self.assertRaises(KeyError): 71*387f9dfdSAndroid Build Coastguard Worker queue.pop() 72*387f9dfdSAndroid Build Coastguard Worker 73*387f9dfdSAndroid Build Coastguard Worker for i in range(10): 74*387f9dfdSAndroid Build Coastguard Worker queue.push(ct.c_uint64(i)) 75*387f9dfdSAndroid Build Coastguard Worker 76*387f9dfdSAndroid Build Coastguard Worker # testing itervalues() 77*387f9dfdSAndroid Build Coastguard Worker for i,v in enumerate(queue.values()): 78*387f9dfdSAndroid Build Coastguard Worker assert v.value == i 79*387f9dfdSAndroid Build Coastguard Worker 80*387f9dfdSAndroid Build Coastguard Worker b.cleanup() 81*387f9dfdSAndroid Build Coastguard Worker 82*387f9dfdSAndroid Build Coastguard Worker 83*387f9dfdSAndroid Build Coastguard Workerif __name__ == "__main__": 84*387f9dfdSAndroid Build Coastguard Worker main() 85