[apparmor] [patch] add tests for write_header()

Christian Boltz apparmor at cboltz.de
Fri Mar 6 23:38:15 UTC 2015


Hello,

this patch adds tests for write_header() and loop support to test-aa.py.

BTW: In case you wonder - the need to replace unittest.TestCase with
AATest is intentional. It might look annoying, but it makes sure that
a test-*.py file doesn't contain a test class where tests = [...] is
ignored because it's still unittest.TestCase.
(Technically, setup_all_tests() will error out if a test class doesn't
contain tests = [...] - either explicit or via its parent AATest.)


[ 16-add-tests-for-write_header.diff ]

--- utils/test/test-aa.py       2015-03-06 23:44:47.248306044 +0100
+++ utils/test/test-aa.py       2015-03-07 00:17:34.955050118 +0100
@@ -10,15 +10,16 @@
 # ------------------------------------------------------------------
 
 import unittest
+from common_test import AATest, setup_all_tests
 import os
 import shutil
 import tempfile
 from common_test import read_file, write_file
 
-from apparmor.aa import check_for_apparmor, get_profile_flags, set_profile_flags, is_skippable_file, parse_profile_start, serialize_parse_profile_start
+from apparmor.aa import check_for_apparmor, get_profile_flags, set_profile_flags, is_skippable_file, parse_profile_start, write_header, serialize_parse_profile_start
 from apparmor.common import AppArmorException, AppArmorBug
 
-class AaTestWithTempdir(unittest.TestCase):
+class AaTestWithTempdir(AATest):
     def setUp(self):
         self.tmpdir = tempfile.mkdtemp(prefix='aa-py-')
 
@@ -220,7 +221,7 @@
         set_profile_flags('%s/file-not-found' % self.tmpdir, '/foo', 'audit')
 
 
-class AaTest_is_skippable_file(unittest.TestCase):
+class AaTest_is_skippable_file(AATest):
     def test_not_skippable_01(self):
         self.assertFalse(is_skippable_file('bin.ping'))
     def test_not_skippable_02(self):
@@ -262,7 +263,7 @@
     def test_skippable_13(self):
         self.assertTrue(is_skippable_file('README'))
 
-class AaTest_parse_profile_start(unittest.TestCase):
+class AaTest_parse_profile_start(AATest):
     def _parse(self, line, profile, hat):
         return parse_profile_start(line, 'somefile', 1, profile, hat)
         # (profile, hat, flags, in_contained_hat, pps_set_profile, pps_set_hat_external)
@@ -306,7 +307,33 @@
         with self.assertRaises(AppArmorBug):
             self._parse('xy', '/bar', '/bar') # not a profile start
 
+class AaTest_write_header(AATest):
+    tests = [
+        # name       embedded_hat    write_flags    depth   flags           attachment      expected
+        (['/foo',    False,          True,          1,      'complain',     None        ],  '  /foo flags=(complain) {'),
+        (['/foo',    True,           True,          1,      'complain',     None        ],  '  profile /foo flags=(complain) {'),
+        (['/foo sp', False,          False,         2,      'complain',     None        ],  '    profile "/foo sp" {'), # XXX why is the profile keyword added here?
+        (['/foo'    ,False,          False,         2,      'complain',     None        ],  '    /foo {'),
+        (['/foo',    True,           False,         2,      'complain',     None        ],  '    profile /foo {'),
+        (['/foo',    False,          True,          0,      None,           None        ],  '/foo {'),
+        (['/foo',    True,           True,          0,      None,           None        ],  'profile /foo {'),
+        (['/foo',    False,          False,         0,      None,           None        ],  '/foo {'),
+        (['/foo',    True,           False,         0,      None,           None        ],  'profile /foo {'),
+        (['^foo',    False,          True,          1,      'complain',     None        ],  '  profile ^foo flags=(complain) {'),
+        (['^foo',    True,           True,          1,      'complain',     None        ],  '  ^foo flags=(complain) {'),
+     ]
+
+    def _run_test(self, params, expected):
+        name = params[0]
+        embedded_hat = params[1]
+        write_flags = params[2]
+        depth = params[3]
+        prof_data = { 'flags': params[4], 'attachment': params[5] }
+
+        result = write_header(prof_data, depth, name, embedded_hat, write_flags)
+        self.assertEqual(result, [expected])
+
-class AaTest_serialize_parse_profile_start(unittest.TestCase):
+class AaTest_serialize_parse_profile_start(AATest):
     def _parse(self, line, profile, hat, prof_data_profile, prof_data_external):
         # 'correct' is always True in the code that uses serialize_parse_profile_start() (set some lines above the function call)
         return serialize_parse_profile_start(line, 'somefile', 1, profile, hat, prof_data_profile, prof_data_external, True)
@@ -397,4 +424,5 @@
     #        self._parse('/foo {', '/bar', '/bar', False, False) # child profile without profile keyword
 
 if __name__ == '__main__':
+    setup_all_tests()
     unittest.main(verbosity=2)




Regards,

Christian Boltz
-- 
FRAGEBÖGEN! An die "Bedarfsträger"! DAS ist die Evaluierung!
Sie fragen den Wolf, ob die Schafe schmackhaft waren, und ob
sie auch nicht mehr gefressen haben als sie Hunger hatten!
[Fefe in http://blog.fefe.de/?ts=b33b483f]




More information about the AppArmor mailing list