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

Side by Side Diff: webrtc/modules/rtp_rtcp/source/rtcp_packet/extended_reports_unittest.cc

Issue 2378113002: Allow max 1 block per type in RTCP Extended Reports (Closed)
Patch Set: use operator==(T, Optional<T>) for slightly cleaner tests Created 4 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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
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
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
OLDNEW
« no previous file with comments | « webrtc/modules/rtp_rtcp/source/rtcp_packet/extended_reports.cc ('k') | webrtc/modules/rtp_rtcp/source/rtcp_receiver.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698