xref: /aosp_15_r20/external/bcc/tests/python/test_queuestack.py (revision 387f9dfdfa2baef462e92476d413c7bc2470293e)
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