373
392
('deny unixlike,', False),
395
class AANamedRegexProfileStart_2(AANamedRegexTest):
396
'''Tests for RE_PROFILE_START'''
399
self.regex = RE_PROFILE_START
402
('/bin/foo ', False), # no '{'
403
('/bin/foo /bin/bar', False), # missing 'profile' keyword
404
('profile {', False), # no attachment
405
(' profile foo bar /foo {', False), # missing quotes around "foo bar"
407
(' /foo {', { 'plainprofile': '/foo', 'namedprofile': None, 'attachment': None, 'flags': None, 'comment': None }),
408
(' "/foo" {', { 'plainprofile': '"/foo"', 'namedprofile': None, 'attachment': None, 'flags': None, 'comment': None }),
409
(' profile /foo {', { 'plainprofile': None, 'namedprofile': '/foo', 'attachment': None, 'flags': None, 'comment': None }),
410
(' profile "/foo" {', { 'plainprofile': None, 'namedprofile': '"/foo"', 'attachment': None, 'flags': None, 'comment': None }),
411
(' profile foo /foo {', { 'plainprofile': None, 'namedprofile': 'foo', 'attachment': '/foo', 'flags': None, 'comment': None }),
412
(' profile foo /foo (audit) {', { 'plainprofile': None, 'namedprofile': 'foo', 'attachment': '/foo', 'flags': 'audit', 'comment': None }),
413
(' profile "foo" "/foo" {', { 'plainprofile': None, 'namedprofile': '"foo"', 'attachment': '"/foo"', 'flags': None, 'comment': None }),
414
(' profile "foo bar" /foo {', { 'plainprofile': None, 'namedprofile': '"foo bar"', 'attachment': '/foo', 'flags': None, 'comment': None }),
415
(' /foo (complain) {', { 'plainprofile': '/foo', 'namedprofile': None, 'attachment': None, 'flags': 'complain', 'comment': None }),
416
(' /foo flags=(complain) {', { 'plainprofile': '/foo', 'namedprofile': None, 'attachment': None, 'flags': 'complain', 'comment': None }),
417
(' /foo (complain) { # x', { 'plainprofile': '/foo', 'namedprofile': None, 'attachment': None, 'flags': 'complain', 'comment': '# x'}),
419
(' /foo {', { 'plainprofile': '/foo', 'namedprofile': None, 'leadingspace': ' ' }),
420
('/foo {', { 'plainprofile': '/foo', 'namedprofile': None, 'leadingspace': '' }),
421
(' profile foo {', { 'plainprofile': None, 'namedprofile': 'foo', 'leadingspace': ' ' }),
422
('profile foo {', { 'plainprofile': None, 'namedprofile': 'foo', 'leadingspace': '' }),
426
class Test_parse_profile_start_line(AATest):
428
(' /foo {', { 'profile': '/foo', 'profile_keyword': False, 'plainprofile': '/foo', 'namedprofile': None, 'attachment': None, 'flags': None, 'comment': None }),
429
(' "/foo" {', { 'profile': '/foo', 'profile_keyword': False, 'plainprofile': '/foo', 'namedprofile': None, 'attachment': None, 'flags': None, 'comment': None }),
430
(' profile /foo {', { 'profile': '/foo', 'profile_keyword': True, 'plainprofile': None, 'namedprofile': '/foo', 'attachment': None, 'flags': None, 'comment': None }),
431
(' profile "/foo" {', { 'profile': '/foo', 'profile_keyword': True, 'plainprofile': None, 'namedprofile': '/foo', 'attachment': None, 'flags': None, 'comment': None }),
432
(' profile foo /foo {', { 'profile': 'foo', 'profile_keyword': True, 'plainprofile': None, 'namedprofile': 'foo', 'attachment': '/foo', 'flags': None, 'comment': None }),
433
(' profile foo /foo (audit) {', { 'profile': 'foo', 'profile_keyword': True, 'plainprofile': None, 'namedprofile': 'foo', 'attachment': '/foo', 'flags': 'audit', 'comment': None }),
434
(' profile "foo" "/foo" {', { 'profile': 'foo', 'profile_keyword': True, 'plainprofile': None, 'namedprofile': 'foo', 'attachment': '/foo', 'flags': None, 'comment': None }),
435
(' profile "foo bar" /foo {', { 'profile': 'foo bar', 'profile_keyword': True, 'plainprofile': None, 'namedprofile': 'foo bar','attachment': '/foo', 'flags': None, 'comment': None }),
436
(' /foo (complain) {', { 'profile': '/foo', 'profile_keyword': False, 'plainprofile': '/foo', 'namedprofile': None, 'attachment': None, 'flags': 'complain', 'comment': None }),
437
(' /foo flags=(complain) {', { 'profile': '/foo', 'profile_keyword': False, 'plainprofile': '/foo', 'namedprofile': None, 'attachment': None, 'flags': 'complain', 'comment': None }),
438
(' /foo (complain) { # x', { 'profile': '/foo', 'profile_keyword': False, 'plainprofile': '/foo', 'namedprofile': None, 'attachment': None, 'flags': 'complain', 'comment': '# x'}),
440
(' /foo {', { 'profile': '/foo', 'plainprofile': '/foo', 'namedprofile': None, 'leadingspace': ' ' }),
441
('/foo {', { 'profile': '/foo', 'plainprofile': '/foo', 'namedprofile': None, 'leadingspace': None }),
442
(' profile foo {', { 'profile': 'foo', 'plainprofile': None, 'namedprofile': 'foo', 'leadingspace': ' ' }),
443
('profile foo {', { 'profile': 'foo', 'plainprofile': None, 'namedprofile': 'foo', 'leadingspace': None }),
446
def _run_test(self, line, expected):
447
matches = parse_profile_start_line(line, 'somefile')
449
self.assertTrue(matches)
452
self.assertEqual(matches[exp], expected[exp], 'Group %s mismatch in rule %s' % (exp,line))
454
class TestInvalid_parse_profile_start_line(AATest):
456
('/bin/foo ', False), # no '{'
457
('/bin/foo /bin/bar', False), # missing 'profile' keyword
458
('profile {', False), # no attachment
459
(' profile foo bar /foo {', False), # missing quotes around "foo bar"
462
def _run_test(self, line, expected):
463
with self.assertRaises(AppArmorBug):
464
parse_profile_start_line(line, 'somefile')
467
class TestStripQuotes(AATest):
468
def test_strip_quotes_01(self):
469
self.assertEqual('foo', strip_quotes('foo'))
470
def test_strip_quotes_02(self):
471
self.assertEqual('foo', strip_quotes('"foo"'))
472
def test_strip_quotes_03(self):
473
self.assertEqual('"foo', strip_quotes('"foo'))
474
def test_strip_quotes_04(self):
475
self.assertEqual('foo"', strip_quotes('foo"'))
476
def test_strip_quotes_05(self):
477
self.assertEqual('', strip_quotes('""'))
478
def test_strip_quotes_06(self):
479
self.assertEqual('foo"bar', strip_quotes('foo"bar'))
480
def test_strip_quotes_07(self):
481
self.assertEqual('foo"bar', strip_quotes('"foo"bar"'))
482
def test_strip_quotes_08(self):
483
self.assertEqual('"""foo"bar"""', strip_quotes('""""foo"bar""""'))
487
setup_all_loops(__name__)
376
488
if __name__ == '__main__':
489
# these two are not converted to a tests[] loop yet
379
490
setup_has_comma_testcases()
380
491
setup_split_comment_testcases()
382
test_suite = unittest.TestSuite()
383
test_suite.addTest(unittest.TestLoader().loadTestsFromTestCase(AARegexHasComma))
384
test_suite.addTest(unittest.TestLoader().loadTestsFromTestCase(AARegexSplitComment))
386
for tests in (AARegexCapability, AARegexPath, AARegexBareFile,
387
AARegexDbus, AARegexMount, AARegexUnix,
388
AARegexSignal, AARegexPtrace, AARegexPivotRoot):
389
setup_regex_tests(tests)
390
test_suite.addTest(unittest.TestLoader().loadTestsFromTestCase(tests))
392
result = unittest.TextTestRunner(verbosity=verbosity).run(test_suite)
393
if not result.wasSuccessful():
493
unittest.main(verbosity=2)