2
0
mirror of https://gitlab.com/apparmor/apparmor synced 2025-08-22 18:17:09 +00:00

utils: Simplify newly added test-regex_matches tests

Remove duplicated test code by adding a simple way for regex test
classes to declare a regex to use and a list of tuples consisting of
(line, expected_result). The setup_regex_tests() method generates test
methods for each tuple in a classes list. The test methods are based on
the regex_test() method, which performs the regex search and compares
the results to the expected_result.

Signed-off-by: Tyler Hicks <tyhicks@canonical.com>
Acked-by: Christian Boltz <apparmor@cboltz.de>
This commit is contained in:
Tyler Hicks 2014-04-23 16:41:44 -05:00
parent f8f3d16d4c
commit 876e30a3c5

View File

@ -134,368 +134,151 @@ def setup_split_comment_testcases():
stub_test.__doc__ = "test '%s'" % (test_string) stub_test.__doc__ = "test '%s'" % (test_string)
setattr(AARegexSplitComment, 'test_split_comment_%d' % (i), stub_test) setattr(AARegexSplitComment, 'test_split_comment_%d' % (i), stub_test)
def regex_test(self, line, expected):
'''Run a line through self.regex.search() and verify the result
Keyword arguments:
line -- the line to search
expected -- False if the search isn't expected to match or, if the search
is expected to match, a tuple of expected match groups with all
of the strings stripped
'''
result = self.regex.search(line)
if not expected:
self.assertFalse(result)
return
self.assertTrue(result)
groups = result.groups()
self.assertEqual(len(groups), len(expected))
for (i, group) in enumerate(groups):
if group:
group = group.strip()
self.assertEqual(group, expected[i], 'Group %d mismatch' % i)
def setup_regex_tests(test_class):
'''Create tests in test_class using test_class.tests and regex_tests()
test_class.tests should be tuples of (line, expected_results) where
expected_results is False if test_class.regex.search(line) should not
match. If the search should match, expected_results should be a tuple of
the expected groups, with all of the strings stripped.
'''
for (i, (line, expected)) in enumerate(test_class.tests):
def stub_test(self, line=line, expected=expected):
regex_test(self, line, expected)
stub_test.__doc__ = "test '%s'" % (line)
setattr(test_class, 'test_%d' % (i), stub_test)
class AARegexCapability(unittest.TestCase): class AARegexCapability(unittest.TestCase):
'''Tests for RE_PROFILE_CAP''' '''Tests for RE_PROFILE_CAP'''
def test_simple_capability_01(self): regex = aa.RE_PROFILE_CAP
'''test ' capability net_raw,' '''
line = ' capability net_raw,' tests = [
result = aa.RE_PROFILE_CAP.search(line) (' capability net_raw,', (None, None, 'net_raw', None)),
self.assertTrue(result, 'Couldn\'t find capability rule in "%s"' % line) ('capability net_raw , ', (None, None, 'net_raw', None)),
cap = result.groups()[2].strip() (' capability,', (None, None, None, None)),
self.assertEqual(cap, 'net_raw', 'Expected capability "%s", got "%s"' (' capability , ', (None, None, None, None)),
% ('net_raw', cap)) (' capabilitynet_raw,', False)
]
def test_simple_capability_02(self):
'''test ' capability net_raw , ' '''
line = 'capability net_raw , '
result = aa.RE_PROFILE_CAP.search(line)
self.assertTrue(result, 'Couldn\'t find capability rule in "%s"' % line)
cap = result.groups()[2].strip()
self.assertEqual(cap, 'net_raw', 'Expected capability "%s", got "%s"'
% ('net_raw', cap))
def test_capability_all_01(self):
'''test ' capability,' '''
line = ' capability,'
result = aa.RE_PROFILE_CAP.search(line)
self.assertTrue(result, 'Couldn\'t find capability rule in "%s"' % line)
def test_capability_all_02(self):
'''test ' capability , ' '''
line = ' capability , '
result = aa.RE_PROFILE_CAP.search(line)
self.assertTrue(result, 'Couldn\'t find capability rule in "%s"' % line)
def test_simple_bad_capability_01(self):
'''test ' capabilitynet_raw,' '''
line = ' capabilitynet_raw,'
result = aa.RE_PROFILE_CAP.search(line)
self.assertFalse(result, 'Found unexpected capability rule in "%s"' % line)
class AARegexPath(unittest.TestCase): class AARegexPath(unittest.TestCase):
'''Tests for RE_PROFILE_PATH_ENTRY''' '''Tests for RE_PROFILE_PATH_ENTRY'''
def test_simple_path_01(self): regex = aa.RE_PROFILE_PATH_ENTRY
'''test ' /tmp/foo r,' '''
line = ' /tmp/foo r,' tests = [
result = aa.RE_PROFILE_PATH_ENTRY.search(line) (' /tmp/foo r,',
self.assertTrue(result, 'Couldn\'t find file rule in "%s"' % line) (None, None, None, None, '/tmp/foo', 'r', None, None, None)),
mode = result.groups()[5].strip() (' audit /tmp/foo rw,',
self.assertEqual(mode, 'r', 'Expected mode "r", got "%s"' % (mode)) ('audit', None, None, None, '/tmp/foo', 'rw', None, None, None)),
(' audit deny /tmp/foo rw,',
('audit', 'deny', None, None, '/tmp/foo', 'rw', None, None, None)),
(' file /tmp/foo rw,',
(None, None, None, 'file', '/tmp/foo', 'rw', None, None, None)),
(' file,', False),
]
def test_simple_path_02(self):
'''test ' audit /tmp/foo rw,' '''
line = ' audit /tmp/foo rw,'
result = aa.RE_PROFILE_PATH_ENTRY.search(line)
self.assertTrue(result, 'Couldn\'t find file rule in "%s"' % line)
audit = result.groups()[0].strip()
self.assertEqual(audit, 'audit', 'Couldn\t find audit modifier')
mode = result.groups()[5].strip()
self.assertEqual(mode, 'rw', 'Expected mode "rw", got "%s"' % (mode))
def test_simple_path_03(self):
'''test ' audit deny /tmp/foo rw,' '''
line = ' audit deny /tmp/foo rw,'
result = aa.RE_PROFILE_PATH_ENTRY.search(line)
self.assertTrue(result, 'Couldn\'t find file rule in "%s"' % line)
audit = result.groups()[0].strip()
self.assertEqual(audit, 'audit', 'Couldn\t find audit modifier')
deny = result.groups()[1].strip()
self.assertEqual(deny, 'deny', 'Couldn\t find deny modifier')
mode = result.groups()[5].strip()
self.assertEqual(mode, 'rw', 'Expected mode "rw", got "%s"' % (mode))
def test_simple_path_04(self):
'''test ' file /tmp/foo rw,' '''
line = ' file /tmp/foo rw,'
result = aa.RE_PROFILE_PATH_ENTRY.search(line)
self.assertTrue(result, 'Couldn\'t find file rule in "%s"' % line)
path = result.groups()[4].strip()
self.assertEqual(path, "/tmp/foo", 'Couldn\'t find path')
mode = result.groups()[5].strip()
self.assertEqual(mode, 'rw', 'Expected mode "rw", got "%s"' % (mode))
def test_simple_bad_path_01(self):
'''test ' file,' '''
line = ' file,'
result = aa.RE_PROFILE_PATH_ENTRY.search(line)
self.assertFalse(result, 'RE_PROFILE_PATH_ENTRY unexpectedly matched "%s"' % line)
class AARegexBareFile(unittest.TestCase): class AARegexBareFile(unittest.TestCase):
'''Tests for RE_PROFILE_BARE_FILE_ENTRY''' '''Tests for RE_PROFILE_BARE_FILE_ENTRY'''
def _assertEqualStrings(self, str1, str2): regex = aa.RE_PROFILE_BARE_FILE_ENTRY
self.assertEqual(str1, str2, 'Expected %s, got "%s"' % (str1, str2))
def test_bare_file_01(self): tests = [
'''test ' file,' ''' (' file,', (None, None, None, None)),
(' dbus,', False),
(' file /tmp/foo rw,', False),
(' file /tmp/foo,', False),
(' file r,', False),
(' owner file , ', (None, None, 'owner', None)),
(' audit owner file , ', ('audit', None, 'owner', None)),
(' deny file , ', (None, 'deny', None, None)),
]
line = ' file,'
result = aa.RE_PROFILE_BARE_FILE_ENTRY.search(line)
self.assertTrue(result, 'Couldn\'t find file rule in "%s"' % line)
def test_simple_bad_file_01(self):
'''test ' dbus,' '''
line = ' dbus,'
result = aa.RE_PROFILE_BARE_FILE_ENTRY.search(line)
self.assertFalse(result, 'RE_PROFILE_BARE_FILE_ENTRY unexpectedly matched "%s"' % line)
def test_simple_bad_file_02(self):
'''test ' file /tmp/foo rw,' '''
line = ' file /tmp/foo rw,'
result = aa.RE_PROFILE_BARE_FILE_ENTRY.search(line)
self.assertFalse(result, 'RE_PROFILE_BARE_FILE_ENTRY unexpectedly matched "%s"' % line)
def test_simple_bad_file_03(self):
'''test ' file /tmp/foo,' '''
line = ' file /tmp/foo,'
result = aa.RE_PROFILE_BARE_FILE_ENTRY.search(line)
self.assertFalse(result, 'RE_PROFILE_BARE_FILE_ENTRY unexpectedly matched "%s"' % line)
def test_simple_bad_file_04(self):
'''test ' file r,' '''
line = ' file r,'
result = aa.RE_PROFILE_BARE_FILE_ENTRY.search(line)
self.assertFalse(result, 'RE_PROFILE_BARE_FILE_ENTRY unexpectedly matched "%s"' % line)
class AARegexSignal(unittest.TestCase): class AARegexSignal(unittest.TestCase):
'''Tests for RE_PROFILE_SIGNAL''' '''Tests for RE_PROFILE_SIGNAL'''
def test_bare_signal_01(self): regex = aa.RE_PROFILE_SIGNAL
'''test ' signal,' '''
rule = 'signal,' tests = [
line = ' %s' % rule (' signal,', (None, None, 'signal,', None)),
result = aa.RE_PROFILE_SIGNAL.search(line) (' audit signal,', ('audit', None, 'signal,', None)),
self.assertTrue(result, 'Couldn\'t find signal rule in "%s"' % line) (' signal receive,', (None, None, 'signal receive,', None)),
parsed = result.groups()[2].strip() (' signal (send, receive),',
self.assertEqual(parsed, rule, 'Expected signal rule "%s", got "%s"' (None, None, 'signal (send, receive),', None)),
% (rule, parsed)) (' audit signal (receive),',
('audit', None, 'signal (receive),', None)),
(' signal (send, receive) set=(usr1 usr2),',
(None, None, 'signal (send, receive) set=(usr1 usr2),', None)),
(' signal send set=(hup, quit) peer=/usr/sbin/daemon,',
(None, None,
'signal send set=(hup, quit) peer=/usr/sbin/daemon,', None)),
]
def test_bare_signal_02(self):
'''test ' audit signal,' '''
rule = 'signal,'
line = ' audit %s' % rule
result = aa.RE_PROFILE_SIGNAL.search(line)
self.assertTrue(result, 'Couldn\'t find signal rule in "%s"' % line)
self.assertTrue(result.groups()[0], 'Couldn\'t find audit modifier in "%s"' % line)
parsed = result.groups()[2].strip()
self.assertEqual(parsed, rule, 'Expected signal rule "%s", got "%s"'
% (rule, parsed))
def test_simple_signal_01(self):
'''test ' signal receive,' '''
rule = 'signal receive,'
line = ' %s' % rule
result = aa.RE_PROFILE_SIGNAL.search(line)
self.assertTrue(result, 'Couldn\'t find signal rule in "%s"' % line)
parsed = result.groups()[2].strip()
self.assertEqual(parsed, rule, 'Expected signal rule "%s", got "%s"'
% (rule, parsed))
def test_simple_signal_02(self):
'''test ' signal (send, receive),' '''
rule = 'signal (send, receive),'
line = ' %s' % rule
result = aa.RE_PROFILE_SIGNAL.search(line)
self.assertTrue(result, 'Couldn\'t find signal rule in "%s"' % line)
parsed = result.groups()[2].strip()
self.assertEqual(parsed, rule, 'Expected signal rule "%s", got "%s"'
% (rule, parsed))
def test_simple_signal_03(self):
'''test ' audit signal (receive),' '''
rule = 'signal (receive),'
line = ' audit %s' % rule
result = aa.RE_PROFILE_SIGNAL.search(line)
self.assertTrue(result, 'Couldn\'t find signal rule in "%s"' % line)
self.assertTrue(result.groups()[0], 'Couldn\'t find audit modifier in "%s"' % line)
parsed = result.groups()[2].strip()
self.assertEqual(parsed, rule, 'Expected signal rule "%s", got "%s"'
% (rule, parsed))
def test_set_signal_01(self):
'''test ' signal (send, receive) set=(usr1 usr2),' '''
rule = 'signal (send, receive) set=(usr1 usr2),'
line = ' %s' % rule
result = aa.RE_PROFILE_SIGNAL.search(line)
self.assertTrue(result, 'Couldn\'t find signal rule in "%s"' % line)
parsed = result.groups()[2].strip()
self.assertEqual(parsed, rule, 'Expected signal rule "%s", got "%s"'
% (rule, parsed))
def test_peer_signal_01(self):
'''test ' signal send set=(hup, quit) peer=/usr/sbin/daemon,' '''
rule = 'signal send set=(hup, quit) peer=/usr/sbin/daemon,'
line = ' %s' % rule
result = aa.RE_PROFILE_SIGNAL.search(line)
self.assertTrue(result, 'Couldn\'t find signal rule in "%s"' % line)
parsed = result.groups()[2].strip()
self.assertEqual(parsed, rule, 'Expected signal rule "%s", got "%s"'
% (rule, parsed))
class AARegexPtrace(unittest.TestCase): class AARegexPtrace(unittest.TestCase):
'''Tests for RE_PROFILE_PTRACE''' '''Tests for RE_PROFILE_PTRACE'''
def test_bare_ptrace_01(self): regex = aa.RE_PROFILE_PTRACE
'''test ' ptrace,' '''
rule = 'ptrace,' tests = [
line = ' %s' % rule (' ptrace,', (None, None, 'ptrace,', None)),
result = aa.RE_PROFILE_PTRACE.search(line) (' audit ptrace,', ('audit', None, 'ptrace,', None)),
self.assertTrue(result, 'Couldn\'t find ptrace rule in "%s"' % line) (' ptrace trace,', (None, None, 'ptrace trace,', None)),
parsed = result.groups()[2].strip() (' ptrace (tracedby, readby),',
self.assertEqual(parsed, rule, 'Expected ptrace rule "%s", got "%s"' (None, None, 'ptrace (tracedby, readby),', None)),
% (rule, parsed)) (' audit ptrace (read),', ('audit', None, 'ptrace (read),', None)),
(' ptrace trace peer=/usr/sbin/daemon,',
(None, None, 'ptrace trace peer=/usr/sbin/daemon,', None)),
]
def test_bare_ptrace_02(self):
'''test ' audit ptrace,' '''
rule = 'ptrace,'
line = ' audit %s' % rule
result = aa.RE_PROFILE_PTRACE.search(line)
self.assertTrue(result, 'Couldn\'t find ptrace rule in "%s"' % line)
self.assertTrue(result.groups()[0], 'Couldn\'t find audit modifier in "%s"' % line)
parsed = result.groups()[2].strip()
self.assertEqual(parsed, rule, 'Expected ptrace rule "%s", got "%s"'
% (rule, parsed))
def test_simple_ptrace_01(self):
'''test ' ptrace trace,' '''
rule = 'ptrace trace,'
line = ' %s' % rule
result = aa.RE_PROFILE_PTRACE.search(line)
self.assertTrue(result, 'Couldn\'t find ptrace rule in "%s"' % line)
parsed = result.groups()[2].strip()
self.assertEqual(parsed, rule, 'Expected ptrace rule "%s", got "%s"'
% (rule, parsed))
def test_simple_ptrace_02(self):
'''test ' ptrace (tracedby, readby),' '''
rule = 'ptrace (tracedby, readby),'
line = ' %s' % rule
result = aa.RE_PROFILE_PTRACE.search(line)
self.assertTrue(result, 'Couldn\'t find ptrace rule in "%s"' % line)
parsed = result.groups()[2].strip()
self.assertEqual(parsed, rule, 'Expected ptrace rule "%s", got "%s"'
% (rule, parsed))
def test_simple_ptrace_03(self):
'''test ' audit ptrace (read),' '''
rule = 'ptrace (read),'
line = ' audit %s' % rule
result = aa.RE_PROFILE_PTRACE.search(line)
self.assertTrue(result, 'Couldn\'t find ptrace rule in "%s"' % line)
self.assertTrue(result.groups()[0], 'Couldn\'t find audit modifier in "%s"' % line)
parsed = result.groups()[2].strip()
self.assertEqual(parsed, rule, 'Expected ptrace rule "%s", got "%s"'
% (rule, parsed))
def test_peer_ptrace_01(self):
'''test ' ptrace trace peer=/usr/sbin/daemon,' '''
rule = 'ptrace trace peer=/usr/sbin/daemon,'
line = ' %s' % rule
result = aa.RE_PROFILE_PTRACE.search(line)
self.assertTrue(result, 'Couldn\'t find ptrace rule in "%s"' % line)
parsed = result.groups()[2].strip()
self.assertEqual(parsed, rule, 'Expected ptrace rule "%s", got "%s"'
% (rule, parsed))
class AARegexPivotRoot(unittest.TestCase): class AARegexPivotRoot(unittest.TestCase):
'''Tests for RE_PROFILE_PIVOT_ROOT''' '''Tests for RE_PROFILE_PIVOT_ROOT'''
def test_bare_pivot_root_01(self): regex = aa.RE_PROFILE_PIVOT_ROOT
'''test ' pivot_root,' '''
rule = 'pivot_root,' tests = [
line = ' %s' % rule (' pivot_root,', (None, None, 'pivot_root,', None)),
result = aa.RE_PROFILE_PIVOT_ROOT.search(line) (' audit pivot_root,', ('audit', None, 'pivot_root,', None)),
self.assertTrue(result, 'Couldn\'t find pivot_root rule in "%s"' % line) (' pivot_root oldroot=/new/old,',
parsed = result.groups()[2].strip() (None, None, 'pivot_root oldroot=/new/old,', None)),
self.assertEqual(parsed, rule, 'Expected pivot_root rule "%s", got "%s"' (' pivot_root oldroot=/new/old /new,',
% (rule, parsed)) (None, None, 'pivot_root oldroot=/new/old /new,', None)),
(' pivot_root oldroot=/new/old /new -> child,',
def test_bare_pivot_root_02(self): (None, None, 'pivot_root oldroot=/new/old /new -> child,', None)),
'''test ' audit pivot_root,' ''' (' audit pivot_root oldroot=/new/old /new -> child,',
('audit', None, 'pivot_root oldroot=/new/old /new -> child,', None)),
rule = 'pivot_root,' ]
line = ' audit %s' % rule
result = aa.RE_PROFILE_PIVOT_ROOT.search(line)
self.assertTrue(result, 'Couldn\'t find pivot_root rule in "%s"' % line)
self.assertTrue(result.groups()[0], 'Couldn\'t find audit modifier in "%s"' % line)
parsed = result.groups()[2].strip()
self.assertEqual(parsed, rule, 'Expected pivot_root rule "%s", got "%s"'
% (rule, parsed))
def test_old_pivot_root_01(self):
'''test ' pivot_root /old,' '''
rule = 'pivot_root /old,'
line = ' %s' % rule
result = aa.RE_PROFILE_PIVOT_ROOT.search(line)
self.assertTrue(result, 'Couldn\'t find pivot_root rule in "%s"' % line)
parsed = result.groups()[2].strip()
self.assertEqual(parsed, rule, 'Expected pivot_root rule "%s", got "%s"'
% (rule, parsed))
def test_new_pivot_root_01(self):
'''test ' pivot_root /old /new,' '''
rule = 'pivot_root /old /new,'
line = ' %s' % rule
result = aa.RE_PROFILE_PIVOT_ROOT.search(line)
self.assertTrue(result, 'Couldn\'t find pivot_root rule in "%s"' % line)
parsed = result.groups()[2].strip()
self.assertEqual(parsed, rule, 'Expected pivot_root rule "%s", got "%s"'
% (rule, parsed))
def test_child_pivot_root_01(self):
'''test ' pivot_root /old /new -> child,' '''
rule = 'pivot_root /old /new -> child,'
line = ' %s' % rule
result = aa.RE_PROFILE_PIVOT_ROOT.search(line)
self.assertTrue(result, 'Couldn\'t find pivot_root rule in "%s"' % line)
parsed = result.groups()[2].strip()
self.assertEqual(parsed, rule, 'Expected pivot_root rule "%s", got "%s"'
% (rule, parsed))
def test_child_pivot_root_02(self):
'''test ' audit pivot_root /old /new -> child,' '''
rule = 'pivot_root /old /new -> child,'
line = ' audit %s' % rule
result = aa.RE_PROFILE_PIVOT_ROOT.search(line)
self.assertTrue(result, 'Couldn\'t find pivot_root rule in "%s"' % line)
self.assertTrue(result.groups()[0], 'Couldn\'t find audit modifier in "%s"' % line)
parsed = result.groups()[2].strip()
self.assertEqual(parsed, rule, 'Expected pivot_root rule "%s", got "%s"'
% (rule, parsed))
if __name__ == '__main__': if __name__ == '__main__':
verbosity = 2 verbosity = 2
@ -506,12 +289,12 @@ if __name__ == '__main__':
test_suite = unittest.TestSuite() test_suite = unittest.TestSuite()
test_suite.addTest(unittest.TestLoader().loadTestsFromTestCase(AARegexHasComma)) test_suite.addTest(unittest.TestLoader().loadTestsFromTestCase(AARegexHasComma))
test_suite.addTest(unittest.TestLoader().loadTestsFromTestCase(AARegexSplitComment)) test_suite.addTest(unittest.TestLoader().loadTestsFromTestCase(AARegexSplitComment))
test_suite.addTest(unittest.TestLoader().loadTestsFromTestCase(AARegexCapability))
test_suite.addTest(unittest.TestLoader().loadTestsFromTestCase(AARegexPath)) for tests in (AARegexCapability, AARegexPath, AARegexBareFile,
test_suite.addTest(unittest.TestLoader().loadTestsFromTestCase(AARegexBareFile)) AARegexSignal, AARegexPtrace, AARegexPivotRoot):
test_suite.addTest(unittest.TestLoader().loadTestsFromTestCase(AARegexSignal)) setup_regex_tests(tests)
test_suite.addTest(unittest.TestLoader().loadTestsFromTestCase(AARegexPtrace)) test_suite.addTest(unittest.TestLoader().loadTestsFromTestCase(tests))
test_suite.addTest(unittest.TestLoader().loadTestsFromTestCase(AARegexPivotRoot))
result = unittest.TextTestRunner(verbosity=verbosity).run(test_suite) result = unittest.TextTestRunner(verbosity=verbosity).run(test_suite)
if not result.wasSuccessful(): if not result.wasSuccessful():
exit(1) exit(1)