kunit: tool: move Kconfig read_from_file/parse_from_string to package-level
authorDaniel Latypov <dlatypov@google.com>
Sat, 6 Nov 2021 01:30:57 +0000 (18:30 -0700)
committerShuah Khan <skhan@linuxfoundation.org>
Mon, 13 Dec 2021 20:53:30 +0000 (13:53 -0700)
read_from_file() clears its `self` Kconfig object and parses a config
file.

It is a way to construct Kconfig objects more so than an operation on
Kconfig objects. This is reflected in the fact its only ever used as:
  kconfig = kunit_config.Kconfig()
  kconfig.read_from_file(path)

So clean this up and simplify callers by replacing it with
  kconfig = kunit_config.parse_file(path)

Do the same thing for the related parse_from_string() function as well.

Signed-off-by: Daniel Latypov <dlatypov@google.com>
Reviewed-by: David Gow <davidgow@google.com>
Reviewed-by: Brendan Higgins <brendanhiggins@google.com>
Signed-off-by: Shuah Khan <skhan@linuxfoundation.org>
tools/testing/kunit/kunit_config.py
tools/testing/kunit/kunit_kernel.py
tools/testing/kunit/kunit_tool_test.py

index c77c7d2ef62208795d347612b2afd8b9b3bf6b48..677354546156aa2ee09d90945be5ef2032011712 100644 (file)
@@ -62,33 +62,34 @@ class Kconfig(object):
                        for entry in self.entries():
                                f.write(str(entry) + '\n')
 
-       def parse_from_string(self, blob: str) -> None:
-               """Parses a string containing KconfigEntrys and populates this Kconfig."""
-               self._entries = []
-               is_not_set_matcher = re.compile(CONFIG_IS_NOT_SET_PATTERN)
-               config_matcher = re.compile(CONFIG_PATTERN)
-               for line in blob.split('\n'):
-                       line = line.strip()
-                       if not line:
-                               continue
-
-                       match = config_matcher.match(line)
-                       if match:
-                               entry = KconfigEntry(match.group(1), match.group(2))
-                               self.add_entry(entry)
-                               continue
-
-                       empty_match = is_not_set_matcher.match(line)
-                       if empty_match:
-                               entry = KconfigEntry(empty_match.group(1), 'n')
-                               self.add_entry(entry)
-                               continue
-
-                       if line[0] == '#':
-                               continue
-                       else:
-                               raise KconfigParseError('Failed to parse: ' + line)
-
-       def read_from_file(self, path: str) -> None:
-               with open(path, 'r') as f:
-                       self.parse_from_string(f.read())
+def parse_file(path: str) -> Kconfig:
+       with open(path, 'r') as f:
+               return parse_from_string(f.read())
+
+def parse_from_string(blob: str) -> Kconfig:
+       """Parses a string containing Kconfig entries."""
+       kconfig = Kconfig()
+       is_not_set_matcher = re.compile(CONFIG_IS_NOT_SET_PATTERN)
+       config_matcher = re.compile(CONFIG_PATTERN)
+       for line in blob.split('\n'):
+               line = line.strip()
+               if not line:
+                       continue
+
+               match = config_matcher.match(line)
+               if match:
+                       entry = KconfigEntry(match.group(1), match.group(2))
+                       kconfig.add_entry(entry)
+                       continue
+
+               empty_match = is_not_set_matcher.match(line)
+               if empty_match:
+                       entry = KconfigEntry(empty_match.group(1), 'n')
+                       kconfig.add_entry(entry)
+                       continue
+
+               if line[0] == '#':
+                       continue
+               else:
+                       raise KconfigParseError('Failed to parse: ' + line)
+       return kconfig
index 66095568bf327eb65045019a676c4ab3257d518f..51ee6e5dae91681cbeb9ec46461e7affe25974e2 100644 (file)
@@ -116,8 +116,7 @@ class LinuxSourceTreeOperationsQemu(LinuxSourceTreeOperations):
                self._extra_qemu_params = qemu_arch_params.extra_qemu_params
 
        def make_arch_qemuconfig(self, base_kunitconfig: kunit_config.Kconfig) -> None:
-               kconfig = kunit_config.Kconfig()
-               kconfig.parse_from_string(self._kconfig)
+               kconfig = kunit_config.parse_from_string(self._kconfig)
                base_kunitconfig.merge_in_entries(kconfig)
 
        def start(self, params: List[str], build_dir: str) -> subprocess.Popen:
@@ -249,8 +248,7 @@ class LinuxSourceTree(object):
                        if not os.path.exists(kunitconfig_path):
                                shutil.copyfile(DEFAULT_KUNITCONFIG_PATH, kunitconfig_path)
 
-               self._kconfig = kunit_config.Kconfig()
-               self._kconfig.read_from_file(kunitconfig_path)
+               self._kconfig = kunit_config.parse_file(kunitconfig_path)
 
        def clean(self) -> bool:
                try:
@@ -262,8 +260,7 @@ class LinuxSourceTree(object):
 
        def validate_config(self, build_dir) -> bool:
                kconfig_path = get_kconfig_path(build_dir)
-               validated_kconfig = kunit_config.Kconfig()
-               validated_kconfig.read_from_file(kconfig_path)
+               validated_kconfig = kunit_config.parse_file(kconfig_path)
                if not self._kconfig.is_subset_of(validated_kconfig):
                        invalid = self._kconfig.entries() - validated_kconfig.entries()
                        message = 'Provided Kconfig is not contained in validated .config. Following fields found in kunitconfig, ' \
@@ -291,8 +288,7 @@ class LinuxSourceTree(object):
                """Creates a new .config if it is not a subset of the .kunitconfig."""
                kconfig_path = get_kconfig_path(build_dir)
                if os.path.exists(kconfig_path):
-                       existing_kconfig = kunit_config.Kconfig()
-                       existing_kconfig.read_from_file(kconfig_path)
+                       existing_kconfig = kunit_config.parse_file(kconfig_path)
                        self._ops.make_arch_qemuconfig(self._kconfig)
                        if not self._kconfig.is_subset_of(existing_kconfig):
                                print('Regenerating .config ...')
index 2d4d9d2713f986df4b12542cf760c83a7857e828..d125d2380b3834385c8e2c4eb8ab16baa0f4e79a 100755 (executable)
@@ -51,10 +51,9 @@ class KconfigTest(unittest.TestCase):
                self.assertFalse(kconfig1.is_subset_of(kconfig0))
 
        def test_read_from_file(self):
-               kconfig = kunit_config.Kconfig()
                kconfig_path = test_data_path('test_read_from_file.kconfig')
 
-               kconfig.read_from_file(kconfig_path)
+               kconfig = kunit_config.parse_file(kconfig_path)
 
                expected_kconfig = kunit_config.Kconfig()
                expected_kconfig.add_entry(
@@ -87,8 +86,7 @@ class KconfigTest(unittest.TestCase):
 
                expected_kconfig.write_to_file(kconfig_path)
 
-               actual_kconfig = kunit_config.Kconfig()
-               actual_kconfig.read_from_file(kconfig_path)
+               actual_kconfig = kunit_config.parse_file(kconfig_path)
 
                self.assertEqual(actual_kconfig.entries(),
                                 expected_kconfig.entries())