diff options
Diffstat (limited to 'tests/vb2_ui_tests.c')
-rw-r--r-- | tests/vb2_ui_tests.c | 187 |
1 files changed, 187 insertions, 0 deletions
diff --git a/tests/vb2_ui_tests.c b/tests/vb2_ui_tests.c index 325e8423..4066e5b8 100644 --- a/tests/vb2_ui_tests.c +++ b/tests/vb2_ui_tests.c @@ -66,6 +66,14 @@ static vb2_error_t mock_vbtlk_retval[32]; static uint32_t mock_vbtlk_expected_flag[32]; static int mock_vbtlk_total; +static int mock_allow_recovery; + +/* mock_pp_* = mock data for physical presence button */ +static int mock_pp_pressed[64]; +static int mock_pp_pressed_total; + +static int mock_enable_dev_mode; + static void add_mock_key(uint32_t press, int trusted) { if (mock_key_total >= ARRAY_SIZE(mock_key) || @@ -97,6 +105,16 @@ static void add_mock_vbtlk(vb2_error_t retval, uint32_t get_info_flags) mock_vbtlk_total++; } +static void add_mock_pp_pressed(int pressed) +{ + if (mock_pp_pressed_total >= ARRAY_SIZE(mock_pp_pressed)) { + TEST_TRUE(0, " mock_pp ran out of entries!"); + return; + } + + mock_pp_pressed[mock_pp_pressed_total++] = pressed; +} + static void displayed_eq(const char *text, enum vb2_screen screen, uint32_t locale_id, @@ -210,6 +228,16 @@ static void reset_common_data(enum reset_type t) memset(mock_vbtlk_expected_flag, 0, sizeof(mock_vbtlk_expected_flag)); mock_vbtlk_total = 0; + /* For vb2_allow_recovery */ + mock_allow_recovery = t == FOR_MANUAL_RECOVERY; + + /* For vb2ex_physical_presence_pressed */ + memset(mock_pp_pressed, 0, sizeof(mock_pp_pressed)); + mock_pp_pressed_total = 0; + + /* For vb2_enable_developer_mode */ + mock_enable_dev_mode = 0; + /* Avoid Iteration #0 */ add_mock_keypress(0); if (t == FOR_MANUAL_RECOVERY) @@ -217,6 +245,7 @@ static void reset_common_data(enum reset_type t) VB_DISK_FLAG_REMOVABLE); else add_mock_vbtlk(VB2_ERROR_MOCK, 0); + add_mock_pp_pressed(0); } /* Mock functions */ @@ -341,6 +370,24 @@ vb2_error_t VbTryLoadKernel(struct vb2_context *c, uint32_t get_info_flags) return mock_vbtlk_retval[i]; } +int vb2_allow_recovery(struct vb2_context *c) +{ + return mock_allow_recovery; +} + +int vb2ex_physical_presence_pressed(void) +{ + if (mock_iters >= mock_pp_pressed_total) + return 0; + + return mock_pp_pressed[mock_iters]; +} + +void vb2_enable_developer_mode(struct vb2_context *c) +{ + mock_enable_dev_mode = 1; +} + /* Tests */ static void developer_tests(void) { @@ -513,6 +560,146 @@ static void manual_recovery_tests(void) MOCK_IGNORE, MOCK_IGNORE, MOCK_IGNORE); displayed_no_extra(); + /* Ctrl+D = to_dev; space = cancel */ + reset_common_data(FOR_MANUAL_RECOVERY); + add_mock_key(VB_KEY_CTRL('D'), 1); + add_mock_keypress(' '); + TEST_EQ(vb2_manual_recovery_menu(ctx), VB2_REQUEST_SHUTDOWN, + "ctrl+D = to_dev; space = cancel"); + TEST_EQ(mock_enable_dev_mode, 0, " dev mode not enabled"); + displayed_eq("recovery select", VB2_SCREEN_RECOVERY_SELECT, + MOCK_IGNORE, MOCK_IGNORE, MOCK_IGNORE); + displayed_eq("to_dev", VB2_SCREEN_RECOVERY_TO_DEV, + MOCK_IGNORE, MOCK_IGNORE, MOCK_IGNORE); + displayed_eq("recovery select", VB2_SCREEN_RECOVERY_SELECT, + MOCK_IGNORE, MOCK_IGNORE, MOCK_IGNORE); + displayed_no_extra(); + + /* Cancel */ + reset_common_data(FOR_MANUAL_RECOVERY); + add_mock_key(VB_KEY_CTRL('D'), 1); + if (PHYSICAL_PRESENCE_KEYBOARD) + add_mock_keypress(VB_KEY_DOWN); + add_mock_keypress(VB_KEY_ENTER); + TEST_EQ(vb2_manual_recovery_menu(ctx), VB2_REQUEST_SHUTDOWN, "cancel"); + TEST_EQ(mock_enable_dev_mode, 0, " dev mode not enabled"); + + /* Confirm */ + reset_common_data(FOR_MANUAL_RECOVERY); + add_mock_key(VB_KEY_CTRL('D'), 1); + if (PHYSICAL_PRESENCE_KEYBOARD) { + add_mock_key(VB_KEY_ENTER, 1); + } else { + add_mock_pp_pressed(0); + add_mock_pp_pressed(1); + add_mock_pp_pressed(1); + add_mock_pp_pressed(0); + } + TEST_EQ(vb2_manual_recovery_menu(ctx), VB2_REQUEST_REBOOT_EC_TO_RO, + "confirm"); + if (!PHYSICAL_PRESENCE_KEYBOARD) + TEST_TRUE(mock_iters >= mock_pp_pressed_total - 1, + " used up mock_pp_pressed"); + TEST_EQ(mock_enable_dev_mode, 1, " dev mode enabled"); + + /* Cannot confirm physical presence by untrusted keyboard */ + if (PHYSICAL_PRESENCE_KEYBOARD) { + reset_common_data(FOR_MANUAL_RECOVERY); + add_mock_key(VB_KEY_CTRL('D'), 1); + add_mock_key(VB_KEY_ENTER, 0); + TEST_EQ(vb2_manual_recovery_menu(ctx), VB2_REQUEST_SHUTDOWN, + "cannot confirm physical presence" + " by untrusted keyboard"); + TEST_EQ(mock_enable_dev_mode, 0, " dev mode not enabled"); + } + + /* Cannot enable dev mode if already enabled */ + reset_common_data(FOR_MANUAL_RECOVERY); + sd->flags |= VB2_SD_FLAG_DEV_MODE_ENABLED; + add_mock_key(VB_KEY_CTRL('D'), 1); + if (PHYSICAL_PRESENCE_KEYBOARD) { + add_mock_key(VB_KEY_ENTER, 1); + } else { + add_mock_pp_pressed(0); + add_mock_pp_pressed(1); + add_mock_pp_pressed(0); + } + TEST_EQ(vb2_manual_recovery_menu(ctx), VB2_REQUEST_SHUTDOWN, + "cannot enable dev mode if already enabled"); + TEST_EQ(mock_enable_dev_mode, 0, " dev mode already on"); + + /* Physical presence button tests */ + if (!PHYSICAL_PRESENCE_KEYBOARD) { + /* Physical presence button stuck? */ + reset_common_data(FOR_MANUAL_RECOVERY); + add_mock_key(VB_KEY_CTRL('D'), 1); + add_mock_pp_pressed(1); /* Hold since boot */ + add_mock_pp_pressed(0); + TEST_EQ(vb2_manual_recovery_menu(ctx), VB2_REQUEST_SHUTDOWN, + "physical presence button stuck?"); + TEST_EQ(mock_enable_dev_mode, 0, " dev mode not enabled"); + displayed_eq("recovery select", VB2_SCREEN_RECOVERY_SELECT, + MOCK_IGNORE, MOCK_IGNORE, MOCK_IGNORE); + displayed_no_extra(); + + /* Button stuck, enter to_dev again */ + reset_common_data(FOR_MANUAL_RECOVERY); + add_mock_key(VB_KEY_CTRL('D'), 1); + add_mock_key(VB_KEY_CTRL('D'), 1); + add_mock_pp_pressed(1); /* Hold since boot */ + add_mock_pp_pressed(0); + add_mock_pp_pressed(1); /* Press again */ + add_mock_pp_pressed(0); + TEST_EQ(vb2_manual_recovery_menu(ctx), + VB2_REQUEST_REBOOT_EC_TO_RO, + "button stuck, enter to_dev again"); + TEST_TRUE(mock_iters >= mock_pp_pressed_total - 1, + " used up mock_pp_pressed"); + TEST_EQ(mock_enable_dev_mode, 1, " dev mode enabled"); + displayed_eq("recovery select", VB2_SCREEN_RECOVERY_SELECT, + MOCK_IGNORE, MOCK_IGNORE, MOCK_IGNORE); + displayed_eq("to_dev", VB2_SCREEN_RECOVERY_TO_DEV, + MOCK_IGNORE, MOCK_IGNORE, MOCK_IGNORE); + displayed_no_extra(); + + /* Cancel with holding pp button, enter again */ + reset_common_data(FOR_MANUAL_RECOVERY); + /* Enter to_dev */ + add_mock_key(VB_KEY_CTRL('D'), 1); + add_mock_pp_pressed(0); + /* Press pp button */ + add_mock_keypress(0); + add_mock_pp_pressed(1); + /* Space = back */ + add_mock_keypress(' '); + add_mock_pp_pressed(1); + /* Wait */ + add_mock_keypress(0); + add_mock_pp_pressed(0); + /* Enter to_dev again */ + add_mock_key(VB_KEY_CTRL('D'), 1); + add_mock_pp_pressed(0); + /* Press pp button again */ + add_mock_pp_pressed(1); + /* Release */ + add_mock_pp_pressed(0); + TEST_EQ(vb2_manual_recovery_menu(ctx), + VB2_REQUEST_REBOOT_EC_TO_RO, + "cancel with holding pp button, enter again"); + TEST_TRUE(mock_iters >= mock_pp_pressed_total - 1, + " used up mock_pp_pressed"); + TEST_EQ(mock_enable_dev_mode, 1, " dev mode enabled"); + displayed_eq("recovery select", VB2_SCREEN_RECOVERY_SELECT, + MOCK_IGNORE, MOCK_IGNORE, MOCK_IGNORE); + displayed_eq("to_dev", VB2_SCREEN_RECOVERY_TO_DEV, + MOCK_IGNORE, MOCK_IGNORE, MOCK_IGNORE); + displayed_eq("recovery select", VB2_SCREEN_RECOVERY_SELECT, + MOCK_IGNORE, MOCK_IGNORE, MOCK_IGNORE); + displayed_eq("to_dev", VB2_SCREEN_RECOVERY_TO_DEV, + MOCK_IGNORE, MOCK_IGNORE, MOCK_IGNORE); + displayed_no_extra(); + } + VB2_DEBUG("...done.\n"); } |