#include "media/cast/transport/rtp_sender/packet_storage/packet_storage.h"
+#include <stdint.h>
+
#include <vector>
#include "base/test/simple_test_tick_clock.h"
namespace cast {
namespace transport {
-static const int kMaxDeltaStoredMs = 500;
-static const base::TimeDelta kDeltaBetweenFrames =
- base::TimeDelta::FromMilliseconds(33);
+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;
+ }
+}
-static const int64 kStartMillisecond = GG_INT64_C(12345678900000);
+TEST(PacketStorageTest, NumberOfStoredFrames) {
+ PacketStorage storage(kStoredFrames);
-class PacketStorageTest : public ::testing::Test {
- protected:
- PacketStorageTest() : packet_storage_(&testing_clock_, kMaxDeltaStoredMs) {
- testing_clock_.Advance(
- base::TimeDelta::FromMilliseconds(kStartMillisecond));
- }
+ uint32 frame_id = 0;
+ frame_id = ~frame_id; // The maximum value of uint32.
+ StoreFrames(200, frame_id, &storage);
+ EXPECT_EQ(kStoredFrames, storage.GetNumberOfStoredFrames());
+}
- base::SimpleTestTickClock testing_clock_;
- PacketStorage packet_storage_;
-};
+TEST(PacketStorageTest, GetFrameWrapAround8bits) {
+ PacketStorage storage(kStoredFrames);
-TEST_F(PacketStorageTest, TimeOut) {
- Packet test_123(100, 123); // 100 insertions of the value 123.
- PacketList packets;
- for (uint32 frame_id = 0; frame_id < 30; ++frame_id) {
- for (uint16 packet_id = 0; packet_id < 10; ++packet_id) {
- packet_storage_.StorePacket(frame_id, packet_id, &test_123);
- }
- testing_clock_.Advance(kDeltaBetweenFrames);
- }
+ const uint32 kFirstFrameId = 250;
+ StoreFrames(kStoredFrames, kFirstFrameId, &storage);
+ EXPECT_EQ(kStoredFrames, storage.GetNumberOfStoredFrames());
- // All packets belonging to the first 14 frames is expected to be expired.
- for (uint32 frame_id = 0; frame_id < 14; ++frame_id) {
- for (uint16 packet_id = 0; packet_id < 10; ++packet_id) {
- Packet packet;
- EXPECT_FALSE(packet_storage_.GetPacket(frame_id, packet_id, &packets));
- }
- }
- // All packets belonging to the next 15 frames is expected to be valid.
- for (uint32 frame_id = 14; frame_id < 30; ++frame_id) {
- for (uint16 packet_id = 0; packet_id < 10; ++packet_id) {
- EXPECT_TRUE(packet_storage_.GetPacket(frame_id, packet_id, &packets));
- EXPECT_TRUE(packets.front() == test_123);
- }
+ // 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_F(PacketStorageTest, MaxNumberOfPackets) {
- Packet test_123(100, 123); // 100 insertions of the value 123.
- PacketList packets;
-
- uint32 frame_id = 0;
- for (uint16 packet_id = 0; packet_id <= PacketStorage::kMaxStoredPackets;
- ++packet_id) {
- packet_storage_.StorePacket(frame_id, packet_id, &test_123);
- }
- Packet packet;
- uint16 packet_id = 0;
- EXPECT_FALSE(packet_storage_.GetPacket(frame_id, packet_id, &packets));
-
- ++packet_id;
- for (; packet_id <= PacketStorage::kMaxStoredPackets; ++packet_id) {
- EXPECT_TRUE(packet_storage_.GetPacket(frame_id, packet_id, &packets));
- EXPECT_TRUE(packets.back() == test_123);
+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_F(PacketStorageTest, PacketContent) {
- Packet test_123(100, 123); // 100 insertions of the value 123.
- Packet test_234(200, 234); // 200 insertions of the value 234.
- PacketList packets;
-
- for (uint32 frame_id = 0; frame_id < 10; ++frame_id) {
- for (uint16 packet_id = 0; packet_id < 10; ++packet_id) {
- // Every other packet.
- if (packet_id % 2 == 0) {
- packet_storage_.StorePacket(frame_id, packet_id, &test_123);
- } else {
- packet_storage_.StorePacket(frame_id, packet_id, &test_234);
- }
- }
- testing_clock_.Advance(kDeltaBetweenFrames);
+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;
}
- for (uint32 frame_id = 0; frame_id < 10; ++frame_id) {
- for (uint16 packet_id = 0; packet_id < 10; ++packet_id) {
- EXPECT_TRUE(packet_storage_.GetPacket(frame_id, packet_id, &packets));
- // Every other packet.
- if (packet_id % 2 == 0) {
- EXPECT_TRUE(packets.back() == test_123);
- } else {
- EXPECT_TRUE(packets.back() == test_234);
- }
- }
+ // 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 transport
} // namespace cast
} // namespace media
-