blob: a7c82a4f6d706f0f854bef9fbf5df15ec9f95154 [file] [log] [blame]
Brenden Blanco14915e02015-10-06 12:05:25 -07001#!/usr/bin/env python
2# Copyright (c) PLUMgrid, Inc.
3# Licensed under the Apache License, Version 2.0 (the "License")
4
5from bcc import BPF
Brenden Blanco0dd24412016-02-17 00:26:14 -08006import ctypes as ct
Brenden Blanco14915e02015-10-06 12:05:25 -07007import random
8import time
Andreas Gerstmayr7e0784d2017-01-16 16:35:58 +01009import subprocess
10from bcc.utils import get_online_cpus
Brenden Blanco14915e02015-10-06 12:05:25 -070011from unittest import main, TestCase
12
13class TestArray(TestCase):
14 def test_simple(self):
15 b = BPF(text="""BPF_TABLE("array", int, u64, table1, 128);""")
16 t1 = b["table1"]
Brenden Blanco0dd24412016-02-17 00:26:14 -080017 t1[ct.c_int(0)] = ct.c_ulonglong(100)
18 t1[ct.c_int(127)] = ct.c_ulonglong(1000)
Brenden Blanco14915e02015-10-06 12:05:25 -070019 for i, v in t1.items():
20 if i.value == 0:
21 self.assertEqual(v.value, 100)
22 if i.value == 127:
23 self.assertEqual(v.value, 1000)
24 self.assertEqual(len(t1), 128)
25
Brenden Blancof7767b52016-02-16 17:36:26 +010026 def test_native_type(self):
27 b = BPF(text="""BPF_TABLE("array", int, u64, table1, 128);""")
28 t1 = b["table1"]
Brenden Blanco0dd24412016-02-17 00:26:14 -080029 t1[0] = ct.c_ulonglong(100)
30 t1[-2] = ct.c_ulonglong(37)
31 t1[127] = ct.c_ulonglong(1000)
Brenden Blancof7767b52016-02-16 17:36:26 +010032 for i, v in t1.items():
33 if i.value == 0:
34 self.assertEqual(v.value, 100)
35 if i.value == 127:
36 self.assertEqual(v.value, 1000)
37 self.assertEqual(len(t1), 128)
38 self.assertEqual(t1[-2].value, 37)
39 self.assertEqual(t1[-1].value, t1[127].value)
40
Brenden Blanco0dd24412016-02-17 00:26:14 -080041 def test_perf_buffer(self):
42 self.counter = 0
43
44 class Data(ct.Structure):
45 _fields_ = [("ts", ct.c_ulonglong)]
46
47 def cb(cpu, data, size):
48 self.assertGreater(size, ct.sizeof(Data))
49 event = ct.cast(data, ct.POINTER(Data)).contents
50 self.counter += 1
51
52 text = """
53BPF_PERF_OUTPUT(events);
54int kprobe__sys_nanosleep(void *ctx) {
55 struct {
56 u64 ts;
57 } data = {bpf_ktime_get_ns()};
58 events.perf_submit(ctx, &data, sizeof(data));
59 return 0;
60}
61"""
62 b = BPF(text=text)
63 b["events"].open_perf_buffer(cb)
64 time.sleep(0.1)
65 b.kprobe_poll()
66 self.assertGreater(self.counter, 0)
Andreas Gerstmayr7e0784d2017-01-16 16:35:58 +010067 b.cleanup()
68
69 def test_perf_buffer_for_each_cpu(self):
70 self.events = []
71
72 class Data(ct.Structure):
73 _fields_ = [("cpu", ct.c_ulonglong)]
74
75 def cb(cpu, data, size):
76 self.assertGreater(size, ct.sizeof(Data))
77 event = ct.cast(data, ct.POINTER(Data)).contents
78 self.events.append(event)
79
80 text = """
81BPF_PERF_OUTPUT(events);
82int kprobe__sys_nanosleep(void *ctx) {
83 struct {
84 u64 cpu;
85 } data = {bpf_get_smp_processor_id()};
86 events.perf_submit(ctx, &data, sizeof(data));
87 return 0;
88}
89"""
90 b = BPF(text=text)
91 b["events"].open_perf_buffer(cb)
92 online_cpus = get_online_cpus()
93 for cpu in online_cpus:
94 subprocess.call(['taskset', '-c', str(cpu), 'sleep', '0.1'])
95 b.kprobe_poll()
96 b.cleanup()
97 self.assertGreaterEqual(len(self.events), len(online_cpus), 'Received only {}/{} events'.format(len(self.events), len(online_cpus)))
Brenden Blanco0dd24412016-02-17 00:26:14 -080098
Brenden Blanco14915e02015-10-06 12:05:25 -070099if __name__ == "__main__":
100 main()