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