rtp_rtcp_impl_unittest.cc revision e7b1e112833517c334a12aac16be17a27d798944
1/* 2 * Copyright (c) 2013 The WebRTC project authors. All Rights Reserved. 3 * 4 * Use of this source code is governed by a BSD-style license 5 * that can be found in the LICENSE file in the root of the source 6 * tree. An additional intellectual property rights grant can be found 7 * in the file PATENTS. All contributing project authors may 8 * be found in the AUTHORS file in the root of the source tree. 9 */ 10 11#include "testing/gmock/include/gmock/gmock.h" 12#include "testing/gtest/include/gtest/gtest.h" 13 14#include "webrtc/common_types.h" 15#include "webrtc/modules/rtp_rtcp/interface/rtp_rtcp_defines.h" 16#include "webrtc/modules/rtp_rtcp/source/rtp_rtcp_impl.h" 17 18namespace webrtc { 19namespace { 20 21class RtcpRttStatsTestImpl : public RtcpRttStats { 22 public: 23 RtcpRttStatsTestImpl() : rtt_ms_(0) {} 24 virtual ~RtcpRttStatsTestImpl() {} 25 26 virtual void OnRttUpdate(uint32_t rtt_ms) { 27 rtt_ms_ = rtt_ms; 28 } 29 virtual uint32_t LastProcessedRtt() const { 30 return rtt_ms_; 31 } 32 uint32_t rtt_ms_; 33}; 34 35class SendTransport : public Transport, 36 public NullRtpData { 37 public: 38 SendTransport() : rtp_rtcp_impl_(NULL), clock_(NULL), delay_ms_(0) {} 39 40 void SetRtpRtcpModule(ModuleRtpRtcpImpl* rtp_rtcp_impl) { 41 rtp_rtcp_impl_ = rtp_rtcp_impl; 42 } 43 void SimulateNetworkDelay(int delay_ms, SimulatedClock* clock) { 44 clock_ = clock; 45 delay_ms_ = delay_ms; 46 } 47 virtual int SendPacket(int /*ch*/, const void* /*data*/, int /*len*/) { 48 return -1; 49 } 50 virtual int SendRTCPPacket(int /*ch*/, const void *data, int len) { 51 if (clock_) { 52 clock_->AdvanceTimeMilliseconds(delay_ms_); 53 } 54 EXPECT_TRUE(rtp_rtcp_impl_ != NULL); 55 EXPECT_EQ(0, rtp_rtcp_impl_->IncomingRtcpPacket( 56 static_cast<const uint8_t*>(data), len)); 57 return len; 58 } 59 ModuleRtpRtcpImpl* rtp_rtcp_impl_; 60 SimulatedClock* clock_; 61 int delay_ms_; 62}; 63} // namespace 64 65class RtpRtcpImplTest : public ::testing::Test { 66 protected: 67 RtpRtcpImplTest() 68 : clock_(1335900000), 69 receive_statistics_(ReceiveStatistics::Create(&clock_)) { 70 RtpRtcp::Configuration configuration; 71 configuration.id = 0; 72 configuration.audio = false; 73 configuration.clock = &clock_; 74 configuration.outgoing_transport = &transport_; 75 configuration.receive_statistics = receive_statistics_.get(); 76 configuration.rtt_stats = &rtt_stats_; 77 78 rtp_rtcp_impl_.reset(new ModuleRtpRtcpImpl(configuration)); 79 transport_.SetRtpRtcpModule(rtp_rtcp_impl_.get()); 80 } 81 82 SimulatedClock clock_; 83 scoped_ptr<ReceiveStatistics> receive_statistics_; 84 scoped_ptr<ModuleRtpRtcpImpl> rtp_rtcp_impl_; 85 SendTransport transport_; 86 RtcpRttStatsTestImpl rtt_stats_; 87}; 88 89TEST_F(RtpRtcpImplTest, Rtt) { 90 const uint32_t kSsrc = 0x12345; 91 RTPHeader header = {}; 92 header.timestamp = 1; 93 header.sequenceNumber = 123; 94 header.ssrc = kSsrc; 95 header.headerLength = 12; 96 receive_statistics_->IncomingPacket(header, 100, false); 97 98 rtp_rtcp_impl_->SetRemoteSSRC(kSsrc); 99 EXPECT_EQ(0, rtp_rtcp_impl_->SetSendingStatus(true)); 100 EXPECT_EQ(0, rtp_rtcp_impl_->SetRTCPStatus(kRtcpCompound)); 101 EXPECT_EQ(0, rtp_rtcp_impl_->SetSSRC(kSsrc)); 102 103 // A SR should have been sent and received. 104 EXPECT_EQ(0, rtp_rtcp_impl_->SendRTCP(kRtcpReport)); 105 106 // Send new SR. A response to the last SR should be sent. 107 clock_.AdvanceTimeMilliseconds(1000); 108 transport_.SimulateNetworkDelay(100, &clock_); 109 EXPECT_EQ(0, rtp_rtcp_impl_->SendRTCP(kRtcpReport)); 110 111 // Verify RTT. 112 uint16_t rtt; 113 uint16_t avg_rtt; 114 uint16_t min_rtt; 115 uint16_t max_rtt; 116 EXPECT_EQ(0, rtp_rtcp_impl_->RTT(kSsrc, &rtt, &avg_rtt, &min_rtt, &max_rtt)); 117 EXPECT_EQ(100, rtt); 118 EXPECT_EQ(100, avg_rtt); 119 EXPECT_EQ(100, min_rtt); 120 EXPECT_EQ(100, max_rtt); 121 122 // No RTT from other ssrc. 123 EXPECT_EQ(-1, 124 rtp_rtcp_impl_->RTT(kSsrc + 1, &rtt, &avg_rtt, &min_rtt, &max_rtt)); 125 126 // Verify RTT from rtt_stats config. 127 EXPECT_EQ(0U, rtt_stats_.LastProcessedRtt()); 128 EXPECT_EQ(0U, rtp_rtcp_impl_->rtt_ms()); 129 rtp_rtcp_impl_->Process(); 130 EXPECT_EQ(100U, rtt_stats_.LastProcessedRtt()); 131 EXPECT_EQ(100U, rtp_rtcp_impl_->rtt_ms()); 132} 133 134TEST_F(RtpRtcpImplTest, SetRtcpXrRrtrStatus) { 135 EXPECT_FALSE(rtp_rtcp_impl_->RtcpXrRrtrStatus()); 136 rtp_rtcp_impl_->SetRtcpXrRrtrStatus(true); 137 EXPECT_TRUE(rtp_rtcp_impl_->RtcpXrRrtrStatus()); 138} 139 140TEST_F(RtpRtcpImplTest, RttForReceiverOnly) { 141 rtp_rtcp_impl_->SetRtcpXrRrtrStatus(true); 142 EXPECT_EQ(0, rtp_rtcp_impl_->SetSendingStatus(false)); 143 EXPECT_EQ(0, rtp_rtcp_impl_->SetRTCPStatus(kRtcpCompound)); 144 EXPECT_EQ(0, rtp_rtcp_impl_->SetSSRC(0x12345)); 145 146 // A Receiver time reference report (RTRR) should be sent and received. 147 EXPECT_EQ(0, rtp_rtcp_impl_->SendRTCP(kRtcpReport)); 148 149 // Send new RTRR. A response to the last RTRR should be sent. 150 clock_.AdvanceTimeMilliseconds(1000); 151 transport_.SimulateNetworkDelay(100, &clock_); 152 EXPECT_EQ(0, rtp_rtcp_impl_->SendRTCP(kRtcpReport)); 153 154 // Verify RTT. 155 EXPECT_EQ(0U, rtt_stats_.LastProcessedRtt()); 156 EXPECT_EQ(0U, rtp_rtcp_impl_->rtt_ms()); 157 rtp_rtcp_impl_->Process(); 158 EXPECT_EQ(100U, rtt_stats_.LastProcessedRtt()); 159 EXPECT_EQ(100U, rtp_rtcp_impl_->rtt_ms()); 160} 161 162} // namespace webrtc 163