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

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

Issue 1557593002: [rtp_rtcp] rtcp::ExtenededReports packet got Parse function (Closed) Base URL: https://chromium.googlesource.com/external/webrtc.git@master
Patch Set: rebase & fix win compile errors Created 4 years, 10 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 "testing/gmock/include/gmock/gmock.h" 13 #include "testing/gmock/include/gmock/gmock.h"
14 #include "testing/gtest/include/gtest/gtest.h" 14 #include "testing/gtest/include/gtest/gtest.h"
15 #include "webrtc/test/rtcp_packet_parser.h" 15 #include "webrtc/base/random.h"
16 16
17 using testing::ElementsAre;
18 using testing::ElementsAreArray;
19 using testing::IsEmpty;
20 using testing::make_tuple;
17 using webrtc::rtcp::Dlrr; 21 using webrtc::rtcp::Dlrr;
18 using webrtc::rtcp::ExtendedReports; 22 using webrtc::rtcp::ExtendedReports;
19 using webrtc::rtcp::RawPacket; 23 using webrtc::rtcp::RawPacket;
24 using webrtc::rtcp::ReceiveTimeInfo;
20 using webrtc::rtcp::Rrtr; 25 using webrtc::rtcp::Rrtr;
21 using webrtc::rtcp::VoipMetric; 26 using webrtc::rtcp::VoipMetric;
22 using webrtc::test::RtcpPacketParser; 27 using webrtc::RTCPUtility::RtcpCommonHeader;
28 using webrtc::RTCPUtility::RtcpParseCommonHeader;
23 29
24 namespace webrtc { 30 namespace webrtc {
31 // Define comparision operators that shouldn't be needed in production,
32 // but make testing matches more clear.
33 bool operator==(const RTCPVoIPMetric& metric1, const RTCPVoIPMetric& metric2) {
34 return metric1.lossRate == metric2.lossRate &&
35 metric1.discardRate == metric2.discardRate &&
36 metric1.burstDensity == metric2.burstDensity &&
37 metric1.gapDensity == metric2.gapDensity &&
38 metric1.burstDuration == metric2.burstDuration &&
39 metric1.gapDuration == metric2.gapDuration &&
40 metric1.roundTripDelay == metric2.roundTripDelay &&
41 metric1.endSystemDelay == metric2.endSystemDelay &&
42 metric1.signalLevel == metric2.signalLevel &&
43 metric1.noiseLevel == metric2.noiseLevel &&
44 metric1.RERL == metric2.RERL &&
45 metric1.Gmin == metric2.Gmin &&
46 metric1.Rfactor == metric2.Rfactor &&
47 metric1.extRfactor == metric2.extRfactor &&
48 metric1.MOSLQ == metric2.MOSLQ &&
49 metric1.MOSCQ == metric2.MOSCQ &&
50 metric1.RXconfig == metric2.RXconfig &&
51 metric1.JBnominal == metric2.JBnominal &&
52 metric1.JBmax == metric2.JBmax &&
53 metric1.JBabsMax == metric2.JBabsMax;
54 }
55
25 namespace rtcp { 56 namespace rtcp {
26 const uint32_t kSenderSsrc = 0x12345678; 57 bool operator==(const Rrtr& rrtr1, const Rrtr& rrtr2) {
27 const uint32_t kRemoteSsrc = 0x23456789; 58 return rrtr1.ntp() == rrtr2.ntp();
28 59 }
29 TEST(RtcpPacketExtendedReportsTest, WithNoReportBlocks) { 60
30 ExtendedReports xr; 61 bool operator==(const ReceiveTimeInfo& time1, const ReceiveTimeInfo& time2) {
31 xr.From(kSenderSsrc); 62 return time1.ssrc == time2.ssrc &&
32 63 time1.last_rr == time2.last_rr &&
33 rtc::scoped_ptr<RawPacket> packet(xr.Build()); 64 time1.delay_since_last_rr == time2.delay_since_last_rr;
34 RtcpPacketParser parser; 65 }
35 parser.Parse(packet->Buffer(), packet->Length()); 66
36 EXPECT_EQ(1, parser.xr_header()->num_packets()); 67 bool operator==(const Dlrr& dlrr1, const Dlrr& dlrr2) {
37 EXPECT_EQ(kSenderSsrc, parser.xr_header()->Ssrc()); 68 return dlrr1.sub_blocks() == dlrr2.sub_blocks();
38 } 69 }
39 70
40 TEST(RtcpPacketExtendedReportsTest, WithRrtr) { 71 bool operator==(const VoipMetric& metric1, const VoipMetric& metric2) {
72 return metric1.ssrc() == metric2.ssrc() &&
73 metric1.voip_metric() == metric2.voip_metric();
74 }
75 } // namespace rtcp
76
77 namespace {
78 const uint32_t kSenderSsrc = 0x12345678;
79 const uint8_t kEmptyPacket[8] = {0x80, 207, 0x00, 0x01,
80 0x12, 0x34, 0x56, 0x78};
81
82 bool Parse(const uint8_t* buffer,
83 size_t length,
84 ExtendedReports* packet) {
85 RtcpCommonHeader header;
86 EXPECT_TRUE(RtcpParseCommonHeader(buffer, length, &header));
87 EXPECT_EQ(length, header.BlockSize());
88 return packet->Parse(header, buffer + RtcpCommonHeader::kHeaderSizeBytes);
89 }
90
91 bool Parse(const RawPacket& buffer, ExtendedReports* packet) {
92 return Parse(buffer.Buffer(), buffer.Length(), packet);
93 }
94 } // namespace
95
96 class RtcpPacketExtendedReportsTest : public ::testing::Test {
97 public:
98 RtcpPacketExtendedReportsTest() : random_(0x123456789) {}
99
100 protected:
101 template <typename T>
102 T Rand() {
103 return random_.Rand<T>();
104 }
105
106 private:
107 Random random_;
108 };
109
110 template <>
111 ReceiveTimeInfo RtcpPacketExtendedReportsTest::Rand<ReceiveTimeInfo>() {
112 uint32_t ssrc = Rand<uint32_t>();
113 uint32_t last_rr = Rand<uint32_t>();
114 uint32_t delay_since_last_rr = Rand<uint32_t>();
115 return ReceiveTimeInfo(ssrc, last_rr, delay_since_last_rr);
116 }
117
118 template <>
119 NtpTime RtcpPacketExtendedReportsTest::Rand<NtpTime>() {
120 uint32_t secs = Rand<uint32_t>();
121 uint32_t frac = Rand<uint32_t>();
122 return NtpTime(secs, frac);
123 }
124
125 template <>
126 Rrtr RtcpPacketExtendedReportsTest::Rand<Rrtr>() {
41 Rrtr rrtr; 127 Rrtr rrtr;
42 rrtr.WithNtp(NtpTime(0x11111111, 0x22222222)); 128 rrtr.WithNtp(Rand<NtpTime>());
43 ExtendedReports xr; 129 return rrtr;
44 xr.From(kSenderSsrc); 130 }
45 EXPECT_TRUE(xr.WithRrtr(&rrtr)); 131
46 132 template <>
47 rtc::scoped_ptr<RawPacket> packet(xr.Build()); 133 RTCPVoIPMetric RtcpPacketExtendedReportsTest::Rand<RTCPVoIPMetric>() {
48 RtcpPacketParser parser; 134 RTCPVoIPMetric metric;
49 parser.Parse(packet->Buffer(), packet->Length()); 135 metric.lossRate = Rand<uint8_t>();
50 EXPECT_EQ(1, parser.xr_header()->num_packets()); 136 metric.discardRate = Rand<uint8_t>();
51 EXPECT_EQ(kSenderSsrc, parser.xr_header()->Ssrc()); 137 metric.burstDensity = Rand<uint8_t>();
52 EXPECT_EQ(1, parser.rrtr()->num_packets()); 138 metric.gapDensity = Rand<uint8_t>();
53 EXPECT_EQ(0x11111111U, parser.rrtr()->NtpSec()); 139 metric.burstDuration = Rand<uint16_t>();
54 EXPECT_EQ(0x22222222U, parser.rrtr()->NtpFrac()); 140 metric.gapDuration = Rand<uint16_t>();
55 } 141 metric.roundTripDelay = Rand<uint16_t>();
56 142 metric.endSystemDelay = Rand<uint16_t>();
57 TEST(RtcpPacketExtendedReportsTest, WithTwoRrtrBlocks) { 143 metric.signalLevel = Rand<uint8_t>();
58 Rrtr rrtr1; 144 metric.noiseLevel = Rand<uint8_t>();
59 rrtr1.WithNtp(NtpTime(0x11111111, 0x22222222)); 145 metric.RERL = Rand<uint8_t>();
60 Rrtr rrtr2; 146 metric.Gmin = Rand<uint8_t>();
61 rrtr2.WithNtp(NtpTime(0x33333333, 0x44444444)); 147 metric.Rfactor = Rand<uint8_t>();
62 ExtendedReports xr; 148 metric.extRfactor = Rand<uint8_t>();
63 xr.From(kSenderSsrc); 149 metric.MOSLQ = Rand<uint8_t>();
64 EXPECT_TRUE(xr.WithRrtr(&rrtr1)); 150 metric.MOSCQ = Rand<uint8_t>();
65 EXPECT_TRUE(xr.WithRrtr(&rrtr2)); 151 metric.RXconfig = Rand<uint8_t>();
66 152 metric.JBnominal = Rand<uint16_t>();
67 rtc::scoped_ptr<RawPacket> packet(xr.Build()); 153 metric.JBmax = Rand<uint16_t>();
68 RtcpPacketParser parser; 154 metric.JBabsMax = Rand<uint16_t>();
69 parser.Parse(packet->Buffer(), packet->Length()); 155 return metric;
70 EXPECT_EQ(1, parser.xr_header()->num_packets()); 156 }
71 EXPECT_EQ(kSenderSsrc, parser.xr_header()->Ssrc()); 157
72 EXPECT_EQ(2, parser.rrtr()->num_packets()); 158 template <>
73 EXPECT_EQ(0x33333333U, parser.rrtr()->NtpSec()); 159 VoipMetric RtcpPacketExtendedReportsTest::Rand<VoipMetric>() {
74 EXPECT_EQ(0x44444444U, parser.rrtr()->NtpFrac()); 160 VoipMetric voip_metric;
75 } 161 voip_metric.To(Rand<uint32_t>());
76 162 voip_metric.WithVoipMetric(Rand<RTCPVoIPMetric>());
77 TEST(RtcpPacketExtendedReportsTest, WithDlrrWithOneSubBlock) { 163 return voip_metric;
78 Dlrr dlrr; 164 }
79 EXPECT_TRUE(dlrr.WithDlrrItem(0x11111111, 0x22222222, 0x33333333)); 165
80 ExtendedReports xr; 166 TEST_F(RtcpPacketExtendedReportsTest, CreateWithoutReportBlocks) {
81 xr.From(kSenderSsrc); 167 ExtendedReports xr;
82 EXPECT_TRUE(xr.WithDlrr(&dlrr)); 168 xr.From(kSenderSsrc);
83 169
84 rtc::scoped_ptr<RawPacket> packet(xr.Build()); 170 rtc::scoped_ptr<RawPacket> packet = xr.Build();
85 RtcpPacketParser parser; 171
86 parser.Parse(packet->Buffer(), packet->Length()); 172 EXPECT_THAT(make_tuple(packet->Buffer(), packet->Length()),
87 EXPECT_EQ(1, parser.xr_header()->num_packets()); 173 ElementsAreArray(kEmptyPacket));
88 EXPECT_EQ(kSenderSsrc, parser.xr_header()->Ssrc()); 174 }
89 EXPECT_EQ(1, parser.dlrr()->num_packets()); 175
90 EXPECT_EQ(1, parser.dlrr_items()->num_packets()); 176 TEST_F(RtcpPacketExtendedReportsTest, ParseWithoutReportBlocks) {
91 EXPECT_EQ(0x11111111U, parser.dlrr_items()->Ssrc(0)); 177 ExtendedReports parsed;
92 EXPECT_EQ(0x22222222U, parser.dlrr_items()->LastRr(0)); 178 EXPECT_TRUE(Parse(kEmptyPacket, sizeof(kEmptyPacket), &parsed));
93 EXPECT_EQ(0x33333333U, parser.dlrr_items()->DelayLastRr(0)); 179 EXPECT_EQ(kSenderSsrc, parsed.sender_ssrc());
94 } 180 EXPECT_THAT(parsed.rrtrs(), IsEmpty());
95 181 EXPECT_THAT(parsed.dlrrs(), IsEmpty());
96 TEST(RtcpPacketExtendedReportsTest, WithDlrrWithTwoSubBlocks) { 182 EXPECT_THAT(parsed.voip_metrics(), IsEmpty());
97 Dlrr dlrr; 183 }
98 EXPECT_TRUE(dlrr.WithDlrrItem(0x11111111, 0x22222222, 0x33333333)); 184
99 EXPECT_TRUE(dlrr.WithDlrrItem(0x44444444, 0x55555555, 0x66666666)); 185 TEST_F(RtcpPacketExtendedReportsTest, CreateAndParseWithOneRrtrBlock) {
100 ExtendedReports xr; 186 Rrtr rrtr = Rand<Rrtr>();
101 xr.From(kSenderSsrc); 187 ExtendedReports xr;
102 EXPECT_TRUE(xr.WithDlrr(&dlrr)); 188 xr.From(kSenderSsrc);
103 189 EXPECT_TRUE(xr.WithRrtr(rrtr));
104 rtc::scoped_ptr<RawPacket> packet(xr.Build()); 190 rtc::scoped_ptr<RawPacket> packet = xr.Build();
105 RtcpPacketParser parser; 191
106 parser.Parse(packet->Buffer(), packet->Length()); 192 ExtendedReports mparsed;
107 EXPECT_EQ(1, parser.xr_header()->num_packets()); 193 EXPECT_TRUE(Parse(*packet, &mparsed));
108 EXPECT_EQ(kSenderSsrc, parser.xr_header()->Ssrc()); 194 const ExtendedReports& parsed = mparsed;
109 EXPECT_EQ(1, parser.dlrr()->num_packets()); 195
110 EXPECT_EQ(2, parser.dlrr_items()->num_packets()); 196 EXPECT_EQ(kSenderSsrc, parsed.sender_ssrc());
111 EXPECT_EQ(0x11111111U, parser.dlrr_items()->Ssrc(0)); 197 EXPECT_THAT(parsed.rrtrs(), ElementsAre(rrtr));
112 EXPECT_EQ(0x22222222U, parser.dlrr_items()->LastRr(0)); 198 }
113 EXPECT_EQ(0x33333333U, parser.dlrr_items()->DelayLastRr(0)); 199
114 EXPECT_EQ(0x44444444U, parser.dlrr_items()->Ssrc(1)); 200 TEST_F(RtcpPacketExtendedReportsTest, CreateAndParseWithTwoRrtrBlocks) {
115 EXPECT_EQ(0x55555555U, parser.dlrr_items()->LastRr(1)); 201 Rrtr rrtr1 = Rand<Rrtr>();
116 EXPECT_EQ(0x66666666U, parser.dlrr_items()->DelayLastRr(1)); 202 Rrtr rrtr2 = Rand<Rrtr>();
117 } 203 ExtendedReports xr;
118 204 xr.From(kSenderSsrc);
119 TEST(RtcpPacketExtendedReportsTest, WithTwoDlrrBlocks) { 205 EXPECT_TRUE(xr.WithRrtr(rrtr1));
206 EXPECT_TRUE(xr.WithRrtr(rrtr2));
207
208 rtc::scoped_ptr<RawPacket> packet = xr.Build();
209
210 ExtendedReports mparsed;
211 EXPECT_TRUE(Parse(*packet, &mparsed));
212 const ExtendedReports& parsed = mparsed;
213
214 EXPECT_EQ(kSenderSsrc, parsed.sender_ssrc());
215 EXPECT_THAT(parsed.rrtrs(), ElementsAre(rrtr1, rrtr2));
216 }
217
218 TEST_F(RtcpPacketExtendedReportsTest, CreateAndParseWithDlrrWithOneSubBlock) {
219 Dlrr dlrr;
220 EXPECT_TRUE(dlrr.WithDlrrItem(Rand<ReceiveTimeInfo>()));
221 ExtendedReports xr;
222 xr.From(kSenderSsrc);
223 EXPECT_TRUE(xr.WithDlrr(dlrr));
224
225 rtc::scoped_ptr<RawPacket> packet = xr.Build();
226
227 ExtendedReports mparsed;
228 EXPECT_TRUE(Parse(*packet, &mparsed));
229 const ExtendedReports& parsed = mparsed;
230
231 EXPECT_EQ(kSenderSsrc, parsed.sender_ssrc());
232 EXPECT_THAT(parsed.dlrrs(), ElementsAre(dlrr));
233 }
234
235 TEST_F(RtcpPacketExtendedReportsTest, CreateAndParseWithDlrrWithTwoSubBlocks) {
236 Dlrr dlrr;
237 EXPECT_TRUE(dlrr.WithDlrrItem(Rand<ReceiveTimeInfo>()));
238 EXPECT_TRUE(dlrr.WithDlrrItem(Rand<ReceiveTimeInfo>()));
239 ExtendedReports xr;
240 xr.From(kSenderSsrc);
241 EXPECT_TRUE(xr.WithDlrr(dlrr));
242
243 rtc::scoped_ptr<RawPacket> packet = xr.Build();
244
245 ExtendedReports mparsed;
246 EXPECT_TRUE(Parse(*packet, &mparsed));
247 const ExtendedReports& parsed = mparsed;
248
249 EXPECT_EQ(kSenderSsrc, parsed.sender_ssrc());
250 EXPECT_THAT(parsed.dlrrs(), ElementsAre(dlrr));
251 }
252
253 TEST_F(RtcpPacketExtendedReportsTest, CreateAndParseWithTwoDlrrBlocks) {
120 Dlrr dlrr1; 254 Dlrr dlrr1;
121 EXPECT_TRUE(dlrr1.WithDlrrItem(0x11111111, 0x22222222, 0x33333333)); 255 EXPECT_TRUE(dlrr1.WithDlrrItem(Rand<ReceiveTimeInfo>()));
122 Dlrr dlrr2; 256 Dlrr dlrr2;
123 EXPECT_TRUE(dlrr2.WithDlrrItem(0x44444444, 0x55555555, 0x66666666)); 257 EXPECT_TRUE(dlrr2.WithDlrrItem(Rand<ReceiveTimeInfo>()));
124 ExtendedReports xr; 258 ExtendedReports xr;
125 xr.From(kSenderSsrc); 259 xr.From(kSenderSsrc);
126 EXPECT_TRUE(xr.WithDlrr(&dlrr1)); 260 EXPECT_TRUE(xr.WithDlrr(dlrr1));
127 EXPECT_TRUE(xr.WithDlrr(&dlrr2)); 261 EXPECT_TRUE(xr.WithDlrr(dlrr2));
128 262
129 rtc::scoped_ptr<RawPacket> packet(xr.Build()); 263 rtc::scoped_ptr<RawPacket> packet = xr.Build();
130 RtcpPacketParser parser; 264
131 parser.Parse(packet->Buffer(), packet->Length()); 265 ExtendedReports mparsed;
132 EXPECT_EQ(1, parser.xr_header()->num_packets()); 266 EXPECT_TRUE(Parse(*packet, &mparsed));
133 EXPECT_EQ(kSenderSsrc, parser.xr_header()->Ssrc()); 267 const ExtendedReports& parsed = mparsed;
134 EXPECT_EQ(2, parser.dlrr()->num_packets()); 268
135 EXPECT_EQ(2, parser.dlrr_items()->num_packets()); 269 EXPECT_EQ(kSenderSsrc, parsed.sender_ssrc());
136 EXPECT_EQ(0x11111111U, parser.dlrr_items()->Ssrc(0)); 270 EXPECT_THAT(parsed.dlrrs(), ElementsAre(dlrr1, dlrr2));
137 EXPECT_EQ(0x22222222U, parser.dlrr_items()->LastRr(0)); 271 }
138 EXPECT_EQ(0x33333333U, parser.dlrr_items()->DelayLastRr(0)); 272
139 EXPECT_EQ(0x44444444U, parser.dlrr_items()->Ssrc(1)); 273 TEST_F(RtcpPacketExtendedReportsTest, CreateAndParseWithVoipMetric) {
140 EXPECT_EQ(0x55555555U, parser.dlrr_items()->LastRr(1)); 274 VoipMetric voip_metric = Rand<VoipMetric>();
141 EXPECT_EQ(0x66666666U, parser.dlrr_items()->DelayLastRr(1)); 275
142 } 276 ExtendedReports xr;
143 277 xr.From(kSenderSsrc);
144 TEST(RtcpPacketExtendedReportsTest, WithVoipMetric) { 278 EXPECT_TRUE(xr.WithVoipMetric(voip_metric));
145 RTCPVoIPMetric metric; 279
146 metric.lossRate = 1; 280 rtc::scoped_ptr<RawPacket> packet = xr.Build();
147 metric.discardRate = 2; 281
148 metric.burstDensity = 3; 282 ExtendedReports mparsed;
149 metric.gapDensity = 4; 283 EXPECT_TRUE(Parse(*packet, &mparsed));
150 metric.burstDuration = 0x1111; 284 const ExtendedReports& parsed = mparsed;
151 metric.gapDuration = 0x2222; 285
152 metric.roundTripDelay = 0x3333; 286 EXPECT_EQ(kSenderSsrc, parsed.sender_ssrc());
153 metric.endSystemDelay = 0x4444; 287 EXPECT_THAT(parsed.voip_metrics(), ElementsAre(voip_metric));
154 metric.signalLevel = 5; 288 }
155 metric.noiseLevel = 6; 289
156 metric.RERL = 7; 290 TEST_F(RtcpPacketExtendedReportsTest, CreateAndParseWithMultipleReportBlocks) {
157 metric.Gmin = 8; 291 Rrtr rrtr = Rand<Rrtr>();
158 metric.Rfactor = 9; 292 Dlrr dlrr;
159 metric.extRfactor = 10; 293 EXPECT_TRUE(dlrr.WithDlrrItem(Rand<ReceiveTimeInfo>()));
160 metric.MOSLQ = 11; 294 VoipMetric metric = Rand<VoipMetric>();
161 metric.MOSCQ = 12; 295 ExtendedReports xr;
162 metric.RXconfig = 13; 296 xr.From(kSenderSsrc);
163 metric.JBnominal = 0x5555; 297 EXPECT_TRUE(xr.WithRrtr(rrtr));
164 metric.JBmax = 0x6666; 298 EXPECT_TRUE(xr.WithDlrr(dlrr));
165 metric.JBabsMax = 0x7777; 299 EXPECT_TRUE(xr.WithVoipMetric(metric));
166 VoipMetric metric_block; 300
167 metric_block.To(kRemoteSsrc); 301 rtc::scoped_ptr<RawPacket> packet = xr.Build();
168 metric_block.WithVoipMetric(metric); 302
169 ExtendedReports xr; 303 ExtendedReports mparsed;
170 xr.From(kSenderSsrc); 304 EXPECT_TRUE(Parse(*packet, &mparsed));
171 EXPECT_TRUE(xr.WithVoipMetric(&metric_block)); 305 const ExtendedReports& parsed = mparsed;
172 306
173 rtc::scoped_ptr<RawPacket> packet(xr.Build()); 307 EXPECT_EQ(kSenderSsrc, parsed.sender_ssrc());
174 RtcpPacketParser parser; 308 EXPECT_THAT(parsed.rrtrs(), ElementsAre(rrtr));
175 parser.Parse(packet->Buffer(), packet->Length()); 309 EXPECT_THAT(parsed.dlrrs(), ElementsAre(dlrr));
176 EXPECT_EQ(1, parser.xr_header()->num_packets()); 310 EXPECT_THAT(parsed.voip_metrics(), ElementsAre(metric));
177 EXPECT_EQ(kSenderSsrc, parser.xr_header()->Ssrc()); 311 }
178 EXPECT_EQ(1, parser.voip_metric()->num_packets()); 312
179 EXPECT_EQ(kRemoteSsrc, parser.voip_metric()->Ssrc()); 313 TEST_F(RtcpPacketExtendedReportsTest, DlrrWithoutItemNotIncludedInPacket) {
180 EXPECT_EQ(1, parser.voip_metric()->LossRate()); 314 Rrtr rrtr = Rand<Rrtr>();
181 EXPECT_EQ(2, parser.voip_metric()->DiscardRate()); 315 Dlrr dlrr;
182 EXPECT_EQ(3, parser.voip_metric()->BurstDensity()); 316 VoipMetric metric = Rand<VoipMetric>();
183 EXPECT_EQ(4, parser.voip_metric()->GapDensity()); 317 ExtendedReports xr;
184 EXPECT_EQ(0x1111, parser.voip_metric()->BurstDuration()); 318 xr.From(kSenderSsrc);
185 EXPECT_EQ(0x2222, parser.voip_metric()->GapDuration()); 319 EXPECT_TRUE(xr.WithRrtr(rrtr));
186 EXPECT_EQ(0x3333, parser.voip_metric()->RoundTripDelay()); 320 EXPECT_TRUE(xr.WithDlrr(dlrr));
187 EXPECT_EQ(0x4444, parser.voip_metric()->EndSystemDelay()); 321 EXPECT_TRUE(xr.WithVoipMetric(metric));
188 EXPECT_EQ(5, parser.voip_metric()->SignalLevel()); 322
189 EXPECT_EQ(6, parser.voip_metric()->NoiseLevel()); 323 rtc::scoped_ptr<RawPacket> packet = xr.Build();
190 EXPECT_EQ(7, parser.voip_metric()->Rerl()); 324
191 EXPECT_EQ(8, parser.voip_metric()->Gmin()); 325 ExtendedReports mparsed;
192 EXPECT_EQ(9, parser.voip_metric()->Rfactor()); 326 EXPECT_TRUE(Parse(*packet, &mparsed));
193 EXPECT_EQ(10, parser.voip_metric()->ExtRfactor()); 327 const ExtendedReports& parsed = mparsed;
194 EXPECT_EQ(11, parser.voip_metric()->MosLq()); 328
195 EXPECT_EQ(12, parser.voip_metric()->MosCq()); 329 EXPECT_THAT(parsed.rrtrs(), ElementsAre(rrtr));
196 EXPECT_EQ(13, parser.voip_metric()->RxConfig()); 330 EXPECT_THAT(parsed.dlrrs(), IsEmpty());
197 EXPECT_EQ(0x5555, parser.voip_metric()->JbNominal()); 331 EXPECT_THAT(parsed.voip_metrics(), ElementsAre(metric));
198 EXPECT_EQ(0x6666, parser.voip_metric()->JbMax()); 332 }
199 EXPECT_EQ(0x7777, parser.voip_metric()->JbAbsMax()); 333
200 } 334 TEST_F(RtcpPacketExtendedReportsTest, WithTooManyBlocks) {
201 335 const size_t kMaxBlocks = 50;
202 TEST(RtcpPacketExtendedReportsTest, WithMultipleReportBlocks) { 336 ExtendedReports xr;
203 Rrtr rrtr; 337
204 Dlrr dlrr; 338 Rrtr rrtr = Rand<Rrtr>();
205 EXPECT_TRUE(dlrr.WithDlrrItem(1, 2, 3)); 339 for (size_t i = 0; i < kMaxBlocks; ++i)
206 VoipMetric metric; 340 EXPECT_TRUE(xr.WithRrtr(rrtr));
207 ExtendedReports xr; 341 EXPECT_FALSE(xr.WithRrtr(rrtr));
208 xr.From(kSenderSsrc); 342
209 EXPECT_TRUE(xr.WithRrtr(&rrtr)); 343 Dlrr dlrr;
210 EXPECT_TRUE(xr.WithDlrr(&dlrr)); 344 for (size_t i = 0; i < kMaxBlocks; ++i)
211 EXPECT_TRUE(xr.WithVoipMetric(&metric)); 345 EXPECT_TRUE(xr.WithDlrr(dlrr));
212 346 EXPECT_FALSE(xr.WithDlrr(dlrr));
213 rtc::scoped_ptr<RawPacket> packet(xr.Build()); 347
214 RtcpPacketParser parser; 348 VoipMetric voip_metric = Rand<VoipMetric>();
215 parser.Parse(packet->Buffer(), packet->Length()); 349 for (size_t i = 0; i < kMaxBlocks; ++i)
216 EXPECT_EQ(1, parser.xr_header()->num_packets()); 350 EXPECT_TRUE(xr.WithVoipMetric(voip_metric));
217 EXPECT_EQ(kSenderSsrc, parser.xr_header()->Ssrc()); 351 EXPECT_FALSE(xr.WithVoipMetric(voip_metric));
218 EXPECT_EQ(1, parser.rrtr()->num_packets()); 352 }
219 EXPECT_EQ(1, parser.dlrr()->num_packets());
220 EXPECT_EQ(1, parser.dlrr_items()->num_packets());
221 EXPECT_EQ(1, parser.voip_metric()->num_packets());
222 }
223
224 TEST(RtcpPacketExtendedReportsTest, DlrrWithoutItemNotIncludedInPacket) {
225 Rrtr rrtr;
226 Dlrr dlrr;
227 VoipMetric metric;
228 ExtendedReports xr;
229 xr.From(kSenderSsrc);
230 EXPECT_TRUE(xr.WithRrtr(&rrtr));
231 EXPECT_TRUE(xr.WithDlrr(&dlrr));
232 EXPECT_TRUE(xr.WithVoipMetric(&metric));
233
234 rtc::scoped_ptr<RawPacket> packet(xr.Build());
235 RtcpPacketParser parser;
236 parser.Parse(packet->Buffer(), packet->Length());
237 EXPECT_EQ(1, parser.xr_header()->num_packets());
238 EXPECT_EQ(kSenderSsrc, parser.xr_header()->Ssrc());
239 EXPECT_EQ(1, parser.rrtr()->num_packets());
240 EXPECT_EQ(0, parser.dlrr()->num_packets());
241 EXPECT_EQ(1, parser.voip_metric()->num_packets());
242 }
243
244 TEST(RtcpPacketExtendedReportsTest, WithTooManyBlocks) {
245 const int kMaxBlocks = 50;
246 ExtendedReports xr;
247
248 Rrtr rrtr;
249 for (int i = 0; i < kMaxBlocks; ++i)
250 EXPECT_TRUE(xr.WithRrtr(&rrtr));
251 EXPECT_FALSE(xr.WithRrtr(&rrtr));
252
253 Dlrr dlrr;
254 for (int i = 0; i < kMaxBlocks; ++i)
255 EXPECT_TRUE(xr.WithDlrr(&dlrr));
256 EXPECT_FALSE(xr.WithDlrr(&dlrr));
257
258 VoipMetric voip_metric;
259 for (int i = 0; i < kMaxBlocks; ++i)
260 EXPECT_TRUE(xr.WithVoipMetric(&voip_metric));
261 EXPECT_FALSE(xr.WithVoipMetric(&voip_metric));
262 }
263 } // namespace rtcp
264 } // namespace webrtc 353 } // namespace webrtc
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698