Index: media/cast/transport/rtp_sender/packet_storage/packet_storage_unittest.cc |
diff --git a/media/cast/transport/rtp_sender/packet_storage/packet_storage_unittest.cc b/media/cast/transport/rtp_sender/packet_storage/packet_storage_unittest.cc |
index a43ae6e0fda407a35d8796b8670115999e97811b..298942c80a543d48e09cb2341d7550d5d0a30be7 100644 |
--- a/media/cast/transport/rtp_sender/packet_storage/packet_storage_unittest.cc |
+++ b/media/cast/transport/rtp_sender/packet_storage/packet_storage_unittest.cc |
@@ -16,47 +16,97 @@ namespace media { |
namespace cast { |
namespace transport { |
-static int kStoredFrames = 10; |
+static size_t kStoredFrames = 10; |
-class PacketStorageTest : public ::testing::Test { |
- protected: |
- PacketStorageTest() : packet_storage_(kStoredFrames) { |
+// 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; |
} |
+} |
- PacketStorage packet_storage_; |
- |
- DISALLOW_COPY_AND_ASSIGN(PacketStorageTest); |
-}; |
- |
-TEST_F(PacketStorageTest, PacketContent) { |
- base::TimeTicks frame_tick; |
- for (uint32 frame_id = 0; frame_id < 200; ++frame_id) { |
- for (uint16 packet_id = 0; packet_id < 5; ++packet_id) { |
- Packet test_packet(frame_id + 1, packet_id); |
- packet_storage_.StorePacket( |
- frame_id, |
- packet_id, |
- PacedPacketSender::MakePacketKey(frame_tick, |
- 1, // ssrc |
- packet_id), |
- new base::RefCountedData<Packet>(test_packet)); |
- } |
+TEST(PacketStorageTest, NumberOfStoredFrames) { |
+ PacketStorage storage(kStoredFrames); |
- for (uint32 f = 0; f <= frame_id; f++) { |
- for (uint16 packet_id = 0; packet_id < 5; ++packet_id) { |
- SendPacketVector packets; |
- if (packet_storage_.GetPacket32(f, packet_id, &packets)) { |
- EXPECT_GT(f + kStoredFrames, frame_id); |
- EXPECT_EQ(f + 1, packets.back().second->data.size()); |
- EXPECT_EQ(packet_id, packets.back().second->data[0]); |
- EXPECT_TRUE(packet_storage_.GetPacket(f & 0xff, packet_id, &packets)); |
- EXPECT_TRUE(packets.back().second->data == |
- packets.front().second->data); |
- } else { |
- EXPECT_LE(f + kStoredFrames, frame_id); |
- } |
- } |
- } |
+ 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; |
} |
} |