xref: /aosp_15_r20/bionic/libc/tools/test_genseccomp.py (revision 8d67ca893c1523eb926b9080dbe4e2ffd2a27ba1)
1*8d67ca89SAndroid Build Coastguard Worker#!/usr/bin/env python3
2*8d67ca89SAndroid Build Coastguard Worker# Unit tests for genseccomp.py
3*8d67ca89SAndroid Build Coastguard Worker
4*8d67ca89SAndroid Build Coastguard Workerimport textwrap
5*8d67ca89SAndroid Build Coastguard Workerimport unittest
6*8d67ca89SAndroid Build Coastguard Worker
7*8d67ca89SAndroid Build Coastguard Workerimport genseccomp
8*8d67ca89SAndroid Build Coastguard Worker
9*8d67ca89SAndroid Build Coastguard Workerclass TestGenseccomp(unittest.TestCase):
10*8d67ca89SAndroid Build Coastguard Worker  def test_convert_NRs_to_ranges(self):
11*8d67ca89SAndroid Build Coastguard Worker    ranges = genseccomp.convert_NRs_to_ranges([("b", 2), ("a", 1)])
12*8d67ca89SAndroid Build Coastguard Worker    self.assertEqual(len(ranges), 1)
13*8d67ca89SAndroid Build Coastguard Worker    self.assertEqual(ranges[0].begin, 1)
14*8d67ca89SAndroid Build Coastguard Worker    self.assertEqual(ranges[0].end, 3)
15*8d67ca89SAndroid Build Coastguard Worker    self.assertEqual(set(ranges[0].names), {"a", "b"})
16*8d67ca89SAndroid Build Coastguard Worker
17*8d67ca89SAndroid Build Coastguard Worker    ranges = genseccomp.convert_NRs_to_ranges([("b", 3), ("a", 1)])
18*8d67ca89SAndroid Build Coastguard Worker    self.assertEqual(len(ranges), 2)
19*8d67ca89SAndroid Build Coastguard Worker    self.assertEqual(ranges[0].begin, 1)
20*8d67ca89SAndroid Build Coastguard Worker    self.assertEqual(ranges[0].end, 2)
21*8d67ca89SAndroid Build Coastguard Worker    self.assertEqual(set(ranges[0].names), {"a"})
22*8d67ca89SAndroid Build Coastguard Worker    self.assertEqual(ranges[1].begin, 3)
23*8d67ca89SAndroid Build Coastguard Worker    self.assertEqual(ranges[1].end, 4)
24*8d67ca89SAndroid Build Coastguard Worker    self.assertEqual(set(ranges[1].names), {"b"})
25*8d67ca89SAndroid Build Coastguard Worker
26*8d67ca89SAndroid Build Coastguard Worker  def test_convert_to_intermediate_bpf(self):
27*8d67ca89SAndroid Build Coastguard Worker    ranges = genseccomp.convert_NRs_to_ranges([("b", 2), ("a", 1)])
28*8d67ca89SAndroid Build Coastguard Worker    bpf = genseccomp.convert_to_intermediate_bpf(ranges)
29*8d67ca89SAndroid Build Coastguard Worker    self.assertEqual(bpf, ['BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 3, {fail}, {allow}), //a|b'])
30*8d67ca89SAndroid Build Coastguard Worker
31*8d67ca89SAndroid Build Coastguard Worker    ranges = genseccomp.convert_NRs_to_ranges([("b", 3), ("a", 1)])
32*8d67ca89SAndroid Build Coastguard Worker    bpf = genseccomp.convert_to_intermediate_bpf(ranges)
33*8d67ca89SAndroid Build Coastguard Worker    self.assertEqual(bpf, ['BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 3, 1, 0),',
34*8d67ca89SAndroid Build Coastguard Worker                            'BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 2, {fail}, {allow}), //a',
35*8d67ca89SAndroid Build Coastguard Worker                            'BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4, {fail}, {allow}), //b'])
36*8d67ca89SAndroid Build Coastguard Worker
37*8d67ca89SAndroid Build Coastguard Worker  def test_convert_ranges_to_bpf(self):
38*8d67ca89SAndroid Build Coastguard Worker    ranges = genseccomp.convert_NRs_to_ranges([("b", 2), ("a", 1)])
39*8d67ca89SAndroid Build Coastguard Worker    bpf = genseccomp.convert_ranges_to_bpf(ranges, priority_syscalls=[])
40*8d67ca89SAndroid Build Coastguard Worker    self.assertEqual(bpf, ['BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 1, 0, 2),',
41*8d67ca89SAndroid Build Coastguard Worker                            'BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 3, 1, 0), //a|b',
42*8d67ca89SAndroid Build Coastguard Worker                            'BPF_STMT(BPF_RET|BPF_K, SECCOMP_RET_ALLOW),'])
43*8d67ca89SAndroid Build Coastguard Worker
44*8d67ca89SAndroid Build Coastguard Worker    ranges = genseccomp.convert_NRs_to_ranges([("b", 3), ("a", 1)])
45*8d67ca89SAndroid Build Coastguard Worker    bpf = genseccomp.convert_ranges_to_bpf(ranges, priority_syscalls=[])
46*8d67ca89SAndroid Build Coastguard Worker    self.assertEqual(bpf, ['BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 1, 0, 4),',
47*8d67ca89SAndroid Build Coastguard Worker                            'BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 3, 1, 0),',
48*8d67ca89SAndroid Build Coastguard Worker                            'BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 2, 2, 1), //a',
49*8d67ca89SAndroid Build Coastguard Worker                            'BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4, 1, 0), //b',
50*8d67ca89SAndroid Build Coastguard Worker                            'BPF_STMT(BPF_RET|BPF_K, SECCOMP_RET_ALLOW),'])
51*8d67ca89SAndroid Build Coastguard Worker
52*8d67ca89SAndroid Build Coastguard Worker  def test_convert_bpf_to_output(self):
53*8d67ca89SAndroid Build Coastguard Worker    output = genseccomp.convert_bpf_to_output(["line1", "line2"],
54*8d67ca89SAndroid Build Coastguard Worker                                              "arm",
55*8d67ca89SAndroid Build Coastguard Worker                                              name_modifier="")
56*8d67ca89SAndroid Build Coastguard Worker    expected_output = textwrap.dedent("""\
57*8d67ca89SAndroid Build Coastguard Worker    // File autogenerated by genseccomp.py - edit at your peril!!
58*8d67ca89SAndroid Build Coastguard Worker
59*8d67ca89SAndroid Build Coastguard Worker    #include <linux/filter.h>
60*8d67ca89SAndroid Build Coastguard Worker    #include <errno.h>
61*8d67ca89SAndroid Build Coastguard Worker
62*8d67ca89SAndroid Build Coastguard Worker    #include "seccomp/seccomp_bpfs.h"
63*8d67ca89SAndroid Build Coastguard Worker    const sock_filter arm_filter[] = {
64*8d67ca89SAndroid Build Coastguard Worker    line1
65*8d67ca89SAndroid Build Coastguard Worker    line2
66*8d67ca89SAndroid Build Coastguard Worker    };
67*8d67ca89SAndroid Build Coastguard Worker
68*8d67ca89SAndroid Build Coastguard Worker    const size_t arm_filter_size = sizeof(arm_filter) / sizeof(struct sock_filter);
69*8d67ca89SAndroid Build Coastguard Worker    """)
70*8d67ca89SAndroid Build Coastguard Worker    self.assertEqual(output, expected_output)
71*8d67ca89SAndroid Build Coastguard Worker
72*8d67ca89SAndroid Build Coastguard Worker
73*8d67ca89SAndroid Build Coastguard Workerif __name__ == '__main__':
74*8d67ca89SAndroid Build Coastguard Worker  unittest.main()
75