13d8db0877bb66bfea17e37e12a586b4b29440963mukesh agrawal/*
23d8db0877bb66bfea17e37e12a586b4b29440963mukesh agrawal * Copyright (C) 2016, The Android Open Source Project
33d8db0877bb66bfea17e37e12a586b4b29440963mukesh agrawal *
43d8db0877bb66bfea17e37e12a586b4b29440963mukesh agrawal * Licensed under the Apache License, Version 2.0 (the "License");
53d8db0877bb66bfea17e37e12a586b4b29440963mukesh agrawal * you may not use this file except in compliance with the License.
63d8db0877bb66bfea17e37e12a586b4b29440963mukesh agrawal * You may obtain a copy of the License at
73d8db0877bb66bfea17e37e12a586b4b29440963mukesh agrawal *
83d8db0877bb66bfea17e37e12a586b4b29440963mukesh agrawal *     http://www.apache.org/licenses/LICENSE-2.0
93d8db0877bb66bfea17e37e12a586b4b29440963mukesh agrawal *
103d8db0877bb66bfea17e37e12a586b4b29440963mukesh agrawal * Unless required by applicable law or agreed to in writing, software
113d8db0877bb66bfea17e37e12a586b4b29440963mukesh agrawal * distributed under the License is distributed on an "AS IS" BASIS,
123d8db0877bb66bfea17e37e12a586b4b29440963mukesh agrawal * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
133d8db0877bb66bfea17e37e12a586b4b29440963mukesh agrawal * See the License for the specific language governing permissions and
143d8db0877bb66bfea17e37e12a586b4b29440963mukesh agrawal * limitations under the License.
153d8db0877bb66bfea17e37e12a586b4b29440963mukesh agrawal */
163d8db0877bb66bfea17e37e12a586b4b29440963mukesh agrawal
173d8db0877bb66bfea17e37e12a586b4b29440963mukesh agrawal#include <array>
183d8db0877bb66bfea17e37e12a586b4b29440963mukesh agrawal#include <cstring>
193d8db0877bb66bfea17e37e12a586b4b29440963mukesh agrawal#include <string>
203d8db0877bb66bfea17e37e12a586b4b29440963mukesh agrawal
213d8db0877bb66bfea17e37e12a586b4b29440963mukesh agrawal#include "gtest/gtest.h"
223d8db0877bb66bfea17e37e12a586b4b29440963mukesh agrawal
233d8db0877bb66bfea17e37e12a586b4b29440963mukesh agrawal#include "wifilogd/byte_buffer.h"
243d8db0877bb66bfea17e37e12a586b4b29440963mukesh agrawal
253d8db0877bb66bfea17e37e12a586b4b29440963mukesh agrawalnamespace android {
263d8db0877bb66bfea17e37e12a586b4b29440963mukesh agrawalnamespace wifilogd {
273d8db0877bb66bfea17e37e12a586b4b29440963mukesh agrawalnamespace {
283d8db0877bb66bfea17e37e12a586b4b29440963mukesh agrawal
293d8db0877bb66bfea17e37e12a586b4b29440963mukesh agrawalconstexpr size_t kBufferSizeBytes = 1024;
303d8db0877bb66bfea17e37e12a586b4b29440963mukesh agrawalconstexpr std::array<uint8_t, 1> kSmallestMessage{};
313d8db0877bb66bfea17e37e12a586b4b29440963mukesh agrawalconstexpr std::array<uint8_t, kBufferSizeBytes> kLargestMessage{};
323d8db0877bb66bfea17e37e12a586b4b29440963mukesh agrawal
333d8db0877bb66bfea17e37e12a586b4b29440963mukesh agrawalclass ByteBufferTest : public ::testing::Test {
343d8db0877bb66bfea17e37e12a586b4b29440963mukesh agrawal public:
353d8db0877bb66bfea17e37e12a586b4b29440963mukesh agrawal  ByteBufferTest() {}
363d8db0877bb66bfea17e37e12a586b4b29440963mukesh agrawal
373d8db0877bb66bfea17e37e12a586b4b29440963mukesh agrawal protected:
383d8db0877bb66bfea17e37e12a586b4b29440963mukesh agrawal  ByteBuffer<kBufferSizeBytes> buffer_;
393d8db0877bb66bfea17e37e12a586b4b29440963mukesh agrawal};
403d8db0877bb66bfea17e37e12a586b4b29440963mukesh agrawal
413d8db0877bb66bfea17e37e12a586b4b29440963mukesh agrawal}  // namespace
423d8db0877bb66bfea17e37e12a586b4b29440963mukesh agrawal
433d8db0877bb66bfea17e37e12a586b4b29440963mukesh agrawalTEST_F(ByteBufferTest, AppendMinimalOnEmptyBufferSucceeds) {
443d8db0877bb66bfea17e37e12a586b4b29440963mukesh agrawal  buffer_.AppendOrDie(kSmallestMessage.data(), kSmallestMessage.size());
453d8db0877bb66bfea17e37e12a586b4b29440963mukesh agrawal}
463d8db0877bb66bfea17e37e12a586b4b29440963mukesh agrawal
473d8db0877bb66bfea17e37e12a586b4b29440963mukesh agrawalTEST_F(ByteBufferTest, AppendMaximalOnEmptyBufferSucceeds) {
483d8db0877bb66bfea17e37e12a586b4b29440963mukesh agrawal  buffer_.AppendOrDie(kLargestMessage.data(), kLargestMessage.size());
493d8db0877bb66bfea17e37e12a586b4b29440963mukesh agrawal}
503d8db0877bb66bfea17e37e12a586b4b29440963mukesh agrawal
513d8db0877bb66bfea17e37e12a586b4b29440963mukesh agrawalTEST_F(ByteBufferTest, AppendStoresOurData) {
523d8db0877bb66bfea17e37e12a586b4b29440963mukesh agrawal  const std::string message1{"hello"};
533d8db0877bb66bfea17e37e12a586b4b29440963mukesh agrawal  const std::string message2{"world"};
543d8db0877bb66bfea17e37e12a586b4b29440963mukesh agrawal  buffer_.AppendOrDie(message1.data(), message1.size());
553d8db0877bb66bfea17e37e12a586b4b29440963mukesh agrawal  buffer_.AppendOrDie(message2.data(), message2.size());
563d8db0877bb66bfea17e37e12a586b4b29440963mukesh agrawal
573d8db0877bb66bfea17e37e12a586b4b29440963mukesh agrawal  const std::string expected{"helloworld"};
583d8db0877bb66bfea17e37e12a586b4b29440963mukesh agrawal  EXPECT_EQ(0, std::memcmp(buffer_.data(), expected.data(), expected.size()));
593d8db0877bb66bfea17e37e12a586b4b29440963mukesh agrawal}
603d8db0877bb66bfea17e37e12a586b4b29440963mukesh agrawal
613d8db0877bb66bfea17e37e12a586b4b29440963mukesh agrawalTEST_F(ByteBufferTest, AssigningWorks) {
623d8db0877bb66bfea17e37e12a586b4b29440963mukesh agrawal  const std::string message1{"hello"};
633d8db0877bb66bfea17e37e12a586b4b29440963mukesh agrawal  buffer_.AppendOrDie(message1.data(), message1.size());
643d8db0877bb66bfea17e37e12a586b4b29440963mukesh agrawal
653d8db0877bb66bfea17e37e12a586b4b29440963mukesh agrawal  ByteBuffer<kBufferSizeBytes> copy;
663d8db0877bb66bfea17e37e12a586b4b29440963mukesh agrawal  ASSERT_NE(buffer_.size(), copy.size());
673d8db0877bb66bfea17e37e12a586b4b29440963mukesh agrawal
683d8db0877bb66bfea17e37e12a586b4b29440963mukesh agrawal  copy = buffer_;
693d8db0877bb66bfea17e37e12a586b4b29440963mukesh agrawal  ASSERT_EQ(buffer_.size(), copy.size());
703d8db0877bb66bfea17e37e12a586b4b29440963mukesh agrawal  EXPECT_EQ(0, std::memcmp(copy.data(), buffer_.data(), buffer_.size()));
713d8db0877bb66bfea17e37e12a586b4b29440963mukesh agrawal}
723d8db0877bb66bfea17e37e12a586b4b29440963mukesh agrawal
73937164df3f181a273589ed0c12dcc3729bbd1d6dmukesh agrawalTEST_F(ByteBufferTest, ChainingWorks) {
74937164df3f181a273589ed0c12dcc3729bbd1d6dmukesh agrawal  const std::string message1{"hello"};
75937164df3f181a273589ed0c12dcc3729bbd1d6dmukesh agrawal  const std::string message2{"world"};
76937164df3f181a273589ed0c12dcc3729bbd1d6dmukesh agrawal  buffer_.AppendOrDie(message1.data(), message1.size())
77937164df3f181a273589ed0c12dcc3729bbd1d6dmukesh agrawal      .AppendOrDie(message2.data(), message2.size());
78937164df3f181a273589ed0c12dcc3729bbd1d6dmukesh agrawal
79937164df3f181a273589ed0c12dcc3729bbd1d6dmukesh agrawal  const std::string expected{"helloworld"};
80937164df3f181a273589ed0c12dcc3729bbd1d6dmukesh agrawal  EXPECT_EQ(0, std::memcmp(buffer_.data(), expected.data(), expected.size()));
81937164df3f181a273589ed0c12dcc3729bbd1d6dmukesh agrawal}
82937164df3f181a273589ed0c12dcc3729bbd1d6dmukesh agrawal
833d8db0877bb66bfea17e37e12a586b4b29440963mukesh agrawalTEST_F(ByteBufferTest, CopyingWorks) {
843d8db0877bb66bfea17e37e12a586b4b29440963mukesh agrawal  const std::string message1{"hello"};
853d8db0877bb66bfea17e37e12a586b4b29440963mukesh agrawal  buffer_.AppendOrDie(message1.data(), message1.size());
863d8db0877bb66bfea17e37e12a586b4b29440963mukesh agrawal
873d8db0877bb66bfea17e37e12a586b4b29440963mukesh agrawal  const ByteBuffer<kBufferSizeBytes> copy{buffer_};
883d8db0877bb66bfea17e37e12a586b4b29440963mukesh agrawal  ASSERT_EQ(buffer_.size(), copy.size());
893d8db0877bb66bfea17e37e12a586b4b29440963mukesh agrawal  EXPECT_EQ(0, std::memcmp(copy.data(), buffer_.data(), buffer_.size()));
903d8db0877bb66bfea17e37e12a586b4b29440963mukesh agrawal}
913d8db0877bb66bfea17e37e12a586b4b29440963mukesh agrawal
923d8db0877bb66bfea17e37e12a586b4b29440963mukesh agrawalTEST_F(ByteBufferTest, DataDoesNotReturnNullOnFreshBuffer) {
933d8db0877bb66bfea17e37e12a586b4b29440963mukesh agrawal  EXPECT_NE(nullptr, buffer_.data());
943d8db0877bb66bfea17e37e12a586b4b29440963mukesh agrawal}
953d8db0877bb66bfea17e37e12a586b4b29440963mukesh agrawal
963d8db0877bb66bfea17e37e12a586b4b29440963mukesh agrawalTEST_F(ByteBufferTest, DataDoesNotReturnNullAfterLargeWrite) {
973d8db0877bb66bfea17e37e12a586b4b29440963mukesh agrawal  buffer_.AppendOrDie(kLargestMessage.data(), kLargestMessage.size());
983d8db0877bb66bfea17e37e12a586b4b29440963mukesh agrawal  EXPECT_NE(nullptr, buffer_.data());
993d8db0877bb66bfea17e37e12a586b4b29440963mukesh agrawal}
1003d8db0877bb66bfea17e37e12a586b4b29440963mukesh agrawal
1013d8db0877bb66bfea17e37e12a586b4b29440963mukesh agrawalTEST_F(ByteBufferTest, SizeReturnsZeroOnFreshBuffer) {
1023d8db0877bb66bfea17e37e12a586b4b29440963mukesh agrawal  EXPECT_EQ(0U, buffer_.size());
1033d8db0877bb66bfea17e37e12a586b4b29440963mukesh agrawal}
1043d8db0877bb66bfea17e37e12a586b4b29440963mukesh agrawal
1053d8db0877bb66bfea17e37e12a586b4b29440963mukesh agrawalTEST_F(ByteBufferTest, SizeIsCorrectAfterSmallWrite) {
1063d8db0877bb66bfea17e37e12a586b4b29440963mukesh agrawal  buffer_.AppendOrDie(kSmallestMessage.data(), kSmallestMessage.size());
1073d8db0877bb66bfea17e37e12a586b4b29440963mukesh agrawal  EXPECT_EQ(kSmallestMessage.size(), buffer_.size());
1083d8db0877bb66bfea17e37e12a586b4b29440963mukesh agrawal}
1093d8db0877bb66bfea17e37e12a586b4b29440963mukesh agrawal
1103d8db0877bb66bfea17e37e12a586b4b29440963mukesh agrawalTEST_F(ByteBufferTest, SizeIsCorrectAfterLargeWrite) {
1113d8db0877bb66bfea17e37e12a586b4b29440963mukesh agrawal  buffer_.AppendOrDie(kLargestMessage.data(), kLargestMessage.size());
1123d8db0877bb66bfea17e37e12a586b4b29440963mukesh agrawal  EXPECT_EQ(kLargestMessage.size(), buffer_.size());
1133d8db0877bb66bfea17e37e12a586b4b29440963mukesh agrawal}
1143d8db0877bb66bfea17e37e12a586b4b29440963mukesh agrawal
1153d8db0877bb66bfea17e37e12a586b4b29440963mukesh agrawalTEST_F(ByteBufferTest, SizeIsCorrectAfterMultipleWrites) {
116937164df3f181a273589ed0c12dcc3729bbd1d6dmukesh agrawal  buffer_.AppendOrDie(kSmallestMessage.data(), kSmallestMessage.size())
117937164df3f181a273589ed0c12dcc3729bbd1d6dmukesh agrawal      .AppendOrDie(kSmallestMessage.data(), kSmallestMessage.size())
118937164df3f181a273589ed0c12dcc3729bbd1d6dmukesh agrawal      .AppendOrDie(kSmallestMessage.data(), kSmallestMessage.size());
1193d8db0877bb66bfea17e37e12a586b4b29440963mukesh agrawal  EXPECT_EQ(3 * kSmallestMessage.size(), buffer_.size());
1203d8db0877bb66bfea17e37e12a586b4b29440963mukesh agrawal}
1213d8db0877bb66bfea17e37e12a586b4b29440963mukesh agrawal
1223d8db0877bb66bfea17e37e12a586b4b29440963mukesh agrawal// Per
1237e979c369670feea99b9aff42bc366a903cf7049mukesh agrawal// github.com/google/googletest/blob/master/googletest/docs/AdvancedGuide.md#death-tests,
1243d8db0877bb66bfea17e37e12a586b4b29440963mukesh agrawal// death tests should be specially named.
1253d8db0877bb66bfea17e37e12a586b4b29440963mukesh agrawalusing ByteBufferDeathTest = ByteBufferTest;
1263d8db0877bb66bfea17e37e12a586b4b29440963mukesh agrawal
1273d8db0877bb66bfea17e37e12a586b4b29440963mukesh agrawalTEST_F(ByteBufferDeathTest, AppendLargerThanBufferCausesDeath) {
1283d8db0877bb66bfea17e37e12a586b4b29440963mukesh agrawal  constexpr std::array<uint8_t, kBufferSizeBytes + 1> oversized_message{};
1293d8db0877bb66bfea17e37e12a586b4b29440963mukesh agrawal  EXPECT_DEATH(
1303d8db0877bb66bfea17e37e12a586b4b29440963mukesh agrawal      buffer_.AppendOrDie(oversized_message.data(), oversized_message.size()),
1313d8db0877bb66bfea17e37e12a586b4b29440963mukesh agrawal      "Check failed");
1323d8db0877bb66bfea17e37e12a586b4b29440963mukesh agrawal}
1333d8db0877bb66bfea17e37e12a586b4b29440963mukesh agrawal
1343d8db0877bb66bfea17e37e12a586b4b29440963mukesh agrawalTEST_F(ByteBufferDeathTest, AppendLargerThanFreeSpaceCausesDeath) {
1353d8db0877bb66bfea17e37e12a586b4b29440963mukesh agrawal  buffer_.AppendOrDie(kLargestMessage.data(), kLargestMessage.size());
1363d8db0877bb66bfea17e37e12a586b4b29440963mukesh agrawal  EXPECT_DEATH(
1373d8db0877bb66bfea17e37e12a586b4b29440963mukesh agrawal      buffer_.AppendOrDie(kSmallestMessage.data(), kSmallestMessage.size()),
1383d8db0877bb66bfea17e37e12a586b4b29440963mukesh agrawal      "Check failed");
1393d8db0877bb66bfea17e37e12a586b4b29440963mukesh agrawal}
1403d8db0877bb66bfea17e37e12a586b4b29440963mukesh agrawal
1413d8db0877bb66bfea17e37e12a586b4b29440963mukesh agrawal}  // namespace wifilogd
1423d8db0877bb66bfea17e37e12a586b4b29440963mukesh agrawal}  // namespace android
143