From a865d1d25410af97376fd3c822bac560b99fd84b Mon Sep 17 00:00:00 2001 From: Tom Rini Date: Wed, 7 May 2025 16:08:18 -0600 Subject: doc: pytest: Framework for documenting tests and document test_000_version In order to easily document pytests, we need to include the autodoc extension. We also need to make sure that for building the docs, CI includes pytest and that we have PYTHONPATH configured such that it will find all of the tests and related files. Finally, we need to have our comments in the test file by in proper pydoc format in order to be included in the output. Signed-off-by: Tom Rini Reviewed-by: Simon Glass --- test/py/tests/test_000_version.py | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) (limited to 'test') diff --git a/test/py/tests/test_000_version.py b/test/py/tests/test_000_version.py index b95ceae2346..63d392e956e 100644 --- a/test/py/tests/test_000_version.py +++ b/test/py/tests/test_000_version.py @@ -2,10 +2,12 @@ # Copyright (c) 2015 Stephen Warren # Copyright (c) 2016, NVIDIA CORPORATION. All rights reserved. -# pytest runs tests the order of their module path, which is related to the -# filename containing the test. This file is named such that it is sorted -# first, simply as a very basic sanity check of the functionality of the U-Boot -# command prompt. +""" +pytest runs tests the order of their module path, which is related to the +filename containing the test. This file is named such that it is sorted +first, simply as a very basic sanity check of the functionality of the U-Boot +command prompt. +""" def test_version(ubman): """Test that the "version" command prints the U-Boot version.""" -- cgit v1.2.3 From 8f8f0f0ed9d0f9d4ac385da735cef1eedd891499 Mon Sep 17 00:00:00 2001 From: Tom Rini Date: Wed, 7 May 2025 16:08:19 -0600 Subject: doc: pytest: Document the test_net_boot test Add the test_net_boot.py test to the generated documentation. While most of this was already commented correctly for inclusion the biggest problem was examples of code without a code-block notation. This in turn broke parsing. Add the missing notations. We also must have the comment prior to any import lines or it will not be seen as a comment on the overall file and thus not included. Signed-off-by: Tom Rini Reviewed-by: Simon Glass --- test/py/tests/test_net_boot.py | 163 ++++++++++++++++++++++------------------- 1 file changed, 89 insertions(+), 74 deletions(-) (limited to 'test') diff --git a/test/py/tests/test_net_boot.py b/test/py/tests/test_net_boot.py index abf6dfbaf5e..6585f0574c0 100644 --- a/test/py/tests/test_net_boot.py +++ b/test/py/tests/test_net_boot.py @@ -1,11 +1,6 @@ # SPDX-License-Identifier: GPL-2.0 # (C) Copyright 2023, Advanced Micro Devices, Inc. -import pytest -import utils -import test_net -import re - """ Note: This test relies on boardenv_* containing configuration values to define which the network environment available for testing. Without this, this test @@ -13,77 +8,88 @@ will be automatically skipped. For example: -# Details regarding a boot image file that may be read from a TFTP server. This -# variable may be omitted or set to None if TFTP boot testing is not possible -# or desired. -env__net_tftp_bootable_file = { - 'fn': 'image.ub', - 'addr': 0x10000000, - 'size': 5058624, - 'crc32': 'c2244b26', - 'pattern': 'Linux', - 'config': 'config@2', - 'timeout': 50000, - 'check_type': 'boot_error', - 'check_pattern': 'ERROR', -} - -# False or omitted if a TFTP boot test should be tested. -# If TFTP boot testing is not possible or desired, set this variable to True. -# For example: If FIT image is not proper to boot -env__tftp_boot_test_skip = False - -# Here is the example of FIT image configurations: -configurations { - default = "config@1"; - config@1 { - description = "Boot Linux kernel with config@1"; - kernel = "kernel@0"; - fdt = "fdt@0"; - ramdisk = "ramdisk@0"; - hash@1 { - algo = "sha1"; - }; - }; - config@2 { - description = "Boot Linux kernel with config@2"; - kernel = "kernel@1"; - fdt = "fdt@1"; - ramdisk = "ramdisk@1"; - hash@1 { - algo = "sha1"; - }; - }; -}; - -# Details regarding a file that may be read from a TFTP server. This variable -# may be omitted or set to None if PXE testing is not possible or desired. -env__net_pxe_bootable_file = { - 'fn': 'default', - 'addr': 0x10000000, - 'size': 74, - 'timeout': 50000, - 'pattern': 'Linux', - 'valid_label': '1', - 'invalid_label': '2', - 'exp_str_invalid': 'Skipping install for failure retrieving', - 'local_label': '3', - 'exp_str_local': 'missing environment variable: localcmd', - 'empty_label': '4', - 'exp_str_empty': 'No kernel given, skipping boot', - 'check_type': 'boot_error', - 'check_pattern': 'ERROR', -} - -# False if a PXE boot test should be tested. -# If PXE boot testing is not possible or desired, set this variable to True. -# For example: If pxe configuration file is not proper to boot -env__pxe_boot_test_skip = False - -# Here is the example of pxe configuration file ordered based on the execution -# flow: +.. code-block:: python + + # Details regarding a boot image file that may be read from a TFTP server. This + # variable may be omitted or set to None if TFTP boot testing is not possible + # or desired. + env__net_tftp_bootable_file = { + 'fn': 'image.ub', + 'addr': 0x10000000, + 'size': 5058624, + 'crc32': 'c2244b26', + 'pattern': 'Linux', + 'config': 'config@2', + 'timeout': 50000, + 'check_type': 'boot_error', + 'check_pattern': 'ERROR', + } + + # False or omitted if a TFTP boot test should be tested. + # If TFTP boot testing is not possible or desired, set this variable to True. + # For example: If FIT image is not proper to boot + env__tftp_boot_test_skip = False + + +Here is the example of FIT image configurations: + +.. code-block:: devicetree + + configurations { + default = "config@1"; + config@1 { + description = "Boot Linux kernel with config@1"; + kernel = "kernel@0"; + fdt = "fdt@0"; + ramdisk = "ramdisk@0"; + hash@1 { + algo = "sha1"; + }; + }; + config@2 { + description = "Boot Linux kernel with config@2"; + kernel = "kernel@1"; + fdt = "fdt@1"; + ramdisk = "ramdisk@1"; + hash@1 { + algo = "sha1"; + }; + }; + }; + +.. code-block:: python + + # Details regarding a file that may be read from a TFTP server. This variable + # may be omitted or set to None if PXE testing is not possible or desired. + env__net_pxe_bootable_file = { + 'fn': 'default', + 'addr': 0x10000000, + 'size': 74, + 'timeout': 50000, + 'pattern': 'Linux', + 'valid_label': '1', + 'invalid_label': '2', + 'exp_str_invalid': 'Skipping install for failure retrieving', + 'local_label': '3', + 'exp_str_local': 'missing environment variable: localcmd', + 'empty_label': '4', + 'exp_str_empty': 'No kernel given, skipping boot', + 'check_type': 'boot_error', + 'check_pattern': 'ERROR', + } + + # False if a PXE boot test should be tested. + # If PXE boot testing is not possible or desired, set this variable to True. + # For example: If pxe configuration file is not proper to boot + env__pxe_boot_test_skip = False + +Here is the example of pxe configuration file ordered based on the execution +flow: + 1) /tftpboot/pxelinux.cfg/default-arm-zynqmp +.. code-block:: + menu include pxelinux.cfg/default-arm timeout 50 @@ -91,6 +97,8 @@ env__pxe_boot_test_skip = False 2) /tftpboot/pxelinux.cfg/default-arm +.. code-block:: + menu title Linux boot selections menu include pxelinux.cfg/default @@ -110,6 +118,8 @@ env__pxe_boot_test_skip = False 3) /tftpboot/pxelinux.cfg/default +.. code-block:: + label Linux menu label Boot kernel kernel Image @@ -117,6 +127,11 @@ env__pxe_boot_test_skip = False initrd rootfs.cpio.gz.u-boot """ +import pytest +import utils +import test_net +import re + def setup_networking(ubman): test_net.test_net_dhcp(ubman) if not test_net.net_set_up: -- cgit v1.2.3 From 9e5624858476dd6c570acb25a6d15b3f8738f076 Mon Sep 17 00:00:00 2001 From: Tom Rini Date: Wed, 7 May 2025 16:08:20 -0600 Subject: test: test_net_boot: Add more comments Some of the functions were missing pydoc comments. Add them so they will be included in the documentation. Reported-by: Heinrich Schuchardt Signed-off-by: Tom Rini Reviewed-by: Simon Glass --- test/py/tests/test_net_boot.py | 14 ++++++++++++++ 1 file changed, 14 insertions(+) (limited to 'test') diff --git a/test/py/tests/test_net_boot.py b/test/py/tests/test_net_boot.py index 6585f0574c0..72086a74637 100644 --- a/test/py/tests/test_net_boot.py +++ b/test/py/tests/test_net_boot.py @@ -133,11 +133,21 @@ import test_net import re def setup_networking(ubman): + """Setup networking + + Making use of the test_net test, first try and configure networking via + DHCP. If this fails, fall back to static configuration. + """ test_net.test_net_dhcp(ubman) if not test_net.net_set_up: test_net.test_net_setup_static(ubman) def setup_tftpboot_boot(ubman): + """Setup for the tftpboot 'boot' test + + We check that a file to use has been configured. If it has, we download it + and ensure it has the expected crc32 value. + """ f = ubman.config.env.get('env__net_tftp_bootable_file', None) if not f: pytest.skip('No TFTP bootable file to read') @@ -213,6 +223,10 @@ def test_net_tftpboot_boot(ubman): ubman.cleanup_spawn() def setup_pxe_boot(ubman): + """Setup for the PXE 'boot' test + + Make sure that the file to load via PXE boot has been configured. + """ f = ubman.config.env.get('env__net_pxe_bootable_file', None) if not f: pytest.skip('No PXE bootable file to read') -- cgit v1.2.3 From 45d325ba0993f60b7b81bae1efde0bc324d49400 Mon Sep 17 00:00:00 2001 From: Tom Rini Date: Wed, 7 May 2025 17:23:00 -0600 Subject: doc: pytest: Document the test_net test Add this test to the documentation. While the diff appears large at first, the only changes within the test are to move the imports to follow the pydoc comment and then to code-block and indent the example configuration. Signed-off-by: Tom Rini Reviewed-by: Simon Glass --- test/py/tests/test_net.py | 152 +++++++++++++++++++++++----------------------- 1 file changed, 77 insertions(+), 75 deletions(-) (limited to 'test') diff --git a/test/py/tests/test_net.py b/test/py/tests/test_net.py index 4732e4b57f8..27cdd73fd49 100644 --- a/test/py/tests/test_net.py +++ b/test/py/tests/test_net.py @@ -4,12 +4,6 @@ # Test various network-related functionality, such as the dhcp, ping, and # tftpboot commands. -import pytest -import utils -import uuid -import datetime -import re - """ Note: This test relies on boardenv_* containing configuration values to define which network environment is available for testing. Without this, this test @@ -17,77 +11,85 @@ will be automatically skipped. For example: -# Boolean indicating whether the Ethernet device is attached to USB, and hence -# USB enumeration needs to be performed prior to network tests. -# This variable may be omitted if its value is False. -env__net_uses_usb = False - -# Boolean indicating whether the Ethernet device is attached to PCI, and hence -# PCI enumeration needs to be performed prior to network tests. -# This variable may be omitted if its value is False. -env__net_uses_pci = True - -# True if a DHCP server is attached to the network, and should be tested. -# If DHCP testing is not possible or desired, this variable may be omitted or -# set to False. -env__net_dhcp_server = True - -# False or omitted if a DHCP server is attached to the network, and dhcp abort -# case should be tested. -# If DHCP abort testing is not possible or desired, set this variable to True. -# For example: On some setup, dhcp is too fast and this case may not work. -env__dhcp_abort_test_skip = True - -# True if a DHCPv6 server is attached to the network, and should be tested. -# If DHCPv6 testing is not possible or desired, this variable may be omitted or -# set to False. -env__net_dhcp6_server = True - -# A list of environment variables that should be set in order to configure a -# static IP. If solely relying on DHCP, this variable may be omitted or set to -# an empty list. -env__net_static_env_vars = [ - ('ipaddr', '10.0.0.100'), - ('netmask', '255.255.255.0'), - ('serverip', '10.0.0.1'), -] - -# Details regarding a file that may be read from a TFTP server. This variable -# may be omitted or set to None if TFTP testing is not possible or desired. -env__net_tftp_readable_file = { - 'fn': 'ubtest-readable.bin', - 'addr': 0x10000000, - 'size': 5058624, - 'crc32': 'c2244b26', - 'timeout': 50000, - 'fnu': 'ubtest-upload.bin', -} - -# Details regarding a file that may be read from a NFS server. This variable -# may be omitted or set to None if NFS testing is not possible or desired. -env__net_nfs_readable_file = { - 'fn': 'ubtest-readable.bin', - 'addr': 0x10000000, - 'size': 5058624, - 'crc32': 'c2244b26', -} - -# Details regarding a file that may be read from a TFTP server. This variable -# may be omitted or set to None if PXE testing is not possible or desired. -env__net_pxe_readable_file = { - 'fn': 'default', - 'addr': 0x2000000, - 'size': 74, - 'timeout': 50000, - 'pattern': 'Linux', -} - -# True if a router advertisement service is connected to the network, and should -# be tested. If router advertisement testing is not possible or desired, this -variable may be omitted or set to False. -env__router_on_net = True +.. code-block:: python + + # Boolean indicating whether the Ethernet device is attached to USB, and hence + # USB enumeration needs to be performed prior to network tests. + # This variable may be omitted if its value is False. + env__net_uses_usb = False + + # Boolean indicating whether the Ethernet device is attached to PCI, and hence + # PCI enumeration needs to be performed prior to network tests. + # This variable may be omitted if its value is False. + env__net_uses_pci = True + + # True if a DHCP server is attached to the network, and should be tested. + # If DHCP testing is not possible or desired, this variable may be omitted or + # set to False. + env__net_dhcp_server = True + + # False or omitted if a DHCP server is attached to the network, and dhcp abort + # case should be tested. + # If DHCP abort testing is not possible or desired, set this variable to True. + # For example: On some setup, dhcp is too fast and this case may not work. + env__dhcp_abort_test_skip = True + + # True if a DHCPv6 server is attached to the network, and should be tested. + # If DHCPv6 testing is not possible or desired, this variable may be omitted or + # set to False. + env__net_dhcp6_server = True + + # A list of environment variables that should be set in order to configure a + # static IP. If solely relying on DHCP, this variable may be omitted or set to + # an empty list. + env__net_static_env_vars = [ + ('ipaddr', '10.0.0.100'), + ('netmask', '255.255.255.0'), + ('serverip', '10.0.0.1'), + ] + + # Details regarding a file that may be read from a TFTP server. This variable + # may be omitted or set to None if TFTP testing is not possible or desired. + env__net_tftp_readable_file = { + 'fn': 'ubtest-readable.bin', + 'addr': 0x10000000, + 'size': 5058624, + 'crc32': 'c2244b26', + 'timeout': 50000, + 'fnu': 'ubtest-upload.bin', + } + + # Details regarding a file that may be read from a NFS server. This variable + # may be omitted or set to None if NFS testing is not possible or desired. + env__net_nfs_readable_file = { + 'fn': 'ubtest-readable.bin', + 'addr': 0x10000000, + 'size': 5058624, + 'crc32': 'c2244b26', + } + + # Details regarding a file that may be read from a TFTP server. This variable + # may be omitted or set to None if PXE testing is not possible or desired. + env__net_pxe_readable_file = { + 'fn': 'default', + 'addr': 0x2000000, + 'size': 74, + 'timeout': 50000, + 'pattern': 'Linux', + } + + # True if a router advertisement service is connected to the network, and should + # be tested. If router advertisement testing is not possible or desired, this + variable may be omitted or set to False. + env__router_on_net = True """ +import pytest +import utils +import uuid +import datetime +import re + net_set_up = False net6_set_up = False -- cgit v1.2.3 From 58b2f0895bcbe24aad86c14813911f04b35cc5fb Mon Sep 17 00:00:00 2001 From: Tom Rini Date: Wed, 7 May 2025 17:23:01 -0600 Subject: doc: pytest: Document the test_bootstage test Add this test to the documentation. We need to move the import to follow the main comment so that it renders correctly, and add a code-block annotation to the example and indent it correctly. Next, neither of the functions had comments themselves, so document them now. Signed-off-by: Tom Rini Reviewed-by: Simon Glass --- test/py/tests/test_bootstage.py | 35 ++++++++++++++++++++++++++++------- 1 file changed, 28 insertions(+), 7 deletions(-) (limited to 'test') diff --git a/test/py/tests/test_bootstage.py b/test/py/tests/test_bootstage.py index 379c1cae6dd..2505862c5a4 100644 --- a/test/py/tests/test_bootstage.py +++ b/test/py/tests/test_bootstage.py @@ -1,8 +1,6 @@ # SPDX-License-Identifier: GPL-2.0 # (C) Copyright 2023, Advanced Micro Devices, Inc. -import pytest - """ Test the bootstage command. @@ -15,16 +13,32 @@ common/bootstage.c). Without this, bootstage stash and unstash tests will be automatically skipped. For example: -env__bootstage_cmd_file = { - 'addr': 0x200000, - 'size': 0x1000, - 'bootstage_magic_addr': 0xb00757a3, -} + +.. code-block:: python + + env__bootstage_cmd_file = { + 'addr': 0x200000, + 'size': 0x1000, + 'bootstage_magic_addr': 0xb00757a3, + } """ +import pytest + @pytest.mark.buildconfigspec('bootstage') @pytest.mark.buildconfigspec('cmd_bootstage') def test_bootstage_report(ubman): + """Test the bootstage report subcommand + + This will run the 'bootstage report' subcommand and ensure that we are + reporting: + + - A timer summary in microseconds + - The accumulated time + - That at least the phrase 'dm_r' is in the output + + Note that the time values are not checked. + """ output = ubman.run_command('bootstage report') assert 'Timer summary in microseconds' in output assert 'Accumulated time:' in output @@ -34,6 +48,13 @@ def test_bootstage_report(ubman): @pytest.mark.buildconfigspec('cmd_bootstage') @pytest.mark.buildconfigspec('bootstage_stash') def test_bootstage_stash_and_unstash(ubman): + """Test the bootstage stash and unstash subcommands + + After checking that we have configured an environment file to use, we will + use the stash subcommand to save information. Then we will use the md + command to verify the contents in memory. Finally we confirm the unstash + subcommand runs successfully. + """ f = ubman.config.env.get('env__bootstage_cmd_file', None) if not f: pytest.skip('No bootstage environment file is defined') -- cgit v1.2.3 From 6c3c08c4789b482e810dc4b60bfee914b063b232 Mon Sep 17 00:00:00 2001 From: Tom Rini Date: Wed, 7 May 2025 17:23:02 -0600 Subject: doc: pytest: Document the test_efi_loader test Add this test to the documentation. We need to add a code-block annotation to the example and indent it correctly. We also need to document the do_test_efi_helloworld_net function and that in turn means changing the documentation to test_efi_helloworld_net_http and test_efi_helloworld_net_tftp to reflect what is and isn't done in those functions themselves now. Signed-off-by: Tom Rini Reviewed-by: Simon Glass --- test/py/tests/test_efi_loader.py | 87 +++++++++++++++++++++------------------- 1 file changed, 46 insertions(+), 41 deletions(-) (limited to 'test') diff --git a/test/py/tests/test_efi_loader.py b/test/py/tests/test_efi_loader.py index 58f2655191f..91f151d09cd 100644 --- a/test/py/tests/test_efi_loader.py +++ b/test/py/tests/test_efi_loader.py @@ -13,43 +13,45 @@ that rely on network will be automatically skipped. For example: -# Boolean indicating whether the Ethernet device is attached to USB, and hence -# USB enumeration needs to be performed prior to network tests. -# This variable may be omitted if its value is False. -env__net_uses_usb = False - -# Boolean indicating whether the Ethernet device is attached to PCI, and hence -# PCI enumeration needs to be performed prior to network tests. -# This variable may be omitted if its value is False. -env__net_uses_pci = True - -# True if a DHCP server is attached to the network, and should be tested. -# If DHCP testing is not possible or desired, this variable may be omitted or -# set to False. -env__net_dhcp_server = True - -# A list of environment variables that should be set in order to configure a -# static IP. If solely relying on DHCP, this variable may be omitted or set to -# an empty list. -env__net_static_env_vars = [ - ('ipaddr', '10.0.0.100'), - ('netmask', '255.255.255.0'), - ('serverip', '10.0.0.1'), -] - -# Details regarding a file that may be read from a TFTP server. This variable -# may be omitted or set to None if TFTP testing is not possible or desired. -env__efi_loader_helloworld_file = { - 'fn': 'lib/efi_loader/helloworld.efi', # file name - 'size': 5058624, # file length in bytes - 'crc32': 'c2244b26', # CRC32 check sum - 'addr': 0x40400000, # load address -} - -# False if the helloworld EFI over HTTP boot test should be performed. -# If HTTP boot testing is not possible or desired, set this variable to True or -# ommit it. -env__efi_helloworld_net_http_test_skip = True +.. code-block:: python + + # Boolean indicating whether the Ethernet device is attached to USB, and hence + # USB enumeration needs to be performed prior to network tests. + # This variable may be omitted if its value is False. + env__net_uses_usb = False + + # Boolean indicating whether the Ethernet device is attached to PCI, and hence + # PCI enumeration needs to be performed prior to network tests. + # This variable may be omitted if its value is False. + env__net_uses_pci = True + + # True if a DHCP server is attached to the network, and should be tested. + # If DHCP testing is not possible or desired, this variable may be omitted or + # set to False. + env__net_dhcp_server = True + + # A list of environment variables that should be set in order to configure a + # static IP. If solely relying on DHCP, this variable may be omitted or set to + # an empty list. + env__net_static_env_vars = [ + ('ipaddr', '10.0.0.100'), + ('netmask', '255.255.255.0'), + ('serverip', '10.0.0.1'), + ] + + # Details regarding a file that may be read from a TFTP server. This variable + # may be omitted or set to None if TFTP testing is not possible or desired. + env__efi_loader_helloworld_file = { + 'fn': 'lib/efi_loader/helloworld.efi', # file name + 'size': 5058624, # file length in bytes + 'crc32': 'c2244b26', # CRC32 check sum + 'addr': 0x40400000, # load address + } + + # False if the helloworld EFI over HTTP boot test should be performed. + # If HTTP boot testing is not possible or desired, set this variable to True or + # ommit it. + env__efi_helloworld_net_http_test_skip = True """ import pytest @@ -161,6 +163,11 @@ def fetch_file(ubman, env_conf, proto): return addr def do_test_efi_helloworld_net(ubman, proto): + """Download and execute the helloworld appliation + + The helloworld.efi file is downloaded based on the value passed to us as a + protocol and is executed using the fallback device tree at $fdtcontroladdr. + """ addr = fetch_file(ubman, 'env__efi_loader_helloworld_file', proto) output = ubman.run_command('bootefi %x' % addr) @@ -175,8 +182,7 @@ def do_test_efi_helloworld_net(ubman, proto): def test_efi_helloworld_net_tftp(ubman): """Run the helloworld.efi binary via TFTP. - The helloworld.efi file is downloaded from the TFTP server and is executed - using the fallback device tree at $fdtcontroladdr. + Call the do_test_efi_helloworld_net function to execute the test via TFTP. """ do_test_efi_helloworld_net(ubman, PROTO_TFTP); @@ -187,8 +193,7 @@ def test_efi_helloworld_net_tftp(ubman): def test_efi_helloworld_net_http(ubman): """Run the helloworld.efi binary via HTTP. - The helloworld.efi file is downloaded from the HTTP server and is executed - using the fallback device tree at $fdtcontroladdr. + Call the do_test_efi_helloworld_net function to execute the test via HTTP. """ if ubman.config.env.get('env__efi_helloworld_net_http_test_skip', True): pytest.skip('helloworld.efi HTTP test is not enabled!') -- cgit v1.2.3 From 4964cc9caa885dbcdc028ecff5e86678ef3ea8af Mon Sep 17 00:00:00 2001 From: Tom Rini Date: Thu, 8 May 2025 15:34:43 -0600 Subject: doc: pytest: Document the test_bind test Add this test to the documentation. None of the functions had comments, so attempt to explain what each does. Signed-off-by: Tom Rini Reviewed-by: Simon Glass --- test/py/tests/test_bind.py | 12 ++++++++++++ 1 file changed, 12 insertions(+) (limited to 'test') diff --git a/test/py/tests/test_bind.py b/test/py/tests/test_bind.py index 16c63ae9684..850fe113fe2 100644 --- a/test/py/tests/test_bind.py +++ b/test/py/tests/test_bind.py @@ -7,6 +7,7 @@ import re import pytest def in_tree(response, name, uclass, drv, depth, last_child): + """A helper function to confirm contents of the device tree """ lines = [x.strip() for x in response.splitlines()] leaf = '' if depth != 0: @@ -28,7 +29,12 @@ def in_tree(response, name, uclass, drv, depth, last_child): @pytest.mark.boardspec('sandbox') @pytest.mark.buildconfigspec('cmd_bind') def test_bind_unbind_with_node(ubman): + """Test the bind and unbind commands of a node + Verify that the dm tree output contains some expected nodes, and then bind + and unbind a USB via node device while verifying that the dm tree output + matches the expected values at each step. + """ tree = ubman.run_command('dm tree') assert in_tree(tree, 'bind-test', 'simple_bus', 'simple_bus', 0, True) assert in_tree(tree, 'bind-test-child1', 'phy', 'phy_sandbox', 1, False) @@ -106,6 +112,7 @@ def test_bind_unbind_with_node(ubman): assert response == '' def get_next_line(tree, name): + """A helper function to strip content out of dm tree output""" treelines = [x.strip() for x in tree.splitlines() if x.strip()] child_line = '' for idx, line in enumerate(treelines): @@ -121,6 +128,11 @@ def get_next_line(tree, name): @pytest.mark.buildconfigspec('cmd_bind') @pytest.mark.singlethread def test_bind_unbind_with_uclass(ubman): + """Test the bind and unbind commands of a class + + Bind and unbind the simple_bus class while verifying that the dm tree + output matches the expected values at each step. + """ #bind /bind-test response = ubman.run_command('bind /bind-test simple_bus') assert response == '' -- cgit v1.2.3 From e1076c6619194ddd82f8e364d8cafd907da40616 Mon Sep 17 00:00:00 2001 From: Tom Rini Date: Thu, 8 May 2025 15:34:44 -0600 Subject: doc: pytest: Document the test_bootmenu test Add this test to the documentation. There was already a function comment that included the argument, so convert it to the right style to be rendered correctly in output. Signed-off-by: Tom Rini Reviewed-by: Simon Glass --- test/py/tests/test_bootmenu.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'test') diff --git a/test/py/tests/test_bootmenu.py b/test/py/tests/test_bootmenu.py index 66f3fb8a131..be8257fe3e8 100644 --- a/test/py/tests/test_bootmenu.py +++ b/test/py/tests/test_bootmenu.py @@ -8,9 +8,9 @@ import pytest def test_bootmenu(ubman): """Test bootmenu - ubman -- U-Boot console + Args: + ubman: U-Boot console """ - with ubman.temporary_timeout(500): ubman.run_command('setenv bootmenu_default 1') ubman.run_command('setenv bootmenu_0 test 1=echo ok 1') -- cgit v1.2.3 From 02e5d344a0d75a4f05682b3438354748dc83d941 Mon Sep 17 00:00:00 2001 From: Tom Rini Date: Thu, 8 May 2025 15:34:45 -0600 Subject: doc: pytest: Document the test_button test Add this test to the documentation. No changes to the test itself were required. Signed-off-by: Tom Rini Reviewed-by: Simon Glass --- test/py/tests/test_button.py | 2 ++ 1 file changed, 2 insertions(+) (limited to 'test') diff --git a/test/py/tests/test_button.py b/test/py/tests/test_button.py index f0d85be896d..f3f68169e14 100644 --- a/test/py/tests/test_button.py +++ b/test/py/tests/test_button.py @@ -1,5 +1,7 @@ # SPDX-License-Identifier: GPL-2.0+ +"""Tests for the button command""" + import pytest @pytest.mark.boardspec('sandbox') -- cgit v1.2.3 From 8fdb8740b39b01d182137d437f2d1d16b526a4b5 Mon Sep 17 00:00:00 2001 From: Adriano Cordova Date: Thu, 8 May 2025 14:30:34 -0400 Subject: test/py/test_efi_fit: test fdt and initrd Add tests to check initrd and dtb loading Signed-off-by: Adriano Cordova --- test/py/tests/test_efi_fit.py | 156 +++++++++++++++++++++++++++++++++--------- 1 file changed, 124 insertions(+), 32 deletions(-) (limited to 'test') diff --git a/test/py/tests/test_efi_fit.py b/test/py/tests/test_efi_fit.py index 5f352e7efff..63ee8e6cef2 100644 --- a/test/py/tests/test_efi_fit.py +++ b/test/py/tests/test_efi_fit.py @@ -66,9 +66,29 @@ ITS_DATA = ''' #address-cells = <1>; images { - efi { + helloworld { description = "Test EFI"; - data = /incbin/("%(efi-bin)s"); + data = /incbin/("%(hello-bin)s"); + type = "%(kernel-type)s"; + arch = "%(sys-arch)s"; + os = "efi"; + compression = "%(efi-comp)s"; + load = <0x0>; + entry = <0x0>; + }; + dtbdump { + description = "Test EFI fdtdump"; + data = /incbin/("%(dtbdump-bin)s"); + type = "%(kernel-type)s"; + arch = "%(sys-arch)s"; + os = "efi"; + compression = "%(efi-comp)s"; + load = <0x0>; + entry = <0x0>; + }; + initrddump { + description = "Test EFI initrddump"; + data = /incbin/("%(initrddump-bin)s"); type = "%(kernel-type)s"; arch = "%(sys-arch)s"; os = "efi"; @@ -83,18 +103,33 @@ ITS_DATA = ''' arch = "%(sys-arch)s"; compression = "%(fdt-comp)s"; }; + initrd { + description = "Initial RAM Disk"; + data = /incbin/("%(initrd-fs)s"); + type = "ramdisk"; + compression = "%(initrd-comp)s"; + os = "efi"; + }; }; configurations { default = "config-efi-fdt"; + + config-efi { + description = "EFI FIT w/o FDT"; + kernel = "helloworld"; + }; + config-efi-fdt { description = "EFI FIT w/ FDT"; - kernel = "efi"; + kernel = "dtbdump"; fdt = "fdt"; }; - config-efi-nofdt { - description = "EFI FIT w/o FDT"; - kernel = "efi"; + + config-efi-initrd { + description = "EFI FIT w/ initrd"; + kernel = "initrddump"; + ramdisk = "initrd"; }; }; }; @@ -108,7 +143,7 @@ FDT_DATA = ''' #address-cells = <1>; #size-cells = <1>; - model = "%(sys-arch)s %(fdt_type)s EFI FIT Boot Test"; + model = "%(sys-arch)s %(fdt_type)s EFI FIT FDT Boot Test"; compatible = "%(sys-arch)s"; reset@0 { @@ -120,6 +155,7 @@ FDT_DATA = ''' @pytest.mark.buildconfigspec('bootm_efi') @pytest.mark.buildconfigspec('BOOTEFI_HELLO_COMPILE') +@pytest.mark.buildconfigspec('EFI_LOAD_FILE2_INITRD') @pytest.mark.buildconfigspec('fit') @pytest.mark.notbuildconfigspec('generate_acpi_table') @pytest.mark.requiredtool('dtc') @@ -137,8 +173,10 @@ def test_efi_fit_launch(ubman): The following test cases are currently defined and enabled: - Launch uncompressed FIT EFI & internal FDT - Launch uncompressed FIT EFI & FIT FDT + - Launch uncompressed FIT EFI & internal FDT & FIT initrd - Launch compressed FIT EFI & internal FDT - Launch compressed FIT EFI & FIT FDT + - Launch compressed FIT EFI & internal FDT & FIT initrd """ def net_pre_commands(): @@ -210,7 +248,7 @@ def test_efi_fit_launch(ubman): return os.path.join(ubman.config.build_dir, file_name) - def make_efi(fname, comp): + def make_efi(fname, efi_file, comp): """Create an UEFI binary. This simply copies lib/efi_loader/helloworld.efi into U-Boot @@ -218,6 +256,7 @@ def test_efi_fit_launch(ubman): Args: fname -- The target file name within U-Boot build dir. + efi_file -- The source .efi application comp -- Flag to enable gzip compression. Return: The path of the created file. @@ -225,7 +264,7 @@ def test_efi_fit_launch(ubman): bin_path = make_fpath(fname) utils.run_and_log(ubman, - ['cp', make_fpath('lib/efi_loader/helloworld.efi'), + ['cp', make_fpath(f'lib/efi_loader/{efi_file}'), bin_path]) if comp: utils.run_and_log(ubman, ['gzip', '-f', bin_path]) @@ -264,6 +303,27 @@ def test_efi_fit_launch(ubman): dtb += '.gz' return dtb + def make_initrd(comp): + """Create a sample initrd. + + Creates an initrd. + + Args: + comp -- Flag to enable gzip compression. + Return: + The path of the created file. + """ + + # Generate a test initrd file. + initrd = make_fpath('test-efi-initrd') + with open(initrd, 'w', encoding='ascii') as file: + file.write('test-efi-initrd') + + if comp: + utils.run_and_log(ubman, ['gzip', '-f', initrd]) + initrd += '.gz' + return initrd + def make_fit(comp): """Create a sample FIT image. @@ -275,22 +335,35 @@ def test_efi_fit_launch(ubman): """ # Generate resources referenced by ITS. + hello_bin = os.path.basename(make_efi('test-efi-helloworld.efi', 'helloworld.efi', comp)) + dtbdump_bin = os.path.basename(make_efi('test-efi-dtbdump.efi', 'dtbdump.efi', comp)) + initrddump_bin = os.path.basename(make_efi('test-efi-initrddump.efi', 'initrddump.efi', comp)) + fdt_bin = os.path.basename(make_dtb('user', comp)) + initrd_fs = make_initrd(comp) + initrd_fs = os.path.basename(initrd_fs) + compression = 'gzip' if comp else 'none' + kernel_type = 'kernel' if comp else 'kernel_noload' + its_params = { 'sys-arch': sys_arch, - 'efi-bin': os.path.basename(make_efi('test-efi-fit-helloworld.efi', comp)), - 'kernel-type': 'kernel' if comp else 'kernel_noload', - 'efi-comp': 'gzip' if comp else 'none', - 'fdt-bin': os.path.basename(make_dtb('user', comp)), - 'fdt-comp': 'gzip' if comp else 'none', + 'hello-bin': hello_bin, + 'dtbdump-bin': dtbdump_bin, + 'initrddump-bin': initrddump_bin, + 'kernel-type': kernel_type, + 'efi-comp': compression, + 'fdt-bin': fdt_bin, + 'fdt-comp': compression, + 'initrd-fs': initrd_fs, + 'initrd-comp': compression, } # Generate a test ITS file. - its_path = make_fpath('test-efi-fit-helloworld.its') + its_path = make_fpath('test-efi-fit.its') with open(its_path, 'w', encoding='ascii') as file: file.write(ITS_DATA % its_params) # Build the test ITS. - fit_path = make_fpath('test-efi-fit-helloworld.fit') + fit_path = make_fpath('test-efi-fit.fit') utils.run_and_log( ubman, [make_fpath('tools/mkimage'), '-f', its_path, fit_path]) return fit_path @@ -357,7 +430,7 @@ def test_efi_fit_launch(ubman): return addr - def launch_efi(enable_fdt, enable_comp): + def launch_efi(enable_fdt, enable_initrd, enable_comp): """Launch U-Boot's helloworld.efi binary from a FIT image. An external image file can be downloaded from TFTP, when related @@ -372,19 +445,20 @@ def test_efi_fit_launch(ubman): from the host filesystem. Once the load address is available on U-Boot console, the 'bootm' - command is executed for either 'config-efi-fdt' or 'config-efi-nofdt' - FIT configuration, depending on the value of the 'enable_fdt' function - argument. + command is executed for either 'config-efi', 'config-efi-fdt' or + 'config-efi-initrd' FIT configuration, depending on the value of the + 'enable_fdt' and 'enable_initrd' function arguments. Eventually the 'Hello, world' message is expected in the U-Boot console. Args: enable_fdt -- Flag to enable using the FDT blob inside FIT image. + enable_initrd -- Flag to enable using an initrd inside FIT image. enable_comp -- Flag to enable GZIP compression on EFI and FDT generated content. """ - with ubman.log.section('FDT=%s;COMP=%s' % (enable_fdt, enable_comp)): + with ubman.log.section('FDT=%s;INITRD=%s;COMP=%s' % (enable_fdt, enable_initrd, enable_comp)): if is_sandbox: fit = { 'dn': ubman.config.build_dir, @@ -420,14 +494,28 @@ def test_efi_fit_launch(ubman): addr = load_fit_from_host(fit) if is_sandbox else load_fit_from_tftp(fit) # Select boot configuration. - fit_config = 'config-efi-fdt' if enable_fdt else 'config-efi-nofdt' + fit_config = 'config-efi' + fit_config = fit_config + '-fdt' if enable_fdt else fit_config + fit_config = fit_config + '-initrd' if enable_initrd else fit_config # Try booting. + ubman.run_command('setenv bootargs nocolor') output = ubman.run_command('bootm %x#%s' % (addr, fit_config)) + assert '## Application failed' not in output if enable_fdt: assert 'Booting using the fdt blob' in output - assert 'Hello, world' in output - assert '## Application failed' not in output + assert 'DTB Dump' in output + if enable_initrd: + assert 'Loading ramdisk' in output + assert 'INITRD Dump' in output + if enable_fdt: + response = ubman.run_command(cmd = 'dump', wait_for_echo=False) + assert 'EFI FIT FDT Boot Test' in response + if enable_initrd: + response = ubman.run_command('load', wait_for_echo=False) + assert f"crc32: 0x0c77b025" in response + if not enable_fdt and not enable_initrd: + assert 'Hello, world' in output ubman.restart_uboot() # Array slice removes leading/trailing quotes. @@ -449,16 +537,20 @@ def test_efi_fit_launch(ubman): ubman.config.dtb = control_dtb # Run tests - # - fdt OFF, gzip OFF - launch_efi(False, False) - # - fdt ON, gzip OFF - launch_efi(True, False) + # - fdt OFF, initrd OFF, gzip OFF + launch_efi(False, False, False) + # - fdt ON, initrd OFF, gzip OFF + launch_efi(True, False, False) + # - fdt OFF, initrd ON, gzip OFF + launch_efi(False, True, False) if is_sandbox: - # - fdt OFF, gzip ON - launch_efi(False, True) - # - fdt ON, gzip ON - launch_efi(True, True) + # - fdt OFF, initrd OFF, gzip ON + launch_efi(False, False, True) + # - fdt ON, initrd OFF, gzip ON + launch_efi(True, False, True) + # - fdt OFF, initrd ON, gzip ON + launch_efi(False, True, True) finally: if is_sandbox: -- cgit v1.2.3