summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRandall Spangler <rspangler@chromium.org>2013-01-28 13:43:04 -0800
committerChromeBot <chrome-bot@google.com>2013-01-29 15:27:08 -0800
commit5a4e9fa03cf98e465f5c98721484bd2dcfe23db6 (patch)
tree69cd361abcb58b43f0c9d2804248db63fe1d8925
parentc8c8dfd90992808a91ce85110218cf1f78fd7f92 (diff)
downloadvboot-5a4e9fa03cf98e465f5c98721484bd2dcfe23db6.tar.gz
Add display tests
BUG=chromium-os:38139 BRANCH=none TEST=make runtests Change-Id: Ibfd3f5f2b7ac8871a99e5d8603baae17926ab972 Signed-off-by: Randall Spangler <rspangler@chromium.org> Reviewed-on: https://gerrit.chromium.org/gerrit/42170 Reviewed-by: Bill Richardson <wfrichar@chromium.org>
-rw-r--r--firmware/lib/include/vboot_display.h14
-rw-r--r--firmware/lib/vboot_display.c10
-rw-r--r--tests/vboot_display_tests.c121
3 files changed, 128 insertions, 17 deletions
diff --git a/firmware/lib/include/vboot_display.h b/firmware/lib/include/vboot_display.h
index f8aa810b..d65d67c3 100644
--- a/firmware/lib/include/vboot_display.h
+++ b/firmware/lib/include/vboot_display.h
@@ -20,7 +20,21 @@ VbError_t VbCheckDisplayKey(VbCommonParams *cparams, uint32_t key,
VbNvContext *vncptr);
/* Internal functions, for unit testing */
+
+/**
+ * Return a description of the recovery reason code.
+ */
const char *RecoveryReasonString(uint8_t code);
+/**
+ * Return a fixed string representing the HWID.
+ */
+char *VbHWID(VbCommonParams *cparams);
+
+/**
+ * Get the number of localizations in the GBB bitmap data.
+ */
+VbError_t VbGetLocalizationCount(VbCommonParams *cparams, uint32_t *count);
+
#endif /* VBOOT_REFERENCE_VBOOT_DISPLAY_H_ */
diff --git a/firmware/lib/vboot_display.c b/firmware/lib/vboot_display.c
index 929cacc2..b081b385 100644
--- a/firmware/lib/vboot_display.c
+++ b/firmware/lib/vboot_display.c
@@ -16,10 +16,7 @@
static uint32_t disp_current_screen = VB_SCREEN_BLANK;
static uint32_t disp_width = 0, disp_height = 0;
-
-/* Get the number of localizations in the GBB bitmap data. */
-static VbError_t VbGetLocalizationCount(VbCommonParams* cparams,
- uint32_t* count) {
+VbError_t VbGetLocalizationCount(VbCommonParams *cparams, uint32_t *count) {
GoogleBinaryBlockHeader* gbb = (GoogleBinaryBlockHeader*)cparams->gbb_data;
BmpBlockHeader* hdr;
@@ -47,10 +44,7 @@ static VbError_t VbGetLocalizationCount(VbCommonParams* cparams,
return VBERROR_SUCCESS;
}
-
-
-/* Return a fixed string representing the HWID */
-static char *VbHWID(VbCommonParams* cparams) {
+char *VbHWID(VbCommonParams *cparams) {
GoogleBinaryBlockHeader* gbb = (GoogleBinaryBlockHeader*)cparams->gbb_data;
if (0 == gbb->hwid_size ||
gbb->hwid_offset > cparams->gbb_size ||
diff --git a/tests/vboot_display_tests.c b/tests/vboot_display_tests.c
index 5713667b..b3950438 100644
--- a/tests/vboot_display_tests.c
+++ b/tests/vboot_display_tests.c
@@ -21,21 +21,41 @@ static VbCommonParams cparams;
static VbNvContext vnc;
static uint8_t shared_data[VB_SHARED_DATA_MIN_SIZE];
static VbSharedDataHeader *shared = (VbSharedDataHeader *)shared_data;
-static GoogleBinaryBlockHeader gbb;
+static char gbb_data[4096 + sizeof(GoogleBinaryBlockHeader)];
+static GoogleBinaryBlockHeader *gbb = (GoogleBinaryBlockHeader *)gbb_data;
+static BmpBlockHeader *bhdr;
static char debug_info[4096];
/* Reset mock data (for use before each test) */
static void ResetMocks(void)
{
+ int gbb_used;
+
+ Memset(gbb_data, 0, sizeof(gbb_data));
+ gbb->major_version = GBB_MAJOR_VER;
+ gbb->minor_version = GBB_MINOR_VER;
+ gbb->flags = 0;
+ gbb_used = sizeof(GoogleBinaryBlockHeader);
+
+ gbb->hwid_offset = gbb_used;
+ strcpy(gbb_data + gbb->hwid_offset, "Test HWID");
+ gbb->hwid_size = strlen(gbb_data + gbb->hwid_offset) + 1;
+ gbb_used = (gbb_used + gbb->hwid_size + 7) & ~7;
+
+ gbb->bmpfv_offset = gbb_used;
+ bhdr = (BmpBlockHeader *)(gbb_data + gbb->bmpfv_offset);
+ gbb->bmpfv_size = sizeof(BmpBlockHeader);
+ gbb_used = (gbb_used + gbb->bmpfv_size + 7) & ~7;
+ memcpy(bhdr->signature, BMPBLOCK_SIGNATURE, BMPBLOCK_SIGNATURE_SIZE);
+ bhdr->major_version = BMPBLOCK_MAJOR_VERSION;
+ bhdr->minor_version = BMPBLOCK_MINOR_VERSION;
+ bhdr->number_of_localizations = 3;
+
Memset(&cparams, 0, sizeof(cparams));
cparams.shared_data_size = sizeof(shared_data);
cparams.shared_data_blob = shared_data;
- cparams.gbb_data = &gbb;
-
- Memset(&gbb, 0, sizeof(gbb));
- gbb.major_version = GBB_MAJOR_VER;
- gbb.minor_version = GBB_MINOR_VER;
- gbb.flags = 0;
+ cparams.gbb_data = gbb;
+ cparams.gbb_size = sizeof(gbb_data);
Memset(&vnc, 0, sizeof(vnc));
VbNvSetup(&vnc);
@@ -65,19 +85,102 @@ static void DebugInfoTest(void)
for (i = 0; i < 0x100; i++)
TEST_PTR_NEQ(RecoveryReasonString(i), NULL, "Non-null reason");
+ /* HWID should come from the gbb */
+ ResetMocks();
+ TEST_EQ(strcmp(VbHWID(&cparams), "Test HWID"), 0, "HWID");
+
+ ResetMocks();
+ cparams.gbb_size = 0;
+ TEST_EQ(strcmp(VbHWID(&cparams), "{INVALID}"), 0, "HWID bad gbb");
+
+ ResetMocks();
+ gbb->hwid_size = 0;
+ TEST_EQ(strcmp(VbHWID(&cparams), "{INVALID}"), 0, "HWID missing");
+
+ ResetMocks();
+ gbb->hwid_offset = cparams.gbb_size + 1;
+ TEST_EQ(strcmp(VbHWID(&cparams), "{INVALID}"), 0, "HWID past end");
+
+ ResetMocks();
+ gbb->hwid_size = cparams.gbb_size;
+ TEST_EQ(strcmp(VbHWID(&cparams), "{INVALID}"), 0, "HWID overflow");
+
/* Display debug info */
+ ResetMocks();
VbDisplayDebugInfo(&cparams, &vnc);
TEST_NEQ(*debug_info, '\0', "Some debug info was displayed");
}
+/* Test localization */
+static void LocalizationTest(void)
+{
+ uint32_t count = 6;
+
+ ResetMocks();
+ gbb->bmpfv_size = 0;
+ TEST_EQ(VbGetLocalizationCount(&cparams, &count),
+ VBERROR_INVALID_GBB, "VbGetLocalizationCount bad gbb");
+ TEST_EQ(count, 0, " count");
+
+ ResetMocks();
+ bhdr->signature[0] ^= 0x5a;
+ TEST_EQ(VbGetLocalizationCount(&cparams, &count),
+ VBERROR_INVALID_BMPFV, "VbGetLocalizationCount bad bmpfv");
+
+ ResetMocks();
+ TEST_EQ(VbGetLocalizationCount(&cparams, &count), 0,
+ "VbGetLocalizationCount()");
+ TEST_EQ(count, 3, " count");
+
+}
+
+/* Test display key checking */
+static void DisplayKeyTest(void)
+{
+ uint32_t u;
+
+ ResetMocks();
+ VbCheckDisplayKey(&cparams, 'q', &vnc);
+ TEST_EQ(*debug_info, '\0', "DisplayKey q = does nothing");
+
+ ResetMocks();
+ VbCheckDisplayKey(&cparams, '\t', &vnc);
+ TEST_NEQ(*debug_info, '\0', "DisplayKey tab = display");
+
+ /* Toggle localization */
+ VbNvSet(&vnc, VBNV_LOCALIZATION_INDEX, 0);
+ VbNvTeardown(&vnc);
+ VbCheckDisplayKey(&cparams, VB_KEY_DOWN, &vnc);
+ VbNvGet(&vnc, VBNV_LOCALIZATION_INDEX, &u);
+ TEST_EQ(u, 2, "DisplayKey up");
+ VbCheckDisplayKey(&cparams, VB_KEY_LEFT, &vnc);
+ VbNvGet(&vnc, VBNV_LOCALIZATION_INDEX, &u);
+ TEST_EQ(u, 1, "DisplayKey left");
+ VbCheckDisplayKey(&cparams, VB_KEY_RIGHT, &vnc);
+ VbNvGet(&vnc, VBNV_LOCALIZATION_INDEX, &u);
+ TEST_EQ(u, 2, "DisplayKey right");
+ VbCheckDisplayKey(&cparams, VB_KEY_UP, &vnc);
+ VbNvGet(&vnc, VBNV_LOCALIZATION_INDEX, &u);
+ TEST_EQ(u, 0, "DisplayKey up");
+
+ /* Reset localization if localization count is invalid */
+ VbNvSet(&vnc, VBNV_LOCALIZATION_INDEX, 1);
+ VbNvTeardown(&vnc);
+ bhdr->signature[0] ^= 0x5a;
+ VbCheckDisplayKey(&cparams, VB_KEY_UP, &vnc);
+ VbNvGet(&vnc, VBNV_LOCALIZATION_INDEX, &u);
+ TEST_EQ(u, 0, "DisplayKey invalid");
+
+}
+
/* disable MSVC warnings on unused arguments */
__pragma(warning (disable: 4100))
int main(int argc, char* argv[])
{
- ResetMocks(); // KLUDGE
-
DebugInfoTest();
+ LocalizationTest();
+ DisplayKeyTest();
return gTestSuccess ? 0 : 255;
}