// Copyright 2014 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#include "media/cast/net/rtp/packet_storage.h"

#include <stdint.h>

#include <vector>

#include "base/test/simple_test_tick_clock.h"
#include "base/time/time.h"
#include "testing/gmock/include/gmock/gmock.h"

namespace media {
namespace cast {

static size_t kStoredFrames = 10;

// Generate |number_of_frames| and store into |*storage|.
// First frame has 1 packet, second frame has 2 packets, etc.
static void StoreFrames(size_t number_of_frames,
                        uint32 first_frame_id,
                        PacketStorage* storage) {
  const base::TimeTicks kTicks;
  const int kSsrc = 1;
  for (size_t i = 0; i < number_of_frames; ++i) {
    SendPacketVector packets;
    // First frame has 1 packet, second frame has 2 packets, etc.
    const size_t kNumberOfPackets = i + 1;
    for (size_t j = 0; j < kNumberOfPackets; ++j) {
      Packet test_packet(1, 0);
      packets.push_back(
          std::make_pair(
              PacedPacketSender::MakePacketKey(kTicks, kSsrc, j),
              new base::RefCountedData<Packet>(test_packet)));
    }
    storage->StoreFrame(first_frame_id, packets);
    ++first_frame_id;
  }
}

TEST(PacketStorageTest, NumberOfStoredFrames) {
  PacketStorage storage(kStoredFrames);

  uint32 frame_id = 0;
  frame_id = ~frame_id; // The maximum value of uint32.
  StoreFrames(200, frame_id, &storage);
  EXPECT_EQ(kStoredFrames, storage.GetNumberOfStoredFrames());
}

TEST(PacketStorageTest, GetFrameWrapAround8bits) {
  PacketStorage storage(kStoredFrames);

  const uint32 kFirstFrameId = 250;
  StoreFrames(kStoredFrames, kFirstFrameId, &storage);
  EXPECT_EQ(kStoredFrames, storage.GetNumberOfStoredFrames());

  // Expect we get the correct frames by looking at the number of
  // packets.
  uint32 frame_id = kFirstFrameId;
  for (size_t i = 0; i < kStoredFrames; ++i) {
    ASSERT_TRUE(storage.GetFrame8(frame_id));
    EXPECT_EQ(i + 1, storage.GetFrame8(frame_id)->size());
    ++frame_id;
  }
}

TEST(PacketStorageTest, GetFrameWrapAround32bits) {
  PacketStorage storage(kStoredFrames);

  // First frame ID is close to the maximum value of uint32.
  uint32 first_frame_id = 0xffffffff - 5;
  StoreFrames(kStoredFrames, first_frame_id, &storage);
  EXPECT_EQ(kStoredFrames, storage.GetNumberOfStoredFrames());

  // Expect we get the correct frames by looking at the number of
  // packets.
  uint32 frame_id = first_frame_id;
  for (size_t i = 0; i < kStoredFrames; ++i) {
    ASSERT_TRUE(storage.GetFrame8(frame_id));
    EXPECT_EQ(i + 1, storage.GetFrame8(frame_id)->size());
    ++frame_id;
  }
}

TEST(PacketStorageTest, GetFrameTooOld) {
  PacketStorage storage(kStoredFrames);

  // First frame ID is close to the maximum value of uint32.
  uint32 first_frame_id = 0xffffffff - 5;

  // Store two times the capacity.
  StoreFrames(2 * kStoredFrames, first_frame_id, &storage);
  EXPECT_EQ(kStoredFrames, storage.GetNumberOfStoredFrames());

  uint32 frame_id = first_frame_id;
  // Old frames are evicted.
  for (size_t i = 0; i < kStoredFrames; ++i) {
    EXPECT_FALSE(storage.GetFrame8(frame_id));
    ++frame_id;
  }
  // Check recent frames are there.
  for (size_t i = 0; i < kStoredFrames; ++i) {
    ASSERT_TRUE(storage.GetFrame8(frame_id));
    EXPECT_EQ(kStoredFrames + i + 1,
              storage.GetFrame8(frame_id)->size());
    ++frame_id;
  }
}

}  // namespace cast
}  // namespace media
