buffer: Implement "updateReadPtr"

This is a helper function for reading the circular buffer

Tested: Unit tested

Signed-off-by: Brandon Kim <brandonkim@google.com>
Change-Id: I1c34a40bd279ee601de33669aabfec27a959ec44
diff --git a/test/buffer_test.cpp b/test/buffer_test.cpp
index e8943a9..4307825 100644
--- a/test/buffer_test.cpp
+++ b/test/buffer_test.cpp
@@ -152,5 +152,37 @@
     EXPECT_EQ(bufferImpl->getCachedBufferHeader(), testInitializationHeader);
 }
 
+TEST_F(BufferTest, BufferUpdateReadPtrFail)
+{
+    // Return write size that is not 2 which is sizeof(little_uint16_t)
+    constexpr size_t wrongWriteSize = 1;
+    EXPECT_CALL(*dataInterfaceMockPtr, write(_, _))
+        .WillOnce(Return(wrongWriteSize));
+    EXPECT_THROW(
+        try {
+            bufferImpl->updateReadPtr(0);
+        } catch (const std::runtime_error& e) {
+            EXPECT_STREQ(
+                e.what(),
+                "[updateReadPtr] Wrote '1' bytes, instead of expected '2'");
+            throw;
+        },
+        std::runtime_error);
+}
+
+TEST_F(BufferTest, BufferUpdateReadPtrPass)
+{
+    constexpr size_t expectedWriteSize = 2;
+    constexpr uint8_t expectedBmcReadPtrOffset = 0x20;
+    // Check that we truncate the highest 16bits
+    const uint32_t testNewReadPtr = 0x99881234;
+    const std::vector<uint8_t> expectedReadPtr{0x34, 0x12};
+
+    EXPECT_CALL(*dataInterfaceMockPtr, write(expectedBmcReadPtrOffset,
+                                             ElementsAreArray(expectedReadPtr)))
+        .WillOnce(Return(expectedWriteSize));
+    EXPECT_NO_THROW(bufferImpl->updateReadPtr(testNewReadPtr));
+}
+
 } // namespace
 } // namespace bios_bmc_smm_error_logger