OLD | NEW |
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 |
OLD | NEW |