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