diff options
Diffstat (limited to 'util/test_kconfig_check.py')
-rw-r--r-- | util/test_kconfig_check.py | 195 |
1 files changed, 120 insertions, 75 deletions
diff --git a/util/test_kconfig_check.py b/util/test_kconfig_check.py index cd1b9bf098..3e459006b1 100644 --- a/util/test_kconfig_check.py +++ b/util/test_kconfig_check.py @@ -1,4 +1,4 @@ -# Copyright 2021 The Chromium OS Authors. All rights reserved. +# Copyright 2021 The ChromiumOS Authors # Use of this source code is governed by a BSD-style license that can be # found in the LICENSE file. """Test for Kconfig checker""" @@ -16,7 +16,8 @@ import kconfig_check # Prefix that we strip from each Kconfig option, when considering whether it is # equivalent to a CONFIG option with the same name -PREFIX = 'PLATFORM_EC_' +PREFIX = "PLATFORM_EC_" + @contextlib.contextmanager def capture_sys_output(): @@ -39,38 +40,50 @@ def capture_sys_output(): # directly from Python. You can still run this test with 'pytest' if you like. class KconfigCheck(unittest.TestCase): """Tests for the KconfigCheck class""" + def test_simple_check(self): """Check it detected a new ad-hoc CONFIG""" checker = kconfig_check.KconfigCheck() - self.assertEqual(['NEW_ONE'], checker.find_new_adhoc( - configs=['NEW_ONE', 'OLD_ONE', 'IN_KCONFIG'], - kconfigs=['IN_KCONFIG'], - allowed=['OLD_ONE'])) + self.assertEqual( + ["NEW_ONE"], + checker.find_new_adhoc( + configs=["NEW_ONE", "OLD_ONE", "IN_KCONFIG"], + kconfigs=["IN_KCONFIG"], + allowed=["OLD_ONE"], + ), + ) def test_sorted_check(self): """Check it sorts the results in order""" checker = kconfig_check.KconfigCheck() self.assertSequenceEqual( - ['ANOTHER_NEW_ONE', 'NEW_ONE'], + ["ANOTHER_NEW_ONE", "NEW_ONE"], checker.find_new_adhoc( - configs=['NEW_ONE', 'ANOTHER_NEW_ONE', 'OLD_ONE', 'IN_KCONFIG'], - kconfigs=['IN_KCONFIG'], - allowed=['OLD_ONE'])) + configs=["NEW_ONE", "ANOTHER_NEW_ONE", "OLD_ONE", "IN_KCONFIG"], + kconfigs=["IN_KCONFIG"], + allowed=["OLD_ONE"], + ), + ) def check_read_configs(self, use_defines): + """Check that kconfigs can be read.""" checker = kconfig_check.KconfigCheck() with tempfile.NamedTemporaryFile() as configs: - with open(configs.name, 'w') as out: - prefix = '#define ' if use_defines else '' - suffix = ' ' if use_defines else '=' - out.write(f'''{prefix}CONFIG_OLD_ONE{suffix}y + with open(configs.name, "w") as out: + prefix = "#define " if use_defines else "" + suffix = " " if use_defines else "=" + out.write( + f"""{prefix}CONFIG_OLD_ONE{suffix}y {prefix}NOT_A_CONFIG{suffix} {prefix}CONFIG_STRING{suffix}"something" {prefix}CONFIG_INT{suffix}123 {prefix}CONFIG_HEX{suffix}45ab -''') - self.assertEqual(['OLD_ONE', 'STRING', 'INT', 'HEX'], - checker.read_configs(configs.name, use_defines)) +""" + ) + self.assertEqual( + ["OLD_ONE", "STRING", "INT", "HEX"], + checker.read_configs(configs.name, use_defines), + ) def test_read_configs(self): """Test KconfigCheck.read_configs()""" @@ -87,22 +100,24 @@ class KconfigCheck(unittest.TestCase): Args: srctree: Directory to write to """ - with open(os.path.join(srctree, 'Kconfig'), 'w') as out: - out.write(f'''config {PREFIX}MY_KCONFIG + with open(os.path.join(srctree, "Kconfig"), "w") as out: + out.write( + f"""config {PREFIX}MY_KCONFIG \tbool "my kconfig" rsource "subdir/Kconfig.wibble" -''') - subdir = os.path.join(srctree, 'subdir') +""" + ) + subdir = os.path.join(srctree, "subdir") os.mkdir(subdir) - with open(os.path.join(subdir, 'Kconfig.wibble'), 'w') as out: - out.write('menuconfig %sMENU_KCONFIG\n' % PREFIX) + with open(os.path.join(subdir, "Kconfig.wibble"), "w") as out: + out.write("menuconfig %sMENU_KCONFIG\n" % PREFIX) # Add a directory which should be ignored - bad_subdir = os.path.join(subdir, 'Kconfig') + bad_subdir = os.path.join(subdir, "Kconfig") os.mkdir(bad_subdir) - with open(os.path.join(bad_subdir, 'Kconfig.bad'), 'w') as out: - out.write('menuconfig %sBAD_KCONFIG' % PREFIX) + with open(os.path.join(bad_subdir, "Kconfig.bad"), "w") as out: + out.write("menuconfig %sBAD_KCONFIG" % PREFIX) def test_find_kconfigs(self): """Test KconfigCheck.find_kconfigs()""" @@ -110,20 +125,23 @@ rsource "subdir/Kconfig.wibble" with tempfile.TemporaryDirectory() as srctree: self.setup_srctree(srctree) files = checker.find_kconfigs(srctree) - fnames = [fname[len(srctree):] for fname in files] - self.assertEqual(['/Kconfig', '/subdir/Kconfig.wibble'], fnames) + fnames = [fname[len(srctree) :] for fname in files] + self.assertEqual(["/Kconfig", "/subdir/Kconfig.wibble"], fnames) def test_scan_kconfigs(self): """Test KconfigCheck.scan_configs()""" checker = kconfig_check.KconfigCheck() with tempfile.TemporaryDirectory() as srctree: self.setup_srctree(srctree) - self.assertEqual(['MENU_KCONFIG', 'MY_KCONFIG'], - checker.scan_kconfigs(srctree, PREFIX)) + self.assertEqual( + ["MENU_KCONFIG", "MY_KCONFIG"], + checker.scan_kconfigs(srctree, PREFIX), + ) @classmethod - def setup_allowed_and_configs(cls, allowed_fname, configs_fname, - add_new_one=True): + def setup_allowed_and_configs( + cls, allowed_fname, configs_fname, add_new_one=True + ): """Set up the 'allowed' and 'configs' files for tests Args: @@ -131,14 +149,14 @@ rsource "subdir/Kconfig.wibble" configs_fname: Filename to which CONFIGs to check should be written add_new_one: True to add CONFIG_NEW_ONE to the configs_fname file """ - with open(allowed_fname, 'w') as out: - out.write('CONFIG_OLD_ONE\n') - out.write('CONFIG_MENU_KCONFIG\n') - with open(configs_fname, 'w') as out: - to_add = ['CONFIG_OLD_ONE', 'CONFIG_MY_KCONFIG'] + with open(allowed_fname, "w") as out: + out.write("CONFIG_OLD_ONE\n") + out.write("CONFIG_MENU_KCONFIG\n") + with open(configs_fname, "w") as out: + to_add = ["CONFIG_OLD_ONE", "CONFIG_MY_KCONFIG"] if add_new_one: - to_add.append('CONFIG_NEW_ONE') - out.write('\n'.join(to_add)) + to_add.append("CONFIG_NEW_ONE") + out.write("\n".join(to_add)) def test_check_adhoc_configs(self): """Test KconfigCheck.check_adhoc_configs()""" @@ -148,12 +166,16 @@ rsource "subdir/Kconfig.wibble" with tempfile.NamedTemporaryFile() as allowed: with tempfile.NamedTemporaryFile() as configs: self.setup_allowed_and_configs(allowed.name, configs.name) - new_adhoc, unneeded_adhoc, updated_adhoc = ( - checker.check_adhoc_configs( - configs.name, srctree, allowed.name, PREFIX)) - self.assertEqual(['NEW_ONE'], new_adhoc) - self.assertEqual(['MENU_KCONFIG'], unneeded_adhoc) - self.assertEqual(['OLD_ONE'], updated_adhoc) + ( + new_adhoc, + unneeded_adhoc, + updated_adhoc, + ) = checker.check_adhoc_configs( + configs.name, srctree, allowed.name, PREFIX + ) + self.assertEqual(["NEW_ONE"], new_adhoc) + self.assertEqual(["MENU_KCONFIG"], unneeded_adhoc) + self.assertEqual(["OLD_ONE"], updated_adhoc) def test_check(self): """Test running the 'check' subcommand""" @@ -162,45 +184,57 @@ rsource "subdir/Kconfig.wibble" self.setup_srctree(srctree) with tempfile.NamedTemporaryFile() as allowed: with tempfile.NamedTemporaryFile() as configs: - self.setup_allowed_and_configs(allowed.name, - configs.name) + self.setup_allowed_and_configs( + allowed.name, configs.name + ) ret_code = kconfig_check.main( - ['-c', configs.name, '-s', srctree, - '-a', allowed.name, '-p', PREFIX, 'check']) + [ + "-c", + configs.name, + "-s", + srctree, + "-a", + allowed.name, + "-p", + PREFIX, + "check", + ] + ) self.assertEqual(1, ret_code) - self.assertEqual('', stdout.getvalue()) - found = re.findall('(CONFIG_.*)', stderr.getvalue()) - self.assertEqual(['CONFIG_NEW_ONE'], found) + self.assertEqual("", stdout.getvalue()) + found = re.findall("(CONFIG_.*)", stderr.getvalue()) + self.assertEqual(["CONFIG_NEW_ONE"], found) def test_real_kconfig(self): """Same Kconfig should be returned for kconfiglib / adhoc""" if not kconfig_check.USE_KCONFIGLIB: - self.skipTest('No kconfiglib available') - zephyr_path = pathlib.Path('../../third_party/zephyr/main').resolve() + self.fail("No kconfiglib available") + zephyr_path = pathlib.Path( + "../../../src/third_party/zephyr/main" + ).resolve() if not zephyr_path.exists(): - self.skipTest('No zephyr tree available') + self.fail("No zephyr tree available") + os.environ["ZEPHYR_BASE"] = str(zephyr_path) checker = kconfig_check.KconfigCheck() - srcdir = 'zephyr' + srcdir = "zephyr" search_paths = [zephyr_path] kc_version = checker.scan_kconfigs( - srcdir, search_paths=search_paths, try_kconfiglib=True) + srcdir, search_paths=search_paths, try_kconfiglib=True + ) adhoc_version = checker.scan_kconfigs(srcdir, try_kconfiglib=False) # List of things missing from the Kconfig missing = sorted(list(set(adhoc_version) - set(kc_version))) - # The Kconfig is disjoint in some places, e.g. the boards have their - # own Kconfig files which are not included from the main Kconfig - missing = [item for item in missing - if not item.startswith('BOARD') and - not item.startswith('VARIANT')] - - # Similarly, some other items are defined in files that are not included + # Some items are defined in files that are not included # in all cases, only for particular values of $(ARCH) self.assertEqual( - ['FLASH_LOAD_OFFSET', 'NPCX_HEADER', 'SYS_CLOCK_HW_CYCLES_PER_SEC'], - missing) + [ + "TRAP_UNALIGNED_ACCESS", + ], + missing, + ) def test_check_unneeded(self): """Test running the 'check' subcommand with unneeded ad-hoc configs""" @@ -209,18 +243,29 @@ rsource "subdir/Kconfig.wibble" self.setup_srctree(srctree) with tempfile.NamedTemporaryFile() as allowed: with tempfile.NamedTemporaryFile() as configs: - self.setup_allowed_and_configs(allowed.name, - configs.name, False) + self.setup_allowed_and_configs( + allowed.name, configs.name, False + ) ret_code = kconfig_check.main( - ['-c', configs.name, '-s', srctree, - '-a', allowed.name, '-p', PREFIX, 'check']) + [ + "-c", + configs.name, + "-s", + srctree, + "-a", + allowed.name, + "-p", + PREFIX, + "check", + ] + ) self.assertEqual(1, ret_code) - self.assertEqual('', stderr.getvalue()) - found = re.findall('(CONFIG_.*)', stdout.getvalue()) - self.assertEqual(['CONFIG_MENU_KCONFIG'], found) + self.assertEqual("", stderr.getvalue()) + found = re.findall("(CONFIG_.*)", stdout.getvalue()) + self.assertEqual(["CONFIG_MENU_KCONFIG"], found) allowed = kconfig_check.NEW_ALLOWED_FNAME.read_text().splitlines() - self.assertEqual(['CONFIG_OLD_ONE'], allowed) + self.assertEqual(["CONFIG_OLD_ONE"], allowed) -if __name__ == '__main__': +if __name__ == "__main__": unittest.main() |