diff options
author | Adrian Freihofer <adrian.freihofer@gmail.com> | 2025-03-10 10:35:47 +0100 |
---|---|---|
committer | Richard Purdie <richard.purdie@linuxfoundation.org> | 2025-03-11 11:20:34 +0000 |
commit | 02d2b95e6ed2efaf92b477dda4441bccd69b2ebe (patch) | |
tree | 46ce834e2e6b7adde7d84a6de358fb5ec6a9cc0d | |
parent | c93f487dc4ff2e39ae6daca190d78ac1c3fa4b29 (diff) | |
download | poky-02d2b95e6ed2efaf92b477dda4441bccd69b2ebe.tar.gz |
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 <adrian.freihofer@siemens.com>
Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
-rw-r--r-- | meta/lib/oeqa/selftest/cases/fitimage.py | 262 |
1 files changed, 129 insertions, 133 deletions
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" | |||
168 | dumpimage_result = self._run_dumpimage(fitimage_path, uboot_tools_bindir) | 168 | dumpimage_result = self._run_dumpimage(fitimage_path, uboot_tools_bindir) |
169 | self._verify_fitimage_uboot_env(dumpimage_result) | 169 | self._verify_fitimage_uboot_env(dumpimage_result) |
170 | 170 | ||
171 | |||
172 | def test_sign_fit_image(self): | 171 | def test_sign_fit_image(self): |
173 | """ | 172 | """ |
174 | Summary: Check if FIT image and Image Tree Source (its) are created | 173 | Summary: Check if FIT image and Image Tree Source (its) are created |
@@ -314,6 +313,135 @@ UBOOT_MKIMAGE_SIGN_ARGS = "-c '%s'" | |||
314 | self._verify_fit_image_signature(uboot_tools_bindir, fitimage_path, | 313 | self._verify_fit_image_signature(uboot_tools_bindir, fitimage_path, |
315 | os.path.join(bb_vars['DEPLOY_DIR_IMAGE'], dtb), 'conf-' + dtb) | 314 | os.path.join(bb_vars['DEPLOY_DIR_IMAGE'], dtb), 'conf-' + dtb) |
316 | 315 | ||
316 | def test_initramfs_bundle(self): | ||
317 | """ | ||
318 | Summary: Verifies the content of the initramfs bundle node in the FIT Image Tree Source (its) | ||
319 | The FIT settings are set by the test case. | ||
320 | The machine used is beaglebone-yocto. | ||
321 | Expected: 1. The ITS is generated with initramfs bundle support | ||
322 | 2. All the fields in the kernel node are as expected (matching the | ||
323 | conf settings) | ||
324 | 3. The kernel is included in all the available configurations and | ||
325 | its hash is included in the configuration signature | ||
326 | |||
327 | Product: oe-core | ||
328 | Author: Abdellatif El Khlifi <abdellatif.elkhlifi@arm.com> | ||
329 | """ | ||
330 | |||
331 | config = """ | ||
332 | DISTRO="poky" | ||
333 | MACHINE = "beaglebone-yocto" | ||
334 | INITRAMFS_IMAGE_BUNDLE = "1" | ||
335 | INITRAMFS_IMAGE = "core-image-minimal-initramfs" | ||
336 | INITRAMFS_SCRIPTS = "" | ||
337 | UBOOT_MACHINE = "am335x_evm_defconfig" | ||
338 | KERNEL_CLASSES = " kernel-fitimage " | ||
339 | KERNEL_IMAGETYPES = "fitImage" | ||
340 | UBOOT_SIGN_ENABLE = "1" | ||
341 | UBOOT_SIGN_KEYNAME = "beaglebonekey" | ||
342 | UBOOT_SIGN_KEYDIR ?= "${DEPLOY_DIR_IMAGE}" | ||
343 | UBOOT_DTB_BINARY = "u-boot.dtb" | ||
344 | UBOOT_ENTRYPOINT = "0x80000000" | ||
345 | UBOOT_LOADADDRESS = "0x80000000" | ||
346 | UBOOT_DTB_LOADADDRESS = "0x82000000" | ||
347 | UBOOT_ARCH = "arm" | ||
348 | UBOOT_MKIMAGE_DTCOPTS = "-I dts -O dtb -p 2000" | ||
349 | UBOOT_MKIMAGE_KERNEL_TYPE = "kernel" | ||
350 | UBOOT_EXTLINUX = "0" | ||
351 | FIT_GENERATE_KEYS = "1" | ||
352 | KERNEL_IMAGETYPE_REPLACEMENT = "zImage" | ||
353 | FIT_KERNEL_COMP_ALG = "none" | ||
354 | FIT_HASH_ALG = "sha256" | ||
355 | """ | ||
356 | config = self._config_add_uboot_env(config) | ||
357 | self.write_config(config) | ||
358 | |||
359 | # fitImage is created as part of linux recipe | ||
360 | bitbake("virtual/kernel") | ||
361 | |||
362 | bb_vars = get_bb_vars([ | ||
363 | 'DEPLOY_DIR_IMAGE', | ||
364 | 'FIT_HASH_ALG', | ||
365 | 'FIT_KERNEL_COMP_ALG', | ||
366 | 'INITRAMFS_IMAGE', | ||
367 | 'MACHINE', | ||
368 | 'UBOOT_ARCH', | ||
369 | 'UBOOT_ENTRYPOINT', | ||
370 | 'UBOOT_LOADADDRESS', | ||
371 | 'UBOOT_MKIMAGE_KERNEL_TYPE' | ||
372 | ], | ||
373 | 'virtual/kernel') | ||
374 | fitimage_its_path = os.path.join(bb_vars['DEPLOY_DIR_IMAGE'], | ||
375 | "fitImage-its-%s-%s-%s" % (bb_vars['INITRAMFS_IMAGE'], bb_vars['MACHINE'], bb_vars['MACHINE'])) | ||
376 | fitimage_path = os.path.join(bb_vars['DEPLOY_DIR_IMAGE'],"fitImage") | ||
377 | |||
378 | self.assertExists(fitimage_its_path, "%s image tree source doesn't exist" % (fitimage_its_path)) | ||
379 | self.assertExists(fitimage_path, "%s FIT image doesn't exist" % (fitimage_path)) | ||
380 | |||
381 | its_file = open(fitimage_its_path) | ||
382 | |||
383 | its_lines = [line.strip() for line in its_file.readlines()] | ||
384 | |||
385 | exp_node_lines = [ | ||
386 | 'kernel-1 {', | ||
387 | 'description = "Linux kernel";', | ||
388 | 'data = /incbin/("linux.bin");', | ||
389 | 'type = "' + str(bb_vars['UBOOT_MKIMAGE_KERNEL_TYPE']) + '";', | ||
390 | 'arch = "' + str(bb_vars['UBOOT_ARCH']) + '";', | ||
391 | 'os = "linux";', | ||
392 | 'compression = "' + str(bb_vars['FIT_KERNEL_COMP_ALG']) + '";', | ||
393 | 'load = <' + str(bb_vars['UBOOT_LOADADDRESS']) + '>;', | ||
394 | 'entry = <' + str(bb_vars['UBOOT_ENTRYPOINT']) + '>;', | ||
395 | 'hash-1 {', | ||
396 | 'algo = "' + str(bb_vars['FIT_HASH_ALG']) +'";', | ||
397 | '};', | ||
398 | '};' | ||
399 | ] | ||
400 | |||
401 | node_str = exp_node_lines[0] | ||
402 | |||
403 | print ("checking kernel node\n") | ||
404 | self.assertIn(node_str, its_lines) | ||
405 | |||
406 | node_start_idx = its_lines.index(node_str) | ||
407 | node = its_lines[node_start_idx:(node_start_idx + len(exp_node_lines))] | ||
408 | |||
409 | # Remove the absolute path. This refers to WORKDIR which is not always predictable. | ||
410 | re_data = re.compile(r'^data = /incbin/\(.*/linux\.bin"\);$') | ||
411 | node = [re.sub(re_data, 'data = /incbin/("linux.bin");', cfg_str) for cfg_str in node] | ||
412 | |||
413 | self.assertEqual(node, exp_node_lines, "kernel node does not match expectation") | ||
414 | |||
415 | rx_configs = re.compile("^conf-.*") | ||
416 | its_configs = list(filter(rx_configs.match, its_lines)) | ||
417 | |||
418 | for cfg_str in its_configs: | ||
419 | cfg_start_idx = its_lines.index(cfg_str) | ||
420 | line_idx = cfg_start_idx + 2 | ||
421 | node_end = False | ||
422 | while node_end == False: | ||
423 | if its_lines[line_idx] == "};" and its_lines[line_idx-1] == "};" : | ||
424 | node_end = True | ||
425 | line_idx = line_idx + 1 | ||
426 | |||
427 | node = its_lines[cfg_start_idx:line_idx] | ||
428 | print("checking configuration " + cfg_str.rstrip(" {")) | ||
429 | rx_desc_line = re.compile(r'^description = ".*Linux kernel.*') | ||
430 | self.assertEqual(len(list(filter(rx_desc_line.match, node))), 1, "kernel keyword not found in the description line") | ||
431 | |||
432 | self.assertIn('kernel = "kernel-1";', node) | ||
433 | |||
434 | rx_sign_line = re.compile(r'^sign-images = .*kernel.*') | ||
435 | self.assertEqual(len(list(filter(rx_sign_line.match, node))), 1, "kernel hash not signed") | ||
436 | |||
437 | # Verify the signature | ||
438 | uboot_tools_bindir = self._setup_uboot_tools_native() | ||
439 | self._verify_fit_image_signature(uboot_tools_bindir, fitimage_path, os.path.join(bb_vars['DEPLOY_DIR_IMAGE'], 'am335x-bone.dtb')) | ||
440 | |||
441 | # Check if the u-boot boot.scr script is in the fitImage | ||
442 | dumpimage_result = self._run_dumpimage(fitimage_path, uboot_tools_bindir) | ||
443 | self._verify_fitimage_uboot_env(dumpimage_result) | ||
444 | |||
317 | def test_uboot_fit_image(self): | 445 | def test_uboot_fit_image(self): |
318 | """ | 446 | """ |
319 | Summary: Check if Uboot FIT image and Image Tree Source | 447 | Summary: Check if Uboot FIT image and Image Tree Source |
@@ -522,7 +650,6 @@ UBOOT_FIT_HASH_ALG = "sha256" | |||
522 | self._verify_fit_image_signature(uboot_tools_bindir, fitimage_path, | 650 | self._verify_fit_image_signature(uboot_tools_bindir, fitimage_path, |
523 | os.path.join(deploy_dir_image, 'u-boot-spl.dtb')) | 651 | os.path.join(deploy_dir_image, 'u-boot-spl.dtb')) |
524 | 652 | ||
525 | |||
526 | def test_sign_cascaded_uboot_fit_image(self): | 653 | def test_sign_cascaded_uboot_fit_image(self): |
527 | """ | 654 | """ |
528 | Summary: Check if U-Boot FIT image and Image Tree Source (its) are | 655 | Summary: Check if U-Boot FIT image and Image Tree Source (its) are |
@@ -667,137 +794,6 @@ FIT_SIGN_INDIVIDUAL = "1" | |||
667 | self._verify_fit_image_signature(uboot_tools_bindir, fitimage_path, | 794 | self._verify_fit_image_signature(uboot_tools_bindir, fitimage_path, |
668 | os.path.join(deploy_dir_image, 'u-boot-spl.dtb')) | 795 | os.path.join(deploy_dir_image, 'u-boot-spl.dtb')) |
669 | 796 | ||
670 | |||
671 | def test_initramfs_bundle(self): | ||
672 | """ | ||
673 | Summary: Verifies the content of the initramfs bundle node in the FIT Image Tree Source (its) | ||
674 | The FIT settings are set by the test case. | ||
675 | The machine used is beaglebone-yocto. | ||
676 | Expected: 1. The ITS is generated with initramfs bundle support | ||
677 | 2. All the fields in the kernel node are as expected (matching the | ||
678 | conf settings) | ||
679 | 3. The kernel is included in all the available configurations and | ||
680 | its hash is included in the configuration signature | ||
681 | |||
682 | Product: oe-core | ||
683 | Author: Abdellatif El Khlifi <abdellatif.elkhlifi@arm.com> | ||
684 | """ | ||
685 | |||
686 | config = """ | ||
687 | DISTRO="poky" | ||
688 | MACHINE = "beaglebone-yocto" | ||
689 | INITRAMFS_IMAGE_BUNDLE = "1" | ||
690 | INITRAMFS_IMAGE = "core-image-minimal-initramfs" | ||
691 | INITRAMFS_SCRIPTS = "" | ||
692 | UBOOT_MACHINE = "am335x_evm_defconfig" | ||
693 | KERNEL_CLASSES = " kernel-fitimage " | ||
694 | KERNEL_IMAGETYPES = "fitImage" | ||
695 | UBOOT_SIGN_ENABLE = "1" | ||
696 | UBOOT_SIGN_KEYNAME = "beaglebonekey" | ||
697 | UBOOT_SIGN_KEYDIR ?= "${DEPLOY_DIR_IMAGE}" | ||
698 | UBOOT_DTB_BINARY = "u-boot.dtb" | ||
699 | UBOOT_ENTRYPOINT = "0x80000000" | ||
700 | UBOOT_LOADADDRESS = "0x80000000" | ||
701 | UBOOT_DTB_LOADADDRESS = "0x82000000" | ||
702 | UBOOT_ARCH = "arm" | ||
703 | UBOOT_MKIMAGE_DTCOPTS = "-I dts -O dtb -p 2000" | ||
704 | UBOOT_MKIMAGE_KERNEL_TYPE = "kernel" | ||
705 | UBOOT_EXTLINUX = "0" | ||
706 | FIT_GENERATE_KEYS = "1" | ||
707 | KERNEL_IMAGETYPE_REPLACEMENT = "zImage" | ||
708 | FIT_KERNEL_COMP_ALG = "none" | ||
709 | FIT_HASH_ALG = "sha256" | ||
710 | """ | ||
711 | config = self._config_add_uboot_env(config) | ||
712 | self.write_config(config) | ||
713 | |||
714 | # fitImage is created as part of linux recipe | ||
715 | bitbake("virtual/kernel") | ||
716 | |||
717 | bb_vars = get_bb_vars([ | ||
718 | 'DEPLOY_DIR_IMAGE', | ||
719 | 'FIT_HASH_ALG', | ||
720 | 'FIT_KERNEL_COMP_ALG', | ||
721 | 'INITRAMFS_IMAGE', | ||
722 | 'MACHINE', | ||
723 | 'UBOOT_ARCH', | ||
724 | 'UBOOT_ENTRYPOINT', | ||
725 | 'UBOOT_LOADADDRESS', | ||
726 | 'UBOOT_MKIMAGE_KERNEL_TYPE' | ||
727 | ], | ||
728 | 'virtual/kernel') | ||
729 | fitimage_its_path = os.path.join(bb_vars['DEPLOY_DIR_IMAGE'], | ||
730 | "fitImage-its-%s-%s-%s" % (bb_vars['INITRAMFS_IMAGE'], bb_vars['MACHINE'], bb_vars['MACHINE'])) | ||
731 | fitimage_path = os.path.join(bb_vars['DEPLOY_DIR_IMAGE'],"fitImage") | ||
732 | |||
733 | self.assertExists(fitimage_its_path, "%s image tree source doesn't exist" % (fitimage_its_path)) | ||
734 | self.assertExists(fitimage_path, "%s FIT image doesn't exist" % (fitimage_path)) | ||
735 | |||
736 | its_file = open(fitimage_its_path) | ||
737 | |||
738 | its_lines = [line.strip() for line in its_file.readlines()] | ||
739 | |||
740 | exp_node_lines = [ | ||
741 | 'kernel-1 {', | ||
742 | 'description = "Linux kernel";', | ||
743 | 'data = /incbin/("linux.bin");', | ||
744 | 'type = "' + str(bb_vars['UBOOT_MKIMAGE_KERNEL_TYPE']) + '";', | ||
745 | 'arch = "' + str(bb_vars['UBOOT_ARCH']) + '";', | ||
746 | 'os = "linux";', | ||
747 | 'compression = "' + str(bb_vars['FIT_KERNEL_COMP_ALG']) + '";', | ||
748 | 'load = <' + str(bb_vars['UBOOT_LOADADDRESS']) + '>;', | ||
749 | 'entry = <' + str(bb_vars['UBOOT_ENTRYPOINT']) + '>;', | ||
750 | 'hash-1 {', | ||
751 | 'algo = "' + str(bb_vars['FIT_HASH_ALG']) +'";', | ||
752 | '};', | ||
753 | '};' | ||
754 | ] | ||
755 | |||
756 | node_str = exp_node_lines[0] | ||
757 | |||
758 | print ("checking kernel node\n") | ||
759 | self.assertIn(node_str, its_lines) | ||
760 | |||
761 | node_start_idx = its_lines.index(node_str) | ||
762 | node = its_lines[node_start_idx:(node_start_idx + len(exp_node_lines))] | ||
763 | |||
764 | # Remove the absolute path. This refers to WORKDIR which is not always predictable. | ||
765 | re_data = re.compile(r'^data = /incbin/\(.*/linux\.bin"\);$') | ||
766 | node = [re.sub(re_data, 'data = /incbin/("linux.bin");', cfg_str) for cfg_str in node] | ||
767 | |||
768 | self.assertEqual(node, exp_node_lines, "kernel node does not match expectation") | ||
769 | |||
770 | rx_configs = re.compile("^conf-.*") | ||
771 | its_configs = list(filter(rx_configs.match, its_lines)) | ||
772 | |||
773 | for cfg_str in its_configs: | ||
774 | cfg_start_idx = its_lines.index(cfg_str) | ||
775 | line_idx = cfg_start_idx + 2 | ||
776 | node_end = False | ||
777 | while node_end == False: | ||
778 | if its_lines[line_idx] == "};" and its_lines[line_idx-1] == "};" : | ||
779 | node_end = True | ||
780 | line_idx = line_idx + 1 | ||
781 | |||
782 | node = its_lines[cfg_start_idx:line_idx] | ||
783 | print("checking configuration " + cfg_str.rstrip(" {")) | ||
784 | rx_desc_line = re.compile(r'^description = ".*Linux kernel.*') | ||
785 | self.assertEqual(len(list(filter(rx_desc_line.match, node))), 1, "kernel keyword not found in the description line") | ||
786 | |||
787 | self.assertIn('kernel = "kernel-1";', node) | ||
788 | |||
789 | rx_sign_line = re.compile(r'^sign-images = .*kernel.*') | ||
790 | self.assertEqual(len(list(filter(rx_sign_line.match, node))), 1, "kernel hash not signed") | ||
791 | |||
792 | # Verify the signature | ||
793 | uboot_tools_bindir = self._setup_uboot_tools_native() | ||
794 | self._verify_fit_image_signature(uboot_tools_bindir, fitimage_path, os.path.join(bb_vars['DEPLOY_DIR_IMAGE'], 'am335x-bone.dtb')) | ||
795 | |||
796 | # Check if the u-boot boot.scr script is in the fitImage | ||
797 | dumpimage_result = self._run_dumpimage(fitimage_path, uboot_tools_bindir) | ||
798 | self._verify_fitimage_uboot_env(dumpimage_result) | ||
799 | |||
800 | |||
801 | def test_uboot_atf_tee_fit_image(self): | 797 | def test_uboot_atf_tee_fit_image(self): |
802 | """ | 798 | """ |
803 | Summary: Check if U-boot FIT image and Image Tree Source | 799 | Summary: Check if U-boot FIT image and Image Tree Source |