[sw/silicon_creator] Add tests for flash_ctrl info page definitions

Signed-off-by: Alphan Ulusoy <alphan@google.com>
diff --git a/sw/device/silicon_creator/lib/drivers/flash_ctrl_unittest.cc b/sw/device/silicon_creator/lib/drivers/flash_ctrl_unittest.cc
index 55d4ffb..332d124 100644
--- a/sw/device/silicon_creator/lib/drivers/flash_ctrl_unittest.cc
+++ b/sw/device/silicon_creator/lib/drivers/flash_ctrl_unittest.cc
@@ -16,6 +16,41 @@
 
 namespace flash_ctrl_unittest {
 namespace {
+using ::testing::Each;
+using ::testing::SizeIs;
+
+/**
+ * A struct that holds bank, page, and config register information for an
+ * information page.
+ */
+struct InfoPage {
+  uint32_t bank;
+  uint32_t page;
+  uint32_t cfg_offset;
+  uint32_t cfg_wen_offset;
+};
+
+/**
+ * Returns a map from `flash_ctrl_info_page_t` to `InfoPage` to be used in
+ * tests.
+ */
+const std::map<flash_ctrl_info_page_t, InfoPage> &InfoPages() {
+#define INFO_PAGE_MAP_INIT(name_, bank_, page_)                                    \
+  {                                                                                \
+    name_,                                                                         \
+        {                                                                          \
+            bank_,                                                                 \
+            page_,                                                                 \
+            FLASH_CTRL_BANK##bank_##_INFO0_PAGE_CFG_SHADOWED_##page_##_REG_OFFSET, \
+            FLASH_CTRL_BANK##bank_##_INFO0_REGWEN_##page_##_REG_OFFSET,            \
+        },                                                                         \
+  }
+
+  static const std::map<flash_ctrl_info_page_t, InfoPage> *const kInfoPages =
+      new std::map<flash_ctrl_info_page_t, InfoPage>{
+          FLASH_CTRL_INFO_PAGES_DEFINE(INFO_PAGE_MAP_INIT)};
+  return *kInfoPages;
+}
 
 class FlashCtrlTest : public mask_rom_test::MaskRomTest {
  protected:
@@ -24,6 +59,41 @@
   mask_rom_test::MockSecMmio sec_mmio_;
 };
 
+class InfoPagesTest : public FlashCtrlTest {};
+TEST_F(InfoPagesTest, NumberOfPages) { EXPECT_THAT(InfoPages(), SizeIs(20)); }
+
+TEST_F(InfoPagesTest, PagesPerBank) {
+  std::array<uint32_t, 2> pages_per_bank = {0, 0};
+  for (const auto &it : InfoPages()) {
+    const uint32_t bank = it.second.bank;
+    EXPECT_EQ(bank, static_cast<uint32_t>(bitfield_bit32_read(
+                        it.first, FLASH_CTRL_INFO_PAGE_BIT_BANK)));
+    EXPECT_LE(bank, 1);
+    ++pages_per_bank[bank];
+  }
+
+  EXPECT_THAT(pages_per_bank, Each(10));
+}
+
+TEST_F(InfoPagesTest, AllType0) {
+  for (const auto &it : InfoPages()) {
+    const flash_ctrl_partition_t partition =
+        static_cast<flash_ctrl_partition_t>(bitfield_field32_read(
+            it.first, FLASH_CTRL_INFO_PAGE_FIELD_PARTITION));
+    EXPECT_EQ(partition, kFlashCtrlPartitionInfo0);
+  }
+}
+
+TEST_F(InfoPagesTest, PageIndices) {
+  for (const auto &it : InfoPages()) {
+    const uint32_t page = it.second.page;
+
+    EXPECT_EQ(page,
+              bitfield_field32_read(it.first, FLASH_CTRL_INFO_PAGE_FIELD_PAGE));
+    EXPECT_LE(page, 9);
+  }
+}
+
 class InitTest : public FlashCtrlTest {};
 
 TEST_F(InitTest, Initialize) {