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