summaryrefslogtreecommitdiff
path: root/tests/vboot_firmware_tests.c
diff options
context:
space:
mode:
Diffstat (limited to 'tests/vboot_firmware_tests.c')
-rw-r--r--tests/vboot_firmware_tests.c33
1 files changed, 33 insertions, 0 deletions
diff --git a/tests/vboot_firmware_tests.c b/tests/vboot_firmware_tests.c
index 651197cf..f83d970f 100644
--- a/tests/vboot_firmware_tests.c
+++ b/tests/vboot_firmware_tests.c
@@ -371,6 +371,39 @@ static void LoadFirmwareTest(void) {
VbNvGet(&vnc, VBNV_TRY_B_COUNT, &u);
TEST_EQ(u, 4, "Used up a try");
+ /* There's a optimistic boot mode that doesn't consume tries.
+ * The behaviour should differ only in that the try count doesn't change. */
+ /* Optimistic boot case 1: count == 0: Go for A */
+ ResetMocks();
+ mpreamble[0].flags = VB_FIRMWARE_PREAMBLE_USE_RO_NORMAL;
+ mpreamble[1].flags = VB_FIRMWARE_PREAMBLE_USE_RO_NORMAL;
+ shared->flags |= VBSD_BOOT_RO_NORMAL_SUPPORT;
+ shared->flags |= VBSD_NOFAIL_BOOT;
+ VbNvSet(&vnc, VBNV_TRY_B_COUNT, 0);
+ TestLoadFirmware(VBERROR_SUCCESS, 0, "Give up on B");
+ TEST_EQ(shared->check_fw_a_result, VBSD_LF_CHECK_VALID, "RO normal A valid");
+ TEST_EQ(shared->check_fw_b_result, 0, "RO normal B not checked");
+ TEST_EQ(shared->firmware_index, 0, "Boot A");
+ TEST_EQ(shared->flags & VBSD_FWB_TRIED, 0, "Didn't try firmware B");
+ TEST_EQ(shared->kernel_subkey.algorithm, 7, "Copy kernel subkey");
+ VbNvGet(&vnc, VBNV_TRY_B_COUNT, &u);
+ TEST_EQ(u, 0, "try count still zero");
+ /* Optimistic boot case 2: count > 0: count unchanged, use B */
+ ResetMocks();
+ mpreamble[0].flags = VB_FIRMWARE_PREAMBLE_USE_RO_NORMAL;
+ mpreamble[1].flags = VB_FIRMWARE_PREAMBLE_USE_RO_NORMAL;
+ shared->flags |= VBSD_BOOT_RO_NORMAL_SUPPORT;
+ shared->flags |= VBSD_NOFAIL_BOOT;
+ VbNvSet(&vnc, VBNV_TRY_B_COUNT, 5);
+ TestLoadFirmware(VBERROR_SUCCESS, 0, "Check B then A");
+ TEST_EQ(shared->check_fw_a_result, 0, "RO normal A not checked ");
+ TEST_EQ(shared->check_fw_b_result, VBSD_LF_CHECK_VALID, "RO normal B valid");
+ TEST_EQ(shared->firmware_index, 1, "Boot B");
+ TEST_NEQ(shared->flags & VBSD_FWB_TRIED, 0, "Tried firmware B");
+ TEST_EQ(shared->kernel_subkey.algorithm, 8, "Copy kernel subkey");
+ VbNvGet(&vnc, VBNV_TRY_B_COUNT, &u);
+ TEST_EQ(u, 5, "Not used up a try");
+
/* If both A and B are valid and grater version than TPM, A is
* selected and B preamble (but not body) is verified. */
ResetMocks();