buffer: Implement "updateBmcFlags"

This function will be used to update the "bmcFlags" member of the buffer
header.

Also reinforced the updateReadPtr unit tests to check that the header
buffer was actually updated by checking the result after.

Tested: Unit tested

Signed-off-by: Brandon Kim <brandonkim@google.com>
Change-Id: Iff7a1eea6824b84347e1a6aaed872ed6caa55788
diff --git a/src/buffer.cpp b/src/buffer.cpp
index 278f8cf..5d39f69 100644
--- a/src/buffer.cpp
+++ b/src/buffer.cpp
@@ -119,6 +119,29 @@
     cachedBufferHeader.bmcReadPtr = truncatedReadPtr;
 }
 
+void BufferImpl::updateBmcFlags(const uint32_t newBmcFlag)
+{
+    constexpr uint8_t bmcFlagsPtrOffset =
+        offsetof(struct CircularBufferHeader, bmcFlags);
+
+    little_uint32_t littleNewBmcFlag =
+        boost::endian::native_to_little(newBmcFlag);
+    uint8_t* littleNewBmcFlagPtr =
+        reinterpret_cast<uint8_t*>(&littleNewBmcFlag);
+
+    size_t writtenSize = dataInterface->write(
+        bmcFlagsPtrOffset, std::span<const uint8_t>{
+                               littleNewBmcFlagPtr,
+                               littleNewBmcFlagPtr + sizeof(little_uint32_t)});
+    if (writtenSize != sizeof(little_uint32_t))
+    {
+        throw std::runtime_error(fmt::format(
+            "[updateBmcFlags] Wrote '{}' bytes, instead of expected '{}'",
+            writtenSize, sizeof(little_uint32_t)));
+    }
+    cachedBufferHeader.bmcFlags = littleNewBmcFlag;
+}
+
 size_t BufferImpl::getQueueOffset()
 {
     return sizeof(struct CircularBufferHeader) +