/*
 * 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, 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());
  buffer_.AppendOrDie(kSmallestMessage.data(), kSmallestMessage.size());
  buffer_.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
