From 5a4e9fa03cf98e465f5c98721484bd2dcfe23db6 Mon Sep 17 00:00:00 2001 From: Randall Spangler Date: Mon, 28 Jan 2013 13:43:04 -0800 Subject: Add display tests BUG=chromium-os:38139 BRANCH=none TEST=make runtests Change-Id: Ibfd3f5f2b7ac8871a99e5d8603baae17926ab972 Signed-off-by: Randall Spangler Reviewed-on: https://gerrit.chromium.org/gerrit/42170 Reviewed-by: Bill Richardson --- tests/vboot_display_tests.c | 121 ++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 112 insertions(+), 9 deletions(-) (limited to 'tests') 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; } -- cgit v1.2.1