[PATCH v2 9/9] pytests/test_efi_loader: Test EFI_HTTP_PROTOCOL
Adriano Cordova
adrianox at gmail.com
Wed May 28 10:38:21 CEST 2025
Download via both TFTP and HTTP an EFI application implementing
an HTTP client using the U-Boot EFI_HTTP_PROTOCOL implementation
as backend, and from the application then download a payload via
HTTP.
Signed-off-by: Adriano Cordova <adriano.cordova at canonical.com>
---
test/py/tests/test_efi_loader.py | 63 ++++++++++++++++++++++++++++++++
1 file changed, 63 insertions(+)
diff --git a/test/py/tests/test_efi_loader.py b/test/py/tests/test_efi_loader.py
index dc58c0d4dbd..1714af0f255 100644
--- a/test/py/tests/test_efi_loader.py
+++ b/test/py/tests/test_efi_loader.py
@@ -48,6 +48,18 @@ For example:
'addr': 0x40400000, # load address
}
+ # Details regarding a httpprotocol 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_httpprotocol_file = {
+ 'fn': 'lib/efi_loader/netdump.efi', # file name
+ 'size': 5058624, # file length in bytes
+ 'crc32': 'c2244b26', # CRC32 check sum
+ 'addr': 0x40400000, # load address
+ 'payload': 'http://10.0.2.2/path/to/payload', # file uri
+ 'payload_length': 6354745, # file length in bytes
+ 'payload_crc32': 'b22e4a36', # CRC32 check sum
+ }
+
# 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.
@@ -200,6 +212,57 @@ def test_efi_helloworld_net_http(ubman):
do_test_efi_helloworld_net(ubman, PROTO_HTTP);
+def do_test_efi_httpprotocol_net(ubman, proto):
+ f = ubman.config.env.get('env__efi_loader_httpprotocol_file', None)
+ if not f:
+ pytest.skip('No env__efi_loader_httpprotocol_file specified in environment')
+
+ payload = f.get('payload', None)
+ if not payload:
+ pytest.skip('No payload specified in env__efi_loader_httpprotocol_file')
+
+ ubman.run_command('setenv bootargs nocolor');
+
+ addr = fetch_file(ubman, 'env__efi_loader_httpprotocol_file', proto)
+
+ output = ubman.run_command('bootefi %x' % addr)
+ assert "NET Dump" in output
+ assert '## Application failed' not in output
+ response = ubman.run_command('wget %s' % payload, wait_for_echo=False)
+ expected_text = 'Efi Http request executed successfully'
+ assert expected_text in response
+ expected_length = f.get('payload_length', None)
+ if expected_length:
+ assert f"length: {expected_length}" in response
+ expected_crc = f.get('payload_crc32', None)
+ if expected_crc:
+ assert f"crc32: 0x{expected_crc}" in response
+ ubman.restart_uboot()
+
+ at pytest.mark.buildconfigspec('of_control')
+ at pytest.mark.buildconfigspec('efi_http_protocol')
+ at pytest.mark.buildconfigspec('cmd_tftpboot')
+def test_efi_httpprotocol_net_tftp(ubman):
+ """Run the httpprotocol.efi binary via HTTP.
+
+ The httppotocol.efi file is downloaded from the TFTP server and executed
+ """
+
+ do_test_efi_httpprotocol_net(ubman, PROTO_TFTP);
+
+ at pytest.mark.buildconfigspec('of_control')
+ at pytest.mark.buildconfigspec('efi_http_protocol')
+ at pytest.mark.buildconfigspec('cmd_wget')
+def test_efi_httpprotocol_net_http(ubman):
+ """Run the httpprotocol.efi binary via HTTP.
+
+ The httppotocol.efi file is downloaded from the HTTP server and executed
+ """
+ if ubman.config.env.get('env__efi_helloworld_net_http_test_skip', False):
+ pytest.skip('httpprotocol.efi HTTP test is not enabled!')
+
+ do_test_efi_httpprotocol_net(ubman, PROTO_HTTP);
+
@pytest.mark.buildconfigspec('cmd_bootefi_hello')
def test_efi_helloworld_builtin(ubman):
"""Run the builtin helloworld.efi binary.
--
2.48.1
More information about the U-Boot
mailing list