diff options
Diffstat (limited to 'media/cast/rtcp/rtcp_unittest.cc')
-rw-r--r-- | media/cast/rtcp/rtcp_unittest.cc | 263 |
1 files changed, 190 insertions, 73 deletions
diff --git a/media/cast/rtcp/rtcp_unittest.cc b/media/cast/rtcp/rtcp_unittest.cc index ccbdcac863..8287d99927 100644 --- a/media/cast/rtcp/rtcp_unittest.cc +++ b/media/cast/rtcp/rtcp_unittest.cc @@ -4,11 +4,13 @@ #include "base/test/simple_test_tick_clock.h" #include "media/cast/cast_defines.h" +#include "media/cast/cast_environment.h" #include "media/cast/pacing/paced_sender.h" #include "media/cast/rtcp/mock_rtcp_receiver_feedback.h" #include "media/cast/rtcp/mock_rtcp_sender_feedback.h" #include "media/cast/rtcp/rtcp.h" #include "media/cast/rtcp/test_rtcp_packet_builder.h" +#include "media/cast/test/fake_task_runner.h" #include "testing/gmock/include/gmock/gmock.h" namespace media { @@ -18,7 +20,6 @@ using testing::_; static const uint32 kSenderSsrc = 0x10203; static const uint32 kReceiverSsrc = 0x40506; -static const uint32 kUnknownSsrc = 0xDEAD; static const std::string kCName("test@10.1.1.1"); static const uint32 kRtcpIntervalMs = 500; static const int64 kStartMillisecond = GG_INT64_C(12345678900000); @@ -27,14 +28,19 @@ static const int64 kAddedShortDelay= 100; class LocalRtcpTransport : public PacedPacketSender { public: - explicit LocalRtcpTransport(base::SimpleTestTickClock* testing_clock) - : short_delay_(false), + explicit LocalRtcpTransport(scoped_refptr<CastEnvironment> cast_environment, + base::SimpleTestTickClock* testing_clock) + : drop_packets_(false), + short_delay_(false), testing_clock_(testing_clock) {} void SetRtcpReceiver(Rtcp* rtcp) { rtcp_ = rtcp; } void SetShortDelay() { short_delay_ = true; } + void SetDropPackets(bool drop_packets) { drop_packets_ = drop_packets; } + + virtual bool SendRtcpPacket(const std::vector<uint8>& packet) OVERRIDE { if (short_delay_) { testing_clock_->Advance( @@ -42,6 +48,8 @@ class LocalRtcpTransport : public PacedPacketSender { } else { testing_clock_->Advance(base::TimeDelta::FromMilliseconds(kAddedDelay)); } + if (drop_packets_) return true; + rtcp_->IncomingRtcpPacket(&(packet[0]), packet.size()); return true; } @@ -55,32 +63,34 @@ class LocalRtcpTransport : public PacedPacketSender { } private: + bool drop_packets_; bool short_delay_; Rtcp* rtcp_; base::SimpleTestTickClock* testing_clock_; + scoped_refptr<CastEnvironment> cast_environment_; }; class RtcpPeer : public Rtcp { public: - RtcpPeer(base::TickClock* clock, + RtcpPeer(scoped_refptr<CastEnvironment> cast_environment, RtcpSenderFeedback* sender_feedback, PacedPacketSender* const paced_packet_sender, RtpSenderStatistics* rtp_sender_statistics, RtpReceiverStatistics* rtp_receiver_statistics, RtcpMode rtcp_mode, const base::TimeDelta& rtcp_interval, - bool sending_media, uint32 local_ssrc, + uint32 remote_ssrc, const std::string& c_name) - : Rtcp(clock, + : Rtcp(cast_environment, sender_feedback, paced_packet_sender, rtp_sender_statistics, rtp_receiver_statistics, rtcp_mode, rtcp_interval, - sending_media, local_ssrc, + remote_ssrc, c_name) { } @@ -91,7 +101,11 @@ class RtcpPeer : public Rtcp { class RtcpTest : public ::testing::Test { protected: RtcpTest() - : transport_(&testing_clock_) { + : task_runner_(new test::FakeTaskRunner(&testing_clock_)), + cast_environment_(new CastEnvironment(&testing_clock_, task_runner_, + task_runner_, task_runner_, task_runner_, task_runner_, + GetDefaultCastLoggingConfig())), + transport_(cast_environment_, &testing_clock_) { testing_clock_.Advance( base::TimeDelta::FromMilliseconds(kStartMillisecond)); } @@ -99,15 +113,12 @@ class RtcpTest : public ::testing::Test { virtual ~RtcpTest() {} virtual void SetUp() { - EXPECT_CALL(mock_sender_feedback_, OnReceivedReportBlock(_)).Times(0); - EXPECT_CALL(mock_sender_feedback_, OnReceivedIntraFrameRequest()).Times(0); - EXPECT_CALL(mock_sender_feedback_, OnReceivedRpsi(_, _)).Times(0); - EXPECT_CALL(mock_sender_feedback_, OnReceivedRemb(_)).Times(0); - EXPECT_CALL(mock_sender_feedback_, OnReceivedNackRequest(_)).Times(0); EXPECT_CALL(mock_sender_feedback_, OnReceivedCastFeedback(_)).Times(0); } base::SimpleTestTickClock testing_clock_; + scoped_refptr<test::FakeTaskRunner> task_runner_; + scoped_refptr<CastEnvironment> cast_environment_; LocalRtcpTransport transport_; MockRtcpSenderFeedback mock_sender_feedback_; }; @@ -115,15 +126,15 @@ class RtcpTest : public ::testing::Test { TEST_F(RtcpTest, TimeToSend) { base::TimeTicks start_time; start_time += base::TimeDelta::FromMilliseconds(kStartMillisecond); - Rtcp rtcp(&testing_clock_, + Rtcp rtcp(cast_environment_, &mock_sender_feedback_, &transport_, NULL, NULL, kRtcpCompound, base::TimeDelta::FromMilliseconds(kRtcpIntervalMs), - true, // Media sender. kSenderSsrc, + kReceiverSsrc, kCName); transport_.SetRtcpReceiver(&rtcp); EXPECT_LE(start_time, rtcp.TimeToSendNextRtcpReport()); @@ -136,73 +147,50 @@ TEST_F(RtcpTest, TimeToSend) { } TEST_F(RtcpTest, BasicSenderReport) { - Rtcp rtcp(&testing_clock_, + Rtcp rtcp(cast_environment_, &mock_sender_feedback_, &transport_, NULL, NULL, kRtcpCompound, base::TimeDelta::FromMilliseconds(kRtcpIntervalMs), - true, // Media sender. kSenderSsrc, + kReceiverSsrc, kCName); transport_.SetRtcpReceiver(&rtcp); - rtcp.SendRtcpReport(kUnknownSsrc); + rtcp.SendRtcpFromRtpSender(NULL); } TEST_F(RtcpTest, BasicReceiverReport) { - EXPECT_CALL(mock_sender_feedback_, OnReceivedReportBlock(_)).Times(1); - Rtcp rtcp(&testing_clock_, + Rtcp rtcp(cast_environment_, &mock_sender_feedback_, &transport_, NULL, NULL, kRtcpCompound, base::TimeDelta::FromMilliseconds(kRtcpIntervalMs), - false, // Media receiver. - kSenderSsrc, - kCName); - transport_.SetRtcpReceiver(&rtcp); - rtcp.SetRemoteSSRC(kSenderSsrc); - rtcp.SendRtcpReport(kSenderSsrc); -} - -TEST_F(RtcpTest, BasicPli) { - EXPECT_CALL(mock_sender_feedback_, OnReceivedReportBlock(_)).Times(1); - EXPECT_CALL(mock_sender_feedback_, OnReceivedIntraFrameRequest()).Times(1); - - // Media receiver. - Rtcp rtcp(&testing_clock_, - &mock_sender_feedback_, - &transport_, - NULL, - NULL, - kRtcpReducedSize, - base::TimeDelta::FromMilliseconds(kRtcpIntervalMs), - false, kSenderSsrc, + kReceiverSsrc, kCName); transport_.SetRtcpReceiver(&rtcp); - rtcp.SetRemoteSSRC(kSenderSsrc); - rtcp.SendRtcpPli(kSenderSsrc); + rtcp.SendRtcpFromRtpReceiver(NULL, NULL); } TEST_F(RtcpTest, BasicCast) { EXPECT_CALL(mock_sender_feedback_, OnReceivedCastFeedback(_)).Times(1); // Media receiver. - Rtcp rtcp(&testing_clock_, + Rtcp rtcp(cast_environment_, &mock_sender_feedback_, &transport_, NULL, NULL, kRtcpReducedSize, base::TimeDelta::FromMilliseconds(kRtcpIntervalMs), - false, + kSenderSsrc, kSenderSsrc, kCName); transport_.SetRtcpReceiver(&rtcp); - rtcp.SetRemoteSSRC(kSenderSsrc); RtcpCastMessage cast_message(kSenderSsrc); cast_message.ack_frame_id_ = kAckFrameId; PacketIdSet missing_packets; @@ -212,45 +200,94 @@ TEST_F(RtcpTest, BasicCast) { missing_packets.insert(kLostPacketId1); missing_packets.insert(kLostPacketId2); missing_packets.insert(kLostPacketId3); - cast_message.missing_frames_and_packets_[ - kFrameIdWithLostPackets] = missing_packets; - rtcp.SendRtcpCast(cast_message); + cast_message.missing_frames_and_packets_[kFrameIdWithLostPackets] = + missing_packets; + rtcp.SendRtcpFromRtpReceiver(&cast_message, NULL); } -TEST_F(RtcpTest, Rtt) { +TEST_F(RtcpTest, RttReducedSizeRtcp) { // Media receiver. - LocalRtcpTransport receiver_transport(&testing_clock_); - Rtcp rtcp_receiver(&testing_clock_, + LocalRtcpTransport receiver_transport(cast_environment_, &testing_clock_); + Rtcp rtcp_receiver(cast_environment_, &mock_sender_feedback_, &receiver_transport, NULL, NULL, kRtcpReducedSize, base::TimeDelta::FromMilliseconds(kRtcpIntervalMs), - false, kReceiverSsrc, + kSenderSsrc, kCName); // Media sender. - LocalRtcpTransport sender_transport(&testing_clock_); - Rtcp rtcp_sender(&testing_clock_, + LocalRtcpTransport sender_transport(cast_environment_, &testing_clock_); + Rtcp rtcp_sender(cast_environment_, &mock_sender_feedback_, &sender_transport, NULL, NULL, kRtcpReducedSize, base::TimeDelta::FromMilliseconds(kRtcpIntervalMs), - true, kSenderSsrc, + kReceiverSsrc, kCName); receiver_transport.SetRtcpReceiver(&rtcp_sender); sender_transport.SetRtcpReceiver(&rtcp_receiver); - rtcp_sender.SetRemoteSSRC(kReceiverSsrc); - rtcp_receiver.SetRemoteSSRC(kSenderSsrc); + base::TimeDelta rtt; + base::TimeDelta avg_rtt; + base::TimeDelta min_rtt; + base::TimeDelta max_rtt; + EXPECT_FALSE(rtcp_sender.Rtt(&rtt, &avg_rtt, &min_rtt, &max_rtt)); + EXPECT_FALSE(rtcp_receiver.Rtt(&rtt, &avg_rtt, &min_rtt, &max_rtt)); + + rtcp_sender.SendRtcpFromRtpSender(NULL); + rtcp_receiver.SendRtcpFromRtpReceiver(NULL, NULL); + EXPECT_TRUE(rtcp_sender.Rtt(&rtt, &avg_rtt, &min_rtt, &max_rtt)); + EXPECT_FALSE(rtcp_receiver.Rtt(&rtt, &avg_rtt, &min_rtt, &max_rtt)); + EXPECT_NEAR(2 * kAddedDelay, rtt.InMilliseconds(), 1); + EXPECT_NEAR(2 * kAddedDelay, avg_rtt.InMilliseconds(), 1); + EXPECT_NEAR(2 * kAddedDelay, min_rtt.InMilliseconds(), 1); + EXPECT_NEAR(2 * kAddedDelay, max_rtt.InMilliseconds(), 1); + rtcp_sender.SendRtcpFromRtpSender(NULL); + EXPECT_TRUE(rtcp_receiver.Rtt(&rtt, &avg_rtt, &min_rtt, &max_rtt)); + + EXPECT_NEAR(2 * kAddedDelay, rtt.InMilliseconds(), 1); + EXPECT_NEAR(2 * kAddedDelay, avg_rtt.InMilliseconds(), 1); + EXPECT_NEAR(2 * kAddedDelay, min_rtt.InMilliseconds(), 1); + EXPECT_NEAR(2 * kAddedDelay, max_rtt.InMilliseconds(), 1); +} - EXPECT_CALL(mock_sender_feedback_, OnReceivedReportBlock(_)).Times(2); +TEST_F(RtcpTest, Rtt) { + // Media receiver. + LocalRtcpTransport receiver_transport(cast_environment_, &testing_clock_); + Rtcp rtcp_receiver(cast_environment_, + &mock_sender_feedback_, + &receiver_transport, + NULL, + NULL, + kRtcpCompound, + base::TimeDelta::FromMilliseconds(kRtcpIntervalMs), + kReceiverSsrc, + kSenderSsrc, + kCName); + + // Media sender. + LocalRtcpTransport sender_transport(cast_environment_, &testing_clock_); + Rtcp rtcp_sender(cast_environment_, + &mock_sender_feedback_, + &sender_transport, + NULL, + NULL, + kRtcpCompound, + base::TimeDelta::FromMilliseconds(kRtcpIntervalMs), + kSenderSsrc, + kReceiverSsrc, + kCName); + + receiver_transport.SetRtcpReceiver(&rtcp_sender); + sender_transport.SetRtcpReceiver(&rtcp_receiver); base::TimeDelta rtt; base::TimeDelta avg_rtt; @@ -259,17 +296,17 @@ TEST_F(RtcpTest, Rtt) { EXPECT_FALSE(rtcp_sender.Rtt(&rtt, &avg_rtt, &min_rtt, &max_rtt)); EXPECT_FALSE(rtcp_receiver.Rtt(&rtt, &avg_rtt, &min_rtt, &max_rtt)); - rtcp_sender.SendRtcpReport(kSenderSsrc); - rtcp_receiver.SendRtcpReport(kSenderSsrc); + rtcp_sender.SendRtcpFromRtpSender(NULL); + rtcp_receiver.SendRtcpFromRtpReceiver(NULL, NULL); EXPECT_TRUE(rtcp_sender.Rtt(&rtt, &avg_rtt, &min_rtt, &max_rtt)); EXPECT_FALSE(rtcp_receiver.Rtt(&rtt, &avg_rtt, &min_rtt, &max_rtt)); EXPECT_NEAR(2 * kAddedDelay, rtt.InMilliseconds(), 1); EXPECT_NEAR(2 * kAddedDelay, avg_rtt.InMilliseconds(), 1); EXPECT_NEAR(2 * kAddedDelay, min_rtt.InMilliseconds(), 1); EXPECT_NEAR(2 * kAddedDelay, max_rtt.InMilliseconds(), 1); - rtcp_sender.SendRtcpReport(kSenderSsrc); - EXPECT_TRUE(rtcp_receiver.Rtt(&rtt, &avg_rtt, &min_rtt, &max_rtt)); + rtcp_sender.SendRtcpFromRtpSender(NULL); + EXPECT_TRUE(rtcp_receiver.Rtt(&rtt, &avg_rtt, &min_rtt, &max_rtt)); EXPECT_NEAR(2 * kAddedDelay, rtt.InMilliseconds(), 1); EXPECT_NEAR(2 * kAddedDelay, avg_rtt.InMilliseconds(), 1); EXPECT_NEAR(2 * kAddedDelay, min_rtt.InMilliseconds(), 1); @@ -277,24 +314,90 @@ TEST_F(RtcpTest, Rtt) { receiver_transport.SetShortDelay(); sender_transport.SetShortDelay(); - rtcp_receiver.SendRtcpReport(kSenderSsrc); + rtcp_receiver.SendRtcpFromRtpReceiver(NULL, NULL); EXPECT_TRUE(rtcp_sender.Rtt(&rtt, &avg_rtt, &min_rtt, &max_rtt)); - EXPECT_NEAR(kAddedDelay + kAddedShortDelay, rtt.InMilliseconds(), 1); EXPECT_NEAR((kAddedShortDelay + 3 * kAddedDelay) / 2, avg_rtt.InMilliseconds(), 1); EXPECT_NEAR(kAddedDelay + kAddedShortDelay, min_rtt.InMilliseconds(), 1); EXPECT_NEAR(2 * kAddedDelay, max_rtt.InMilliseconds(), 1); - rtcp_sender.SendRtcpReport(kSenderSsrc); - EXPECT_TRUE(rtcp_receiver.Rtt(&rtt, &avg_rtt, &min_rtt, &max_rtt)); + rtcp_sender.SendRtcpFromRtpSender(NULL); + EXPECT_TRUE(rtcp_receiver.Rtt(&rtt, &avg_rtt, &min_rtt, &max_rtt)); EXPECT_NEAR(2 * kAddedShortDelay, rtt.InMilliseconds(), 1); EXPECT_NEAR((2 * kAddedShortDelay + 2 * kAddedDelay) / 2, avg_rtt.InMilliseconds(), 1); EXPECT_NEAR(2 * kAddedShortDelay, min_rtt.InMilliseconds(), 1); EXPECT_NEAR(2 * kAddedDelay, max_rtt.InMilliseconds(), 1); + + rtcp_receiver.SendRtcpFromRtpReceiver(NULL, NULL); + EXPECT_TRUE(rtcp_sender.Rtt(&rtt, &avg_rtt, &min_rtt, &max_rtt)); + EXPECT_NEAR(2 * kAddedShortDelay, rtt.InMilliseconds(), 1); + EXPECT_NEAR(2 * kAddedShortDelay, min_rtt.InMilliseconds(), 1); + EXPECT_NEAR(2 * kAddedDelay, max_rtt.InMilliseconds(), 1); + + rtcp_receiver.SendRtcpFromRtpReceiver(NULL, NULL); + EXPECT_TRUE(rtcp_sender.Rtt(&rtt, &avg_rtt, &min_rtt, &max_rtt)); + EXPECT_NEAR(2 * kAddedShortDelay, rtt.InMilliseconds(), 1); + EXPECT_NEAR(2 * kAddedShortDelay, min_rtt.InMilliseconds(), 1); + EXPECT_NEAR(2 * kAddedDelay, max_rtt.InMilliseconds(), 1); +} + +TEST_F(RtcpTest, RttWithPacketLoss) { + // Media receiver. + LocalRtcpTransport receiver_transport(cast_environment_, &testing_clock_); + Rtcp rtcp_receiver(cast_environment_, + &mock_sender_feedback_, + &receiver_transport, + NULL, + NULL, + kRtcpReducedSize, + base::TimeDelta::FromMilliseconds(kRtcpIntervalMs), + kSenderSsrc, + kReceiverSsrc, + kCName); + + // Media sender. + LocalRtcpTransport sender_transport(cast_environment_, &testing_clock_); + Rtcp rtcp_sender(cast_environment_, + &mock_sender_feedback_, + &sender_transport, + NULL, + NULL, + kRtcpReducedSize, + base::TimeDelta::FromMilliseconds(kRtcpIntervalMs), + kReceiverSsrc, + kSenderSsrc, + kCName); + + receiver_transport.SetRtcpReceiver(&rtcp_sender); + sender_transport.SetRtcpReceiver(&rtcp_receiver); + + rtcp_receiver.SendRtcpFromRtpReceiver(NULL, NULL); + rtcp_sender.SendRtcpFromRtpSender(NULL); + + base::TimeDelta rtt; + base::TimeDelta avg_rtt; + base::TimeDelta min_rtt; + base::TimeDelta max_rtt; + EXPECT_FALSE(rtcp_sender.Rtt(&rtt, &avg_rtt, &min_rtt, &max_rtt)); + EXPECT_TRUE(rtcp_receiver.Rtt(&rtt, &avg_rtt, &min_rtt, &max_rtt)); + EXPECT_NEAR(2 * kAddedDelay, rtt.InMilliseconds(), 1); + EXPECT_NEAR(2 * kAddedDelay, avg_rtt.InMilliseconds(), 1); + EXPECT_NEAR(2 * kAddedDelay, min_rtt.InMilliseconds(), 1); + EXPECT_NEAR(2 * kAddedDelay, max_rtt.InMilliseconds(), 1); + + receiver_transport.SetShortDelay(); + sender_transport.SetShortDelay(); + receiver_transport.SetDropPackets(true); + + rtcp_receiver.SendRtcpFromRtpReceiver(NULL, NULL); + rtcp_sender.SendRtcpFromRtpSender(NULL); + + EXPECT_TRUE(rtcp_receiver.Rtt(&rtt, &avg_rtt, &min_rtt, &max_rtt)); + EXPECT_NEAR(kAddedDelay + kAddedShortDelay, rtt.InMilliseconds(), 1); } TEST_F(RtcpTest, NtpAndTime) { @@ -313,7 +416,7 @@ TEST_F(RtcpTest, NtpAndTime) { base::TimeTicks out_1 = ConvertNtpToTimeTicks(ntp_seconds_1, ntp_fractions_1); EXPECT_EQ(input_time, out_1); // Verify inverse. - base::TimeDelta time_delta = base::TimeDelta::FromMilliseconds(1100); + base::TimeDelta time_delta = base::TimeDelta::FromMilliseconds(1000); input_time += time_delta; uint32 ntp_seconds_2 = 0; @@ -326,19 +429,33 @@ TEST_F(RtcpTest, NtpAndTime) { // Verify delta. EXPECT_EQ((out_2 - out_1), time_delta); EXPECT_EQ((ntp_seconds_2 - ntp_seconds_1), GG_UINT32_C(1)); - EXPECT_NEAR((ntp_fractions_2 - ntp_fractions_1), 0xffffffff / 10, 1); + EXPECT_NEAR(ntp_fractions_2, ntp_fractions_1, 1); + + time_delta = base::TimeDelta::FromMilliseconds(500); + input_time += time_delta; + + uint32 ntp_seconds_3 = 0; + uint32 ntp_fractions_3 = 0; + + ConvertTimeTicksToNtp(input_time, &ntp_seconds_3, &ntp_fractions_3); + base::TimeTicks out_3 = ConvertNtpToTimeTicks(ntp_seconds_3, ntp_fractions_3); + EXPECT_EQ(input_time, out_3); // Verify inverse. + + // Verify delta. + EXPECT_EQ((out_3 - out_2), time_delta); + EXPECT_NEAR((ntp_fractions_3 - ntp_fractions_2), 0xffffffff / 2, 1); } TEST_F(RtcpTest, WrapAround) { - RtcpPeer rtcp_peer(&testing_clock_, + RtcpPeer rtcp_peer(cast_environment_, &mock_sender_feedback_, NULL, NULL, NULL, kRtcpReducedSize, base::TimeDelta::FromMilliseconds(kRtcpIntervalMs), - false, kReceiverSsrc, + kSenderSsrc, kCName); uint32 new_timestamp = 0; uint32 old_timestamp = 0; @@ -358,15 +475,15 @@ TEST_F(RtcpTest, WrapAround) { } TEST_F(RtcpTest, RtpTimestampInSenderTime) { - RtcpPeer rtcp_peer(&testing_clock_, + RtcpPeer rtcp_peer(cast_environment_, &mock_sender_feedback_, NULL, NULL, NULL, kRtcpReducedSize, base::TimeDelta::FromMilliseconds(kRtcpIntervalMs), - false, kReceiverSsrc, + kSenderSsrc, kCName); int frequency = 32000; uint32 rtp_timestamp = 64000; |