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

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

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

Powered by Google App Engine
This is Rietveld 408576698