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