| Index: media/cast/net/rtcp/rtcp_builder_unittest.cc
|
| diff --git a/media/cast/net/rtcp/rtcp_builder_unittest.cc b/media/cast/net/rtcp/rtcp_builder_unittest.cc
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..cab5a0bdad634606fc7eeb9c3e92bb0bc6b56aa8
|
| --- /dev/null
|
| +++ b/media/cast/net/rtcp/rtcp_builder_unittest.cc
|
| @@ -0,0 +1,208 @@
|
| +// 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_defines.h"
|
| +#include "media/cast/cast_environment.h"
|
| +#include "media/cast/net/pacing/paced_sender.h"
|
| +#include "media/cast/net/rtcp/rtcp_builder.h"
|
| +#include "media/cast/rtcp/rtcp_utility.h"
|
| +#include "media/cast/rtcp/test_rtcp_packet_builder.h"
|
| +#include "media/cast/test/fake_task_runner.h"
|
| +#include "testing/gmock/include/gmock/gmock.h"
|
| +
|
| +namespace media {
|
| +namespace cast {
|
| +
|
| +namespace {
|
| +static const uint32 kSendingSsrc = 0x12345678;
|
| +static const std::string kCName("test@10.1.1.1");
|
| +} // namespace
|
| +
|
| +class TestRtcpTransport : public PacedPacketSender {
|
| + public:
|
| + TestRtcpTransport()
|
| + : expected_packet_length_(0),
|
| + packet_count_(0) {
|
| + }
|
| +
|
| + virtual bool SendRtcpPacket(const Packet& packet) OVERRIDE {
|
| + EXPECT_EQ(expected_packet_length_, packet.size());
|
| + EXPECT_EQ(0, memcmp(expected_packet_, &(packet[0]), packet.size()));
|
| + packet_count_++;
|
| + return true;
|
| + }
|
| +
|
| + virtual bool SendPackets(const PacketList& packets) OVERRIDE {
|
| + return false;
|
| + }
|
| +
|
| + virtual bool ResendPackets(const PacketList& packets) OVERRIDE {
|
| + return false;
|
| + }
|
| +
|
| + void SetExpectedRtcpPacket(const uint8* rtcp_buffer, size_t length) {
|
| + expected_packet_length_ = length;
|
| + memcpy(expected_packet_, rtcp_buffer, length);
|
| + }
|
| +
|
| + int packet_count() const { return packet_count_; }
|
| +
|
| + private:
|
| + uint8 expected_packet_[kIpPacketSize];
|
| + size_t expected_packet_length_;
|
| + int packet_count_;
|
| +};
|
| +
|
| +class RtcpBuilderTest : public ::testing::Test {
|
| + protected:
|
| + RtcpBuilderTest()
|
| + : task_runner_(new test::FakeTaskRunner(&testing_clock_)),
|
| + cast_environment_(new CastEnvironment(&testing_clock_, task_runner_,
|
| + task_runner_, task_runner_, task_runner_, task_runner_,
|
| + GetDefaultCastLoggingConfig())),
|
| + rtcp_builder_(new RtcpBuilder(&test_transport_, kSendingSsrc, kCName)) {
|
| + }
|
| +
|
| + base::SimpleTestTickClock testing_clock_;
|
| + TestRtcpTransport test_transport_;
|
| + scoped_refptr<test::FakeTaskRunner> task_runner_;
|
| + scoped_refptr<CastEnvironment> cast_environment_;
|
| + scoped_ptr<RtcpBuilder> rtcp_builder_;
|
| +};
|
| +
|
| +TEST_F(RtcpBuilderTest, RtcpSenderReport) {
|
| + RtcpSenderInfo sender_info;
|
| + sender_info.ntp_seconds = kNtpHigh;
|
| + sender_info.ntp_fraction = kNtpLow;
|
| + sender_info.rtp_timestamp = kRtpTimestamp;
|
| + sender_info.send_packet_count = kSendPacketCount;
|
| + sender_info.send_octet_count = kSendOctetCount;
|
| +
|
| + // Sender report + c_name.
|
| + TestRtcpPacketBuilder p;
|
| + p.AddSr(kSendingSsrc, 0);
|
| + p.AddSdesCname(kSendingSsrc, kCName);
|
| + test_transport_.SetExpectedRtcpPacket(p.Packet(), p.Length());
|
| +
|
| + rtcp_builder_->SendRtcpFromRtpSender(RtcpBuilder::kRtcpSr,
|
| + &sender_info,
|
| + NULL,
|
| + NULL);
|
| +
|
| + EXPECT_EQ(1, test_transport_.packet_count());
|
| +}
|
| +
|
| +TEST_F(RtcpBuilderTest, RtcpSenderReportWithDlrr) {
|
| + RtcpSenderInfo sender_info;
|
| + sender_info.ntp_seconds = kNtpHigh;
|
| + sender_info.ntp_fraction = kNtpLow;
|
| + sender_info.rtp_timestamp = kRtpTimestamp;
|
| + sender_info.send_packet_count = kSendPacketCount;
|
| + sender_info.send_octet_count = kSendOctetCount;
|
| +
|
| + // Sender report + c_name + dlrr.
|
| + TestRtcpPacketBuilder p1;
|
| + p1.AddSr(kSendingSsrc, 0);
|
| + p1.AddSdesCname(kSendingSsrc, kCName);
|
| + p1.AddXrHeader(kSendingSsrc);
|
| + p1.AddXrDlrrBlock(kSendingSsrc);
|
| + test_transport_.SetExpectedRtcpPacket(p1.Packet(), p1.Length());
|
| +
|
| + RtcpDlrrReportBlock dlrr_rb;
|
| + dlrr_rb.last_rr = kLastRr;
|
| + dlrr_rb.delay_since_last_rr = kDelayLastRr;
|
| +
|
| + rtcp_builder_->SendRtcpFromRtpSender(
|
| + RtcpBuilder::kRtcpSr | RtcpBuilder::kRtcpDlrr,
|
| + &sender_info,
|
| + &dlrr_rb,
|
| + NULL);
|
| +
|
| + EXPECT_EQ(1, test_transport_.packet_count());
|
| +}
|
| +
|
| +TEST_F(RtcpBuilderTest, RtcpSenderReportWithDlrrAndLog) {
|
| + RtcpSenderInfo sender_info;
|
| + sender_info.ntp_seconds = kNtpHigh;
|
| + sender_info.ntp_fraction = kNtpLow;
|
| + sender_info.rtp_timestamp = kRtpTimestamp;
|
| + sender_info.send_packet_count = kSendPacketCount;
|
| + sender_info.send_octet_count = kSendOctetCount;
|
| +
|
| + // Sender report + c_name + dlrr + sender log.
|
| + TestRtcpPacketBuilder p;
|
| + p.AddSr(kSendingSsrc, 0);
|
| + p.AddSdesCname(kSendingSsrc, kCName);
|
| + p.AddXrHeader(kSendingSsrc);
|
| + p.AddXrDlrrBlock(kSendingSsrc);
|
| + p.AddSenderLog(kSendingSsrc);
|
| + p.AddSenderFrameLog(kRtcpSenderFrameStatusSentToNetwork, kRtpTimestamp);
|
| +
|
| + test_transport_.SetExpectedRtcpPacket(p.Packet(), p.Length());
|
| +
|
| + RtcpDlrrReportBlock dlrr_rb;
|
| + dlrr_rb.last_rr = kLastRr;
|
| + dlrr_rb.delay_since_last_rr = kDelayLastRr;
|
| +
|
| + RtcpSenderFrameLogMessage sender_frame_log;
|
| + sender_frame_log.frame_status = kRtcpSenderFrameStatusSentToNetwork;
|
| + sender_frame_log.rtp_timestamp = kRtpTimestamp;
|
| +
|
| + RtcpSenderLogMessage sender_log;
|
| + sender_log.push_back(sender_frame_log);
|
| +
|
| + rtcp_builder_->SendRtcpFromRtpSender(
|
| + RtcpBuilder::kRtcpSr | RtcpBuilder::kRtcpDlrr |
|
| + RtcpBuilder::kRtcpSenderLog,
|
| + &sender_info,
|
| + &dlrr_rb,
|
| + &sender_log);
|
| +
|
| + EXPECT_EQ(1, test_transport_.packet_count());
|
| + EXPECT_TRUE(sender_log.empty());
|
| +}
|
| +
|
| +TEST_F(RtcpBuilderTest, RtcpSenderReporWithTooManyLogFrames) {
|
| + RtcpSenderInfo sender_info;
|
| + sender_info.ntp_seconds = kNtpHigh;
|
| + sender_info.ntp_fraction = kNtpLow;
|
| + sender_info.rtp_timestamp = kRtpTimestamp;
|
| + sender_info.send_packet_count = kSendPacketCount;
|
| + sender_info.send_octet_count = kSendOctetCount;
|
| +
|
| + // Sender report + c_name + sender log.
|
| + TestRtcpPacketBuilder p;
|
| + p.AddSr(kSendingSsrc, 0);
|
| + p.AddSdesCname(kSendingSsrc, kCName);
|
| + p.AddSenderLog(kSendingSsrc);
|
| +
|
| + for (int i = 0; i < 359; ++i) {
|
| + p.AddSenderFrameLog(kRtcpSenderFrameStatusSentToNetwork,
|
| + kRtpTimestamp + i * 90);
|
| + }
|
| + test_transport_.SetExpectedRtcpPacket(p.Packet(), p.Length());
|
| +
|
| +
|
| + RtcpSenderLogMessage sender_log;
|
| + for (int j = 0; j < 400; ++j) {
|
| + RtcpSenderFrameLogMessage sender_frame_log;
|
| + sender_frame_log.frame_status = kRtcpSenderFrameStatusSentToNetwork;
|
| + sender_frame_log.rtp_timestamp = kRtpTimestamp + j * 90;
|
| + sender_log.push_back(sender_frame_log);
|
| + }
|
| +
|
| + rtcp_builder_->SendRtcpFromRtpSender(
|
| + RtcpBuilder::kRtcpSr | RtcpBuilder::kRtcpSenderLog,
|
| + &sender_info,
|
| + NULL,
|
| + &sender_log);
|
| +
|
| + EXPECT_EQ(1, test_transport_.packet_count());
|
| + EXPECT_EQ(41u, sender_log.size());
|
| +}
|
| +
|
| +} // namespace cast
|
| +} // namespace media
|
|
|