OLD | NEW |
1 /* | 1 /* |
2 * Copyright (c) 2016 The WebRTC project authors. All Rights Reserved. | 2 * Copyright (c) 2016 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_packet/extended_reports.h" | 11 #include "webrtc/modules/rtp_rtcp/source/rtcp_packet/extended_reports.h" |
12 | 12 |
13 #include "webrtc/base/random.h" | 13 #include "webrtc/base/random.h" |
14 #include "webrtc/test/gmock.h" | 14 #include "webrtc/test/gmock.h" |
15 #include "webrtc/test/gtest.h" | 15 #include "webrtc/test/gtest.h" |
16 #include "webrtc/test/rtcp_packet_parser.h" | 16 #include "webrtc/test/rtcp_packet_parser.h" |
17 | 17 |
18 using testing::ElementsAre; | 18 using testing::ElementsAre; |
19 using testing::ElementsAreArray; | 19 using testing::ElementsAreArray; |
20 using testing::IsEmpty; | |
21 using testing::make_tuple; | 20 using testing::make_tuple; |
22 using webrtc::rtcp::Dlrr; | 21 using webrtc::rtcp::Dlrr; |
23 using webrtc::rtcp::ExtendedReports; | 22 using webrtc::rtcp::ExtendedReports; |
24 using webrtc::rtcp::ReceiveTimeInfo; | 23 using webrtc::rtcp::ReceiveTimeInfo; |
25 using webrtc::rtcp::Rrtr; | 24 using webrtc::rtcp::Rrtr; |
26 using webrtc::rtcp::VoipMetric; | 25 using webrtc::rtcp::VoipMetric; |
27 | 26 |
28 namespace webrtc { | 27 namespace webrtc { |
29 // Define comparision operators that shouldn't be needed in production, | 28 // Define comparision operators that shouldn't be needed in production, |
30 // but make testing matches more clear. | 29 // but make testing matches more clear. |
(...skipping 24 matching lines...) Expand all Loading... |
55 bool operator==(const Rrtr& rrtr1, const Rrtr& rrtr2) { | 54 bool operator==(const Rrtr& rrtr1, const Rrtr& rrtr2) { |
56 return rrtr1.ntp() == rrtr2.ntp(); | 55 return rrtr1.ntp() == rrtr2.ntp(); |
57 } | 56 } |
58 | 57 |
59 bool operator==(const ReceiveTimeInfo& time1, const ReceiveTimeInfo& time2) { | 58 bool operator==(const ReceiveTimeInfo& time1, const ReceiveTimeInfo& time2) { |
60 return time1.ssrc == time2.ssrc && | 59 return time1.ssrc == time2.ssrc && |
61 time1.last_rr == time2.last_rr && | 60 time1.last_rr == time2.last_rr && |
62 time1.delay_since_last_rr == time2.delay_since_last_rr; | 61 time1.delay_since_last_rr == time2.delay_since_last_rr; |
63 } | 62 } |
64 | 63 |
65 bool operator==(const Dlrr& dlrr1, const Dlrr& dlrr2) { | |
66 return dlrr1.sub_blocks() == dlrr2.sub_blocks(); | |
67 } | |
68 | |
69 bool operator==(const VoipMetric& metric1, const VoipMetric& metric2) { | 64 bool operator==(const VoipMetric& metric1, const VoipMetric& metric2) { |
70 return metric1.ssrc() == metric2.ssrc() && | 65 return metric1.ssrc() == metric2.ssrc() && |
71 metric1.voip_metric() == metric2.voip_metric(); | 66 metric1.voip_metric() == metric2.voip_metric(); |
72 } | 67 } |
73 } // namespace rtcp | 68 } // namespace rtcp |
74 | 69 |
75 namespace { | 70 namespace { |
76 constexpr uint32_t kSenderSsrc = 0x12345678; | 71 constexpr uint32_t kSenderSsrc = 0x12345678; |
77 constexpr uint8_t kEmptyPacket[] = {0x80, 207, 0x00, 0x01, | 72 constexpr uint8_t kEmptyPacket[] = {0x80, 207, 0x00, 0x01, |
78 0x12, 0x34, 0x56, 0x78}; | 73 0x12, 0x34, 0x56, 0x78}; |
(...skipping 76 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
155 rtc::Buffer packet = xr.Build(); | 150 rtc::Buffer packet = xr.Build(); |
156 | 151 |
157 EXPECT_THAT(make_tuple(packet.data(), packet.size()), | 152 EXPECT_THAT(make_tuple(packet.data(), packet.size()), |
158 ElementsAreArray(kEmptyPacket)); | 153 ElementsAreArray(kEmptyPacket)); |
159 } | 154 } |
160 | 155 |
161 TEST_F(RtcpPacketExtendedReportsTest, ParseWithoutReportBlocks) { | 156 TEST_F(RtcpPacketExtendedReportsTest, ParseWithoutReportBlocks) { |
162 ExtendedReports parsed; | 157 ExtendedReports parsed; |
163 EXPECT_TRUE(test::ParseSinglePacket(kEmptyPacket, &parsed)); | 158 EXPECT_TRUE(test::ParseSinglePacket(kEmptyPacket, &parsed)); |
164 EXPECT_EQ(kSenderSsrc, parsed.sender_ssrc()); | 159 EXPECT_EQ(kSenderSsrc, parsed.sender_ssrc()); |
165 EXPECT_THAT(parsed.rrtrs(), IsEmpty()); | 160 EXPECT_FALSE(parsed.rrtr()); |
166 EXPECT_THAT(parsed.dlrrs(), IsEmpty()); | 161 EXPECT_FALSE(parsed.dlrr()); |
167 EXPECT_THAT(parsed.voip_metrics(), IsEmpty()); | 162 EXPECT_FALSE(parsed.voip_metric()); |
168 } | 163 } |
169 | 164 |
170 TEST_F(RtcpPacketExtendedReportsTest, CreateAndParseWithOneRrtrBlock) { | 165 TEST_F(RtcpPacketExtendedReportsTest, CreateAndParseWithRrtrBlock) { |
171 Rrtr rrtr = Rand<Rrtr>(); | 166 const Rrtr kRrtr = Rand<Rrtr>(); |
172 ExtendedReports xr; | 167 ExtendedReports xr; |
173 xr.SetSenderSsrc(kSenderSsrc); | 168 xr.SetSenderSsrc(kSenderSsrc); |
174 EXPECT_TRUE(xr.AddRrtr(rrtr)); | 169 xr.SetRrtr(kRrtr); |
175 rtc::Buffer packet = xr.Build(); | 170 rtc::Buffer packet = xr.Build(); |
176 | 171 |
177 ExtendedReports mparsed; | 172 ExtendedReports mparsed; |
178 EXPECT_TRUE(test::ParseSinglePacket(packet, &mparsed)); | |
179 const ExtendedReports& parsed = mparsed; | |
180 | |
181 EXPECT_EQ(kSenderSsrc, parsed.sender_ssrc()); | |
182 EXPECT_THAT(parsed.rrtrs(), ElementsAre(rrtr)); | |
183 } | |
184 | |
185 TEST_F(RtcpPacketExtendedReportsTest, CreateAndParseWithTwoRrtrBlocks) { | |
186 Rrtr rrtr1 = Rand<Rrtr>(); | |
187 Rrtr rrtr2 = Rand<Rrtr>(); | |
188 ExtendedReports xr; | |
189 xr.SetSenderSsrc(kSenderSsrc); | |
190 EXPECT_TRUE(xr.AddRrtr(rrtr1)); | |
191 EXPECT_TRUE(xr.AddRrtr(rrtr2)); | |
192 | |
193 rtc::Buffer packet = xr.Build(); | |
194 | |
195 ExtendedReports mparsed; | |
196 EXPECT_TRUE(test::ParseSinglePacket(packet, &mparsed)); | 173 EXPECT_TRUE(test::ParseSinglePacket(packet, &mparsed)); |
197 const ExtendedReports& parsed = mparsed; | 174 const ExtendedReports& parsed = mparsed; |
198 | 175 |
199 EXPECT_EQ(kSenderSsrc, parsed.sender_ssrc()); | 176 EXPECT_EQ(kSenderSsrc, parsed.sender_ssrc()); |
200 EXPECT_THAT(parsed.rrtrs(), ElementsAre(rrtr1, rrtr2)); | 177 EXPECT_EQ(kRrtr, parsed.rrtr()); |
201 } | 178 } |
202 | 179 |
203 TEST_F(RtcpPacketExtendedReportsTest, CreateAndParseWithDlrrWithOneSubBlock) { | 180 TEST_F(RtcpPacketExtendedReportsTest, CreateAndParseWithDlrrWithOneSubBlock) { |
204 Dlrr dlrr; | 181 const ReceiveTimeInfo kTimeInfo = Rand<ReceiveTimeInfo>(); |
205 EXPECT_TRUE(dlrr.AddDlrrItem(Rand<ReceiveTimeInfo>())); | |
206 ExtendedReports xr; | 182 ExtendedReports xr; |
207 xr.SetSenderSsrc(kSenderSsrc); | 183 xr.SetSenderSsrc(kSenderSsrc); |
208 EXPECT_TRUE(xr.AddDlrr(dlrr)); | 184 xr.AddDlrrItem(kTimeInfo); |
209 | 185 |
210 rtc::Buffer packet = xr.Build(); | 186 rtc::Buffer packet = xr.Build(); |
211 | 187 |
212 ExtendedReports mparsed; | 188 ExtendedReports mparsed; |
213 EXPECT_TRUE(test::ParseSinglePacket(packet, &mparsed)); | 189 EXPECT_TRUE(test::ParseSinglePacket(packet, &mparsed)); |
214 const ExtendedReports& parsed = mparsed; | 190 const ExtendedReports& parsed = mparsed; |
215 | 191 |
216 EXPECT_EQ(kSenderSsrc, parsed.sender_ssrc()); | 192 EXPECT_EQ(kSenderSsrc, parsed.sender_ssrc()); |
217 EXPECT_THAT(parsed.dlrrs(), ElementsAre(dlrr)); | 193 EXPECT_THAT(parsed.dlrr().sub_blocks(), ElementsAre(kTimeInfo)); |
218 } | 194 } |
219 | 195 |
220 TEST_F(RtcpPacketExtendedReportsTest, CreateAndParseWithDlrrWithTwoSubBlocks) { | 196 TEST_F(RtcpPacketExtendedReportsTest, CreateAndParseWithDlrrWithTwoSubBlocks) { |
221 Dlrr dlrr; | 197 const ReceiveTimeInfo kTimeInfo1 = Rand<ReceiveTimeInfo>(); |
222 EXPECT_TRUE(dlrr.AddDlrrItem(Rand<ReceiveTimeInfo>())); | 198 const ReceiveTimeInfo kTimeInfo2 = Rand<ReceiveTimeInfo>(); |
223 EXPECT_TRUE(dlrr.AddDlrrItem(Rand<ReceiveTimeInfo>())); | |
224 ExtendedReports xr; | 199 ExtendedReports xr; |
225 xr.SetSenderSsrc(kSenderSsrc); | 200 xr.SetSenderSsrc(kSenderSsrc); |
226 EXPECT_TRUE(xr.AddDlrr(dlrr)); | 201 xr.AddDlrrItem(kTimeInfo1); |
| 202 xr.AddDlrrItem(kTimeInfo2); |
227 | 203 |
228 rtc::Buffer packet = xr.Build(); | 204 rtc::Buffer packet = xr.Build(); |
229 | 205 |
230 ExtendedReports mparsed; | 206 ExtendedReports mparsed; |
231 EXPECT_TRUE(test::ParseSinglePacket(packet, &mparsed)); | 207 EXPECT_TRUE(test::ParseSinglePacket(packet, &mparsed)); |
232 const ExtendedReports& parsed = mparsed; | 208 const ExtendedReports& parsed = mparsed; |
233 | 209 |
234 EXPECT_EQ(kSenderSsrc, parsed.sender_ssrc()); | 210 EXPECT_EQ(kSenderSsrc, parsed.sender_ssrc()); |
235 EXPECT_THAT(parsed.dlrrs(), ElementsAre(dlrr)); | 211 EXPECT_THAT(parsed.dlrr().sub_blocks(), ElementsAre(kTimeInfo1, kTimeInfo2)); |
236 } | 212 } |
237 | 213 |
238 TEST_F(RtcpPacketExtendedReportsTest, CreateAndParseWithTwoDlrrBlocks) { | 214 TEST_F(RtcpPacketExtendedReportsTest, CreateAndParseWithVoipMetric) { |
239 Dlrr dlrr1; | 215 const VoipMetric kVoipMetric = Rand<VoipMetric>(); |
240 EXPECT_TRUE(dlrr1.AddDlrrItem(Rand<ReceiveTimeInfo>())); | 216 |
241 Dlrr dlrr2; | |
242 EXPECT_TRUE(dlrr2.AddDlrrItem(Rand<ReceiveTimeInfo>())); | |
243 ExtendedReports xr; | 217 ExtendedReports xr; |
244 xr.SetSenderSsrc(kSenderSsrc); | 218 xr.SetSenderSsrc(kSenderSsrc); |
245 EXPECT_TRUE(xr.AddDlrr(dlrr1)); | 219 xr.SetVoipMetric(kVoipMetric); |
246 EXPECT_TRUE(xr.AddDlrr(dlrr2)); | |
247 | 220 |
248 rtc::Buffer packet = xr.Build(); | 221 rtc::Buffer packet = xr.Build(); |
249 | 222 |
250 ExtendedReports mparsed; | |
251 EXPECT_TRUE(test::ParseSinglePacket(packet, &mparsed)); | |
252 const ExtendedReports& parsed = mparsed; | |
253 | |
254 EXPECT_EQ(kSenderSsrc, parsed.sender_ssrc()); | |
255 EXPECT_THAT(parsed.dlrrs(), ElementsAre(dlrr1, dlrr2)); | |
256 } | |
257 | |
258 TEST_F(RtcpPacketExtendedReportsTest, CreateAndParseWithVoipMetric) { | |
259 VoipMetric voip_metric = Rand<VoipMetric>(); | |
260 | |
261 ExtendedReports xr; | |
262 xr.SetSenderSsrc(kSenderSsrc); | |
263 EXPECT_TRUE(xr.AddVoipMetric(voip_metric)); | |
264 | |
265 rtc::Buffer packet = xr.Build(); | |
266 | |
267 ExtendedReports mparsed; | 223 ExtendedReports mparsed; |
268 EXPECT_TRUE(test::ParseSinglePacket(packet, &mparsed)); | 224 EXPECT_TRUE(test::ParseSinglePacket(packet, &mparsed)); |
269 const ExtendedReports& parsed = mparsed; | 225 const ExtendedReports& parsed = mparsed; |
270 | 226 |
271 EXPECT_EQ(kSenderSsrc, parsed.sender_ssrc()); | 227 EXPECT_EQ(kSenderSsrc, parsed.sender_ssrc()); |
272 EXPECT_THAT(parsed.voip_metrics(), ElementsAre(voip_metric)); | 228 EXPECT_EQ(kVoipMetric, parsed.voip_metric()); |
273 } | 229 } |
274 | 230 |
275 TEST_F(RtcpPacketExtendedReportsTest, CreateAndParseWithMultipleReportBlocks) { | 231 TEST_F(RtcpPacketExtendedReportsTest, CreateAndParseWithMultipleReportBlocks) { |
276 Rrtr rrtr = Rand<Rrtr>(); | 232 const Rrtr kRrtr = Rand<Rrtr>(); |
277 Dlrr dlrr; | 233 const ReceiveTimeInfo kTimeInfo = Rand<ReceiveTimeInfo>(); |
278 EXPECT_TRUE(dlrr.AddDlrrItem(Rand<ReceiveTimeInfo>())); | 234 const VoipMetric kVoipMetric = Rand<VoipMetric>(); |
279 VoipMetric metric = Rand<VoipMetric>(); | 235 |
280 ExtendedReports xr; | 236 ExtendedReports xr; |
281 xr.SetSenderSsrc(kSenderSsrc); | 237 xr.SetSenderSsrc(kSenderSsrc); |
282 EXPECT_TRUE(xr.AddRrtr(rrtr)); | 238 xr.SetRrtr(kRrtr); |
283 EXPECT_TRUE(xr.AddDlrr(dlrr)); | 239 xr.AddDlrrItem(kTimeInfo); |
284 EXPECT_TRUE(xr.AddVoipMetric(metric)); | 240 xr.SetVoipMetric(kVoipMetric); |
285 | 241 |
286 rtc::Buffer packet = xr.Build(); | 242 rtc::Buffer packet = xr.Build(); |
287 | 243 |
288 ExtendedReports mparsed; | |
289 EXPECT_TRUE(test::ParseSinglePacket(packet, &mparsed)); | |
290 const ExtendedReports& parsed = mparsed; | |
291 | |
292 EXPECT_EQ(kSenderSsrc, parsed.sender_ssrc()); | |
293 EXPECT_THAT(parsed.rrtrs(), ElementsAre(rrtr)); | |
294 EXPECT_THAT(parsed.dlrrs(), ElementsAre(dlrr)); | |
295 EXPECT_THAT(parsed.voip_metrics(), ElementsAre(metric)); | |
296 } | |
297 | |
298 TEST_F(RtcpPacketExtendedReportsTest, DlrrWithoutItemNotIncludedInPacket) { | |
299 Rrtr rrtr = Rand<Rrtr>(); | |
300 Dlrr dlrr; | |
301 VoipMetric metric = Rand<VoipMetric>(); | |
302 ExtendedReports xr; | |
303 xr.SetSenderSsrc(kSenderSsrc); | |
304 EXPECT_TRUE(xr.AddRrtr(rrtr)); | |
305 EXPECT_TRUE(xr.AddDlrr(dlrr)); | |
306 EXPECT_TRUE(xr.AddVoipMetric(metric)); | |
307 | |
308 rtc::Buffer packet = xr.Build(); | |
309 | |
310 ExtendedReports mparsed; | 244 ExtendedReports mparsed; |
311 EXPECT_TRUE(test::ParseSinglePacket(packet, &mparsed)); | 245 EXPECT_TRUE(test::ParseSinglePacket(packet, &mparsed)); |
312 const ExtendedReports& parsed = mparsed; | 246 const ExtendedReports& parsed = mparsed; |
313 | 247 |
314 EXPECT_THAT(parsed.rrtrs(), ElementsAre(rrtr)); | 248 EXPECT_EQ(kSenderSsrc, parsed.sender_ssrc()); |
315 EXPECT_THAT(parsed.dlrrs(), IsEmpty()); | 249 EXPECT_EQ(kRrtr, parsed.rrtr()); |
316 EXPECT_THAT(parsed.voip_metrics(), ElementsAre(metric)); | 250 EXPECT_THAT(parsed.dlrr().sub_blocks(), ElementsAre(kTimeInfo)); |
| 251 EXPECT_EQ(kVoipMetric, parsed.voip_metric()); |
317 } | 252 } |
318 | 253 |
319 TEST_F(RtcpPacketExtendedReportsTest, WithTooManyBlocks) { | |
320 const size_t kMaxBlocks = 50; | |
321 ExtendedReports xr; | |
322 | |
323 Rrtr rrtr = Rand<Rrtr>(); | |
324 for (size_t i = 0; i < kMaxBlocks; ++i) | |
325 EXPECT_TRUE(xr.AddRrtr(rrtr)); | |
326 EXPECT_FALSE(xr.AddRrtr(rrtr)); | |
327 | |
328 Dlrr dlrr; | |
329 for (size_t i = 0; i < kMaxBlocks; ++i) | |
330 EXPECT_TRUE(xr.AddDlrr(dlrr)); | |
331 EXPECT_FALSE(xr.AddDlrr(dlrr)); | |
332 | |
333 VoipMetric voip_metric = Rand<VoipMetric>(); | |
334 for (size_t i = 0; i < kMaxBlocks; ++i) | |
335 EXPECT_TRUE(xr.AddVoipMetric(voip_metric)); | |
336 EXPECT_FALSE(xr.AddVoipMetric(voip_metric)); | |
337 } | |
338 } // namespace webrtc | 254 } // namespace webrtc |
OLD | NEW |