diff options
author | Yu-Ping Wu <yupingso@chromium.org> | 2020-05-13 12:36:43 +0800 |
---|---|---|
committer | Commit Bot <commit-bot@chromium.org> | 2020-06-01 07:52:30 +0000 |
commit | 251c0f23f57f54dcc3bb91b4ef78598e971afa1f (patch) | |
tree | a4b62bf68430c7f2c2a09ec5d027f17ad1242b65 /tests | |
parent | 402d191efef56e88d30d270a5ce0c9f11b2f75e0 (diff) | |
download | vboot-251c0f23f57f54dcc3bb91b4ef78598e971afa1f.tar.gz |
vboot/ui: implement language selection screen
Implement language selection screen, and add language item to all the
other screens. Add a default screen init function default_screen_init()
to initialize the default selection to the second item if the first item
is the language selection.
BRANCH=none
BUG=b:146399181, b:144968920
TEST=make runtests
TEST=USE="menu_ui" emerge-nami depthcharge
Cq-Depend: chromium:2193151, chromium:2192508
Change-Id: I3251b0095ec29ec26cc27745b1089e60894c892c
Signed-off-by: Yu-Ping Wu <yupingso@chromium.org>
Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/vboot_reference/+/2196095
Reviewed-by: Joel Kitching <kitching@chromium.org>
Diffstat (limited to 'tests')
-rw-r--r-- | tests/vb2_ui_action_tests.c | 27 | ||||
-rw-r--r-- | tests/vb2_ui_tests.c | 69 | ||||
-rw-r--r-- | tests/vb2_ui_utility_tests.c | 66 |
3 files changed, 130 insertions, 32 deletions
diff --git a/tests/vb2_ui_action_tests.c b/tests/vb2_ui_action_tests.c index ddb9ee38..e778f6ee 100644 --- a/tests/vb2_ui_action_tests.c +++ b/tests/vb2_ui_action_tests.c @@ -105,18 +105,13 @@ static vb2_error_t mock_action_flag2(struct vb2_ui_context *ui) /* Mock screens */ struct vb2_screen_info mock_screen_temp; -const struct vb2_menu_item mock_empty_menu[] = {}; const struct vb2_screen_info mock_screen_blank = { .id = VB2_SCREEN_BLANK, .name = "mock_screen_blank", - .num_items = ARRAY_SIZE(mock_empty_menu), - .items = mock_empty_menu, }; const struct vb2_screen_info mock_screen_base = { .id = MOCK_SCREEN_BASE, .name = "mock_screen_base: menuless screen", - .num_items = ARRAY_SIZE(mock_empty_menu), - .items = mock_empty_menu, }; const struct vb2_menu_item mock_screen_menu_items[] = { { @@ -142,33 +137,27 @@ const struct vb2_menu_item mock_screen_menu_items[] = { const struct vb2_screen_info mock_screen_menu = { .id = MOCK_SCREEN_MENU, .name = "mock_screen_menu: screen with 5 items", - .num_items = ARRAY_SIZE(mock_screen_menu_items), - .items = mock_screen_menu_items, + .menu = { + .num_items = ARRAY_SIZE(mock_screen_menu_items), + .items = mock_screen_menu_items, + }, }; const struct vb2_screen_info mock_screen_target0 = { .id = MOCK_SCREEN_TARGET0, .name = "mock_screen_target0", - .num_items = ARRAY_SIZE(mock_empty_menu), - .items = mock_empty_menu, }; const struct vb2_screen_info mock_screen_target1 = { .id = MOCK_SCREEN_TARGET1, .name = "mock_screen_target1", - .num_items = ARRAY_SIZE(mock_empty_menu), - .items = mock_empty_menu, }; const struct vb2_screen_info mock_screen_target2 = { .id = MOCK_SCREEN_TARGET2, .name = "mock_screen_target2", - .num_items = ARRAY_SIZE(mock_empty_menu), - .items = mock_empty_menu, }; const struct vb2_screen_info mock_screen_action = { .id = MOCK_SCREEN_ACTION, .name = "mock_screen_action", .action = mock_action_countdown, - .num_items = ARRAY_SIZE(mock_empty_menu), - .items = mock_empty_menu, }; const struct vb2_menu_item mock_screen_all_action_items[] = { { @@ -180,8 +169,10 @@ const struct vb2_screen_info mock_screen_all_action = { .id = MOCK_SCREEN_ALL_ACTION, .name = "mock_screen_all_action", .action = mock_action_flag0, - .num_items = ARRAY_SIZE(mock_screen_all_action_items), - .items = mock_screen_all_action_items, + .menu = { + .num_items = ARRAY_SIZE(mock_screen_all_action_items), + .items = mock_screen_all_action_items, + }, }; static void screen_state_eq(const struct vb2_screen_state *state, @@ -293,8 +284,6 @@ static void reset_common_data(void) mock_screen_temp = (struct vb2_screen_info){ .id = MOCK_NO_SCREEN, .name = "mock_screen_temp", - .num_items = ARRAY_SIZE(mock_empty_menu), - .items = mock_empty_menu, }; /* Mock ui_context based on mock screens */ diff --git a/tests/vb2_ui_tests.c b/tests/vb2_ui_tests.c index 4066e5b8..aef133eb 100644 --- a/tests/vb2_ui_tests.c +++ b/tests/vb2_ui_tests.c @@ -39,6 +39,8 @@ static struct display_call mock_displayed[64]; static int mock_displayed_count; static int mock_displayed_i; +static uint32_t mock_locale_count; + static int mock_calls_until_shutdown; /* Iteration counter starts from 0 @@ -194,6 +196,9 @@ static void reset_common_data(enum reset_type t) mock_displayed_count = 0; mock_displayed_i = 0; + /* For vb2ex_get_locale_count */ + mock_locale_count = 1; + /* For check_shutdown_request */ if (t == FOR_DEVELOPER) mock_calls_until_shutdown = 2000; /* Larger than 30s */ @@ -280,6 +285,11 @@ vb2_error_t vb2ex_display_ui(enum vb2_screen screen, return VB2_SUCCESS; } +uint32_t vb2ex_get_locale_count(void) +{ + return mock_locale_count; +} + uint32_t VbExIsShutdownRequested(void) { if (mock_calls_until_shutdown < 0) /* Never request shutdown */ @@ -502,7 +512,7 @@ static void manual_recovery_tests(void) TEST_EQ(vb2_manual_recovery_menu(ctx), VB2_REQUEST_SHUTDOWN, "phone recovery"); displayed_eq("recovery select", VB2_SCREEN_RECOVERY_SELECT, - MOCK_IGNORE, 0, MOCK_IGNORE); + MOCK_IGNORE, 1, MOCK_IGNORE); displayed_eq("phone recovery", VB2_SCREEN_RECOVERY_PHONE_STEP1, MOCK_IGNORE, MOCK_IGNORE, MOCK_IGNORE); displayed_no_extra(); @@ -514,9 +524,9 @@ static void manual_recovery_tests(void) TEST_EQ(vb2_manual_recovery_menu(ctx), VB2_REQUEST_SHUTDOWN, "external disk recovery"); displayed_eq("recovery select", VB2_SCREEN_RECOVERY_SELECT, - MOCK_IGNORE, 0, MOCK_IGNORE); - displayed_eq("recovery select", VB2_SCREEN_RECOVERY_SELECT, MOCK_IGNORE, 1, MOCK_IGNORE); + displayed_eq("recovery select", VB2_SCREEN_RECOVERY_SELECT, + MOCK_IGNORE, 2, MOCK_IGNORE); displayed_eq("disk recovery", VB2_SCREEN_RECOVERY_DISK_STEP1, MOCK_IGNORE, MOCK_IGNORE, MOCK_IGNORE); displayed_no_extra(); @@ -703,11 +713,64 @@ static void manual_recovery_tests(void) VB2_DEBUG("...done.\n"); } +static void language_selection_tests(void) +{ + VB2_DEBUG("Testing language selection...\n"); + + /* Enter language menu and change language */ + reset_common_data(FOR_MANUAL_RECOVERY); + mock_locale_count = 100; + vb2_nv_set(ctx, VB2_NV_LOCALIZATION_INDEX, 23); + add_mock_keypress(VB_KEY_UP); + add_mock_keypress(VB_KEY_ENTER); /* select language */ + add_mock_keypress(VB_KEY_DOWN); + add_mock_keypress(VB_KEY_ENTER); /* select locale 24 */ + add_mock_vbtlk(VB2_ERROR_LK_NO_DISK_FOUND, VB_DISK_FLAG_REMOVABLE); + TEST_EQ(vb2_manual_recovery_menu(ctx), VB2_REQUEST_SHUTDOWN, + "change language"); + displayed_eq("RECOVERY_SELECT default", VB2_SCREEN_RECOVERY_SELECT, + 23, MOCK_IGNORE, MOCK_IGNORE); + displayed_eq("RECOVERY_SELECT lang", VB2_SCREEN_RECOVERY_SELECT, + 23, 0, MOCK_IGNORE); + displayed_eq("LANGUAGE_SELECT 23", VB2_SCREEN_LANGUAGE_SELECT, + 23, 23, MOCK_IGNORE); + displayed_eq("LANGUAGE_SELECT 24", VB2_SCREEN_LANGUAGE_SELECT, + 23, 24, MOCK_IGNORE); + displayed_eq("RECOVERY_SELECT new locale", VB2_SCREEN_RECOVERY_SELECT, + 24, MOCK_IGNORE, MOCK_IGNORE); + displayed_no_extra(); + TEST_EQ(vb2_nv_get(ctx, VB2_NV_LOCALIZATION_INDEX), 24, + " locale 24 saved to nvdata"); + + /* Locale count = 0 */ + reset_common_data(FOR_MANUAL_RECOVERY); + mock_locale_count = 0; + vb2_nv_set(ctx, VB2_NV_LOCALIZATION_INDEX, 23); + add_mock_keypress(VB_KEY_UP); + add_mock_keypress(VB_KEY_ENTER); /* select language */ + add_mock_keypress(VB_KEY_ENTER); /* select locale 0 */ + add_mock_vbtlk(VB2_ERROR_LK_NO_DISK_FOUND, VB_DISK_FLAG_REMOVABLE); + TEST_EQ(vb2_manual_recovery_menu(ctx), VB2_REQUEST_SHUTDOWN, + "enter language menu"); + displayed_eq("RECOVERY_SELECT default", VB2_SCREEN_RECOVERY_SELECT, + 23, MOCK_IGNORE, MOCK_IGNORE); + displayed_eq("RECOVERY_SELECT lang", VB2_SCREEN_RECOVERY_SELECT, + 23, 0, MOCK_IGNORE); + displayed_eq("LANGUAGE_SELECT index 0", VB2_SCREEN_LANGUAGE_SELECT, + 23, 0, MOCK_IGNORE); + displayed_eq("RECOVERY_SELECT locale 0", VB2_SCREEN_RECOVERY_SELECT, + 0, MOCK_IGNORE, MOCK_IGNORE); + displayed_no_extra(); + + VB2_DEBUG("...done.\n"); +} + int main(void) { developer_tests(); broken_recovery_tests(); manual_recovery_tests(); + language_selection_tests(); return gTestSuccess ? 0 : 255; } diff --git a/tests/vb2_ui_utility_tests.c b/tests/vb2_ui_utility_tests.c index 257e69d9..533aa514 100644 --- a/tests/vb2_ui_utility_tests.c +++ b/tests/vb2_ui_utility_tests.c @@ -29,6 +29,7 @@ static uint8_t workbuf[VB2_KERNEL_WORKBUF_RECOMMENDED_SIZE] static struct vb2_context *ctx; static struct vb2_gbb_header gbb; +static uint32_t mock_locale_count; static int mock_shutdown_request; static struct vb2_ui_context mock_ui_context; @@ -43,22 +44,18 @@ static vb2_error_t mock_action_base(struct vb2_ui_context *ui) } /* Mock screens */ -const struct vb2_menu_item mock_empty_menu[] = {}; struct vb2_screen_info mock_screen_blank = { .id = VB2_SCREEN_BLANK, .name = "mock_screen_blank", - .num_items = ARRAY_SIZE(mock_empty_menu), - .items = mock_empty_menu, }; struct vb2_screen_info mock_screen_base = { .id = MOCK_SCREEN_BASE, .name = "mock_screen_base: menuless screen", - .num_items = ARRAY_SIZE(mock_empty_menu), - .items = mock_empty_menu, }; struct vb2_menu_item mock_screen_menu_items[] = { { - .text = "option 0", + .text = "option 0: language selection", + .is_language_select = 1, }, { .text = "option 1", @@ -76,14 +73,14 @@ struct vb2_menu_item mock_screen_menu_items[] = { const struct vb2_screen_info mock_screen_menu = { .id = MOCK_SCREEN_MENU, .name = "mock_screen_menu: screen with 5 options", - .num_items = ARRAY_SIZE(mock_screen_menu_items), - .items = mock_screen_menu_items, + .menu = { + .num_items = ARRAY_SIZE(mock_screen_menu_items), + .items = mock_screen_menu_items, + }, }; const struct vb2_screen_info mock_screen_root = { .id = MOCK_SCREEN_ROOT, .name = "mock_screen_root", - .num_items = ARRAY_SIZE(mock_empty_menu), - .items = mock_empty_menu, }; static void screen_state_eq(const struct vb2_screen_state *state, @@ -115,6 +112,9 @@ static void reset_common_data(void) vb2_nv_init(ctx); + /* For vb2ex_get_locale_count */ + mock_locale_count = 1; + /* For check_shutdown_request */ mock_shutdown_request = MOCK_IGNORE; @@ -133,6 +133,11 @@ struct vb2_gbb_header *vb2_get_gbb(struct vb2_context *c) return &gbb; } +uint32_t vb2ex_get_locale_count(void) +{ + return mock_locale_count; +} + uint32_t VbExIsShutdownRequested(void) { if (mock_shutdown_request != MOCK_IGNORE) @@ -299,6 +304,46 @@ static void change_screen_tests(void) VB2_SUCCESS, "change to screen with init"); TEST_EQ(mock_action_called, 1, " action called once"); + /* Change to screen without init; using default init() */ + reset_common_data(); + mock_state->screen = &mock_screen_base; + TEST_EQ(vb2_ui_change_screen(&mock_ui_context, MOCK_SCREEN_MENU), + VB2_REQUEST_UI_CONTINUE, + "change to screen with language selection"); + screen_state_eq(mock_state, MOCK_SCREEN_MENU, + 1, /* Since index 0 is the language selection */ + 0); + + VB2_DEBUG("...done.\n"); +} + +static void get_language_menu_tests(void) +{ + const struct vb2_menu *menu; + const struct vb2_menu_item *items; + VB2_DEBUG("Testing get_language_menu...\n"); + + /* Only allocate menu items once */ + reset_common_data(); + mock_locale_count = 7; + menu = get_language_menu(&mock_ui_context); + TEST_PTR_NEQ(menu, NULL, "get language menu"); + TEST_EQ(menu->num_items, 7, " correct locale count"); + TEST_PTR_NEQ(menu->items, NULL, " items not null"); + items = menu->items; + + menu = get_language_menu(&mock_ui_context); + TEST_PTR_NEQ(menu, NULL, "get language menu again"); + TEST_EQ(menu->num_items, 7, " correct locale count again"); + TEST_PTR_EQ(menu->items, items, " same pointer of items"); + + /* Locale count = 0 */ + reset_common_data(); + mock_locale_count = 0; + menu = get_language_menu(&mock_ui_context); + TEST_PTR_NEQ(menu, NULL, "menu not null"); + TEST_EQ(menu->num_items, 1, " locale count 1"); + VB2_DEBUG("...done.\n"); } @@ -307,6 +352,7 @@ int main(void) check_shutdown_request_tests(); vb2_ui_change_root_tests(); change_screen_tests(); + get_language_menu_tests(); return gTestSuccess ? 0 : 255; } |