summaryrefslogtreecommitdiff
path: root/tests/vboot_firmware_tests.c
diff options
context:
space:
mode:
authorPatrick Georgi <pgeorgi@google.com>2015-02-10 14:58:28 +0100
committerChromeOS Commit Bot <chromeos-commit-bot@chromium.org>2015-05-28 16:30:17 +0000
commitebf886b5fd3dd75a00205879f3847198ecf83bdd (patch)
tree79ca3669907a75aefbc84d1a9d3ac659e741f5e1 /tests/vboot_firmware_tests.c
parentf27436032668e332b4ed7cc168bbcc2a939ae7b9 (diff)
downloadvboot-ebf886b5fd3dd75a00205879f3847198ecf83bdd.tar.gz
Provide a way to disable counting failed boots
When the lid is closed and external power is applied the system may boot and shut down faster than required for the OS to determine that things were alright. In timed charging setups this led to systems ending up to consider the current version broken because it "failed" repeatedly. Remain generic about the reason for not counting boots since there may be more situations in which we want to handle the situation optimistically. BRANCH=none BUG=chromium:446945 TEST=none Change-Id: Iea350e3c98d5c00156da682e52c90a882ba017c0 Signed-off-by: Patrick Georgi <pgeorgi@chromium.org> Reviewed-on: https://chromium-review.googlesource.com/249150 Reviewed-by: Randall Spangler <rspangler@chromium.org>
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();