19d2165f7a9c41bb0081036d4ef5b9d5150fa3684mukesh agrawal/*
29d2165f7a9c41bb0081036d4ef5b9d5150fa3684mukesh agrawal * Copyright (C) 2016, The Android Open Source Project
39d2165f7a9c41bb0081036d4ef5b9d5150fa3684mukesh agrawal *
49d2165f7a9c41bb0081036d4ef5b9d5150fa3684mukesh agrawal * Licensed under the Apache License, Version 2.0 (the "License");
59d2165f7a9c41bb0081036d4ef5b9d5150fa3684mukesh agrawal * you may not use this file except in compliance with the License.
69d2165f7a9c41bb0081036d4ef5b9d5150fa3684mukesh agrawal * You may obtain a copy of the License at
79d2165f7a9c41bb0081036d4ef5b9d5150fa3684mukesh agrawal *
89d2165f7a9c41bb0081036d4ef5b9d5150fa3684mukesh agrawal *     http://www.apache.org/licenses/LICENSE-2.0
99d2165f7a9c41bb0081036d4ef5b9d5150fa3684mukesh agrawal *
109d2165f7a9c41bb0081036d4ef5b9d5150fa3684mukesh agrawal * Unless required by applicable law or agreed to in writing, software
119d2165f7a9c41bb0081036d4ef5b9d5150fa3684mukesh agrawal * distributed under the License is distributed on an "AS IS" BASIS,
129d2165f7a9c41bb0081036d4ef5b9d5150fa3684mukesh agrawal * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
139d2165f7a9c41bb0081036d4ef5b9d5150fa3684mukesh agrawal * See the License for the specific language governing permissions and
149d2165f7a9c41bb0081036d4ef5b9d5150fa3684mukesh agrawal * limitations under the License.
159d2165f7a9c41bb0081036d4ef5b9d5150fa3684mukesh agrawal */
169d2165f7a9c41bb0081036d4ef5b9d5150fa3684mukesh agrawal
17fd65102c2bb8b5a4cfa7d9ddff7d5f6c5d08e623mukesh agrawal#include <array>
186d8e2206e972a5f7512d5e2c558e9c23c77169f0mukesh agrawal#include <tuple>
196d8e2206e972a5f7512d5e2c558e9c23c77169f0mukesh agrawal#include <vector>
20fd65102c2bb8b5a4cfa7d9ddff7d5f6c5d08e623mukesh agrawal
219d2165f7a9c41bb0081036d4ef5b9d5150fa3684mukesh agrawal#include "gtest/gtest.h"
229d2165f7a9c41bb0081036d4ef5b9d5150fa3684mukesh agrawal
239d2165f7a9c41bb0081036d4ef5b9d5150fa3684mukesh agrawal#include "wifilogd/message_buffer.h"
249d2165f7a9c41bb0081036d4ef5b9d5150fa3684mukesh agrawal
259d2165f7a9c41bb0081036d4ef5b9d5150fa3684mukesh agrawalnamespace android {
269d2165f7a9c41bb0081036d4ef5b9d5150fa3684mukesh agrawalnamespace wifilogd {
279d2165f7a9c41bb0081036d4ef5b9d5150fa3684mukesh agrawalnamespace {
289d2165f7a9c41bb0081036d4ef5b9d5150fa3684mukesh agrawal
299d2165f7a9c41bb0081036d4ef5b9d5150fa3684mukesh agrawalconstexpr size_t kBufferSizeBytes = 1024;
309d2165f7a9c41bb0081036d4ef5b9d5150fa3684mukesh agrawalconstexpr size_t kHeaderSizeBytes = MessageBuffer::GetHeaderSize();
31fd65102c2bb8b5a4cfa7d9ddff7d5f6c5d08e623mukesh agrawalconstexpr std::array<uint8_t, 1> kSmallestMessage{};
32fd65102c2bb8b5a4cfa7d9ddff7d5f6c5d08e623mukesh agrawalconstexpr std::array<uint8_t, kBufferSizeBytes - kHeaderSizeBytes>
33fd65102c2bb8b5a4cfa7d9ddff7d5f6c5d08e623mukesh agrawal    kLargestMessage{};
349d2165f7a9c41bb0081036d4ef5b9d5150fa3684mukesh agrawal
359d2165f7a9c41bb0081036d4ef5b9d5150fa3684mukesh agrawalclass MessageBufferTest : public ::testing::Test {
369d2165f7a9c41bb0081036d4ef5b9d5150fa3684mukesh agrawal public:
379d2165f7a9c41bb0081036d4ef5b9d5150fa3684mukesh agrawal  MessageBufferTest() : buffer_{kBufferSizeBytes} {}
389d2165f7a9c41bb0081036d4ef5b9d5150fa3684mukesh agrawal
399d2165f7a9c41bb0081036d4ef5b9d5150fa3684mukesh agrawal protected:
406d8e2206e972a5f7512d5e2c558e9c23c77169f0mukesh agrawal  size_t FillBufferWithMultipleMessages() {
416d8e2206e972a5f7512d5e2c558e9c23c77169f0mukesh agrawal    constexpr std::array<uint8_t, kHeaderSizeBytes> message{};
426d8e2206e972a5f7512d5e2c558e9c23c77169f0mukesh agrawal    static_assert(kBufferSizeBytes % (kHeaderSizeBytes + message.size()) == 0,
436d8e2206e972a5f7512d5e2c558e9c23c77169f0mukesh agrawal                  "messages will not fill buffer to capacity");
446d8e2206e972a5f7512d5e2c558e9c23c77169f0mukesh agrawal    size_t n_written;
456d8e2206e972a5f7512d5e2c558e9c23c77169f0mukesh agrawal    for (n_written = 0;
466d8e2206e972a5f7512d5e2c558e9c23c77169f0mukesh agrawal         n_written < kBufferSizeBytes / (kHeaderSizeBytes + message.size());
476d8e2206e972a5f7512d5e2c558e9c23c77169f0mukesh agrawal         ++n_written) {
486d8e2206e972a5f7512d5e2c558e9c23c77169f0mukesh agrawal      EXPECT_TRUE(buffer_.Append(message.data(), message.size()));
496d8e2206e972a5f7512d5e2c558e9c23c77169f0mukesh agrawal    }
506d8e2206e972a5f7512d5e2c558e9c23c77169f0mukesh agrawal    EXPECT_EQ(0U, buffer_.GetFreeSize());
516d8e2206e972a5f7512d5e2c558e9c23c77169f0mukesh agrawal    return n_written;
526d8e2206e972a5f7512d5e2c558e9c23c77169f0mukesh agrawal  }
536d8e2206e972a5f7512d5e2c558e9c23c77169f0mukesh agrawal
546d8e2206e972a5f7512d5e2c558e9c23c77169f0mukesh agrawal  std::vector<uint8_t> GetNextMessageAsByteVector() {
556d8e2206e972a5f7512d5e2c558e9c23c77169f0mukesh agrawal    const uint8_t* start;
566d8e2206e972a5f7512d5e2c558e9c23c77169f0mukesh agrawal    size_t len;
576d8e2206e972a5f7512d5e2c558e9c23c77169f0mukesh agrawal    std::tie(start, len) = buffer_.ConsumeNextMessage();
586d8e2206e972a5f7512d5e2c558e9c23c77169f0mukesh agrawal    return {start, start + len};
596d8e2206e972a5f7512d5e2c558e9c23c77169f0mukesh agrawal  }
606d8e2206e972a5f7512d5e2c558e9c23c77169f0mukesh agrawal
619d2165f7a9c41bb0081036d4ef5b9d5150fa3684mukesh agrawal  MessageBuffer buffer_;
629d2165f7a9c41bb0081036d4ef5b9d5150fa3684mukesh agrawal};
639d2165f7a9c41bb0081036d4ef5b9d5150fa3684mukesh agrawal
649d2165f7a9c41bb0081036d4ef5b9d5150fa3684mukesh agrawal}  // namespace
659d2165f7a9c41bb0081036d4ef5b9d5150fa3684mukesh agrawal
66fd65102c2bb8b5a4cfa7d9ddff7d5f6c5d08e623mukesh agrawalTEST_F(MessageBufferTest, AppendMinimalOnEmptyBufferSucceeds) {
67fd65102c2bb8b5a4cfa7d9ddff7d5f6c5d08e623mukesh agrawal  EXPECT_TRUE(buffer_.Append(kSmallestMessage.data(), kSmallestMessage.size()));
68fd65102c2bb8b5a4cfa7d9ddff7d5f6c5d08e623mukesh agrawal}
69fd65102c2bb8b5a4cfa7d9ddff7d5f6c5d08e623mukesh agrawal
70fd65102c2bb8b5a4cfa7d9ddff7d5f6c5d08e623mukesh agrawalTEST_F(MessageBufferTest, AppendMaximalOnEmptyBufferSucceeds) {
71fd65102c2bb8b5a4cfa7d9ddff7d5f6c5d08e623mukesh agrawal  EXPECT_TRUE(buffer_.Append(kLargestMessage.data(), kLargestMessage.size()));
72fd65102c2bb8b5a4cfa7d9ddff7d5f6c5d08e623mukesh agrawal}
73fd65102c2bb8b5a4cfa7d9ddff7d5f6c5d08e623mukesh agrawal
7469690078fa70e031b80f8760f3c69f0884e42d08mukesh agrawalTEST_F(MessageBufferTest, AppendMaximalAfterFillAndClearSucceeds) {
7569690078fa70e031b80f8760f3c69f0884e42d08mukesh agrawal  ASSERT_TRUE(buffer_.Append(kLargestMessage.data(), kLargestMessage.size()));
7669690078fa70e031b80f8760f3c69f0884e42d08mukesh agrawal  ASSERT_FALSE(buffer_.CanFitNow(1));
7769690078fa70e031b80f8760f3c69f0884e42d08mukesh agrawal
7869690078fa70e031b80f8760f3c69f0884e42d08mukesh agrawal  buffer_.Clear();
7969690078fa70e031b80f8760f3c69f0884e42d08mukesh agrawal  EXPECT_TRUE(buffer_.Append(kLargestMessage.data(), kLargestMessage.size()));
8069690078fa70e031b80f8760f3c69f0884e42d08mukesh agrawal}
8169690078fa70e031b80f8760f3c69f0884e42d08mukesh agrawal
82fd65102c2bb8b5a4cfa7d9ddff7d5f6c5d08e623mukesh agrawalTEST_F(MessageBufferTest, AppendUnalignedMessagesDoesNotCrash) {
83fd65102c2bb8b5a4cfa7d9ddff7d5f6c5d08e623mukesh agrawal  // Odd-length messages should trigger alignment problems, if any such
84fd65102c2bb8b5a4cfa7d9ddff7d5f6c5d08e623mukesh agrawal  // problems exist. We'll need more than one, though, since the first header
85fd65102c2bb8b5a4cfa7d9ddff7d5f6c5d08e623mukesh agrawal  // might be aligned by default.
86fd65102c2bb8b5a4cfa7d9ddff7d5f6c5d08e623mukesh agrawal  constexpr std::array<uint8_t, 1> message{};
87fd65102c2bb8b5a4cfa7d9ddff7d5f6c5d08e623mukesh agrawal  while (buffer_.CanFitNow(message.size())) {
88fd65102c2bb8b5a4cfa7d9ddff7d5f6c5d08e623mukesh agrawal    ASSERT_TRUE(buffer_.Append(message.data(), message.size()));
89fd65102c2bb8b5a4cfa7d9ddff7d5f6c5d08e623mukesh agrawal  }
90fd65102c2bb8b5a4cfa7d9ddff7d5f6c5d08e623mukesh agrawal}
91fd65102c2bb8b5a4cfa7d9ddff7d5f6c5d08e623mukesh agrawal
92fd65102c2bb8b5a4cfa7d9ddff7d5f6c5d08e623mukesh agrawalTEST_F(MessageBufferTest, AppendLargerThanBufferFails) {
93fd65102c2bb8b5a4cfa7d9ddff7d5f6c5d08e623mukesh agrawal  constexpr std::array<uint8_t, kBufferSizeBytes + 1> oversized_message{};
94fd65102c2bb8b5a4cfa7d9ddff7d5f6c5d08e623mukesh agrawal  EXPECT_FALSE(
95fd65102c2bb8b5a4cfa7d9ddff7d5f6c5d08e623mukesh agrawal      buffer_.Append(oversized_message.data(), oversized_message.size()));
96fd65102c2bb8b5a4cfa7d9ddff7d5f6c5d08e623mukesh agrawal}
97fd65102c2bb8b5a4cfa7d9ddff7d5f6c5d08e623mukesh agrawal
98fd65102c2bb8b5a4cfa7d9ddff7d5f6c5d08e623mukesh agrawalTEST_F(MessageBufferTest, AppendLargerThanFreeSpaceFails) {
99fd65102c2bb8b5a4cfa7d9ddff7d5f6c5d08e623mukesh agrawal  constexpr size_t expected_free = kBufferSizeBytes - kHeaderSizeBytes;
100fd65102c2bb8b5a4cfa7d9ddff7d5f6c5d08e623mukesh agrawal  ASSERT_FALSE(buffer_.CanFitNow(expected_free + 1));
101fd65102c2bb8b5a4cfa7d9ddff7d5f6c5d08e623mukesh agrawal
102fd65102c2bb8b5a4cfa7d9ddff7d5f6c5d08e623mukesh agrawal  constexpr std::array<uint8_t, expected_free + 1> oversized_message{};
103fd65102c2bb8b5a4cfa7d9ddff7d5f6c5d08e623mukesh agrawal  EXPECT_FALSE(
104fd65102c2bb8b5a4cfa7d9ddff7d5f6c5d08e623mukesh agrawal      buffer_.Append(oversized_message.data(), oversized_message.size()));
105fd65102c2bb8b5a4cfa7d9ddff7d5f6c5d08e623mukesh agrawal}
106fd65102c2bb8b5a4cfa7d9ddff7d5f6c5d08e623mukesh agrawal
107fd65102c2bb8b5a4cfa7d9ddff7d5f6c5d08e623mukesh agrawalTEST_F(MessageBufferTest, AppendMultipleMessagesToFillBufferDoesNotCrash) {
1086d8e2206e972a5f7512d5e2c558e9c23c77169f0mukesh agrawal  FillBufferWithMultipleMessages();
109fd65102c2bb8b5a4cfa7d9ddff7d5f6c5d08e623mukesh agrawal}
110fd65102c2bb8b5a4cfa7d9ddff7d5f6c5d08e623mukesh agrawal
111fd65102c2bb8b5a4cfa7d9ddff7d5f6c5d08e623mukesh agrawalTEST_F(MessageBufferTest, CanFitNowIsCorrectOnFreshBuffer) {
112fd65102c2bb8b5a4cfa7d9ddff7d5f6c5d08e623mukesh agrawal  EXPECT_TRUE(buffer_.CanFitNow(kLargestMessage.size()));
113fd65102c2bb8b5a4cfa7d9ddff7d5f6c5d08e623mukesh agrawal  EXPECT_FALSE(buffer_.CanFitNow(kLargestMessage.size() + 1));
114fd65102c2bb8b5a4cfa7d9ddff7d5f6c5d08e623mukesh agrawal}
115fd65102c2bb8b5a4cfa7d9ddff7d5f6c5d08e623mukesh agrawal
116fd65102c2bb8b5a4cfa7d9ddff7d5f6c5d08e623mukesh agrawalTEST_F(MessageBufferTest, CanFitNowIsCorrectAfterSmallWrite) {
117fd65102c2bb8b5a4cfa7d9ddff7d5f6c5d08e623mukesh agrawal  ASSERT_TRUE(buffer_.Append(kSmallestMessage.data(), kSmallestMessage.size()));
118fd65102c2bb8b5a4cfa7d9ddff7d5f6c5d08e623mukesh agrawal
119fd65102c2bb8b5a4cfa7d9ddff7d5f6c5d08e623mukesh agrawal  constexpr size_t expected_free =
120fd65102c2bb8b5a4cfa7d9ddff7d5f6c5d08e623mukesh agrawal      kBufferSizeBytes - (kSmallestMessage.size() + kHeaderSizeBytes) -
121fd65102c2bb8b5a4cfa7d9ddff7d5f6c5d08e623mukesh agrawal      kHeaderSizeBytes;
122fd65102c2bb8b5a4cfa7d9ddff7d5f6c5d08e623mukesh agrawal  EXPECT_TRUE(buffer_.CanFitNow(expected_free));
123fd65102c2bb8b5a4cfa7d9ddff7d5f6c5d08e623mukesh agrawal  EXPECT_FALSE(buffer_.CanFitNow(expected_free + 1));
124fd65102c2bb8b5a4cfa7d9ddff7d5f6c5d08e623mukesh agrawal}
125fd65102c2bb8b5a4cfa7d9ddff7d5f6c5d08e623mukesh agrawal
126fd65102c2bb8b5a4cfa7d9ddff7d5f6c5d08e623mukesh agrawalTEST_F(MessageBufferTest, CanFitNowIsCorrectOnFullBuffer) {
127fd65102c2bb8b5a4cfa7d9ddff7d5f6c5d08e623mukesh agrawal  ASSERT_TRUE(buffer_.Append(kLargestMessage.data(), kLargestMessage.size()));
128fd65102c2bb8b5a4cfa7d9ddff7d5f6c5d08e623mukesh agrawal  EXPECT_FALSE(buffer_.CanFitNow(1));
129fd65102c2bb8b5a4cfa7d9ddff7d5f6c5d08e623mukesh agrawal}
130fd65102c2bb8b5a4cfa7d9ddff7d5f6c5d08e623mukesh agrawal
1315f88ee735e1cf0c12f96c3add65d798ec58ad4bdmukesh agrawalTEST_F(MessageBufferTest, CanFitNowIsCorrectOnRewoundBuffer) {
1325f88ee735e1cf0c12f96c3add65d798ec58ad4bdmukesh agrawal  ASSERT_TRUE(buffer_.Append(kLargestMessage.data(), kLargestMessage.size()));
1335f88ee735e1cf0c12f96c3add65d798ec58ad4bdmukesh agrawal  buffer_.Rewind();
1345f88ee735e1cf0c12f96c3add65d798ec58ad4bdmukesh agrawal  EXPECT_FALSE(buffer_.CanFitNow(1));
1355f88ee735e1cf0c12f96c3add65d798ec58ad4bdmukesh agrawal}
1365f88ee735e1cf0c12f96c3add65d798ec58ad4bdmukesh agrawal
13769690078fa70e031b80f8760f3c69f0884e42d08mukesh agrawalTEST_F(MessageBufferTest, CanFitNowIsCorrectAfterClear) {
13869690078fa70e031b80f8760f3c69f0884e42d08mukesh agrawal  ASSERT_TRUE(buffer_.Append(kLargestMessage.data(), kLargestMessage.size()));
13969690078fa70e031b80f8760f3c69f0884e42d08mukesh agrawal  ASSERT_FALSE(buffer_.CanFitNow(1));
14069690078fa70e031b80f8760f3c69f0884e42d08mukesh agrawal
14169690078fa70e031b80f8760f3c69f0884e42d08mukesh agrawal  buffer_.Clear();
14269690078fa70e031b80f8760f3c69f0884e42d08mukesh agrawal  EXPECT_TRUE(buffer_.CanFitNow(kLargestMessage.size()));
14369690078fa70e031b80f8760f3c69f0884e42d08mukesh agrawal}
14469690078fa70e031b80f8760f3c69f0884e42d08mukesh agrawal
1450e465b480b9067a9795139a0aa1f4144d10c485emukesh agrawalTEST_F(MessageBufferTest, CanFitEverIsCorrectOnFreshBuffer) {
1460e465b480b9067a9795139a0aa1f4144d10c485emukesh agrawal  EXPECT_TRUE(buffer_.CanFitEver(kLargestMessage.size()));
1470e465b480b9067a9795139a0aa1f4144d10c485emukesh agrawal  EXPECT_FALSE(buffer_.CanFitEver(kLargestMessage.size() + 1));
1480e465b480b9067a9795139a0aa1f4144d10c485emukesh agrawal}
1490e465b480b9067a9795139a0aa1f4144d10c485emukesh agrawal
1500e465b480b9067a9795139a0aa1f4144d10c485emukesh agrawalTEST_F(MessageBufferTest, CanFitEverIsCorrectAfterSmallWrite) {
1510e465b480b9067a9795139a0aa1f4144d10c485emukesh agrawal  ASSERT_TRUE(buffer_.Append(kSmallestMessage.data(), kSmallestMessage.size()));
1520e465b480b9067a9795139a0aa1f4144d10c485emukesh agrawal  EXPECT_TRUE(buffer_.CanFitEver(kLargestMessage.size()));
1530e465b480b9067a9795139a0aa1f4144d10c485emukesh agrawal  EXPECT_FALSE(buffer_.CanFitEver(kLargestMessage.size() + 1));
1540e465b480b9067a9795139a0aa1f4144d10c485emukesh agrawal}
1550e465b480b9067a9795139a0aa1f4144d10c485emukesh agrawal
1560e465b480b9067a9795139a0aa1f4144d10c485emukesh agrawalTEST_F(MessageBufferTest, CanFitEverIsCorrectOnFullBuffer) {
1570e465b480b9067a9795139a0aa1f4144d10c485emukesh agrawal  ASSERT_TRUE(buffer_.Append(kLargestMessage.data(), kLargestMessage.size()));
1580e465b480b9067a9795139a0aa1f4144d10c485emukesh agrawal  EXPECT_TRUE(buffer_.CanFitEver(kLargestMessage.size()));
1590e465b480b9067a9795139a0aa1f4144d10c485emukesh agrawal  EXPECT_FALSE(buffer_.CanFitEver(kLargestMessage.size() + 1));
1600e465b480b9067a9795139a0aa1f4144d10c485emukesh agrawal}
1610e465b480b9067a9795139a0aa1f4144d10c485emukesh agrawal
1620e465b480b9067a9795139a0aa1f4144d10c485emukesh agrawalTEST_F(MessageBufferTest, CanFitEverIsCorrectAfterRewind) {
1630e465b480b9067a9795139a0aa1f4144d10c485emukesh agrawal  ASSERT_TRUE(buffer_.Append(kLargestMessage.data(), kLargestMessage.size()));
1640e465b480b9067a9795139a0aa1f4144d10c485emukesh agrawal  buffer_.Rewind();
1650e465b480b9067a9795139a0aa1f4144d10c485emukesh agrawal  EXPECT_TRUE(buffer_.CanFitEver(kLargestMessage.size()));
1660e465b480b9067a9795139a0aa1f4144d10c485emukesh agrawal  EXPECT_FALSE(buffer_.CanFitEver(kLargestMessage.size() + 1));
1670e465b480b9067a9795139a0aa1f4144d10c485emukesh agrawal}
1680e465b480b9067a9795139a0aa1f4144d10c485emukesh agrawal
1690e465b480b9067a9795139a0aa1f4144d10c485emukesh agrawalTEST_F(MessageBufferTest, CanFitEverIsCorrectAfterClear) {
1700e465b480b9067a9795139a0aa1f4144d10c485emukesh agrawal  ASSERT_TRUE(buffer_.Append(kLargestMessage.data(), kLargestMessage.size()));
1710e465b480b9067a9795139a0aa1f4144d10c485emukesh agrawal  buffer_.Clear();
1720e465b480b9067a9795139a0aa1f4144d10c485emukesh agrawal  EXPECT_TRUE(buffer_.CanFitEver(kLargestMessage.size()));
1730e465b480b9067a9795139a0aa1f4144d10c485emukesh agrawal  EXPECT_FALSE(buffer_.CanFitEver(kLargestMessage.size() + 1));
1740e465b480b9067a9795139a0aa1f4144d10c485emukesh agrawal}
1750e465b480b9067a9795139a0aa1f4144d10c485emukesh agrawal
1766d8e2206e972a5f7512d5e2c558e9c23c77169f0mukesh agrawalTEST_F(MessageBufferTest, ConsumeNextMessageReturnsNullOnFreshBuffer) {
1776d8e2206e972a5f7512d5e2c558e9c23c77169f0mukesh agrawal  const std::tuple<const uint8_t*, size_t> expected{nullptr, 0};
1786d8e2206e972a5f7512d5e2c558e9c23c77169f0mukesh agrawal  EXPECT_EQ(expected, buffer_.ConsumeNextMessage());
1796d8e2206e972a5f7512d5e2c558e9c23c77169f0mukesh agrawal}
1806d8e2206e972a5f7512d5e2c558e9c23c77169f0mukesh agrawal
18169690078fa70e031b80f8760f3c69f0884e42d08mukesh agrawalTEST_F(MessageBufferTest, ConsumeNextMessageReturnsNullAfterFillAndClear) {
18269690078fa70e031b80f8760f3c69f0884e42d08mukesh agrawal  ASSERT_TRUE(buffer_.Append(kLargestMessage.data(), kLargestMessage.size()));
18369690078fa70e031b80f8760f3c69f0884e42d08mukesh agrawal  buffer_.Clear();
18469690078fa70e031b80f8760f3c69f0884e42d08mukesh agrawal
18569690078fa70e031b80f8760f3c69f0884e42d08mukesh agrawal  const std::tuple<const uint8_t*, size_t> expected{nullptr, 0};
18669690078fa70e031b80f8760f3c69f0884e42d08mukesh agrawal  EXPECT_EQ(expected, buffer_.ConsumeNextMessage());
18769690078fa70e031b80f8760f3c69f0884e42d08mukesh agrawal}
18869690078fa70e031b80f8760f3c69f0884e42d08mukesh agrawal
1896d8e2206e972a5f7512d5e2c558e9c23c77169f0mukesh agrawalTEST_F(MessageBufferTest, ConsumeNextMessageCanReadMinimalMessage) {
1906d8e2206e972a5f7512d5e2c558e9c23c77169f0mukesh agrawal  ASSERT_TRUE(buffer_.Append(kSmallestMessage.data(), kSmallestMessage.size()));
1916d8e2206e972a5f7512d5e2c558e9c23c77169f0mukesh agrawal
1926d8e2206e972a5f7512d5e2c558e9c23c77169f0mukesh agrawal  const auto& ptr_and_size = buffer_.ConsumeNextMessage();
1936d8e2206e972a5f7512d5e2c558e9c23c77169f0mukesh agrawal  EXPECT_NE(nullptr, std::get<0>(ptr_and_size));
1946d8e2206e972a5f7512d5e2c558e9c23c77169f0mukesh agrawal  EXPECT_EQ(kSmallestMessage.size(), std::get<1>(ptr_and_size));
1956d8e2206e972a5f7512d5e2c558e9c23c77169f0mukesh agrawal}
1966d8e2206e972a5f7512d5e2c558e9c23c77169f0mukesh agrawal
1976d8e2206e972a5f7512d5e2c558e9c23c77169f0mukesh agrawalTEST_F(MessageBufferTest, ConsumeNextMessageCanReadMaximalMessage) {
1986d8e2206e972a5f7512d5e2c558e9c23c77169f0mukesh agrawal  ASSERT_TRUE(buffer_.Append(kLargestMessage.data(), kLargestMessage.size()));
1996d8e2206e972a5f7512d5e2c558e9c23c77169f0mukesh agrawal
2006d8e2206e972a5f7512d5e2c558e9c23c77169f0mukesh agrawal  const auto& ptr_and_size = buffer_.ConsumeNextMessage();
2016d8e2206e972a5f7512d5e2c558e9c23c77169f0mukesh agrawal  EXPECT_NE(nullptr, std::get<0>(ptr_and_size));
2026d8e2206e972a5f7512d5e2c558e9c23c77169f0mukesh agrawal  EXPECT_EQ(kLargestMessage.size(), std::get<1>(ptr_and_size));
2036d8e2206e972a5f7512d5e2c558e9c23c77169f0mukesh agrawal}
2046d8e2206e972a5f7512d5e2c558e9c23c77169f0mukesh agrawal
2056d8e2206e972a5f7512d5e2c558e9c23c77169f0mukesh agrawalTEST_F(MessageBufferTest,
2066d8e2206e972a5f7512d5e2c558e9c23c77169f0mukesh agrawal       ConsumeNextMessageReturnsNullAfterMinimalMessageIsConsumed) {
2076d8e2206e972a5f7512d5e2c558e9c23c77169f0mukesh agrawal  ASSERT_TRUE(buffer_.Append(kSmallestMessage.data(), kSmallestMessage.size()));
2086d8e2206e972a5f7512d5e2c558e9c23c77169f0mukesh agrawal  buffer_.ConsumeNextMessage();
2096d8e2206e972a5f7512d5e2c558e9c23c77169f0mukesh agrawal
2106d8e2206e972a5f7512d5e2c558e9c23c77169f0mukesh agrawal  constexpr std::tuple<const uint8_t*, size_t> expected{nullptr, 0};
2116d8e2206e972a5f7512d5e2c558e9c23c77169f0mukesh agrawal  EXPECT_EQ(expected, buffer_.ConsumeNextMessage());
2126d8e2206e972a5f7512d5e2c558e9c23c77169f0mukesh agrawal}
2136d8e2206e972a5f7512d5e2c558e9c23c77169f0mukesh agrawal
2146d8e2206e972a5f7512d5e2c558e9c23c77169f0mukesh agrawalTEST_F(MessageBufferTest,
2156d8e2206e972a5f7512d5e2c558e9c23c77169f0mukesh agrawal       ConsumeNextMessageReturnsNullAfterMaximalMessageIsConsumed) {
2166d8e2206e972a5f7512d5e2c558e9c23c77169f0mukesh agrawal  ASSERT_TRUE(buffer_.Append(kLargestMessage.data(), kLargestMessage.size()));
2176d8e2206e972a5f7512d5e2c558e9c23c77169f0mukesh agrawal  buffer_.ConsumeNextMessage();
2186d8e2206e972a5f7512d5e2c558e9c23c77169f0mukesh agrawal
2196d8e2206e972a5f7512d5e2c558e9c23c77169f0mukesh agrawal  constexpr std::tuple<const uint8_t*, size_t> expected{nullptr, 0};
2206d8e2206e972a5f7512d5e2c558e9c23c77169f0mukesh agrawal  EXPECT_EQ(expected, buffer_.ConsumeNextMessage());
2216d8e2206e972a5f7512d5e2c558e9c23c77169f0mukesh agrawal}
2226d8e2206e972a5f7512d5e2c558e9c23c77169f0mukesh agrawal
2236d8e2206e972a5f7512d5e2c558e9c23c77169f0mukesh agrawalTEST_F(MessageBufferTest,
2246d8e2206e972a5f7512d5e2c558e9c23c77169f0mukesh agrawal       ConsumeNextMessageCanRetreiveAllMessagesFromFullBuffer) {
2256d8e2206e972a5f7512d5e2c558e9c23c77169f0mukesh agrawal  const size_t n_written = FillBufferWithMultipleMessages();
2266d8e2206e972a5f7512d5e2c558e9c23c77169f0mukesh agrawal  size_t n_read = 0;
2276d8e2206e972a5f7512d5e2c558e9c23c77169f0mukesh agrawal  while (std::get<0>(buffer_.ConsumeNextMessage())) {
2286d8e2206e972a5f7512d5e2c558e9c23c77169f0mukesh agrawal    ++n_read;
2296d8e2206e972a5f7512d5e2c558e9c23c77169f0mukesh agrawal  }
2306d8e2206e972a5f7512d5e2c558e9c23c77169f0mukesh agrawal  EXPECT_EQ(n_written, n_read);
2316d8e2206e972a5f7512d5e2c558e9c23c77169f0mukesh agrawal
2326d8e2206e972a5f7512d5e2c558e9c23c77169f0mukesh agrawal  constexpr std::tuple<const uint8_t*, size_t> expected{nullptr, 0};
2336d8e2206e972a5f7512d5e2c558e9c23c77169f0mukesh agrawal  EXPECT_EQ(expected, buffer_.ConsumeNextMessage());
2346d8e2206e972a5f7512d5e2c558e9c23c77169f0mukesh agrawal}
2356d8e2206e972a5f7512d5e2c558e9c23c77169f0mukesh agrawal
2366d8e2206e972a5f7512d5e2c558e9c23c77169f0mukesh agrawalTEST_F(MessageBufferTest,
2375f88ee735e1cf0c12f96c3add65d798ec58ad4bdmukesh agrawal       ConsumeNextMessageCanRetreiveAllMessagesFromRewoundBuffer) {
2385f88ee735e1cf0c12f96c3add65d798ec58ad4bdmukesh agrawal  const size_t n_written = FillBufferWithMultipleMessages();
2395f88ee735e1cf0c12f96c3add65d798ec58ad4bdmukesh agrawal  while (std::get<0>(buffer_.ConsumeNextMessage())) {
2405f88ee735e1cf0c12f96c3add65d798ec58ad4bdmukesh agrawal    // Silently consume message
2415f88ee735e1cf0c12f96c3add65d798ec58ad4bdmukesh agrawal  }
2425f88ee735e1cf0c12f96c3add65d798ec58ad4bdmukesh agrawal  buffer_.Rewind();
2435f88ee735e1cf0c12f96c3add65d798ec58ad4bdmukesh agrawal
2445f88ee735e1cf0c12f96c3add65d798ec58ad4bdmukesh agrawal  size_t n_read = 0;
2455f88ee735e1cf0c12f96c3add65d798ec58ad4bdmukesh agrawal  while (std::get<0>(buffer_.ConsumeNextMessage())) {
2465f88ee735e1cf0c12f96c3add65d798ec58ad4bdmukesh agrawal    ++n_read;
2475f88ee735e1cf0c12f96c3add65d798ec58ad4bdmukesh agrawal  }
2485f88ee735e1cf0c12f96c3add65d798ec58ad4bdmukesh agrawal  EXPECT_EQ(n_written, n_read);
2495f88ee735e1cf0c12f96c3add65d798ec58ad4bdmukesh agrawal}
2505f88ee735e1cf0c12f96c3add65d798ec58ad4bdmukesh agrawal
2515f88ee735e1cf0c12f96c3add65d798ec58ad4bdmukesh agrawalTEST_F(MessageBufferTest,
2526d8e2206e972a5f7512d5e2c558e9c23c77169f0mukesh agrawal       ConsumeNextMessageCanRetreiveMultipleUnaliagnedMessages) {
2536d8e2206e972a5f7512d5e2c558e9c23c77169f0mukesh agrawal  // As in AppendUnalignedMessagesDoesNotCrash, odd-length messages should
2546d8e2206e972a5f7512d5e2c558e9c23c77169f0mukesh agrawal  // trigger alignment problems, if any such problems exist.
2556d8e2206e972a5f7512d5e2c558e9c23c77169f0mukesh agrawal  const std::array<uint8_t, 1> message{};
2566d8e2206e972a5f7512d5e2c558e9c23c77169f0mukesh agrawal  size_t n_written = 0;
2576d8e2206e972a5f7512d5e2c558e9c23c77169f0mukesh agrawal  while (buffer_.CanFitNow(message.size())) {
2586d8e2206e972a5f7512d5e2c558e9c23c77169f0mukesh agrawal    ASSERT_TRUE(buffer_.Append(message.data(), message.size()));
2596d8e2206e972a5f7512d5e2c558e9c23c77169f0mukesh agrawal    ++n_written;
2606d8e2206e972a5f7512d5e2c558e9c23c77169f0mukesh agrawal  }
2616d8e2206e972a5f7512d5e2c558e9c23c77169f0mukesh agrawal
2626d8e2206e972a5f7512d5e2c558e9c23c77169f0mukesh agrawal  size_t n_read = 0;
2636d8e2206e972a5f7512d5e2c558e9c23c77169f0mukesh agrawal  while (std::get<0>(buffer_.ConsumeNextMessage())) {
2646d8e2206e972a5f7512d5e2c558e9c23c77169f0mukesh agrawal    ++n_read;
2656d8e2206e972a5f7512d5e2c558e9c23c77169f0mukesh agrawal  }
2666d8e2206e972a5f7512d5e2c558e9c23c77169f0mukesh agrawal  EXPECT_EQ(n_written, n_read);
2676d8e2206e972a5f7512d5e2c558e9c23c77169f0mukesh agrawal}
2686d8e2206e972a5f7512d5e2c558e9c23c77169f0mukesh agrawal
2696d8e2206e972a5f7512d5e2c558e9c23c77169f0mukesh agrawalTEST_F(MessageBufferTest, ConsumeNextMessageReturnsOurMessages) {
2706d8e2206e972a5f7512d5e2c558e9c23c77169f0mukesh agrawal  const std::vector<uint8_t> message1{{'h', 'e', 'l', 'l', 'o'}};
2716d8e2206e972a5f7512d5e2c558e9c23c77169f0mukesh agrawal  const std::vector<uint8_t> message2{{'w', 'o', 'r', 'l', 'd'}};
2726d8e2206e972a5f7512d5e2c558e9c23c77169f0mukesh agrawal  ASSERT_TRUE(
2736d8e2206e972a5f7512d5e2c558e9c23c77169f0mukesh agrawal      buffer_.Append(message1.data(), static_cast<uint16_t>(message1.size())));
2746d8e2206e972a5f7512d5e2c558e9c23c77169f0mukesh agrawal  ASSERT_TRUE(
2756d8e2206e972a5f7512d5e2c558e9c23c77169f0mukesh agrawal      buffer_.Append(message2.data(), static_cast<uint16_t>(message2.size())));
2766d8e2206e972a5f7512d5e2c558e9c23c77169f0mukesh agrawal  EXPECT_EQ(message1, GetNextMessageAsByteVector());
2776d8e2206e972a5f7512d5e2c558e9c23c77169f0mukesh agrawal  EXPECT_EQ(message2, GetNextMessageAsByteVector());
2786d8e2206e972a5f7512d5e2c558e9c23c77169f0mukesh agrawal}
2796d8e2206e972a5f7512d5e2c558e9c23c77169f0mukesh agrawal
2802a71027464f6cec8a23e66a1310581a75aba34b3mukesh agrawalTEST_F(MessageBufferTest, GetFreeSizeIsCorrectOnFreshBuffer) {
2812a71027464f6cec8a23e66a1310581a75aba34b3mukesh agrawal  EXPECT_EQ(kBufferSizeBytes, buffer_.GetFreeSize());
2822a71027464f6cec8a23e66a1310581a75aba34b3mukesh agrawal}
2832a71027464f6cec8a23e66a1310581a75aba34b3mukesh agrawal
2842a71027464f6cec8a23e66a1310581a75aba34b3mukesh agrawalTEST_F(MessageBufferTest, GetFreeSizeIsCorrectAfterSmallWrite) {
2852a71027464f6cec8a23e66a1310581a75aba34b3mukesh agrawal  ASSERT_TRUE(buffer_.Append(kSmallestMessage.data(), kSmallestMessage.size()));
2862a71027464f6cec8a23e66a1310581a75aba34b3mukesh agrawal  EXPECT_EQ(kBufferSizeBytes - kHeaderSizeBytes - kSmallestMessage.size(),
2872a71027464f6cec8a23e66a1310581a75aba34b3mukesh agrawal            buffer_.GetFreeSize());
2882a71027464f6cec8a23e66a1310581a75aba34b3mukesh agrawal}
2892a71027464f6cec8a23e66a1310581a75aba34b3mukesh agrawal
2902a71027464f6cec8a23e66a1310581a75aba34b3mukesh agrawalTEST_F(MessageBufferTest, GetFreeSizeIsCorrectOnFullBuffer) {
2912a71027464f6cec8a23e66a1310581a75aba34b3mukesh agrawal  ASSERT_TRUE(buffer_.Append(kLargestMessage.data(), kLargestMessage.size()));
2922a71027464f6cec8a23e66a1310581a75aba34b3mukesh agrawal  EXPECT_EQ(0U, buffer_.GetFreeSize());
2932a71027464f6cec8a23e66a1310581a75aba34b3mukesh agrawal}
2942a71027464f6cec8a23e66a1310581a75aba34b3mukesh agrawal
2952a71027464f6cec8a23e66a1310581a75aba34b3mukesh agrawalTEST_F(MessageBufferTest, GetFreeSizeIsCorrectAfterRewindOfFullBuffer) {
2962a71027464f6cec8a23e66a1310581a75aba34b3mukesh agrawal  ASSERT_TRUE(buffer_.Append(kLargestMessage.data(), kLargestMessage.size()));
2972a71027464f6cec8a23e66a1310581a75aba34b3mukesh agrawal  buffer_.Rewind();
2982a71027464f6cec8a23e66a1310581a75aba34b3mukesh agrawal  EXPECT_EQ(0U, buffer_.GetFreeSize());
2992a71027464f6cec8a23e66a1310581a75aba34b3mukesh agrawal}
3002a71027464f6cec8a23e66a1310581a75aba34b3mukesh agrawal
3012a71027464f6cec8a23e66a1310581a75aba34b3mukesh agrawalTEST_F(MessageBufferTest, GetFreeSizeIsCorrectAfterClear) {
3022a71027464f6cec8a23e66a1310581a75aba34b3mukesh agrawal  ASSERT_TRUE(buffer_.Append(kLargestMessage.data(), kLargestMessage.size()));
3032a71027464f6cec8a23e66a1310581a75aba34b3mukesh agrawal  buffer_.Clear();
3042a71027464f6cec8a23e66a1310581a75aba34b3mukesh agrawal  EXPECT_EQ(kBufferSizeBytes, buffer_.GetFreeSize());
3052a71027464f6cec8a23e66a1310581a75aba34b3mukesh agrawal}
3062a71027464f6cec8a23e66a1310581a75aba34b3mukesh agrawal
3075f88ee735e1cf0c12f96c3add65d798ec58ad4bdmukesh agrawalTEST_F(MessageBufferTest, RewindDoesNotAffectWritePointer) {
3085f88ee735e1cf0c12f96c3add65d798ec58ad4bdmukesh agrawal  const std::vector<uint8_t> message1{{'h', 'e', 'l', 'l', 'o'}};
3095f88ee735e1cf0c12f96c3add65d798ec58ad4bdmukesh agrawal  ASSERT_TRUE(
3105f88ee735e1cf0c12f96c3add65d798ec58ad4bdmukesh agrawal      buffer_.Append(message1.data(), static_cast<uint16_t>(message1.size())));
3115f88ee735e1cf0c12f96c3add65d798ec58ad4bdmukesh agrawal  buffer_.Rewind();
3125f88ee735e1cf0c12f96c3add65d798ec58ad4bdmukesh agrawal
3135f88ee735e1cf0c12f96c3add65d798ec58ad4bdmukesh agrawal  const std::vector<uint8_t> message2{{'w', 'o', 'r', 'l', 'd'}};
3145f88ee735e1cf0c12f96c3add65d798ec58ad4bdmukesh agrawal  ASSERT_TRUE(
3155f88ee735e1cf0c12f96c3add65d798ec58ad4bdmukesh agrawal      buffer_.Append(message2.data(), static_cast<uint16_t>(message2.size())));
3165f88ee735e1cf0c12f96c3add65d798ec58ad4bdmukesh agrawal
3175f88ee735e1cf0c12f96c3add65d798ec58ad4bdmukesh agrawal  EXPECT_EQ(message1, GetNextMessageAsByteVector());
3185f88ee735e1cf0c12f96c3add65d798ec58ad4bdmukesh agrawal  EXPECT_EQ(message2, GetNextMessageAsByteVector());
3195f88ee735e1cf0c12f96c3add65d798ec58ad4bdmukesh agrawal}
3205f88ee735e1cf0c12f96c3add65d798ec58ad4bdmukesh agrawal
3219d2165f7a9c41bb0081036d4ef5b9d5150fa3684mukesh agrawal// Per
3227e979c369670feea99b9aff42bc366a903cf7049mukesh agrawal// github.com/google/googletest/blob/master/googletest/docs/AdvancedGuide.md#death-tests,
3239d2165f7a9c41bb0081036d4ef5b9d5150fa3684mukesh agrawal// death tests should be specially named.
3249d2165f7a9c41bb0081036d4ef5b9d5150fa3684mukesh agrawalusing MessageBufferDeathTest = MessageBufferTest;
3259d2165f7a9c41bb0081036d4ef5b9d5150fa3684mukesh agrawal
326fd65102c2bb8b5a4cfa7d9ddff7d5f6c5d08e623mukesh agrawalTEST_F(MessageBufferDeathTest, AppendZeroBytesCausesDeath) {
327fd65102c2bb8b5a4cfa7d9ddff7d5f6c5d08e623mukesh agrawal  constexpr std::array<uint8_t, 1> message{};
328fd65102c2bb8b5a4cfa7d9ddff7d5f6c5d08e623mukesh agrawal  EXPECT_DEATH(buffer_.Append(message.data(), 0), "Check failed");
329fd65102c2bb8b5a4cfa7d9ddff7d5f6c5d08e623mukesh agrawal}
330fd65102c2bb8b5a4cfa7d9ddff7d5f6c5d08e623mukesh agrawal
3319d2165f7a9c41bb0081036d4ef5b9d5150fa3684mukesh agrawalTEST_F(MessageBufferDeathTest, ConstructionOfUselesslySmallBufferCausesDeath) {
3329d2165f7a9c41bb0081036d4ef5b9d5150fa3684mukesh agrawal  EXPECT_DEATH(MessageBuffer{kHeaderSizeBytes}, "Check failed");
3339d2165f7a9c41bb0081036d4ef5b9d5150fa3684mukesh agrawal}
3349d2165f7a9c41bb0081036d4ef5b9d5150fa3684mukesh agrawal
3359d2165f7a9c41bb0081036d4ef5b9d5150fa3684mukesh agrawal}  // namespace wifilogd
3369d2165f7a9c41bb0081036d4ef5b9d5150fa3684mukesh agrawal}  // namespace android
337