MessageBuffer: add ConsumeNextMessage()

This new method gives us the ability to read
messages out of the MessageBuffer.

Of course, include unit tests for this new
ability, as well.

Bug: 31653003
Test: ./runtests.sh (on bullhead)
Change-Id: I34476fae10e5a234330efa0d4535d92c885a2d1d
diff --git a/message_buffer.cpp b/message_buffer.cpp
index bb509ed..ccbb41f 100644
--- a/message_buffer.cpp
+++ b/message_buffer.cpp
@@ -25,7 +25,7 @@
 namespace wifilogd {
 
 MessageBuffer::MessageBuffer(size_t size)
-    : data_(new uint8_t[size]), capacity_(size), write_pos_(0) {
+    : data_(new uint8_t[size]), capacity_(size), read_pos_(0), write_pos_(0) {
   CHECK(size > GetHeaderSize());
 }
 
@@ -47,6 +47,24 @@
          GetFreeSize() - GetHeaderSize() >= length;
 }
 
+std::tuple<const uint8_t*, size_t> MessageBuffer::ConsumeNextMessage() {
+  if (read_pos_ >= write_pos_) {
+    return {nullptr, 0};
+  }
+
+  LengthHeader header;
+  const uint8_t* header_start = data_.get() + read_pos_;
+  CHECK(header_start + sizeof(header) <= data_.get() + capacity_);
+  std::memcpy(&header, header_start, sizeof(header));
+  read_pos_ += sizeof(header);
+
+  const uint8_t* payload_start = data_.get() + read_pos_;
+  read_pos_ += header.payload_len;
+  CHECK(read_pos_ <= capacity_);
+
+  return {payload_start, header.payload_len};
+}
+
 // Private methods below.
 
 void MessageBuffer::AppendHeader(uint16_t message_len) {