Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(560)

Side by Side Diff: webrtc/modules/rtp_rtcp/source/rtcp_receiver_unittest.cc

Issue 2292093002: RtcpReceiverTest rewritten using public available interface (Closed) Base URL: https://chromium.googlesource.com/external/webrtc.git@master
Patch Set: Nits Created 4 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « no previous file | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 /* 1 /*
2 * Copyright (c) 2012 The WebRTC project authors. All Rights Reserved. 2 * Copyright (c) 2012 The WebRTC project authors. All Rights Reserved.
3 * 3 *
4 * Use of this source code is governed by a BSD-style license 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 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 6 * tree. An additional intellectual property rights grant can be found
7 * in the file PATENTS. All contributing project authors may 7 * in the file PATENTS. All contributing project authors may
8 * be found in the AUTHORS file in the root of the source tree. 8 * be found in the AUTHORS file in the root of the source tree.
9 */ 9 */
10 10
11 #include <memory> 11 #include <memory>
12 12
13 #include "testing/gmock/include/gmock/gmock.h" 13 #include "testing/gmock/include/gmock/gmock.h"
14 #include "testing/gtest/include/gtest/gtest.h" 14 #include "testing/gtest/include/gtest/gtest.h"
15 15 #include "webrtc/base/array_view.h"
16 #include "webrtc/base/rate_limiter.h" 16 #include "webrtc/base/random.h"
17 #include "webrtc/common_types.h" 17 #include "webrtc/common_types.h"
18 #include "webrtc/modules/remote_bitrate_estimator/include/mock/mock_remote_bitra te_observer.h"
19 #include "webrtc/modules/remote_bitrate_estimator/remote_bitrate_estimator_singl e_stream.h"
20 #include "webrtc/modules/rtp_rtcp/source/byte_io.h" 18 #include "webrtc/modules/rtp_rtcp/source/byte_io.h"
21 #include "webrtc/modules/rtp_rtcp/source/rtcp_packet.h" 19 #include "webrtc/modules/rtp_rtcp/source/rtcp_packet.h"
22 #include "webrtc/modules/rtp_rtcp/source/rtcp_packet/app.h" 20 #include "webrtc/modules/rtp_rtcp/source/rtcp_packet/app.h"
23 #include "webrtc/modules/rtp_rtcp/source/rtcp_packet/bye.h" 21 #include "webrtc/modules/rtp_rtcp/source/rtcp_packet/bye.h"
24 #include "webrtc/modules/rtp_rtcp/source/rtcp_packet/compound_packet.h" 22 #include "webrtc/modules/rtp_rtcp/source/rtcp_packet/compound_packet.h"
25 #include "webrtc/modules/rtp_rtcp/source/rtcp_packet/extended_jitter_report.h" 23 #include "webrtc/modules/rtp_rtcp/source/rtcp_packet/extended_jitter_report.h"
26 #include "webrtc/modules/rtp_rtcp/source/rtcp_packet/extended_reports.h" 24 #include "webrtc/modules/rtp_rtcp/source/rtcp_packet/extended_reports.h"
27 #include "webrtc/modules/rtp_rtcp/source/rtcp_packet/fir.h" 25 #include "webrtc/modules/rtp_rtcp/source/rtcp_packet/fir.h"
26 #include "webrtc/modules/rtp_rtcp/source/rtcp_packet/nack.h"
28 #include "webrtc/modules/rtp_rtcp/source/rtcp_packet/pli.h" 27 #include "webrtc/modules/rtp_rtcp/source/rtcp_packet/pli.h"
28 #include "webrtc/modules/rtp_rtcp/source/rtcp_packet/rapid_resync_request.h"
29 #include "webrtc/modules/rtp_rtcp/source/rtcp_packet/receiver_report.h" 29 #include "webrtc/modules/rtp_rtcp/source/rtcp_packet/receiver_report.h"
30 #include "webrtc/modules/rtp_rtcp/source/rtcp_packet/remb.h" 30 #include "webrtc/modules/rtp_rtcp/source/rtcp_packet/remb.h"
31 #include "webrtc/modules/rtp_rtcp/source/rtcp_packet/rpsi.h" 31 #include "webrtc/modules/rtp_rtcp/source/rtcp_packet/rpsi.h"
32 #include "webrtc/modules/rtp_rtcp/source/rtcp_packet/sdes.h" 32 #include "webrtc/modules/rtp_rtcp/source/rtcp_packet/sdes.h"
33 #include "webrtc/modules/rtp_rtcp/source/rtcp_packet/sender_report.h" 33 #include "webrtc/modules/rtp_rtcp/source/rtcp_packet/sender_report.h"
34 #include "webrtc/modules/rtp_rtcp/source/rtcp_packet/sli.h" 34 #include "webrtc/modules/rtp_rtcp/source/rtcp_packet/sli.h"
35 #include "webrtc/modules/rtp_rtcp/source/rtcp_packet/tmmbr.h" 35 #include "webrtc/modules/rtp_rtcp/source/rtcp_packet/tmmbr.h"
36 #include "webrtc/modules/rtp_rtcp/source/rtcp_packet/transport_feedback.h" 36 #include "webrtc/modules/rtp_rtcp/source/rtcp_packet/transport_feedback.h"
37 #include "webrtc/modules/rtp_rtcp/source/rtcp_receiver.h" 37 #include "webrtc/modules/rtp_rtcp/source/rtcp_receiver.h"
38 #include "webrtc/modules/rtp_rtcp/source/rtcp_sender.h"
39 #include "webrtc/modules/rtp_rtcp/source/rtp_rtcp_impl.h"
40 #include "webrtc/modules/rtp_rtcp/source/time_util.h" 38 #include "webrtc/modules/rtp_rtcp/source/time_util.h"
41 #include "webrtc/system_wrappers/include/ntp_time.h" 39 #include "webrtc/system_wrappers/include/ntp_time.h"
42 40
43 namespace webrtc { 41 namespace webrtc {
44 42 namespace {
45 namespace { // Anonymous namespace; hide utility functions and classes. 43
46 44 using ::testing::_;
47 // This test transport verifies that no functions get called. 45 using ::testing::AllOf;
48 class TestTransport : public Transport, 46 using ::testing::ElementsAreArray;
49 public NullRtpData { 47 using ::testing::Field;
50 public: 48 using ::testing::IsEmpty;
51 explicit TestTransport() : rtcp_receiver_(nullptr) {} 49 using ::testing::NiceMock;
52 void SetRTCPReceiver(RTCPReceiver* rtcp_receiver) { 50 using ::testing::Property;
53 rtcp_receiver_ = rtcp_receiver; 51 using ::testing::SizeIs;
54 } 52 using ::testing::StrEq;
55 bool SendRtp(const uint8_t* /*data*/, 53 using ::testing::StrictMock;
56 size_t /*len*/, 54 using ::testing::UnorderedElementsAre;
57 const PacketOptions& options) override { 55
58 ADD_FAILURE(); // FAIL() gives a compile error. 56 class MockRtcpPacketTypeCounterObserver : public RtcpPacketTypeCounterObserver {
59 return false; 57 public:
60 } 58 MOCK_METHOD2(RtcpPacketTypesCounterUpdated,
61 59 void(uint32_t, const RtcpPacketTypeCounter&));
62 bool SendRtcp(const uint8_t* packet, size_t packet_len) override { 60 };
63 ADD_FAILURE(); 61
64 return true; 62 class MockRtcpIntraFrameObserver : public RtcpIntraFrameObserver {
65 } 63 public:
66 64 MOCK_METHOD1(OnReceivedIntraFrameRequest, void(uint32_t));
67 int OnReceivedPayloadData(const uint8_t* payloadData, 65 MOCK_METHOD2(OnReceivedSLI, void(uint32_t, uint8_t));
68 const size_t payloadSize, 66 MOCK_METHOD2(OnReceivedRPSI, void(uint32_t, uint64_t));
69 const WebRtcRTPHeader* rtpHeader) override { 67 MOCK_METHOD2(OnLocalSsrcChanged, void(uint32_t, uint32_t));
70 ADD_FAILURE(); 68 };
71 return 0; 69
72 } 70 class MockRtcpCallbackImpl : public RtcpStatisticsCallback {
73 RTCPReceiver* rtcp_receiver_; 71 public:
74 }; 72 MOCK_METHOD2(StatisticsUpdated, void(const RtcpStatistics&, uint32_t));
73 MOCK_METHOD2(CNameChanged, void(const char*, uint32_t));
74 };
75
76 class MockTransportFeedbackObserver : public TransportFeedbackObserver {
77 public:
78 MOCK_METHOD3(AddPacket, void(uint16_t, size_t, int));
79 MOCK_METHOD1(OnTransportFeedback, void(const rtcp::TransportFeedback&));
80 };
81
82 class MockRtcpBandwidthObserver : public RtcpBandwidthObserver {
83 public:
84 MOCK_METHOD1(OnReceivedEstimatedBitrate, void(uint32_t));
85 MOCK_METHOD3(OnReceivedRtcpReceiverReport,
86 void(const ReportBlockList&, int64_t, int64_t));
87 };
88
89 class MockModuleRtpRtcp : public RTCPReceiver::ModuleRtpRtcp {
90 public:
91 MOCK_METHOD1(SetTmmbn, void(std::vector<rtcp::TmmbItem>));
92 MOCK_METHOD0(OnRequestSendReport, void());
93 MOCK_METHOD1(OnReceivedNack, void(const std::vector<uint16_t>&));
94 MOCK_METHOD1(OnReceivedRtcpReportBlocks, void(const ReportBlockList&));
95 };
96
97 // SSRC of remote peer, that sends rtcp packet to the rtcp receiver under test.
98 constexpr uint32_t kSenderSsrc = 0x10203;
99 // SSRCs of local peer, that rtcp packet addressed to.
100 constexpr uint32_t kReceiverSsrc = 0x123456;
philipel 2016/09/05 11:59:27 kReceiverSsrc1
danilchap 2016/09/05 13:27:55 Most of the tests it is the only ReceiverSsrc. Wil
101 // RtcpReceiver can accept several ssrc, e.g. regular and rtx streams.
102 constexpr uint32_t kReceiverSsrc2 = 0x1234567;
103 // SSRCs to ignore (i.e. not configured in RtcpReceiver).
104 constexpr uint32_t kNotToUsSsrc = 0x654321;
105 constexpr uint32_t kUnknownSenderSsrc = 0x54321;
106
107 } // namespace
75 108
76 class RtcpReceiverTest : public ::testing::Test { 109 class RtcpReceiverTest : public ::testing::Test {
77 protected: 110 protected:
78 RtcpReceiverTest() 111 RtcpReceiverTest()
79 : over_use_detector_options_(), 112 : system_clock_(1335900000),
sprang_webrtc 2016/09/05 11:05:49 Is there any meaning to this particular value? Is
danilchap 2016/09/05 11:54:16 No, just 'random' non-zero seed for the clock. Kep
80 system_clock_(1335900000), 113 rtcp_receiver_(&system_clock_,
81 remote_bitrate_observer_(), 114 false,
82 remote_bitrate_estimator_( 115 &packet_type_counter_observer_,
83 new RemoteBitrateEstimatorSingleStream(&remote_bitrate_observer_, 116 &bandwidth_observer_,
84 &system_clock_)), 117 &intra_frame_observer_,
85 retransmission_rate_limiter_(&system_clock_, 1000) { 118 &transport_feedback_observer_,
86 test_transport_.reset(new TestTransport()); 119 &rtp_rtcp_impl_) {}
87 120 void SetUp() {
88 RtpRtcp::Configuration configuration; 121 std::set<uint32_t> ssrcs = {kReceiverSsrc, kReceiverSsrc2};
89 configuration.audio = false; 122 EXPECT_CALL(intra_frame_observer_, OnLocalSsrcChanged(0, kReceiverSsrc));
90 configuration.clock = &system_clock_; 123 rtcp_receiver_.SetSsrcs(kReceiverSsrc, ssrcs);
91 configuration.outgoing_transport = test_transport_.get(); 124
92 configuration.remote_bitrate_estimator = remote_bitrate_estimator_.get(); 125 rtcp_receiver_.SetRemoteSSRC(kSenderSsrc);
93 configuration.retransmission_rate_limiter = &retransmission_rate_limiter_;
94 rtp_rtcp_impl_.reset(new ModuleRtpRtcpImpl(configuration));
95 rtcp_receiver_.reset(new RTCPReceiver(&system_clock_, false, nullptr,
96 nullptr, nullptr, nullptr,
97 rtp_rtcp_impl_.get()));
98 test_transport_->SetRTCPReceiver(rtcp_receiver_.get());
99 } 126 }
100 127
101 ~RtcpReceiverTest() {} 128 void InjectRtcpPacket(rtc::ArrayView<const uint8_t> raw) {
102 129 rtcp_receiver_.IncomingPacket(raw.data(), raw.size());
103 // Injects an RTCP packet into the receiver.
104 // Returns 0 for OK, non-0 for failure.
105 int InjectRtcpPacket(const uint8_t* packet,
106 uint16_t packet_len) {
107 RTCPUtility::RTCPParserV2 rtcpParser(packet,
108 packet_len,
109 true); // Allow non-compound RTCP
110
111 RTCPHelp::RTCPPacketInformation rtcpPacketInformation;
112 EXPECT_EQ(0, rtcp_receiver_->IncomingRTCPPacket(rtcpPacketInformation,
113 &rtcpParser));
114 rtcp_receiver_->TriggerCallbacksFromRTCPPacket(rtcpPacketInformation);
115 // The NACK list is on purpose not copied below as it isn't needed by the
116 // test.
117 rtcp_packet_info_.rtcpPacketTypeFlags =
118 rtcpPacketInformation.rtcpPacketTypeFlags;
119 rtcp_packet_info_.remoteSSRC = rtcpPacketInformation.remoteSSRC;
120 rtcp_packet_info_.applicationSubType =
121 rtcpPacketInformation.applicationSubType;
122 rtcp_packet_info_.applicationName = rtcpPacketInformation.applicationName;
123 rtcp_packet_info_.applicationLength =
124 rtcpPacketInformation.applicationLength;
125 rtcp_packet_info_.report_blocks = rtcpPacketInformation.report_blocks;
126 rtcp_packet_info_.rtt = rtcpPacketInformation.rtt;
127 rtcp_packet_info_.interArrivalJitter =
128 rtcpPacketInformation.interArrivalJitter;
129 rtcp_packet_info_.sliPictureId = rtcpPacketInformation.sliPictureId;
130 rtcp_packet_info_.rpsiPictureId = rtcpPacketInformation.rpsiPictureId;
131 rtcp_packet_info_.receiverEstimatedMaxBitrate =
132 rtcpPacketInformation.receiverEstimatedMaxBitrate;
133 rtcp_packet_info_.ntp_secs = rtcpPacketInformation.ntp_secs;
134 rtcp_packet_info_.ntp_frac = rtcpPacketInformation.ntp_frac;
135 rtcp_packet_info_.rtp_timestamp = rtcpPacketInformation.rtp_timestamp;
136 rtcp_packet_info_.xr_dlrr_item = rtcpPacketInformation.xr_dlrr_item;
137 if (rtcpPacketInformation.VoIPMetric)
138 rtcp_packet_info_.AddVoIPMetric(rtcpPacketInformation.VoIPMetric.get());
139 rtcp_packet_info_.transport_feedback_.reset(
140 rtcpPacketInformation.transport_feedback_.release());
141 return 0;
142 } 130 }
sprang_webrtc 2016/09/05 11:05:49 nit: \n
danilchap 2016/09/05 11:54:15 Done.
143 131 void InjectRtcpPacket(const rtcp::RtcpPacket& packet) {
144 OverUseDetectorOptions over_use_detector_options_; 132 rtc::Buffer raw = packet.Build();
133 rtcp_receiver_.IncomingPacket(raw.data(), raw.size());
134 }
135
145 SimulatedClock system_clock_; 136 SimulatedClock system_clock_;
146 std::unique_ptr<TestTransport> test_transport_; 137 // Callbacks to packet_type_counter_observer are frequent but most of the time
147 std::unique_ptr<ModuleRtpRtcpImpl> rtp_rtcp_impl_; 138 // are not interesting.
148 std::unique_ptr<RTCPReceiver> rtcp_receiver_; 139 NiceMock<MockRtcpPacketTypeCounterObserver> packet_type_counter_observer_;
149 RTCPHelp::RTCPPacketInformation rtcp_packet_info_; 140 StrictMock<MockRtcpBandwidthObserver> bandwidth_observer_;
150 MockRemoteBitrateObserver remote_bitrate_observer_; 141 StrictMock<MockRtcpIntraFrameObserver> intra_frame_observer_;
151 std::unique_ptr<RemoteBitrateEstimator> remote_bitrate_estimator_; 142 StrictMock<MockTransportFeedbackObserver> transport_feedback_observer_;
152 RateLimiter retransmission_rate_limiter_; 143 StrictMock<MockModuleRtpRtcp> rtp_rtcp_impl_;
153 }; 144
154 145 RTCPReceiver rtcp_receiver_;
146 };
155 147
156 TEST_F(RtcpReceiverTest, BrokenPacketIsIgnored) { 148 TEST_F(RtcpReceiverTest, BrokenPacketIsIgnored) {
157 const uint8_t bad_packet[] = {0, 0, 0, 0}; 149 const uint8_t bad_packet[] = {0, 0, 0, 0};
158 EXPECT_EQ(0, InjectRtcpPacket(bad_packet, sizeof(bad_packet))); 150 EXPECT_CALL(packet_type_counter_observer_,
159 EXPECT_EQ(0U, rtcp_packet_info_.rtcpPacketTypeFlags); 151 RtcpPacketTypesCounterUpdated(_, _))
152 .Times(0);
153 InjectRtcpPacket(bad_packet);
160 } 154 }
161 155
162 TEST_F(RtcpReceiverTest, InvalidFeedbackPacketIsIgnored) { 156 TEST_F(RtcpReceiverTest, InvalidFeedbackPacketIsIgnored) {
163 // Too short feedback packet. 157 // Too short feedback packet.
164 const uint8_t bad_packet[] = {0x80, RTCPUtility::PT_RTPFB, 0, 0}; 158 const uint8_t bad_packet[] = {0x81, rtcp::Rtpfb::kPacketType, 0, 0};
165 EXPECT_EQ(0, InjectRtcpPacket(bad_packet, sizeof(bad_packet))); 159
166 EXPECT_EQ(0U, rtcp_packet_info_.rtcpPacketTypeFlags); 160 InjectRtcpPacket(bad_packet);
167 } 161 }
168 162
169 TEST_F(RtcpReceiverTest, RpsiWithFractionalPaddingIsIgnored) { 163 TEST_F(RtcpReceiverTest, RpsiWithFractionalPaddingIsIgnored) {
170 // Padding size represent fractional number of bytes. 164 // Padding size represent fractional number of bytes.
171 const uint8_t kPaddingSizeBits = 0x0b; 165 const uint8_t kPaddingSizeBits = 0x0b;
172 const uint8_t bad_packet[] = {0x83, RTCPUtility::PT_PSFB, 0, 3, 166 // clang-format off
167 const uint8_t bad_packet[] = {0x80 | rtcp::Rpsi::kFeedbackMessageType,
168 rtcp::Rpsi::kPacketType, 0, 3,
sprang_webrtc 2016/09/05 11:05:49 Is this dent in indentation intended?
danilchap 2016/09/05 11:54:15 Yes, to show rtcp::Rpsi::kPacketType is aligned wi
173 0x12, 0x34, 0x56, 0x78, 169 0x12, 0x34, 0x56, 0x78,
174 0x98, 0x76, 0x54, 0x32, 170 0x98, 0x76, 0x54, 0x32,
175 kPaddingSizeBits, 0x00, 0x00, 0x00}; 171 kPaddingSizeBits, 0x00, 0x00, 0x00};
176 EXPECT_EQ(0, InjectRtcpPacket(bad_packet, sizeof(bad_packet))); 172 // clang-format on
177 EXPECT_EQ(0U, rtcp_packet_info_.rtcpPacketTypeFlags); 173 EXPECT_CALL(intra_frame_observer_, OnReceivedRPSI(_, _)).Times(0);
philipel 2016/09/05 11:59:27 Not needed since |intra_frame_observer_| is strict
danilchap 2016/09/05 13:27:55 Yes, but this test want to stress this call is not
philipel 2016/09/05 13:38:44 I guess it works like documentation, but when you
174 InjectRtcpPacket(bad_packet);
178 } 175 }
179 176
180 TEST_F(RtcpReceiverTest, RpsiWithTooLargePaddingIsIgnored) { 177 TEST_F(RtcpReceiverTest, RpsiWithTooLargePaddingIsIgnored) {
181 // Padding size exceeds packet size. 178 // Padding size exceeds packet size.
182 const uint8_t kPaddingSizeBits = 0xa8; 179 const uint8_t kPaddingSizeBits = 0xa8;
183 const uint8_t bad_packet[] = {0x83, RTCPUtility::PT_PSFB, 0, 3, 180 // clang-format off
181 const uint8_t bad_packet[] = {0x80 | rtcp::Rpsi::kFeedbackMessageType,
182 rtcp::Rpsi::kPacketType, 0, 3,
184 0x12, 0x34, 0x56, 0x78, 183 0x12, 0x34, 0x56, 0x78,
185 0x98, 0x76, 0x54, 0x32, 184 0x98, 0x76, 0x54, 0x32,
186 kPaddingSizeBits, 0x00, 0x00, 0x00}; 185 kPaddingSizeBits, 0x00, 0x00, 0x00};
187 EXPECT_EQ(0, InjectRtcpPacket(bad_packet, sizeof(bad_packet))); 186 // clang-format on
188 EXPECT_EQ(0U, rtcp_packet_info_.rtcpPacketTypeFlags); 187 EXPECT_CALL(intra_frame_observer_, OnReceivedRPSI(_, _)).Times(0);
philipel 2016/09/05 11:59:27 ditto
danilchap 2016/09/05 13:27:55 Acknowledged.
188 InjectRtcpPacket(bad_packet);
189 } 189 }
190 190
191 // With parsing using rtcp classes this test will make no sense. 191 // With parsing using rtcp classes this test will make no sense.
192 // With current stateful parser this test was failing. 192 // With current stateful parser this test was failing.
193 TEST_F(RtcpReceiverTest, TwoHalfValidRpsiAreIgnored) { 193 TEST_F(RtcpReceiverTest, TwoHalfValidRpsiAreIgnored) {
194 const uint8_t bad_packet[] = {0x83, RTCPUtility::PT_PSFB, 0, 2, 194 // clang-format off
195 const uint8_t bad_packet[] = {0x80 | rtcp::Rpsi::kFeedbackMessageType,
196 rtcp::Rpsi::kPacketType, 0, 2,
195 0x12, 0x34, 0x56, 0x78, 197 0x12, 0x34, 0x56, 0x78,
196 0x98, 0x76, 0x54, 0x32, 198 0x98, 0x76, 0x54, 0x32,
197 0x83, RTCPUtility::PT_PSFB, 0, 2, 199 0x80 | rtcp::Rpsi::kFeedbackMessageType,
200 rtcp::Rpsi::kPacketType, 0, 2,
198 0x12, 0x34, 0x56, 0x78, 201 0x12, 0x34, 0x56, 0x78,
199 0x98, 0x76, 0x54, 0x32}; 202 0x98, 0x76, 0x54, 0x32};
200 EXPECT_EQ(0, InjectRtcpPacket(bad_packet, sizeof(bad_packet))); 203 // clang-format on
201 EXPECT_EQ(0U, rtcp_packet_info_.rtcpPacketTypeFlags); 204 EXPECT_CALL(intra_frame_observer_, OnReceivedRPSI(_, _)).Times(0);
philipel 2016/09/05 11:59:27 ditto.
danilchap 2016/09/05 13:27:55 Acknowledged.
205 InjectRtcpPacket(bad_packet);
202 } 206 }
203 207
204 TEST_F(RtcpReceiverTest, InjectRpsiPacket) { 208 TEST_F(RtcpReceiverTest, InjectRpsiPacket) {
205 const uint64_t kPictureId = 0x123456789; 209 const uint64_t kPictureId = 0x123456789;
206 rtcp::Rpsi rpsi; 210 rtcp::Rpsi rpsi;
207 rpsi.WithPictureId(kPictureId); 211 rpsi.WithPictureId(kPictureId);
208 rtc::Buffer packet = rpsi.Build(); 212
209 EXPECT_EQ(0, InjectRtcpPacket(packet.data(), packet.size())); 213 EXPECT_CALL(intra_frame_observer_, OnReceivedRPSI(_, kPictureId));
210 EXPECT_EQ(kRtcpRpsi, rtcp_packet_info_.rtcpPacketTypeFlags); 214 InjectRtcpPacket(rpsi);
211 } 215 }
212 216
213 TEST_F(RtcpReceiverTest, InjectSrPacket) { 217 TEST_F(RtcpReceiverTest, InjectSrPacket) {
214 const uint32_t kSenderSsrc = 0x10203; 218 int64_t now = system_clock_.TimeInMilliseconds();
219 rtcp::SenderReport sr;
220 sr.From(kUnknownSenderSsrc);
221
222 // The parser will handle report blocks in Sender Report from other than his
223 // expected peer.
224 EXPECT_CALL(rtp_rtcp_impl_, OnReceivedRtcpReportBlocks(_));
225 EXPECT_CALL(bandwidth_observer_, OnReceivedRtcpReceiverReport(_, _, now));
226 InjectRtcpPacket(sr);
227
228 // But will not flag that he's gotten sender information.
229 RTCPSenderInfo info;
230 EXPECT_EQ(-1, rtcp_receiver_.SenderInfoReceived(&info));
231 }
232
233 TEST_F(RtcpReceiverTest, InjectSrPacketFromExpectedPeer) {
sprang_webrtc 2016/09/05 11:05:49 Maybe it makes sense to move this up and call it I
danilchap 2016/09/05 11:54:15 It sure does, Done. Tried to minimize moving code
234 RTCPSenderInfo info;
235 EXPECT_EQ(-1, rtcp_receiver_.SenderInfoReceived(&info));
236
237 int64_t now = system_clock_.TimeInMilliseconds();
215 rtcp::SenderReport sr; 238 rtcp::SenderReport sr;
216 sr.From(kSenderSsrc); 239 sr.From(kSenderSsrc);
217 rtc::Buffer packet = sr.Build(); 240
218 EXPECT_EQ(0, InjectRtcpPacket(packet.data(), packet.size())); 241 EXPECT_CALL(rtp_rtcp_impl_, OnReceivedRtcpReportBlocks(IsEmpty()));
219 // The parser will note the remote SSRC on a SR from other than his 242 EXPECT_CALL(bandwidth_observer_,
220 // expected peer, but will not flag that he's gotten a packet. 243 OnReceivedRtcpReceiverReport(IsEmpty(), _, now));
221 EXPECT_EQ(kSenderSsrc, rtcp_packet_info_.remoteSSRC); 244 InjectRtcpPacket(sr);
222 EXPECT_EQ(0U, kRtcpSr & rtcp_packet_info_.rtcpPacketTypeFlags); 245
223 } 246 EXPECT_EQ(0, rtcp_receiver_.SenderInfoReceived(&info));
224
225 TEST_F(RtcpReceiverTest, InjectSrPacketFromExpectedPeer) {
226 const uint32_t kSenderSsrc = 0x10203;
227 rtcp_receiver_->SetRemoteSSRC(kSenderSsrc);
228 rtcp::SenderReport sr;
229 sr.From(kSenderSsrc);
230 rtc::Buffer packet = sr.Build();
231 EXPECT_EQ(0, InjectRtcpPacket(packet.data(), packet.size()));
232 EXPECT_EQ(kSenderSsrc, rtcp_packet_info_.remoteSSRC);
233 EXPECT_EQ(kRtcpSr, rtcp_packet_info_.rtcpPacketTypeFlags);
234 } 247 }
235 248
236 TEST_F(RtcpReceiverTest, InjectSrPacketCalculatesRTT) { 249 TEST_F(RtcpReceiverTest, InjectSrPacketCalculatesRTT) {
237 Random r(0x0123456789abcdef); 250 Random r(0x0123456789abcdef);
238 const uint32_t kSenderSsrc = r.Rand(0x00000001u, 0xfffffffeu);
239 const uint32_t kRemoteSsrc = r.Rand(0x00000001u, 0xfffffffeu);
240 const int64_t kRttMs = r.Rand(1, 9 * 3600 * 1000); 251 const int64_t kRttMs = r.Rand(1, 9 * 3600 * 1000);
241 const uint32_t kDelayNtp = r.Rand(0, 0x7fffffff); 252 const uint32_t kDelayNtp = r.Rand(0, 0x7fffffff);
242 const int64_t kDelayMs = CompactNtpRttToMs(kDelayNtp); 253 const int64_t kDelayMs = CompactNtpRttToMs(kDelayNtp);
243 254
244 rtcp_receiver_->SetRemoteSSRC(kSenderSsrc);
245 std::set<uint32_t> ssrcs;
246 ssrcs.insert(kRemoteSsrc);
247 rtcp_receiver_->SetSsrcs(kRemoteSsrc, ssrcs);
248
249 int64_t rtt_ms = 0; 255 int64_t rtt_ms = 0;
250 EXPECT_EQ( 256 EXPECT_EQ(
251 -1, rtcp_receiver_->RTT(kSenderSsrc, &rtt_ms, nullptr, nullptr, nullptr)); 257 -1, rtcp_receiver_.RTT(kSenderSsrc, &rtt_ms, nullptr, nullptr, nullptr));
252 258
253 uint32_t sent_ntp = CompactNtp(NtpTime(system_clock_)); 259 uint32_t sent_ntp = CompactNtp(NtpTime(system_clock_));
254 system_clock_.AdvanceTimeMilliseconds(kRttMs + kDelayMs); 260 system_clock_.AdvanceTimeMilliseconds(kRttMs + kDelayMs);
255 261
256 rtcp::SenderReport sr; 262 rtcp::SenderReport sr;
257 sr.From(kSenderSsrc); 263 sr.From(kSenderSsrc);
258 rtcp::ReportBlock block; 264 rtcp::ReportBlock block;
259 block.To(kRemoteSsrc); 265 block.To(kReceiverSsrc);
260 block.WithLastSr(sent_ntp); 266 block.WithLastSr(sent_ntp);
261 block.WithDelayLastSr(kDelayNtp); 267 block.WithDelayLastSr(kDelayNtp);
262 sr.WithReportBlock(block); 268 sr.WithReportBlock(block);
263 269
264 rtc::Buffer packet = sr.Build(); 270 EXPECT_CALL(rtp_rtcp_impl_, OnReceivedRtcpReportBlocks(_));
265 EXPECT_EQ(0, InjectRtcpPacket(packet.data(), packet.size())); 271 EXPECT_CALL(bandwidth_observer_, OnReceivedRtcpReceiverReport(_, _, _));
272 InjectRtcpPacket(sr);
266 273
267 EXPECT_EQ( 274 EXPECT_EQ(
268 0, rtcp_receiver_->RTT(kSenderSsrc, &rtt_ms, nullptr, nullptr, nullptr)); 275 0, rtcp_receiver_.RTT(kSenderSsrc, &rtt_ms, nullptr, nullptr, nullptr));
269 EXPECT_NEAR(kRttMs, rtt_ms, 1); 276 EXPECT_NEAR(kRttMs, rtt_ms, 1);
270 } 277 }
271 278
272 TEST_F(RtcpReceiverTest, InjectSrPacketCalculatesNegativeRTTAsOne) { 279 TEST_F(RtcpReceiverTest, InjectSrPacketCalculatesNegativeRTTAsOne) {
273 Random r(0x0123456789abcdef); 280 Random r(0x0123456789abcdef);
274 const uint32_t kSenderSsrc = r.Rand(0x00000001u, 0xfffffffeu);
275 const uint32_t kRemoteSsrc = r.Rand(0x00000001u, 0xfffffffeu);
276 const int64_t kRttMs = r.Rand(-3600 * 1000, -1); 281 const int64_t kRttMs = r.Rand(-3600 * 1000, -1);
277 const uint32_t kDelayNtp = r.Rand(0, 0x7fffffff); 282 const uint32_t kDelayNtp = r.Rand(0, 0x7fffffff);
278 const int64_t kDelayMs = CompactNtpRttToMs(kDelayNtp); 283 const int64_t kDelayMs = CompactNtpRttToMs(kDelayNtp);
279 284
280 rtcp_receiver_->SetRemoteSSRC(kSenderSsrc);
281 std::set<uint32_t> ssrcs;
282 ssrcs.insert(kRemoteSsrc);
283 rtcp_receiver_->SetSsrcs(kRemoteSsrc, ssrcs);
284
285 int64_t rtt_ms = 0; 285 int64_t rtt_ms = 0;
286 EXPECT_EQ( 286 EXPECT_EQ(
287 -1, rtcp_receiver_->RTT(kSenderSsrc, &rtt_ms, nullptr, nullptr, nullptr)); 287 -1, rtcp_receiver_.RTT(kSenderSsrc, &rtt_ms, nullptr, nullptr, nullptr));
288 288
289 uint32_t sent_ntp = CompactNtp(NtpTime(system_clock_)); 289 uint32_t sent_ntp = CompactNtp(NtpTime(system_clock_));
290 system_clock_.AdvanceTimeMilliseconds(kRttMs + kDelayMs); 290 system_clock_.AdvanceTimeMilliseconds(kRttMs + kDelayMs);
291 291
292 rtcp::SenderReport sr; 292 rtcp::SenderReport sr;
293 sr.From(kSenderSsrc); 293 sr.From(kSenderSsrc);
294 rtcp::ReportBlock block; 294 rtcp::ReportBlock block;
295 block.To(kRemoteSsrc); 295 block.To(kReceiverSsrc);
296 block.WithLastSr(sent_ntp); 296 block.WithLastSr(sent_ntp);
297 block.WithDelayLastSr(kDelayNtp); 297 block.WithDelayLastSr(kDelayNtp);
298 sr.WithReportBlock(block); 298 sr.WithReportBlock(block);
299 299
300 rtc::Buffer packet = sr.Build(); 300 EXPECT_CALL(rtp_rtcp_impl_, OnReceivedRtcpReportBlocks(SizeIs(1)));
301 EXPECT_EQ(0, InjectRtcpPacket(packet.data(), packet.size())); 301 EXPECT_CALL(bandwidth_observer_,
302 OnReceivedRtcpReceiverReport(SizeIs(1), _, _));
303 InjectRtcpPacket(sr);
302 304
303 EXPECT_EQ( 305 EXPECT_EQ(
304 0, rtcp_receiver_->RTT(kSenderSsrc, &rtt_ms, nullptr, nullptr, nullptr)); 306 0, rtcp_receiver_.RTT(kSenderSsrc, &rtt_ms, nullptr, nullptr, nullptr));
305 EXPECT_EQ(1, rtt_ms); 307 EXPECT_EQ(1, rtt_ms);
306 } 308 }
307 309
308 TEST_F(RtcpReceiverTest, InjectRrPacket) { 310 TEST_F(RtcpReceiverTest, InjectRrPacket) {
309 const uint32_t kSenderSsrc = 0x10203; 311 int64_t now = system_clock_.TimeInMilliseconds();
310 rtcp::ReceiverReport rr; 312 rtcp::ReceiverReport rr;
311 rr.From(kSenderSsrc); 313 rr.From(kSenderSsrc);
312 rtc::Buffer packet = rr.Build(); 314
313 EXPECT_EQ(0, InjectRtcpPacket(packet.data(), packet.size())); 315 EXPECT_CALL(rtp_rtcp_impl_, OnReceivedRtcpReportBlocks(IsEmpty()));
314 EXPECT_EQ(kSenderSsrc, rtcp_packet_info_.remoteSSRC); 316 EXPECT_CALL(bandwidth_observer_,
315 EXPECT_EQ(kRtcpRr, rtcp_packet_info_.rtcpPacketTypeFlags); 317 OnReceivedRtcpReceiverReport(IsEmpty(), _, now));
316 ASSERT_EQ(0u, rtcp_packet_info_.report_blocks.size()); 318 InjectRtcpPacket(rr);
319
320 RTCPSenderInfo info;
321 EXPECT_EQ(-1, rtcp_receiver_.SenderInfoReceived(&info));
322 EXPECT_EQ(now, rtcp_receiver_.LastReceivedReceiverReport());
323 std::vector<RTCPReportBlock> report_blocks;
324 rtcp_receiver_.StatisticsReceived(&report_blocks);
325 EXPECT_TRUE(report_blocks.empty());
317 } 326 }
318 327
319 TEST_F(RtcpReceiverTest, InjectRrPacketWithReportBlockNotToUsIgnored) { 328 TEST_F(RtcpReceiverTest, InjectRrPacketWithReportBlockNotToUsIgnored) {
320 const uint32_t kSenderSsrc = 0x10203; 329 int64_t now = system_clock_.TimeInMilliseconds();
321 const uint32_t kSourceSsrc = 0x123456;
322 std::set<uint32_t> ssrcs;
323 ssrcs.insert(kSourceSsrc);
324 rtcp_receiver_->SetSsrcs(kSourceSsrc, ssrcs);
325
326 rtcp::ReportBlock rb; 330 rtcp::ReportBlock rb;
327 rb.To(kSourceSsrc + 1); 331 rb.To(kNotToUsSsrc);
328 rtcp::ReceiverReport rr; 332 rtcp::ReceiverReport rr;
329 rr.From(kSenderSsrc); 333 rr.From(kSenderSsrc);
330 rr.WithReportBlock(rb); 334 rr.WithReportBlock(rb);
331 rtc::Buffer packet = rr.Build();
332 EXPECT_EQ(0, InjectRtcpPacket(packet.data(), packet.size()));
333 EXPECT_EQ(kSenderSsrc, rtcp_packet_info_.remoteSSRC);
334 EXPECT_EQ(kRtcpRr, rtcp_packet_info_.rtcpPacketTypeFlags);
335 ASSERT_EQ(0u, rtcp_packet_info_.report_blocks.size());
336 335
336 EXPECT_CALL(rtp_rtcp_impl_, OnReceivedRtcpReportBlocks(IsEmpty()));
337 EXPECT_CALL(bandwidth_observer_,
338 OnReceivedRtcpReceiverReport(IsEmpty(), _, now));
339 InjectRtcpPacket(rr);
340
341 EXPECT_EQ(now, rtcp_receiver_.LastReceivedReceiverReport());
337 std::vector<RTCPReportBlock> received_blocks; 342 std::vector<RTCPReportBlock> received_blocks;
338 rtcp_receiver_->StatisticsReceived(&received_blocks); 343 rtcp_receiver_.StatisticsReceived(&received_blocks);
339 EXPECT_TRUE(received_blocks.empty()); 344 EXPECT_TRUE(received_blocks.empty());
340 } 345 }
341 346
342 TEST_F(RtcpReceiverTest, InjectRrPacketWithOneReportBlock) { 347 TEST_F(RtcpReceiverTest, InjectRrPacketWithOneReportBlock) {
343 const uint32_t kSenderSsrc = 0x10203; 348 int64_t now = system_clock_.TimeInMilliseconds();
344 const uint32_t kSourceSsrc = 0x123456;
345 std::set<uint32_t> ssrcs;
346 ssrcs.insert(kSourceSsrc);
347 rtcp_receiver_->SetSsrcs(kSourceSsrc, ssrcs);
348 349
349 rtcp::ReportBlock rb; 350 rtcp::ReportBlock rb;
350 rb.To(kSourceSsrc); 351 rb.To(kReceiverSsrc);
351 rtcp::ReceiverReport rr; 352 rtcp::ReceiverReport rr;
352 rr.From(kSenderSsrc); 353 rr.From(kSenderSsrc);
353 rr.WithReportBlock(rb); 354 rr.WithReportBlock(rb);
354 rtc::Buffer packet = rr.Build();
355 EXPECT_EQ(0, InjectRtcpPacket(packet.data(), packet.size()));
356 EXPECT_EQ(kSenderSsrc, rtcp_packet_info_.remoteSSRC);
357 EXPECT_EQ(kRtcpRr, rtcp_packet_info_.rtcpPacketTypeFlags);
358 ASSERT_EQ(1u, rtcp_packet_info_.report_blocks.size());
359 355
356 EXPECT_CALL(rtp_rtcp_impl_, OnReceivedRtcpReportBlocks(SizeIs(1)));
357 EXPECT_CALL(bandwidth_observer_,
358 OnReceivedRtcpReceiverReport(SizeIs(1), _, now));
359 InjectRtcpPacket(rr);
360
361 EXPECT_EQ(now, rtcp_receiver_.LastReceivedReceiverReport());
360 std::vector<RTCPReportBlock> received_blocks; 362 std::vector<RTCPReportBlock> received_blocks;
361 rtcp_receiver_->StatisticsReceived(&received_blocks); 363 rtcp_receiver_.StatisticsReceived(&received_blocks);
362 EXPECT_EQ(1u, received_blocks.size()); 364 EXPECT_EQ(1u, received_blocks.size());
363 } 365 }
364 366
365 TEST_F(RtcpReceiverTest, InjectRrPacketWithTwoReportBlocks) { 367 TEST_F(RtcpReceiverTest, InjectRrPacketWithTwoReportBlocks) {
366 const uint32_t kSenderSsrc = 0x10203;
367 const uint32_t kSourceSsrcs[] = {0x40506, 0x50607};
368 const uint16_t kSequenceNumbers[] = {10, 12423}; 368 const uint16_t kSequenceNumbers[] = {10, 12423};
369 const uint32_t kCumLost[] = {13, 555}; 369 const uint32_t kCumLost[] = {13, 555};
370 const uint8_t kFracLost[] = {20, 11}; 370 const uint8_t kFracLost[] = {20, 11};
371 const int kNumSsrcs = sizeof(kSourceSsrcs) / sizeof(kSourceSsrcs[0]); 371 int64_t now = system_clock_.TimeInMilliseconds();
372
373 std::set<uint32_t> ssrcs(kSourceSsrcs, kSourceSsrcs + kNumSsrcs);
374 rtcp_receiver_->SetSsrcs(kSourceSsrcs[0], ssrcs);
375 372
376 rtcp::ReportBlock rb1; 373 rtcp::ReportBlock rb1;
377 rb1.To(kSourceSsrcs[0]); 374 rb1.To(kReceiverSsrc);
378 rb1.WithExtHighestSeqNum(kSequenceNumbers[0]); 375 rb1.WithExtHighestSeqNum(kSequenceNumbers[0]);
379 rb1.WithFractionLost(10); 376 rb1.WithFractionLost(10);
380 rb1.WithCumulativeLost(5);
381 377
382 rtcp::ReportBlock rb2; 378 rtcp::ReportBlock rb2;
383 rb2.To(kSourceSsrcs[1]); 379 rb2.To(kReceiverSsrc2);
384 rb2.WithExtHighestSeqNum(kSequenceNumbers[1]); 380 rb2.WithExtHighestSeqNum(kSequenceNumbers[1]);
381 rb2.WithFractionLost(0);
385 382
386 rtcp::ReceiverReport rr1; 383 rtcp::ReceiverReport rr1;
387 rr1.From(kSenderSsrc); 384 rr1.From(kSenderSsrc);
388 rr1.WithReportBlock(rb1); 385 rr1.WithReportBlock(rb1);
389 rr1.WithReportBlock(rb2); 386 rr1.WithReportBlock(rb2);
390 387
391 rtc::Buffer p1 = rr1.Build(); 388 EXPECT_CALL(rtp_rtcp_impl_, OnReceivedRtcpReportBlocks(SizeIs(2)));
392 EXPECT_EQ(0, InjectRtcpPacket(p1.data(), p1.size())); 389 EXPECT_CALL(bandwidth_observer_,
393 ASSERT_EQ(2u, rtcp_packet_info_.report_blocks.size()); 390 OnReceivedRtcpReceiverReport(SizeIs(2), _, now));
394 EXPECT_EQ(10, rtcp_packet_info_.report_blocks.front().fractionLost); 391 InjectRtcpPacket(rr1);
395 EXPECT_EQ(0, rtcp_packet_info_.report_blocks.back().fractionLost);
396 392
393 EXPECT_EQ(now, rtcp_receiver_.LastReceivedReceiverReport());
394 std::vector<RTCPReportBlock> received_blocks;
395 rtcp_receiver_.StatisticsReceived(&received_blocks);
396 EXPECT_THAT(received_blocks,
397 UnorderedElementsAre(Field(&RTCPReportBlock::fractionLost, 0),
398 Field(&RTCPReportBlock::fractionLost, 10)));
399
400 // Insert next receiver report with same ssrc but new values.
397 rtcp::ReportBlock rb3; 401 rtcp::ReportBlock rb3;
398 rb3.To(kSourceSsrcs[0]); 402 rb3.To(kReceiverSsrc);
399 rb3.WithExtHighestSeqNum(kSequenceNumbers[0]); 403 rb3.WithExtHighestSeqNum(kSequenceNumbers[0]);
400 rb3.WithFractionLost(kFracLost[0]); 404 rb3.WithFractionLost(kFracLost[0]);
401 rb3.WithCumulativeLost(kCumLost[0]); 405 rb3.WithCumulativeLost(kCumLost[0]);
402 406
403 rtcp::ReportBlock rb4; 407 rtcp::ReportBlock rb4;
404 rb4.To(kSourceSsrcs[1]); 408 rb4.To(kReceiverSsrc2);
405 rb4.WithExtHighestSeqNum(kSequenceNumbers[1]); 409 rb4.WithExtHighestSeqNum(kSequenceNumbers[1]);
406 rb4.WithFractionLost(kFracLost[1]); 410 rb4.WithFractionLost(kFracLost[1]);
407 rb4.WithCumulativeLost(kCumLost[1]); 411 rb4.WithCumulativeLost(kCumLost[1]);
408 412
409 rtcp::ReceiverReport rr2; 413 rtcp::ReceiverReport rr2;
410 rr2.From(kSenderSsrc); 414 rr2.From(kSenderSsrc);
411 rr2.WithReportBlock(rb3); 415 rr2.WithReportBlock(rb3);
412 rr2.WithReportBlock(rb4); 416 rr2.WithReportBlock(rb4);
413 417
414 rtc::Buffer p2 = rr2.Build(); 418 system_clock_.AdvanceTimeMilliseconds(500);
sprang_webrtc 2016/09/05 11:05:49 Why 500?
danilchap 2016/09/05 11:54:15 Actual value unimportant. As long as it is >0. Com
415 EXPECT_EQ(0, InjectRtcpPacket(p2.data(), p2.size())); 419 now = system_clock_.TimeInMilliseconds();
416 ASSERT_EQ(2u, rtcp_packet_info_.report_blocks.size()); 420
417 EXPECT_EQ(kFracLost[0], rtcp_packet_info_.report_blocks.front().fractionLost); 421 EXPECT_CALL(rtp_rtcp_impl_, OnReceivedRtcpReportBlocks(SizeIs(2)));
418 EXPECT_EQ(kFracLost[1], rtcp_packet_info_.report_blocks.back().fractionLost); 422 EXPECT_CALL(bandwidth_observer_,
419 423 OnReceivedRtcpReceiverReport(SizeIs(2), _, now));
420 std::vector<RTCPReportBlock> received_blocks; 424 InjectRtcpPacket(rr2);
421 rtcp_receiver_->StatisticsReceived(&received_blocks); 425
426 received_blocks.clear();
427 rtcp_receiver_.StatisticsReceived(&received_blocks);
422 EXPECT_EQ(2u, received_blocks.size()); 428 EXPECT_EQ(2u, received_blocks.size());
423 for (size_t i = 0; i < received_blocks.size(); ++i) { 429 EXPECT_THAT(received_blocks,
424 EXPECT_EQ(kSenderSsrc, received_blocks[i].remoteSSRC); 430 UnorderedElementsAre(
425 EXPECT_EQ(kSourceSsrcs[i], received_blocks[i].sourceSSRC); 431 AllOf(Field(&RTCPReportBlock::sourceSSRC, kReceiverSsrc),
426 EXPECT_EQ(kFracLost[i], received_blocks[i].fractionLost); 432 Field(&RTCPReportBlock::fractionLost, kFracLost[0]),
427 EXPECT_EQ(kCumLost[i], received_blocks[i].cumulativeLost); 433 Field(&RTCPReportBlock::cumulativeLost, kCumLost[0]),
428 EXPECT_EQ(kSequenceNumbers[i], received_blocks[i].extendedHighSeqNum); 434 Field(&RTCPReportBlock::extendedHighSeqNum,
429 } 435 kSequenceNumbers[0])),
436 AllOf(Field(&RTCPReportBlock::sourceSSRC, kReceiverSsrc2),
437 Field(&RTCPReportBlock::fractionLost, kFracLost[1]),
438 Field(&RTCPReportBlock::cumulativeLost, kCumLost[1]),
439 Field(&RTCPReportBlock::extendedHighSeqNum,
440 kSequenceNumbers[1]))));
430 } 441 }
431 442
432 TEST_F(RtcpReceiverTest, InjectRrPacketsFromTwoRemoteSsrcs) { 443 TEST_F(RtcpReceiverTest, InjectRrPacketsFromTwoRemoteSsrcs) {
433 const uint32_t kSenderSsrc1 = 0x10203;
434 const uint32_t kSenderSsrc2 = 0x20304; 444 const uint32_t kSenderSsrc2 = 0x20304;
435 const uint32_t kSourceSsrcs[] = {0x40506, 0x50607};
436 const uint16_t kSequenceNumbers[] = {10, 12423}; 445 const uint16_t kSequenceNumbers[] = {10, 12423};
437 const uint32_t kCumLost[] = {13, 555}; 446 const uint32_t kCumLost[] = {13, 555};
438 const uint8_t kFracLost[] = {20, 11}; 447 const uint8_t kFracLost[] = {20, 11};
439 const int kNumSsrcs = sizeof(kSourceSsrcs) / sizeof(kSourceSsrcs[0]);
440
441 std::set<uint32_t> ssrcs(kSourceSsrcs, kSourceSsrcs + kNumSsrcs);
442 rtcp_receiver_->SetSsrcs(kSourceSsrcs[0], ssrcs);
443 448
444 rtcp::ReportBlock rb1; 449 rtcp::ReportBlock rb1;
445 rb1.To(kSourceSsrcs[0]); 450 rb1.To(kReceiverSsrc);
446 rb1.WithExtHighestSeqNum(kSequenceNumbers[0]); 451 rb1.WithExtHighestSeqNum(kSequenceNumbers[0]);
447 rb1.WithFractionLost(kFracLost[0]); 452 rb1.WithFractionLost(kFracLost[0]);
448 rb1.WithCumulativeLost(kCumLost[0]); 453 rb1.WithCumulativeLost(kCumLost[0]);
449 rtcp::ReceiverReport rr1; 454 rtcp::ReceiverReport rr1;
450 rr1.From(kSenderSsrc1); 455 rr1.From(kSenderSsrc);
451 rr1.WithReportBlock(rb1); 456 rr1.WithReportBlock(rb1);
452 457
453 rtc::Buffer p1 = rr1.Build(); 458 int64_t now = system_clock_.TimeInMilliseconds();
454 EXPECT_EQ(0, InjectRtcpPacket(p1.data(), p1.size())); 459
455 ASSERT_EQ(1u, rtcp_packet_info_.report_blocks.size()); 460 EXPECT_CALL(rtp_rtcp_impl_, OnReceivedRtcpReportBlocks(SizeIs(1)));
456 EXPECT_EQ(kFracLost[0], rtcp_packet_info_.report_blocks.front().fractionLost); 461 EXPECT_CALL(bandwidth_observer_,
462 OnReceivedRtcpReceiverReport(SizeIs(1), _, now));
463 InjectRtcpPacket(rr1);
464
465 EXPECT_EQ(now, rtcp_receiver_.LastReceivedReceiverReport());
457 466
458 std::vector<RTCPReportBlock> received_blocks; 467 std::vector<RTCPReportBlock> received_blocks;
459 rtcp_receiver_->StatisticsReceived(&received_blocks); 468 rtcp_receiver_.StatisticsReceived(&received_blocks);
460 EXPECT_EQ(1u, received_blocks.size()); 469 EXPECT_EQ(1u, received_blocks.size());
461 EXPECT_EQ(kSenderSsrc1, received_blocks[0].remoteSSRC); 470 EXPECT_EQ(kSenderSsrc, received_blocks[0].remoteSSRC);
462 EXPECT_EQ(kSourceSsrcs[0], received_blocks[0].sourceSSRC); 471 EXPECT_EQ(kReceiverSsrc, received_blocks[0].sourceSSRC);
463 EXPECT_EQ(kFracLost[0], received_blocks[0].fractionLost); 472 EXPECT_EQ(kFracLost[0], received_blocks[0].fractionLost);
464 EXPECT_EQ(kCumLost[0], received_blocks[0].cumulativeLost); 473 EXPECT_EQ(kCumLost[0], received_blocks[0].cumulativeLost);
465 EXPECT_EQ(kSequenceNumbers[0], received_blocks[0].extendedHighSeqNum); 474 EXPECT_EQ(kSequenceNumbers[0], received_blocks[0].extendedHighSeqNum);
466 475
467 rtcp::ReportBlock rb2; 476 rtcp::ReportBlock rb2;
468 rb2.To(kSourceSsrcs[0]); 477 rb2.To(kReceiverSsrc);
469 rb2.WithExtHighestSeqNum(kSequenceNumbers[1]); 478 rb2.WithExtHighestSeqNum(kSequenceNumbers[1]);
470 rb2.WithFractionLost(kFracLost[1]); 479 rb2.WithFractionLost(kFracLost[1]);
471 rb2.WithCumulativeLost(kCumLost[1]); 480 rb2.WithCumulativeLost(kCumLost[1]);
472 rtcp::ReceiverReport rr2; 481 rtcp::ReceiverReport rr2;
473 rr2.From(kSenderSsrc2); 482 rr2.From(kSenderSsrc2);
474 rr2.WithReportBlock(rb2); 483 rr2.WithReportBlock(rb2);
475 rtc::Buffer p2 = rr2.Build(); 484
476 EXPECT_EQ(0, InjectRtcpPacket(p2.data(), p2.size())); 485 EXPECT_CALL(rtp_rtcp_impl_, OnReceivedRtcpReportBlocks(SizeIs(1)));
477 ASSERT_EQ(1u, rtcp_packet_info_.report_blocks.size()); 486 EXPECT_CALL(bandwidth_observer_,
478 EXPECT_EQ(kFracLost[1], rtcp_packet_info_.report_blocks.front().fractionLost); 487 OnReceivedRtcpReceiverReport(SizeIs(1), _, now));
488 InjectRtcpPacket(rr2);
479 489
480 received_blocks.clear(); 490 received_blocks.clear();
481 rtcp_receiver_->StatisticsReceived(&received_blocks); 491 rtcp_receiver_.StatisticsReceived(&received_blocks);
482 ASSERT_EQ(2u, received_blocks.size()); 492 ASSERT_EQ(2u, received_blocks.size());
483 EXPECT_EQ(kSenderSsrc1, received_blocks[0].remoteSSRC); 493 EXPECT_THAT(received_blocks,
484 EXPECT_EQ(kSenderSsrc2, received_blocks[1].remoteSSRC); 494 UnorderedElementsAre(
485 for (size_t i = 0; i < received_blocks.size(); ++i) { 495 AllOf(Field(&RTCPReportBlock::sourceSSRC, kReceiverSsrc),
486 EXPECT_EQ(kSourceSsrcs[0], received_blocks[i].sourceSSRC); 496 Field(&RTCPReportBlock::remoteSSRC, kSenderSsrc),
487 EXPECT_EQ(kFracLost[i], received_blocks[i].fractionLost); 497 Field(&RTCPReportBlock::fractionLost, kFracLost[0]),
488 EXPECT_EQ(kCumLost[i], received_blocks[i].cumulativeLost); 498 Field(&RTCPReportBlock::cumulativeLost, kCumLost[0]),
489 EXPECT_EQ(kSequenceNumbers[i], received_blocks[i].extendedHighSeqNum); 499 Field(&RTCPReportBlock::extendedHighSeqNum,
490 } 500 kSequenceNumbers[0])),
501 AllOf(Field(&RTCPReportBlock::sourceSSRC, kReceiverSsrc),
502 Field(&RTCPReportBlock::remoteSSRC, kSenderSsrc2),
503 Field(&RTCPReportBlock::fractionLost, kFracLost[1]),
504 Field(&RTCPReportBlock::cumulativeLost, kCumLost[1]),
505 Field(&RTCPReportBlock::extendedHighSeqNum,
506 kSequenceNumbers[1]))));
491 } 507 }
492 508
493 TEST_F(RtcpReceiverTest, GetRtt) { 509 TEST_F(RtcpReceiverTest, GetRtt) {
494 const uint32_t kSenderSsrc = 0x10203;
495 const uint32_t kSourceSsrc = 0x123456;
496 std::set<uint32_t> ssrcs;
497 ssrcs.insert(kSourceSsrc);
498 rtcp_receiver_->SetSsrcs(kSourceSsrc, ssrcs);
499
500 // No report block received. 510 // No report block received.
501 EXPECT_EQ( 511 EXPECT_EQ(
502 -1, rtcp_receiver_->RTT(kSenderSsrc, nullptr, nullptr, nullptr, nullptr)); 512 -1, rtcp_receiver_.RTT(kSenderSsrc, nullptr, nullptr, nullptr, nullptr));
503 513
504 rtcp::ReportBlock rb; 514 rtcp::ReportBlock rb;
505 rb.To(kSourceSsrc); 515 rb.To(kReceiverSsrc);
516 rb.WithLastSr(0x12344321);
sprang_webrtc 2016/09/05 11:05:49 For readability, translate system time to ntp inst
danilchap 2016/09/05 11:54:16 Removed. Actually it is not needed, yet. Will add
506 rtcp::ReceiverReport rr; 517 rtcp::ReceiverReport rr;
507 rr.From(kSenderSsrc); 518 rr.From(kSenderSsrc);
508 rr.WithReportBlock(rb); 519 rr.WithReportBlock(rb);
509 rtc::Buffer packet = rr.Build(); 520 int64_t now = system_clock_.TimeInMilliseconds();
510 EXPECT_EQ(0, InjectRtcpPacket(packet.data(), packet.size())); 521
511 EXPECT_EQ(kSenderSsrc, rtcp_packet_info_.remoteSSRC); 522 EXPECT_CALL(rtp_rtcp_impl_, OnReceivedRtcpReportBlocks(_));
512 EXPECT_EQ(kRtcpRr, rtcp_packet_info_.rtcpPacketTypeFlags); 523 EXPECT_CALL(bandwidth_observer_, OnReceivedRtcpReceiverReport(_, _, _));
513 EXPECT_EQ(1u, rtcp_packet_info_.report_blocks.size()); 524 InjectRtcpPacket(rr);
525
526 EXPECT_EQ(now, rtcp_receiver_.LastReceivedReceiverReport());
514 EXPECT_EQ( 527 EXPECT_EQ(
515 0, rtcp_receiver_->RTT(kSenderSsrc, nullptr, nullptr, nullptr, nullptr)); 528 0, rtcp_receiver_.RTT(kSenderSsrc, nullptr, nullptr, nullptr, nullptr));
516 529 }
517 // Report block not received. 530
518 EXPECT_EQ(-1, rtcp_receiver_->RTT(kSenderSsrc + 1, nullptr, nullptr, nullptr, 531 // Ij packets are ignored.
519 nullptr));
520 }
521
522 TEST_F(RtcpReceiverTest, InjectIjWithNoItem) { 532 TEST_F(RtcpReceiverTest, InjectIjWithNoItem) {
523 rtcp::ExtendedJitterReport ij; 533 rtcp::ExtendedJitterReport ij;
524 rtc::Buffer packet = ij.Build(); 534 InjectRtcpPacket(ij);
525 EXPECT_EQ(0, InjectRtcpPacket(packet.data(), packet.size())); 535 }
526 EXPECT_EQ(0U, rtcp_packet_info_.rtcpPacketTypeFlags); 536
527 } 537 // App packets are ignored.
528
529 TEST_F(RtcpReceiverTest, InjectIjWithOneItem) {
530 rtcp::ExtendedJitterReport ij;
531 ij.WithJitter(0x11213141);
532
533 rtc::Buffer packet = ij.Build();
534 EXPECT_EQ(0, InjectRtcpPacket(packet.data(), packet.size()));
535 EXPECT_EQ(kRtcpTransmissionTimeOffset, rtcp_packet_info_.rtcpPacketTypeFlags);
536 EXPECT_EQ(0x11213141U, rtcp_packet_info_.interArrivalJitter);
537 }
538
539 TEST_F(RtcpReceiverTest, InjectAppWithNoData) { 538 TEST_F(RtcpReceiverTest, InjectAppWithNoData) {
540 rtcp::App app; 539 rtcp::App app;
541 app.WithSubType(30); 540 app.WithSubType(30);
542 uint32_t name = 'n' << 24; 541 app.WithName(0x17a177e);
543 name += 'a' << 16; 542
544 name += 'm' << 8; 543 InjectRtcpPacket(app);
545 name += 'e';
546 app.WithName(name);
547
548 rtc::Buffer packet = app.Build();
549 EXPECT_EQ(0, InjectRtcpPacket(packet.data(), packet.size()));
550 EXPECT_EQ(kRtcpApp, rtcp_packet_info_.rtcpPacketTypeFlags);
551 EXPECT_EQ(30, rtcp_packet_info_.applicationSubType);
552 EXPECT_EQ(name, rtcp_packet_info_.applicationName);
553 EXPECT_EQ(0, rtcp_packet_info_.applicationLength);
554 } 544 }
555 545
556 TEST_F(RtcpReceiverTest, InjectAppWithData) { 546 TEST_F(RtcpReceiverTest, InjectAppWithData) {
philipel 2016/09/05 11:59:27 Is there any observable difference between InjectA
danilchap 2016/09/05 13:27:55 Only that it doesn't crash and doesn't cause accid
557 rtcp::App app; 547 rtcp::App app;
558 app.WithSubType(30); 548 app.WithSubType(30);
559 uint32_t name = 'n' << 24; 549 app.WithName(0x17a177e);
560 name += 'a' << 16; 550 const uint8_t kData[] = {'t', 'e', 's', 't', 'd', 'a', 't', 'a'};
561 name += 'm' << 8; 551 app.WithData(kData, sizeof(kData));
562 name += 'e'; 552
563 app.WithName(name); 553 InjectRtcpPacket(app);
564 const char kData[] = {'t', 'e', 's', 't', 'd', 'a', 't', 'a'};
565 const size_t kDataLength = sizeof(kData) / sizeof(kData[0]);
566 app.WithData((const uint8_t*)kData, kDataLength);
567
568 rtc::Buffer packet = app.Build();
569 EXPECT_EQ(0, InjectRtcpPacket(packet.data(), packet.size()));
570 EXPECT_EQ(kRtcpApp, rtcp_packet_info_.rtcpPacketTypeFlags);
571 EXPECT_EQ(30, rtcp_packet_info_.applicationSubType);
572 EXPECT_EQ(name, rtcp_packet_info_.applicationName);
573 EXPECT_EQ(kDataLength, rtcp_packet_info_.applicationLength);
574 } 554 }
575 555
576 TEST_F(RtcpReceiverTest, InjectSdesWithOneChunk) { 556 TEST_F(RtcpReceiverTest, InjectSdesWithOneChunk) {
577 const uint32_t kSenderSsrc = 0x123456; 557 MockRtcpCallbackImpl callback;
558 rtcp_receiver_.RegisterRtcpStatisticsCallback(&callback);
578 rtcp::Sdes sdes; 559 rtcp::Sdes sdes;
579 sdes.WithCName(kSenderSsrc, "alice@host"); 560 sdes.WithCName(kSenderSsrc, "alice@host");
sprang_webrtc 2016/09/05 11:05:49 Named constant for "alice@host"?
danilchap 2016/09/05 11:54:16 Done.
580 561
581 rtc::Buffer packet = sdes.Build(); 562 EXPECT_CALL(callback, CNameChanged(StrEq("alice@host"), kSenderSsrc));
582 EXPECT_EQ(0, InjectRtcpPacket(packet.data(), packet.size())); 563 InjectRtcpPacket(sdes);
564
583 char cName[RTCP_CNAME_SIZE]; 565 char cName[RTCP_CNAME_SIZE];
584 EXPECT_EQ(0, rtcp_receiver_->CNAME(kSenderSsrc, cName)); 566 EXPECT_EQ(0, rtcp_receiver_.CNAME(kSenderSsrc, cName));
585 EXPECT_EQ(0, strncmp(cName, "alice@host", RTCP_CNAME_SIZE)); 567 EXPECT_EQ(0, strncmp(cName, "alice@host", RTCP_CNAME_SIZE));
586 } 568 }
587 569
588 TEST_F(RtcpReceiverTest, InjectByePacket_RemovesCname) { 570 TEST_F(RtcpReceiverTest, InjectByePacket_RemovesCname) {
589 const uint32_t kSenderSsrc = 0x123456;
590 rtcp::Sdes sdes; 571 rtcp::Sdes sdes;
591 sdes.WithCName(kSenderSsrc, "alice@host"); 572 sdes.WithCName(kSenderSsrc, "alice@host");
592 573
593 rtc::Buffer packet = sdes.Build(); 574 InjectRtcpPacket(sdes);
594 EXPECT_EQ(0, InjectRtcpPacket(packet.data(), packet.size())); 575
595 char cName[RTCP_CNAME_SIZE]; 576 char cName[RTCP_CNAME_SIZE];
596 EXPECT_EQ(0, rtcp_receiver_->CNAME(kSenderSsrc, cName)); 577 EXPECT_EQ(0, rtcp_receiver_.CNAME(kSenderSsrc, cName));
597 578
598 // Verify that BYE removes the CNAME. 579 // Verify that BYE removes the CNAME.
599 rtcp::Bye bye; 580 rtcp::Bye bye;
600 bye.From(kSenderSsrc); 581 bye.From(kSenderSsrc);
601 rtc::Buffer p2 = bye.Build(); 582
602 EXPECT_EQ(0, InjectRtcpPacket(p2.data(), p2.size())); 583 InjectRtcpPacket(bye);
603 EXPECT_EQ(-1, rtcp_receiver_->CNAME(kSenderSsrc, cName)); 584
585 EXPECT_EQ(-1, rtcp_receiver_.CNAME(kSenderSsrc, cName));
604 } 586 }
605 587
606 TEST_F(RtcpReceiverTest, InjectByePacket_RemovesReportBlocks) { 588 TEST_F(RtcpReceiverTest, InjectByePacket_RemovesReportBlocks) {
607 const uint32_t kSenderSsrc = 0x10203;
608 const uint32_t kSourceSsrcs[] = {0x40506, 0x50607};
609 const int kNumSsrcs = sizeof(kSourceSsrcs) / sizeof(kSourceSsrcs[0]);
610
611 std::set<uint32_t> ssrcs(kSourceSsrcs, kSourceSsrcs + kNumSsrcs);
612 rtcp_receiver_->SetSsrcs(kSourceSsrcs[0], ssrcs);
613
614 rtcp::ReportBlock rb1; 589 rtcp::ReportBlock rb1;
615 rb1.To(kSourceSsrcs[0]); 590 rb1.To(kReceiverSsrc);
616 rtcp::ReportBlock rb2; 591 rtcp::ReportBlock rb2;
617 rb2.To(kSourceSsrcs[1]); 592 rb2.To(kReceiverSsrc2);
618 rtcp::ReceiverReport rr; 593 rtcp::ReceiverReport rr;
619 rr.From(kSenderSsrc); 594 rr.From(kSenderSsrc);
620 rr.WithReportBlock(rb1); 595 rr.WithReportBlock(rb1);
621 rr.WithReportBlock(rb2); 596 rr.WithReportBlock(rb2);
622 597
623 rtc::Buffer p1 = rr.Build(); 598 EXPECT_CALL(rtp_rtcp_impl_, OnReceivedRtcpReportBlocks(_));
624 EXPECT_EQ(0, InjectRtcpPacket(p1.data(), p1.size())); 599 EXPECT_CALL(bandwidth_observer_, OnReceivedRtcpReceiverReport(_, _, _));
625 ASSERT_EQ(2u, rtcp_packet_info_.report_blocks.size()); 600 InjectRtcpPacket(rr);
601
626 std::vector<RTCPReportBlock> received_blocks; 602 std::vector<RTCPReportBlock> received_blocks;
627 rtcp_receiver_->StatisticsReceived(&received_blocks); 603 rtcp_receiver_.StatisticsReceived(&received_blocks);
628 EXPECT_EQ(2u, received_blocks.size()); 604 EXPECT_EQ(2u, received_blocks.size());
629 605
630 // Verify that BYE removes the report blocks. 606 // Verify that BYE removes the report blocks.
631 rtcp::Bye bye; 607 rtcp::Bye bye;
632 bye.From(kSenderSsrc); 608 bye.From(kSenderSsrc);
633 rtc::Buffer p2 = bye.Build(); 609
634 EXPECT_EQ(0, InjectRtcpPacket(p2.data(), p2.size())); 610 InjectRtcpPacket(bye);
611
635 received_blocks.clear(); 612 received_blocks.clear();
636 rtcp_receiver_->StatisticsReceived(&received_blocks); 613 rtcp_receiver_.StatisticsReceived(&received_blocks);
637 EXPECT_TRUE(received_blocks.empty()); 614 EXPECT_TRUE(received_blocks.empty());
638 615
639 // Inject packet. 616 // Inject packet again.
640 EXPECT_EQ(0, InjectRtcpPacket(p1.data(), p1.size())); 617 EXPECT_CALL(rtp_rtcp_impl_, OnReceivedRtcpReportBlocks(_));
641 ASSERT_EQ(2u, rtcp_packet_info_.report_blocks.size()); 618 EXPECT_CALL(bandwidth_observer_, OnReceivedRtcpReceiverReport(_, _, _));
619 InjectRtcpPacket(rr);
620
642 received_blocks.clear(); 621 received_blocks.clear();
643 rtcp_receiver_->StatisticsReceived(&received_blocks); 622 rtcp_receiver_.StatisticsReceived(&received_blocks);
644 EXPECT_EQ(2u, received_blocks.size()); 623 EXPECT_EQ(2u, received_blocks.size());
645 } 624 }
646 625
647 TEST_F(RtcpReceiverTest, InjectPliPacket) { 626 TEST_F(RtcpReceiverTest, InjectPliPacket) {
648 const uint32_t kSourceSsrc = 0x123456;
649 std::set<uint32_t> ssrcs;
650 ssrcs.insert(kSourceSsrc);
651 rtcp_receiver_->SetSsrcs(kSourceSsrc, ssrcs);
652
653 rtcp::Pli pli; 627 rtcp::Pli pli;
654 pli.To(kSourceSsrc); 628 pli.To(kReceiverSsrc);
655 rtc::Buffer packet = pli.Build(); 629
656 EXPECT_EQ(0, InjectRtcpPacket(packet.data(), packet.size())); 630 EXPECT_CALL(
657 EXPECT_EQ(kRtcpPli, rtcp_packet_info_.rtcpPacketTypeFlags); 631 packet_type_counter_observer_,
632 RtcpPacketTypesCounterUpdated(
633 kReceiverSsrc, Field(&RtcpPacketTypeCounter::pli_packets, 1)));
634 EXPECT_CALL(intra_frame_observer_,
635 OnReceivedIntraFrameRequest(kReceiverSsrc));
636 InjectRtcpPacket(pli);
658 } 637 }
659 638
660 TEST_F(RtcpReceiverTest, PliPacketNotToUsIgnored) { 639 TEST_F(RtcpReceiverTest, PliPacketNotToUsIgnored) {
661 const uint32_t kSourceSsrc = 0x123456;
662 std::set<uint32_t> ssrcs;
663 ssrcs.insert(kSourceSsrc);
664 rtcp_receiver_->SetSsrcs(kSourceSsrc, ssrcs);
665
666 rtcp::Pli pli; 640 rtcp::Pli pli;
667 pli.To(kSourceSsrc + 1); 641 pli.To(kNotToUsSsrc);
668 rtc::Buffer packet = pli.Build(); 642
669 EXPECT_EQ(0, InjectRtcpPacket(packet.data(), packet.size())); 643 EXPECT_CALL(
670 EXPECT_EQ(0U, rtcp_packet_info_.rtcpPacketTypeFlags); 644 packet_type_counter_observer_,
645 RtcpPacketTypesCounterUpdated(
646 kReceiverSsrc, Field(&RtcpPacketTypeCounter::pli_packets, 0)));
647 EXPECT_CALL(intra_frame_observer_, OnReceivedIntraFrameRequest(_)).Times(0);
philipel 2016/09/05 11:59:27 No need, |intra_frame_observer_| is strict.
danilchap 2016/09/05 13:27:55 Acknowledged.
648 InjectRtcpPacket(pli);
671 } 649 }
672 650
673 TEST_F(RtcpReceiverTest, InjectFirPacket) { 651 TEST_F(RtcpReceiverTest, InjectFirPacket) {
674 const uint32_t kSourceSsrc = 0x123456;
675 std::set<uint32_t> ssrcs;
676 ssrcs.insert(kSourceSsrc);
677 rtcp_receiver_->SetSsrcs(kSourceSsrc, ssrcs);
678
679 rtcp::Fir fir; 652 rtcp::Fir fir;
680 fir.WithRequestTo(kSourceSsrc, 13); 653 fir.WithRequestTo(kReceiverSsrc, 13);
681 rtc::Buffer packet = fir.Build(); 654
682 EXPECT_EQ(0, InjectRtcpPacket(packet.data(), packet.size())); 655 EXPECT_CALL(
683 EXPECT_EQ(kRtcpFir, rtcp_packet_info_.rtcpPacketTypeFlags); 656 packet_type_counter_observer_,
657 RtcpPacketTypesCounterUpdated(
658 kReceiverSsrc, Field(&RtcpPacketTypeCounter::fir_packets, 1)));
659 EXPECT_CALL(intra_frame_observer_,
660 OnReceivedIntraFrameRequest(kReceiverSsrc));
661 InjectRtcpPacket(fir);
684 } 662 }
685 663
686 TEST_F(RtcpReceiverTest, FirPacketNotToUsIgnored) { 664 TEST_F(RtcpReceiverTest, FirPacketNotToUsIgnored) {
687 const uint32_t kSourceSsrc = 0x123456;
688 std::set<uint32_t> ssrcs;
689 ssrcs.insert(kSourceSsrc);
690 rtcp_receiver_->SetSsrcs(kSourceSsrc, ssrcs);
691
692 rtcp::Fir fir; 665 rtcp::Fir fir;
693 fir.WithRequestTo(kSourceSsrc + 1, 13); 666 fir.WithRequestTo(kNotToUsSsrc, 13);
694 rtc::Buffer packet = fir.Build(); 667
695 EXPECT_EQ(0, InjectRtcpPacket(packet.data(), packet.size())); 668 EXPECT_CALL(intra_frame_observer_, OnReceivedIntraFrameRequest(kReceiverSsrc))
696 EXPECT_EQ(0U, rtcp_packet_info_.rtcpPacketTypeFlags); 669 .Times(0);
philipel 2016/09/05 11:59:27 ditto
danilchap 2016/09/05 13:27:55 Acknowledged. Same reason as before: want to stres
670 InjectRtcpPacket(fir);
697 } 671 }
698 672
699 TEST_F(RtcpReceiverTest, InjectSliPacket) { 673 TEST_F(RtcpReceiverTest, InjectSliPacket) {
700 rtcp::Sli sli; 674 rtcp::Sli sli;
701 sli.WithPictureId(40); 675 sli.WithPictureId(40);
sprang_webrtc 2016/09/05 11:05:49 Named constant
danilchap 2016/09/05 11:54:15 Done.
702 rtc::Buffer packet = sli.Build(); 676
703 EXPECT_EQ(0, InjectRtcpPacket(packet.data(), packet.size())); 677 EXPECT_CALL(intra_frame_observer_, OnReceivedSLI(_, 40));
704 EXPECT_EQ(kRtcpSli, rtcp_packet_info_.rtcpPacketTypeFlags); 678 InjectRtcpPacket(sli);
705 EXPECT_EQ(40, rtcp_packet_info_.sliPictureId); 679 }
680
681 TEST_F(RtcpReceiverTest, InjectRPsiPacket) {
sprang_webrtc 2016/09/05 11:05:49 nit: s/InjectRPsiPacket/InjectRpsiPacket
danilchap 2016/09/05 11:54:16 Oops, there is already InjectRpsiPacket test. Dupl
682 const uint64_t kPictureId = 0x123456789;
683 rtcp::Rpsi rpsi;
684 rpsi.WithPictureId(kPictureId);
685
686 EXPECT_CALL(intra_frame_observer_, OnReceivedRPSI(_, kPictureId));
687 InjectRtcpPacket(rpsi);
706 } 688 }
707 689
708 TEST_F(RtcpReceiverTest, ExtendedReportsPacketWithZeroReportBlocksIgnored) { 690 TEST_F(RtcpReceiverTest, ExtendedReportsPacketWithZeroReportBlocksIgnored) {
709 rtcp::ExtendedReports xr; 691 rtcp::ExtendedReports xr;
710 xr.From(0x2345); 692 xr.From(kSenderSsrc);
711 rtc::Buffer packet = xr.Build(); 693
712 EXPECT_EQ(0, InjectRtcpPacket(packet.data(), packet.size())); 694 InjectRtcpPacket(xr);
713 EXPECT_EQ(0U, rtcp_packet_info_.rtcpPacketTypeFlags); 695 }
714 } 696
715 697 // VOiP reports are ignored.
716 TEST_F(RtcpReceiverTest, InjectExtendedReportsVoipPacket) { 698 TEST_F(RtcpReceiverTest, InjectExtendedReportsVoipPacket) {
717 const uint32_t kSourceSsrc = 0x123456;
718 std::set<uint32_t> ssrcs;
719 ssrcs.insert(kSourceSsrc);
720 rtcp_receiver_->SetSsrcs(kSourceSsrc, ssrcs);
721
722 const uint8_t kLossRate = 123; 699 const uint8_t kLossRate = 123;
723 rtcp::VoipMetric voip_metric; 700 rtcp::VoipMetric voip_metric;
724 voip_metric.To(kSourceSsrc); 701 voip_metric.To(kReceiverSsrc);
725 RTCPVoIPMetric metric; 702 RTCPVoIPMetric metric;
726 metric.lossRate = kLossRate; 703 metric.lossRate = kLossRate;
727 voip_metric.WithVoipMetric(metric); 704 voip_metric.WithVoipMetric(metric);
728 rtcp::ExtendedReports xr; 705 rtcp::ExtendedReports xr;
729 xr.From(0x2345); 706 xr.From(kSenderSsrc);
730 xr.WithVoipMetric(voip_metric); 707 xr.WithVoipMetric(voip_metric);
731 rtc::Buffer packet = xr.Build(); 708
732 EXPECT_EQ(0, InjectRtcpPacket(packet.data(), packet.size())); 709 InjectRtcpPacket(xr);
733 ASSERT_TRUE(rtcp_packet_info_.VoIPMetric != nullptr);
734 EXPECT_EQ(kLossRate, rtcp_packet_info_.VoIPMetric->lossRate);
735 EXPECT_EQ(kRtcpXrVoipMetric, rtcp_packet_info_.rtcpPacketTypeFlags);
736 } 710 }
737 711
738 TEST_F(RtcpReceiverTest, ExtendedReportsVoipPacketNotToUsIgnored) { 712 TEST_F(RtcpReceiverTest, ExtendedReportsVoipPacketNotToUsIgnored) {
739 const uint32_t kSourceSsrc = 0x123456;
740 std::set<uint32_t> ssrcs;
741 ssrcs.insert(kSourceSsrc);
742 rtcp_receiver_->SetSsrcs(kSourceSsrc, ssrcs);
743
744 rtcp::VoipMetric voip_metric; 713 rtcp::VoipMetric voip_metric;
745 voip_metric.To(kSourceSsrc + 1); 714 voip_metric.To(kNotToUsSsrc);
746 rtcp::ExtendedReports xr; 715 rtcp::ExtendedReports xr;
747 xr.From(0x2345); 716 xr.From(kSenderSsrc);
748 xr.WithVoipMetric(voip_metric); 717 xr.WithVoipMetric(voip_metric);
749 rtc::Buffer packet = xr.Build(); 718
750 EXPECT_EQ(0, InjectRtcpPacket(packet.data(), packet.size())); 719 InjectRtcpPacket(xr);
751 EXPECT_EQ(0U, rtcp_packet_info_.rtcpPacketTypeFlags);
752 } 720 }
753 721
754 TEST_F(RtcpReceiverTest, InjectExtendedReportsReceiverReferenceTimePacket) { 722 TEST_F(RtcpReceiverTest, InjectExtendedReportsReceiverReferenceTimePacket) {
723 const NtpTime kNtp(0x10203, 0x40506);
755 rtcp::Rrtr rrtr; 724 rtcp::Rrtr rrtr;
756 rrtr.WithNtp(NtpTime(0x10203, 0x40506)); 725 rrtr.WithNtp(kNtp);
757 rtcp::ExtendedReports xr; 726 rtcp::ExtendedReports xr;
758 xr.From(0x2345); 727 xr.From(kSenderSsrc);
759 xr.WithRrtr(rrtr); 728 xr.WithRrtr(rrtr);
760 729
761 rtc::Buffer packet = xr.Build(); 730 RtcpReceiveTimeInfo rrtime;
762 EXPECT_EQ(0, InjectRtcpPacket(packet.data(), packet.size())); 731 EXPECT_FALSE(rtcp_receiver_.LastReceivedXrReferenceTimeInfo(&rrtime));
763 EXPECT_EQ(kRtcpXrReceiverReferenceTime, 732
764 rtcp_packet_info_.rtcpPacketTypeFlags); 733 InjectRtcpPacket(xr);
734
735 EXPECT_TRUE(rtcp_receiver_.LastReceivedXrReferenceTimeInfo(&rrtime));
736 EXPECT_EQ(rrtime.sourceSSRC, kSenderSsrc);
737 EXPECT_EQ(rrtime.lastRR, CompactNtp(kNtp));
738 EXPECT_EQ(0u, rrtime.delaySinceLastRR);
739
740 system_clock_.AdvanceTimeMilliseconds(1500);
741 EXPECT_TRUE(rtcp_receiver_.LastReceivedXrReferenceTimeInfo(&rrtime));
742 EXPECT_NEAR(1500, CompactNtpRttToMs(rrtime.delaySinceLastRR), 1);
765 } 743 }
766 744
767 TEST_F(RtcpReceiverTest, ExtendedReportsDlrrPacketNotToUsIgnored) { 745 TEST_F(RtcpReceiverTest, ExtendedReportsDlrrPacketNotToUsIgnored) {
768 const uint32_t kSourceSsrc = 0x123456; 746 // Allow calculate rtt using dlrr/rrtr, simulating media receiver side.
769 std::set<uint32_t> ssrcs; 747 rtcp_receiver_.SetRtcpXrRrtrStatus(true);
770 ssrcs.insert(kSourceSsrc); 748
771 rtcp_receiver_->SetSsrcs(kSourceSsrc, ssrcs); 749 rtcp::Dlrr dlrr;
772 750 dlrr.WithDlrrItem(kNotToUsSsrc, 0x12345, 0x67890);
773 rtcp::Dlrr dlrr; 751 rtcp::ExtendedReports xr;
774 dlrr.WithDlrrItem(kSourceSsrc + 1, 0x12345, 0x67890); 752 xr.From(kSenderSsrc);
775 rtcp::ExtendedReports xr; 753 xr.WithDlrr(dlrr);
776 xr.From(0x2345); 754
777 xr.WithDlrr(dlrr); 755 InjectRtcpPacket(xr);
778 rtc::Buffer packet = xr.Build(); 756
779 EXPECT_EQ(0, InjectRtcpPacket(packet.data(), packet.size())); 757 int64_t rtt_ms = 0;
780 EXPECT_EQ(0U, rtcp_packet_info_.rtcpPacketTypeFlags); 758 EXPECT_FALSE(rtcp_receiver_.GetAndResetXrRrRtt(&rtt_ms));
781 EXPECT_FALSE(rtcp_packet_info_.xr_dlrr_item);
782 } 759 }
783 760
784 TEST_F(RtcpReceiverTest, InjectExtendedReportsDlrrPacketWithSubBlock) { 761 TEST_F(RtcpReceiverTest, InjectExtendedReportsDlrrPacketWithSubBlock) {
785 const uint32_t kSourceSsrc = 0x123456; 762 const uint32_t kLastRR = 0x12345;
786 std::set<uint32_t> ssrcs; 763 const uint32_t kDelay = 0x23456;
787 ssrcs.insert(kSourceSsrc); 764 rtcp_receiver_.SetRtcpXrRrtrStatus(true);
788 rtcp_receiver_->SetSsrcs(kSourceSsrc, ssrcs); 765 int64_t rtt_ms = 0;
789 766 EXPECT_FALSE(rtcp_receiver_.GetAndResetXrRrRtt(&rtt_ms));
790 rtcp::Dlrr dlrr; 767
791 dlrr.WithDlrrItem(kSourceSsrc, 0x12345, 0x67890); 768 rtcp::Dlrr dlrr;
792 rtcp::ExtendedReports xr; 769 dlrr.WithDlrrItem(kReceiverSsrc, kLastRR, kDelay);
793 xr.From(0x2345); 770 rtcp::ExtendedReports xr;
794 xr.WithDlrr(dlrr); 771 xr.From(kSenderSsrc);
795 rtc::Buffer packet = xr.Build(); 772 xr.WithDlrr(dlrr);
796 EXPECT_EQ(0, InjectRtcpPacket(packet.data(), packet.size())); 773
797 // The parser should note the DLRR report block item. 774 InjectRtcpPacket(xr);
798 EXPECT_TRUE(rtcp_packet_info_.xr_dlrr_item); 775
776 uint32_t compact_ntp_now = CompactNtp(NtpTime(system_clock_));
777 EXPECT_TRUE(rtcp_receiver_.GetAndResetXrRrRtt(&rtt_ms));
778 uint32_t rtt_ntp = compact_ntp_now - kDelay - kLastRR;
779 EXPECT_NEAR(CompactNtpRttToMs(rtt_ntp), rtt_ms, 1);
799 } 780 }
800 781
801 TEST_F(RtcpReceiverTest, InjectExtendedReportsDlrrPacketWithMultipleSubBlocks) { 782 TEST_F(RtcpReceiverTest, InjectExtendedReportsDlrrPacketWithMultipleSubBlocks) {
802 const uint32_t kSourceSsrc = 0x123456; 783 const uint32_t kLastRR = 0x12345;
803 std::set<uint32_t> ssrcs; 784 const uint32_t kDelay = 0x56789;
804 ssrcs.insert(kSourceSsrc); 785 rtcp_receiver_.SetRtcpXrRrtrStatus(true);
805 rtcp_receiver_->SetSsrcs(kSourceSsrc, ssrcs); 786
806 787 rtcp::ExtendedReports xr;
807 rtcp::Dlrr dlrr; 788 xr.From(kSenderSsrc);
808 dlrr.WithDlrrItem(kSourceSsrc + 1, 0x12345, 0x67890); 789 rtcp::Dlrr dlrr;
809 dlrr.WithDlrrItem(kSourceSsrc + 2, 0x12345, 0x67890); 790 dlrr.WithDlrrItem(kReceiverSsrc, kLastRR, kDelay);
810 dlrr.WithDlrrItem(kSourceSsrc, 0x12345, 0x67890); 791 dlrr.WithDlrrItem(kReceiverSsrc + 1, 0x12345, 0x67890);
811 rtcp::ExtendedReports xr; 792 dlrr.WithDlrrItem(kReceiverSsrc + 2, 0x12345, 0x67890);
812 xr.From(0x2345); 793 xr.WithDlrr(dlrr);
813 xr.WithDlrr(dlrr); 794
814 rtc::Buffer packet = xr.Build(); 795 InjectRtcpPacket(xr);
815 EXPECT_EQ(0, InjectRtcpPacket(packet.data(), packet.size())); 796
816 // The parser should note the DLRR report block item. 797 uint32_t compact_ntp_now = CompactNtp(NtpTime(system_clock_));
817 EXPECT_TRUE(rtcp_packet_info_.xr_dlrr_item); 798 int64_t rtt_ms = 0;
799 EXPECT_TRUE(rtcp_receiver_.GetAndResetXrRrRtt(&rtt_ms));
800 uint32_t rtt_ntp = compact_ntp_now - kDelay - kLastRR;
801 EXPECT_NEAR(CompactNtpRttToMs(rtt_ntp), rtt_ms, 1);
818 } 802 }
819 803
820 TEST_F(RtcpReceiverTest, InjectExtendedReportsPacketWithMultipleReportBlocks) { 804 TEST_F(RtcpReceiverTest, InjectExtendedReportsPacketWithMultipleReportBlocks) {
821 const uint32_t kSourceSsrc = 0x123456; 805 rtcp_receiver_.SetRtcpXrRrtrStatus(true);
822 std::set<uint32_t> ssrcs;
823 ssrcs.insert(kSourceSsrc);
824 rtcp_receiver_->SetSsrcs(kSourceSsrc, ssrcs);
825 806
826 rtcp::Rrtr rrtr; 807 rtcp::Rrtr rrtr;
827 rtcp::Dlrr dlrr; 808 rtcp::Dlrr dlrr;
828 dlrr.WithDlrrItem(kSourceSsrc, 0, 0x67890); 809 dlrr.WithDlrrItem(kReceiverSsrc, 0x12345, 0x67890);
829 rtcp::VoipMetric metric; 810 rtcp::VoipMetric metric;
830 metric.To(kSourceSsrc); 811 metric.To(kReceiverSsrc);
831 rtcp::ExtendedReports xr; 812 rtcp::ExtendedReports xr;
832 xr.From(0x2345); 813 xr.From(kSenderSsrc);
833 xr.WithRrtr(rrtr); 814 xr.WithRrtr(rrtr);
834 xr.WithDlrr(dlrr); 815 xr.WithDlrr(dlrr);
835 xr.WithVoipMetric(metric); 816 xr.WithVoipMetric(metric);
836 rtc::Buffer packet = xr.Build(); 817
837 EXPECT_EQ(0, InjectRtcpPacket(packet.data(), packet.size())); 818 InjectRtcpPacket(xr);
838 // The parser should not flag the packet since the RTT is not estimated. 819
839 EXPECT_EQ(static_cast<unsigned int>(kRtcpXrReceiverReferenceTime + 820 RtcpReceiveTimeInfo rrtime;
840 kRtcpXrVoipMetric), 821 EXPECT_TRUE(rtcp_receiver_.LastReceivedXrReferenceTimeInfo(&rrtime));
841 rtcp_packet_info_.rtcpPacketTypeFlags); 822 int64_t rtt_ms = 0;
842 // The parser should note the DLRR report block item. 823 EXPECT_TRUE(rtcp_receiver_.GetAndResetXrRrRtt(&rtt_ms));
843 EXPECT_TRUE(rtcp_packet_info_.xr_dlrr_item);
844 } 824 }
845 825
846 TEST_F(RtcpReceiverTest, InjectExtendedReportsPacketWithUnknownReportBlock) { 826 TEST_F(RtcpReceiverTest, InjectExtendedReportsPacketWithUnknownReportBlock) {
847 const uint32_t kSourceSsrc = 0x123456; 827 rtcp_receiver_.SetRtcpXrRrtrStatus(true);
848 std::set<uint32_t> ssrcs;
849 ssrcs.insert(kSourceSsrc);
850 rtcp_receiver_->SetSsrcs(kSourceSsrc, ssrcs);
851 std::vector<uint32_t> remote_ssrcs;
852 remote_ssrcs.push_back(kSourceSsrc);
853 828
854 rtcp::Rrtr rrtr; 829 rtcp::Rrtr rrtr;
855 rtcp::Dlrr dlrr; 830 rtcp::Dlrr dlrr;
856 dlrr.WithDlrrItem(kSourceSsrc, 0x12345, 0x67890); 831 dlrr.WithDlrrItem(kReceiverSsrc, 0x12345, 0x67890);
857 rtcp::VoipMetric metric; 832 rtcp::VoipMetric metric;
858 metric.To(kSourceSsrc); 833 metric.To(kReceiverSsrc);
859 rtcp::ExtendedReports xr; 834 rtcp::ExtendedReports xr;
860 xr.From(0x2345); 835 xr.From(kSenderSsrc);
861 xr.WithRrtr(rrtr); 836 xr.WithRrtr(rrtr);
862 xr.WithDlrr(dlrr); 837 xr.WithDlrr(dlrr);
863 xr.WithVoipMetric(metric); 838 xr.WithVoipMetric(metric);
839
864 rtc::Buffer packet = xr.Build(); 840 rtc::Buffer packet = xr.Build();
865 // Modify the DLRR block to have an unsupported block type, from 5 to 6. 841 // Modify the DLRR block to have an unsupported block type, from 5 to 6.
866 uint8_t* buffer = packet.data(); 842 ASSERT_EQ(5, packet.data()[20]);
867 EXPECT_EQ(5, buffer[20]); 843 packet.data()[20] = 6;
868 buffer[20] = 6; 844 InjectRtcpPacket(packet);
869 845
870 EXPECT_EQ(0, InjectRtcpPacket(packet.data(), packet.size())); 846 // Validate Rrtr was received and processed.
871 EXPECT_EQ(static_cast<unsigned int>(kRtcpXrReceiverReferenceTime + 847 RtcpReceiveTimeInfo rrtime;
872 kRtcpXrVoipMetric), 848 EXPECT_TRUE(rtcp_receiver_.LastReceivedXrReferenceTimeInfo(&rrtime));
873 rtcp_packet_info_.rtcpPacketTypeFlags); 849 // Validate Dlrr report wasn't processed.
874 EXPECT_FALSE(rtcp_packet_info_.xr_dlrr_item); 850 int64_t rtt_ms = 0;
875 } 851 EXPECT_FALSE(rtcp_receiver_.GetAndResetXrRrRtt(&rtt_ms));
876 852 }
877 TEST_F(RtcpReceiverTest, TestXrRrRttInitiallyFalse) { 853
854 TEST_F(RtcpReceiverTest, TestExtendedReportsRrRttInitiallyFalse) {
855 rtcp_receiver_.SetRtcpXrRrtrStatus(true);
856
878 int64_t rtt_ms; 857 int64_t rtt_ms;
879 EXPECT_FALSE(rtcp_receiver_->GetAndResetXrRrRtt(&rtt_ms)); 858 EXPECT_FALSE(rtcp_receiver_.GetAndResetXrRrRtt(&rtt_ms));
880 } 859 }
881 860
882 TEST_F(RtcpReceiverTest, XrDlrrCalculatesRtt) { 861 TEST_F(RtcpReceiverTest, RttCalculatedAfterExtendedReportsDlrr) {
883 Random rand(0x0123456789abcdef); 862 Random rand(0x0123456789abcdef);
884 const uint32_t kSourceSsrc = rand.Rand(0x00000001u, 0xfffffffeu);
885 const int64_t kRttMs = rand.Rand(1, 9 * 3600 * 1000); 863 const int64_t kRttMs = rand.Rand(1, 9 * 3600 * 1000);
886 const uint32_t kDelayNtp = rand.Rand(0, 0x7fffffff); 864 const uint32_t kDelayNtp = rand.Rand(0, 0x7fffffff);
887 const int64_t kDelayMs = CompactNtpRttToMs(kDelayNtp); 865 const int64_t kDelayMs = CompactNtpRttToMs(kDelayNtp);
888 rtcp_receiver_->SetRtcpXrRrtrStatus(true); 866 rtcp_receiver_.SetRtcpXrRrtrStatus(true);
889 std::set<uint32_t> ssrcs;
890 ssrcs.insert(kSourceSsrc);
891 rtcp_receiver_->SetSsrcs(kSourceSsrc, ssrcs);
892 NtpTime now(system_clock_); 867 NtpTime now(system_clock_);
893 uint32_t sent_ntp = CompactNtp(now); 868 uint32_t sent_ntp = CompactNtp(now);
894 system_clock_.AdvanceTimeMilliseconds(kRttMs + kDelayMs); 869 system_clock_.AdvanceTimeMilliseconds(kRttMs + kDelayMs);
895 870
896 rtcp::Dlrr dlrr; 871 rtcp::Dlrr dlrr;
897 dlrr.WithDlrrItem(kSourceSsrc, sent_ntp, kDelayNtp); 872 dlrr.WithDlrrItem(kReceiverSsrc, sent_ntp, kDelayNtp);
898 rtcp::ExtendedReports xr; 873 rtcp::ExtendedReports xr;
899 xr.From(0x2345); 874 xr.From(kSenderSsrc);
900 xr.WithDlrr(dlrr); 875 xr.WithDlrr(dlrr);
901 rtc::Buffer packet = xr.Build(); 876
902 EXPECT_EQ(0, InjectRtcpPacket(packet.data(), packet.size())); 877 InjectRtcpPacket(xr);
903 878
904 int64_t rtt_ms = 0; 879 int64_t rtt_ms = 0;
905 EXPECT_TRUE(rtcp_receiver_->GetAndResetXrRrRtt(&rtt_ms)); 880 EXPECT_TRUE(rtcp_receiver_.GetAndResetXrRrRtt(&rtt_ms));
906 EXPECT_NEAR(kRttMs, rtt_ms, 1); 881 EXPECT_NEAR(kRttMs, rtt_ms, 1);
907 } 882 }
908 883
909 TEST_F(RtcpReceiverTest, XrDlrrCalculatesNegativeRttAsOne) { 884 TEST_F(RtcpReceiverTest, XrDlrrCalculatesNegativeRttAsOne) {
910 Random rand(0x0123456789abcdef); 885 Random rand(0x0123456789abcdef);
911 const uint32_t kSourceSsrc = rand.Rand(0x00000001u, 0xfffffffeu);
912 const int64_t kRttMs = rand.Rand(-3600 * 1000, -1); 886 const int64_t kRttMs = rand.Rand(-3600 * 1000, -1);
913 const uint32_t kDelayNtp = rand.Rand(0, 0x7fffffff); 887 const uint32_t kDelayNtp = rand.Rand(0, 0x7fffffff);
914 const int64_t kDelayMs = CompactNtpRttToMs(kDelayNtp); 888 const int64_t kDelayMs = CompactNtpRttToMs(kDelayNtp);
915 rtcp_receiver_->SetRtcpXrRrtrStatus(true);
916 std::set<uint32_t> ssrcs;
917 ssrcs.insert(kSourceSsrc);
918 rtcp_receiver_->SetSsrcs(kSourceSsrc, ssrcs);
919 NtpTime now(system_clock_); 889 NtpTime now(system_clock_);
920 uint32_t sent_ntp = CompactNtp(now); 890 uint32_t sent_ntp = CompactNtp(now);
921 system_clock_.AdvanceTimeMilliseconds(kRttMs + kDelayMs); 891 system_clock_.AdvanceTimeMilliseconds(kRttMs + kDelayMs);
922 892 rtcp_receiver_.SetRtcpXrRrtrStatus(true);
923 rtcp::Dlrr dlrr; 893
924 dlrr.WithDlrrItem(kSourceSsrc, sent_ntp, kDelayNtp); 894 rtcp::Dlrr dlrr;
925 rtcp::ExtendedReports xr; 895 dlrr.WithDlrrItem(kReceiverSsrc, sent_ntp, kDelayNtp);
926 xr.From(0x2345); 896 rtcp::ExtendedReports xr;
927 xr.WithDlrr(dlrr); 897 xr.From(kSenderSsrc);
928 rtc::Buffer packet = xr.Build(); 898 xr.WithDlrr(dlrr);
929 EXPECT_EQ(0, InjectRtcpPacket(packet.data(), packet.size())); 899
930 900 InjectRtcpPacket(xr);
931 int64_t rtt_ms = 0; 901
932 EXPECT_TRUE(rtcp_receiver_->GetAndResetXrRrRtt(&rtt_ms)); 902 int64_t rtt_ms = 0;
903 EXPECT_TRUE(rtcp_receiver_.GetAndResetXrRrRtt(&rtt_ms));
933 EXPECT_EQ(1, rtt_ms); 904 EXPECT_EQ(1, rtt_ms);
934 } 905 }
935 906
936 TEST_F(RtcpReceiverTest, LastReceivedXrReferenceTimeInfoInitiallyFalse) { 907 TEST_F(RtcpReceiverTest, LastReceivedXrReferenceTimeInfoInitiallyFalse) {
937 RtcpReceiveTimeInfo info; 908 RtcpReceiveTimeInfo info;
938 EXPECT_FALSE(rtcp_receiver_->LastReceivedXrReferenceTimeInfo(&info)); 909 EXPECT_FALSE(rtcp_receiver_.LastReceivedXrReferenceTimeInfo(&info));
939 } 910 }
940 911
941 TEST_F(RtcpReceiverTest, GetLastReceivedExtendedReportsReferenceTimeInfo) { 912 TEST_F(RtcpReceiverTest, GetLastReceivedExtendedReportsReferenceTimeInfo) {
942 const uint32_t kSenderSsrc = 0x123456;
943 const NtpTime kNtp(0x10203, 0x40506); 913 const NtpTime kNtp(0x10203, 0x40506);
944 const uint32_t kNtpMid = CompactNtp(kNtp); 914 const uint32_t kNtpMid = CompactNtp(kNtp);
945 915
946 rtcp::Rrtr rrtr; 916 rtcp::Rrtr rrtr;
947 rrtr.WithNtp(kNtp); 917 rrtr.WithNtp(kNtp);
948 rtcp::ExtendedReports xr; 918 rtcp::ExtendedReports xr;
949 xr.From(kSenderSsrc); 919 xr.From(kSenderSsrc);
950 xr.WithRrtr(rrtr); 920 xr.WithRrtr(rrtr);
951 rtc::Buffer packet = xr.Build(); 921
952 EXPECT_EQ(0, InjectRtcpPacket(packet.data(), packet.size())); 922 InjectRtcpPacket(xr);
953 EXPECT_EQ(kRtcpXrReceiverReferenceTime,
954 rtcp_packet_info_.rtcpPacketTypeFlags);
955 923
956 RtcpReceiveTimeInfo info; 924 RtcpReceiveTimeInfo info;
957 EXPECT_TRUE(rtcp_receiver_->LastReceivedXrReferenceTimeInfo(&info)); 925 EXPECT_TRUE(rtcp_receiver_.LastReceivedXrReferenceTimeInfo(&info));
958 EXPECT_EQ(kSenderSsrc, info.sourceSSRC); 926 EXPECT_EQ(kSenderSsrc, info.sourceSSRC);
959 EXPECT_EQ(kNtpMid, info.lastRR); 927 EXPECT_EQ(kNtpMid, info.lastRR);
960 EXPECT_EQ(0U, info.delaySinceLastRR); 928 EXPECT_EQ(0U, info.delaySinceLastRR);
961 929
962 system_clock_.AdvanceTimeMilliseconds(1000); 930 system_clock_.AdvanceTimeMilliseconds(1000);
963 EXPECT_TRUE(rtcp_receiver_->LastReceivedXrReferenceTimeInfo(&info)); 931 EXPECT_TRUE(rtcp_receiver_.LastReceivedXrReferenceTimeInfo(&info));
964 EXPECT_EQ(65536U, info.delaySinceLastRR); 932 EXPECT_EQ(65536U, info.delaySinceLastRR);
965 } 933 }
966 934
967 TEST_F(RtcpReceiverTest, ReceiveReportTimeout) { 935 TEST_F(RtcpReceiverTest, ReceiveReportTimeout) {
968 const uint32_t kSenderSsrc = 0x10203;
969 const uint32_t kSourceSsrc = 0x40506;
970 const int64_t kRtcpIntervalMs = 1000; 936 const int64_t kRtcpIntervalMs = 1000;
971
972 std::set<uint32_t> ssrcs;
973 ssrcs.insert(kSourceSsrc);
974 rtcp_receiver_->SetSsrcs(kSourceSsrc, ssrcs);
975
976 const uint16_t kSequenceNumber = 1234; 937 const uint16_t kSequenceNumber = 1234;
977 system_clock_.AdvanceTimeMilliseconds(3 * kRtcpIntervalMs); 938 system_clock_.AdvanceTimeMilliseconds(3 * kRtcpIntervalMs);
978 939
979 // No RR received, shouldn't trigger a timeout. 940 // No RR received, shouldn't trigger a timeout.
980 EXPECT_FALSE(rtcp_receiver_->RtcpRrTimeout(kRtcpIntervalMs)); 941 EXPECT_FALSE(rtcp_receiver_.RtcpRrTimeout(kRtcpIntervalMs));
981 EXPECT_FALSE(rtcp_receiver_->RtcpRrSequenceNumberTimeout(kRtcpIntervalMs)); 942 EXPECT_FALSE(rtcp_receiver_.RtcpRrSequenceNumberTimeout(kRtcpIntervalMs));
982 943
983 // Add a RR and advance the clock just enough to not trigger a timeout. 944 // Add a RR and advance the clock just enough to not trigger a timeout.
984 rtcp::ReportBlock rb1; 945 rtcp::ReportBlock rb1;
985 rb1.To(kSourceSsrc); 946 rb1.To(kReceiverSsrc);
986 rb1.WithExtHighestSeqNum(kSequenceNumber); 947 rb1.WithExtHighestSeqNum(kSequenceNumber);
987 rtcp::ReceiverReport rr1; 948 rtcp::ReceiverReport rr1;
988 rr1.From(kSenderSsrc); 949 rr1.From(kSenderSsrc);
989 rr1.WithReportBlock(rb1); 950 rr1.WithReportBlock(rb1);
990 rtc::Buffer p1 = rr1.Build(); 951
991 EXPECT_EQ(0, InjectRtcpPacket(p1.data(), p1.size())); 952 EXPECT_CALL(rtp_rtcp_impl_, OnReceivedRtcpReportBlocks(_));
953 EXPECT_CALL(bandwidth_observer_, OnReceivedRtcpReceiverReport(_, _, _));
954 InjectRtcpPacket(rr1);
955
992 system_clock_.AdvanceTimeMilliseconds(3 * kRtcpIntervalMs - 1); 956 system_clock_.AdvanceTimeMilliseconds(3 * kRtcpIntervalMs - 1);
993 EXPECT_FALSE(rtcp_receiver_->RtcpRrTimeout(kRtcpIntervalMs)); 957 EXPECT_FALSE(rtcp_receiver_.RtcpRrTimeout(kRtcpIntervalMs));
994 EXPECT_FALSE(rtcp_receiver_->RtcpRrSequenceNumberTimeout(kRtcpIntervalMs)); 958 EXPECT_FALSE(rtcp_receiver_.RtcpRrSequenceNumberTimeout(kRtcpIntervalMs));
995 959
996 // Add a RR with the same extended max as the previous RR to trigger a 960 // Add a RR with the same extended max as the previous RR to trigger a
997 // sequence number timeout, but not a RR timeout. 961 // sequence number timeout, but not a RR timeout.
998 EXPECT_EQ(0, InjectRtcpPacket(p1.data(), p1.size())); 962 EXPECT_CALL(rtp_rtcp_impl_, OnReceivedRtcpReportBlocks(_));
963 EXPECT_CALL(bandwidth_observer_, OnReceivedRtcpReceiverReport(_, _, _));
964 InjectRtcpPacket(rr1);
965
999 system_clock_.AdvanceTimeMilliseconds(2); 966 system_clock_.AdvanceTimeMilliseconds(2);
1000 EXPECT_FALSE(rtcp_receiver_->RtcpRrTimeout(kRtcpIntervalMs)); 967 EXPECT_FALSE(rtcp_receiver_.RtcpRrTimeout(kRtcpIntervalMs));
1001 EXPECT_TRUE(rtcp_receiver_->RtcpRrSequenceNumberTimeout(kRtcpIntervalMs)); 968 EXPECT_TRUE(rtcp_receiver_.RtcpRrSequenceNumberTimeout(kRtcpIntervalMs));
1002 969
1003 // Advance clock enough to trigger an RR timeout too. 970 // Advance clock enough to trigger an RR timeout too.
1004 system_clock_.AdvanceTimeMilliseconds(3 * kRtcpIntervalMs); 971 system_clock_.AdvanceTimeMilliseconds(3 * kRtcpIntervalMs);
1005 EXPECT_TRUE(rtcp_receiver_->RtcpRrTimeout(kRtcpIntervalMs)); 972 EXPECT_TRUE(rtcp_receiver_.RtcpRrTimeout(kRtcpIntervalMs));
1006 973
1007 // We should only get one timeout even though we still haven't received a new 974 // We should only get one timeout even though we still haven't received a new
1008 // RR. 975 // RR.
1009 EXPECT_FALSE(rtcp_receiver_->RtcpRrTimeout(kRtcpIntervalMs)); 976 EXPECT_FALSE(rtcp_receiver_.RtcpRrTimeout(kRtcpIntervalMs));
1010 EXPECT_FALSE(rtcp_receiver_->RtcpRrSequenceNumberTimeout(kRtcpIntervalMs)); 977 EXPECT_FALSE(rtcp_receiver_.RtcpRrSequenceNumberTimeout(kRtcpIntervalMs));
1011 978
1012 // Add a new RR with increase sequence number to reset timers. 979 // Add a new RR with increase sequence number to reset timers.
1013 rtcp::ReportBlock rb2; 980 rtcp::ReportBlock rb2;
1014 rb2.To(kSourceSsrc); 981 rb2.To(kReceiverSsrc);
1015 rb2.WithExtHighestSeqNum(kSequenceNumber + 1); 982 rb2.WithExtHighestSeqNum(kSequenceNumber + 1);
1016 rtcp::ReceiverReport rr2; 983 rtcp::ReceiverReport rr2;
1017 rr2.From(kSenderSsrc); 984 rr2.From(kSenderSsrc);
1018 rr2.WithReportBlock(rb2); 985 rr2.WithReportBlock(rb2);
1019 rtc::Buffer p2 = rr2.Build(); 986
1020 EXPECT_EQ(0, InjectRtcpPacket(p2.data(), p2.size())); 987 EXPECT_CALL(rtp_rtcp_impl_, OnReceivedRtcpReportBlocks(_));
1021 EXPECT_FALSE(rtcp_receiver_->RtcpRrTimeout(kRtcpIntervalMs)); 988 EXPECT_CALL(bandwidth_observer_, OnReceivedRtcpReceiverReport(_, _, _));
1022 EXPECT_FALSE(rtcp_receiver_->RtcpRrSequenceNumberTimeout(kRtcpIntervalMs)); 989 InjectRtcpPacket(rr2);
990
991 EXPECT_FALSE(rtcp_receiver_.RtcpRrTimeout(kRtcpIntervalMs));
992 EXPECT_FALSE(rtcp_receiver_.RtcpRrSequenceNumberTimeout(kRtcpIntervalMs));
1023 993
1024 // Verify we can get a timeout again once we've received new RR. 994 // Verify we can get a timeout again once we've received new RR.
1025 system_clock_.AdvanceTimeMilliseconds(2 * kRtcpIntervalMs); 995 system_clock_.AdvanceTimeMilliseconds(2 * kRtcpIntervalMs);
1026 EXPECT_EQ(0, InjectRtcpPacket(p2.data(), p2.size())); 996 EXPECT_CALL(rtp_rtcp_impl_, OnReceivedRtcpReportBlocks(_));
997 EXPECT_CALL(bandwidth_observer_, OnReceivedRtcpReceiverReport(_, _, _));
998 InjectRtcpPacket(rr2);
999
1027 system_clock_.AdvanceTimeMilliseconds(kRtcpIntervalMs + 1); 1000 system_clock_.AdvanceTimeMilliseconds(kRtcpIntervalMs + 1);
1028 EXPECT_FALSE(rtcp_receiver_->RtcpRrTimeout(kRtcpIntervalMs)); 1001 EXPECT_FALSE(rtcp_receiver_.RtcpRrTimeout(kRtcpIntervalMs));
1029 EXPECT_TRUE(rtcp_receiver_->RtcpRrSequenceNumberTimeout(kRtcpIntervalMs)); 1002 EXPECT_TRUE(rtcp_receiver_.RtcpRrSequenceNumberTimeout(kRtcpIntervalMs));
1003
1030 system_clock_.AdvanceTimeMilliseconds(2 * kRtcpIntervalMs); 1004 system_clock_.AdvanceTimeMilliseconds(2 * kRtcpIntervalMs);
1031 EXPECT_TRUE(rtcp_receiver_->RtcpRrTimeout(kRtcpIntervalMs)); 1005 EXPECT_TRUE(rtcp_receiver_.RtcpRrTimeout(kRtcpIntervalMs));
1032 } 1006 }
1033 1007
1034 TEST_F(RtcpReceiverTest, TmmbrReceivedWithNoIncomingPacket) { 1008 TEST_F(RtcpReceiverTest, TmmbrReceivedWithNoIncomingPacket) {
1035 // This call is expected to fail because no data has arrived. 1009 EXPECT_EQ(0u, rtcp_receiver_.TmmbrReceived().size());
1036 EXPECT_EQ(0u, rtcp_receiver_->TmmbrReceived().size());
1037 } 1010 }
1038 1011
1039 TEST_F(RtcpReceiverTest, TmmbrPacketAccepted) { 1012 TEST_F(RtcpReceiverTest, TmmbrPacketAccepted) {
1040 const uint32_t kMediaFlowSsrc = 0x2040608;
1041 const uint32_t kSenderSsrc = 0x10203;
1042 std::set<uint32_t> ssrcs;
1043 ssrcs.insert(kMediaFlowSsrc); // Matches "media source" above.
1044 rtcp_receiver_->SetSsrcs(kMediaFlowSsrc, ssrcs);
1045
1046 rtcp::Tmmbr tmmbr; 1013 rtcp::Tmmbr tmmbr;
1047 tmmbr.From(kSenderSsrc); 1014 tmmbr.From(kSenderSsrc);
1048 tmmbr.WithTmmbr(rtcp::TmmbItem(kMediaFlowSsrc, 30000, 0)); 1015 tmmbr.WithTmmbr(rtcp::TmmbItem(kReceiverSsrc, 30000, 0));
sprang_webrtc 2016/09/05 11:05:49 Named constant for 30000?
danilchap 2016/09/05 11:54:15 Done.
1049
1050 rtcp::SenderReport sr; 1016 rtcp::SenderReport sr;
1051 sr.From(kSenderSsrc); 1017 sr.From(kSenderSsrc);
1052 rtcp::CompoundPacket compound; 1018 rtcp::CompoundPacket compound;
1053 compound.Append(&sr); 1019 compound.Append(&sr);
1054 compound.Append(&tmmbr); 1020 compound.Append(&tmmbr);
1055 rtc::Buffer packet = compound.Build(); 1021
1056 EXPECT_EQ(0, InjectRtcpPacket(packet.data(), packet.size())); 1022 EXPECT_CALL(rtp_rtcp_impl_, OnReceivedRtcpReportBlocks(_));
1057 1023 EXPECT_CALL(rtp_rtcp_impl_, SetTmmbn(SizeIs(1)));
1058 std::vector<rtcp::TmmbItem> candidate_set = rtcp_receiver_->TmmbrReceived(); 1024 EXPECT_CALL(bandwidth_observer_, OnReceivedRtcpReceiverReport(_, _, _));
1059 EXPECT_EQ(1u, candidate_set.size()); 1025 EXPECT_CALL(bandwidth_observer_, OnReceivedEstimatedBitrate(30000));
1060 EXPECT_LT(0U, candidate_set[0].bitrate_bps()); 1026 InjectRtcpPacket(compound);
sprang_webrtc 2016/09/05 11:05:49 Ehm, "EXPECT_LT(0U," ??? That's one way to do it I
danilchap 2016/09/05 11:54:15 There are only two possible values: 0 and more.
1061 EXPECT_EQ(kSenderSsrc, candidate_set[0].ssrc()); 1027
1028 std::vector<rtcp::TmmbItem> tmmbr_received = rtcp_receiver_.TmmbrReceived();
1029 ASSERT_EQ(1u, tmmbr_received.size());
1030 EXPECT_EQ(30000U, tmmbr_received[0].bitrate_bps());
1031 EXPECT_EQ(kSenderSsrc, tmmbr_received[0].ssrc());
1062 } 1032 }
1063 1033
1064 TEST_F(RtcpReceiverTest, TmmbrPacketNotForUsIgnored) { 1034 TEST_F(RtcpReceiverTest, TmmbrPacketNotForUsIgnored) {
1065 const uint32_t kMediaFlowSsrc = 0x2040608;
1066 const uint32_t kSenderSsrc = 0x10203;
1067
1068 rtcp::Tmmbr tmmbr; 1035 rtcp::Tmmbr tmmbr;
1069 tmmbr.From(kSenderSsrc); 1036 tmmbr.From(kSenderSsrc);
1070 // This SSRC is not what we are sending. 1037 tmmbr.WithTmmbr(rtcp::TmmbItem(kNotToUsSsrc, 30000, 0));
1071 tmmbr.WithTmmbr(rtcp::TmmbItem(kMediaFlowSsrc + 1, 30000, 0));
1072 1038
1073 rtcp::SenderReport sr; 1039 rtcp::SenderReport sr;
1074 sr.From(kSenderSsrc); 1040 sr.From(kSenderSsrc);
1075 rtcp::CompoundPacket compound; 1041 rtcp::CompoundPacket compound;
1076 compound.Append(&sr); 1042 compound.Append(&sr);
1077 compound.Append(&tmmbr); 1043 compound.Append(&tmmbr);
1078 rtc::Buffer packet = compound.Build(); 1044
1079 1045 EXPECT_CALL(rtp_rtcp_impl_, OnReceivedRtcpReportBlocks(_));
1080 std::set<uint32_t> ssrcs; 1046 EXPECT_CALL(bandwidth_observer_, OnReceivedRtcpReceiverReport(_, _, _));
1081 ssrcs.insert(kMediaFlowSsrc); 1047 EXPECT_CALL(bandwidth_observer_, OnReceivedEstimatedBitrate(_)).Times(0);
philipel 2016/09/05 11:59:27 strict
danilchap 2016/09/05 13:27:55 Acknowledged.
1082 rtcp_receiver_->SetSsrcs(kMediaFlowSsrc, ssrcs); 1048 InjectRtcpPacket(compound);
1083 EXPECT_EQ(0, InjectRtcpPacket(packet.data(), packet.size())); 1049
1084 EXPECT_EQ(0u, rtcp_receiver_->TmmbrReceived().size()); 1050 EXPECT_EQ(0u, rtcp_receiver_.TmmbrReceived().size());
1085 } 1051 }
1086 1052
1087 TEST_F(RtcpReceiverTest, TmmbrPacketZeroRateIgnored) { 1053 TEST_F(RtcpReceiverTest, TmmbrPacketZeroRateIgnored) {
1088 const uint32_t kMediaFlowSsrc = 0x2040608;
1089 const uint32_t kSenderSsrc = 0x10203;
1090 std::set<uint32_t> ssrcs;
1091 ssrcs.insert(kMediaFlowSsrc); // Matches "media source" above.
1092 rtcp_receiver_->SetSsrcs(kMediaFlowSsrc, ssrcs);
1093
1094 rtcp::Tmmbr tmmbr; 1054 rtcp::Tmmbr tmmbr;
1095 tmmbr.From(kSenderSsrc); 1055 tmmbr.From(kSenderSsrc);
1096 tmmbr.WithTmmbr(rtcp::TmmbItem(kMediaFlowSsrc, 0, 0)); 1056 tmmbr.WithTmmbr(rtcp::TmmbItem(kReceiverSsrc, 0, 0));
1097
1098 rtcp::SenderReport sr; 1057 rtcp::SenderReport sr;
1099 sr.From(kSenderSsrc); 1058 sr.From(kSenderSsrc);
1100 rtcp::CompoundPacket compound; 1059 rtcp::CompoundPacket compound;
1101 compound.Append(&sr); 1060 compound.Append(&sr);
1102 compound.Append(&tmmbr); 1061 compound.Append(&tmmbr);
1103 rtc::Buffer packet = compound.Build(); 1062
1104 1063 EXPECT_CALL(rtp_rtcp_impl_, OnReceivedRtcpReportBlocks(_));
1105 EXPECT_EQ(0, InjectRtcpPacket(packet.data(), packet.size())); 1064 EXPECT_CALL(bandwidth_observer_, OnReceivedRtcpReceiverReport(_, _, _));
1106 EXPECT_EQ(0u, rtcp_receiver_->TmmbrReceived().size()); 1065 EXPECT_CALL(bandwidth_observer_, OnReceivedEstimatedBitrate(_)).Times(0);
philipel 2016/09/05 11:59:27 strict
danilchap 2016/09/05 13:27:55 Acknowledged.
1066 InjectRtcpPacket(compound);
1067
1068 EXPECT_EQ(0u, rtcp_receiver_.TmmbrReceived().size());
1107 } 1069 }
1108 1070
1109 TEST_F(RtcpReceiverTest, TmmbrThreeConstraintsTimeOut) { 1071 TEST_F(RtcpReceiverTest, TmmbrThreeConstraintsTimeOut) {
1110 const uint32_t kMediaFlowSsrc = 0x2040608;
1111 const uint32_t kSenderSsrc = 0x10203;
1112 std::set<uint32_t> ssrcs;
1113 ssrcs.insert(kMediaFlowSsrc); // Matches "media source" above.
1114 rtcp_receiver_->SetSsrcs(kMediaFlowSsrc, ssrcs);
1115
1116 // Inject 3 packets "from" kSenderSsrc, kSenderSsrc+1, kSenderSsrc+2. 1072 // Inject 3 packets "from" kSenderSsrc, kSenderSsrc+1, kSenderSsrc+2.
1117 // The times of arrival are starttime + 0, starttime + 5 and starttime + 10. 1073 // The times of arrival are starttime + 0, starttime + 5 and starttime + 10.
1118 for (uint32_t ssrc = kSenderSsrc; ssrc < kSenderSsrc + 3; ++ssrc) { 1074 for (uint32_t ssrc = kSenderSsrc; ssrc < kSenderSsrc + 3; ++ssrc) {
1119 rtcp::Tmmbr tmmbr; 1075 rtcp::Tmmbr tmmbr;
1120 tmmbr.From(ssrc); 1076 tmmbr.From(ssrc);
1121 tmmbr.WithTmmbr(rtcp::TmmbItem(kMediaFlowSsrc, 30000, 0)); 1077 tmmbr.WithTmmbr(rtcp::TmmbItem(kReceiverSsrc, 30000, 0));
1122
1123 rtcp::SenderReport sr; 1078 rtcp::SenderReport sr;
1124 sr.From(ssrc); 1079 sr.From(ssrc);
1125 rtcp::CompoundPacket compound; 1080 rtcp::CompoundPacket compound;
1126 compound.Append(&sr); 1081 compound.Append(&sr);
1127 compound.Append(&tmmbr); 1082 compound.Append(&tmmbr);
1128 rtc::Buffer packet = compound.Build(); 1083
1129 EXPECT_EQ(0, InjectRtcpPacket(packet.data(), packet.size())); 1084 EXPECT_CALL(rtp_rtcp_impl_, OnReceivedRtcpReportBlocks(_));
1085 EXPECT_CALL(rtp_rtcp_impl_, SetTmmbn(_));
1086 EXPECT_CALL(bandwidth_observer_, OnReceivedRtcpReceiverReport(_, _, _));
1087 EXPECT_CALL(bandwidth_observer_, OnReceivedEstimatedBitrate(_));
1088 InjectRtcpPacket(compound);
1089
1130 // 5 seconds between each packet. 1090 // 5 seconds between each packet.
1131 system_clock_.AdvanceTimeMilliseconds(5000); 1091 system_clock_.AdvanceTimeMilliseconds(5000);
1132 } 1092 }
1133 // It is now starttime + 15. 1093 // It is now starttime + 15.
1134 std::vector<rtcp::TmmbItem> candidate_set = rtcp_receiver_->TmmbrReceived(); 1094 std::vector<rtcp::TmmbItem> candidate_set = rtcp_receiver_.TmmbrReceived();
1135 EXPECT_EQ(3u, candidate_set.size()); 1095 ASSERT_EQ(3u, candidate_set.size());
1136 EXPECT_LT(0U, candidate_set[0].bitrate_bps()); 1096 EXPECT_LT(0U, candidate_set[0].bitrate_bps());
sprang_webrtc 2016/09/05 11:05:49 Please update this to check for the actual bitrate
danilchap 2016/09/05 11:54:16 Missed, thank you, Done.
1097
1137 // We expect the timeout to be 25 seconds. Advance the clock by 12 1098 // We expect the timeout to be 25 seconds. Advance the clock by 12
1138 // seconds, timing out the first packet. 1099 // seconds, timing out the first packet.
1139 system_clock_.AdvanceTimeMilliseconds(12000); 1100 system_clock_.AdvanceTimeMilliseconds(12000);
1140 candidate_set = rtcp_receiver_->TmmbrReceived(); 1101 candidate_set = rtcp_receiver_.TmmbrReceived();
1141 EXPECT_EQ(2u, candidate_set.size()); 1102 ASSERT_EQ(2u, candidate_set.size());
1142 EXPECT_EQ(kSenderSsrc + 1, candidate_set[0].ssrc()); 1103 EXPECT_EQ(kSenderSsrc + 1, candidate_set[0].ssrc());
1143 } 1104 }
1144 1105
1145 TEST_F(RtcpReceiverTest, Callbacks) { 1106 TEST_F(RtcpReceiverTest, Callbacks) {
1146 class RtcpCallbackImpl : public RtcpStatisticsCallback { 1107 MockRtcpCallbackImpl callback;
1147 public: 1108 rtcp_receiver_.RegisterRtcpStatisticsCallback(&callback);
1148 RtcpCallbackImpl() : RtcpStatisticsCallback(), ssrc_(0) {} 1109
1149 virtual ~RtcpCallbackImpl() {}
1150
1151 void StatisticsUpdated(const RtcpStatistics& statistics,
1152 uint32_t ssrc) override {
1153 stats_ = statistics;
1154 ssrc_ = ssrc;
1155 }
1156
1157 void CNameChanged(const char* cname, uint32_t ssrc) override {}
1158
1159 bool Matches(uint32_t ssrc, uint32_t extended_max, uint8_t fraction_loss,
1160 uint32_t cumulative_loss, uint32_t jitter) {
1161 return ssrc_ == ssrc &&
1162 stats_.fraction_lost == fraction_loss &&
1163 stats_.cumulative_lost == cumulative_loss &&
1164 stats_.extended_max_sequence_number == extended_max &&
1165 stats_.jitter == jitter;
1166 }
1167
1168 RtcpStatistics stats_;
1169 uint32_t ssrc_;
1170 } callback;
1171
1172 rtcp_receiver_->RegisterRtcpStatisticsCallback(&callback);
1173
1174 const uint32_t kSenderSsrc = 0x10203;
1175 const uint32_t kSourceSsrc = 0x123456;
1176 const uint8_t kFractionLoss = 3; 1110 const uint8_t kFractionLoss = 3;
1177 const uint32_t kCumulativeLoss = 7; 1111 const uint32_t kCumulativeLoss = 7;
1178 const uint32_t kJitter = 9; 1112 const uint32_t kJitter = 9;
1179 const uint16_t kSequenceNumber = 1234; 1113 const uint16_t kSequenceNumber = 1234;
1180 1114
1181 std::set<uint32_t> ssrcs;
1182 ssrcs.insert(kSourceSsrc);
1183 rtcp_receiver_->SetSsrcs(kSourceSsrc, ssrcs);
1184
1185 // First packet, all numbers should just propagate. 1115 // First packet, all numbers should just propagate.
1186 rtcp::ReportBlock rb1; 1116 rtcp::ReportBlock rb1;
1187 rb1.To(kSourceSsrc); 1117 rb1.To(kReceiverSsrc);
1188 rb1.WithExtHighestSeqNum(kSequenceNumber); 1118 rb1.WithExtHighestSeqNum(kSequenceNumber);
1189 rb1.WithFractionLost(kFractionLoss); 1119 rb1.WithFractionLost(kFractionLoss);
1190 rb1.WithCumulativeLost(kCumulativeLoss); 1120 rb1.WithCumulativeLost(kCumulativeLoss);
1191 rb1.WithJitter(kJitter); 1121 rb1.WithJitter(kJitter);
1192 1122
1193 rtcp::ReceiverReport rr1; 1123 rtcp::ReceiverReport rr1;
1194 rr1.From(kSenderSsrc); 1124 rr1.From(kSenderSsrc);
1195 rr1.WithReportBlock(rb1); 1125 rr1.WithReportBlock(rb1);
1196 rtc::Buffer p1 = rr1.Build(); 1126 EXPECT_CALL(
1197 EXPECT_EQ(0, InjectRtcpPacket(p1.data(), p1.size())); 1127 callback,
1198 EXPECT_TRUE(callback.Matches(kSourceSsrc, kSequenceNumber, kFractionLoss, 1128 StatisticsUpdated(
1199 kCumulativeLoss, kJitter)); 1129 AllOf(Field(&RtcpStatistics::fraction_lost, kFractionLoss),
1130 Field(&RtcpStatistics::cumulative_lost, kCumulativeLoss),
1131 Field(&RtcpStatistics::extended_max_sequence_number,
1132 kSequenceNumber),
1133 Field(&RtcpStatistics::jitter, kJitter)),
1134 kReceiverSsrc));
1135 EXPECT_CALL(rtp_rtcp_impl_, OnReceivedRtcpReportBlocks(_));
1136 EXPECT_CALL(bandwidth_observer_, OnReceivedRtcpReceiverReport(_, _, _));
1137 InjectRtcpPacket(rr1);
1200 1138
1201 rtcp_receiver_->RegisterRtcpStatisticsCallback(nullptr); 1139 rtcp_receiver_.RegisterRtcpStatisticsCallback(nullptr);
1202 1140
1203 // Add arbitrary numbers, callback should not be called (retain old values). 1141 // Add arbitrary numbers, callback should not be called.
1204 rtcp::ReportBlock rb2; 1142 rtcp::ReportBlock rb2;
1205 rb2.To(kSourceSsrc); 1143 rb2.To(kReceiverSsrc);
1206 rb2.WithExtHighestSeqNum(kSequenceNumber + 1); 1144 rb2.WithExtHighestSeqNum(kSequenceNumber + 1);
1207 rb2.WithFractionLost(42); 1145 rb2.WithFractionLost(42);
1208 rb2.WithCumulativeLost(137); 1146 rb2.WithCumulativeLost(137);
1209 rb2.WithJitter(4711); 1147 rb2.WithJitter(4711);
1210 1148
1211 rtcp::ReceiverReport rr2; 1149 rtcp::ReceiverReport rr2;
1212 rr2.From(kSenderSsrc); 1150 rr2.From(kSenderSsrc);
1213 rr2.WithReportBlock(rb2); 1151 rr2.WithReportBlock(rb2);
1214 rtc::Buffer p2 = rr2.Build(); 1152
1215 EXPECT_EQ(0, InjectRtcpPacket(p2.data(), p2.size())); 1153 EXPECT_CALL(rtp_rtcp_impl_, OnReceivedRtcpReportBlocks(_));
1216 EXPECT_TRUE(callback.Matches(kSourceSsrc, kSequenceNumber, kFractionLoss, 1154 EXPECT_CALL(bandwidth_observer_, OnReceivedRtcpReceiverReport(_, _, _));
1217 kCumulativeLoss, kJitter)); 1155 EXPECT_CALL(callback, StatisticsUpdated(_, _)).Times(0);
1156 InjectRtcpPacket(rr2);
1218 } 1157 }
1219 1158
1220 TEST_F(RtcpReceiverTest, ReceivesTransportFeedback) { 1159 TEST_F(RtcpReceiverTest, ReceivesTransportFeedback) {
1221 const uint32_t kSenderSsrc = 0x10203;
1222 const uint32_t kSourceSsrc = 0x123456;
1223
1224 std::set<uint32_t> ssrcs;
1225 ssrcs.insert(kSourceSsrc);
1226 rtcp_receiver_->SetSsrcs(kSourceSsrc, ssrcs);
1227
1228 rtcp::TransportFeedback packet; 1160 rtcp::TransportFeedback packet;
1229 packet.WithMediaSourceSsrc(kSourceSsrc); 1161 packet.To(kReceiverSsrc);
1230 packet.WithPacketSenderSsrc(kSenderSsrc); 1162 packet.From(kSenderSsrc);
1231 packet.WithBase(1, 1000); 1163 packet.WithBase(1, 1000);
1232 packet.WithReceivedPacket(1, 1000); 1164 packet.WithReceivedPacket(1, 1000);
1233 1165
1234 rtc::Buffer built_packet = packet.Build(); 1166 EXPECT_CALL(
1235 1167 transport_feedback_observer_,
1236 EXPECT_EQ(0, InjectRtcpPacket(built_packet.data(), built_packet.size())); 1168 OnTransportFeedback(
1237 1169 AllOf(Property(&rtcp::TransportFeedback::media_ssrc, kReceiverSsrc),
1238 EXPECT_NE(0u, rtcp_packet_info_.rtcpPacketTypeFlags & kRtcpTransportFeedback); 1170 Property(&rtcp::TransportFeedback::sender_ssrc, kSenderSsrc))));
1239 EXPECT_TRUE(rtcp_packet_info_.transport_feedback_.get() != nullptr); 1171 InjectRtcpPacket(packet);
1240 } 1172 }
1241 1173
1242 TEST_F(RtcpReceiverTest, ReceivesRemb) { 1174 TEST_F(RtcpReceiverTest, ReceivesRemb) {
1243 const uint32_t kSenderSsrc = 0x123456;
1244 const uint32_t kBitrateBps = 500000; 1175 const uint32_t kBitrateBps = 500000;
1245 rtcp::Remb remb; 1176 rtcp::Remb remb;
1246 remb.From(kSenderSsrc); 1177 remb.From(kSenderSsrc);
1247 remb.WithBitrateBps(kBitrateBps); 1178 remb.WithBitrateBps(kBitrateBps);
1248 rtc::Buffer built_packet = remb.Build();
1249 1179
1250 EXPECT_EQ(0, InjectRtcpPacket(built_packet.data(), built_packet.size())); 1180 EXPECT_CALL(bandwidth_observer_, OnReceivedEstimatedBitrate(kBitrateBps));
1251 1181 InjectRtcpPacket(remb);
1252 EXPECT_EQ(kRtcpRemb, rtcp_packet_info_.rtcpPacketTypeFlags & kRtcpRemb);
1253 EXPECT_EQ(kBitrateBps, rtcp_packet_info_.receiverEstimatedMaxBitrate);
1254 } 1182 }
1255 1183
1256 TEST_F(RtcpReceiverTest, HandlesInvalidTransportFeedback) { 1184 TEST_F(RtcpReceiverTest, HandlesInvalidTransportFeedback) {
1257 const uint32_t kSenderSsrc = 0x10203;
1258 const uint32_t kSourceSsrc = 0x123456;
1259
1260 std::set<uint32_t> ssrcs;
1261 ssrcs.insert(kSourceSsrc);
1262 rtcp_receiver_->SetSsrcs(kSourceSsrc, ssrcs);
1263
1264 // Send a compound packet with a TransportFeedback followed by something else. 1185 // Send a compound packet with a TransportFeedback followed by something else.
1265 rtcp::TransportFeedback packet; 1186 rtcp::TransportFeedback packet;
1266 packet.WithMediaSourceSsrc(kSourceSsrc); 1187 packet.To(kReceiverSsrc);
1267 packet.WithPacketSenderSsrc(kSenderSsrc); 1188 packet.From(kSenderSsrc);
1268 packet.WithBase(1, 1000); 1189 packet.WithBase(1, 1000);
1269 packet.WithReceivedPacket(1, 1000); 1190 packet.WithReceivedPacket(1, 1000);
1270 1191
1271 static uint32_t kBitrateBps = 50000; 1192 static uint32_t kBitrateBps = 50000;
1272 rtcp::Remb remb; 1193 rtcp::Remb remb;
1273 remb.From(kSenderSsrc); 1194 remb.From(kSenderSsrc);
1274 remb.WithBitrateBps(kBitrateBps); 1195 remb.WithBitrateBps(kBitrateBps);
1275 rtcp::CompoundPacket compound; 1196 rtcp::CompoundPacket compound;
1276 compound.Append(&packet); 1197 compound.Append(&packet);
1277 compound.Append(&remb); 1198 compound.Append(&remb);
1278 rtc::Buffer built_packet = compound.Build(); 1199 rtc::Buffer built_packet = compound.Build();
1279 1200
1280 // Modify the TransportFeedback packet so that it is invalid. 1201 // Modify the TransportFeedback packet so that it is invalid.
1281 const size_t kStatusCountOffset = 14; 1202 const size_t kStatusCountOffset = 14;
1282 ByteWriter<uint16_t>::WriteBigEndian( 1203 ByteWriter<uint16_t>::WriteBigEndian(
1283 &built_packet.data()[kStatusCountOffset], 42); 1204 &built_packet.data()[kStatusCountOffset], 42);
1284 1205
1285 EXPECT_EQ(0, InjectRtcpPacket(built_packet.data(), built_packet.size())); 1206 // Stress no transport feedback is expected.
1286 1207 EXPECT_CALL(transport_feedback_observer_, OnTransportFeedback(_)).Times(0);
1287 // Transport feedback should be ignored, but next packet should work. 1208 // But remb should be processed and cause a callback
1288 EXPECT_EQ(0u, rtcp_packet_info_.rtcpPacketTypeFlags & kRtcpTransportFeedback); 1209 EXPECT_CALL(bandwidth_observer_, OnReceivedEstimatedBitrate(kBitrateBps));
1289 EXPECT_NE(0u, rtcp_packet_info_.rtcpPacketTypeFlags & kRtcpRemb); 1210 InjectRtcpPacket(built_packet);
1290 EXPECT_EQ(kBitrateBps, rtcp_packet_info_.receiverEstimatedMaxBitrate);
1291 } 1211 }
1292 1212
1293 } // Anonymous namespace 1213 TEST_F(RtcpReceiverTest, Nack) {
1214 const uint16_t kNackList1[] = {1, 2, 3, 5};
1215 const size_t kNackListLength1 = std::end(kNackList1) - std::begin(kNackList1);
1216 const uint16_t kNackList2[] = {5, 7, 30, 40};
1217 const size_t kNackListLength2 = std::end(kNackList2) - std::begin(kNackList2);
1218
1219 rtcp::Nack nack;
1220 nack.From(kSenderSsrc);
1221 nack.To(kReceiverSsrc);
1222 nack.WithList(kNackList1, kNackListLength1);
1223
1224 EXPECT_CALL(rtp_rtcp_impl_, OnReceivedNack(ElementsAreArray(kNackList1)));
1225 EXPECT_CALL(
1226 packet_type_counter_observer_,
1227 RtcpPacketTypesCounterUpdated(
1228 kReceiverSsrc,
1229 AllOf(Field(&RtcpPacketTypeCounter::nack_requests, 4),
1230 Field(&RtcpPacketTypeCounter::unique_nack_requests, 4))));
sprang_webrtc 2016/09/05 11:05:49 kNackListLength1 instead of 4 Derive below as well
danilchap 2016/09/05 11:54:15 Oops, Done.
1231 InjectRtcpPacket(nack);
1232
1233 rtcp::Nack nack2;
1234 nack2.From(kSenderSsrc);
1235 nack2.To(kReceiverSsrc);
1236 nack2.WithList(kNackList2, kNackListLength2);
1237 EXPECT_CALL(rtp_rtcp_impl_, OnReceivedNack(ElementsAreArray(kNackList2)));
1238 EXPECT_CALL(
1239 packet_type_counter_observer_,
1240 RtcpPacketTypesCounterUpdated(
1241 kReceiverSsrc,
1242 AllOf(Field(&RtcpPacketTypeCounter::nack_requests, 8),
1243 Field(&RtcpPacketTypeCounter::unique_nack_requests, 7))));
1244 InjectRtcpPacket(nack2);
1245 }
1246
1247 TEST_F(RtcpReceiverTest, NackNotForUsIgnored) {
1248 const uint16_t kNackList1[] = {1, 2, 3, 5};
1249 const size_t kNackListLength1 = std::end(kNackList1) - std::begin(kNackList1);
1250
1251 rtcp::Nack nack;
1252 nack.From(kSenderSsrc);
1253 nack.To(kNotToUsSsrc);
1254 nack.WithList(kNackList1, kNackListLength1);
1255
1256 EXPECT_CALL(packet_type_counter_observer_,
1257 RtcpPacketTypesCounterUpdated(
1258 _, Field(&RtcpPacketTypeCounter::nack_requests, 0)));
1259 InjectRtcpPacket(nack);
1260 }
1261
1262 TEST_F(RtcpReceiverTest, ForceSenderReport) {
1263 rtcp::RapidResyncRequest rr;
1264 rr.From(kSenderSsrc);
1265 rr.To(kReceiverSsrc);
1266
1267 EXPECT_CALL(rtp_rtcp_impl_, OnRequestSendReport());
1268 InjectRtcpPacket(rr);
1269 }
1294 1270
1295 } // namespace webrtc 1271 } // namespace webrtc
OLDNEW
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698