From 02d2b95e6ed2efaf92b477dda4441bccd69b2ebe Mon Sep 17 00:00:00 2001 From: Adrian Freihofer Date: Mon, 10 Mar 2025 10:35:47 +0100 Subject: oe-selftest: fitimage sort tests This is a trivial refactoring. The goal is to have all tests for kernel-fitimage.bbclass and all tests for uboot-sign.bbclass together. This refactoring greatly simplifies the diff of the next commit. (From OE-Core rev: 638abab58b653a1fb120368bd5e30bc80478757c) Signed-off-by: Adrian Freihofer Signed-off-by: Richard Purdie --- meta/lib/oeqa/selftest/cases/fitimage.py | 262 +++++++++++++++---------------- 1 file changed, 129 insertions(+), 133 deletions(-) (limited to 'meta') diff --git a/meta/lib/oeqa/selftest/cases/fitimage.py b/meta/lib/oeqa/selftest/cases/fitimage.py index dd177e0b04..00769443e8 100644 --- a/meta/lib/oeqa/selftest/cases/fitimage.py +++ b/meta/lib/oeqa/selftest/cases/fitimage.py @@ -168,7 +168,6 @@ FIT_DESC = "A model description" dumpimage_result = self._run_dumpimage(fitimage_path, uboot_tools_bindir) self._verify_fitimage_uboot_env(dumpimage_result) - def test_sign_fit_image(self): """ Summary: Check if FIT image and Image Tree Source (its) are created @@ -314,6 +313,135 @@ UBOOT_MKIMAGE_SIGN_ARGS = "-c '%s'" self._verify_fit_image_signature(uboot_tools_bindir, fitimage_path, os.path.join(bb_vars['DEPLOY_DIR_IMAGE'], dtb), 'conf-' + dtb) + def test_initramfs_bundle(self): + """ + Summary: Verifies the content of the initramfs bundle node in the FIT Image Tree Source (its) + The FIT settings are set by the test case. + The machine used is beaglebone-yocto. + Expected: 1. The ITS is generated with initramfs bundle support + 2. All the fields in the kernel node are as expected (matching the + conf settings) + 3. The kernel is included in all the available configurations and + its hash is included in the configuration signature + + Product: oe-core + Author: Abdellatif El Khlifi + """ + + config = """ +DISTRO="poky" +MACHINE = "beaglebone-yocto" +INITRAMFS_IMAGE_BUNDLE = "1" +INITRAMFS_IMAGE = "core-image-minimal-initramfs" +INITRAMFS_SCRIPTS = "" +UBOOT_MACHINE = "am335x_evm_defconfig" +KERNEL_CLASSES = " kernel-fitimage " +KERNEL_IMAGETYPES = "fitImage" +UBOOT_SIGN_ENABLE = "1" +UBOOT_SIGN_KEYNAME = "beaglebonekey" +UBOOT_SIGN_KEYDIR ?= "${DEPLOY_DIR_IMAGE}" +UBOOT_DTB_BINARY = "u-boot.dtb" +UBOOT_ENTRYPOINT = "0x80000000" +UBOOT_LOADADDRESS = "0x80000000" +UBOOT_DTB_LOADADDRESS = "0x82000000" +UBOOT_ARCH = "arm" +UBOOT_MKIMAGE_DTCOPTS = "-I dts -O dtb -p 2000" +UBOOT_MKIMAGE_KERNEL_TYPE = "kernel" +UBOOT_EXTLINUX = "0" +FIT_GENERATE_KEYS = "1" +KERNEL_IMAGETYPE_REPLACEMENT = "zImage" +FIT_KERNEL_COMP_ALG = "none" +FIT_HASH_ALG = "sha256" +""" + config = self._config_add_uboot_env(config) + self.write_config(config) + + # fitImage is created as part of linux recipe + bitbake("virtual/kernel") + + bb_vars = get_bb_vars([ + 'DEPLOY_DIR_IMAGE', + 'FIT_HASH_ALG', + 'FIT_KERNEL_COMP_ALG', + 'INITRAMFS_IMAGE', + 'MACHINE', + 'UBOOT_ARCH', + 'UBOOT_ENTRYPOINT', + 'UBOOT_LOADADDRESS', + 'UBOOT_MKIMAGE_KERNEL_TYPE' + ], + 'virtual/kernel') + fitimage_its_path = os.path.join(bb_vars['DEPLOY_DIR_IMAGE'], + "fitImage-its-%s-%s-%s" % (bb_vars['INITRAMFS_IMAGE'], bb_vars['MACHINE'], bb_vars['MACHINE'])) + fitimage_path = os.path.join(bb_vars['DEPLOY_DIR_IMAGE'],"fitImage") + + self.assertExists(fitimage_its_path, "%s image tree source doesn't exist" % (fitimage_its_path)) + self.assertExists(fitimage_path, "%s FIT image doesn't exist" % (fitimage_path)) + + its_file = open(fitimage_its_path) + + its_lines = [line.strip() for line in its_file.readlines()] + + exp_node_lines = [ + 'kernel-1 {', + 'description = "Linux kernel";', + 'data = /incbin/("linux.bin");', + 'type = "' + str(bb_vars['UBOOT_MKIMAGE_KERNEL_TYPE']) + '";', + 'arch = "' + str(bb_vars['UBOOT_ARCH']) + '";', + 'os = "linux";', + 'compression = "' + str(bb_vars['FIT_KERNEL_COMP_ALG']) + '";', + 'load = <' + str(bb_vars['UBOOT_LOADADDRESS']) + '>;', + 'entry = <' + str(bb_vars['UBOOT_ENTRYPOINT']) + '>;', + 'hash-1 {', + 'algo = "' + str(bb_vars['FIT_HASH_ALG']) +'";', + '};', + '};' + ] + + node_str = exp_node_lines[0] + + print ("checking kernel node\n") + self.assertIn(node_str, its_lines) + + node_start_idx = its_lines.index(node_str) + node = its_lines[node_start_idx:(node_start_idx + len(exp_node_lines))] + + # Remove the absolute path. This refers to WORKDIR which is not always predictable. + re_data = re.compile(r'^data = /incbin/\(.*/linux\.bin"\);$') + node = [re.sub(re_data, 'data = /incbin/("linux.bin");', cfg_str) for cfg_str in node] + + self.assertEqual(node, exp_node_lines, "kernel node does not match expectation") + + rx_configs = re.compile("^conf-.*") + its_configs = list(filter(rx_configs.match, its_lines)) + + for cfg_str in its_configs: + cfg_start_idx = its_lines.index(cfg_str) + line_idx = cfg_start_idx + 2 + node_end = False + while node_end == False: + if its_lines[line_idx] == "};" and its_lines[line_idx-1] == "};" : + node_end = True + line_idx = line_idx + 1 + + node = its_lines[cfg_start_idx:line_idx] + print("checking configuration " + cfg_str.rstrip(" {")) + rx_desc_line = re.compile(r'^description = ".*Linux kernel.*') + self.assertEqual(len(list(filter(rx_desc_line.match, node))), 1, "kernel keyword not found in the description line") + + self.assertIn('kernel = "kernel-1";', node) + + rx_sign_line = re.compile(r'^sign-images = .*kernel.*') + self.assertEqual(len(list(filter(rx_sign_line.match, node))), 1, "kernel hash not signed") + + # Verify the signature + uboot_tools_bindir = self._setup_uboot_tools_native() + self._verify_fit_image_signature(uboot_tools_bindir, fitimage_path, os.path.join(bb_vars['DEPLOY_DIR_IMAGE'], 'am335x-bone.dtb')) + + # Check if the u-boot boot.scr script is in the fitImage + dumpimage_result = self._run_dumpimage(fitimage_path, uboot_tools_bindir) + self._verify_fitimage_uboot_env(dumpimage_result) + def test_uboot_fit_image(self): """ Summary: Check if Uboot FIT image and Image Tree Source @@ -522,7 +650,6 @@ UBOOT_FIT_HASH_ALG = "sha256" self._verify_fit_image_signature(uboot_tools_bindir, fitimage_path, os.path.join(deploy_dir_image, 'u-boot-spl.dtb')) - def test_sign_cascaded_uboot_fit_image(self): """ Summary: Check if U-Boot FIT image and Image Tree Source (its) are @@ -667,137 +794,6 @@ FIT_SIGN_INDIVIDUAL = "1" self._verify_fit_image_signature(uboot_tools_bindir, fitimage_path, os.path.join(deploy_dir_image, 'u-boot-spl.dtb')) - - def test_initramfs_bundle(self): - """ - Summary: Verifies the content of the initramfs bundle node in the FIT Image Tree Source (its) - The FIT settings are set by the test case. - The machine used is beaglebone-yocto. - Expected: 1. The ITS is generated with initramfs bundle support - 2. All the fields in the kernel node are as expected (matching the - conf settings) - 3. The kernel is included in all the available configurations and - its hash is included in the configuration signature - - Product: oe-core - Author: Abdellatif El Khlifi - """ - - config = """ -DISTRO="poky" -MACHINE = "beaglebone-yocto" -INITRAMFS_IMAGE_BUNDLE = "1" -INITRAMFS_IMAGE = "core-image-minimal-initramfs" -INITRAMFS_SCRIPTS = "" -UBOOT_MACHINE = "am335x_evm_defconfig" -KERNEL_CLASSES = " kernel-fitimage " -KERNEL_IMAGETYPES = "fitImage" -UBOOT_SIGN_ENABLE = "1" -UBOOT_SIGN_KEYNAME = "beaglebonekey" -UBOOT_SIGN_KEYDIR ?= "${DEPLOY_DIR_IMAGE}" -UBOOT_DTB_BINARY = "u-boot.dtb" -UBOOT_ENTRYPOINT = "0x80000000" -UBOOT_LOADADDRESS = "0x80000000" -UBOOT_DTB_LOADADDRESS = "0x82000000" -UBOOT_ARCH = "arm" -UBOOT_MKIMAGE_DTCOPTS = "-I dts -O dtb -p 2000" -UBOOT_MKIMAGE_KERNEL_TYPE = "kernel" -UBOOT_EXTLINUX = "0" -FIT_GENERATE_KEYS = "1" -KERNEL_IMAGETYPE_REPLACEMENT = "zImage" -FIT_KERNEL_COMP_ALG = "none" -FIT_HASH_ALG = "sha256" -""" - config = self._config_add_uboot_env(config) - self.write_config(config) - - # fitImage is created as part of linux recipe - bitbake("virtual/kernel") - - bb_vars = get_bb_vars([ - 'DEPLOY_DIR_IMAGE', - 'FIT_HASH_ALG', - 'FIT_KERNEL_COMP_ALG', - 'INITRAMFS_IMAGE', - 'MACHINE', - 'UBOOT_ARCH', - 'UBOOT_ENTRYPOINT', - 'UBOOT_LOADADDRESS', - 'UBOOT_MKIMAGE_KERNEL_TYPE' - ], - 'virtual/kernel') - fitimage_its_path = os.path.join(bb_vars['DEPLOY_DIR_IMAGE'], - "fitImage-its-%s-%s-%s" % (bb_vars['INITRAMFS_IMAGE'], bb_vars['MACHINE'], bb_vars['MACHINE'])) - fitimage_path = os.path.join(bb_vars['DEPLOY_DIR_IMAGE'],"fitImage") - - self.assertExists(fitimage_its_path, "%s image tree source doesn't exist" % (fitimage_its_path)) - self.assertExists(fitimage_path, "%s FIT image doesn't exist" % (fitimage_path)) - - its_file = open(fitimage_its_path) - - its_lines = [line.strip() for line in its_file.readlines()] - - exp_node_lines = [ - 'kernel-1 {', - 'description = "Linux kernel";', - 'data = /incbin/("linux.bin");', - 'type = "' + str(bb_vars['UBOOT_MKIMAGE_KERNEL_TYPE']) + '";', - 'arch = "' + str(bb_vars['UBOOT_ARCH']) + '";', - 'os = "linux";', - 'compression = "' + str(bb_vars['FIT_KERNEL_COMP_ALG']) + '";', - 'load = <' + str(bb_vars['UBOOT_LOADADDRESS']) + '>;', - 'entry = <' + str(bb_vars['UBOOT_ENTRYPOINT']) + '>;', - 'hash-1 {', - 'algo = "' + str(bb_vars['FIT_HASH_ALG']) +'";', - '};', - '};' - ] - - node_str = exp_node_lines[0] - - print ("checking kernel node\n") - self.assertIn(node_str, its_lines) - - node_start_idx = its_lines.index(node_str) - node = its_lines[node_start_idx:(node_start_idx + len(exp_node_lines))] - - # Remove the absolute path. This refers to WORKDIR which is not always predictable. - re_data = re.compile(r'^data = /incbin/\(.*/linux\.bin"\);$') - node = [re.sub(re_data, 'data = /incbin/("linux.bin");', cfg_str) for cfg_str in node] - - self.assertEqual(node, exp_node_lines, "kernel node does not match expectation") - - rx_configs = re.compile("^conf-.*") - its_configs = list(filter(rx_configs.match, its_lines)) - - for cfg_str in its_configs: - cfg_start_idx = its_lines.index(cfg_str) - line_idx = cfg_start_idx + 2 - node_end = False - while node_end == False: - if its_lines[line_idx] == "};" and its_lines[line_idx-1] == "};" : - node_end = True - line_idx = line_idx + 1 - - node = its_lines[cfg_start_idx:line_idx] - print("checking configuration " + cfg_str.rstrip(" {")) - rx_desc_line = re.compile(r'^description = ".*Linux kernel.*') - self.assertEqual(len(list(filter(rx_desc_line.match, node))), 1, "kernel keyword not found in the description line") - - self.assertIn('kernel = "kernel-1";', node) - - rx_sign_line = re.compile(r'^sign-images = .*kernel.*') - self.assertEqual(len(list(filter(rx_sign_line.match, node))), 1, "kernel hash not signed") - - # Verify the signature - uboot_tools_bindir = self._setup_uboot_tools_native() - self._verify_fit_image_signature(uboot_tools_bindir, fitimage_path, os.path.join(bb_vars['DEPLOY_DIR_IMAGE'], 'am335x-bone.dtb')) - - # Check if the u-boot boot.scr script is in the fitImage - dumpimage_result = self._run_dumpimage(fitimage_path, uboot_tools_bindir) - self._verify_fitimage_uboot_env(dumpimage_result) - - def test_uboot_atf_tee_fit_image(self): """ Summary: Check if U-boot FIT image and Image Tree Source -- cgit v1.2.3-54-g00ecf