summaryrefslogtreecommitdiff
path: root/tests/vb2_ui_action_tests.c
diff options
context:
space:
mode:
Diffstat (limited to 'tests/vb2_ui_action_tests.c')
-rw-r--r--tests/vb2_ui_action_tests.c147
1 files changed, 116 insertions, 31 deletions
diff --git a/tests/vb2_ui_action_tests.c b/tests/vb2_ui_action_tests.c
index ab273da0..ddb9ee38 100644
--- a/tests/vb2_ui_action_tests.c
+++ b/tests/vb2_ui_action_tests.c
@@ -24,7 +24,8 @@
#define MOCK_SCREEN_TARGET0 0xef20
#define MOCK_SCREEN_TARGET1 0xef21
#define MOCK_SCREEN_TARGET2 0xef22
-#define MOCK_SCREEN_TARGET3 0xef23
+#define MOCK_SCREEN_ACTION 0xef30
+#define MOCK_SCREEN_ALL_ACTION 0xef32
/* Mock data */
struct display_call {
@@ -37,6 +38,7 @@ struct display_call {
static uint8_t workbuf[VB2_KERNEL_WORKBUF_RECOMMENDED_SIZE]
__attribute__((aligned(VB2_WORKBUF_ALIGN)));
static struct vb2_context *ctx;
+static struct vb2_shared_data *sd;
static struct vb2_gbb_header gbb;
static int mock_calls_until_shutdown;
@@ -60,9 +62,10 @@ static uint32_t mock_vbtlk_expected_flag;
/* Mock actions */
static uint32_t mock_action_called;
+static uint32_t mock_action_countdown_limit;
static vb2_error_t mock_action_countdown(struct vb2_ui_context *ui)
{
- if (++mock_action_called >= 10)
+ if (++mock_action_called >= mock_action_countdown_limit)
return VB2_SUCCESS;
return VB2_REQUEST_UI_CONTINUE;
}
@@ -72,6 +75,34 @@ static vb2_error_t mock_action_change_screen(struct vb2_ui_context *ui)
return vb2_ui_change_screen(ui, MOCK_SCREEN_BASE);
}
+static vb2_error_t mock_action_base(struct vb2_ui_context *ui)
+{
+ mock_action_called++;
+ return VB2_SUCCESS;
+}
+
+static int mock_action_flags;
+static vb2_error_t mock_action_flag0(struct vb2_ui_context *ui)
+{
+ if ((1 << 0) & mock_action_flags)
+ return VB2_SUCCESS;
+ return VB2_REQUEST_UI_CONTINUE;
+}
+
+static vb2_error_t mock_action_flag1(struct vb2_ui_context *ui)
+{
+ if ((1 << 1) & mock_action_flags)
+ return VB2_SUCCESS;
+ return VB2_REQUEST_UI_CONTINUE;
+}
+
+static vb2_error_t mock_action_flag2(struct vb2_ui_context *ui)
+{
+ if ((1 << 2) & mock_action_flags)
+ return VB2_SUCCESS;
+ return VB2_REQUEST_UI_CONTINUE;
+}
+
/* Mock screens */
struct vb2_screen_info mock_screen_temp;
const struct vb2_menu_item mock_empty_menu[] = {};
@@ -89,28 +120,28 @@ const struct vb2_screen_info mock_screen_base = {
};
const struct vb2_menu_item mock_screen_menu_items[] = {
{
- .text = "option 0",
+ .text = "item 0",
.target = MOCK_SCREEN_TARGET0,
},
{
- .text = "option 1",
+ .text = "item 1",
.target = MOCK_SCREEN_TARGET1,
},
{
- .text = "option 2",
+ .text = "item 2",
.target = MOCK_SCREEN_TARGET2,
},
{
- .text = "option 3",
- .target = MOCK_SCREEN_TARGET3,
+ .text = "item 3",
+ .action = mock_action_base,
},
{
- .text = "option 4 (no target)",
+ .text = "item 4 (no target)",
},
};
const struct vb2_screen_info mock_screen_menu = {
.id = MOCK_SCREEN_MENU,
- .name = "mock_screen_menu: screen with 5 options",
+ .name = "mock_screen_menu: screen with 5 items",
.num_items = ARRAY_SIZE(mock_screen_menu_items),
.items = mock_screen_menu_items,
};
@@ -132,12 +163,26 @@ const struct vb2_screen_info mock_screen_target2 = {
.num_items = ARRAY_SIZE(mock_empty_menu),
.items = mock_empty_menu,
};
-const struct vb2_screen_info mock_screen_target3 = {
- .id = MOCK_SCREEN_TARGET3,
- .name = "mock_screen_target3",
+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[] = {
+ {
+ .text = "all_action_screen_item",
+ .action = mock_action_flag1,
+ },
+};
+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,
+};
static void screen_state_eq(const struct vb2_screen_state *state,
enum vb2_screen screen,
@@ -239,6 +284,8 @@ static void reset_common_data(void)
vb2_nv_init(ctx);
+ sd = vb2_get_sd(ctx);
+
/* For check_shutdown_request */
mock_calls_until_shutdown = 10;
@@ -253,6 +300,7 @@ static void reset_common_data(void)
/* Mock ui_context based on mock screens */
memset(&mock_ui_context, 0, sizeof(mock_ui_context));
mock_ui_context.ctx = ctx;
+ mock_ui_context.state.screen = &mock_screen_temp;
mock_state = &mock_ui_context.state;
/* For vb2ex_display_ui */
@@ -268,6 +316,8 @@ static void reset_common_data(void)
/* For mock actions */
mock_action_called = 0;
+ mock_action_countdown_limit = 1;
+ mock_action_flags = 0;
/* For chagen_screen and vb2_get_screen_info */
mock_get_screen_info_called = 0;
@@ -311,8 +361,10 @@ const struct vb2_screen_info *vb2_get_screen_info(enum vb2_screen screen)
return &mock_screen_target1;
case MOCK_SCREEN_TARGET2:
return &mock_screen_target2;
- case MOCK_SCREEN_TARGET3:
- return &mock_screen_target3;
+ case MOCK_SCREEN_ACTION:
+ return &mock_screen_action;
+ case MOCK_SCREEN_ALL_ACTION:
+ return &mock_screen_all_action;
case MOCK_NO_SCREEN:
return NULL;
default:
@@ -491,9 +543,6 @@ static void menu_next_tests(void)
static void menu_select_tests(void)
{
- int i, target_id;
- char test_name[256];
-
VB2_DEBUG("Testing menu_select...\n");
/* select action with no item screen */
@@ -505,27 +554,32 @@ static void menu_select_tests(void)
"vb2_ui_menu_select with no item screen");
screen_state_eq(mock_state, MOCK_SCREEN_BASE, 0, MOCK_IGNORE);
- /* Try to select target 0..3 */
- for (i = 0; i <= 3; i++) {
- sprintf(test_name, "select target %d", i);
- target_id = MOCK_SCREEN_TARGET0 + i;
- reset_common_data();
- mock_state->screen = &mock_screen_menu;
- mock_state->selected_item = i;
- mock_ui_context.key = VB_KEY_ENTER;
- TEST_EQ(vb2_ui_menu_select(&mock_ui_context),
- VB2_REQUEST_UI_CONTINUE, test_name);
- screen_state_eq(mock_state, target_id, 0, MOCK_IGNORE);
- }
+ /* Try to select an item with a target (item 2) */
+ reset_common_data();
+ mock_state->screen = &mock_screen_menu;
+ mock_state->selected_item = 2;
+ mock_ui_context.key = VB_KEY_ENTER;
+ TEST_EQ(vb2_ui_menu_select(&mock_ui_context),
+ VB2_REQUEST_UI_CONTINUE, "select an item with a target");
+ screen_state_eq(mock_state, MOCK_SCREEN_TARGET2, 0, MOCK_IGNORE);
+
+ /* Try to select an item with an action (item 3) */
+ reset_common_data();
+ mock_state->screen = &mock_screen_menu;
+ mock_state->selected_item = 3;
+ mock_ui_context.key = VB_KEY_ENTER;
+ TEST_EQ(vb2_ui_menu_select(&mock_ui_context),
+ VB2_SUCCESS, "select an item with an action");
+ TEST_EQ(mock_action_called, 1, " action called once");
- /* Try to select no target item (target 4) */
+ /* Try to select an item with neither targets nor actions (item 4) */
reset_common_data();
mock_state->screen = &mock_screen_menu;
mock_state->selected_item = 4;
mock_ui_context.key = VB_KEY_ENTER;
TEST_EQ(vb2_ui_menu_select(&mock_ui_context),
VB2_REQUEST_UI_CONTINUE,
- "select no target");
+ "select an item with neither targets nor actions");
screen_state_eq(mock_state, MOCK_SCREEN_MENU, 4, MOCK_IGNORE);
/* Ignore power button short press when not DETACHABLE */
@@ -606,6 +660,13 @@ static void manual_recovery_action_tests(void)
static void ui_loop_tests(void)
{
+ int i;
+ const char *action_interfere_test_names[] = {
+ "hook all actions: screen action return SUCCESS",
+ "hook all actions: target action hooked return SUCCESS",
+ "hook all actions: global action return SUCCESS",
+ };
+
VB2_DEBUG("Testing ui_loop...\n");
/* Die if no root screen */
@@ -623,9 +684,18 @@ static void ui_loop_tests(void)
MOCK_IGNORE, MOCK_IGNORE);
displayed_no_extra();
+ /* Screen action */
+ reset_common_data();
+ mock_calls_until_shutdown = -1;
+ mock_action_countdown_limit = 10;
+ TEST_EQ(ui_loop(ctx, MOCK_SCREEN_ACTION, NULL),
+ VB2_SUCCESS, "screen action");
+ TEST_EQ(mock_action_called, 10, " action called");
+
/* Global action */
reset_common_data();
mock_calls_until_shutdown = -1;
+ mock_action_countdown_limit = 10;
TEST_EQ(ui_loop(ctx, VB2_SCREEN_BLANK, mock_action_countdown),
VB2_SUCCESS, "global action");
TEST_EQ(mock_action_called, 10, " action called");
@@ -639,6 +709,21 @@ static void ui_loop_tests(void)
displayed_eq("change to mock_screen_base", MOCK_IGNORE, MOCK_IGNORE,
MOCK_IGNORE, MOCK_IGNORE);
+ /*
+ * Hook all actions, and receive SUCCESS from actions one by one
+ * Action #0: screen action
+ * Action #1: item target action
+ * Action #2: global action
+ */
+ for (i = 0; i <= 2; i++) {
+ reset_common_data();
+ add_mock_keypress(VB_KEY_ENTER);
+ mock_calls_until_shutdown = -1;
+ mock_action_flags |= (1 << i);
+ TEST_EQ(ui_loop(ctx, MOCK_SCREEN_ALL_ACTION, mock_action_flag2),
+ VB2_SUCCESS, action_interfere_test_names[i]);
+ }
+
/* KEY_UP, KEY_DOWN, and KEY_ENTER navigation */
reset_common_data();
add_mock_keypress(VB_KEY_UP); /* (blocked) */