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