summaryrefslogtreecommitdiff
path: root/tests/vboot_api_kernel2_tests.c
diff options
context:
space:
mode:
Diffstat (limited to 'tests/vboot_api_kernel2_tests.c')
-rw-r--r--tests/vboot_api_kernel2_tests.c185
1 files changed, 183 insertions, 2 deletions
diff --git a/tests/vboot_api_kernel2_tests.c b/tests/vboot_api_kernel2_tests.c
index 9b887597..9224725f 100644
--- a/tests/vboot_api_kernel2_tests.c
+++ b/tests/vboot_api_kernel2_tests.c
@@ -41,7 +41,7 @@ static int altfw_num;
static int trust_ec;
static int virtdev_set;
static uint32_t virtdev_retval;
-static uint32_t mock_keypress[8];
+static uint32_t mock_keypress[16];
static uint32_t mock_keyflags[8];
static uint32_t mock_keypress_count;
static uint32_t mock_switches[8];
@@ -52,6 +52,9 @@ static uint32_t screens_count = 0;
static uint32_t mock_num_disks[8];
static uint32_t mock_num_disks_count;
+static char set_vendor_data[32];
+static int set_vendor_data_called;
+
extern enum VbEcBootMode_t VbGetMode(void);
extern struct RollbackSpaceFwmp *VbApiKernelGetFwmp(void);
@@ -83,6 +86,7 @@ static void ResetMocks(void)
trust_ec = 0;
virtdev_set = 0;
virtdev_retval = 0;
+ set_vendor_data_called = 0;
memset(screens_displayed, 0, sizeof(screens_displayed));
screens_count = 0;
@@ -193,7 +197,8 @@ uint32_t VbTryLoadKernel(struct vb2_context *ctx, uint32_t get_info_flags)
return vbtlk_retval + get_info_flags;
}
-VbError_t VbDisplayScreen(struct vb2_context *ctx, uint32_t screen, int force)
+VbError_t VbDisplayScreen(struct vb2_context *ctx, uint32_t screen, int force,
+ const VbScreenData *data)
{
if (screens_count < ARRAY_SIZE(screens_displayed))
screens_displayed[screens_count++] = screen;
@@ -207,6 +212,14 @@ uint32_t SetVirtualDevMode(int val)
return virtdev_retval;
}
+VbError_t VbExSetVendorData(const char *vendor_data_value)
+{
+ set_vendor_data_called = 1;
+ strncpy(set_vendor_data, vendor_data_value, sizeof(set_vendor_data));
+
+ return VBERROR_SUCCESS;
+}
+
/* Tests */
static void VbUserConfirmsTest(void)
@@ -590,6 +603,174 @@ static void VbBootDevTest(void)
vbtlk_retval = VBERROR_SUCCESS - VB_DISK_FLAG_REMOVABLE;
TEST_EQ(VbBootDeveloper(&ctx), 0, "Ctrl+U force USB");
+ /* Ctrl+S set vendor data and reboot */
+ ResetMocks();
+ ctx.flags |= VB2_CONTEXT_VENDOR_DATA_SETTABLE;
+ mock_keypress[0] = VB_KEY_CTRL('S');
+ mock_keypress[1] = '4';
+ mock_keypress[2] = '3';
+ mock_keypress[3] = '2';
+ mock_keypress[4] = '1';
+ mock_keypress[5] = VB_KEY_ENTER; // Set vendor data
+ mock_keypress[6] = VB_KEY_ENTER; // Confirm vendor data
+ TEST_EQ(VbBootDeveloper(&ctx), VBERROR_REBOOT_REQUIRED,
+ "Ctrl+S set vendor data and reboot");
+ TEST_EQ(set_vendor_data_called, 1, " VbExSetVendorData() called");
+ TEST_STR_EQ(set_vendor_data, "4321", " Vendor data correct");
+
+ /* Ctrl+S extra keys ignored */
+ ResetMocks();
+ ctx.flags |= VB2_CONTEXT_VENDOR_DATA_SETTABLE;
+ mock_keypress[0] = VB_KEY_CTRL('S');
+ mock_keypress[1] = '4';
+ mock_keypress[2] = '3';
+ mock_keypress[3] = '2';
+ mock_keypress[4] = '1';
+ mock_keypress[5] = '5';
+ mock_keypress[6] = VB_KEY_ENTER; // Set vendor data
+ mock_keypress[7] = VB_KEY_ENTER; // Confirm vendor data
+ TEST_EQ(VbBootDeveloper(&ctx), VBERROR_REBOOT_REQUIRED,
+ "Ctrl+S extra keys ignored");
+ TEST_EQ(set_vendor_data_called, 1, " VbExSetVendorData() called");
+ TEST_STR_EQ(set_vendor_data, "4321", " Vendor data correct");
+
+ /* Ctrl+S converts case */
+ ResetMocks();
+ ctx.flags |= VB2_CONTEXT_VENDOR_DATA_SETTABLE;
+ mock_keypress[0] = VB_KEY_CTRL('S');
+ mock_keypress[1] = 'a';
+ mock_keypress[2] = 'B';
+ mock_keypress[3] = 'Y';
+ mock_keypress[4] = 'z';
+ mock_keypress[5] = VB_KEY_ENTER; // Set vendor data
+ mock_keypress[6] = VB_KEY_ENTER; // Confirm vendor data
+ TEST_EQ(VbBootDeveloper(&ctx), VBERROR_REBOOT_REQUIRED,
+ "Ctrl+S converts case");
+ TEST_EQ(set_vendor_data_called, 1, " VbExSetVendorData() called");
+ TEST_STR_EQ(set_vendor_data, "ABYZ", " Vendor data correct");
+
+ /* Ctrl+S backspace works */
+ ResetMocks();
+ ctx.flags |= VB2_CONTEXT_VENDOR_DATA_SETTABLE;
+ mock_keypress[0] = VB_KEY_CTRL('S');
+ mock_keypress[1] = 'A';
+ mock_keypress[2] = 'B';
+ mock_keypress[3] = 'C';
+ mock_keypress[4] = VB_KEY_BACKSPACE;
+ mock_keypress[5] = VB_KEY_BACKSPACE;
+ mock_keypress[6] = '3';
+ mock_keypress[7] = '2';
+ mock_keypress[8] = '1';
+ mock_keypress[9] = VB_KEY_ENTER; // Set vendor data
+ mock_keypress[10] = VB_KEY_ENTER; // Confirm vendor data
+ TEST_EQ(VbBootDeveloper(&ctx), VBERROR_REBOOT_REQUIRED,
+ "Ctrl+S backspace works");
+ TEST_EQ(set_vendor_data_called, 1, " VbExSetVendorData() called");
+ TEST_STR_EQ(set_vendor_data, "A321", " Vendor data correct");
+
+ /* Ctrl+S invalid chars don't print */
+ ResetMocks();
+ ctx.flags |= VB2_CONTEXT_VENDOR_DATA_SETTABLE;
+ mock_keypress[0] = VB_KEY_CTRL('S');
+ mock_keypress[1] = '4';
+ mock_keypress[2] = '-';
+ mock_keypress[3] = '^';
+ mock_keypress[4] = '&';
+ mock_keypress[5] = '$';
+ mock_keypress[6] = '.';
+ mock_keypress[7] = '3';
+ mock_keypress[8] = '2';
+ mock_keypress[9] = '1';
+ mock_keypress[10] = VB_KEY_ENTER; // Set vendor data
+ mock_keypress[11] = VB_KEY_ENTER; // Confirm vendor data
+ TEST_EQ(VbBootDeveloper(&ctx), VBERROR_REBOOT_REQUIRED,
+ "Ctrl+S invalid chars don't print");
+ TEST_EQ(set_vendor_data_called, 1, " VbExSetVendorData() called");
+ TEST_STR_EQ(set_vendor_data, "4321", " Vendor data correct");
+
+ /* Ctrl+S invalid chars don't print with backspace */
+ ResetMocks();
+ ctx.flags |= VB2_CONTEXT_VENDOR_DATA_SETTABLE;
+ mock_keypress[0] = VB_KEY_CTRL('S');
+ mock_keypress[1] = '4';
+ mock_keypress[2] = '-';
+ mock_keypress[3] = VB_KEY_BACKSPACE; // Should delete 4
+ mock_keypress[4] = '3';
+ mock_keypress[5] = '2';
+ mock_keypress[6] = '1';
+ mock_keypress[7] = '0';
+ mock_keypress[8] = VB_KEY_ENTER; // Set vendor data
+ mock_keypress[9] = VB_KEY_ENTER; // Confirm vendor data
+ TEST_EQ(VbBootDeveloper(&ctx), VBERROR_REBOOT_REQUIRED,
+ "Ctrl+S invalid chars don't print with backspace");
+ TEST_EQ(set_vendor_data_called, 1, " VbExSetVendorData() called");
+ TEST_STR_EQ(set_vendor_data, "3210", " Vendor data correct");
+
+ /* Ctrl+S backspace only doesn't underrun */
+ ResetMocks();
+ ctx.flags |= VB2_CONTEXT_VENDOR_DATA_SETTABLE;
+ mock_keypress[0] = VB_KEY_CTRL('S');
+ mock_keypress[1] = 'A';
+ mock_keypress[2] = VB_KEY_BACKSPACE;
+ mock_keypress[3] = VB_KEY_BACKSPACE;
+ mock_keypress[4] = '4';
+ mock_keypress[5] = '3';
+ mock_keypress[6] = '2';
+ mock_keypress[7] = '1';
+ mock_keypress[8] = VB_KEY_ENTER; // Set vendor data
+ mock_keypress[9] = VB_KEY_ENTER; // Confirm vendor data
+ TEST_EQ(VbBootDeveloper(&ctx), VBERROR_REBOOT_REQUIRED,
+ "Ctrl+S backspace only doesn't underrun");
+ TEST_EQ(set_vendor_data_called, 1, " VbExSetVendorData() called");
+ TEST_STR_EQ(set_vendor_data, "4321", " Vendor data correct");
+
+ /* Ctrl+S too short */
+ ResetMocks();
+ ctx.flags |= VB2_CONTEXT_VENDOR_DATA_SETTABLE;
+ mock_keypress[0] = VB_KEY_CTRL('S');
+ mock_keypress[1] = '1';
+ mock_keypress[2] = '2';
+ mock_keypress[3] = '3';
+ mock_keypress[4] = VB_KEY_ENTER; // Set vendor data (Nothing happens)
+ mock_keypress[5] = VB_KEY_ENTER; // Confirm vendor data (Nothing happens)
+ mock_keypress[6] = VB_KEY_ESC;
+ TEST_EQ(VbBootDeveloper(&ctx), 1002, "Ctrl+S too short");
+ TEST_EQ(set_vendor_data_called, 0, " VbExSetVendorData() not called");
+
+ /* Ctrl+S esc from set screen */
+ ResetMocks();
+ ctx.flags |= VB2_CONTEXT_VENDOR_DATA_SETTABLE;
+ mock_keypress[0] = VB_KEY_CTRL('S');
+ mock_keypress[1] = VB_KEY_ESC;
+ TEST_EQ(VbBootDeveloper(&ctx), 1002, "Ctrl+S esc from set screen");
+ TEST_EQ(set_vendor_data_called, 0, " VbExSetVendorData() not called");
+
+ /* Ctrl+S esc from set screen with tag */
+ ResetMocks();
+ ctx.flags |= VB2_CONTEXT_VENDOR_DATA_SETTABLE;
+ mock_keypress[0] = VB_KEY_CTRL('S');
+ mock_keypress[1] = '4';
+ mock_keypress[2] = '3';
+ mock_keypress[3] = '2';
+ mock_keypress[4] = '1';
+ mock_keypress[5] = VB_KEY_ESC;
+ TEST_EQ(VbBootDeveloper(&ctx), 1002,
+ "Ctrl+S esc from set screen with tag");
+ TEST_EQ(set_vendor_data_called, 0, " VbExSetVendorData() not called");
+
+ /* Ctrl+S esc from confirm screen */
+ ResetMocks();
+ ctx.flags |= VB2_CONTEXT_VENDOR_DATA_SETTABLE;
+ mock_keypress[0] = VB_KEY_CTRL('S');
+ mock_keypress[1] = '4';
+ mock_keypress[2] = '3';
+ mock_keypress[3] = '2';
+ mock_keypress[4] = '1';
+ mock_keypress[5] = VB_KEY_ENTER; // Set vendor data
+ mock_keypress[6] = VB_KEY_ESC;
+ TEST_EQ(VbBootDeveloper(&ctx), 1002, "Ctrl+S esc from set screen");
+ TEST_EQ(set_vendor_data_called, 0, " VbExSetVendorData() not called");
+
/* If no USB, eventually times out and tries fixed disk */
ResetMocks();
vb2_nv_set(&ctx, VB2_NV_DEV_BOOT_USB, 1);