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