Add more display tests

BUG=chromium-os:38139
BRANCH=none
TEST=make runtests && FEATURES=test emerge-daisy vboot_reference

Change-Id: I28cd31f995f078d1715acaeaccce6e864930a986
Signed-off-by: Randall Spangler <rspangler@chromium.org>
Reviewed-on: https://gerrit.chromium.org/gerrit/42846
Reviewed-by: Bill Richardson <wfrichar@chromium.org>
diff --git a/firmware/lib/include/vboot_display.h b/firmware/lib/include/vboot_display.h
index d65d67c..52730b9 100644
--- a/firmware/lib/include/vboot_display.h
+++ b/firmware/lib/include/vboot_display.h
@@ -8,6 +8,7 @@
 #ifndef VBOOT_REFERENCE_VBOOT_DISPLAY_H_
 #define VBOOT_REFERENCE_VBOOT_DISPLAY_H_
 
+#include "bmpblk_font.h"
 #include "vboot_api.h"
 #include "vboot_nvstorage.h"
 
@@ -21,6 +22,21 @@
 
 /* Internal functions, for unit testing */
 
+typedef FontArrayHeader VbFont_t;
+
+VbFont_t *VbInternalizeFontData(FontArrayHeader *fonthdr);
+
+void VbDoneWithFontForNow(VbFont_t *ptr);
+
+ImageInfo *VbFindFontGlyph(VbFont_t *font, uint32_t ascii,
+			   void **bufferptr, uint32_t *buffersize);
+
+/**
+ * Try to display the specified text at a particular position.
+ */
+void VbRenderTextAtPos(char *text, int right_to_left,
+		       uint32_t x, uint32_t y, VbFont_t *font);
+
 /**
  * Return a description of the recovery reason code.
  */
diff --git a/firmware/lib/vboot_display.c b/firmware/lib/vboot_display.c
index bd86d65..7c916d0 100644
--- a/firmware/lib/vboot_display.c
+++ b/firmware/lib/vboot_display.c
@@ -68,19 +68,19 @@
  */
 typedef FontArrayHeader VbFont_t;
 
-static VbFont_t *VbInternalizeFontData(FontArrayHeader *fonthdr)
+VbFont_t *VbInternalizeFontData(FontArrayHeader *fonthdr)
 {
 	/* Just return the raw data pointer for now. */
 	return (VbFont_t *)fonthdr;
 }
 
-static void VbDoneWithFontForNow(VbFont_t *ptr)
+void VbDoneWithFontForNow(VbFont_t *ptr)
 {
 	/* Nothing. */
 }
 
-static ImageInfo *VbFindFontGlyph(VbFont_t *font, uint32_t ascii,
-                                  void **bufferptr, uint32_t *buffersize)
+ImageInfo *VbFindFontGlyph(VbFont_t *font, uint32_t ascii,
+			   void **bufferptr, uint32_t *buffersize)
 {
 	uint8_t *ptr, *firstptr;
 	uint32_t max;
@@ -120,11 +120,8 @@
 	return &(entry->info);
 }
 
-/**
- * Try to display the specified text at a particular position.
- */
-static void VbRenderTextAtPos(char *text, int right_to_left,
-                              uint32_t x, uint32_t y, VbFont_t *font)
+void VbRenderTextAtPos(char *text, int right_to_left,
+		       uint32_t x, uint32_t y, VbFont_t *font)
 {
 	int i;
 	ImageInfo *image_info = 0;
diff --git a/tests/vboot_display_tests.c b/tests/vboot_display_tests.c
index b395043..3093534 100644
--- a/tests/vboot_display_tests.c
+++ b/tests/vboot_display_tests.c
@@ -9,6 +9,7 @@
 #include <stdlib.h>
 #include <string.h>
 
+#include "bmpblk_font.h"
 #include "gbb_header.h"
 #include "host_common.h"
 #include "test_common.h"
@@ -148,6 +149,7 @@
 	TEST_NEQ(*debug_info, '\0', "DisplayKey tab = display");
 
 	/* Toggle localization */
+	ResetMocks();
 	VbNvSet(&vnc, VBNV_LOCALIZATION_INDEX, 0);
 	VbNvTeardown(&vnc);
 	VbCheckDisplayKey(&cparams, VB_KEY_DOWN, &vnc);
@@ -164,6 +166,7 @@
 	TEST_EQ(u, 0, "DisplayKey up");
 
 	/* Reset localization if localization count is invalid */
+	ResetMocks();
 	VbNvSet(&vnc, VBNV_LOCALIZATION_INDEX, 1);
 	VbNvTeardown(&vnc);
 	bhdr->signature[0] ^= 0x5a;
@@ -173,14 +176,59 @@
 
 }
 
-/* disable MSVC warnings on unused arguments */
-__pragma(warning (disable: 4100))
+static void FontTest(void)
+{
+	FontArrayHeader h;
+	FontArrayEntryHeader eh[3] = {
+		{
+			.ascii = 'A',
+			.info.original_size = 10,
+		},
+		{
+			.ascii = 'B',
+			.info.original_size = 20,
+		},
+		{
+			.ascii = 'C',
+			.info.original_size = 30,
+		},
+	};
+	FontArrayEntryHeader *eptr;
+	uint8_t buf[sizeof(h) + sizeof(eh)];
+	VbFont_t *fptr;
+	void *bufferptr;
+	uint32_t buffersize;
 
-int main(int argc, char* argv[])
+	/* Create font data */
+	h.num_entries = ARRAY_SIZE(eh);
+	Memcpy(buf, &h, sizeof(h));
+	eptr = (FontArrayEntryHeader *)(buf + sizeof(h));
+	Memcpy(eptr, eh, sizeof(eh));
+
+	fptr = VbInternalizeFontData((FontArrayHeader *)buf);
+	TEST_PTR_EQ(fptr, buf, "Internalize");
+
+	TEST_PTR_EQ(VbFindFontGlyph(fptr, 'B', &bufferptr, &buffersize),
+		    &eptr[1].info, "Glyph found");
+	TEST_EQ(buffersize, eptr[1].info.original_size, "  size");
+	TEST_PTR_EQ(VbFindFontGlyph(fptr, 'X', &bufferptr, &buffersize),
+		    &eptr[0].info, "Glyph not found");
+	TEST_EQ(buffersize, eptr[0].info.original_size, "  size");
+
+	/* Test invalid rendering params */
+	VbRenderTextAtPos(NULL, 0, 0, 0, fptr);
+	VbRenderTextAtPos("ABC", 0, 0, 0, NULL);
+
+	VbDoneWithFontForNow(fptr);
+
+}
+
+int main(void)
 {
 	DebugInfoTest();
 	LocalizationTest();
 	DisplayKeyTest();
+	FontTest();
 
 	return gTestSuccess ? 0 : 255;
 }