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)); + + 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() -- 2.43.0
