1 // Copyright 2013 The Chromium Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 #include "base/memory/scoped_ptr.h" 6 #include "base/test/simple_test_tick_clock.h" 7 #include "media/cast/cast_environment.h" 8 #include "media/cast/rtcp/mock_rtcp_receiver_feedback.h" 9 #include "media/cast/rtcp/mock_rtcp_sender_feedback.h" 10 #include "media/cast/rtcp/rtcp_receiver.h" 11 #include "media/cast/rtcp/rtcp_utility.h" 12 #include "media/cast/rtcp/test_rtcp_packet_builder.h" 13 #include "media/cast/test/fake_single_thread_task_runner.h" 14 #include "media/cast/transport/cast_transport_defines.h" 15 #include "testing/gmock/include/gmock/gmock.h" 16 17 namespace media { 18 namespace cast { 19 20 using testing::_; 21 22 static const uint32 kSenderSsrc = 0x10203; 23 static const uint32 kSourceSsrc = 0x40506; 24 static const uint32 kUnknownSsrc = 0xDEAD; 25 static const uint16 kTargetDelayMs = 100; 26 static const std::string kCName("test (at) 10.1.1.1"); 27 28 namespace { 29 class SenderFeedbackCastVerification : public RtcpSenderFeedback { 30 public: 31 SenderFeedbackCastVerification() : called_(false) {} 32 33 virtual void OnReceivedCastFeedback(const RtcpCastMessage& cast_feedback) 34 OVERRIDE { 35 EXPECT_EQ(cast_feedback.media_ssrc_, kSenderSsrc); 36 EXPECT_EQ(cast_feedback.ack_frame_id_, kAckFrameId); 37 38 MissingFramesAndPacketsMap::const_iterator frame_it = 39 cast_feedback.missing_frames_and_packets_.begin(); 40 41 EXPECT_TRUE(frame_it != cast_feedback.missing_frames_and_packets_.end()); 42 EXPECT_EQ(kLostFrameId, frame_it->first); 43 EXPECT_EQ(frame_it->second.size(), 1UL); 44 EXPECT_EQ(*frame_it->second.begin(), kRtcpCastAllPacketsLost); 45 ++frame_it; 46 EXPECT_TRUE(frame_it != cast_feedback.missing_frames_and_packets_.end()); 47 EXPECT_EQ(kFrameIdWithLostPackets, frame_it->first); 48 EXPECT_EQ(3UL, frame_it->second.size()); 49 PacketIdSet::const_iterator packet_it = frame_it->second.begin(); 50 EXPECT_EQ(kLostPacketId1, *packet_it); 51 ++packet_it; 52 EXPECT_EQ(kLostPacketId2, *packet_it); 53 ++packet_it; 54 EXPECT_EQ(kLostPacketId3, *packet_it); 55 ++frame_it; 56 EXPECT_EQ(frame_it, cast_feedback.missing_frames_and_packets_.end()); 57 called_ = true; 58 } 59 60 bool called() const { return called_; } 61 62 private: 63 bool called_; 64 65 DISALLOW_COPY_AND_ASSIGN(SenderFeedbackCastVerification); 66 }; 67 68 class RtcpReceiverCastLogVerification : public RtcpReceiverFeedback { 69 public: 70 RtcpReceiverCastLogVerification() 71 : called_on_received_sender_log_(false), 72 called_on_received_receiver_log_(false) {} 73 74 virtual void OnReceivedSenderReport( 75 const transport::RtcpSenderInfo& remote_sender_info) OVERRIDE{}; 76 77 virtual void OnReceiverReferenceTimeReport( 78 const RtcpReceiverReferenceTimeReport& remote_time_report) OVERRIDE{}; 79 80 virtual void OnReceivedSendReportRequest() OVERRIDE{}; 81 82 virtual void OnReceivedReceiverLog(const RtcpReceiverLogMessage& receiver_log) 83 OVERRIDE { 84 EXPECT_EQ(expected_receiver_log_.size(), receiver_log.size()); 85 RtcpReceiverLogMessage::const_iterator expected_it = 86 expected_receiver_log_.begin(); 87 RtcpReceiverLogMessage::const_iterator incoming_it = receiver_log.begin(); 88 for (; incoming_it != receiver_log.end(); ++incoming_it) { 89 EXPECT_EQ(expected_it->rtp_timestamp_, incoming_it->rtp_timestamp_); 90 EXPECT_EQ(expected_it->event_log_messages_.size(), 91 incoming_it->event_log_messages_.size()); 92 93 RtcpReceiverEventLogMessages::const_iterator event_incoming_it = 94 incoming_it->event_log_messages_.begin(); 95 RtcpReceiverEventLogMessages::const_iterator event_expected_it = 96 expected_it->event_log_messages_.begin(); 97 for (; event_incoming_it != incoming_it->event_log_messages_.end(); 98 ++event_incoming_it, ++event_expected_it) { 99 EXPECT_EQ(event_expected_it->type, event_incoming_it->type); 100 EXPECT_EQ(event_expected_it->event_timestamp, 101 event_incoming_it->event_timestamp); 102 if (event_expected_it->type == PACKET_RECEIVED) { 103 EXPECT_EQ(event_expected_it->packet_id, event_incoming_it->packet_id); 104 } else { 105 EXPECT_EQ(event_expected_it->delay_delta, 106 event_incoming_it->delay_delta); 107 } 108 } 109 expected_receiver_log_.pop_front(); 110 expected_it = expected_receiver_log_.begin(); 111 } 112 called_on_received_receiver_log_ = true; 113 } 114 115 bool OnReceivedReceiverLogCalled() { 116 return called_on_received_receiver_log_ && expected_receiver_log_.empty(); 117 } 118 119 void SetExpectedReceiverLog(const RtcpReceiverLogMessage& receiver_log) { 120 expected_receiver_log_ = receiver_log; 121 } 122 123 private: 124 RtcpReceiverLogMessage expected_receiver_log_; 125 bool called_on_received_sender_log_; 126 bool called_on_received_receiver_log_; 127 128 DISALLOW_COPY_AND_ASSIGN(RtcpReceiverCastLogVerification); 129 }; 130 131 } // namespace 132 133 class RtcpReceiverTest : public ::testing::Test { 134 protected: 135 RtcpReceiverTest() 136 : testing_clock_(new base::SimpleTestTickClock()), 137 task_runner_(new test::FakeSingleThreadTaskRunner(testing_clock_)), 138 cast_environment_(new CastEnvironment( 139 scoped_ptr<base::TickClock>(testing_clock_).Pass(), 140 task_runner_, 141 task_runner_, 142 task_runner_)), 143 rtcp_receiver_(new RtcpReceiver(cast_environment_, 144 &mock_sender_feedback_, 145 &mock_receiver_feedback_, 146 &mock_rtt_feedback_, 147 kSourceSsrc)) { 148 EXPECT_CALL(mock_receiver_feedback_, OnReceivedSenderReport(_)).Times(0); 149 EXPECT_CALL(mock_receiver_feedback_, OnReceiverReferenceTimeReport(_)) 150 .Times(0); 151 EXPECT_CALL(mock_receiver_feedback_, OnReceivedSendReportRequest()) 152 .Times(0); 153 EXPECT_CALL(mock_sender_feedback_, OnReceivedCastFeedback(_)).Times(0); 154 EXPECT_CALL(mock_rtt_feedback_, OnReceivedDelaySinceLastReport(_, _, _)) 155 .Times(0); 156 157 expected_sender_info_.ntp_seconds = kNtpHigh; 158 expected_sender_info_.ntp_fraction = kNtpLow; 159 expected_sender_info_.rtp_timestamp = kRtpTimestamp; 160 expected_sender_info_.send_packet_count = kSendPacketCount; 161 expected_sender_info_.send_octet_count = kSendOctetCount; 162 163 expected_report_block_.remote_ssrc = kSenderSsrc; 164 expected_report_block_.media_ssrc = kSourceSsrc; 165 expected_report_block_.fraction_lost = kLoss >> 24; 166 expected_report_block_.cumulative_lost = kLoss & 0xffffff; 167 expected_report_block_.extended_high_sequence_number = kExtendedMax; 168 expected_report_block_.jitter = kTestJitter; 169 expected_report_block_.last_sr = kLastSr; 170 expected_report_block_.delay_since_last_sr = kDelayLastSr; 171 expected_receiver_reference_report_.remote_ssrc = kSenderSsrc; 172 expected_receiver_reference_report_.ntp_seconds = kNtpHigh; 173 expected_receiver_reference_report_.ntp_fraction = kNtpLow; 174 } 175 176 virtual ~RtcpReceiverTest() {} 177 178 // Injects an RTCP packet into the receiver. 179 void InjectRtcpPacket(const uint8* packet, uint16 length) { 180 RtcpParser rtcp_parser(packet, length); 181 rtcp_receiver_->IncomingRtcpPacket(&rtcp_parser); 182 } 183 184 base::SimpleTestTickClock* testing_clock_; // Owned by CastEnvironment. 185 scoped_refptr<test::FakeSingleThreadTaskRunner> task_runner_; 186 scoped_refptr<CastEnvironment> cast_environment_; 187 MockRtcpReceiverFeedback mock_receiver_feedback_; 188 MockRtcpRttFeedback mock_rtt_feedback_; 189 MockRtcpSenderFeedback mock_sender_feedback_; 190 scoped_ptr<RtcpReceiver> rtcp_receiver_; 191 transport::RtcpSenderInfo expected_sender_info_; 192 transport::RtcpReportBlock expected_report_block_; 193 RtcpReceiverReferenceTimeReport expected_receiver_reference_report_; 194 195 DISALLOW_COPY_AND_ASSIGN(RtcpReceiverTest); 196 }; 197 198 TEST_F(RtcpReceiverTest, BrokenPacketIsIgnored) { 199 const uint8 bad_packet[] = {0, 0, 0, 0}; 200 InjectRtcpPacket(bad_packet, sizeof(bad_packet)); 201 } 202 203 TEST_F(RtcpReceiverTest, InjectSenderReportPacket) { 204 TestRtcpPacketBuilder p; 205 p.AddSr(kSenderSsrc, 0); 206 207 // Expected to be ignored since the sender ssrc does not match our 208 // remote ssrc. 209 InjectRtcpPacket(p.Data(), p.Length()); 210 211 EXPECT_CALL(mock_receiver_feedback_, 212 OnReceivedSenderReport(expected_sender_info_)).Times(1); 213 rtcp_receiver_->SetRemoteSSRC(kSenderSsrc); 214 215 // Expected to be pass through since the sender ssrc match our remote ssrc. 216 InjectRtcpPacket(p.Data(), p.Length()); 217 } 218 219 TEST_F(RtcpReceiverTest, InjectReceiveReportPacket) { 220 TestRtcpPacketBuilder p1; 221 p1.AddRr(kSenderSsrc, 1); 222 p1.AddRb(kUnknownSsrc); 223 224 // Expected to be ignored since the source ssrc does not match our 225 // local ssrc. 226 InjectRtcpPacket(p1.Data(), p1.Length()); 227 228 EXPECT_CALL(mock_rtt_feedback_, 229 OnReceivedDelaySinceLastReport( 230 kSourceSsrc, kLastSr, kDelayLastSr)).Times(1); 231 232 TestRtcpPacketBuilder p2; 233 p2.AddRr(kSenderSsrc, 1); 234 p2.AddRb(kSourceSsrc); 235 236 // Expected to be pass through since the sender ssrc match our local ssrc. 237 InjectRtcpPacket(p2.Data(), p2.Length()); 238 } 239 240 TEST_F(RtcpReceiverTest, InjectSenderReportWithReportBlockPacket) { 241 TestRtcpPacketBuilder p1; 242 p1.AddSr(kSenderSsrc, 1); 243 p1.AddRb(kUnknownSsrc); 244 245 // Sender report expected to be ignored since the sender ssrc does not match 246 // our remote ssrc. 247 // Report block expected to be ignored since the source ssrc does not match 248 // our local ssrc. 249 InjectRtcpPacket(p1.Data(), p1.Length()); 250 251 EXPECT_CALL(mock_receiver_feedback_, 252 OnReceivedSenderReport(expected_sender_info_)).Times(1); 253 rtcp_receiver_->SetRemoteSSRC(kSenderSsrc); 254 255 // Sender report expected to be pass through since the sender ssrc match our 256 // remote ssrc. 257 // Report block expected to be ignored since the source ssrc does not match 258 // our local ssrc. 259 InjectRtcpPacket(p1.Data(), p1.Length()); 260 261 EXPECT_CALL(mock_receiver_feedback_, OnReceivedSenderReport(_)).Times(0); 262 EXPECT_CALL(mock_rtt_feedback_, 263 OnReceivedDelaySinceLastReport( 264 kSourceSsrc, kLastSr, kDelayLastSr)).Times(1); 265 266 rtcp_receiver_->SetRemoteSSRC(0); 267 268 TestRtcpPacketBuilder p2; 269 p2.AddSr(kSenderSsrc, 1); 270 p2.AddRb(kSourceSsrc); 271 272 // Sender report expected to be ignored since the sender ssrc does not match 273 // our remote ssrc. 274 // Receiver report expected to be pass through since the sender ssrc match 275 // our local ssrc. 276 InjectRtcpPacket(p2.Data(), p2.Length()); 277 278 EXPECT_CALL(mock_receiver_feedback_, 279 OnReceivedSenderReport(expected_sender_info_)).Times(1); 280 EXPECT_CALL(mock_rtt_feedback_, 281 OnReceivedDelaySinceLastReport( 282 kSourceSsrc, kLastSr, kDelayLastSr)).Times(1); 283 284 rtcp_receiver_->SetRemoteSSRC(kSenderSsrc); 285 286 // Sender report expected to be pass through since the sender ssrc match our 287 // remote ssrc. 288 // Receiver report expected to be pass through since the sender ssrc match 289 // our local ssrc. 290 InjectRtcpPacket(p2.Data(), p2.Length()); 291 } 292 293 TEST_F(RtcpReceiverTest, InjectSenderReportPacketWithDlrr) { 294 TestRtcpPacketBuilder p; 295 p.AddSr(kSenderSsrc, 0); 296 p.AddXrHeader(kSenderSsrc); 297 p.AddXrUnknownBlock(); 298 p.AddXrExtendedDlrrBlock(kSenderSsrc); 299 p.AddXrUnknownBlock(); 300 p.AddSdesCname(kSenderSsrc, kCName); 301 302 // Expected to be ignored since the source ssrc does not match our 303 // local ssrc. 304 InjectRtcpPacket(p.Data(), p.Length()); 305 306 EXPECT_CALL(mock_receiver_feedback_, 307 OnReceivedSenderReport(expected_sender_info_)).Times(1); 308 EXPECT_CALL(mock_rtt_feedback_, 309 OnReceivedDelaySinceLastReport( 310 kSenderSsrc, kLastSr, kDelayLastSr)).Times(1); 311 312 // Enable receiving sender report. 313 rtcp_receiver_->SetRemoteSSRC(kSenderSsrc); 314 315 // Expected to be pass through since the sender ssrc match our local ssrc. 316 InjectRtcpPacket(p.Data(), p.Length()); 317 } 318 319 TEST_F(RtcpReceiverTest, InjectReceiverReportPacketWithRrtr) { 320 TestRtcpPacketBuilder p1; 321 p1.AddRr(kSenderSsrc, 1); 322 p1.AddRb(kUnknownSsrc); 323 p1.AddXrHeader(kSenderSsrc); 324 p1.AddXrRrtrBlock(); 325 326 // Expected to be ignored since the source ssrc does not match our 327 // local ssrc. 328 InjectRtcpPacket(p1.Data(), p1.Length()); 329 330 EXPECT_CALL(mock_rtt_feedback_, 331 OnReceivedDelaySinceLastReport( 332 kSourceSsrc, kLastSr, kDelayLastSr)).Times(1); 333 EXPECT_CALL(mock_receiver_feedback_, 334 OnReceiverReferenceTimeReport( 335 expected_receiver_reference_report_)).Times(1); 336 337 // Enable receiving reference time report. 338 rtcp_receiver_->SetRemoteSSRC(kSenderSsrc); 339 340 TestRtcpPacketBuilder p2; 341 p2.AddRr(kSenderSsrc, 1); 342 p2.AddRb(kSourceSsrc); 343 p2.AddXrHeader(kSenderSsrc); 344 p2.AddXrRrtrBlock(); 345 346 // Expected to be pass through since the sender ssrc match our local ssrc. 347 InjectRtcpPacket(p2.Data(), p2.Length()); 348 } 349 350 TEST_F(RtcpReceiverTest, InjectReceiverReportPacketWithIntraFrameRequest) { 351 TestRtcpPacketBuilder p1; 352 p1.AddRr(kSenderSsrc, 1); 353 p1.AddRb(kUnknownSsrc); 354 p1.AddPli(kSenderSsrc, kUnknownSsrc); 355 356 // Expected to be ignored since the source ssrc does not match our 357 // local ssrc. 358 InjectRtcpPacket(p1.Data(), p1.Length()); 359 360 EXPECT_CALL(mock_rtt_feedback_, 361 OnReceivedDelaySinceLastReport( 362 kSourceSsrc, kLastSr, kDelayLastSr)).Times(1); 363 364 TestRtcpPacketBuilder p2; 365 p2.AddRr(kSenderSsrc, 1); 366 p2.AddRb(kSourceSsrc); 367 p2.AddPli(kSenderSsrc, kSourceSsrc); 368 369 // Expected to be pass through since the sender ssrc match our local ssrc. 370 InjectRtcpPacket(p2.Data(), p2.Length()); 371 } 372 373 TEST_F(RtcpReceiverTest, InjectReceiverReportPacketWithCastFeedback) { 374 TestRtcpPacketBuilder p1; 375 p1.AddRr(kSenderSsrc, 1); 376 p1.AddRb(kUnknownSsrc); 377 p1.AddCast(kSenderSsrc, kUnknownSsrc, kTargetDelayMs); 378 379 // Expected to be ignored since the source ssrc does not match our 380 // local ssrc. 381 InjectRtcpPacket(p1.Data(), p1.Length()); 382 383 EXPECT_CALL(mock_rtt_feedback_, 384 OnReceivedDelaySinceLastReport( 385 kSourceSsrc, kLastSr, kDelayLastSr)).Times(1); 386 EXPECT_CALL(mock_sender_feedback_, OnReceivedCastFeedback(_)).Times(1); 387 388 // Enable receiving the cast feedback. 389 rtcp_receiver_->SetRemoteSSRC(kSenderSsrc); 390 391 TestRtcpPacketBuilder p2; 392 p2.AddRr(kSenderSsrc, 1); 393 p2.AddRb(kSourceSsrc); 394 p2.AddCast(kSenderSsrc, kSourceSsrc, kTargetDelayMs); 395 396 // Expected to be pass through since the sender ssrc match our local ssrc. 397 InjectRtcpPacket(p2.Data(), p2.Length()); 398 } 399 400 TEST_F(RtcpReceiverTest, InjectReceiverReportPacketWithCastVerification) { 401 SenderFeedbackCastVerification sender_feedback_cast_verification; 402 RtcpReceiver rtcp_receiver(cast_environment_, 403 &sender_feedback_cast_verification, 404 &mock_receiver_feedback_, 405 &mock_rtt_feedback_, 406 kSourceSsrc); 407 408 EXPECT_CALL(mock_rtt_feedback_, 409 OnReceivedDelaySinceLastReport( 410 kSourceSsrc, kLastSr, kDelayLastSr)).Times(1); 411 412 // Enable receiving the cast feedback. 413 rtcp_receiver.SetRemoteSSRC(kSenderSsrc); 414 415 TestRtcpPacketBuilder p; 416 p.AddRr(kSenderSsrc, 1); 417 p.AddRb(kSourceSsrc); 418 p.AddCast(kSenderSsrc, kSourceSsrc, kTargetDelayMs); 419 420 // Expected to be pass through since the sender ssrc match our local ssrc. 421 RtcpParser rtcp_parser(p.Data(), p.Length()); 422 rtcp_receiver.IncomingRtcpPacket(&rtcp_parser); 423 424 EXPECT_TRUE(sender_feedback_cast_verification.called()); 425 } 426 427 TEST_F(RtcpReceiverTest, InjectReceiverReportWithReceiverLogVerificationBase) { 428 static const uint32 kTimeBaseMs = 12345678; 429 static const uint32 kTimeDelayMs = 10; 430 static const uint32 kDelayDeltaMs = 123; 431 base::SimpleTestTickClock testing_clock; 432 testing_clock.Advance(base::TimeDelta::FromMilliseconds(kTimeBaseMs)); 433 434 RtcpReceiverCastLogVerification cast_log_verification; 435 RtcpReceiver rtcp_receiver(cast_environment_, 436 &mock_sender_feedback_, 437 &cast_log_verification, 438 &mock_rtt_feedback_, 439 kSourceSsrc); 440 rtcp_receiver.SetRemoteSSRC(kSenderSsrc); 441 rtcp_receiver.SetCastReceiverEventHistorySize(100); 442 443 RtcpReceiverLogMessage receiver_log; 444 RtcpReceiverFrameLogMessage frame_log(kRtpTimestamp); 445 RtcpReceiverEventLogMessage event_log; 446 447 event_log.type = FRAME_ACK_SENT; 448 event_log.event_timestamp = testing_clock.NowTicks(); 449 event_log.delay_delta = base::TimeDelta::FromMilliseconds(kDelayDeltaMs); 450 frame_log.event_log_messages_.push_back(event_log); 451 452 testing_clock.Advance(base::TimeDelta::FromMilliseconds(kTimeDelayMs)); 453 event_log.type = PACKET_RECEIVED; 454 event_log.event_timestamp = testing_clock.NowTicks(); 455 event_log.packet_id = kLostPacketId1; 456 frame_log.event_log_messages_.push_back(event_log); 457 458 event_log.type = PACKET_RECEIVED; 459 event_log.event_timestamp = testing_clock.NowTicks(); 460 event_log.packet_id = kLostPacketId2; 461 frame_log.event_log_messages_.push_back(event_log); 462 463 receiver_log.push_back(frame_log); 464 465 cast_log_verification.SetExpectedReceiverLog(receiver_log); 466 467 TestRtcpPacketBuilder p; 468 p.AddRr(kSenderSsrc, 1); 469 p.AddRb(kSourceSsrc); 470 p.AddReceiverLog(kSenderSsrc); 471 p.AddReceiverFrameLog(kRtpTimestamp, 3, kTimeBaseMs); 472 p.AddReceiverEventLog(kDelayDeltaMs, FRAME_ACK_SENT, 0); 473 p.AddReceiverEventLog(kLostPacketId1, PACKET_RECEIVED, kTimeDelayMs); 474 p.AddReceiverEventLog(kLostPacketId2, PACKET_RECEIVED, kTimeDelayMs); 475 476 // Adds duplicated receiver event. 477 p.AddReceiverFrameLog(kRtpTimestamp, 3, kTimeBaseMs); 478 p.AddReceiverEventLog(kDelayDeltaMs, FRAME_ACK_SENT, 0); 479 p.AddReceiverEventLog(kLostPacketId1, PACKET_RECEIVED, kTimeDelayMs); 480 p.AddReceiverEventLog(kLostPacketId2, PACKET_RECEIVED, kTimeDelayMs); 481 482 EXPECT_CALL(mock_rtt_feedback_, 483 OnReceivedDelaySinceLastReport( 484 kSourceSsrc, kLastSr, kDelayLastSr)).Times(1); 485 486 RtcpParser rtcp_parser(p.Data(), p.Length()); 487 rtcp_receiver.IncomingRtcpPacket(&rtcp_parser); 488 489 EXPECT_TRUE(cast_log_verification.OnReceivedReceiverLogCalled()); 490 } 491 492 TEST_F(RtcpReceiverTest, InjectReceiverReportWithReceiverLogVerificationMulti) { 493 static const uint32 kTimeBaseMs = 12345678; 494 static const uint32 kTimeDelayMs = 10; 495 static const uint32 kDelayDeltaMs = 123; 496 base::SimpleTestTickClock testing_clock; 497 testing_clock.Advance(base::TimeDelta::FromMilliseconds(kTimeBaseMs)); 498 499 RtcpReceiverCastLogVerification cast_log_verification; 500 RtcpReceiver rtcp_receiver(cast_environment_, 501 &mock_sender_feedback_, 502 &cast_log_verification, 503 &mock_rtt_feedback_, 504 kSourceSsrc); 505 rtcp_receiver.SetRemoteSSRC(kSenderSsrc); 506 507 RtcpReceiverLogMessage receiver_log; 508 509 for (int j = 0; j < 100; ++j) { 510 RtcpReceiverFrameLogMessage frame_log(kRtpTimestamp); 511 RtcpReceiverEventLogMessage event_log; 512 event_log.type = FRAME_ACK_SENT; 513 event_log.event_timestamp = testing_clock.NowTicks(); 514 event_log.delay_delta = base::TimeDelta::FromMilliseconds(kDelayDeltaMs); 515 frame_log.event_log_messages_.push_back(event_log); 516 receiver_log.push_back(frame_log); 517 testing_clock.Advance(base::TimeDelta::FromMilliseconds(kTimeDelayMs)); 518 } 519 520 cast_log_verification.SetExpectedReceiverLog(receiver_log); 521 522 TestRtcpPacketBuilder p; 523 p.AddRr(kSenderSsrc, 1); 524 p.AddRb(kSourceSsrc); 525 p.AddReceiverLog(kSenderSsrc); 526 for (int i = 0; i < 100; ++i) { 527 p.AddReceiverFrameLog(kRtpTimestamp, 1, kTimeBaseMs + i * kTimeDelayMs); 528 p.AddReceiverEventLog(kDelayDeltaMs, FRAME_ACK_SENT, 0); 529 } 530 531 EXPECT_CALL(mock_rtt_feedback_, 532 OnReceivedDelaySinceLastReport( 533 kSourceSsrc, kLastSr, kDelayLastSr)).Times(1); 534 535 RtcpParser rtcp_parser(p.Data(), p.Length()); 536 rtcp_receiver.IncomingRtcpPacket(&rtcp_parser); 537 538 EXPECT_TRUE(cast_log_verification.OnReceivedReceiverLogCalled()); 539 } 540 541 } // namespace cast 542 } // namespace media 543