summaryrefslogtreecommitdiff
path: root/tests
diff options
context:
space:
mode:
authorJoel Kitching <kitching@google.com>2020-08-03 23:52:27 +0800
committerCommit Bot <commit-bot@chromium.org>2020-09-11 10:47:08 +0000
commitf573cf6669b5f2972f29f511efead068b8c3b38e (patch)
treea294e9fafe4ddf4692ac79820abaa6c4a67d0509 /tests
parentade6151a678c59e270c89bcca37f61cfdd41700d (diff)
downloadvboot-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.c97
-rw-r--r--tests/vb2_ui_tests.c48
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 */