Index: media/cast/transport/pacing/paced_sender_unittest.cc |
diff --git a/media/cast/transport/pacing/paced_sender_unittest.cc b/media/cast/transport/pacing/paced_sender_unittest.cc |
deleted file mode 100644 |
index 5e24fca4b5694f23b6c321fad8a91615f5e6b776..0000000000000000000000000000000000000000 |
--- a/media/cast/transport/pacing/paced_sender_unittest.cc |
+++ /dev/null |
@@ -1,351 +0,0 @@ |
-// Copyright 2013 The Chromium Authors. All rights reserved. |
-// Use of this source code is governed by a BSD-style license that can be |
-// found in the LICENSE file. |
- |
-#include <stdint.h> |
- |
-#include "base/big_endian.h" |
-#include "base/test/simple_test_tick_clock.h" |
-#include "media/cast/logging/simple_event_subscriber.h" |
-#include "media/cast/test/fake_single_thread_task_runner.h" |
-#include "media/cast/transport/pacing/paced_sender.h" |
-#include "testing/gmock/include/gmock/gmock.h" |
- |
-namespace media { |
-namespace cast { |
-namespace transport { |
- |
-using testing::_; |
- |
-static const uint8 kValue = 123; |
-static const size_t kSize1 = 100; |
-static const size_t kSize2 = 101; |
-static const size_t kSize3 = 102; |
-static const size_t kSize4 = 103; |
-static const size_t kNackSize = 104; |
-static const int64 kStartMillisecond = INT64_C(12345678900000); |
-static const uint32 kVideoSsrc = 0x1234; |
-static const uint32 kAudioSsrc = 0x5678; |
- |
-class TestPacketSender : public PacketSender { |
- public: |
- TestPacketSender() {} |
- |
- virtual bool SendPacket(PacketRef packet, const base::Closure& cb) OVERRIDE { |
- EXPECT_FALSE(expected_packet_size_.empty()); |
- size_t expected_packet_size = expected_packet_size_.front(); |
- expected_packet_size_.pop_front(); |
- EXPECT_EQ(expected_packet_size, packet->data.size()); |
- return true; |
- } |
- |
- void AddExpectedSize(int expected_packet_size, int repeat_count) { |
- for (int i = 0; i < repeat_count; ++i) { |
- expected_packet_size_.push_back(expected_packet_size); |
- } |
- } |
- |
- public: |
- std::list<int> expected_packet_size_; |
- |
- DISALLOW_COPY_AND_ASSIGN(TestPacketSender); |
-}; |
- |
-class PacedSenderTest : public ::testing::Test { |
- protected: |
- PacedSenderTest() { |
- logging_.AddRawEventSubscriber(&subscriber_); |
- testing_clock_.Advance( |
- base::TimeDelta::FromMilliseconds(kStartMillisecond)); |
- task_runner_ = new test::FakeSingleThreadTaskRunner(&testing_clock_); |
- paced_sender_.reset(new PacedSender( |
- &testing_clock_, &logging_, &mock_transport_, task_runner_)); |
- paced_sender_->RegisterAudioSsrc(kAudioSsrc); |
- paced_sender_->RegisterVideoSsrc(kVideoSsrc); |
- } |
- |
- virtual ~PacedSenderTest() { |
- logging_.RemoveRawEventSubscriber(&subscriber_); |
- } |
- |
- static void UpdateCastTransportStatus(transport::CastTransportStatus status) { |
- NOTREACHED(); |
- } |
- |
- SendPacketVector CreateSendPacketVector(size_t packet_size, |
- int num_of_packets_in_frame, |
- bool audio) { |
- DCHECK_GE(packet_size, 12u); |
- SendPacketVector packets; |
- base::TimeTicks frame_tick = testing_clock_.NowTicks(); |
- // Advance the clock so that we don't get the same frame_tick |
- // next time this function is called. |
- testing_clock_.Advance(base::TimeDelta::FromMilliseconds(1)); |
- for (int i = 0; i < num_of_packets_in_frame; ++i) { |
- PacketKey key = PacedPacketSender::MakePacketKey( |
- frame_tick, |
- audio ? kAudioSsrc : kVideoSsrc, // ssrc |
- i); |
- |
- PacketRef packet(new base::RefCountedData<Packet>); |
- packet->data.resize(packet_size, kValue); |
- // Write ssrc to packet so that it can be recognized as a |
- // "video frame" for logging purposes. |
- base::BigEndianWriter writer( |
- reinterpret_cast<char*>(&packet->data[8]), 4); |
- bool success = writer.WriteU32(audio ? kAudioSsrc : kVideoSsrc); |
- DCHECK(success); |
- packets.push_back(std::make_pair(key, packet)); |
- } |
- return packets; |
- } |
- |
- // Use this function to drain the packet list in PacedSender without having |
- // to test the pacing implementation details. |
- bool RunUntilEmpty(int max_tries) { |
- for (int i = 0; i < max_tries; i++) { |
- testing_clock_.Advance(base::TimeDelta::FromMilliseconds(10)); |
- task_runner_->RunTasks(); |
- if (mock_transport_.expected_packet_size_.empty()) |
- return true; |
- i++; |
- } |
- |
- return mock_transport_.expected_packet_size_.empty(); |
- } |
- |
- LoggingImpl logging_; |
- SimpleEventSubscriber subscriber_; |
- base::SimpleTestTickClock testing_clock_; |
- TestPacketSender mock_transport_; |
- scoped_refptr<test::FakeSingleThreadTaskRunner> task_runner_; |
- scoped_ptr<PacedSender> paced_sender_; |
- |
- DISALLOW_COPY_AND_ASSIGN(PacedSenderTest); |
-}; |
- |
-TEST_F(PacedSenderTest, PassThroughRtcp) { |
- mock_transport_.AddExpectedSize(kSize1, 2); |
- SendPacketVector packets = CreateSendPacketVector(kSize1, 1, true); |
- |
- EXPECT_TRUE(paced_sender_->SendPackets(packets)); |
- EXPECT_TRUE(paced_sender_->ResendPackets(packets, base::TimeDelta())); |
- |
- mock_transport_.AddExpectedSize(kSize2, 1); |
- Packet tmp(kSize2, kValue); |
- EXPECT_TRUE(paced_sender_->SendRtcpPacket( |
- 1, |
- new base::RefCountedData<Packet>(tmp))); |
-} |
- |
-TEST_F(PacedSenderTest, BasicPace) { |
- int num_of_packets = 27; |
- SendPacketVector packets = CreateSendPacketVector(kSize1, |
- num_of_packets, |
- false); |
- |
- mock_transport_.AddExpectedSize(kSize1, 10); |
- EXPECT_TRUE(paced_sender_->SendPackets(packets)); |
- |
- // Check that we get the next burst. |
- mock_transport_.AddExpectedSize(kSize1, 10); |
- |
- base::TimeDelta timeout = base::TimeDelta::FromMilliseconds(10); |
- testing_clock_.Advance(timeout); |
- task_runner_->RunTasks(); |
- |
- // If we call process too early make sure we don't send any packets. |
- timeout = base::TimeDelta::FromMilliseconds(5); |
- testing_clock_.Advance(timeout); |
- task_runner_->RunTasks(); |
- |
- // Check that we get the next burst. |
- mock_transport_.AddExpectedSize(kSize1, 7); |
- testing_clock_.Advance(timeout); |
- task_runner_->RunTasks(); |
- |
- // Check that we don't get any more packets. |
- EXPECT_TRUE(RunUntilEmpty(3)); |
- |
- std::vector<PacketEvent> packet_events; |
- subscriber_.GetPacketEventsAndReset(&packet_events); |
- EXPECT_EQ(num_of_packets, static_cast<int>(packet_events.size())); |
- int sent_to_network_event_count = 0; |
- for (std::vector<PacketEvent>::iterator it = packet_events.begin(); |
- it != packet_events.end(); |
- ++it) { |
- if (it->type == PACKET_SENT_TO_NETWORK) |
- sent_to_network_event_count++; |
- else |
- FAIL() << "Got unexpected event type " << CastLoggingToString(it->type); |
- } |
- EXPECT_EQ(num_of_packets, sent_to_network_event_count); |
-} |
- |
-TEST_F(PacedSenderTest, PaceWithNack) { |
- // Testing what happen when we get multiple NACK requests for a fully lost |
- // frames just as we sent the first packets in a frame. |
- int num_of_packets_in_frame = 12; |
- int num_of_packets_in_nack = 12; |
- |
- SendPacketVector nack_packets = |
- CreateSendPacketVector(kNackSize, num_of_packets_in_nack, false); |
- |
- SendPacketVector first_frame_packets = |
- CreateSendPacketVector(kSize1, num_of_packets_in_frame, false); |
- |
- SendPacketVector second_frame_packets = |
- CreateSendPacketVector(kSize2, num_of_packets_in_frame, true); |
- |
- // Check that the first burst of the frame go out on the wire. |
- mock_transport_.AddExpectedSize(kSize1, 10); |
- EXPECT_TRUE(paced_sender_->SendPackets(first_frame_packets)); |
- |
- // Add first NACK request. |
- EXPECT_TRUE(paced_sender_->ResendPackets(nack_packets, base::TimeDelta())); |
- |
- // Check that we get the first NACK burst. |
- mock_transport_.AddExpectedSize(kNackSize, 10); |
- base::TimeDelta timeout = base::TimeDelta::FromMilliseconds(10); |
- testing_clock_.Advance(timeout); |
- task_runner_->RunTasks(); |
- |
- // Add second NACK request. |
- EXPECT_TRUE(paced_sender_->ResendPackets(nack_packets, base::TimeDelta())); |
- |
- // Check that we get the next NACK burst. |
- mock_transport_.AddExpectedSize(kNackSize, 10); |
- testing_clock_.Advance(timeout); |
- task_runner_->RunTasks(); |
- |
- // End of NACK plus two packets from the oldest frame. |
- // Note that two of the NACKs have been de-duped. |
- mock_transport_.AddExpectedSize(kNackSize, 2); |
- mock_transport_.AddExpectedSize(kSize1, 2); |
- testing_clock_.Advance(timeout); |
- task_runner_->RunTasks(); |
- |
- // Add second frame. |
- // Make sure we don't delay the second frame due to the previous packets. |
- mock_transport_.AddExpectedSize(kSize2, 10); |
- EXPECT_TRUE(paced_sender_->SendPackets(second_frame_packets)); |
- |
- // Last packets of frame 2. |
- mock_transport_.AddExpectedSize(kSize2, 2); |
- testing_clock_.Advance(timeout); |
- task_runner_->RunTasks(); |
- |
- // No more packets. |
- EXPECT_TRUE(RunUntilEmpty(5)); |
- |
- std::vector<PacketEvent> packet_events; |
- subscriber_.GetPacketEventsAndReset(&packet_events); |
- int expected_video_network_event_count = num_of_packets_in_frame; |
- int expected_video_retransmitted_event_count = 2 * num_of_packets_in_nack; |
- expected_video_retransmitted_event_count -= 2; // 2 packets deduped |
- int expected_audio_network_event_count = num_of_packets_in_frame; |
- EXPECT_EQ(expected_video_network_event_count + |
- expected_video_retransmitted_event_count + |
- expected_audio_network_event_count, |
- static_cast<int>(packet_events.size())); |
- int audio_network_event_count = 0; |
- int video_network_event_count = 0; |
- int video_retransmitted_event_count = 0; |
- for (std::vector<PacketEvent>::iterator it = packet_events.begin(); |
- it != packet_events.end(); |
- ++it) { |
- if (it->type == PACKET_SENT_TO_NETWORK) { |
- if (it->media_type == VIDEO_EVENT) |
- video_network_event_count++; |
- else |
- audio_network_event_count++; |
- } else if (it->type == PACKET_RETRANSMITTED) { |
- if (it->media_type == VIDEO_EVENT) |
- video_retransmitted_event_count++; |
- } else { |
- FAIL() << "Got unexpected event type " << CastLoggingToString(it->type); |
- } |
- } |
- EXPECT_EQ(expected_audio_network_event_count, audio_network_event_count); |
- EXPECT_EQ(expected_video_network_event_count, video_network_event_count); |
- EXPECT_EQ(expected_video_retransmitted_event_count, |
- video_retransmitted_event_count); |
-} |
- |
-TEST_F(PacedSenderTest, PaceWith60fps) { |
- // Testing what happen when we get multiple NACK requests for a fully lost |
- // frames just as we sent the first packets in a frame. |
- int num_of_packets_in_frame = 17; |
- |
- SendPacketVector first_frame_packets = |
- CreateSendPacketVector(kSize1, num_of_packets_in_frame, false); |
- |
- SendPacketVector second_frame_packets = |
- CreateSendPacketVector(kSize2, num_of_packets_in_frame, false); |
- |
- SendPacketVector third_frame_packets = |
- CreateSendPacketVector(kSize3, num_of_packets_in_frame, false); |
- |
- SendPacketVector fourth_frame_packets = |
- CreateSendPacketVector(kSize4, num_of_packets_in_frame, false); |
- |
- base::TimeDelta timeout_10ms = base::TimeDelta::FromMilliseconds(10); |
- |
- // Check that the first burst of the frame go out on the wire. |
- mock_transport_.AddExpectedSize(kSize1, 10); |
- EXPECT_TRUE(paced_sender_->SendPackets(first_frame_packets)); |
- |
- mock_transport_.AddExpectedSize(kSize1, 7); |
- testing_clock_.Advance(timeout_10ms); |
- task_runner_->RunTasks(); |
- |
- testing_clock_.Advance(base::TimeDelta::FromMilliseconds(6)); |
- |
- // Add second frame, after 16 ms. |
- mock_transport_.AddExpectedSize(kSize2, 3); |
- EXPECT_TRUE(paced_sender_->SendPackets(second_frame_packets)); |
- testing_clock_.Advance(base::TimeDelta::FromMilliseconds(4)); |
- |
- mock_transport_.AddExpectedSize(kSize2, 10); |
- testing_clock_.Advance(timeout_10ms); |
- task_runner_->RunTasks(); |
- |
- mock_transport_.AddExpectedSize(kSize2, 4); |
- testing_clock_.Advance(timeout_10ms); |
- task_runner_->RunTasks(); |
- |
- testing_clock_.Advance(base::TimeDelta::FromMilliseconds(3)); |
- |
- // Add third frame, after 33 ms. |
- mock_transport_.AddExpectedSize(kSize3, 6); |
- EXPECT_TRUE(paced_sender_->SendPackets(third_frame_packets)); |
- |
- mock_transport_.AddExpectedSize(kSize3, 10); |
- testing_clock_.Advance(base::TimeDelta::FromMilliseconds(7)); |
- task_runner_->RunTasks(); |
- |
- // Add fourth frame, after 50 ms. |
- EXPECT_TRUE(paced_sender_->SendPackets(fourth_frame_packets)); |
- |
- mock_transport_.AddExpectedSize(kSize3, 1); |
- mock_transport_.AddExpectedSize(kSize4, 9); |
- testing_clock_.Advance(timeout_10ms); |
- task_runner_->RunTasks(); |
- |
- mock_transport_.AddExpectedSize(kSize4, 8); |
- testing_clock_.Advance(timeout_10ms); |
- task_runner_->RunTasks(); |
- |
- testing_clock_.Advance(timeout_10ms); |
- task_runner_->RunTasks(); |
- |
- testing_clock_.Advance(timeout_10ms); |
- task_runner_->RunTasks(); |
- |
- // No more packets. |
- EXPECT_TRUE(RunUntilEmpty(5)); |
-} |
- |
-} // namespace transport |
-} // namespace cast |
-} // namespace media |