/*
 *  Copyright 2015 The WebRTC Project Authors. All rights reserved.
 *
 *  Use of this source code is governed by a BSD-style license
 *  that can be found in the LICENSE file in the root of the source
 *  tree. An additional intellectual property rights grant can be found
 *  in the file PATENTS.  All contributing project authors may
 *  be found in the AUTHORS file in the root of the source tree.
 */

#include "rtc_base/buffer_queue.h"

#include <string.h>

#include "test/gtest.h"

namespace rtc {

TEST(BufferQueueTest, TestAll) {
  const size_t kSize = 16;
  const char in[kSize * 2 + 1] = "0123456789ABCDEFGHIJKLMNOPQRSTUV";
  char out[kSize * 2];
  size_t bytes;
  BufferQueue queue1(1, kSize);
  BufferQueue queue2(2, kSize);

  // The queue is initially empty.
  EXPECT_EQ(0u, queue1.size());
  EXPECT_FALSE(queue1.ReadFront(out, kSize, &bytes));

  // A write should succeed.
  EXPECT_TRUE(queue1.WriteBack(in, kSize, &bytes));
  EXPECT_EQ(kSize, bytes);
  EXPECT_EQ(1u, queue1.size());

  // The queue is full now (only one buffer allowed).
  EXPECT_FALSE(queue1.WriteBack(in, kSize, &bytes));
  EXPECT_EQ(1u, queue1.size());

  // Reading previously written buffer.
  EXPECT_TRUE(queue1.ReadFront(out, kSize, &bytes));
  EXPECT_EQ(kSize, bytes);
  EXPECT_EQ(0, memcmp(in, out, kSize));

  // The queue is empty again now.
  EXPECT_FALSE(queue1.ReadFront(out, kSize, &bytes));
  EXPECT_EQ(0u, queue1.size());

  // Reading only returns available data.
  EXPECT_TRUE(queue1.WriteBack(in, kSize, &bytes));
  EXPECT_EQ(kSize, bytes);
  EXPECT_EQ(1u, queue1.size());
  EXPECT_TRUE(queue1.ReadFront(out, kSize * 2, &bytes));
  EXPECT_EQ(kSize, bytes);
  EXPECT_EQ(0, memcmp(in, out, kSize));
  EXPECT_EQ(0u, queue1.size());

  // Reading maintains buffer boundaries.
  EXPECT_TRUE(queue2.WriteBack(in, kSize / 2, &bytes));
  EXPECT_EQ(1u, queue2.size());
  EXPECT_TRUE(queue2.WriteBack(in + kSize / 2, kSize / 2, &bytes));
  EXPECT_EQ(2u, queue2.size());
  EXPECT_TRUE(queue2.ReadFront(out, kSize, &bytes));
  EXPECT_EQ(kSize / 2, bytes);
  EXPECT_EQ(0, memcmp(in, out, kSize / 2));
  EXPECT_EQ(1u, queue2.size());
  EXPECT_TRUE(queue2.ReadFront(out, kSize, &bytes));
  EXPECT_EQ(kSize / 2, bytes);
  EXPECT_EQ(0, memcmp(in + kSize / 2, out, kSize / 2));
  EXPECT_EQ(0u, queue2.size());

  // Reading truncates buffers.
  EXPECT_TRUE(queue2.WriteBack(in, kSize / 2, &bytes));
  EXPECT_EQ(1u, queue2.size());
  EXPECT_TRUE(queue2.WriteBack(in + kSize / 2, kSize / 2, &bytes));
  EXPECT_EQ(2u, queue2.size());
  // Read first packet partially in too-small buffer.
  EXPECT_TRUE(queue2.ReadFront(out, kSize / 4, &bytes));
  EXPECT_EQ(kSize / 4, bytes);
  EXPECT_EQ(0, memcmp(in, out, kSize / 4));
  EXPECT_EQ(1u, queue2.size());
  // Remainder of first packet is truncated, reading starts with next packet.
  EXPECT_TRUE(queue2.ReadFront(out, kSize, &bytes));
  EXPECT_EQ(kSize / 2, bytes);
  EXPECT_EQ(0, memcmp(in + kSize / 2, out, kSize / 2));
  EXPECT_EQ(0u, queue2.size());
}

}  // namespace rtc
