1424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)// Copyright 2013 The Chromium Authors. All rights reserved.
2424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
3424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)// found in the LICENSE file.
4424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
5d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles)#include "media/cast/net/rtp_sender/packet_storage/packet_storage.h"
6424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
7424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)#include <vector>
8424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
9424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)#include "base/test/simple_test_tick_clock.h"
10424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)#include "base/time/time.h"
114e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "testing/gmock/include/gmock/gmock.h"
12424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
13424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)namespace media {
14424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)namespace cast {
15424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
16424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)static const int kMaxDeltaStoredMs = 500;
17424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)static const base::TimeDelta kDeltaBetweenFrames =
18424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    base::TimeDelta::FromMilliseconds(33);
19424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
204e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)static const int64 kStartMillisecond = GG_INT64_C(12345678900000);
21424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
22424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)class PacketStorageTest : public ::testing::Test {
23424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) protected:
244e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  PacketStorageTest() : packet_storage_(&testing_clock_, kMaxDeltaStoredMs) {
25424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    testing_clock_.Advance(
26424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)        base::TimeDelta::FromMilliseconds(kStartMillisecond));
27424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  }
28424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
29424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  base::SimpleTestTickClock testing_clock_;
304e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  PacketStorage packet_storage_;
31424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)};
32424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
33424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)TEST_F(PacketStorageTest, TimeOut) {
344e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  Packet test_123(100, 123);  // 100 insertions of the value 123.
354e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  PacketList packets;
36f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  for (uint32 frame_id = 0; frame_id < 30; ++frame_id) {
37424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    for (uint16 packet_id = 0; packet_id < 10; ++packet_id) {
384e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      packet_storage_.StorePacket(frame_id, packet_id, &test_123);
39424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    }
40424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    testing_clock_.Advance(kDeltaBetweenFrames);
41424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  }
42424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
43424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  // All packets belonging to the first 14 frames is expected to be expired.
44f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  for (uint32 frame_id = 0; frame_id < 14; ++frame_id) {
45424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    for (uint16 packet_id = 0; packet_id < 10; ++packet_id) {
464e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      Packet packet;
474e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      EXPECT_FALSE(packet_storage_.GetPacket(frame_id, packet_id, &packets));
48424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    }
49424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  }
50424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  // All packets belonging to the next 15 frames is expected to be valid.
51f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  for (uint32 frame_id = 14; frame_id < 30; ++frame_id) {
52424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    for (uint16 packet_id = 0; packet_id < 10; ++packet_id) {
534e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      EXPECT_TRUE(packet_storage_.GetPacket(frame_id, packet_id, &packets));
544e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      EXPECT_TRUE(packets.front() == test_123);
55424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    }
56424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  }
57424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)}
58424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
59424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)TEST_F(PacketStorageTest, MaxNumberOfPackets) {
604e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  Packet test_123(100, 123);  // 100 insertions of the value 123.
614e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  PacketList packets;
62424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
63f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  uint32 frame_id = 0;
64424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  for (uint16 packet_id = 0; packet_id <= PacketStorage::kMaxStoredPackets;
65424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)      ++packet_id) {
664e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    packet_storage_.StorePacket(frame_id, packet_id, &test_123);
67424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  }
684e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  Packet packet;
69424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  uint16 packet_id = 0;
704e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_FALSE(packet_storage_.GetPacket(frame_id, packet_id, &packets));
71424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
72424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  ++packet_id;
73424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  for (; packet_id <= PacketStorage::kMaxStoredPackets; ++packet_id) {
744e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    EXPECT_TRUE(packet_storage_.GetPacket(frame_id, packet_id, &packets));
754e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    EXPECT_TRUE(packets.back() == test_123);
76424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  }
77424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)}
78424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
79424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)TEST_F(PacketStorageTest, PacketContent) {
804e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  Packet test_123(100, 123);  // 100 insertions of the value 123.
814e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  Packet test_234(200, 234);  // 200 insertions of the value 234.
824e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  PacketList packets;
83424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
84f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  for (uint32 frame_id = 0; frame_id < 10; ++frame_id) {
85424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    for (uint16 packet_id = 0; packet_id < 10; ++packet_id) {
86424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)      // Every other packet.
87424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)      if (packet_id % 2 == 0) {
884e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        packet_storage_.StorePacket(frame_id, packet_id, &test_123);
89424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)      } else {
904e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        packet_storage_.StorePacket(frame_id, packet_id, &test_234);
91424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)      }
92424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    }
93424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    testing_clock_.Advance(kDeltaBetweenFrames);
94424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  }
95f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  for (uint32 frame_id = 0; frame_id < 10; ++frame_id) {
96424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    for (uint16 packet_id = 0; packet_id < 10; ++packet_id) {
974e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      EXPECT_TRUE(packet_storage_.GetPacket(frame_id, packet_id, &packets));
98424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)      // Every other packet.
99424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)      if (packet_id % 2 == 0) {
1004e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        EXPECT_TRUE(packets.back() == test_123);
101424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)      } else {
1024e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        EXPECT_TRUE(packets.back() == test_234);
103424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)      }
104424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    }
105424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  }
106424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)}
107424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
108424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)}  // namespace cast
109424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)}  // namespace media
110424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
111