diff options
author | Joel Kitching <kitching@google.com> | 2020-05-05 10:45:29 +0800 |
---|---|---|
committer | Commit Bot <commit-bot@chromium.org> | 2020-05-05 10:50:20 +0000 |
commit | 205a3a1bc8f8a51c08889d4bf17d27a731822942 (patch) | |
tree | 47b860aa2f120b4f407154a129a64ebd94a069a1 | |
parent | d72dd12f1dfc5d6682a59b19abc70d479a8b9275 (diff) | |
download | vboot-205a3a1bc8f8a51c08889d4bf17d27a731822942.tar.gz |
vboot/ui: move locale_id from screen_state into ui_context
locale_id is not tied to the current screen -- i.e. it shouldn't
revert if we return to the previous screen.
BUG=b:146399181
TEST=make clean && make runtests
BRANCH=none
Change-Id: I691bdf7938d2a14cfbe68c7f60dc0103c236733c
Signed-off-by: Joel Kitching <kitching@google.com>
Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/vboot_reference/+/2182083
Tested-by: Hsuan Ting Chen <roccochen@chromium.org>
Tested-by: Joel Kitching <kitching@chromium.org>
Reviewed-by: Joel Kitching <kitching@chromium.org>
Commit-Queue: Joel Kitching <kitching@chromium.org>
-rw-r--r-- | firmware/2lib/2ui.c | 6 | ||||
-rw-r--r-- | firmware/2lib/include/2ui.h | 2 | ||||
-rw-r--r-- | tests/vb2_ui_tests.c | 30 | ||||
-rw-r--r-- | tests/vb2_ui_utility_tests.c | 86 |
4 files changed, 57 insertions, 67 deletions
diff --git a/firmware/2lib/2ui.c b/firmware/2lib/2ui.c index 10f51d6a..8eea9afb 100644 --- a/firmware/2lib/2ui.c +++ b/firmware/2lib/2ui.c @@ -184,14 +184,11 @@ vb2_error_t (*input_action_lookup(int key))(struct vb2_ui_context *ui) void change_screen(struct vb2_ui_context *ui, enum vb2_screen id) { const struct vb2_screen_info *new_screen_info = vb2_get_screen_info(id); - int locale_id; if (new_screen_info == NULL) { VB2_DEBUG("ERROR: Screen entry %#x not found; ignoring\n", id); } else { - locale_id = ui->state.locale_id; memset(&ui->state, 0, sizeof(ui->state)); ui->state.screen = new_screen_info; - ui->state.locale_id = locale_id; } } @@ -242,8 +239,7 @@ vb2_error_t ui_loop(struct vb2_context *ctx, enum vb2_screen root_screen_id, ui.state.screen->items[ ui.state.selected_item].text : "null"); - /* TODO: Stop hard-coding the locale. */ - vb2ex_display_ui(ui.state.screen->id, 0, + vb2ex_display_ui(ui.state.screen->id, ui.locale_id, ui.state.selected_item, ui.state.disabled_item_mask); } diff --git a/firmware/2lib/include/2ui.h b/firmware/2lib/include/2ui.h index f179024f..c0e2b634 100644 --- a/firmware/2lib/include/2ui.h +++ b/firmware/2lib/include/2ui.h @@ -34,7 +34,6 @@ struct vb2_menu_item { struct vb2_screen_state { const struct vb2_screen_info *screen; - uint32_t locale_id; uint32_t selected_item; uint32_t disabled_item_mask; }; @@ -43,6 +42,7 @@ struct vb2_ui_context { struct vb2_context *ctx; const struct vb2_screen_info *root_screen; struct vb2_screen_state state; + uint32_t locale_id; uint32_t key; }; diff --git a/tests/vb2_ui_tests.c b/tests/vb2_ui_tests.c index a9984491..c7605d74 100644 --- a/tests/vb2_ui_tests.c +++ b/tests/vb2_ui_tests.c @@ -18,6 +18,13 @@ #define MOCK_IGNORE 0xffffu /* Mock data */ +struct display_call { + const struct vb2_screen_info *screen; + uint32_t locale_id; + uint32_t selected_item; + uint32_t disabled_item_mask; +}; + static uint8_t workbuf[VB2_KERNEL_WORKBUF_RECOMMENDED_SIZE] __attribute__((aligned(VB2_WORKBUF_ALIGN))); static struct vb2_context *ctx; @@ -27,7 +34,7 @@ static struct vb2_gbb_header gbb; static struct vb2_ui_context mock_ui_context; static struct vb2_screen_state *mock_state; -static struct vb2_screen_state mock_displayed[64]; +static struct display_call mock_displayed[64]; static int mock_displayed_count; static int mock_displayed_i; @@ -142,13 +149,18 @@ static void reset_common_data(void) /* For global actions */ invalid_disk_last = -1; - mock_ui_context.ctx = ctx; - mock_ui_context.root_screen = vb2_get_screen_info(VB2_SCREEN_BLANK); - mock_ui_context.state.screen = vb2_get_screen_info(VB2_SCREEN_BLANK); - mock_ui_context.state.locale_id = 0, - mock_ui_context.state.selected_item = 0, - mock_ui_context.state.disabled_item_mask = 0, - mock_ui_context.key = 0; + mock_ui_context = (struct vb2_ui_context){ + .ctx = ctx, + .root_screen = vb2_get_screen_info(VB2_SCREEN_BLANK), + .state = (struct vb2_screen_state){ + .screen = vb2_get_screen_info(VB2_SCREEN_BLANK), + .selected_item = 0, + .disabled_item_mask = 0, + }, + .locale_id = 0, + .key = 0, + + }; mock_state = &mock_ui_context.state; /* For vb2ex_display_ui */ @@ -205,7 +217,7 @@ vb2_error_t vb2ex_display_ui(enum vb2_screen screen, return VB2_ERROR_MOCK; } - mock_displayed[mock_displayed_count] = (struct vb2_screen_state){ + mock_displayed[mock_displayed_count] = (struct display_call){ .screen = vb2_get_screen_info(screen), .locale_id = locale_id, .selected_item = selected_item, diff --git a/tests/vb2_ui_utility_tests.c b/tests/vb2_ui_utility_tests.c index c6f6ff38..da7aaf72 100644 --- a/tests/vb2_ui_utility_tests.c +++ b/tests/vb2_ui_utility_tests.c @@ -29,6 +29,13 @@ #define MOCK_SCREEN_TARGET4 0xff4 /* Mock data */ +struct display_call { + const struct vb2_screen_info *screen; + uint32_t locale_id; + uint32_t selected_item; + uint32_t disabled_item_mask; +}; + static uint8_t workbuf[VB2_KERNEL_WORKBUF_RECOMMENDED_SIZE] __attribute__((aligned(VB2_WORKBUF_ALIGN))); static struct vb2_context *ctx; @@ -39,7 +46,7 @@ static int mock_shutdown_request; static struct vb2_ui_context mock_ui_context; static struct vb2_screen_state *mock_state; -static struct vb2_screen_state mock_displayed[64]; +static struct display_call mock_displayed[64]; static int mock_displayed_count; static int mock_displayed_i; @@ -147,7 +154,6 @@ static vb2_error_t global_action_change_screen(struct vb2_ui_context *ui) static void screen_state_eq(const struct vb2_screen_state *state, enum vb2_screen screen, - uint32_t locale_id, uint32_t selected_item, uint32_t disabled_item_mask) { @@ -157,8 +163,6 @@ static void screen_state_eq(const struct vb2_screen_state *state, else TEST_EQ(state->screen->id, screen, " state.screen"); } - if (locale_id != MOCK_IGNORE) - TEST_EQ(state->locale_id, locale_id, " state.locale_id"); if (selected_item != MOCK_IGNORE) TEST_EQ(state->selected_item, selected_item, " state.selected_item"); @@ -251,10 +255,10 @@ static void reset_common_data(void) .root_screen = &mock_screen_blank, .state = (struct vb2_screen_state){ .screen = &mock_screen_blank, - .locale_id = 0, .selected_item = 0, .disabled_item_mask = 0, }, + .locale_id = 0, .key = 0, }; @@ -328,7 +332,7 @@ vb2_error_t vb2ex_display_ui(enum vb2_screen screen, return VB2_ERROR_MOCK; } - mock_displayed[mock_displayed_count] = (struct vb2_screen_state){ + mock_displayed[mock_displayed_count] = (struct display_call){ .screen = vb2_get_screen_info(screen), .locale_id = locale_id, .selected_item = selected_item, @@ -456,8 +460,7 @@ static void menu_action_tests(void) mock_ui_context.key = VB_KEY_UP; TEST_EQ(menu_up_action(&mock_ui_context), VB2_REQUEST_UI_CONTINUE, "valid menu_up_action"); - screen_state_eq(mock_state, MOCK_SCREEN_MENU, MOCK_IGNORE, 1, - MOCK_IGNORE); + screen_state_eq(mock_state, MOCK_SCREEN_MENU, 1, MOCK_IGNORE); /* Valid menu_up_action with mask */ reset_common_data(); @@ -467,8 +470,7 @@ static void menu_action_tests(void) mock_ui_context.key = VB_KEY_UP; TEST_EQ(menu_up_action(&mock_ui_context), VB2_REQUEST_UI_CONTINUE, "valid menu_up_action with mask"); - screen_state_eq(mock_state, MOCK_SCREEN_MENU, MOCK_IGNORE, 0, - MOCK_IGNORE); + screen_state_eq(mock_state, MOCK_SCREEN_MENU, 0, MOCK_IGNORE); /* Invalid menu_up_action (blocked) */ reset_common_data(); @@ -477,8 +479,7 @@ static void menu_action_tests(void) mock_ui_context.key = VB_KEY_UP; TEST_EQ(menu_up_action(&mock_ui_context), VB2_REQUEST_UI_CONTINUE, "invalid menu_up_action (blocked)"); - screen_state_eq(mock_state, MOCK_SCREEN_MENU, MOCK_IGNORE, 0, - MOCK_IGNORE); + screen_state_eq(mock_state, MOCK_SCREEN_MENU, 0, MOCK_IGNORE); /* Invalid menu_up_action (blocked by mask) */ reset_common_data(); @@ -488,8 +489,7 @@ static void menu_action_tests(void) mock_ui_context.key = VB_KEY_UP; TEST_EQ(menu_up_action(&mock_ui_context), VB2_REQUEST_UI_CONTINUE, "invalid menu_up_action (blocked by mask)"); - screen_state_eq(mock_state, MOCK_SCREEN_MENU, MOCK_IGNORE, 2, - MOCK_IGNORE); + screen_state_eq(mock_state, MOCK_SCREEN_MENU, 2, MOCK_IGNORE); /* Ignore volume-up when not DETACHABLE */ if (!DETACHABLE) { @@ -500,8 +500,7 @@ static void menu_action_tests(void) TEST_EQ(menu_up_action(&mock_ui_context), VB2_REQUEST_UI_CONTINUE, "ignore volume-up when not DETACHABLE"); - screen_state_eq(mock_state, MOCK_SCREEN_MENU, MOCK_IGNORE, 2, - MOCK_IGNORE); + screen_state_eq(mock_state, MOCK_SCREEN_MENU, 2, MOCK_IGNORE); } /* Valid menu_down_action */ @@ -511,8 +510,7 @@ static void menu_action_tests(void) mock_ui_context.key = VB_KEY_DOWN; TEST_EQ(menu_down_action(&mock_ui_context), VB2_REQUEST_UI_CONTINUE, "valid menu_down_action"); - screen_state_eq(mock_state, MOCK_SCREEN_MENU, MOCK_IGNORE, 3, - MOCK_IGNORE); + screen_state_eq(mock_state, MOCK_SCREEN_MENU, 3, MOCK_IGNORE); /* Valid menu_down_action with mask */ reset_common_data(); @@ -522,8 +520,7 @@ static void menu_action_tests(void) mock_ui_context.key = VB_KEY_DOWN; TEST_EQ(menu_down_action(&mock_ui_context), VB2_REQUEST_UI_CONTINUE, "valid menu_down_action with mask"); - screen_state_eq(mock_state, MOCK_SCREEN_MENU, MOCK_IGNORE, 4, - MOCK_IGNORE); + screen_state_eq(mock_state, MOCK_SCREEN_MENU, 4, MOCK_IGNORE); /* Invalid menu_down_action (blocked) */ reset_common_data(); @@ -532,8 +529,7 @@ static void menu_action_tests(void) mock_ui_context.key = VB_KEY_DOWN; TEST_EQ(menu_down_action(&mock_ui_context), VB2_REQUEST_UI_CONTINUE, "invalid menu_down_action (blocked)"); - screen_state_eq(mock_state, MOCK_SCREEN_MENU, MOCK_IGNORE, 4, - MOCK_IGNORE); + screen_state_eq(mock_state, MOCK_SCREEN_MENU, 4, MOCK_IGNORE); /* Invalid menu_down_action (blocked by mask) */ reset_common_data(); @@ -543,8 +539,7 @@ static void menu_action_tests(void) mock_ui_context.key = VB_KEY_DOWN; TEST_EQ(menu_down_action(&mock_ui_context), VB2_REQUEST_UI_CONTINUE, "invalid menu_down_action (blocked by mask)"); - screen_state_eq(mock_state, MOCK_SCREEN_MENU, MOCK_IGNORE, 2, - MOCK_IGNORE); + screen_state_eq(mock_state, MOCK_SCREEN_MENU, 2, MOCK_IGNORE); /* Ignore volume-down when not DETACHABLE */ if (!DETACHABLE) { @@ -555,8 +550,7 @@ static void menu_action_tests(void) TEST_EQ(menu_down_action(&mock_ui_context), VB2_REQUEST_UI_CONTINUE, "ignore volume-down when not DETACHABLE"); - screen_state_eq(mock_state, MOCK_SCREEN_MENU, MOCK_IGNORE, 2, - MOCK_IGNORE); + screen_state_eq(mock_state, MOCK_SCREEN_MENU, 2, MOCK_IGNORE); } /* menu_select_action with no item screen */ @@ -565,8 +559,7 @@ static void menu_action_tests(void) mock_ui_context.key = VB_KEY_ENTER; TEST_EQ(menu_select_action(&mock_ui_context), VB2_REQUEST_UI_CONTINUE, "menu_select_action with no item screen"); - screen_state_eq(mock_state, MOCK_SCREEN_BASE, MOCK_IGNORE, 0, - MOCK_IGNORE); + screen_state_eq(mock_state, MOCK_SCREEN_BASE, 0, MOCK_IGNORE); /* Try to select target 0..3 */ for (i = 0; i <= 3; i++) { @@ -578,8 +571,7 @@ static void menu_action_tests(void) mock_ui_context.key = VB_KEY_ENTER; TEST_EQ(menu_select_action(&mock_ui_context), VB2_REQUEST_UI_CONTINUE, test_name); - screen_state_eq(mock_state, target_id, MOCK_IGNORE, 0, - MOCK_IGNORE); + screen_state_eq(mock_state, target_id, 0, MOCK_IGNORE); } /* Try to select no target item */ @@ -589,8 +581,7 @@ static void menu_action_tests(void) mock_ui_context.key = VB_KEY_ENTER; TEST_EQ(menu_select_action(&mock_ui_context), VB2_REQUEST_UI_CONTINUE, "select no target"); - screen_state_eq(mock_state, MOCK_SCREEN_MENU, MOCK_IGNORE, 4, - MOCK_IGNORE); + screen_state_eq(mock_state, MOCK_SCREEN_MENU, 4, MOCK_IGNORE); /* Ignore power button short press when not DETACHABLE */ if (!DETACHABLE) { @@ -601,8 +592,7 @@ static void menu_action_tests(void) TEST_EQ(menu_select_action(&mock_ui_context), VB2_REQUEST_UI_CONTINUE, "ignore power button short press when not DETACHABLE"); - screen_state_eq(mock_state, MOCK_SCREEN_MENU, MOCK_IGNORE, 1, - MOCK_IGNORE); + screen_state_eq(mock_state, MOCK_SCREEN_MENU, 1, MOCK_IGNORE); } /* menu_back_action */ @@ -610,8 +600,7 @@ static void menu_action_tests(void) mock_ui_context.key = VB_KEY_ESC; TEST_EQ(menu_back_action(&mock_ui_context), VB2_REQUEST_UI_CONTINUE, "menu_back_action"); - screen_state_eq(mock_state, VB2_SCREEN_BLANK, MOCK_IGNORE, 0, - MOCK_IGNORE); + screen_state_eq(mock_state, VB2_SCREEN_BLANK, 0, MOCK_IGNORE); VB2_DEBUG("...done.\n"); } @@ -620,23 +609,21 @@ static void change_screen_tests(void) { VB2_DEBUG("Testing change_screen...\n"); - /* Changing screen will clear screen state except locale_id */ + /* Changing screen will clear screen state */ reset_common_data(); mock_state->screen = &mock_screen_menu; - mock_state->locale_id = 1; mock_state->selected_item = 2; mock_state->disabled_item_mask = 0x10; - VB2_DEBUG("change_screen will clear screen state except locale_id\n"); + VB2_DEBUG("change_screen will clear screen state\n"); change_screen(&mock_ui_context, MOCK_SCREEN_BASE); - screen_state_eq(mock_state, MOCK_SCREEN_BASE, 1, 0, 0); + screen_state_eq(mock_state, MOCK_SCREEN_BASE, 0, 0); /* Change to screen which does not exist */ reset_common_data(); mock_state->screen = &mock_screen_menu; VB2_DEBUG("change to screen which does not exist\n"); change_screen(&mock_ui_context, MOCK_NO_SCREEN); - screen_state_eq(mock_state, MOCK_SCREEN_MENU, MOCK_IGNORE, MOCK_IGNORE, - MOCK_IGNORE); + screen_state_eq(mock_state, MOCK_SCREEN_MENU, MOCK_IGNORE, MOCK_IGNORE); VB2_DEBUG("...done.\n"); } @@ -652,8 +639,7 @@ static void validate_selection_tests(void) mock_state->disabled_item_mask = 0x10; VB2_DEBUG("no item (fix selected_item)\n"); validate_selection(mock_state); - screen_state_eq(mock_state, MOCK_SCREEN_BASE, MOCK_IGNORE, 0, - MOCK_IGNORE); + screen_state_eq(mock_state, MOCK_SCREEN_BASE, 0, MOCK_IGNORE); /* Valid selected_item */ reset_common_data(); @@ -662,8 +648,7 @@ static void validate_selection_tests(void) mock_state->disabled_item_mask = 0x13; /* 0b10011 */ VB2_DEBUG("valid selected_item\n"); validate_selection(mock_state); - screen_state_eq(mock_state, MOCK_SCREEN_MENU, MOCK_IGNORE, 2, - MOCK_IGNORE); + screen_state_eq(mock_state, MOCK_SCREEN_MENU, 2, MOCK_IGNORE); /* selected_item too large */ reset_common_data(); @@ -672,8 +657,7 @@ static void validate_selection_tests(void) mock_state->disabled_item_mask = 0x15; /* 0b10101 */ VB2_DEBUG("selected_item too large\n"); validate_selection(mock_state); - screen_state_eq(mock_state, MOCK_SCREEN_MENU, MOCK_IGNORE, 1, - MOCK_IGNORE); + screen_state_eq(mock_state, MOCK_SCREEN_MENU, 1, MOCK_IGNORE); /* Select a disabled item */ reset_common_data(); @@ -682,8 +666,7 @@ static void validate_selection_tests(void) mock_state->disabled_item_mask = 0x17; /* 0b10111 */ VB2_DEBUG("select a disabled item\n"); validate_selection(mock_state); - screen_state_eq(mock_state, MOCK_SCREEN_MENU, MOCK_IGNORE, 3, - MOCK_IGNORE); + screen_state_eq(mock_state, MOCK_SCREEN_MENU, 3, MOCK_IGNORE); /* No available item */ reset_common_data(); @@ -692,8 +675,7 @@ static void validate_selection_tests(void) mock_state->disabled_item_mask = 0x1f; /* 0b11111 */ VB2_DEBUG("no available item\n"); validate_selection(mock_state); - screen_state_eq(mock_state, MOCK_SCREEN_MENU, MOCK_IGNORE, 0, - MOCK_IGNORE); + screen_state_eq(mock_state, MOCK_SCREEN_MENU, 0, MOCK_IGNORE); VB2_DEBUG("...done.\n"); } |