On 8/11/26 17:40, Aristo Chen via U-Boot wrote:
Add a bootstd test for the error path of the efi_mgr bootmeth: point
BootOrder at a load option that does not exist and check that booting
the bootflow returns -EIO rather than the generic -EFAULT that
bootflow_boot() reports when a boot() method returns zero.
Running the real boot manager initialises the EFI subsystem in the
sandbox process, which would leak into later tests, so restart U-Boot
after this test in test_ut.py as is already done for other
session-changing tests.
Signed-off-by: Aristo Chen <[email protected]>
---
test/boot/bootflow.c | 35 +++++++++++++++++++++++++++++++++++
test/py/tests/test_ut.py | 3 ++-
2 files changed, 37 insertions(+), 1 deletion(-)
diff --git a/test/boot/bootflow.c b/test/boot/bootflow.c
index 1cc137c9700..2d80577921f 100644
--- a/test/boot/bootflow.c
+++ b/test/boot/bootflow.c
@@ -470,6 +470,41 @@ static int bootflow_system(struct unit_test_state *uts)
}
BOOTSTD_TEST(bootflow_system, UTF_DM | UTF_SCAN_PDATA | UTF_SCAN_FDT |
UTF_CONSOLE);
+
+/* Check that a failed 'efi_mgr' boot reports the boot manager's error */
+static int bootflow_efi_mgr_err(struct unit_test_state *uts)
+{
+ struct udevice *bootstd, *dev;
+ struct bootflow *bflow;
+ int ret;
+
+ if (!IS_ENABLED(CONFIG_EFI_BOOTMGR) || !IS_ENABLED(CONFIG_CMD_EFIDEBUG))
+ return -EAGAIN;
+ ut_assertok(uclass_first_device_err(UCLASS_BOOTSTD, &bootstd));
+ ut_assertok(device_bind(bootstd, DM_DRIVER_GET(bootmeth_3efi_mgr),
+ "efi_mgr", 0, ofnode_null(), &dev));
+ ut_assertok(device_probe(dev));
+ sandbox_set_fake_efi_mgr_dev(dev, true);
+
+ bootstd_clear_glob();
+ ut_assertok(run_command("bootflow scan -H", 0));
+
+ /* Point BootOrder at a load option that does not exist */
+ ut_assertok(run_command("efidebug boot order 00ff", 0));
It should not be possible to add non-existent boot-options to BootOrder.
We should fix this in the efidebug command.
Please, do not rely on this buggy behavior.
Best regards
Heinrich
+
+ for (ret = bootflow_first_glob(&bflow); !ret;
+ ret = bootflow_next_glob(&bflow)) {
+ if (!strcmp("efi_mgr", bflow->method->name))
+ break;
+ }
+ ut_assertok(ret);
+
+ /* The boot manager cannot load anything; its error must not be lost */
+ ut_asserteq(-EIO, bootflow_boot(bflow));
+
+ return 0;
+}
+BOOTSTD_TEST(bootflow_efi_mgr_err, UTF_DM | UTF_SCAN_PDATA | UTF_SCAN_FDT);
#endif
/* Check disabling a bootmethod if it requests it */
diff --git a/test/py/tests/test_ut.py b/test/py/tests/test_ut.py
index fa50c8008a5..787020e3e0c 100644
--- a/test/py/tests/test_ut.py
+++ b/test/py/tests/test_ut.py
@@ -643,7 +643,8 @@ def ut_ubman_fixture(ubman, ut_subtest):
yield ubman
- if ut_subtest in ("bootstd bootflow_cmd_boot", "bootstd bootflow_scan_boot"):
+ if ut_subtest in ("bootstd bootflow_cmd_boot", "bootstd
bootflow_scan_boot",
+ "bootstd bootflow_efi_mgr_err"):
ubman.restart_uboot()