ruff: Fix EXE001 "Shebang is present but file is not executable"
[kconfig-hardened-check.git] / kernel_hardening_checker / test_engine.py
old mode 100644 (file)
new mode 100755 (executable)
index 3e5e60c..05e640c
@@ -13,11 +13,14 @@ This module performs unit-testing of the kernel-hardening-checker engine.
 import unittest
 import io
 import sys
-from collections import OrderedDict
 import json
 import inspect
-from typing import Optional, List, OrderedDict, Tuple
-from .engine import ChecklistObjType, KconfigCheck, CmdlineCheck, SysctlCheck, VersionCheck, OR, AND, populate_with_data, perform_checks, override_expected_value
+from typing import Union, Optional, List, Dict, Tuple
+from .engine import StrOrBool, ChecklistObjType, KconfigCheck, CmdlineCheck, SysctlCheck, VersionCheck, OR, AND
+from .engine import populate_with_data, perform_checks, override_expected_value
+
+
+ResultType = List[Union[Dict[str, StrOrBool], str]]
 
 
 class TestEngine(unittest.TestCase):
@@ -31,25 +34,25 @@ class TestEngine(unittest.TestCase):
         config_checklist += [SysctlCheck('reason_3', 'decision_3', 'sysctl_name', 'expected_3')]
 
         # 2. prepare the parsed kconfig options
-        parsed_kconfig_options = OrderedDict()
+        parsed_kconfig_options  = {}
         parsed_kconfig_options['CONFIG_KCONFIG_NAME'] = 'UNexpected_1'
 
         # 3. prepare the parsed cmdline options
-        parsed_cmdline_options = OrderedDict()
+        parsed_cmdline_options  = {}
         parsed_cmdline_options['cmdline_name'] = 'expected_2'
 
         # 4. prepare the parsed sysctl options
-        parsed_sysctl_options = OrderedDict()
+        parsed_sysctl_options  = {}
         parsed_sysctl_options['sysctl_name'] = 'expected_3'
 
         # 5. prepare the kernel version
-        kernel_version = (42, 43)
+        kernel_version = (42, 43, 44)
 
         # 6. run the engine
         self.run_engine(config_checklist, parsed_kconfig_options, parsed_cmdline_options, parsed_sysctl_options, kernel_version)
 
         # 7. check that the results are correct
-        result = [] # type: List
+        result = [] # type: ResultType
         self.get_engine_result(config_checklist, result, 'json')
         self.assertEqual(...
     """
@@ -58,10 +61,10 @@ class TestEngine(unittest.TestCase):
 
     @staticmethod
     def run_engine(checklist: List[ChecklistObjType],
-                   parsed_kconfig_options: Optional[OrderedDict],
-                   parsed_cmdline_options: Optional[OrderedDict],
-                   parsed_sysctl_options: Optional[OrderedDict],
-                   kernel_version: Optional[Tuple]) -> None:
+                   parsed_kconfig_options: Optional[Dict[str, str]],
+                   parsed_cmdline_options: Optional[Dict[str, str]],
+                   parsed_sysctl_options: Optional[Dict[str, str]],
+                   kernel_version: Optional[Tuple[int, int, int]]) -> None:
         # populate the checklist with data
         if parsed_kconfig_options:
             populate_with_data(checklist, parsed_kconfig_options, 'kconfig')
@@ -91,7 +94,7 @@ class TestEngine(unittest.TestCase):
         print()
 
     @staticmethod
-    def get_engine_result(checklist: List[ChecklistObjType], result: List, result_type: str) -> None:
+    def get_engine_result(checklist: List[ChecklistObjType], result: ResultType, result_type: str) -> None:
         assert(result_type in ('json', 'stdout', 'stdout_verbose')), \
                f'invalid result type "{result_type}"'
 
@@ -126,7 +129,7 @@ class TestEngine(unittest.TestCase):
         config_checklist += [KconfigCheck('reason_10', 'decision_10', 'NAME_10', 'is not off')]
 
         # 2. prepare the parsed kconfig options
-        parsed_kconfig_options = OrderedDict()
+        parsed_kconfig_options  = {}
         parsed_kconfig_options['CONFIG_NAME_1'] = 'expected_1'
         parsed_kconfig_options['CONFIG_NAME_2'] = 'UNexpected_2'
         parsed_kconfig_options['CONFIG_NAME_5'] = 'UNexpected_5'
@@ -138,7 +141,7 @@ class TestEngine(unittest.TestCase):
         self.run_engine(config_checklist, parsed_kconfig_options, None, None, None)
 
         # 4. check that the results are correct
-        result = [] # type: List
+        result = [] # type: ResultType
         self.get_engine_result(config_checklist, result, 'json')
         self.assertEqual(
                 result,
@@ -169,7 +172,7 @@ class TestEngine(unittest.TestCase):
         config_checklist += [CmdlineCheck('reason_10', 'decision_10', 'name_10', 'is not off')]
 
         # 2. prepare the parsed cmdline options
-        parsed_cmdline_options = OrderedDict()
+        parsed_cmdline_options  = {}
         parsed_cmdline_options['name_1'] = 'expected_1'
         parsed_cmdline_options['name_2'] = 'UNexpected_2'
         parsed_cmdline_options['name_5'] = ''
@@ -181,7 +184,7 @@ class TestEngine(unittest.TestCase):
         self.run_engine(config_checklist, None, parsed_cmdline_options, None, None)
 
         # 4. check that the results are correct
-        result = [] # type: List
+        result = [] # type: ResultType
         self.get_engine_result(config_checklist, result, 'json')
         self.assertEqual(
                 result,
@@ -212,7 +215,7 @@ class TestEngine(unittest.TestCase):
         config_checklist += [SysctlCheck('reason_10', 'decision_10', 'name_10', 'is not off')]
 
         # 2. prepare the parsed sysctl options
-        parsed_sysctl_options = OrderedDict()
+        parsed_sysctl_options  = {}
         parsed_sysctl_options['name_1'] = 'expected_1'
         parsed_sysctl_options['name_2'] = 'UNexpected_2'
         parsed_sysctl_options['name_5'] = ''
@@ -224,7 +227,7 @@ class TestEngine(unittest.TestCase):
         self.run_engine(config_checklist, None, None, parsed_sysctl_options, None)
 
         # 4. check that the results are correct
-        result = [] # type: List
+        result = [] # type: ResultType
         self.get_engine_result(config_checklist, result, 'json')
         self.assertEqual(
                 result,
@@ -257,7 +260,7 @@ class TestEngine(unittest.TestCase):
                                 KconfigCheck('reason_12', 'decision_12', 'NAME_12', 'is not off'))]
 
         # 2. prepare the parsed kconfig options
-        parsed_kconfig_options = OrderedDict()
+        parsed_kconfig_options  = {}
         parsed_kconfig_options['CONFIG_NAME_1'] = 'expected_1'
         parsed_kconfig_options['CONFIG_NAME_2'] = 'UNexpected_2'
         parsed_kconfig_options['CONFIG_NAME_3'] = 'UNexpected_3'
@@ -271,7 +274,7 @@ class TestEngine(unittest.TestCase):
         self.run_engine(config_checklist, parsed_kconfig_options, None, None, None)
 
         # 4. check that the results are correct
-        result = [] # type: List
+        result = [] # type: ResultType
         self.get_engine_result(config_checklist, result, 'json')
         self.assertEqual(
                 result,
@@ -300,7 +303,7 @@ class TestEngine(unittest.TestCase):
                                  KconfigCheck('reason_12', 'decision_12', 'NAME_12', 'is not off'))]
 
         # 2. prepare the parsed kconfig options
-        parsed_kconfig_options = OrderedDict()
+        parsed_kconfig_options  = {}
         parsed_kconfig_options['CONFIG_NAME_1'] = 'expected_1'
         parsed_kconfig_options['CONFIG_NAME_2'] = 'expected_2'
         parsed_kconfig_options['CONFIG_NAME_3'] = 'expected_3'
@@ -316,7 +319,7 @@ class TestEngine(unittest.TestCase):
         self.run_engine(config_checklist, parsed_kconfig_options, None, None, None)
 
         # 4. check that the results are correct
-        result = [] # type: List
+        result = [] # type: ResultType
         self.get_engine_result(config_checklist, result, 'json')
         self.assertEqual(
                 result,
@@ -345,7 +348,7 @@ class TestEngine(unittest.TestCase):
                                      KconfigCheck('reason_12', 'decision_12', 'NAME_12', 'expected_12')))]
 
         # 2. prepare the parsed kconfig options
-        parsed_kconfig_options = OrderedDict()
+        parsed_kconfig_options  = {}
         parsed_kconfig_options['CONFIG_NAME_1'] = 'expected_1'
         parsed_kconfig_options['CONFIG_NAME_2'] = 'UNexpected_2'
         parsed_kconfig_options['CONFIG_NAME_3'] = 'expected_3'
@@ -363,7 +366,7 @@ class TestEngine(unittest.TestCase):
         self.run_engine(config_checklist, parsed_kconfig_options, None, None, None)
 
         # 4. check that the results are correct
-        result = [] # type: List
+        result = [] # type: ResultType
         self.get_engine_result(config_checklist, result, 'json')
         self.assertEqual(
                 result,
@@ -390,7 +393,7 @@ class TestEngine(unittest.TestCase):
                                  VersionCheck((42, 43, 45)))]
 
         # 2. prepare the parsed kconfig options
-        parsed_kconfig_options = OrderedDict()
+        parsed_kconfig_options  = {}
         parsed_kconfig_options['CONFIG_NAME_2'] = 'expected_2'
         parsed_kconfig_options['CONFIG_NAME_4'] = 'expected_4'
         parsed_kconfig_options['CONFIG_NAME_6'] = 'expected_6'
@@ -402,7 +405,7 @@ class TestEngine(unittest.TestCase):
         self.run_engine(config_checklist, parsed_kconfig_options, None, None, kernel_version)
 
         # 5. check that the results are correct
-        result = [] # type: List
+        result = [] # type: ResultType
         self.get_engine_result(config_checklist, result, 'json')
         self.assertEqual(
                 result,
@@ -425,23 +428,23 @@ class TestEngine(unittest.TestCase):
                                  SysctlCheck('reason_6', 'decision_6', 'name_6', 'expected_6'))]
 
         # 2. prepare the parsed kconfig options
-        parsed_kconfig_options = OrderedDict()
+        parsed_kconfig_options  = {}
         parsed_kconfig_options['CONFIG_NAME_1'] = 'UNexpected_1'
 
         # 3. prepare the parsed cmdline options
-        parsed_cmdline_options = OrderedDict()
+        parsed_cmdline_options  = {}
         parsed_cmdline_options['name_2'] = 'expected_2'
         parsed_cmdline_options['name_5'] = 'UNexpected_5'
 
         # 4. prepare the parsed sysctl options
-        parsed_sysctl_options = OrderedDict()
+        parsed_sysctl_options  = {}
         parsed_sysctl_options['name_6'] = 'expected_6'
 
         # 5. run the engine
         self.run_engine(config_checklist, parsed_kconfig_options, parsed_cmdline_options, parsed_sysctl_options, None)
 
         # 6. check that the results are correct
-        json_result = [] # type: List
+        json_result = [] # type: ResultType
         self.get_engine_result(config_checklist, json_result, 'json')
         self.assertEqual(
                 json_result,
@@ -449,7 +452,7 @@ class TestEngine(unittest.TestCase):
                  {'option_name': 'CONFIG_NAME_4', 'type': 'kconfig', 'desired_val': 'expected_4', 'decision': 'decision_4', 'reason': 'reason_4', 'check_result': 'FAIL: name_5 is not "expected_5"', 'check_result_bool': False}]
         )
 
-        stdout_result = [] # type: List
+        stdout_result = [] # type: ResultType
         self.get_engine_result(config_checklist, stdout_result, 'stdout')
         self.assertEqual(
                 stdout_result,
@@ -487,22 +490,22 @@ name_6                                  |sysctl | expected_6 |decision_6|     re
         config_checklist += [SysctlCheck('reason_3', 'decision_3', 'name_3', 'expected_3')]
 
         # 2. prepare the parsed kconfig options
-        parsed_kconfig_options = OrderedDict()
+        parsed_kconfig_options  = {}
         parsed_kconfig_options['CONFIG_NAME_1'] = 'expected_1_new'
 
         # 3. prepare the parsed cmdline options
-        parsed_cmdline_options = OrderedDict()
+        parsed_cmdline_options  = {}
         parsed_cmdline_options['name_2'] = 'expected_2_new'
 
         # 4. prepare the parsed sysctl options
-        parsed_sysctl_options = OrderedDict()
+        parsed_sysctl_options  = {}
         parsed_sysctl_options['name_3'] = 'expected_3_new'
 
         # 5. run the engine
         self.run_engine(config_checklist, parsed_kconfig_options, parsed_cmdline_options, parsed_sysctl_options, None)
 
         # 6. check that the results are correct
-        result = [] # type: List
+        result = [] # type: ResultType
         self.get_engine_result(config_checklist, result, 'json')
         self.assertEqual(
                 result,