diff options
author | Joel Kitching <kitching@google.com> | 2020-08-03 23:52:27 +0800 |
---|---|---|
committer | Commit Bot <commit-bot@chromium.org> | 2020-09-11 10:47:08 +0000 |
commit | f573cf6669b5f2972f29f511efead068b8c3b38e (patch) | |
tree | a294e9fafe4ddf4692ac79820abaa6c4a67d0509 /tests | |
parent | ade6151a678c59e270c89bcca37f61cfdd41700d (diff) | |
download | vboot-f573cf6669b5f2972f29f511efead068b8c3b38e.tar.gz |
vboot: Introduce alternate boot functionality
Introduce alternate boot functionality both via keyboard shortcut
("Ctrl+L") to directly boot into the default alternate bootloader,
and via menu ("Alternate bootloader" on dev screen) to show a screen
listing available bootloaders.
BUG=b:146399181, b:161092974
TEST=make clean && make runtests
BRANCH=puff, zork
Cq-Depend: chromium:2339040
Signed-off-by: Joel Kitching <kitching@google.com>
Change-Id: I28f157936017719dc95656db147967f5e61a1407
Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/vboot_reference/+/2335017
Commit-Queue: Yu-Ping Wu <yupingso@chromium.org>
Tested-by: Hsuan Ting Chen <roccochen@chromium.org>
Reviewed-by: Yu-Ping Wu <yupingso@chromium.org>
Reviewed-by: Joel Kitching <kitching@chromium.org>
Diffstat (limited to 'tests')
-rw-r--r-- | tests/vb2_ui_action_tests.c | 97 | ||||
-rw-r--r-- | tests/vb2_ui_tests.c | 48 |
2 files changed, 141 insertions, 4 deletions
diff --git a/tests/vb2_ui_action_tests.c b/tests/vb2_ui_action_tests.c index 493162f0..79f82caa 100644 --- a/tests/vb2_ui_action_tests.c +++ b/tests/vb2_ui_action_tests.c @@ -59,6 +59,13 @@ static int mock_get_screen_info_called; static vb2_error_t mock_vbtlk_retval; static uint32_t mock_vbtlk_expected_flag; +static int mock_dev_boot_allowed; +static int mock_dev_boot_legacy_allowed; + +static int mock_vbexlegacy_called; +static enum VbAltFwIndex_t mock_altfw_num_last; +static uint32_t mock_bootloader_count; + /* Mock actions */ static uint32_t mock_action_called; static uint32_t mock_action_countdown_limit; @@ -334,6 +341,15 @@ static void reset_common_data(void) /* For VbTryLoadKernel */ mock_vbtlk_retval = VB2_ERROR_MOCK; mock_vbtlk_expected_flag = MOCK_IGNORE; + + /* For dev_boot* in 2misc.h */ + mock_dev_boot_allowed = 1; + mock_dev_boot_legacy_allowed = 0; + + /* For VbExLegacy */ + mock_vbexlegacy_called = 0; + mock_altfw_num_last = -100; + mock_bootloader_count = 2; } /* Mock functions */ @@ -445,6 +461,32 @@ vb2_error_t VbTryLoadKernel(struct vb2_context *c, uint32_t get_info_flags) return mock_vbtlk_retval; } +int vb2_dev_boot_allowed(struct vb2_context *c) +{ + return mock_dev_boot_allowed; +} + +int vb2_dev_boot_legacy_allowed(struct vb2_context *c) +{ + return mock_dev_boot_legacy_allowed; +} + +vb2_error_t VbExLegacy(enum VbAltFwIndex_t altfw_num) +{ + mock_vbexlegacy_called++; + mock_altfw_num_last = altfw_num; + + if (altfw_num <= mock_bootloader_count) + return VB2_SUCCESS; + else + return VB2_ERROR_UNKNOWN; +} + +uint32_t vb2ex_get_bootloader_count(void) +{ + return mock_bootloader_count; +} + /* Tests */ static void menu_prev_tests(void) { @@ -630,6 +672,58 @@ static void menu_select_tests(void) VB2_DEBUG("...done.\n"); } +static void vb2_ui_developer_mode_boot_alternate_action_tests(void) +{ + VB2_DEBUG("Test developer mode boot alternate action...\n"); + + /* Not allowed: not in dev mode */ + reset_common_data(); + mock_dev_boot_legacy_allowed = 1; + TEST_EQ(vb2_ui_developer_mode_boot_alternate_action(&mock_ui_context), + VB2_REQUEST_UI_CONTINUE, "not allowed: not in dev mode"); + TEST_EQ(mock_vbexlegacy_called, 0, " VbExLegacy not called"); + + /* Not allowed: dev boot not allowed */ + reset_common_data(); + ctx->flags |= VB2_CONTEXT_DEVELOPER_MODE; + mock_dev_boot_allowed = 0; + mock_dev_boot_legacy_allowed = 1; + TEST_EQ(vb2_ui_developer_mode_boot_alternate_action(&mock_ui_context), + VB2_REQUEST_UI_CONTINUE, "not allowed: dev boot not allowed"); + TEST_EQ(mock_vbexlegacy_called, 0, " VbExLegacy not called"); + + /* Not allowed: boot legacy not allowed */ + reset_common_data(); + ctx->flags |= VB2_CONTEXT_DEVELOPER_MODE; + TEST_EQ(vb2_ui_developer_mode_boot_alternate_action(&mock_ui_context), + VB2_REQUEST_UI_CONTINUE, + "not allowed: boot legacy not allowed"); + TEST_EQ(mock_vbexlegacy_called, 0, " VbExLegacy not called"); + + /* Allowed */ + reset_common_data(); + ctx->flags |= VB2_CONTEXT_DEVELOPER_MODE; + mock_dev_boot_legacy_allowed = 1; + mock_ui_context.state->selected_item = 2; + TEST_EQ(vb2_ui_developer_mode_boot_alternate_action(&mock_ui_context), + VB2_REQUEST_UI_CONTINUE, "allowed"); + TEST_EQ(mock_vbexlegacy_called, 1, " VbExLegacy called once"); + TEST_EQ(mock_altfw_num_last, 2, " select bootloader #2"); + + /* CTRL+L = default bootloader */ + reset_common_data(); + ctx->flags |= VB2_CONTEXT_DEVELOPER_MODE; + mock_dev_boot_legacy_allowed = 1; + mock_ui_context.key = VB_KEY_CTRL('L'); + mock_ui_context.state->selected_item = 4; /* Ignored */ + TEST_EQ(vb2_ui_developer_mode_boot_alternate_action(&mock_ui_context), + VB2_REQUEST_UI_CONTINUE, "allowed: ctrl+l"); + TEST_EQ(mock_vbexlegacy_called, 1, " VbExLegacy called once"); + TEST_EQ(mock_altfw_num_last, 0, " select bootloader #0"); + + VB2_DEBUG("...done.\n"); +} + static void manual_recovery_action_tests(void) { VB2_DEBUG("Testing manual recovery action...\n"); @@ -831,6 +925,9 @@ int main(void) menu_next_tests(); menu_select_tests(); + /* Screen actions */ + vb2_ui_developer_mode_boot_alternate_action_tests(); + /* Global actions */ manual_recovery_action_tests(); diff --git a/tests/vb2_ui_tests.c b/tests/vb2_ui_tests.c index 569a179c..66916602 100644 --- a/tests/vb2_ui_tests.c +++ b/tests/vb2_ui_tests.c @@ -77,6 +77,7 @@ static int mock_dev_boot_external_allowed; static int mock_vbexlegacy_called; static enum VbAltFwIndex_t mock_altfw_num_last; +static uint32_t mock_bootloader_count; static vb2_error_t mock_vbtlk_retval[32]; static uint32_t mock_vbtlk_expected_flag[32]; @@ -302,6 +303,7 @@ static void reset_common_data(enum reset_type t) /* For VbExLegacy */ mock_vbexlegacy_called = 0; mock_altfw_num_last = -100; + mock_bootloader_count = 2; /* For VbTryLoadKernel */ memset(mock_vbtlk_retval, 0, sizeof(mock_vbtlk_retval)); @@ -482,6 +484,11 @@ vb2_error_t VbExLegacy(enum VbAltFwIndex_t altfw_num) return VB2_SUCCESS; } +uint32_t vb2ex_get_bootloader_count(void) +{ + return mock_bootloader_count; +} + vb2_error_t VbTryLoadKernel(struct vb2_context *c, uint32_t get_info_flags) { int i = mock_iters; @@ -669,6 +676,25 @@ static void developer_tests(void) TEST_TRUE(mock_get_timer_last - mock_time_start < 30 * VB2_MSEC_PER_SEC, " delay aborted"); + /* Ctrl+L = boot legacy (allowed) */ + reset_common_data(FOR_DEVELOPER); + mock_dev_boot_legacy_allowed = 1; + add_mock_keypress(VB_KEY_CTRL('L')); + TEST_EQ(vb2_developer_menu(ctx), VB2_REQUEST_SHUTDOWN, + "ctrl+l = boot legacy"); + TEST_EQ(mock_vbexlegacy_called, 1, " VbExLegacy called"); + TEST_TRUE(mock_get_timer_last - mock_time_start < + 30 * VB2_MSEC_PER_SEC, " delay aborted"); + + /* Ctrl+L = boot legacy (disallowed) */ + reset_common_data(FOR_DEVELOPER); + add_mock_keypress(VB_KEY_CTRL('L')); + TEST_EQ(vb2_developer_menu(ctx), VB2_REQUEST_SHUTDOWN, + "ctrl+l = boot legacy"); + TEST_EQ(mock_vbexlegacy_called, 0, " VbExLegacy not called"); + TEST_TRUE(mock_get_timer_last - mock_time_start < + 30 * VB2_MSEC_PER_SEC, " delay aborted"); + /* VB_BUTTON_VOL_UP_LONG_PRESS = boot external */ if (DETACHABLE) { reset_common_data(FOR_DEVELOPER); @@ -1164,6 +1190,7 @@ static void developer_screen_tests(void) /* Dev mode: disabled item mask */ reset_common_data(FOR_DEVELOPER); + mock_dev_boot_legacy_allowed = 1; add_mock_vbtlk(VB2_SUCCESS, VB_DISK_FLAG_FIXED); TEST_EQ(vb2_developer_menu(ctx), VB2_SUCCESS, "dev mode screen: no disabled item mask"); @@ -1171,6 +1198,7 @@ static void developer_screen_tests(void) MOCK_IGNORE, MOCK_IGNORE, 0x0, MOCK_IGNORE); reset_common_data(FOR_DEVELOPER); + mock_dev_boot_legacy_allowed = 1; gbb.flags |= VB2_GBB_FLAG_FORCE_DEV_SWITCH_ON; add_mock_vbtlk(VB2_SUCCESS, VB_DISK_FLAG_FIXED); TEST_EQ(vb2_developer_menu(ctx), VB2_SUCCESS, @@ -1181,6 +1209,7 @@ static void developer_screen_tests(void) reset_common_data(FOR_DEVELOPER); add_mock_vbtlk(VB2_SUCCESS, VB_DISK_FLAG_FIXED); mock_dev_boot_external_allowed = 0; + mock_dev_boot_legacy_allowed = 1; TEST_EQ(vb2_developer_menu(ctx), VB2_SUCCESS, "dev mode screen: disable boot external"); DISPLAYED_EQ("dev mode screen", VB2_SCREEN_DEVELOPER_MODE, @@ -1237,8 +1266,19 @@ static void developer_screen_tests(void) DISPLAYED_NO_EXTRA(); reset_common_data(FOR_DEVELOPER); /* Select #2 by default */ + mock_dev_boot_legacy_allowed = 1; + /* #4: Alternate boot */ + add_mock_keypress(VB_KEY_DOWN); + add_mock_keypress(VB_KEY_DOWN); + add_mock_keypress(VB_KEY_ENTER); + add_mock_keypress(VB_KEY_ENTER); + TEST_EQ(vb2_developer_menu(ctx), VB2_REQUEST_SHUTDOWN, + "dev mode screen"); + TEST_EQ(mock_vbexlegacy_called, 1, " VbExLegacy called"); + + reset_common_data(FOR_DEVELOPER); /* Select #2 by default */ add_mock_vbtlk(VB2_SUCCESS, VB_DISK_FLAG_FIXED); - /* #4: Advanced options */ + /* #5: Advanced options */ add_mock_keypress(VB_KEY_DOWN); add_mock_keypress(VB_KEY_DOWN); add_mock_keypress(VB_KEY_ENTER); @@ -1248,17 +1288,17 @@ static void developer_screen_tests(void) add_mock_keypress(VB_KEY_DOWN); /* Blocked */ TEST_EQ(vb2_developer_menu(ctx), VB2_REQUEST_SHUTDOWN, "dev mode screen"); - /* #4: Advanced options */ + /* #5: Advanced options */ DISPLAYED_PASS(); DISPLAYED_PASS(); DISPLAYED_EQ("dev mode", VB2_SCREEN_DEVELOPER_MODE, - MOCK_IGNORE, 4, MOCK_IGNORE, MOCK_IGNORE); + MOCK_IGNORE, 5, MOCK_IGNORE, MOCK_IGNORE); DISPLAYED_EQ("#4: advanced options", VB2_SCREEN_ADVANCED_OPTIONS, MOCK_IGNORE, MOCK_IGNORE, MOCK_IGNORE, MOCK_IGNORE); /* End of menu */ DISPLAYED_PASS(); DISPLAYED_EQ("end of menu", VB2_SCREEN_DEVELOPER_MODE, - MOCK_IGNORE, 5, MOCK_IGNORE, MOCK_IGNORE); + MOCK_IGNORE, 6, MOCK_IGNORE, MOCK_IGNORE); DISPLAYED_NO_EXTRA(); /* Advanced options screen */ |