OLD | NEW |
1 // Copyright 2013 The Chromium Authors. All rights reserved. | 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 | 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 "base/memory/scoped_ptr.h" | 5 #include "base/memory/scoped_ptr.h" |
6 #include "base/test/simple_test_tick_clock.h" | 6 #include "base/test/simple_test_tick_clock.h" |
7 #include "media/cast/cast_environment.h" | 7 #include "media/cast/cast_environment.h" |
8 #include "media/cast/rtcp/mock_rtcp_receiver_feedback.h" | 8 #include "media/cast/rtcp/mock_rtcp_receiver_feedback.h" |
9 #include "media/cast/rtcp/mock_rtcp_sender_feedback.h" | 9 #include "media/cast/rtcp/mock_rtcp_sender_feedback.h" |
10 #include "media/cast/rtcp/rtcp_receiver.h" | 10 #include "media/cast/rtcp/rtcp_receiver.h" |
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
52 ++frame_it; | 52 ++frame_it; |
53 EXPECT_EQ(frame_it, cast_feedback.missing_frames_and_packets_.end()); | 53 EXPECT_EQ(frame_it, cast_feedback.missing_frames_and_packets_.end()); |
54 called_ = true; | 54 called_ = true; |
55 } | 55 } |
56 | 56 |
57 bool called() const { return called_; } | 57 bool called() const { return called_; } |
58 | 58 |
59 private: | 59 private: |
60 bool called_; | 60 bool called_; |
61 }; | 61 }; |
| 62 |
| 63 class RtcpReceiverCastLogVerification : public RtcpReceiverFeedback { |
| 64 public: |
| 65 RtcpReceiverCastLogVerification() |
| 66 : called_on_received_sender_log_(false), |
| 67 called_on_received_receiver_log_(false) {} |
| 68 |
| 69 virtual void OnReceivedSenderReport( |
| 70 const RtcpSenderInfo& remote_sender_info) OVERRIDE {}; |
| 71 |
| 72 virtual void OnReceiverReferenceTimeReport( |
| 73 const RtcpReceiverReferenceTimeReport& remote_time_report) OVERRIDE {}; |
| 74 |
| 75 virtual void OnReceivedSendReportRequest() OVERRIDE {}; |
| 76 |
| 77 virtual void OnReceivedReceiverLog( |
| 78 const RtcpReceiverLogMessage& receiver_log) OVERRIDE { |
| 79 EXPECT_EQ(expected_receiver_log_.size(), receiver_log.size()); |
| 80 RtcpReceiverLogMessage::const_iterator expected_it = |
| 81 expected_receiver_log_.begin(); |
| 82 RtcpReceiverLogMessage::const_iterator incoming_it = receiver_log.begin(); |
| 83 for (; incoming_it != receiver_log.end(); ++incoming_it) { |
| 84 EXPECT_EQ(expected_it->rtp_timestamp_, incoming_it->rtp_timestamp_); |
| 85 EXPECT_EQ(expected_it->event_log_messages_.size(), |
| 86 incoming_it->event_log_messages_.size()); |
| 87 |
| 88 RtcpReceiverEventLogMessages::const_iterator event_incoming_it = |
| 89 incoming_it->event_log_messages_.begin(); |
| 90 RtcpReceiverEventLogMessages::const_iterator event_expected_it = |
| 91 expected_it->event_log_messages_.begin(); |
| 92 for (; event_incoming_it != incoming_it->event_log_messages_.end(); |
| 93 ++event_incoming_it, ++event_expected_it) { |
| 94 EXPECT_EQ(event_expected_it->type, event_incoming_it->type); |
| 95 EXPECT_EQ(event_expected_it->event_timestamp, |
| 96 event_incoming_it->event_timestamp); |
| 97 if (event_expected_it->type == kPacketReceived) { |
| 98 EXPECT_EQ(event_expected_it->packet_id, event_incoming_it->packet_id); |
| 99 } else { |
| 100 EXPECT_EQ(event_expected_it->delay_delta, |
| 101 event_incoming_it->delay_delta); |
| 102 } |
| 103 } |
| 104 expected_receiver_log_.pop_front(); |
| 105 expected_it = expected_receiver_log_.begin(); |
| 106 } |
| 107 called_on_received_receiver_log_ = true; |
| 108 } |
| 109 |
| 110 virtual void OnReceivedSenderLog( |
| 111 const RtcpSenderLogMessage& sender_log) OVERRIDE { |
| 112 EXPECT_EQ(expected_sender_log_.size(), sender_log.size()); |
| 113 |
| 114 RtcpSenderLogMessage::const_iterator expected_it = |
| 115 expected_sender_log_.begin(); |
| 116 RtcpSenderLogMessage::const_iterator incoming_it = sender_log.begin(); |
| 117 for (; expected_it != expected_sender_log_.end(); |
| 118 ++expected_it, ++incoming_it) { |
| 119 EXPECT_EQ(expected_it->frame_status, incoming_it->frame_status); |
| 120 EXPECT_EQ(0xffffff & expected_it->rtp_timestamp, |
| 121 incoming_it->rtp_timestamp); |
| 122 } |
| 123 called_on_received_sender_log_ = true; |
| 124 } |
| 125 |
| 126 bool OnReceivedSenderLogCalled() { |
| 127 return called_on_received_sender_log_; |
| 128 } |
| 129 |
| 130 bool OnReceivedReceiverLogCalled() { |
| 131 return called_on_received_receiver_log_ && expected_receiver_log_.empty(); |
| 132 } |
| 133 |
| 134 void SetExpectedReceiverLog(const RtcpReceiverLogMessage& receiver_log) { |
| 135 expected_receiver_log_ = receiver_log; |
| 136 } |
| 137 |
| 138 void SetExpectedSenderLog(const RtcpSenderLogMessage& sender_log) { |
| 139 expected_sender_log_ = sender_log; |
| 140 } |
| 141 |
| 142 private: |
| 143 RtcpReceiverLogMessage expected_receiver_log_; |
| 144 RtcpSenderLogMessage expected_sender_log_; |
| 145 bool called_on_received_sender_log_; |
| 146 bool called_on_received_receiver_log_; |
| 147 }; |
| 148 |
62 } // namespace | 149 } // namespace |
63 | 150 |
64 class RtcpReceiverTest : public ::testing::Test { | 151 class RtcpReceiverTest : public ::testing::Test { |
65 protected: | 152 protected: |
66 RtcpReceiverTest() | 153 RtcpReceiverTest() |
67 : task_runner_(new test::FakeTaskRunner(&testing_clock_)), | 154 : task_runner_(new test::FakeTaskRunner(&testing_clock_)), |
68 cast_environment_(new CastEnvironment(&testing_clock_, task_runner_, | 155 cast_environment_(new CastEnvironment(&testing_clock_, task_runner_, |
69 task_runner_, task_runner_, task_runner_, task_runner_, | 156 task_runner_, task_runner_, task_runner_, task_runner_, |
70 GetDefaultCastLoggingConfig())), | 157 GetDefaultCastLoggingConfig())), |
71 rtcp_receiver_(new RtcpReceiver(cast_environment_, | 158 rtcp_receiver_(new RtcpReceiver(cast_environment_, |
(...skipping 281 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
353 p.AddRb(kSourceSsrc); | 440 p.AddRb(kSourceSsrc); |
354 p.AddCast(kSenderSsrc, kSourceSsrc); | 441 p.AddCast(kSenderSsrc, kSourceSsrc); |
355 | 442 |
356 // Expected to be pass through since the sender ssrc match our local ssrc. | 443 // Expected to be pass through since the sender ssrc match our local ssrc. |
357 RtcpParser rtcp_parser(p.Packet(), p.Length()); | 444 RtcpParser rtcp_parser(p.Packet(), p.Length()); |
358 rtcp_receiver.IncomingRtcpPacket(&rtcp_parser); | 445 rtcp_receiver.IncomingRtcpPacket(&rtcp_parser); |
359 | 446 |
360 EXPECT_TRUE(sender_feedback_cast_verification.called()); | 447 EXPECT_TRUE(sender_feedback_cast_verification.called()); |
361 } | 448 } |
362 | 449 |
| 450 TEST_F(RtcpReceiverTest, InjectSenderReportWithCastSenderLogVerification) { |
| 451 RtcpReceiverCastLogVerification cast_log_verification; |
| 452 RtcpReceiver rtcp_receiver(cast_environment_, |
| 453 &mock_sender_feedback_, |
| 454 &cast_log_verification, |
| 455 &mock_rtt_feedback_, |
| 456 kSourceSsrc); |
| 457 rtcp_receiver.SetRemoteSSRC(kSenderSsrc); |
| 458 |
| 459 RtcpSenderLogMessage sender_log; |
| 460 for (int j = 0; j < 359; ++j) { |
| 461 RtcpSenderFrameLogMessage sender_frame_log; |
| 462 sender_frame_log.frame_status = kRtcpSenderFrameStatusSentToNetwork; |
| 463 sender_frame_log.rtp_timestamp = kRtpTimestamp + j * 90; |
| 464 sender_log.push_back(sender_frame_log); |
| 465 } |
| 466 cast_log_verification.SetExpectedSenderLog(sender_log); |
| 467 |
| 468 TestRtcpPacketBuilder p; |
| 469 p.AddSr(kSenderSsrc, 0); |
| 470 p.AddSdesCname(kSenderSsrc, kCName); |
| 471 p.AddSenderLog(kSenderSsrc); |
| 472 |
| 473 for (int i = 0; i < 359; ++i) { |
| 474 p.AddSenderFrameLog(kRtcpSenderFrameStatusSentToNetwork, |
| 475 kRtpTimestamp + i * 90); |
| 476 } |
| 477 RtcpParser rtcp_parser(p.Packet(), p.Length()); |
| 478 rtcp_receiver.IncomingRtcpPacket(&rtcp_parser); |
| 479 |
| 480 EXPECT_TRUE(cast_log_verification.OnReceivedSenderLogCalled()); |
| 481 } |
| 482 |
| 483 TEST_F(RtcpReceiverTest, InjectReceiverReportWithReceiverLogVerificationBase) { |
| 484 static const uint32 kTimeBaseMs = 12345678; |
| 485 static const uint32 kTimeDelayMs = 10; |
| 486 static const uint32 kDelayDeltaMs = 123; |
| 487 base::SimpleTestTickClock testing_clock; |
| 488 testing_clock.Advance(base::TimeDelta::FromMilliseconds(kTimeBaseMs)); |
| 489 |
| 490 RtcpReceiverCastLogVerification cast_log_verification; |
| 491 RtcpReceiver rtcp_receiver(cast_environment_, |
| 492 &mock_sender_feedback_, |
| 493 &cast_log_verification, |
| 494 &mock_rtt_feedback_, |
| 495 kSourceSsrc); |
| 496 rtcp_receiver.SetRemoteSSRC(kSenderSsrc); |
| 497 |
| 498 RtcpReceiverLogMessage receiver_log; |
| 499 RtcpReceiverFrameLogMessage frame_log(kRtpTimestamp); |
| 500 RtcpReceiverEventLogMessage event_log; |
| 501 |
| 502 event_log.type = kAckSent; |
| 503 event_log.event_timestamp = testing_clock.NowTicks(); |
| 504 event_log.delay_delta = base::TimeDelta::FromMilliseconds(kDelayDeltaMs); |
| 505 frame_log.event_log_messages_.push_back(event_log); |
| 506 |
| 507 testing_clock.Advance(base::TimeDelta::FromMilliseconds(kTimeDelayMs)); |
| 508 event_log.type = kPacketReceived; |
| 509 event_log.event_timestamp = testing_clock.NowTicks(); |
| 510 event_log.packet_id = kLostPacketId1; |
| 511 frame_log.event_log_messages_.push_back(event_log); |
| 512 receiver_log.push_back(frame_log); |
| 513 |
| 514 cast_log_verification.SetExpectedReceiverLog(receiver_log); |
| 515 |
| 516 TestRtcpPacketBuilder p; |
| 517 p.AddRr(kSenderSsrc, 1); |
| 518 p.AddRb(kSourceSsrc); |
| 519 p.AddReceiverLog(kSenderSsrc); |
| 520 p.AddReceiverFrameLog(kRtpTimestamp, 2, kTimeBaseMs); |
| 521 p.AddReceiverEventLog(kDelayDeltaMs, 1, 0); |
| 522 p.AddReceiverEventLog(kLostPacketId1, 6, kTimeDelayMs); |
| 523 |
| 524 EXPECT_CALL(mock_rtt_feedback_, |
| 525 OnReceivedDelaySinceLastReport(kSourceSsrc, kLastSr, kDelayLastSr)). |
| 526 Times(1); |
| 527 |
| 528 RtcpParser rtcp_parser(p.Packet(), p.Length()); |
| 529 rtcp_receiver.IncomingRtcpPacket(&rtcp_parser); |
| 530 |
| 531 EXPECT_TRUE(cast_log_verification.OnReceivedReceiverLogCalled()); |
| 532 } |
| 533 |
| 534 TEST_F(RtcpReceiverTest, InjectReceiverReportWithReceiverLogVerificationMulti) { |
| 535 static const uint32 kTimeBaseMs = 12345678; |
| 536 static const uint32 kTimeDelayMs = 10; |
| 537 static const uint32 kDelayDeltaMs = 123; |
| 538 base::SimpleTestTickClock testing_clock; |
| 539 testing_clock.Advance(base::TimeDelta::FromMilliseconds(kTimeBaseMs)); |
| 540 |
| 541 RtcpReceiverCastLogVerification cast_log_verification; |
| 542 RtcpReceiver rtcp_receiver(cast_environment_, |
| 543 &mock_sender_feedback_, |
| 544 &cast_log_verification, |
| 545 &mock_rtt_feedback_, |
| 546 kSourceSsrc); |
| 547 rtcp_receiver.SetRemoteSSRC(kSenderSsrc); |
| 548 |
| 549 RtcpReceiverLogMessage receiver_log; |
| 550 |
| 551 for (int j = 0; j < 100; ++j) { |
| 552 RtcpReceiverFrameLogMessage frame_log(kRtpTimestamp); |
| 553 RtcpReceiverEventLogMessage event_log; |
| 554 event_log.type = kAckSent; |
| 555 event_log.event_timestamp = testing_clock.NowTicks(); |
| 556 event_log.delay_delta = base::TimeDelta::FromMilliseconds(kDelayDeltaMs); |
| 557 frame_log.event_log_messages_.push_back(event_log); |
| 558 receiver_log.push_back(frame_log); |
| 559 testing_clock.Advance(base::TimeDelta::FromMilliseconds(kTimeDelayMs)); |
| 560 } |
| 561 |
| 562 cast_log_verification.SetExpectedReceiverLog(receiver_log); |
| 563 |
| 564 TestRtcpPacketBuilder p; |
| 565 p.AddRr(kSenderSsrc, 1); |
| 566 p.AddRb(kSourceSsrc); |
| 567 p.AddReceiverLog(kSenderSsrc); |
| 568 for (int i = 0; i < 100; ++i) { |
| 569 p.AddReceiverFrameLog(kRtpTimestamp, 1, kTimeBaseMs + i * kTimeDelayMs); |
| 570 p.AddReceiverEventLog(kDelayDeltaMs, 1, 0); |
| 571 } |
| 572 |
| 573 EXPECT_CALL(mock_rtt_feedback_, |
| 574 OnReceivedDelaySinceLastReport(kSourceSsrc, kLastSr, kDelayLastSr)). |
| 575 Times(1); |
| 576 |
| 577 RtcpParser rtcp_parser(p.Packet(), p.Length()); |
| 578 rtcp_receiver.IncomingRtcpPacket(&rtcp_parser); |
| 579 |
| 580 EXPECT_TRUE(cast_log_verification.OnReceivedReceiverLogCalled()); |
| 581 } |
| 582 |
| 583 |
| 584 |
363 } // namespace cast | 585 } // namespace cast |
364 } // namespace media | 586 } // namespace media |
OLD | NEW |