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