| OLD | NEW |
| 1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include <stdint.h> | 5 #include <stdint.h> |
| 6 | 6 |
| 7 #include "base/test/simple_test_tick_clock.h" | 7 #include "base/test/simple_test_tick_clock.h" |
| 8 #include "media/cast/cast_defines.h" | 8 #include "media/cast/cast_defines.h" |
| 9 #include "media/cast/net/cast_transport_config.h" | 9 #include "media/cast/net/cast_transport_config.h" |
| 10 #include "media/cast/net/cast_transport_sender_impl.h" | |
| 11 #include "media/cast/net/pacing/paced_sender.h" | 10 #include "media/cast/net/pacing/paced_sender.h" |
| 12 #include "media/cast/net/rtcp/rtcp.h" | 11 #include "media/cast/net/rtcp/rtcp.h" |
| 13 #include "media/cast/net/rtcp/test_rtcp_packet_builder.h" | 12 #include "media/cast/test/skewed_tick_clock.h" |
| 14 #include "media/cast/test/fake_single_thread_task_runner.h" | |
| 15 #include "testing/gmock/include/gmock/gmock.h" | 13 #include "testing/gmock/include/gmock/gmock.h" |
| 16 | 14 |
| 17 namespace media { | 15 namespace media { |
| 18 namespace cast { | 16 namespace cast { |
| 19 | 17 |
| 20 using testing::_; | 18 using testing::_; |
| 21 | 19 |
| 22 static const uint32 kSenderSsrc = 0x10203; | 20 static const uint32 kSenderSsrc = 0x10203; |
| 23 static const uint32 kReceiverSsrc = 0x40506; | 21 static const uint32 kReceiverSsrc = 0x40506; |
| 24 static const int64 kAddedDelay = 123; | 22 static const int kInitialReceiverClockOffsetSeconds = -5; |
| 25 static const int64 kAddedShortDelay = 100; | |
| 26 | 23 |
| 27 class RtcpTestPacketSender : public PacketSender { | 24 class FakeRtcpTransport : public PacedPacketSender { |
| 28 public: | 25 public: |
| 29 explicit RtcpTestPacketSender(base::SimpleTestTickClock* testing_clock) | 26 explicit FakeRtcpTransport(base::SimpleTestTickClock* clock) |
| 30 : drop_packets_(false), | 27 : clock_(clock), |
| 31 short_delay_(false), | 28 packet_delay_(base::TimeDelta::FromMilliseconds(42)) {} |
| 32 rtcp_receiver_(NULL), | |
| 33 testing_clock_(testing_clock) {} | |
| 34 virtual ~RtcpTestPacketSender() {} | |
| 35 // Packet lists imply a RTP packet. | |
| 36 void set_rtcp_receiver(Rtcp* rtcp) { rtcp_receiver_ = rtcp; } | |
| 37 | 29 |
| 38 void set_short_delay() { short_delay_ = true; } | 30 void set_rtcp_destination(Rtcp* rtcp) { rtcp_ = rtcp; } |
| 39 | 31 |
| 40 void set_drop_packets(bool drop_packets) { drop_packets_ = drop_packets; } | 32 base::TimeDelta packet_delay() const { return packet_delay_; } |
| 33 void set_packet_delay(base::TimeDelta delay) { packet_delay_ = delay; } |
| 41 | 34 |
| 42 // A singular packet implies a RTCP packet. | 35 virtual bool SendRtcpPacket(uint32 ssrc, PacketRef packet) OVERRIDE { |
| 43 virtual bool SendPacket(PacketRef packet, | 36 clock_->Advance(packet_delay_); |
| 44 const base::Closure& cb) OVERRIDE { | |
| 45 if (short_delay_) { | |
| 46 testing_clock_->Advance( | |
| 47 base::TimeDelta::FromMilliseconds(kAddedShortDelay)); | |
| 48 } else { | |
| 49 testing_clock_->Advance(base::TimeDelta::FromMilliseconds(kAddedDelay)); | |
| 50 } | |
| 51 if (drop_packets_) | |
| 52 return true; | |
| 53 | |
| 54 rtcp_receiver_->IncomingRtcpPacket(&packet->data[0], packet->data.size()); | |
| 55 return true; | |
| 56 } | |
| 57 | |
| 58 private: | |
| 59 bool drop_packets_; | |
| 60 bool short_delay_; | |
| 61 Rtcp* rtcp_receiver_; | |
| 62 base::SimpleTestTickClock* testing_clock_; // Not owned. | |
| 63 | |
| 64 DISALLOW_COPY_AND_ASSIGN(RtcpTestPacketSender); | |
| 65 }; | |
| 66 | |
| 67 class LocalRtcpTransport : public PacedPacketSender { | |
| 68 public: | |
| 69 explicit LocalRtcpTransport(base::SimpleTestTickClock* testing_clock) | |
| 70 : drop_packets_(false), | |
| 71 short_delay_(false), | |
| 72 testing_clock_(testing_clock) {} | |
| 73 | |
| 74 void set_rtcp_receiver(Rtcp* rtcp) { rtcp_ = rtcp; } | |
| 75 | |
| 76 void set_short_delay() { short_delay_ = true; } | |
| 77 | |
| 78 void set_drop_packets(bool drop_packets) { drop_packets_ = drop_packets; } | |
| 79 | |
| 80 virtual bool SendRtcpPacket(uint32 ssrc, | |
| 81 PacketRef packet) OVERRIDE { | |
| 82 if (short_delay_) { | |
| 83 testing_clock_->Advance( | |
| 84 base::TimeDelta::FromMilliseconds(kAddedShortDelay)); | |
| 85 } else { | |
| 86 testing_clock_->Advance(base::TimeDelta::FromMilliseconds(kAddedDelay)); | |
| 87 } | |
| 88 if (drop_packets_) | |
| 89 return true; | |
| 90 | |
| 91 rtcp_->IncomingRtcpPacket(&packet->data[0], packet->data.size()); | 37 rtcp_->IncomingRtcpPacket(&packet->data[0], packet->data.size()); |
| 92 return true; | 38 return true; |
| 93 } | 39 } |
| 94 | 40 |
| 95 virtual bool SendPackets( | 41 virtual bool SendPackets(const SendPacketVector& packets) OVERRIDE { |
| 96 const SendPacketVector& packets) OVERRIDE { | |
| 97 return false; | 42 return false; |
| 98 } | 43 } |
| 99 | 44 |
| 100 virtual bool ResendPackets( | 45 virtual bool ResendPackets( |
| 101 const SendPacketVector& packets, const DedupInfo& dedup_info) OVERRIDE { | 46 const SendPacketVector& packets, const DedupInfo& dedup_info) OVERRIDE { |
| 102 return false; | 47 return false; |
| 103 } | 48 } |
| 104 | 49 |
| 105 virtual void CancelSendingPacket( | 50 virtual void CancelSendingPacket(const PacketKey& packet_key) OVERRIDE { |
| 106 const PacketKey& packet_key) OVERRIDE { | |
| 107 } | 51 } |
| 108 | 52 |
| 109 private: | 53 private: |
| 110 bool drop_packets_; | 54 base::SimpleTestTickClock* const clock_; |
| 111 bool short_delay_; | 55 base::TimeDelta packet_delay_; |
| 112 Rtcp* rtcp_; | 56 Rtcp* rtcp_; |
| 113 base::SimpleTestTickClock* testing_clock_; // Not owned. | |
| 114 | 57 |
| 115 DISALLOW_COPY_AND_ASSIGN(LocalRtcpTransport); | 58 DISALLOW_COPY_AND_ASSIGN(FakeRtcpTransport); |
| 116 }; | 59 }; |
| 117 | 60 |
| 118 class MockReceiverStats : public RtpReceiverStatistics { | 61 class FakeReceiverStats : public RtpReceiverStatistics { |
| 119 public: | 62 public: |
| 120 MockReceiverStats() {} | 63 FakeReceiverStats() {} |
| 121 virtual ~MockReceiverStats() {} | 64 virtual ~FakeReceiverStats() {} |
| 122 | 65 |
| 123 virtual void GetStatistics(uint8* fraction_lost, | 66 virtual void GetStatistics(uint8* fraction_lost, |
| 124 uint32* cumulative_lost, | 67 uint32* cumulative_lost, |
| 125 uint32* extended_high_sequence_number, | 68 uint32* extended_high_sequence_number, |
| 126 uint32* jitter) OVERRIDE { | 69 uint32* jitter) OVERRIDE { |
| 127 *fraction_lost = 0; | 70 *fraction_lost = 0; |
| 128 *cumulative_lost = 0; | 71 *cumulative_lost = 0; |
| 129 *extended_high_sequence_number = 0; | 72 *extended_high_sequence_number = 0; |
| 130 *jitter = 0; | 73 *jitter = 0; |
| 131 } | 74 } |
| 132 | 75 |
| 133 private: | 76 private: |
| 134 DISALLOW_COPY_AND_ASSIGN(MockReceiverStats); | 77 DISALLOW_COPY_AND_ASSIGN(FakeReceiverStats); |
| 135 }; | 78 }; |
| 136 | 79 |
| 137 class MockFrameSender { | 80 class MockFrameSender { |
| 138 public: | 81 public: |
| 139 MockFrameSender() {} | 82 MockFrameSender() {} |
| 140 virtual ~MockFrameSender() {} | 83 virtual ~MockFrameSender() {} |
| 141 | 84 |
| 142 MOCK_METHOD1(OnReceivedCastFeedback, | 85 MOCK_METHOD1(OnReceivedCastFeedback, |
| 143 void(const RtcpCastMessage& cast_message)); | 86 void(const RtcpCastMessage& cast_message)); |
| 144 MOCK_METHOD4(OnReceivedRtt, | 87 MOCK_METHOD1(OnMeasuredRoundTripTime, void(base::TimeDelta rtt)); |
| 145 void(base::TimeDelta rtt, | 88 |
| 146 base::TimeDelta avg_rtt, | |
| 147 base::TimeDelta min_rtt, | |
| 148 base::TimeDelta max_rtt)); | |
| 149 private: | 89 private: |
| 150 DISALLOW_COPY_AND_ASSIGN(MockFrameSender); | 90 DISALLOW_COPY_AND_ASSIGN(MockFrameSender); |
| 151 }; | 91 }; |
| 152 | 92 |
| 153 class RtcpTest : public ::testing::Test { | 93 class RtcpTest : public ::testing::Test { |
| 154 protected: | 94 protected: |
| 155 RtcpTest() | 95 RtcpTest() |
| 156 : testing_clock_(new base::SimpleTestTickClock()), | 96 : sender_clock_(new base::SimpleTestTickClock()), |
| 157 task_runner_( | 97 receiver_clock_(new test::SkewedTickClock(sender_clock_.get())), |
| 158 new test::FakeSingleThreadTaskRunner(testing_clock_.get())), | 98 sender_to_receiver_(sender_clock_.get()), |
| 159 sender_to_receiver_(testing_clock_.get()), | 99 receiver_to_sender_(sender_clock_.get()), |
| 160 receiver_to_sender_(testing_clock_.get()) { | 100 rtcp_for_sender_(base::Bind(&MockFrameSender::OnReceivedCastFeedback, |
| 161 testing_clock_->Advance(base::TimeTicks::Now() - base::TimeTicks()); | 101 base::Unretained(&mock_frame_sender_)), |
| 102 base::Bind(&MockFrameSender::OnMeasuredRoundTripTime, |
| 103 base::Unretained(&mock_frame_sender_)), |
| 104 RtcpLogMessageCallback(), |
| 105 sender_clock_.get(), |
| 106 &sender_to_receiver_, |
| 107 kSenderSsrc, |
| 108 kReceiverSsrc), |
| 109 rtcp_for_receiver_(RtcpCastMessageCallback(), |
| 110 RtcpRttCallback(), |
| 111 RtcpLogMessageCallback(), |
| 112 receiver_clock_.get(), |
| 113 &receiver_to_sender_, |
| 114 kReceiverSsrc, |
| 115 kSenderSsrc) { |
| 116 sender_clock_->Advance(base::TimeTicks::Now() - base::TimeTicks()); |
| 117 receiver_clock_->SetSkew( |
| 118 1.0, // No skew. |
| 119 base::TimeDelta::FromSeconds(kInitialReceiverClockOffsetSeconds)); |
| 120 |
| 121 sender_to_receiver_.set_rtcp_destination(&rtcp_for_receiver_); |
| 122 receiver_to_sender_.set_rtcp_destination(&rtcp_for_sender_); |
| 162 } | 123 } |
| 163 | 124 |
| 164 virtual ~RtcpTest() {} | 125 virtual ~RtcpTest() {} |
| 165 | 126 |
| 166 static void UpdateCastTransportStatus(CastTransportStatus status) { | 127 scoped_ptr<base::SimpleTestTickClock> sender_clock_; |
| 167 bool result = (status == TRANSPORT_AUDIO_INITIALIZED || | 128 scoped_ptr<test::SkewedTickClock> receiver_clock_; |
| 168 status == TRANSPORT_VIDEO_INITIALIZED); | 129 FakeRtcpTransport sender_to_receiver_; |
| 169 EXPECT_TRUE(result); | 130 FakeRtcpTransport receiver_to_sender_; |
| 170 } | |
| 171 | |
| 172 void RunTasks(int during_ms) { | |
| 173 for (int i = 0; i < during_ms; ++i) { | |
| 174 // Call process the timers every 1 ms. | |
| 175 testing_clock_->Advance(base::TimeDelta::FromMilliseconds(1)); | |
| 176 task_runner_->RunTasks(); | |
| 177 } | |
| 178 } | |
| 179 | |
| 180 scoped_ptr<base::SimpleTestTickClock> testing_clock_; | |
| 181 scoped_refptr<test::FakeSingleThreadTaskRunner> task_runner_; | |
| 182 LocalRtcpTransport sender_to_receiver_; | |
| 183 LocalRtcpTransport receiver_to_sender_; | |
| 184 MockFrameSender mock_frame_sender_; | 131 MockFrameSender mock_frame_sender_; |
| 185 MockReceiverStats stats_; | 132 Rtcp rtcp_for_sender_; |
| 133 Rtcp rtcp_for_receiver_; |
| 134 FakeReceiverStats stats_; |
| 186 | 135 |
| 187 DISALLOW_COPY_AND_ASSIGN(RtcpTest); | 136 DISALLOW_COPY_AND_ASSIGN(RtcpTest); |
| 188 }; | 137 }; |
| 189 | 138 |
| 190 TEST_F(RtcpTest, BasicSenderReport) { | 139 TEST_F(RtcpTest, LipSyncGleanedFromSenderReport) { |
| 191 Rtcp rtcp(base::Bind(&MockFrameSender::OnReceivedCastFeedback, | 140 // Initially, expect no lip-sync info receiver-side without having first |
| 192 base::Unretained(&mock_frame_sender_)), | 141 // received a RTCP packet. |
| 193 base::Bind(&MockFrameSender::OnReceivedRtt, | 142 base::TimeTicks reference_time; |
| 194 base::Unretained(&mock_frame_sender_)), | 143 uint32 rtp_timestamp; |
| 195 RtcpLogMessageCallback(), | 144 ASSERT_FALSE(rtcp_for_receiver_.GetLatestLipSyncTimes(&rtp_timestamp, |
| 196 testing_clock_.get(), | 145 &reference_time)); |
| 197 &sender_to_receiver_, | 146 |
| 198 kSenderSsrc, | 147 // Send a Sender Report to the receiver. |
| 199 kReceiverSsrc); | 148 const base::TimeTicks reference_time_sent = sender_clock_->NowTicks(); |
| 200 sender_to_receiver_.set_rtcp_receiver(&rtcp); | 149 const uint32 rtp_timestamp_sent = 0xbee5; |
| 201 rtcp.SendRtcpFromRtpSender(base::TimeTicks(), 0, 1, 1); | 150 rtcp_for_sender_.SendRtcpFromRtpSender( |
| 151 reference_time_sent, rtp_timestamp_sent, 1, 1); |
| 152 |
| 153 // Now the receiver should have lip-sync info. Confirm that the lip-sync |
| 154 // reference time is the same as that sent. |
| 155 EXPECT_TRUE(rtcp_for_receiver_.GetLatestLipSyncTimes(&rtp_timestamp, |
| 156 &reference_time)); |
| 157 const base::TimeTicks rolled_back_time = |
| 158 (reference_time - |
| 159 // Roll-back relative clock offset: |
| 160 base::TimeDelta::FromSeconds(kInitialReceiverClockOffsetSeconds) - |
| 161 // Roll-back packet transmission time (because RTT is not yet known): |
| 162 sender_to_receiver_.packet_delay()); |
| 163 EXPECT_NEAR(0, (reference_time_sent - rolled_back_time).InMicroseconds(), 5); |
| 164 EXPECT_EQ(rtp_timestamp_sent, rtp_timestamp); |
| 202 } | 165 } |
| 203 | 166 |
| 204 TEST_F(RtcpTest, BasicReceiverReport) { | 167 // TODO(miu): There were a few tests here that didn't actually test anything |
| 205 Rtcp rtcp(base::Bind(&MockFrameSender::OnReceivedCastFeedback, | 168 // except that the code wouldn't crash and a callback method was invoked. We |
| 206 base::Unretained(&mock_frame_sender_)), | 169 // need to fill-in more testing of RTCP now that much of the refactoring work |
| 207 base::Bind(&MockFrameSender::OnReceivedRtt, | 170 // has been completed. |
| 208 base::Unretained(&mock_frame_sender_)), | 171 |
| 209 RtcpLogMessageCallback(), | 172 TEST_F(RtcpTest, RoundTripTimesDeterminedFromReportPingPong) { |
| 210 testing_clock_.get(), | 173 const int iterations = 12; |
| 211 &receiver_to_sender_, | 174 EXPECT_CALL(mock_frame_sender_, OnMeasuredRoundTripTime(_)) |
| 212 kSenderSsrc, | 175 .Times(iterations); |
| 213 kReceiverSsrc); | 176 |
| 214 receiver_to_sender_.set_rtcp_receiver(&rtcp); | 177 // Initially, neither side knows the round trip time. |
| 215 rtcp.SendRtcpFromRtpReceiver(NULL, base::TimeDelta(), NULL, &stats_); | 178 ASSERT_EQ(base::TimeDelta(), rtcp_for_sender_.current_round_trip_time()); |
| 179 ASSERT_EQ(base::TimeDelta(), rtcp_for_receiver_.current_round_trip_time()); |
| 180 |
| 181 // Do a number of ping-pongs, checking how the round trip times are measured |
| 182 // by the sender and receiver. |
| 183 base::TimeDelta expected_rtt_according_to_sender; |
| 184 base::TimeDelta expected_rtt_according_to_receiver; |
| 185 for (int i = 0; i < iterations; ++i) { |
| 186 const base::TimeDelta one_way_trip_time = |
| 187 base::TimeDelta::FromMilliseconds(1 << i); |
| 188 sender_to_receiver_.set_packet_delay(one_way_trip_time); |
| 189 receiver_to_sender_.set_packet_delay(one_way_trip_time); |
| 190 |
| 191 // Sender --> Receiver |
| 192 base::TimeTicks reference_time_sent = sender_clock_->NowTicks(); |
| 193 uint32 rtp_timestamp_sent = 0xbee5 + i; |
| 194 rtcp_for_sender_.SendRtcpFromRtpSender( |
| 195 reference_time_sent, rtp_timestamp_sent, 1, 1); |
| 196 EXPECT_EQ(expected_rtt_according_to_sender, |
| 197 rtcp_for_sender_.current_round_trip_time()); |
| 198 #ifdef SENDER_PROVIDES_REPORT_BLOCK |
| 199 EXPECT_EQ(expected_rtt_according_to_receiver, |
| 200 rtcp_for_receiver_.current_round_trip_time()); |
| 201 #endif |
| 202 |
| 203 // Receiver --> Sender |
| 204 rtcp_for_receiver_.SendRtcpFromRtpReceiver( |
| 205 NULL, base::TimeDelta(), NULL, &stats_); |
| 206 expected_rtt_according_to_sender = one_way_trip_time * 2; |
| 207 EXPECT_EQ(expected_rtt_according_to_sender, |
| 208 rtcp_for_sender_.current_round_trip_time()); |
| 209 #ifdef SENDER_PROVIDES_REPORT_BLOCK |
| 210 EXPECT_EQ(expected_rtt_according_to_receiver, |
| 211 rtcp_for_receiver_.current_round_trip_time(); |
| 212 #endif |
| 213 |
| 214 // In the next iteration of this loop, after the receiver gets the sender |
| 215 // report, it will be measuring a round trip time consisting of two |
| 216 // different one-way trip times. |
| 217 expected_rtt_according_to_receiver = |
| 218 (one_way_trip_time + one_way_trip_time * 2) / 2; |
| 219 } |
| 216 } | 220 } |
| 217 | 221 |
| 218 TEST_F(RtcpTest, BasicCast) { | 222 // TODO(miu): Find a better home for this test. |
| 219 EXPECT_CALL(mock_frame_sender_, OnReceivedCastFeedback(_)).Times(1); | 223 TEST(MisplacedCastTest, NtpAndTime) { |
| 220 | |
| 221 // Media sender. | |
| 222 Rtcp rtcp(base::Bind(&MockFrameSender::OnReceivedCastFeedback, | |
| 223 base::Unretained(&mock_frame_sender_)), | |
| 224 base::Bind(&MockFrameSender::OnReceivedRtt, | |
| 225 base::Unretained(&mock_frame_sender_)), | |
| 226 RtcpLogMessageCallback(), | |
| 227 testing_clock_.get(), | |
| 228 &receiver_to_sender_, | |
| 229 kSenderSsrc, | |
| 230 kSenderSsrc); | |
| 231 receiver_to_sender_.set_rtcp_receiver(&rtcp); | |
| 232 RtcpCastMessage cast_message(kSenderSsrc); | |
| 233 cast_message.ack_frame_id = kAckFrameId; | |
| 234 PacketIdSet missing_packets; | |
| 235 cast_message.missing_frames_and_packets[kLostFrameId] = missing_packets; | |
| 236 | |
| 237 missing_packets.insert(kLostPacketId1); | |
| 238 missing_packets.insert(kLostPacketId2); | |
| 239 missing_packets.insert(kLostPacketId3); | |
| 240 cast_message.missing_frames_and_packets[kFrameIdWithLostPackets] = | |
| 241 missing_packets; | |
| 242 rtcp.SendRtcpFromRtpReceiver(&cast_message, base::TimeDelta(), NULL, NULL); | |
| 243 } | |
| 244 | |
| 245 TEST_F(RtcpTest, RttReducedSizeRtcp) { | |
| 246 // Media receiver. | |
| 247 Rtcp rtcp_receiver(RtcpCastMessageCallback(), | |
| 248 RtcpRttCallback(), | |
| 249 RtcpLogMessageCallback(), | |
| 250 testing_clock_.get(), | |
| 251 &receiver_to_sender_, | |
| 252 kReceiverSsrc, | |
| 253 kSenderSsrc); | |
| 254 | |
| 255 // Media sender. | |
| 256 Rtcp rtcp_sender(base::Bind(&MockFrameSender::OnReceivedCastFeedback, | |
| 257 base::Unretained(&mock_frame_sender_)), | |
| 258 base::Bind(&MockFrameSender::OnReceivedRtt, | |
| 259 base::Unretained(&mock_frame_sender_)), | |
| 260 RtcpLogMessageCallback(), | |
| 261 testing_clock_.get(), | |
| 262 &sender_to_receiver_, | |
| 263 kSenderSsrc, | |
| 264 kReceiverSsrc); | |
| 265 | |
| 266 sender_to_receiver_.set_rtcp_receiver(&rtcp_receiver); | |
| 267 receiver_to_sender_.set_rtcp_receiver(&rtcp_sender); | |
| 268 | |
| 269 base::TimeDelta rtt; | |
| 270 base::TimeDelta avg_rtt; | |
| 271 base::TimeDelta min_rtt; | |
| 272 base::TimeDelta max_rtt; | |
| 273 EXPECT_FALSE(rtcp_sender.Rtt(&rtt, &avg_rtt, &min_rtt, &max_rtt)); | |
| 274 | |
| 275 rtcp_sender.SendRtcpFromRtpSender(testing_clock_->NowTicks(), 1, 1, 1); | |
| 276 RunTasks(33); | |
| 277 rtcp_receiver.SendRtcpFromRtpReceiver(NULL, base::TimeDelta(), NULL, &stats_); | |
| 278 EXPECT_TRUE(rtcp_sender.Rtt(&rtt, &avg_rtt, &min_rtt, &max_rtt)); | |
| 279 rtcp_sender.SendRtcpFromRtpSender(testing_clock_->NowTicks(), 2, 1, 1); | |
| 280 RunTasks(33); | |
| 281 } | |
| 282 | |
| 283 TEST_F(RtcpTest, Rtt) { | |
| 284 // Media receiver. | |
| 285 Rtcp rtcp_receiver(RtcpCastMessageCallback(), | |
| 286 RtcpRttCallback(), | |
| 287 RtcpLogMessageCallback(), | |
| 288 testing_clock_.get(), | |
| 289 &receiver_to_sender_, | |
| 290 kReceiverSsrc, | |
| 291 kSenderSsrc); | |
| 292 | |
| 293 // Media sender. | |
| 294 Rtcp rtcp_sender(base::Bind(&MockFrameSender::OnReceivedCastFeedback, | |
| 295 base::Unretained(&mock_frame_sender_)), | |
| 296 base::Bind(&MockFrameSender::OnReceivedRtt, | |
| 297 base::Unretained(&mock_frame_sender_)), | |
| 298 RtcpLogMessageCallback(), | |
| 299 testing_clock_.get(), | |
| 300 &sender_to_receiver_, | |
| 301 kSenderSsrc, | |
| 302 kReceiverSsrc); | |
| 303 | |
| 304 receiver_to_sender_.set_rtcp_receiver(&rtcp_sender); | |
| 305 sender_to_receiver_.set_rtcp_receiver(&rtcp_receiver); | |
| 306 | |
| 307 base::TimeDelta rtt; | |
| 308 base::TimeDelta avg_rtt; | |
| 309 base::TimeDelta min_rtt; | |
| 310 base::TimeDelta max_rtt; | |
| 311 EXPECT_FALSE(rtcp_sender.Rtt(&rtt, &avg_rtt, &min_rtt, &max_rtt)); | |
| 312 | |
| 313 rtcp_sender.SendRtcpFromRtpSender(testing_clock_->NowTicks(), 1, 1, 1); | |
| 314 RunTasks(33); | |
| 315 rtcp_receiver.SendRtcpFromRtpReceiver(NULL, base::TimeDelta(), NULL, &stats_); | |
| 316 | |
| 317 EXPECT_TRUE(rtcp_sender.Rtt(&rtt, &avg_rtt, &min_rtt, &max_rtt)); | |
| 318 RunTasks(33); | |
| 319 | |
| 320 RunTasks(33); | |
| 321 | |
| 322 EXPECT_NEAR(2 * kAddedDelay, rtt.InMilliseconds(), 2); | |
| 323 EXPECT_NEAR(2 * kAddedDelay, avg_rtt.InMilliseconds(), 2); | |
| 324 EXPECT_NEAR(2 * kAddedDelay, min_rtt.InMilliseconds(), 2); | |
| 325 EXPECT_NEAR(2 * kAddedDelay, max_rtt.InMilliseconds(), 2); | |
| 326 | |
| 327 rtcp_sender.SendRtcpFromRtpSender(testing_clock_->NowTicks(), 2, 1, 1); | |
| 328 RunTasks(33); | |
| 329 | |
| 330 receiver_to_sender_.set_short_delay(); | |
| 331 sender_to_receiver_.set_short_delay(); | |
| 332 rtcp_receiver.SendRtcpFromRtpReceiver(NULL, base::TimeDelta(), NULL, &stats_); | |
| 333 EXPECT_TRUE(rtcp_sender.Rtt(&rtt, &avg_rtt, &min_rtt, &max_rtt)); | |
| 334 EXPECT_NEAR(kAddedDelay + kAddedShortDelay, rtt.InMilliseconds(), 2); | |
| 335 EXPECT_NEAR( | |
| 336 (kAddedShortDelay + 3 * kAddedDelay) / 2, avg_rtt.InMilliseconds(), 2); | |
| 337 EXPECT_NEAR(kAddedDelay + kAddedShortDelay, min_rtt.InMilliseconds(), 2); | |
| 338 EXPECT_NEAR(2 * kAddedDelay, max_rtt.InMilliseconds(), 2); | |
| 339 | |
| 340 rtcp_sender.SendRtcpFromRtpSender(testing_clock_->NowTicks(), 3, 1, 1); | |
| 341 RunTasks(33); | |
| 342 | |
| 343 rtcp_receiver.SendRtcpFromRtpReceiver(NULL, base::TimeDelta(), NULL, &stats_); | |
| 344 EXPECT_TRUE(rtcp_sender.Rtt(&rtt, &avg_rtt, &min_rtt, &max_rtt)); | |
| 345 EXPECT_NEAR(2 * kAddedShortDelay, rtt.InMilliseconds(), 2); | |
| 346 EXPECT_NEAR(2 * kAddedShortDelay, min_rtt.InMilliseconds(), 2); | |
| 347 EXPECT_NEAR(2 * kAddedDelay, max_rtt.InMilliseconds(), 2); | |
| 348 | |
| 349 rtcp_receiver.SendRtcpFromRtpReceiver(NULL, base::TimeDelta(), NULL, &stats_); | |
| 350 EXPECT_TRUE(rtcp_sender.Rtt(&rtt, &avg_rtt, &min_rtt, &max_rtt)); | |
| 351 EXPECT_NEAR(2 * kAddedShortDelay, rtt.InMilliseconds(), 2); | |
| 352 EXPECT_NEAR(2 * kAddedShortDelay, min_rtt.InMilliseconds(), 2); | |
| 353 EXPECT_NEAR(2 * kAddedDelay, max_rtt.InMilliseconds(), 2); | |
| 354 } | |
| 355 | |
| 356 TEST_F(RtcpTest, RttWithPacketLoss) { | |
| 357 // Media receiver. | |
| 358 Rtcp rtcp_receiver(RtcpCastMessageCallback(), | |
| 359 RtcpRttCallback(), | |
| 360 RtcpLogMessageCallback(), | |
| 361 testing_clock_.get(), | |
| 362 &receiver_to_sender_, | |
| 363 kReceiverSsrc, | |
| 364 kSenderSsrc); | |
| 365 | |
| 366 // Media sender. | |
| 367 Rtcp rtcp_sender(base::Bind(&MockFrameSender::OnReceivedCastFeedback, | |
| 368 base::Unretained(&mock_frame_sender_)), | |
| 369 base::Bind(&MockFrameSender::OnReceivedRtt, | |
| 370 base::Unretained(&mock_frame_sender_)), | |
| 371 RtcpLogMessageCallback(), | |
| 372 testing_clock_.get(), | |
| 373 &sender_to_receiver_, | |
| 374 kSenderSsrc, | |
| 375 kReceiverSsrc); | |
| 376 | |
| 377 receiver_to_sender_.set_rtcp_receiver(&rtcp_sender); | |
| 378 sender_to_receiver_.set_rtcp_receiver(&rtcp_receiver); | |
| 379 | |
| 380 rtcp_receiver.SendRtcpFromRtpReceiver(NULL, base::TimeDelta(), NULL, &stats_); | |
| 381 rtcp_sender.SendRtcpFromRtpSender(testing_clock_->NowTicks(), 0, 1, 1); | |
| 382 RunTasks(33); | |
| 383 | |
| 384 base::TimeDelta rtt; | |
| 385 base::TimeDelta avg_rtt; | |
| 386 base::TimeDelta min_rtt; | |
| 387 base::TimeDelta max_rtt; | |
| 388 EXPECT_FALSE(rtcp_sender.Rtt(&rtt, &avg_rtt, &min_rtt, &max_rtt)); | |
| 389 | |
| 390 receiver_to_sender_.set_short_delay(); | |
| 391 sender_to_receiver_.set_short_delay(); | |
| 392 receiver_to_sender_.set_drop_packets(true); | |
| 393 | |
| 394 rtcp_receiver.SendRtcpFromRtpReceiver(NULL, base::TimeDelta(), NULL, &stats_); | |
| 395 rtcp_sender.SendRtcpFromRtpSender(testing_clock_->NowTicks(), 1, 1, 1); | |
| 396 RunTasks(33); | |
| 397 | |
| 398 } | |
| 399 | |
| 400 TEST_F(RtcpTest, NtpAndTime) { | |
| 401 const int64 kSecondsbetweenYear1900and2010 = INT64_C(40176 * 24 * 60 * 60); | 224 const int64 kSecondsbetweenYear1900and2010 = INT64_C(40176 * 24 * 60 * 60); |
| 402 const int64 kSecondsbetweenYear1900and2030 = INT64_C(47481 * 24 * 60 * 60); | 225 const int64 kSecondsbetweenYear1900and2030 = INT64_C(47481 * 24 * 60 * 60); |
| 403 | 226 |
| 404 uint32 ntp_seconds_1 = 0; | 227 uint32 ntp_seconds_1 = 0; |
| 405 uint32 ntp_fraction_1 = 0; | 228 uint32 ntp_fraction_1 = 0; |
| 406 base::TimeTicks input_time = base::TimeTicks::Now(); | 229 base::TimeTicks input_time = base::TimeTicks::Now(); |
| 407 ConvertTimeTicksToNtp(input_time, &ntp_seconds_1, &ntp_fraction_1); | 230 ConvertTimeTicksToNtp(input_time, &ntp_seconds_1, &ntp_fraction_1); |
| 408 | 231 |
| 409 // Verify absolute value. | 232 // Verify absolute value. |
| 410 EXPECT_GT(ntp_seconds_1, kSecondsbetweenYear1900and2010); | 233 EXPECT_GT(ntp_seconds_1, kSecondsbetweenYear1900and2010); |
| (...skipping 27 matching lines...) Expand all Loading... |
| 438 base::TimeTicks out_3 = ConvertNtpToTimeTicks(ntp_seconds_3, ntp_fraction_3); | 261 base::TimeTicks out_3 = ConvertNtpToTimeTicks(ntp_seconds_3, ntp_fraction_3); |
| 439 EXPECT_EQ(input_time, out_3); // Verify inverse. | 262 EXPECT_EQ(input_time, out_3); // Verify inverse. |
| 440 | 263 |
| 441 // Verify delta. | 264 // Verify delta. |
| 442 EXPECT_EQ((out_3 - out_2), time_delta); | 265 EXPECT_EQ((out_3 - out_2), time_delta); |
| 443 EXPECT_NEAR((ntp_fraction_3 - ntp_fraction_2), 0xffffffff / 2, 1); | 266 EXPECT_NEAR((ntp_fraction_3 - ntp_fraction_2), 0xffffffff / 2, 1); |
| 444 } | 267 } |
| 445 | 268 |
| 446 } // namespace cast | 269 } // namespace cast |
| 447 } // namespace media | 270 } // namespace media |
| OLD | NEW |