| Index: media/cast/rtcp/rtcp_receiver_unittest.cc
|
| diff --git a/media/cast/rtcp/rtcp_receiver_unittest.cc b/media/cast/rtcp/rtcp_receiver_unittest.cc
|
| deleted file mode 100644
|
| index 485c3ee765eb3312191f344b5e69d6604f2c4c3b..0000000000000000000000000000000000000000
|
| --- a/media/cast/rtcp/rtcp_receiver_unittest.cc
|
| +++ /dev/null
|
| @@ -1,543 +0,0 @@
|
| -// Copyright 2013 The Chromium Authors. All rights reserved.
|
| -// Use of this source code is governed by a BSD-style license that can be
|
| -// found in the LICENSE file.
|
| -
|
| -#include "base/memory/scoped_ptr.h"
|
| -#include "base/test/simple_test_tick_clock.h"
|
| -#include "media/cast/cast_environment.h"
|
| -#include "media/cast/rtcp/mock_rtcp_receiver_feedback.h"
|
| -#include "media/cast/rtcp/mock_rtcp_sender_feedback.h"
|
| -#include "media/cast/rtcp/rtcp_receiver.h"
|
| -#include "media/cast/rtcp/rtcp_utility.h"
|
| -#include "media/cast/rtcp/test_rtcp_packet_builder.h"
|
| -#include "media/cast/test/fake_single_thread_task_runner.h"
|
| -#include "media/cast/transport/cast_transport_defines.h"
|
| -#include "testing/gmock/include/gmock/gmock.h"
|
| -
|
| -namespace media {
|
| -namespace cast {
|
| -
|
| -using testing::_;
|
| -
|
| -static const uint32 kSenderSsrc = 0x10203;
|
| -static const uint32 kSourceSsrc = 0x40506;
|
| -static const uint32 kUnknownSsrc = 0xDEAD;
|
| -static const base::TimeDelta kTargetDelay =
|
| - base::TimeDelta::FromMilliseconds(100);
|
| -static const std::string kCName("test@10.1.1.1");
|
| -
|
| -namespace {
|
| -class SenderFeedbackCastVerification : public RtcpSenderFeedback {
|
| - public:
|
| - SenderFeedbackCastVerification() : called_(false) {}
|
| -
|
| - virtual void OnReceivedCastFeedback(const RtcpCastMessage& cast_feedback)
|
| - OVERRIDE {
|
| - EXPECT_EQ(cast_feedback.media_ssrc_, kSenderSsrc);
|
| - EXPECT_EQ(cast_feedback.ack_frame_id_, kAckFrameId);
|
| -
|
| - MissingFramesAndPacketsMap::const_iterator frame_it =
|
| - cast_feedback.missing_frames_and_packets_.begin();
|
| -
|
| - EXPECT_TRUE(frame_it != cast_feedback.missing_frames_and_packets_.end());
|
| - EXPECT_EQ(kLostFrameId, frame_it->first);
|
| - EXPECT_EQ(frame_it->second.size(), 1UL);
|
| - EXPECT_EQ(*frame_it->second.begin(), kRtcpCastAllPacketsLost);
|
| - ++frame_it;
|
| - EXPECT_TRUE(frame_it != cast_feedback.missing_frames_and_packets_.end());
|
| - EXPECT_EQ(kFrameIdWithLostPackets, frame_it->first);
|
| - EXPECT_EQ(3UL, frame_it->second.size());
|
| - PacketIdSet::const_iterator packet_it = frame_it->second.begin();
|
| - EXPECT_EQ(kLostPacketId1, *packet_it);
|
| - ++packet_it;
|
| - EXPECT_EQ(kLostPacketId2, *packet_it);
|
| - ++packet_it;
|
| - EXPECT_EQ(kLostPacketId3, *packet_it);
|
| - ++frame_it;
|
| - EXPECT_EQ(frame_it, cast_feedback.missing_frames_and_packets_.end());
|
| - called_ = true;
|
| - }
|
| -
|
| - bool called() const { return called_; }
|
| -
|
| - private:
|
| - bool called_;
|
| -
|
| - DISALLOW_COPY_AND_ASSIGN(SenderFeedbackCastVerification);
|
| -};
|
| -
|
| -class RtcpReceiverCastLogVerification : public RtcpReceiverFeedback {
|
| - public:
|
| - RtcpReceiverCastLogVerification()
|
| - : called_on_received_sender_log_(false),
|
| - called_on_received_receiver_log_(false) {}
|
| -
|
| - virtual void OnReceivedSenderReport(
|
| - const transport::RtcpSenderInfo& remote_sender_info) OVERRIDE{};
|
| -
|
| - virtual void OnReceiverReferenceTimeReport(
|
| - const RtcpReceiverReferenceTimeReport& remote_time_report) OVERRIDE{};
|
| -
|
| - virtual void OnReceivedSendReportRequest() OVERRIDE{};
|
| -
|
| - virtual void OnReceivedReceiverLog(const RtcpReceiverLogMessage& receiver_log)
|
| - OVERRIDE {
|
| - EXPECT_EQ(expected_receiver_log_.size(), receiver_log.size());
|
| - RtcpReceiverLogMessage::const_iterator expected_it =
|
| - expected_receiver_log_.begin();
|
| - RtcpReceiverLogMessage::const_iterator incoming_it = receiver_log.begin();
|
| - for (; incoming_it != receiver_log.end(); ++incoming_it) {
|
| - EXPECT_EQ(expected_it->rtp_timestamp_, incoming_it->rtp_timestamp_);
|
| - EXPECT_EQ(expected_it->event_log_messages_.size(),
|
| - incoming_it->event_log_messages_.size());
|
| -
|
| - RtcpReceiverEventLogMessages::const_iterator event_incoming_it =
|
| - incoming_it->event_log_messages_.begin();
|
| - RtcpReceiverEventLogMessages::const_iterator event_expected_it =
|
| - expected_it->event_log_messages_.begin();
|
| - for (; event_incoming_it != incoming_it->event_log_messages_.end();
|
| - ++event_incoming_it, ++event_expected_it) {
|
| - EXPECT_EQ(event_expected_it->type, event_incoming_it->type);
|
| - EXPECT_EQ(event_expected_it->event_timestamp,
|
| - event_incoming_it->event_timestamp);
|
| - if (event_expected_it->type == PACKET_RECEIVED) {
|
| - EXPECT_EQ(event_expected_it->packet_id, event_incoming_it->packet_id);
|
| - } else {
|
| - EXPECT_EQ(event_expected_it->delay_delta,
|
| - event_incoming_it->delay_delta);
|
| - }
|
| - }
|
| - expected_receiver_log_.pop_front();
|
| - expected_it = expected_receiver_log_.begin();
|
| - }
|
| - called_on_received_receiver_log_ = true;
|
| - }
|
| -
|
| - bool OnReceivedReceiverLogCalled() {
|
| - return called_on_received_receiver_log_ && expected_receiver_log_.empty();
|
| - }
|
| -
|
| - void SetExpectedReceiverLog(const RtcpReceiverLogMessage& receiver_log) {
|
| - expected_receiver_log_ = receiver_log;
|
| - }
|
| -
|
| - private:
|
| - RtcpReceiverLogMessage expected_receiver_log_;
|
| - bool called_on_received_sender_log_;
|
| - bool called_on_received_receiver_log_;
|
| -
|
| - DISALLOW_COPY_AND_ASSIGN(RtcpReceiverCastLogVerification);
|
| -};
|
| -
|
| -} // namespace
|
| -
|
| -class RtcpReceiverTest : public ::testing::Test {
|
| - protected:
|
| - RtcpReceiverTest()
|
| - : testing_clock_(new base::SimpleTestTickClock()),
|
| - task_runner_(new test::FakeSingleThreadTaskRunner(testing_clock_)),
|
| - cast_environment_(new CastEnvironment(
|
| - scoped_ptr<base::TickClock>(testing_clock_).Pass(),
|
| - task_runner_,
|
| - task_runner_,
|
| - task_runner_)),
|
| - rtcp_receiver_(new RtcpReceiver(cast_environment_,
|
| - &mock_sender_feedback_,
|
| - &mock_receiver_feedback_,
|
| - &mock_rtt_feedback_,
|
| - kSourceSsrc)) {
|
| - EXPECT_CALL(mock_receiver_feedback_, OnReceivedSenderReport(_)).Times(0);
|
| - EXPECT_CALL(mock_receiver_feedback_, OnReceiverReferenceTimeReport(_))
|
| - .Times(0);
|
| - EXPECT_CALL(mock_receiver_feedback_, OnReceivedSendReportRequest())
|
| - .Times(0);
|
| - EXPECT_CALL(mock_sender_feedback_, OnReceivedCastFeedback(_)).Times(0);
|
| - EXPECT_CALL(mock_rtt_feedback_, OnReceivedDelaySinceLastReport(_, _, _))
|
| - .Times(0);
|
| -
|
| - expected_sender_info_.ntp_seconds = kNtpHigh;
|
| - expected_sender_info_.ntp_fraction = kNtpLow;
|
| - expected_sender_info_.rtp_timestamp = kRtpTimestamp;
|
| - expected_sender_info_.send_packet_count = kSendPacketCount;
|
| - expected_sender_info_.send_octet_count = kSendOctetCount;
|
| -
|
| - expected_report_block_.remote_ssrc = kSenderSsrc;
|
| - expected_report_block_.media_ssrc = kSourceSsrc;
|
| - expected_report_block_.fraction_lost = kLoss >> 24;
|
| - expected_report_block_.cumulative_lost = kLoss & 0xffffff;
|
| - expected_report_block_.extended_high_sequence_number = kExtendedMax;
|
| - expected_report_block_.jitter = kTestJitter;
|
| - expected_report_block_.last_sr = kLastSr;
|
| - expected_report_block_.delay_since_last_sr = kDelayLastSr;
|
| - expected_receiver_reference_report_.remote_ssrc = kSenderSsrc;
|
| - expected_receiver_reference_report_.ntp_seconds = kNtpHigh;
|
| - expected_receiver_reference_report_.ntp_fraction = kNtpLow;
|
| - }
|
| -
|
| - virtual ~RtcpReceiverTest() {}
|
| -
|
| - // Injects an RTCP packet into the receiver.
|
| - void InjectRtcpPacket(const uint8* packet, uint16 length) {
|
| - RtcpParser rtcp_parser(packet, length);
|
| - rtcp_receiver_->IncomingRtcpPacket(&rtcp_parser);
|
| - }
|
| -
|
| - base::SimpleTestTickClock* testing_clock_; // Owned by CastEnvironment.
|
| - scoped_refptr<test::FakeSingleThreadTaskRunner> task_runner_;
|
| - scoped_refptr<CastEnvironment> cast_environment_;
|
| - MockRtcpReceiverFeedback mock_receiver_feedback_;
|
| - MockRtcpRttFeedback mock_rtt_feedback_;
|
| - MockRtcpSenderFeedback mock_sender_feedback_;
|
| - scoped_ptr<RtcpReceiver> rtcp_receiver_;
|
| - transport::RtcpSenderInfo expected_sender_info_;
|
| - transport::RtcpReportBlock expected_report_block_;
|
| - RtcpReceiverReferenceTimeReport expected_receiver_reference_report_;
|
| -
|
| - DISALLOW_COPY_AND_ASSIGN(RtcpReceiverTest);
|
| -};
|
| -
|
| -TEST_F(RtcpReceiverTest, BrokenPacketIsIgnored) {
|
| - const uint8 bad_packet[] = {0, 0, 0, 0};
|
| - InjectRtcpPacket(bad_packet, sizeof(bad_packet));
|
| -}
|
| -
|
| -TEST_F(RtcpReceiverTest, InjectSenderReportPacket) {
|
| - TestRtcpPacketBuilder p;
|
| - p.AddSr(kSenderSsrc, 0);
|
| -
|
| - // Expected to be ignored since the sender ssrc does not match our
|
| - // remote ssrc.
|
| - InjectRtcpPacket(p.Data(), p.Length());
|
| -
|
| - EXPECT_CALL(mock_receiver_feedback_,
|
| - OnReceivedSenderReport(expected_sender_info_)).Times(1);
|
| - rtcp_receiver_->SetRemoteSSRC(kSenderSsrc);
|
| -
|
| - // Expected to be pass through since the sender ssrc match our remote ssrc.
|
| - InjectRtcpPacket(p.Data(), p.Length());
|
| -}
|
| -
|
| -TEST_F(RtcpReceiverTest, InjectReceiveReportPacket) {
|
| - TestRtcpPacketBuilder p1;
|
| - p1.AddRr(kSenderSsrc, 1);
|
| - p1.AddRb(kUnknownSsrc);
|
| -
|
| - // Expected to be ignored since the source ssrc does not match our
|
| - // local ssrc.
|
| - InjectRtcpPacket(p1.Data(), p1.Length());
|
| -
|
| - EXPECT_CALL(mock_rtt_feedback_,
|
| - OnReceivedDelaySinceLastReport(
|
| - kSourceSsrc, kLastSr, kDelayLastSr)).Times(1);
|
| -
|
| - TestRtcpPacketBuilder p2;
|
| - p2.AddRr(kSenderSsrc, 1);
|
| - p2.AddRb(kSourceSsrc);
|
| -
|
| - // Expected to be pass through since the sender ssrc match our local ssrc.
|
| - InjectRtcpPacket(p2.Data(), p2.Length());
|
| -}
|
| -
|
| -TEST_F(RtcpReceiverTest, InjectSenderReportWithReportBlockPacket) {
|
| - TestRtcpPacketBuilder p1;
|
| - p1.AddSr(kSenderSsrc, 1);
|
| - p1.AddRb(kUnknownSsrc);
|
| -
|
| - // Sender report expected to be ignored since the sender ssrc does not match
|
| - // our remote ssrc.
|
| - // Report block expected to be ignored since the source ssrc does not match
|
| - // our local ssrc.
|
| - InjectRtcpPacket(p1.Data(), p1.Length());
|
| -
|
| - EXPECT_CALL(mock_receiver_feedback_,
|
| - OnReceivedSenderReport(expected_sender_info_)).Times(1);
|
| - rtcp_receiver_->SetRemoteSSRC(kSenderSsrc);
|
| -
|
| - // Sender report expected to be pass through since the sender ssrc match our
|
| - // remote ssrc.
|
| - // Report block expected to be ignored since the source ssrc does not match
|
| - // our local ssrc.
|
| - InjectRtcpPacket(p1.Data(), p1.Length());
|
| -
|
| - EXPECT_CALL(mock_receiver_feedback_, OnReceivedSenderReport(_)).Times(0);
|
| - EXPECT_CALL(mock_rtt_feedback_,
|
| - OnReceivedDelaySinceLastReport(
|
| - kSourceSsrc, kLastSr, kDelayLastSr)).Times(1);
|
| -
|
| - rtcp_receiver_->SetRemoteSSRC(0);
|
| -
|
| - TestRtcpPacketBuilder p2;
|
| - p2.AddSr(kSenderSsrc, 1);
|
| - p2.AddRb(kSourceSsrc);
|
| -
|
| - // Sender report expected to be ignored since the sender ssrc does not match
|
| - // our remote ssrc.
|
| - // Receiver report expected to be pass through since the sender ssrc match
|
| - // our local ssrc.
|
| - InjectRtcpPacket(p2.Data(), p2.Length());
|
| -
|
| - EXPECT_CALL(mock_receiver_feedback_,
|
| - OnReceivedSenderReport(expected_sender_info_)).Times(1);
|
| - EXPECT_CALL(mock_rtt_feedback_,
|
| - OnReceivedDelaySinceLastReport(
|
| - kSourceSsrc, kLastSr, kDelayLastSr)).Times(1);
|
| -
|
| - rtcp_receiver_->SetRemoteSSRC(kSenderSsrc);
|
| -
|
| - // Sender report expected to be pass through since the sender ssrc match our
|
| - // remote ssrc.
|
| - // Receiver report expected to be pass through since the sender ssrc match
|
| - // our local ssrc.
|
| - InjectRtcpPacket(p2.Data(), p2.Length());
|
| -}
|
| -
|
| -TEST_F(RtcpReceiverTest, InjectSenderReportPacketWithDlrr) {
|
| - TestRtcpPacketBuilder p;
|
| - p.AddSr(kSenderSsrc, 0);
|
| - p.AddXrHeader(kSenderSsrc);
|
| - p.AddXrUnknownBlock();
|
| - p.AddXrExtendedDlrrBlock(kSenderSsrc);
|
| - p.AddXrUnknownBlock();
|
| - p.AddSdesCname(kSenderSsrc, kCName);
|
| -
|
| - // Expected to be ignored since the source ssrc does not match our
|
| - // local ssrc.
|
| - InjectRtcpPacket(p.Data(), p.Length());
|
| -
|
| - EXPECT_CALL(mock_receiver_feedback_,
|
| - OnReceivedSenderReport(expected_sender_info_)).Times(1);
|
| - EXPECT_CALL(mock_rtt_feedback_,
|
| - OnReceivedDelaySinceLastReport(
|
| - kSenderSsrc, kLastSr, kDelayLastSr)).Times(1);
|
| -
|
| - // Enable receiving sender report.
|
| - rtcp_receiver_->SetRemoteSSRC(kSenderSsrc);
|
| -
|
| - // Expected to be pass through since the sender ssrc match our local ssrc.
|
| - InjectRtcpPacket(p.Data(), p.Length());
|
| -}
|
| -
|
| -TEST_F(RtcpReceiverTest, InjectReceiverReportPacketWithRrtr) {
|
| - TestRtcpPacketBuilder p1;
|
| - p1.AddRr(kSenderSsrc, 1);
|
| - p1.AddRb(kUnknownSsrc);
|
| - p1.AddXrHeader(kSenderSsrc);
|
| - p1.AddXrRrtrBlock();
|
| -
|
| - // Expected to be ignored since the source ssrc does not match our
|
| - // local ssrc.
|
| - InjectRtcpPacket(p1.Data(), p1.Length());
|
| -
|
| - EXPECT_CALL(mock_rtt_feedback_,
|
| - OnReceivedDelaySinceLastReport(
|
| - kSourceSsrc, kLastSr, kDelayLastSr)).Times(1);
|
| - EXPECT_CALL(mock_receiver_feedback_,
|
| - OnReceiverReferenceTimeReport(
|
| - expected_receiver_reference_report_)).Times(1);
|
| -
|
| - // Enable receiving reference time report.
|
| - rtcp_receiver_->SetRemoteSSRC(kSenderSsrc);
|
| -
|
| - TestRtcpPacketBuilder p2;
|
| - p2.AddRr(kSenderSsrc, 1);
|
| - p2.AddRb(kSourceSsrc);
|
| - p2.AddXrHeader(kSenderSsrc);
|
| - p2.AddXrRrtrBlock();
|
| -
|
| - // Expected to be pass through since the sender ssrc match our local ssrc.
|
| - InjectRtcpPacket(p2.Data(), p2.Length());
|
| -}
|
| -
|
| -TEST_F(RtcpReceiverTest, InjectReceiverReportPacketWithIntraFrameRequest) {
|
| - TestRtcpPacketBuilder p1;
|
| - p1.AddRr(kSenderSsrc, 1);
|
| - p1.AddRb(kUnknownSsrc);
|
| - p1.AddPli(kSenderSsrc, kUnknownSsrc);
|
| -
|
| - // Expected to be ignored since the source ssrc does not match our
|
| - // local ssrc.
|
| - InjectRtcpPacket(p1.Data(), p1.Length());
|
| -
|
| - EXPECT_CALL(mock_rtt_feedback_,
|
| - OnReceivedDelaySinceLastReport(
|
| - kSourceSsrc, kLastSr, kDelayLastSr)).Times(1);
|
| -
|
| - TestRtcpPacketBuilder p2;
|
| - p2.AddRr(kSenderSsrc, 1);
|
| - p2.AddRb(kSourceSsrc);
|
| - p2.AddPli(kSenderSsrc, kSourceSsrc);
|
| -
|
| - // Expected to be pass through since the sender ssrc match our local ssrc.
|
| - InjectRtcpPacket(p2.Data(), p2.Length());
|
| -}
|
| -
|
| -TEST_F(RtcpReceiverTest, InjectReceiverReportPacketWithCastFeedback) {
|
| - TestRtcpPacketBuilder p1;
|
| - p1.AddRr(kSenderSsrc, 1);
|
| - p1.AddRb(kUnknownSsrc);
|
| - p1.AddCast(kSenderSsrc, kUnknownSsrc, kTargetDelay);
|
| -
|
| - // Expected to be ignored since the source ssrc does not match our
|
| - // local ssrc.
|
| - InjectRtcpPacket(p1.Data(), p1.Length());
|
| -
|
| - EXPECT_CALL(mock_rtt_feedback_,
|
| - OnReceivedDelaySinceLastReport(
|
| - kSourceSsrc, kLastSr, kDelayLastSr)).Times(1);
|
| - EXPECT_CALL(mock_sender_feedback_, OnReceivedCastFeedback(_)).Times(1);
|
| -
|
| - // Enable receiving the cast feedback.
|
| - rtcp_receiver_->SetRemoteSSRC(kSenderSsrc);
|
| -
|
| - TestRtcpPacketBuilder p2;
|
| - p2.AddRr(kSenderSsrc, 1);
|
| - p2.AddRb(kSourceSsrc);
|
| - p2.AddCast(kSenderSsrc, kSourceSsrc, kTargetDelay);
|
| -
|
| - // Expected to be pass through since the sender ssrc match our local ssrc.
|
| - InjectRtcpPacket(p2.Data(), p2.Length());
|
| -}
|
| -
|
| -TEST_F(RtcpReceiverTest, InjectReceiverReportPacketWithCastVerification) {
|
| - SenderFeedbackCastVerification sender_feedback_cast_verification;
|
| - RtcpReceiver rtcp_receiver(cast_environment_,
|
| - &sender_feedback_cast_verification,
|
| - &mock_receiver_feedback_,
|
| - &mock_rtt_feedback_,
|
| - kSourceSsrc);
|
| -
|
| - EXPECT_CALL(mock_rtt_feedback_,
|
| - OnReceivedDelaySinceLastReport(
|
| - kSourceSsrc, kLastSr, kDelayLastSr)).Times(1);
|
| -
|
| - // Enable receiving the cast feedback.
|
| - rtcp_receiver.SetRemoteSSRC(kSenderSsrc);
|
| -
|
| - TestRtcpPacketBuilder p;
|
| - p.AddRr(kSenderSsrc, 1);
|
| - p.AddRb(kSourceSsrc);
|
| - p.AddCast(kSenderSsrc, kSourceSsrc, kTargetDelay);
|
| -
|
| - // Expected to be pass through since the sender ssrc match our local ssrc.
|
| - RtcpParser rtcp_parser(p.Data(), p.Length());
|
| - rtcp_receiver.IncomingRtcpPacket(&rtcp_parser);
|
| -
|
| - EXPECT_TRUE(sender_feedback_cast_verification.called());
|
| -}
|
| -
|
| -TEST_F(RtcpReceiverTest, InjectReceiverReportWithReceiverLogVerificationBase) {
|
| - static const uint32 kTimeBaseMs = 12345678;
|
| - static const uint32 kTimeDelayMs = 10;
|
| - static const uint32 kDelayDeltaMs = 123;
|
| - base::SimpleTestTickClock testing_clock;
|
| - testing_clock.Advance(base::TimeDelta::FromMilliseconds(kTimeBaseMs));
|
| -
|
| - RtcpReceiverCastLogVerification cast_log_verification;
|
| - RtcpReceiver rtcp_receiver(cast_environment_,
|
| - &mock_sender_feedback_,
|
| - &cast_log_verification,
|
| - &mock_rtt_feedback_,
|
| - kSourceSsrc);
|
| - rtcp_receiver.SetRemoteSSRC(kSenderSsrc);
|
| - rtcp_receiver.SetCastReceiverEventHistorySize(100);
|
| -
|
| - RtcpReceiverLogMessage receiver_log;
|
| - RtcpReceiverFrameLogMessage frame_log(kRtpTimestamp);
|
| - RtcpReceiverEventLogMessage event_log;
|
| -
|
| - event_log.type = FRAME_ACK_SENT;
|
| - event_log.event_timestamp = testing_clock.NowTicks();
|
| - event_log.delay_delta = base::TimeDelta::FromMilliseconds(kDelayDeltaMs);
|
| - frame_log.event_log_messages_.push_back(event_log);
|
| -
|
| - testing_clock.Advance(base::TimeDelta::FromMilliseconds(kTimeDelayMs));
|
| - event_log.type = PACKET_RECEIVED;
|
| - event_log.event_timestamp = testing_clock.NowTicks();
|
| - event_log.packet_id = kLostPacketId1;
|
| - frame_log.event_log_messages_.push_back(event_log);
|
| -
|
| - event_log.type = PACKET_RECEIVED;
|
| - event_log.event_timestamp = testing_clock.NowTicks();
|
| - event_log.packet_id = kLostPacketId2;
|
| - frame_log.event_log_messages_.push_back(event_log);
|
| -
|
| - receiver_log.push_back(frame_log);
|
| -
|
| - cast_log_verification.SetExpectedReceiverLog(receiver_log);
|
| -
|
| - TestRtcpPacketBuilder p;
|
| - p.AddRr(kSenderSsrc, 1);
|
| - p.AddRb(kSourceSsrc);
|
| - p.AddReceiverLog(kSenderSsrc);
|
| - p.AddReceiverFrameLog(kRtpTimestamp, 3, kTimeBaseMs);
|
| - p.AddReceiverEventLog(kDelayDeltaMs, FRAME_ACK_SENT, 0);
|
| - p.AddReceiverEventLog(kLostPacketId1, PACKET_RECEIVED, kTimeDelayMs);
|
| - p.AddReceiverEventLog(kLostPacketId2, PACKET_RECEIVED, kTimeDelayMs);
|
| -
|
| - // Adds duplicated receiver event.
|
| - p.AddReceiverFrameLog(kRtpTimestamp, 3, kTimeBaseMs);
|
| - p.AddReceiverEventLog(kDelayDeltaMs, FRAME_ACK_SENT, 0);
|
| - p.AddReceiverEventLog(kLostPacketId1, PACKET_RECEIVED, kTimeDelayMs);
|
| - p.AddReceiverEventLog(kLostPacketId2, PACKET_RECEIVED, kTimeDelayMs);
|
| -
|
| - EXPECT_CALL(mock_rtt_feedback_,
|
| - OnReceivedDelaySinceLastReport(
|
| - kSourceSsrc, kLastSr, kDelayLastSr)).Times(1);
|
| -
|
| - RtcpParser rtcp_parser(p.Data(), p.Length());
|
| - rtcp_receiver.IncomingRtcpPacket(&rtcp_parser);
|
| -
|
| - EXPECT_TRUE(cast_log_verification.OnReceivedReceiverLogCalled());
|
| -}
|
| -
|
| -TEST_F(RtcpReceiverTest, InjectReceiverReportWithReceiverLogVerificationMulti) {
|
| - static const uint32 kTimeBaseMs = 12345678;
|
| - static const uint32 kTimeDelayMs = 10;
|
| - static const uint32 kDelayDeltaMs = 123;
|
| - base::SimpleTestTickClock testing_clock;
|
| - testing_clock.Advance(base::TimeDelta::FromMilliseconds(kTimeBaseMs));
|
| -
|
| - RtcpReceiverCastLogVerification cast_log_verification;
|
| - RtcpReceiver rtcp_receiver(cast_environment_,
|
| - &mock_sender_feedback_,
|
| - &cast_log_verification,
|
| - &mock_rtt_feedback_,
|
| - kSourceSsrc);
|
| - rtcp_receiver.SetRemoteSSRC(kSenderSsrc);
|
| -
|
| - RtcpReceiverLogMessage receiver_log;
|
| -
|
| - for (int j = 0; j < 100; ++j) {
|
| - RtcpReceiverFrameLogMessage frame_log(kRtpTimestamp);
|
| - RtcpReceiverEventLogMessage event_log;
|
| - event_log.type = FRAME_ACK_SENT;
|
| - event_log.event_timestamp = testing_clock.NowTicks();
|
| - event_log.delay_delta = base::TimeDelta::FromMilliseconds(kDelayDeltaMs);
|
| - frame_log.event_log_messages_.push_back(event_log);
|
| - receiver_log.push_back(frame_log);
|
| - testing_clock.Advance(base::TimeDelta::FromMilliseconds(kTimeDelayMs));
|
| - }
|
| -
|
| - cast_log_verification.SetExpectedReceiverLog(receiver_log);
|
| -
|
| - TestRtcpPacketBuilder p;
|
| - p.AddRr(kSenderSsrc, 1);
|
| - p.AddRb(kSourceSsrc);
|
| - p.AddReceiverLog(kSenderSsrc);
|
| - for (int i = 0; i < 100; ++i) {
|
| - p.AddReceiverFrameLog(kRtpTimestamp, 1, kTimeBaseMs + i * kTimeDelayMs);
|
| - p.AddReceiverEventLog(kDelayDeltaMs, FRAME_ACK_SENT, 0);
|
| - }
|
| -
|
| - EXPECT_CALL(mock_rtt_feedback_,
|
| - OnReceivedDelaySinceLastReport(
|
| - kSourceSsrc, kLastSr, kDelayLastSr)).Times(1);
|
| -
|
| - RtcpParser rtcp_parser(p.Data(), p.Length());
|
| - rtcp_receiver.IncomingRtcpPacket(&rtcp_parser);
|
| -
|
| - EXPECT_TRUE(cast_log_verification.OnReceivedReceiverLogCalled());
|
| -}
|
| -
|
| -} // namespace cast
|
| -} // namespace media
|
|
|