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