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 ctypes as ct 6*387f9dfdSAndroid Build Coastguard Workerimport os 7*387f9dfdSAndroid Build Coastguard Workerimport unittest 8*387f9dfdSAndroid Build Coastguard Workerfrom bcc import BPF 9*387f9dfdSAndroid Build Coastguard Workerimport multiprocessing 10*387f9dfdSAndroid Build Coastguard Worker 11*387f9dfdSAndroid Build Coastguard Workerclass TestLru(unittest.TestCase): 12*387f9dfdSAndroid Build Coastguard Worker def test_lru_hash(self): 13*387f9dfdSAndroid Build Coastguard Worker b = BPF(text=b"""BPF_TABLE("lru_hash", int, u64, lru, 1024);""") 14*387f9dfdSAndroid Build Coastguard Worker t = b[b"lru"] 15*387f9dfdSAndroid Build Coastguard Worker for i in range(1, 1032): 16*387f9dfdSAndroid Build Coastguard Worker t[ct.c_int(i)] = ct.c_ulonglong(i) 17*387f9dfdSAndroid Build Coastguard Worker for i, v in t.items(): 18*387f9dfdSAndroid Build Coastguard Worker self.assertEqual(v.value, i.value) 19*387f9dfdSAndroid Build Coastguard Worker # BPF_MAP_TYPE_LRU_HASH eviction happens in batch and we expect less 20*387f9dfdSAndroid Build Coastguard Worker # items than specified size. 21*387f9dfdSAndroid Build Coastguard Worker self.assertLess(len(t), 1024); 22*387f9dfdSAndroid Build Coastguard Worker 23*387f9dfdSAndroid Build Coastguard Worker def test_lru_percpu_hash(self): 24*387f9dfdSAndroid Build Coastguard Worker test_prog1 = b""" 25*387f9dfdSAndroid Build Coastguard Worker BPF_TABLE("lru_percpu_hash", u32, u32, stats, 1); 26*387f9dfdSAndroid Build Coastguard Worker int hello_world(void *ctx) { 27*387f9dfdSAndroid Build Coastguard Worker u32 key=0; 28*387f9dfdSAndroid Build Coastguard Worker u32 value = 0, *val; 29*387f9dfdSAndroid Build Coastguard Worker val = stats.lookup_or_try_init(&key, &value); 30*387f9dfdSAndroid Build Coastguard Worker if (val) { 31*387f9dfdSAndroid Build Coastguard Worker *val += 1; 32*387f9dfdSAndroid Build Coastguard Worker } 33*387f9dfdSAndroid Build Coastguard Worker return 0; 34*387f9dfdSAndroid Build Coastguard Worker } 35*387f9dfdSAndroid Build Coastguard Worker """ 36*387f9dfdSAndroid Build Coastguard Worker b = BPF(text=test_prog1) 37*387f9dfdSAndroid Build Coastguard Worker stats_map = b.get_table(b"stats") 38*387f9dfdSAndroid Build Coastguard Worker event_name = b.get_syscall_fnname(b"clone") 39*387f9dfdSAndroid Build Coastguard Worker b.attach_kprobe(event=event_name, fn_name=b"hello_world") 40*387f9dfdSAndroid Build Coastguard Worker ini = stats_map.Leaf() 41*387f9dfdSAndroid Build Coastguard Worker for i in range(0, multiprocessing.cpu_count()): 42*387f9dfdSAndroid Build Coastguard Worker ini[i] = 0 43*387f9dfdSAndroid Build Coastguard Worker # First initialize with key 1 44*387f9dfdSAndroid Build Coastguard Worker stats_map[ stats_map.Key(1) ] = ini 45*387f9dfdSAndroid Build Coastguard Worker # Then initialize with key 0 46*387f9dfdSAndroid Build Coastguard Worker stats_map[ stats_map.Key(0) ] = ini 47*387f9dfdSAndroid Build Coastguard Worker # Key 1 should have been evicted 48*387f9dfdSAndroid Build Coastguard Worker with self.assertRaises(KeyError): 49*387f9dfdSAndroid Build Coastguard Worker val = stats_map[ stats_map.Key(1) ] 50*387f9dfdSAndroid Build Coastguard Worker f = os.popen("hostname") 51*387f9dfdSAndroid Build Coastguard Worker f.close() 52*387f9dfdSAndroid Build Coastguard Worker self.assertEqual(len(stats_map),1) 53*387f9dfdSAndroid Build Coastguard Worker val = stats_map[ stats_map.Key(0) ] 54*387f9dfdSAndroid Build Coastguard Worker sum = stats_map.sum(stats_map.Key(0)) 55*387f9dfdSAndroid Build Coastguard Worker avg = stats_map.average(stats_map.Key(0)) 56*387f9dfdSAndroid Build Coastguard Worker max = stats_map.max(stats_map.Key(0)) 57*387f9dfdSAndroid Build Coastguard Worker self.assertGreater(sum.value, 0) 58*387f9dfdSAndroid Build Coastguard Worker self.assertGreater(max.value, 0) 59*387f9dfdSAndroid Build Coastguard Worker b.detach_kprobe(event_name) 60*387f9dfdSAndroid Build Coastguard Worker 61*387f9dfdSAndroid Build Coastguard Workerif __name__ == "__main__": 62*387f9dfdSAndroid Build Coastguard Worker unittest.main() 63