summaryrefslogtreecommitdiff
path: root/tests/vb2_ui_tests.c
diff options
context:
space:
mode:
Diffstat (limited to 'tests/vb2_ui_tests.c')
-rw-r--r--tests/vb2_ui_tests.c189
1 files changed, 188 insertions, 1 deletions
diff --git a/tests/vb2_ui_tests.c b/tests/vb2_ui_tests.c
index ffcb7d60..eb7de299 100644
--- a/tests/vb2_ui_tests.c
+++ b/tests/vb2_ui_tests.c
@@ -5,13 +5,200 @@
* Tests for developer and recovery mode UIs.
*/
+#include "2api.h"
+#include "2common.h"
+#include "2misc.h"
+#include "2nvstorage.h"
+#include "2ui.h"
#include "test_common.h"
+#include "vboot_api.h"
+#include "vboot_kernel.h"
+
+/* Mock data */
+static uint8_t workbuf[VB2_KERNEL_WORKBUF_RECOMMENDED_SIZE]
+ __attribute__((aligned(VB2_WORKBUF_ALIGN)));
+static struct vb2_context *ctx;
+
+static enum vb2_screen mock_screens_displayed[64];
+static uint32_t mock_locales_displayed[64];
+static uint32_t mock_screens_count = 0;
+
+static enum vb2_dev_default_boot mock_default_boot;
+static int mock_dev_boot_allowed;
+static int mock_dev_boot_legacy_allowed;
+static int mock_dev_boot_usb_allowed;
+
+static int mock_vbexlegacy_called;
+static enum VbAltFwIndex_t mock_altfw_num;
+
+static vb2_error_t mock_vbtlk_retval[5];
+static uint32_t mock_vbtlk_expected_flag[5];
+static int mock_vbtlk_count;
+static int mock_vbtlk_total;
+
+static void add_mock_vbtlk(vb2_error_t retval, uint32_t get_info_flags)
+{
+ if (mock_vbtlk_total >= ARRAY_SIZE(mock_vbtlk_retval) ||
+ mock_vbtlk_total >= ARRAY_SIZE(mock_vbtlk_expected_flag)) {
+ TEST_TRUE(0, "Test failed as mock_vbtlk ran out of entries!");
+ return;
+ }
+
+ mock_vbtlk_retval[mock_vbtlk_total] = retval;
+ mock_vbtlk_expected_flag[mock_vbtlk_total] = get_info_flags;
+ mock_vbtlk_total++;
+}
+
+/* Reset mock data (for use before each test) */
+static void reset_common_data()
+{
+ TEST_SUCC(vb2api_init(workbuf, sizeof(workbuf), &ctx),
+ "vb2api_init failed");
+ vb2_nv_init(ctx);
+
+ memset(mock_screens_displayed, 0, sizeof(mock_screens_displayed));
+ mock_screens_count = 0;
+
+ mock_default_boot = VB2_DEV_DEFAULT_BOOT_DISK;
+ mock_dev_boot_allowed = 1;
+ mock_dev_boot_legacy_allowed = 0;
+ mock_dev_boot_usb_allowed = 0;
+
+ mock_vbexlegacy_called = 0;
+ mock_altfw_num = -100;
+
+ memset(mock_vbtlk_retval, 0, sizeof(mock_vbtlk_retval));
+ memset(mock_vbtlk_expected_flag, 0, sizeof(mock_vbtlk_expected_flag));
+ mock_vbtlk_count = 0;
+ mock_vbtlk_total = 0;
+}
+
+/* Mock functions */
+
+enum vb2_dev_default_boot vb2_get_dev_boot_target(struct vb2_context *c)
+{
+ return mock_default_boot;
+}
+
+int vb2_dev_boot_allowed(struct vb2_context *c)
+{
+ return mock_dev_boot_allowed;
+}
+
+int vb2_dev_boot_legacy_allowed(struct vb2_context *c)
+{
+ return mock_dev_boot_legacy_allowed;
+}
+
+int vb2_dev_boot_usb_allowed(struct vb2_context *c)
+{
+ return mock_dev_boot_usb_allowed;
+}
+
+vb2_error_t VbExLegacy(enum VbAltFwIndex_t altfw_num)
+{
+ mock_vbexlegacy_called++;
+ mock_altfw_num = altfw_num;
+
+ return VB2_SUCCESS;
+}
+
+vb2_error_t VbTryLoadKernel(struct vb2_context *c, uint32_t get_info_flags)
+{
+ if (mock_vbtlk_count >= mock_vbtlk_total) {
+ TEST_TRUE(0, " VbTryLoadKernel called too many times.");
+ return VB2_ERROR_MOCK;
+ }
+
+ TEST_EQ(mock_vbtlk_expected_flag[mock_vbtlk_count], get_info_flags,
+ " unexpected get_info_flags");
+
+ return mock_vbtlk_retval[mock_vbtlk_count++];
+}
+
+vb2_error_t vb2ex_display_ui(enum vb2_screen screen, uint32_t locale)
+{
+ VB2_DEBUG("screens %d: screen = %#x, locale = %u\n",
+ mock_screens_count, screen, locale);
+
+ if (mock_screens_count >= ARRAY_SIZE(mock_screens_displayed) ||
+ mock_screens_count >= ARRAY_SIZE(mock_locales_displayed)) {
+ TEST_TRUE(0, "Test failed as mock vb2ex_display_ui ran out of"
+ " entries!");
+ return VB2_ERROR_MOCK;
+ }
+
+ mock_screens_displayed[mock_screens_count] = screen;
+ mock_locales_displayed[mock_screens_count] = locale;
+ mock_screens_count++;
+
+ return VB2_SUCCESS;
+}
/* Tests */
static void developer_tests(void)
{
- /* TODO(roccochen) */
+ /* Proceed */
+ reset_common_data();
+ add_mock_vbtlk(VB2_SUCCESS, VB_DISK_FLAG_FIXED);
+ TEST_EQ(vb2_developer_menu(ctx), VB2_SUCCESS, "proceed");
+ TEST_EQ(mock_screens_displayed[0], VB2_SCREEN_BLANK,
+ " final blank screen");
+ TEST_EQ(mock_screens_count, 1, " no extra screens");
+ TEST_EQ(vb2_nv_get(ctx, VB2_NV_RECOVERY_REQUEST), 0,
+ " recovery reason");
+ TEST_EQ(mock_vbtlk_count, mock_vbtlk_total, " used up mock_vbtlk");
+
+ /* Proceed to legacy */
+ reset_common_data();
+ mock_default_boot = VB2_DEV_DEFAULT_BOOT_LEGACY;
+ mock_dev_boot_legacy_allowed = 1;
+ TEST_EQ(vb2_developer_menu(ctx), VB2_SUCCESS, "proceed to legacy");
+ TEST_EQ(mock_vbexlegacy_called, 1, " try legacy");
+ TEST_EQ(mock_altfw_num, 0, " check altfw_num");
+ TEST_EQ(mock_screens_displayed[0], VB2_SCREEN_BLANK,
+ " final blank screen");
+ TEST_EQ(mock_screens_count, 1, " no extra screens");
+ TEST_EQ(mock_vbtlk_count, mock_vbtlk_total, " used up mock_vbtlk");
+
+ /* Proceed to legacy only if enabled */
+ reset_common_data();
+ add_mock_vbtlk(VB2_SUCCESS, VB_DISK_FLAG_FIXED);
+ mock_default_boot = VB2_DEV_DEFAULT_BOOT_LEGACY;
+ TEST_EQ(vb2_developer_menu(ctx), VB2_SUCCESS,
+ "default legacy not enabled");
+ TEST_EQ(mock_vbexlegacy_called, 0, " not legacy");
+ TEST_EQ(mock_screens_displayed[0], VB2_SCREEN_BLANK,
+ " final blank screen");
+ TEST_EQ(mock_screens_count, 1, " no extra screens");
+ TEST_EQ(vb2_nv_get(ctx, VB2_NV_RECOVERY_REQUEST), 0,
+ " no recovery");
+ TEST_EQ(mock_vbtlk_count, mock_vbtlk_total, " used up mock_vbtlk");
+
+ /* Proceed to usb */
+ reset_common_data();
+ add_mock_vbtlk(VB2_SUCCESS, VB_DISK_FLAG_REMOVABLE);
+ mock_default_boot = VB2_DEV_DEFAULT_BOOT_USB;
+ mock_dev_boot_usb_allowed = 1;
+ TEST_EQ(vb2_developer_menu(ctx), VB2_SUCCESS, "proceed to usb");
+ TEST_EQ(mock_screens_displayed[0], VB2_SCREEN_BLANK,
+ " final blank screen");
+ TEST_EQ(mock_screens_count, 1, " no extra screens");
+ TEST_EQ(mock_vbtlk_count, mock_vbtlk_total, " used up mock_vbtlk");
+
+ /* Proceed to usb only if enabled */
+ reset_common_data();
+ add_mock_vbtlk(VB2_SUCCESS, VB_DISK_FLAG_FIXED);
+ mock_default_boot = VB2_DEV_DEFAULT_BOOT_USB;
+ TEST_EQ(vb2_developer_menu(ctx), VB2_SUCCESS,
+ "default usb not enabled");
+ TEST_EQ(mock_screens_displayed[0], VB2_SCREEN_BLANK,
+ " final blank screen");
+ TEST_EQ(mock_screens_count, 1, " no extra screens");
+ TEST_EQ(vb2_nv_get(ctx, VB2_NV_RECOVERY_REQUEST), 0,
+ " no recovery");
+ TEST_EQ(mock_vbtlk_count, mock_vbtlk_total, " used up mock_vbtlk");
}
static void broken_recovery_tests(void)