summaryrefslogtreecommitdiff
path: root/tests/vb2_ui_utility_tests.c
diff options
context:
space:
mode:
Diffstat (limited to 'tests/vb2_ui_utility_tests.c')
-rw-r--r--tests/vb2_ui_utility_tests.c376
1 files changed, 0 insertions, 376 deletions
diff --git a/tests/vb2_ui_utility_tests.c b/tests/vb2_ui_utility_tests.c
deleted file mode 100644
index b37b8e0f..00000000
--- a/tests/vb2_ui_utility_tests.c
+++ /dev/null
@@ -1,376 +0,0 @@
-/* Copyright 2020 The Chromium OS Authors. All rights reserved.
- * Use of this source code is governed by a BSD-style license that can be
- * found in the LICENSE file.
- *
- * Tests for UI utility functions.
- */
-
-#include "2api.h"
-#include "2common.h"
-#include "2misc.h"
-#include "2nvstorage.h"
-#include "2ui.h"
-#include "2ui_private.h"
-#include "test_common.h"
-#include "vboot_api.h"
-
-/* Fixed value for ignoring some checks. */
-#define MOCK_IGNORE 0xffffu
-
-/* Mock screen index for testing screen utility functions. */
-#define MOCK_NO_SCREEN 0xef00
-#define MOCK_SCREEN_BASE 0xef10
-#define MOCK_SCREEN_MENU 0xef11
-#define MOCK_SCREEN_ROOT 0xefff
-
-/* Mock data */
-static uint8_t workbuf[VB2_KERNEL_WORKBUF_RECOMMENDED_SIZE]
- __attribute__((aligned(VB2_WORKBUF_ALIGN)));
-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;
-
-/* Mock actions */
-static uint32_t mock_action_called;
-static vb2_error_t mock_action_base(struct vb2_ui_context *ui)
-{
- mock_action_called++;
- return VB2_SUCCESS;
-}
-
-/* Mock screens */
-struct vb2_screen_info mock_screen_base = {
- .id = MOCK_SCREEN_BASE,
- .name = "mock_screen_base: menuless screen",
-};
-struct vb2_menu_item mock_screen_menu_items[] = {
- {
- .text = "option 0: language selection",
- .is_language_select = 1,
- },
- {
- .text = "option 1",
- },
- {
- .text = "option 2",
- },
- {
- .text = "option 3",
- },
- {
- .text = "option 4",
- },
-};
-struct vb2_screen_info mock_screen_menu = {
- .id = MOCK_SCREEN_MENU,
- .name = "mock_screen_menu: screen with 5 options",
- .menu = {
- .num_items = ARRAY_SIZE(mock_screen_menu_items),
- .items = mock_screen_menu_items,
- },
-};
-struct vb2_screen_info mock_screen_root = {
- .id = MOCK_SCREEN_ROOT,
- .name = "mock_screen_root",
-};
-
-static void screen_state_eq(const struct vb2_screen_state *state,
- enum vb2_screen screen,
- uint32_t selected_item,
- uint32_t hidden_item_mask)
-{
- if (screen != MOCK_IGNORE) {
- if (state->screen == NULL)
- TEST_TRUE(0, " state.screen does not exist");
- else
- TEST_EQ(state->screen->id, screen, " state.screen");
- }
- if (selected_item != MOCK_IGNORE)
- TEST_EQ(state->selected_item,
- selected_item, " state.selected_item");
- if (hidden_item_mask != MOCK_IGNORE)
- TEST_EQ(state->hidden_item_mask,
- hidden_item_mask, " state.hidden_item_mask");
-}
-
-/* Reset mock data (for use before each test) */
-static void reset_common_data(void)
-{
- TEST_SUCC(vb2api_init(workbuf, sizeof(workbuf), &ctx),
- "vb2api_init failed");
-
- memset(&gbb, 0, sizeof(gbb));
-
- vb2_nv_init(ctx);
-
- /* For vb2ex_get_locale_count */
- mock_locale_count = 1;
-
- /* For check_shutdown_request */
- mock_shutdown_request = MOCK_IGNORE;
-
- /* Mock ui_context based on mock screens */
- memset(&mock_ui_context, 0, sizeof(mock_ui_context));
- mock_ui_context.power_button = VB2_POWER_BUTTON_HELD_SINCE_BOOT;
-
- /* For mock actions */
- mock_action_called = 0;
-
- /* Reset init and action functions */
- mock_screen_base.init = NULL;
- mock_screen_base.action = NULL;
- mock_screen_menu.init = NULL;
- mock_screen_menu.action = NULL;
- mock_screen_root.init = NULL;
- mock_screen_root.action = NULL;
-}
-
-/* Mock functions */
-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)
- return mock_shutdown_request;
-
- return 0;
-}
-
-const struct vb2_screen_info *vb2_get_screen_info(enum vb2_screen screen)
-{
- switch ((int)screen) {
- case MOCK_SCREEN_BASE:
- return &mock_screen_base;
- case MOCK_SCREEN_MENU:
- return &mock_screen_menu;
- case MOCK_SCREEN_ROOT:
- return &mock_screen_root;
- default:
- return NULL;
- }
-}
-
-/* Tests */
-static void check_shutdown_request_tests(void)
-{
- VB2_DEBUG("Testing vb2_check_shutdown_request...\n");
-
- /* Release, press, hold, and release */
- if (!DETACHABLE) {
- reset_common_data();
- mock_shutdown_request = 0;
- TEST_EQ(vb2_check_shutdown_request(&mock_ui_context),
- VB2_SUCCESS, "release, press, hold, and release");
- mock_shutdown_request = VB_SHUTDOWN_REQUEST_POWER_BUTTON;
- TEST_EQ(vb2_check_shutdown_request(&mock_ui_context),
- VB2_SUCCESS, " press");
- TEST_EQ(vb2_check_shutdown_request(&mock_ui_context),
- VB2_SUCCESS, " hold");
- mock_shutdown_request = 0;
- TEST_EQ(vb2_check_shutdown_request(&mock_ui_context),
- VB2_REQUEST_SHUTDOWN, " release");
- }
-
- /* Press is ignored because we may held since boot */
- if (!DETACHABLE) {
- reset_common_data();
- mock_shutdown_request = VB_SHUTDOWN_REQUEST_POWER_BUTTON;
- TEST_EQ(vb2_check_shutdown_request(&mock_ui_context),
- VB2_SUCCESS, "press is ignored");
- }
-
- /* Power button short press from key */
- if (!DETACHABLE) {
- reset_common_data();
- mock_shutdown_request = 0;
- mock_ui_context.key = VB_BUTTON_POWER_SHORT_PRESS;
- TEST_EQ(vb2_check_shutdown_request(&mock_ui_context),
- VB2_REQUEST_SHUTDOWN, "power button short press");
- }
-
- /* Lid closure = shutdown request anyway */
- reset_common_data();
- mock_shutdown_request = VB_SHUTDOWN_REQUEST_LID_CLOSED;
- TEST_EQ(vb2_check_shutdown_request(&mock_ui_context),
- VB2_REQUEST_SHUTDOWN, "lid closure");
- mock_ui_context.key = 'A';
- TEST_EQ(vb2_check_shutdown_request(&mock_ui_context),
- VB2_REQUEST_SHUTDOWN, " lidsw + random key");
-
- /* Lid ignored by GBB flags */
- reset_common_data();
- gbb.flags |= VB2_GBB_FLAG_DISABLE_LID_SHUTDOWN;
- mock_shutdown_request = VB_SHUTDOWN_REQUEST_LID_CLOSED;
- TEST_EQ(vb2_check_shutdown_request(&mock_ui_context), VB2_SUCCESS,
- "lid ignored");
- if (!DETACHABLE) { /* Power button works for non DETACHABLE */
- mock_shutdown_request = VB_SHUTDOWN_REQUEST_LID_CLOSED |
- VB_SHUTDOWN_REQUEST_POWER_BUTTON;
- TEST_EQ(vb2_check_shutdown_request(&mock_ui_context),
- VB2_SUCCESS, " lidsw + pwdsw");
- mock_shutdown_request = 0;
- TEST_EQ(vb2_check_shutdown_request(&mock_ui_context),
- VB2_REQUEST_SHUTDOWN, " pwdsw release");
- }
-
- /* Lid ignored; power button short pressed */
- if (!DETACHABLE) {
- reset_common_data();
- gbb.flags |= VB2_GBB_FLAG_DISABLE_LID_SHUTDOWN;
- mock_shutdown_request = VB_SHUTDOWN_REQUEST_LID_CLOSED;
- mock_ui_context.key = VB_BUTTON_POWER_SHORT_PRESS;
- TEST_EQ(vb2_check_shutdown_request(&mock_ui_context),
- VB2_REQUEST_SHUTDOWN,
- "lid ignored; power button short pressed");
- }
-
- /* DETACHABLE ignore power button */
- if (DETACHABLE) {
- /* Flag pwdsw */
- reset_common_data();
- mock_shutdown_request = VB_SHUTDOWN_REQUEST_POWER_BUTTON;
- TEST_EQ(vb2_check_shutdown_request(&mock_ui_context),
- VB2_SUCCESS, "DETACHABLE: ignore pwdsw");
- mock_shutdown_request = 0;
- TEST_EQ(vb2_check_shutdown_request(&mock_ui_context),
- VB2_SUCCESS, " ignore on release");
-
- /* Power button short press */
- reset_common_data();
- mock_shutdown_request = 0;
- mock_ui_context.key = VB_BUTTON_POWER_SHORT_PRESS;
- TEST_EQ(vb2_check_shutdown_request(&mock_ui_context),
- VB2_SUCCESS,
- "DETACHABLE: ignore power button short press");
- }
-
- VB2_DEBUG("...done.\n");
-}
-
-static vb2_error_t try_back_helper(void)
-{
- VB2_TRY(vb2_ui_screen_back(&mock_ui_context));
- return VB2_ERROR_MOCK;
-}
-
-static vb2_error_t try_screen_change_helper(enum vb2_screen screen_id)
-{
- VB2_TRY(vb2_ui_screen_change(&mock_ui_context, screen_id));
- return VB2_ERROR_MOCK;
-}
-
-static void screen_stack_tests(void)
-{
- VB2_DEBUG("Testing screen stack functionality...\n");
-
- /* Change to screen which does not exist */
- reset_common_data();
- TEST_EQ(vb2_ui_screen_change(&mock_ui_context, MOCK_NO_SCREEN),
- VB2_REQUEST_UI_CONTINUE,
- "change to screen which does not exist");
- TEST_PTR_EQ(mock_ui_context.state, NULL, " stack is empty");
-
- /* Screen back with empty stack */
- reset_common_data();
- TEST_EQ(vb2_ui_screen_back(&mock_ui_context), VB2_REQUEST_UI_CONTINUE,
- "screen back with empty stack");
- TEST_PTR_EQ(mock_ui_context.state, NULL, " stack is empty");
-
- /* Back to previous screen, restoring the state */
- reset_common_data();
- mock_screen_base.init = mock_action_base;
- vb2_ui_screen_change(&mock_ui_context, MOCK_SCREEN_ROOT);
- vb2_ui_screen_change(&mock_ui_context, MOCK_SCREEN_BASE);
- mock_ui_context.state->selected_item = 2;
- mock_ui_context.state->hidden_item_mask = 0x10;
- vb2_ui_screen_change(&mock_ui_context, MOCK_SCREEN_MENU);
- TEST_EQ(vb2_ui_screen_back(&mock_ui_context), VB2_REQUEST_UI_CONTINUE,
- "back to previous screen");
- screen_state_eq(mock_ui_context.state, MOCK_SCREEN_BASE, 2, 0x10);
- TEST_EQ(mock_action_called, 1, " action called once");
-
- /* VB2_TRY around back should return right away */
- reset_common_data();
- TEST_NEQ(try_back_helper(), VB2_ERROR_MOCK,
- "continued executing after VB2_TRY(back)");
-
- /* VB2_TRY around screen_change should return right away */
- reset_common_data();
- TEST_NEQ(try_screen_change_helper(MOCK_SCREEN_ROOT), VB2_ERROR_MOCK,
- "continued executing after VB2_TRY(screen_change)");
-
- /* Change to target screen already in stack, restoring the state */
- reset_common_data();
- mock_screen_base.init = mock_action_base;
- vb2_ui_screen_change(&mock_ui_context, MOCK_SCREEN_ROOT);
- vb2_ui_screen_change(&mock_ui_context, MOCK_SCREEN_BASE);
- mock_ui_context.state->selected_item = 2;
- mock_ui_context.state->hidden_item_mask = 0x10;
- vb2_ui_screen_change(&mock_ui_context, MOCK_SCREEN_MENU);
- TEST_EQ(vb2_ui_screen_change(&mock_ui_context, MOCK_SCREEN_BASE),
- VB2_REQUEST_UI_CONTINUE, "change to target in stack");
- screen_state_eq(mock_ui_context.state, MOCK_SCREEN_BASE, 2, 0x10);
- TEST_EQ(mock_action_called, 1, " action called once");
-
- /* Change to screen without init; using default init() */
- reset_common_data();
- TEST_EQ(vb2_ui_screen_change(&mock_ui_context, MOCK_SCREEN_MENU),
- VB2_REQUEST_UI_CONTINUE,
- "change to screen with language selection");
- screen_state_eq(mock_ui_context.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 = vb2_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 = vb2_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 = vb2_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");
-}
-
-int main(void)
-{
- check_shutdown_request_tests();
- screen_stack_tests();
- get_language_menu_tests();
-
- return gTestSuccess ? 0 : 255;
-}