xref: /aosp_15_r20/external/selinux/python/sepolgen/tests/test_matching.py (revision 2d543d20722ada2425b5bdab9d0d1d29470e7bba)
1*2d543d20SAndroid Build Coastguard Worker# Authors: Karl MacMillan <[email protected]>
2*2d543d20SAndroid Build Coastguard Worker#
3*2d543d20SAndroid Build Coastguard Worker# Copyright (C) 2006 Red Hat
4*2d543d20SAndroid Build Coastguard Worker# see file 'COPYING' for use and warranty information
5*2d543d20SAndroid Build Coastguard Worker#
6*2d543d20SAndroid Build Coastguard Worker# This program is free software; you can redistribute it and/or
7*2d543d20SAndroid Build Coastguard Worker# modify it under the terms of the GNU General Public License as
8*2d543d20SAndroid Build Coastguard Worker# published by the Free Software Foundation; version 2 only
9*2d543d20SAndroid Build Coastguard Worker#
10*2d543d20SAndroid Build Coastguard Worker# This program is distributed in the hope that it will be useful,
11*2d543d20SAndroid Build Coastguard Worker# but WITHOUT ANY WARRANTY; without even the implied warranty of
12*2d543d20SAndroid Build Coastguard Worker# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13*2d543d20SAndroid Build Coastguard Worker# GNU General Public License for more details.
14*2d543d20SAndroid Build Coastguard Worker#
15*2d543d20SAndroid Build Coastguard Worker# You should have received a copy of the GNU General Public License
16*2d543d20SAndroid Build Coastguard Worker# along with this program; if not, write to the Free Software
17*2d543d20SAndroid Build Coastguard Worker# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
18*2d543d20SAndroid Build Coastguard Worker#
19*2d543d20SAndroid Build Coastguard Worker
20*2d543d20SAndroid Build Coastguard Workerimport unittest
21*2d543d20SAndroid Build Coastguard Workerimport sepolgen.matching as matching
22*2d543d20SAndroid Build Coastguard Workerimport sepolgen.refparser as refparser
23*2d543d20SAndroid Build Coastguard Workerimport sepolgen.interfaces as interfaces
24*2d543d20SAndroid Build Coastguard Workerimport sepolgen.access as access
25*2d543d20SAndroid Build Coastguard Worker
26*2d543d20SAndroid Build Coastguard Workerclass TestMatch(unittest.TestCase):
27*2d543d20SAndroid Build Coastguard Worker    def test(self):
28*2d543d20SAndroid Build Coastguard Worker        a = matching.Match()
29*2d543d20SAndroid Build Coastguard Worker        a.dist = 100
30*2d543d20SAndroid Build Coastguard Worker        a.info_dir_change = True
31*2d543d20SAndroid Build Coastguard Worker
32*2d543d20SAndroid Build Coastguard Worker        b = matching.Match()
33*2d543d20SAndroid Build Coastguard Worker        b.dist = 100
34*2d543d20SAndroid Build Coastguard Worker        b.info_dir_change = True
35*2d543d20SAndroid Build Coastguard Worker
36*2d543d20SAndroid Build Coastguard Worker        self.assertEqual(a, b)
37*2d543d20SAndroid Build Coastguard Worker        b.info_dir_change = False
38*2d543d20SAndroid Build Coastguard Worker        self.assertTrue((a > b))
39*2d543d20SAndroid Build Coastguard Worker        self.assertTrue((b < a))
40*2d543d20SAndroid Build Coastguard Worker
41*2d543d20SAndroid Build Coastguard Worker        b.dist = 200
42*2d543d20SAndroid Build Coastguard Worker
43*2d543d20SAndroid Build Coastguard Worker        self.assertTrue((a < b))
44*2d543d20SAndroid Build Coastguard Worker        self.assertTrue((b > a))
45*2d543d20SAndroid Build Coastguard Worker
46*2d543d20SAndroid Build Coastguard Workerclass TestMatchList(unittest.TestCase):
47*2d543d20SAndroid Build Coastguard Worker    def test_append(self):
48*2d543d20SAndroid Build Coastguard Worker        ml = matching.MatchList()
49*2d543d20SAndroid Build Coastguard Worker        ml.threshold = 100
50*2d543d20SAndroid Build Coastguard Worker
51*2d543d20SAndroid Build Coastguard Worker        a = matching.Match()
52*2d543d20SAndroid Build Coastguard Worker        a.dist = 100
53*2d543d20SAndroid Build Coastguard Worker        ml.append(a)
54*2d543d20SAndroid Build Coastguard Worker        self.assertEqual(len(ml), 1)
55*2d543d20SAndroid Build Coastguard Worker
56*2d543d20SAndroid Build Coastguard Worker        a = matching.Match()
57*2d543d20SAndroid Build Coastguard Worker        a.dist = 200
58*2d543d20SAndroid Build Coastguard Worker        ml.append(a)
59*2d543d20SAndroid Build Coastguard Worker        self.assertEqual(len(ml), 2)
60*2d543d20SAndroid Build Coastguard Worker        self.assertEqual(len(ml.bastards), 1)
61*2d543d20SAndroid Build Coastguard Worker
62*2d543d20SAndroid Build Coastguard Worker        ml.allow_info_dir_change = False
63*2d543d20SAndroid Build Coastguard Worker        a = matching.Match()
64*2d543d20SAndroid Build Coastguard Worker        a.dist = 0
65*2d543d20SAndroid Build Coastguard Worker        a.info_dir_change = True
66*2d543d20SAndroid Build Coastguard Worker        ml.append(a)
67*2d543d20SAndroid Build Coastguard Worker        self.assertEqual(len(ml), 3)
68*2d543d20SAndroid Build Coastguard Worker        self.assertEqual(len(ml.bastards), 2)
69*2d543d20SAndroid Build Coastguard Worker
70*2d543d20SAndroid Build Coastguard Worker    def test_sort(self):
71*2d543d20SAndroid Build Coastguard Worker        ml = matching.MatchList()
72*2d543d20SAndroid Build Coastguard Worker        ml.threshold = 100
73*2d543d20SAndroid Build Coastguard Worker
74*2d543d20SAndroid Build Coastguard Worker        a = matching.Match()
75*2d543d20SAndroid Build Coastguard Worker        a.dist = 100
76*2d543d20SAndroid Build Coastguard Worker        ml.append(a)
77*2d543d20SAndroid Build Coastguard Worker
78*2d543d20SAndroid Build Coastguard Worker        b = matching.Match()
79*2d543d20SAndroid Build Coastguard Worker        b.dist = 5
80*2d543d20SAndroid Build Coastguard Worker        ml.append(b)
81*2d543d20SAndroid Build Coastguard Worker
82*2d543d20SAndroid Build Coastguard Worker        c = matching.Match()
83*2d543d20SAndroid Build Coastguard Worker        c.dist = 0
84*2d543d20SAndroid Build Coastguard Worker        ml.append(c)
85*2d543d20SAndroid Build Coastguard Worker
86*2d543d20SAndroid Build Coastguard Worker        l = [c, b, a]
87*2d543d20SAndroid Build Coastguard Worker
88*2d543d20SAndroid Build Coastguard Worker        ml.sort()
89*2d543d20SAndroid Build Coastguard Worker
90*2d543d20SAndroid Build Coastguard Worker        for x, y in zip(l, ml):
91*2d543d20SAndroid Build Coastguard Worker            self.assertEqual(x, y)
92*2d543d20SAndroid Build Coastguard Worker
93*2d543d20SAndroid Build Coastguard Worker        self.assertEqual(ml.best(), c)
94*2d543d20SAndroid Build Coastguard Worker
95*2d543d20SAndroid Build Coastguard Worker
96*2d543d20SAndroid Build Coastguard Workertest_expansion = """
97*2d543d20SAndroid Build Coastguard Workerinterface(`foo',`
98*2d543d20SAndroid Build Coastguard Worker   gen_require(`
99*2d543d20SAndroid Build Coastguard Worker       type usr_t;
100*2d543d20SAndroid Build Coastguard Worker   ')
101*2d543d20SAndroid Build Coastguard Worker   allow $1 usr_t:dir { create add_name };
102*2d543d20SAndroid Build Coastguard Worker   allow $1 usr_t:file { read write };
103*2d543d20SAndroid Build Coastguard Worker')
104*2d543d20SAndroid Build Coastguard Worker
105*2d543d20SAndroid Build Coastguard Workerinterface(`map', `
106*2d543d20SAndroid Build Coastguard Worker   gen_require(`
107*2d543d20SAndroid Build Coastguard Worker       type bar_t;
108*2d543d20SAndroid Build Coastguard Worker   ')
109*2d543d20SAndroid Build Coastguard Worker   allow $1 bar_t:file read;
110*2d543d20SAndroid Build Coastguard Worker   allow $2 bar_t:file write;
111*2d543d20SAndroid Build Coastguard Worker
112*2d543d20SAndroid Build Coastguard Worker   foo($2)
113*2d543d20SAndroid Build Coastguard Worker')
114*2d543d20SAndroid Build Coastguard Worker
115*2d543d20SAndroid Build Coastguard Workerinterface(`hard_map', `
116*2d543d20SAndroid Build Coastguard Worker   gen_require(`
117*2d543d20SAndroid Build Coastguard Worker      type baz_t;
118*2d543d20SAndroid Build Coastguard Worker   ')
119*2d543d20SAndroid Build Coastguard Worker   allow $1 baz_t:file getattr;
120*2d543d20SAndroid Build Coastguard Worker   allow $2 baz_t:file read;
121*2d543d20SAndroid Build Coastguard Worker   allow $3 baz_t:file write;
122*2d543d20SAndroid Build Coastguard Worker
123*2d543d20SAndroid Build Coastguard Worker   map($1, $2)
124*2d543d20SAndroid Build Coastguard Worker   map($2, $3)
125*2d543d20SAndroid Build Coastguard Worker
126*2d543d20SAndroid Build Coastguard Worker   # This should have no effect
127*2d543d20SAndroid Build Coastguard Worker   foo($2)
128*2d543d20SAndroid Build Coastguard Worker')
129*2d543d20SAndroid Build Coastguard Worker"""
130*2d543d20SAndroid Build Coastguard Worker
131*2d543d20SAndroid Build Coastguard Workerclass AccessMatcher(unittest.TestCase):
132*2d543d20SAndroid Build Coastguard Worker    def test_search(self):
133*2d543d20SAndroid Build Coastguard Worker        h = refparser.parse(test_expansion)
134*2d543d20SAndroid Build Coastguard Worker        i = interfaces.InterfaceSet()
135*2d543d20SAndroid Build Coastguard Worker        i.add_headers(h)
136*2d543d20SAndroid Build Coastguard Worker
137*2d543d20SAndroid Build Coastguard Worker        a = access.AccessVector(["foo_t", "usr_t", "dir", "create"])
138*2d543d20SAndroid Build Coastguard Worker        m = matching.AccessMatcher()
139*2d543d20SAndroid Build Coastguard Worker        ml = matching.MatchList()
140*2d543d20SAndroid Build Coastguard Worker
141*2d543d20SAndroid Build Coastguard Worker        ans = m.search_ifs(i, a, ml)
142*2d543d20SAndroid Build Coastguard Worker
143*2d543d20SAndroid Build Coastguard Worker
144*2d543d20SAndroid Build Coastguard Worker        pass
145