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.refpolicy as refpolicy 22*2d543d20SAndroid Build Coastguard Workerimport sepolgen.refparser as refparser 23*2d543d20SAndroid Build Coastguard Workerimport sepolgen.policygen as policygen 24*2d543d20SAndroid Build Coastguard Workerimport sepolgen.access as access 25*2d543d20SAndroid Build Coastguard Worker 26*2d543d20SAndroid Build Coastguard Workerclass TestAccessVector(unittest.TestCase): 27*2d543d20SAndroid Build Coastguard Worker def test_init(self): 28*2d543d20SAndroid Build Coastguard Worker # Default construction 29*2d543d20SAndroid Build Coastguard Worker a = access.AccessVector() 30*2d543d20SAndroid Build Coastguard Worker self.assertEqual(a.src_type, None) 31*2d543d20SAndroid Build Coastguard Worker self.assertEqual(a.tgt_type, None) 32*2d543d20SAndroid Build Coastguard Worker self.assertEqual(a.obj_class, None) 33*2d543d20SAndroid Build Coastguard Worker self.assertTrue(isinstance(a.perms, refpolicy.IdSet)) 34*2d543d20SAndroid Build Coastguard Worker self.assertTrue(isinstance(a.audit_msgs, type([]))) 35*2d543d20SAndroid Build Coastguard Worker self.assertTrue(isinstance(a.xperms, type({}))) 36*2d543d20SAndroid Build Coastguard Worker self.assertEqual(len(a.audit_msgs), 0) 37*2d543d20SAndroid Build Coastguard Worker 38*2d543d20SAndroid Build Coastguard Worker # Construction from a list 39*2d543d20SAndroid Build Coastguard Worker a = access.AccessVector() 40*2d543d20SAndroid Build Coastguard Worker a.src_type = "foo" 41*2d543d20SAndroid Build Coastguard Worker a.tgt_type = "bar" 42*2d543d20SAndroid Build Coastguard Worker a.obj_class = "file" 43*2d543d20SAndroid Build Coastguard Worker a.perms.update(["read", "write"]) 44*2d543d20SAndroid Build Coastguard Worker 45*2d543d20SAndroid Build Coastguard Worker l = access.AccessVector(['foo', 'bar', 'file', 'read', 'write']) 46*2d543d20SAndroid Build Coastguard Worker self.assertEqual(a.src_type, l.src_type) 47*2d543d20SAndroid Build Coastguard Worker self.assertEqual(a.tgt_type, l.tgt_type) 48*2d543d20SAndroid Build Coastguard Worker self.assertEqual(a.obj_class, l.obj_class) 49*2d543d20SAndroid Build Coastguard Worker self.assertEqual(a.perms, l.perms) 50*2d543d20SAndroid Build Coastguard Worker 51*2d543d20SAndroid Build Coastguard Worker def test_from_list(self): 52*2d543d20SAndroid Build Coastguard Worker a = access.AccessVector() 53*2d543d20SAndroid Build Coastguard Worker a.src_type = "foo" 54*2d543d20SAndroid Build Coastguard Worker a.tgt_type = "bar" 55*2d543d20SAndroid Build Coastguard Worker a.obj_class = "file" 56*2d543d20SAndroid Build Coastguard Worker a.perms.update(["read", "write"]) 57*2d543d20SAndroid Build Coastguard Worker 58*2d543d20SAndroid Build Coastguard Worker l = access.AccessVector() 59*2d543d20SAndroid Build Coastguard Worker l.from_list(['foo', 'bar', 'file', 'read', 'write']) 60*2d543d20SAndroid Build Coastguard Worker self.assertEqual(a.src_type, l.src_type) 61*2d543d20SAndroid Build Coastguard Worker self.assertEqual(a.tgt_type, l.tgt_type) 62*2d543d20SAndroid Build Coastguard Worker self.assertEqual(a.obj_class, l.obj_class) 63*2d543d20SAndroid Build Coastguard Worker self.assertEqual(a.perms, l.perms) 64*2d543d20SAndroid Build Coastguard Worker 65*2d543d20SAndroid Build Coastguard Worker l2 = access.AccessVector() 66*2d543d20SAndroid Build Coastguard Worker with self.assertRaises(ValueError): 67*2d543d20SAndroid Build Coastguard Worker l2.from_list(['foo', 'bar', 'file']) 68*2d543d20SAndroid Build Coastguard Worker 69*2d543d20SAndroid Build Coastguard Worker def test_to_list(self): 70*2d543d20SAndroid Build Coastguard Worker a = access.AccessVector() 71*2d543d20SAndroid Build Coastguard Worker a.src_type = "foo" 72*2d543d20SAndroid Build Coastguard Worker a.tgt_type = "bar" 73*2d543d20SAndroid Build Coastguard Worker a.obj_class = "file" 74*2d543d20SAndroid Build Coastguard Worker a.perms.update(["read", "write"]) 75*2d543d20SAndroid Build Coastguard Worker 76*2d543d20SAndroid Build Coastguard Worker l = a.to_list() 77*2d543d20SAndroid Build Coastguard Worker self.assertEqual(l[0], "foo") 78*2d543d20SAndroid Build Coastguard Worker self.assertEqual(l[1], "bar") 79*2d543d20SAndroid Build Coastguard Worker self.assertEqual(l[2], "file") 80*2d543d20SAndroid Build Coastguard Worker perms = l[3:] 81*2d543d20SAndroid Build Coastguard Worker perms.sort() 82*2d543d20SAndroid Build Coastguard Worker self.assertEqual(perms[0], "read") 83*2d543d20SAndroid Build Coastguard Worker self.assertEqual(perms[1], "write") 84*2d543d20SAndroid Build Coastguard Worker 85*2d543d20SAndroid Build Coastguard Worker def test_to_string(self): 86*2d543d20SAndroid Build Coastguard Worker a = access.AccessVector() 87*2d543d20SAndroid Build Coastguard Worker a.src_type = "foo" 88*2d543d20SAndroid Build Coastguard Worker a.tgt_type = "bar" 89*2d543d20SAndroid Build Coastguard Worker a.obj_class = "file" 90*2d543d20SAndroid Build Coastguard Worker a.perms.update(["read", "write"]) 91*2d543d20SAndroid Build Coastguard Worker 92*2d543d20SAndroid Build Coastguard Worker first, second = str(a).split(':') 93*2d543d20SAndroid Build Coastguard Worker self.assertEqual(first, "allow foo bar") 94*2d543d20SAndroid Build Coastguard Worker second = second.split(' ') 95*2d543d20SAndroid Build Coastguard Worker second.sort() 96*2d543d20SAndroid Build Coastguard Worker expected = "file { read write };".split(' ') 97*2d543d20SAndroid Build Coastguard Worker expected.sort() 98*2d543d20SAndroid Build Coastguard Worker self.assertEqual(second, expected) 99*2d543d20SAndroid Build Coastguard Worker 100*2d543d20SAndroid Build Coastguard Worker first, second = a.to_string().split(':') 101*2d543d20SAndroid Build Coastguard Worker self.assertEqual(first, "allow foo bar") 102*2d543d20SAndroid Build Coastguard Worker second = second.split(' ') 103*2d543d20SAndroid Build Coastguard Worker second.sort() 104*2d543d20SAndroid Build Coastguard Worker expected = "file { read write };".split(' ') 105*2d543d20SAndroid Build Coastguard Worker expected.sort() 106*2d543d20SAndroid Build Coastguard Worker self.assertEqual(second, expected) 107*2d543d20SAndroid Build Coastguard Worker 108*2d543d20SAndroid Build Coastguard Worker def test_cmp(self): 109*2d543d20SAndroid Build Coastguard Worker a = access.AccessVector() 110*2d543d20SAndroid Build Coastguard Worker a.src_type = "foo" 111*2d543d20SAndroid Build Coastguard Worker a.tgt_type = "bar" 112*2d543d20SAndroid Build Coastguard Worker a.obj_class = "file" 113*2d543d20SAndroid Build Coastguard Worker a.perms.update(["read", "write"]) 114*2d543d20SAndroid Build Coastguard Worker 115*2d543d20SAndroid Build Coastguard Worker b = access.AccessVector() 116*2d543d20SAndroid Build Coastguard Worker b.src_type = "foo" 117*2d543d20SAndroid Build Coastguard Worker b.tgt_type = "bar" 118*2d543d20SAndroid Build Coastguard Worker b.obj_class = "file" 119*2d543d20SAndroid Build Coastguard Worker b.perms.update(["read", "write"]) 120*2d543d20SAndroid Build Coastguard Worker 121*2d543d20SAndroid Build Coastguard Worker self.assertEqual(a, b) 122*2d543d20SAndroid Build Coastguard Worker 123*2d543d20SAndroid Build Coastguard Worker # Source Type 124*2d543d20SAndroid Build Coastguard Worker b.src_type = "baz" 125*2d543d20SAndroid Build Coastguard Worker self.assertNotEqual(a, b) 126*2d543d20SAndroid Build Coastguard Worker self.assertTrue(a > b) 127*2d543d20SAndroid Build Coastguard Worker 128*2d543d20SAndroid Build Coastguard Worker b.src_type = "gaz" 129*2d543d20SAndroid Build Coastguard Worker self.assertNotEqual(a, b) 130*2d543d20SAndroid Build Coastguard Worker self.assertTrue(a < b) 131*2d543d20SAndroid Build Coastguard Worker 132*2d543d20SAndroid Build Coastguard Worker # Target Type 133*2d543d20SAndroid Build Coastguard Worker b.src_type = "foo" 134*2d543d20SAndroid Build Coastguard Worker b.tgt_type = "aar" 135*2d543d20SAndroid Build Coastguard Worker self.assertNotEqual(a, b) 136*2d543d20SAndroid Build Coastguard Worker self.assertTrue(a > b) 137*2d543d20SAndroid Build Coastguard Worker 138*2d543d20SAndroid Build Coastguard Worker b.tgt_type = "gaz" 139*2d543d20SAndroid Build Coastguard Worker self.assertNotEqual(a, b) 140*2d543d20SAndroid Build Coastguard Worker self.assertTrue(a < b) 141*2d543d20SAndroid Build Coastguard Worker 142*2d543d20SAndroid Build Coastguard Worker # Perms 143*2d543d20SAndroid Build Coastguard Worker b.tgt_type = "bar" 144*2d543d20SAndroid Build Coastguard Worker b.perms = refpolicy.IdSet(["read"]) 145*2d543d20SAndroid Build Coastguard Worker self.assertNotEqual(a, b) 146*2d543d20SAndroid Build Coastguard Worker self.assertTrue(a > b) 147*2d543d20SAndroid Build Coastguard Worker 148*2d543d20SAndroid Build Coastguard Worker b.perms = refpolicy.IdSet(["read", "write", "append"]) 149*2d543d20SAndroid Build Coastguard Worker self.assertNotEqual(a, b) 150*2d543d20SAndroid Build Coastguard Worker 151*2d543d20SAndroid Build Coastguard Worker b.perms = refpolicy.IdSet(["read", "append"]) 152*2d543d20SAndroid Build Coastguard Worker self.assertNotEqual(a, b) 153*2d543d20SAndroid Build Coastguard Worker 154*2d543d20SAndroid Build Coastguard Worker def test_merge_noxperm(self): 155*2d543d20SAndroid Build Coastguard Worker """Test merging two AVs without xperms""" 156*2d543d20SAndroid Build Coastguard Worker a = access.AccessVector(["foo", "bar", "file", "read", "write"]) 157*2d543d20SAndroid Build Coastguard Worker b = access.AccessVector(["foo", "bar", "file", "append"]) 158*2d543d20SAndroid Build Coastguard Worker 159*2d543d20SAndroid Build Coastguard Worker a.merge(b) 160*2d543d20SAndroid Build Coastguard Worker self.assertEqual(sorted(list(a.perms)), ["append", "read", "write"]) 161*2d543d20SAndroid Build Coastguard Worker 162*2d543d20SAndroid Build Coastguard Worker def text_merge_xperm1(self): 163*2d543d20SAndroid Build Coastguard Worker """Test merging AV that contains xperms with AV that does not""" 164*2d543d20SAndroid Build Coastguard Worker a = access.AccessVector(["foo", "bar", "file", "read"]) 165*2d543d20SAndroid Build Coastguard Worker b = access.AccessVector(["foo", "bar", "file", "read"]) 166*2d543d20SAndroid Build Coastguard Worker xp = refpolicy.XpermSet() 167*2d543d20SAndroid Build Coastguard Worker xp.add(42) 168*2d543d20SAndroid Build Coastguard Worker xp.add(12345) 169*2d543d20SAndroid Build Coastguard Worker b.xperms = {"ioctl": xp} 170*2d543d20SAndroid Build Coastguard Worker 171*2d543d20SAndroid Build Coastguard Worker a.merge(b) 172*2d543d20SAndroid Build Coastguard Worker self.assertEqual(sorted(list(a.perms)), ["append", "read", "write"]) 173*2d543d20SAndroid Build Coastguard Worker self.assertEqual(list(a.xperms.keys()), ["ioctl"]) 174*2d543d20SAndroid Build Coastguard Worker self.assertEqual(a.xperms["ioctl"].to_string(), "{ 0x2a 0x3039 }") 175*2d543d20SAndroid Build Coastguard Worker 176*2d543d20SAndroid Build Coastguard Worker def text_merge_xperm2(self): 177*2d543d20SAndroid Build Coastguard Worker """Test merging AV that does not contain xperms with AV that does""" 178*2d543d20SAndroid Build Coastguard Worker a = access.AccessVector(["foo", "bar", "file", "read"]) 179*2d543d20SAndroid Build Coastguard Worker xp = refpolicy.XpermSet() 180*2d543d20SAndroid Build Coastguard Worker xp.add(42) 181*2d543d20SAndroid Build Coastguard Worker xp.add(12345) 182*2d543d20SAndroid Build Coastguard Worker a.xperms = {"ioctl": xp} 183*2d543d20SAndroid Build Coastguard Worker b = access.AccessVector(["foo", "bar", "file", "read"]) 184*2d543d20SAndroid Build Coastguard Worker 185*2d543d20SAndroid Build Coastguard Worker a.merge(b) 186*2d543d20SAndroid Build Coastguard Worker self.assertEqual(sorted(list(a.perms)), ["append", "read", "write"]) 187*2d543d20SAndroid Build Coastguard Worker self.assertEqual(list(a.xperms.keys()), ["ioctl"]) 188*2d543d20SAndroid Build Coastguard Worker self.assertEqual(a.xperms["ioctl"].to_string(), "{ 0x2a 0x3039 }") 189*2d543d20SAndroid Build Coastguard Worker 190*2d543d20SAndroid Build Coastguard Worker def test_merge_xperm_diff_op(self): 191*2d543d20SAndroid Build Coastguard Worker """Test merging two AVs that contain xperms with different operation""" 192*2d543d20SAndroid Build Coastguard Worker a = access.AccessVector(["foo", "bar", "file", "read"]) 193*2d543d20SAndroid Build Coastguard Worker xp1 = refpolicy.XpermSet() 194*2d543d20SAndroid Build Coastguard Worker xp1.add(23) 195*2d543d20SAndroid Build Coastguard Worker a.xperms = {"asdf": xp1} 196*2d543d20SAndroid Build Coastguard Worker 197*2d543d20SAndroid Build Coastguard Worker b = access.AccessVector(["foo", "bar", "file", "read"]) 198*2d543d20SAndroid Build Coastguard Worker xp2 = refpolicy.XpermSet() 199*2d543d20SAndroid Build Coastguard Worker xp2.add(42) 200*2d543d20SAndroid Build Coastguard Worker xp2.add(12345) 201*2d543d20SAndroid Build Coastguard Worker b.xperms = {"ioctl": xp2} 202*2d543d20SAndroid Build Coastguard Worker 203*2d543d20SAndroid Build Coastguard Worker a.merge(b) 204*2d543d20SAndroid Build Coastguard Worker self.assertEqual(list(a.perms), ["read"]) 205*2d543d20SAndroid Build Coastguard Worker self.assertEqual(sorted(list(a.xperms.keys())), ["asdf", "ioctl"]) 206*2d543d20SAndroid Build Coastguard Worker self.assertEqual(a.xperms["asdf"].to_string(), "0x17") 207*2d543d20SAndroid Build Coastguard Worker self.assertEqual(a.xperms["ioctl"].to_string(), "{ 0x2a 0x3039 }") 208*2d543d20SAndroid Build Coastguard Worker 209*2d543d20SAndroid Build Coastguard Worker def test_merge_xperm_same_op(self): 210*2d543d20SAndroid Build Coastguard Worker """Test merging two AVs that contain xperms with same operation""" 211*2d543d20SAndroid Build Coastguard Worker a = access.AccessVector(["foo", "bar", "file", "read"]) 212*2d543d20SAndroid Build Coastguard Worker xp1 = refpolicy.XpermSet() 213*2d543d20SAndroid Build Coastguard Worker xp1.add(23) 214*2d543d20SAndroid Build Coastguard Worker a.xperms = {"ioctl": xp1} 215*2d543d20SAndroid Build Coastguard Worker 216*2d543d20SAndroid Build Coastguard Worker b = access.AccessVector(["foo", "bar", "file", "read"]) 217*2d543d20SAndroid Build Coastguard Worker xp2 = refpolicy.XpermSet() 218*2d543d20SAndroid Build Coastguard Worker xp2.add(42) 219*2d543d20SAndroid Build Coastguard Worker xp2.add(12345) 220*2d543d20SAndroid Build Coastguard Worker b.xperms = {"ioctl": xp2} 221*2d543d20SAndroid Build Coastguard Worker 222*2d543d20SAndroid Build Coastguard Worker a.merge(b) 223*2d543d20SAndroid Build Coastguard Worker self.assertEqual(list(a.perms), ["read"]) 224*2d543d20SAndroid Build Coastguard Worker self.assertEqual(list(a.xperms.keys()), ["ioctl"]) 225*2d543d20SAndroid Build Coastguard Worker self.assertEqual(a.xperms["ioctl"].to_string(), "{ 0x17 0x2a 0x3039 }") 226*2d543d20SAndroid Build Coastguard Worker 227*2d543d20SAndroid Build Coastguard Workerclass TestUtilFunctions(unittest.TestCase): 228*2d543d20SAndroid Build Coastguard Worker def test_is_idparam(self): 229*2d543d20SAndroid Build Coastguard Worker self.assertTrue(access.is_idparam("$1")) 230*2d543d20SAndroid Build Coastguard Worker self.assertTrue(access.is_idparam("$2")) 231*2d543d20SAndroid Build Coastguard Worker self.assertTrue(access.is_idparam("$123")) 232*2d543d20SAndroid Build Coastguard Worker self.assertFalse(access.is_idparam("$123.23")) 233*2d543d20SAndroid Build Coastguard Worker self.assertFalse(access.is_idparam("$A")) 234*2d543d20SAndroid Build Coastguard Worker 235*2d543d20SAndroid Build Coastguard Worker def test_avrule_to_access_vectors(self): 236*2d543d20SAndroid Build Coastguard Worker rule = refpolicy.AVRule() 237*2d543d20SAndroid Build Coastguard Worker rule.src_types.add("foo") 238*2d543d20SAndroid Build Coastguard Worker rule.src_types.add("baz") 239*2d543d20SAndroid Build Coastguard Worker rule.tgt_types.add("bar") 240*2d543d20SAndroid Build Coastguard Worker rule.tgt_types.add("what") 241*2d543d20SAndroid Build Coastguard Worker rule.obj_classes.add("file") 242*2d543d20SAndroid Build Coastguard Worker rule.obj_classes.add("dir") 243*2d543d20SAndroid Build Coastguard Worker rule.perms.add("read") 244*2d543d20SAndroid Build Coastguard Worker rule.perms.add("write") 245*2d543d20SAndroid Build Coastguard Worker 246*2d543d20SAndroid Build Coastguard Worker avs = access.avrule_to_access_vectors(rule) 247*2d543d20SAndroid Build Coastguard Worker self.assertEqual(len(avs), 8) 248*2d543d20SAndroid Build Coastguard Worker comps = [("foo", "what", "dir"), 249*2d543d20SAndroid Build Coastguard Worker ("foo", "what", "file"), 250*2d543d20SAndroid Build Coastguard Worker ("foo", "bar", "dir"), 251*2d543d20SAndroid Build Coastguard Worker ("foo", "bar", "file"), 252*2d543d20SAndroid Build Coastguard Worker ("baz", "what", "dir"), 253*2d543d20SAndroid Build Coastguard Worker ("baz", "what", "file"), 254*2d543d20SAndroid Build Coastguard Worker ("baz", "bar", "dir"), 255*2d543d20SAndroid Build Coastguard Worker ("baz", "bar", "file")] 256*2d543d20SAndroid Build Coastguard Worker status = [False] * 8 257*2d543d20SAndroid Build Coastguard Worker for av in access.avrule_to_access_vectors(rule): 258*2d543d20SAndroid Build Coastguard Worker self.assertEqual(av.perms, refpolicy.IdSet(["read", "write"])) 259*2d543d20SAndroid Build Coastguard Worker for i in range(len(comps)): 260*2d543d20SAndroid Build Coastguard Worker if comps[i][0] == av.src_type and \ 261*2d543d20SAndroid Build Coastguard Worker comps[i][1] == av.tgt_type and \ 262*2d543d20SAndroid Build Coastguard Worker comps[i][2] == av.obj_class: 263*2d543d20SAndroid Build Coastguard Worker status[i] = True 264*2d543d20SAndroid Build Coastguard Worker 265*2d543d20SAndroid Build Coastguard Worker for s in status: 266*2d543d20SAndroid Build Coastguard Worker self.assertEqual(s, True) 267*2d543d20SAndroid Build Coastguard Worker 268*2d543d20SAndroid Build Coastguard Worker 269*2d543d20SAndroid Build Coastguard Workerclass TestAccessVectorSet(unittest.TestCase): 270*2d543d20SAndroid Build Coastguard Worker def setUp(self): 271*2d543d20SAndroid Build Coastguard Worker rule = refpolicy.AVRule() 272*2d543d20SAndroid Build Coastguard Worker rule.src_types.add("foo") 273*2d543d20SAndroid Build Coastguard Worker rule.src_types.add("baz") 274*2d543d20SAndroid Build Coastguard Worker rule.tgt_types.add("bar") 275*2d543d20SAndroid Build Coastguard Worker rule.tgt_types.add("what") 276*2d543d20SAndroid Build Coastguard Worker rule.obj_classes.add("file") 277*2d543d20SAndroid Build Coastguard Worker rule.obj_classes.add("dir") 278*2d543d20SAndroid Build Coastguard Worker rule.perms.add("read") 279*2d543d20SAndroid Build Coastguard Worker rule.perms.add("write") 280*2d543d20SAndroid Build Coastguard Worker 281*2d543d20SAndroid Build Coastguard Worker s = access.AccessVectorSet() 282*2d543d20SAndroid Build Coastguard Worker avs = access.avrule_to_access_vectors(rule) 283*2d543d20SAndroid Build Coastguard Worker for av in avs: 284*2d543d20SAndroid Build Coastguard Worker s.add_av(av) 285*2d543d20SAndroid Build Coastguard Worker self.s = s 286*2d543d20SAndroid Build Coastguard Worker 287*2d543d20SAndroid Build Coastguard Worker def test_init(self): 288*2d543d20SAndroid Build Coastguard Worker a = access.AccessVectorSet() 289*2d543d20SAndroid Build Coastguard Worker 290*2d543d20SAndroid Build Coastguard Worker def test_iter(self): 291*2d543d20SAndroid Build Coastguard Worker comps = [("foo", "what", "dir"), 292*2d543d20SAndroid Build Coastguard Worker ("foo", "what", "file"), 293*2d543d20SAndroid Build Coastguard Worker ("foo", "bar", "dir"), 294*2d543d20SAndroid Build Coastguard Worker ("foo", "bar", "file"), 295*2d543d20SAndroid Build Coastguard Worker ("baz", "what", "dir"), 296*2d543d20SAndroid Build Coastguard Worker ("baz", "what", "file"), 297*2d543d20SAndroid Build Coastguard Worker ("baz", "bar", "dir"), 298*2d543d20SAndroid Build Coastguard Worker ("baz", "bar", "file")] 299*2d543d20SAndroid Build Coastguard Worker status = [False] * 8 300*2d543d20SAndroid Build Coastguard Worker for av in self.s: 301*2d543d20SAndroid Build Coastguard Worker self.assertEqual(av.perms, refpolicy.IdSet(["read", "write"])) 302*2d543d20SAndroid Build Coastguard Worker for i in range(len(comps)): 303*2d543d20SAndroid Build Coastguard Worker if comps[i][0] == av.src_type and \ 304*2d543d20SAndroid Build Coastguard Worker comps[i][1] == av.tgt_type and \ 305*2d543d20SAndroid Build Coastguard Worker comps[i][2] == av.obj_class: 306*2d543d20SAndroid Build Coastguard Worker status[i] = True 307*2d543d20SAndroid Build Coastguard Worker 308*2d543d20SAndroid Build Coastguard Worker for s in status: 309*2d543d20SAndroid Build Coastguard Worker self.assertEqual(s, True) 310*2d543d20SAndroid Build Coastguard Worker 311*2d543d20SAndroid Build Coastguard Worker def test_len(self): 312*2d543d20SAndroid Build Coastguard Worker self.assertEqual(len(self.s), 8) 313*2d543d20SAndroid Build Coastguard Worker 314*2d543d20SAndroid Build Coastguard Worker def test_list(self): 315*2d543d20SAndroid Build Coastguard Worker a = access.AccessVectorSet() 316*2d543d20SAndroid Build Coastguard Worker a.add("$1", "foo", "file", refpolicy.IdSet(["read", "write"])) 317*2d543d20SAndroid Build Coastguard Worker a.add("$1", "bar", "file", refpolicy.IdSet(["read", "write"])) 318*2d543d20SAndroid Build Coastguard Worker a.add("what", "bar", "file", refpolicy.IdSet(["read", "write"])) 319*2d543d20SAndroid Build Coastguard Worker 320*2d543d20SAndroid Build Coastguard Worker avl = a.to_list() 321*2d543d20SAndroid Build Coastguard Worker avl.sort() 322*2d543d20SAndroid Build Coastguard Worker 323*2d543d20SAndroid Build Coastguard Worker test_l = [['what','bar','file','read','write'], 324*2d543d20SAndroid Build Coastguard Worker ['$1','foo','file','read','write'], 325*2d543d20SAndroid Build Coastguard Worker ['$1','bar','file','read','write']] 326*2d543d20SAndroid Build Coastguard Worker test_l.sort() 327*2d543d20SAndroid Build Coastguard Worker 328*2d543d20SAndroid Build Coastguard Worker for a,b in zip(test_l, avl): 329*2d543d20SAndroid Build Coastguard Worker self.assertEqual(len(a), len(b)) 330*2d543d20SAndroid Build Coastguard Worker for x,y in list(zip(a,b))[:3]: 331*2d543d20SAndroid Build Coastguard Worker self.assertEqual(x, y) 332*2d543d20SAndroid Build Coastguard Worker perms1 = a[3:] 333*2d543d20SAndroid Build Coastguard Worker perms2 = b[3:] 334*2d543d20SAndroid Build Coastguard Worker perms1.sort() 335*2d543d20SAndroid Build Coastguard Worker perms2.sort() 336*2d543d20SAndroid Build Coastguard Worker self.assertEqual(perms1, perms2) 337*2d543d20SAndroid Build Coastguard Worker 338*2d543d20SAndroid Build Coastguard Worker b = access.AccessVectorSet() 339*2d543d20SAndroid Build Coastguard Worker b.from_list(avl) 340*2d543d20SAndroid Build Coastguard Worker self.assertEqual(len(b), 3) 341*2d543d20SAndroid Build Coastguard Worker 342*2d543d20SAndroid Build Coastguard Worker def test_add_av_first(self): 343*2d543d20SAndroid Build Coastguard Worker """Test adding first AV to the AV set""" 344*2d543d20SAndroid Build Coastguard Worker avs = access.AccessVectorSet() 345*2d543d20SAndroid Build Coastguard Worker av = access.AccessVector(['foo', 'bar', 'file', 'read']) 346*2d543d20SAndroid Build Coastguard Worker 347*2d543d20SAndroid Build Coastguard Worker avs.add_av(av) 348*2d543d20SAndroid Build Coastguard Worker 349*2d543d20SAndroid Build Coastguard Worker self.assertEqual(avs.to_list(), [['foo', 'bar', 'file', 'read']]) 350*2d543d20SAndroid Build Coastguard Worker 351*2d543d20SAndroid Build Coastguard Worker def test_add_av_second(self): 352*2d543d20SAndroid Build Coastguard Worker """Test adding second AV to the AV set with same source and target 353*2d543d20SAndroid Build Coastguard Worker context and class""" 354*2d543d20SAndroid Build Coastguard Worker avs = access.AccessVectorSet() 355*2d543d20SAndroid Build Coastguard Worker av1 = access.AccessVector(['foo', 'bar', 'file', 'read']) 356*2d543d20SAndroid Build Coastguard Worker av2 = access.AccessVector(['foo', 'bar', 'file', 'write']) 357*2d543d20SAndroid Build Coastguard Worker 358*2d543d20SAndroid Build Coastguard Worker avs.add_av(av1) 359*2d543d20SAndroid Build Coastguard Worker avs.add_av(av2) 360*2d543d20SAndroid Build Coastguard Worker 361*2d543d20SAndroid Build Coastguard Worker self.assertEqual(avs.to_list(), [['foo', 'bar', 'file', 'read', 362*2d543d20SAndroid Build Coastguard Worker 'write']]) 363*2d543d20SAndroid Build Coastguard Worker 364*2d543d20SAndroid Build Coastguard Worker def test_add_av_with_msg(self): 365*2d543d20SAndroid Build Coastguard Worker """Test adding audit message""" 366*2d543d20SAndroid Build Coastguard Worker avs = access.AccessVectorSet() 367*2d543d20SAndroid Build Coastguard Worker av = access.AccessVector(['foo', 'bar', 'file', 'read']) 368*2d543d20SAndroid Build Coastguard Worker 369*2d543d20SAndroid Build Coastguard Worker avs.add_av(av, 'test message') 370*2d543d20SAndroid Build Coastguard Worker 371*2d543d20SAndroid Build Coastguard Worker self.assertEqual(avs.src['foo']['bar']['file', av.type].audit_msgs, 372*2d543d20SAndroid Build Coastguard Worker ['test message']) 373*2d543d20SAndroid Build Coastguard Worker 374*2d543d20SAndroid Build Coastguard Worker def test_add(self): 375*2d543d20SAndroid Build Coastguard Worker """Test adding AV to the set""" 376*2d543d20SAndroid Build Coastguard Worker s = access.AccessVectorSet() 377*2d543d20SAndroid Build Coastguard Worker 378*2d543d20SAndroid Build Coastguard Worker def test_add_av(av, audit_msg=None): 379*2d543d20SAndroid Build Coastguard Worker self.assertEqual(av.src_type, 'foo') 380*2d543d20SAndroid Build Coastguard Worker self.assertEqual(av.tgt_type, 'bar') 381*2d543d20SAndroid Build Coastguard Worker self.assertEqual(av.obj_class, 'file') 382*2d543d20SAndroid Build Coastguard Worker self.assertEqual(list(av.perms), ['read']) 383*2d543d20SAndroid Build Coastguard Worker self.assertEqual(av.data, 'test data') 384*2d543d20SAndroid Build Coastguard Worker self.assertEqual(av.type, 42) 385*2d543d20SAndroid Build Coastguard Worker self.assertEqual(audit_msg, 'test message') 386*2d543d20SAndroid Build Coastguard Worker 387*2d543d20SAndroid Build Coastguard Worker s.add_av = test_add_av 388*2d543d20SAndroid Build Coastguard Worker 389*2d543d20SAndroid Build Coastguard Worker s.add("foo", "bar", "file", refpolicy.IdSet(["read"]), 390*2d543d20SAndroid Build Coastguard Worker audit_msg='test message', avc_type=42, data='test data') 391