summaryrefslogtreecommitdiff
path: root/tests
diff options
context:
space:
mode:
authorYu-Ping Wu <yupingso@chromium.org>2020-05-13 12:36:43 +0800
committerCommit Bot <commit-bot@chromium.org>2020-06-01 07:52:30 +0000
commit251c0f23f57f54dcc3bb91b4ef78598e971afa1f (patch)
treea4b62bf68430c7f2c2a09ec5d027f17ad1242b65 /tests
parent402d191efef56e88d30d270a5ce0c9f11b2f75e0 (diff)
downloadvboot-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.c27
-rw-r--r--tests/vb2_ui_tests.c69
-rw-r--r--tests/vb2_ui_utility_tests.c66
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;
}