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