C++程序  |  143行  |  4.47 KB

/*
 * Copyright (C) 2016, The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

#include <array>
#include <cstring>
#include <string>

#include "gtest/gtest.h"

#include "wifilogd/byte_buffer.h"

namespace android {
namespace wifilogd {
namespace {

constexpr size_t kBufferSizeBytes = 1024;
constexpr std::array<uint8_t, 1> kSmallestMessage{};
constexpr std::array<uint8_t, kBufferSizeBytes> kLargestMessage{};

class ByteBufferTest : public ::testing::Test {
 public:
  ByteBufferTest() {}

 protected:
  ByteBuffer<kBufferSizeBytes> buffer_;
};

}  // namespace

TEST_F(ByteBufferTest, AppendMinimalOnEmptyBufferSucceeds) {
  buffer_.AppendOrDie(kSmallestMessage.data(), kSmallestMessage.size());
}

TEST_F(ByteBufferTest, AppendMaximalOnEmptyBufferSucceeds) {
  buffer_.AppendOrDie(kLargestMessage.data(), kLargestMessage.size());
}

TEST_F(ByteBufferTest, AppendStoresOurData) {
  const std::string message1{"hello"};
  const std::string message2{"world"};
  buffer_.AppendOrDie(message1.data(), message1.size());
  buffer_.AppendOrDie(message2.data(), message2.size());

  const std::string expected{"helloworld"};
  EXPECT_EQ(0, std::memcmp(buffer_.data(), expected.data(), expected.size()));
}

TEST_F(ByteBufferTest, AssigningWorks) {
  const std::string message1{"hello"};
  buffer_.AppendOrDie(message1.data(), message1.size());

  ByteBuffer<kBufferSizeBytes> copy;
  ASSERT_NE(buffer_.size(), copy.size());

  copy = buffer_;
  ASSERT_EQ(buffer_.size(), copy.size());
  EXPECT_EQ(0, std::memcmp(copy.data(), buffer_.data(), buffer_.size()));
}

TEST_F(ByteBufferTest, ChainingWorks) {
  const std::string message1{"hello"};
  const std::string message2{"world"};
  buffer_.AppendOrDie(message1.data(), message1.size())
      .AppendOrDie(message2.data(), message2.size());

  const std::string expected{"helloworld"};
  EXPECT_EQ(0, std::memcmp(buffer_.data(), expected.data(), expected.size()));
}

TEST_F(ByteBufferTest, CopyingWorks) {
  const std::string message1{"hello"};
  buffer_.AppendOrDie(message1.data(), message1.size());

  const ByteBuffer<kBufferSizeBytes> copy{buffer_};
  ASSERT_EQ(buffer_.size(), copy.size());
  EXPECT_EQ(0, std::memcmp(copy.data(), buffer_.data(), buffer_.size()));
}

TEST_F(ByteBufferTest, DataDoesNotReturnNullOnFreshBuffer) {
  EXPECT_NE(nullptr, buffer_.data());
}

TEST_F(ByteBufferTest, DataDoesNotReturnNullAfterLargeWrite) {
  buffer_.AppendOrDie(kLargestMessage.data(), kLargestMessage.size());
  EXPECT_NE(nullptr, buffer_.data());
}

TEST_F(ByteBufferTest, SizeReturnsZeroOnFreshBuffer) {
  EXPECT_EQ(0U, buffer_.size());
}

TEST_F(ByteBufferTest, SizeIsCorrectAfterSmallWrite) {
  buffer_.AppendOrDie(kSmallestMessage.data(), kSmallestMessage.size());
  EXPECT_EQ(kSmallestMessage.size(), buffer_.size());
}

TEST_F(ByteBufferTest, SizeIsCorrectAfterLargeWrite) {
  buffer_.AppendOrDie(kLargestMessage.data(), kLargestMessage.size());
  EXPECT_EQ(kLargestMessage.size(), buffer_.size());
}

TEST_F(ByteBufferTest, SizeIsCorrectAfterMultipleWrites) {
  buffer_.AppendOrDie(kSmallestMessage.data(), kSmallestMessage.size())
      .AppendOrDie(kSmallestMessage.data(), kSmallestMessage.size())
      .AppendOrDie(kSmallestMessage.data(), kSmallestMessage.size());
  EXPECT_EQ(3 * kSmallestMessage.size(), buffer_.size());
}

// Per
// github.com/google/googletest/blob/master/googletest/docs/AdvancedGuide.md#death-tests,
// death tests should be specially named.
using ByteBufferDeathTest = ByteBufferTest;

TEST_F(ByteBufferDeathTest, AppendLargerThanBufferCausesDeath) {
  constexpr std::array<uint8_t, kBufferSizeBytes + 1> oversized_message{};
  EXPECT_DEATH(
      buffer_.AppendOrDie(oversized_message.data(), oversized_message.size()),
      "Check failed");
}

TEST_F(ByteBufferDeathTest, AppendLargerThanFreeSpaceCausesDeath) {
  buffer_.AppendOrDie(kLargestMessage.data(), kLargestMessage.size());
  EXPECT_DEATH(
      buffer_.AppendOrDie(kSmallestMessage.data(), kSmallestMessage.size()),
      "Check failed");
}

}  // namespace wifilogd
}  // namespace android