Upstream version 9.38.198.0
[platform/framework/web/crosswalk.git] / src / media / cast / net / rtp / packet_storage_unittest.cc
1 // Copyright 2014 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #include "media/cast/net/rtp/packet_storage.h"
6
7 #include <stdint.h>
8
9 #include <vector>
10
11 #include "base/test/simple_test_tick_clock.h"
12 #include "base/time/time.h"
13 #include "testing/gmock/include/gmock/gmock.h"
14
15 namespace media {
16 namespace cast {
17
18 static size_t kStoredFrames = 10;
19
20 // Generate |number_of_frames| and store into |*storage|.
21 // First frame has 1 packet, second frame has 2 packets, etc.
22 static void StoreFrames(size_t number_of_frames,
23                         uint32 first_frame_id,
24                         PacketStorage* storage) {
25   const base::TimeTicks kTicks;
26   const int kSsrc = 1;
27   for (size_t i = 0; i < number_of_frames; ++i) {
28     SendPacketVector packets;
29     // First frame has 1 packet, second frame has 2 packets, etc.
30     const size_t kNumberOfPackets = i + 1;
31     for (size_t j = 0; j < kNumberOfPackets; ++j) {
32       Packet test_packet(1, 0);
33       packets.push_back(
34           std::make_pair(
35               PacedPacketSender::MakePacketKey(kTicks, kSsrc, j),
36               new base::RefCountedData<Packet>(test_packet)));
37     }
38     storage->StoreFrame(first_frame_id, packets);
39     ++first_frame_id;
40   }
41 }
42
43 TEST(PacketStorageTest, NumberOfStoredFrames) {
44   PacketStorage storage(kStoredFrames);
45
46   uint32 frame_id = 0;
47   frame_id = ~frame_id; // The maximum value of uint32.
48   StoreFrames(200, frame_id, &storage);
49   EXPECT_EQ(kStoredFrames, storage.GetNumberOfStoredFrames());
50 }
51
52 TEST(PacketStorageTest, GetFrameWrapAround8bits) {
53   PacketStorage storage(kStoredFrames);
54
55   const uint32 kFirstFrameId = 250;
56   StoreFrames(kStoredFrames, kFirstFrameId, &storage);
57   EXPECT_EQ(kStoredFrames, storage.GetNumberOfStoredFrames());
58
59   // Expect we get the correct frames by looking at the number of
60   // packets.
61   uint32 frame_id = kFirstFrameId;
62   for (size_t i = 0; i < kStoredFrames; ++i) {
63     ASSERT_TRUE(storage.GetFrame8(frame_id));
64     EXPECT_EQ(i + 1, storage.GetFrame8(frame_id)->size());
65     ++frame_id;
66   }
67 }
68
69 TEST(PacketStorageTest, GetFrameWrapAround32bits) {
70   PacketStorage storage(kStoredFrames);
71
72   // First frame ID is close to the maximum value of uint32.
73   uint32 first_frame_id = 0xffffffff - 5;
74   StoreFrames(kStoredFrames, first_frame_id, &storage);
75   EXPECT_EQ(kStoredFrames, storage.GetNumberOfStoredFrames());
76
77   // Expect we get the correct frames by looking at the number of
78   // packets.
79   uint32 frame_id = first_frame_id;
80   for (size_t i = 0; i < kStoredFrames; ++i) {
81     ASSERT_TRUE(storage.GetFrame8(frame_id));
82     EXPECT_EQ(i + 1, storage.GetFrame8(frame_id)->size());
83     ++frame_id;
84   }
85 }
86
87 TEST(PacketStorageTest, GetFrameTooOld) {
88   PacketStorage storage(kStoredFrames);
89
90   // First frame ID is close to the maximum value of uint32.
91   uint32 first_frame_id = 0xffffffff - 5;
92
93   // Store two times the capacity.
94   StoreFrames(2 * kStoredFrames, first_frame_id, &storage);
95   EXPECT_EQ(kStoredFrames, storage.GetNumberOfStoredFrames());
96
97   uint32 frame_id = first_frame_id;
98   // Old frames are evicted.
99   for (size_t i = 0; i < kStoredFrames; ++i) {
100     EXPECT_FALSE(storage.GetFrame8(frame_id));
101     ++frame_id;
102   }
103   // Check recent frames are there.
104   for (size_t i = 0; i < kStoredFrames; ++i) {
105     ASSERT_TRUE(storage.GetFrame8(frame_id));
106     EXPECT_EQ(kStoredFrames + i + 1,
107               storage.GetFrame8(frame_id)->size());
108     ++frame_id;
109   }
110 }
111
112 }  // namespace cast
113 }  // namespace media