OLD | NEW |
1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include <stdint.h> | 5 #include <stdint.h> |
6 | 6 |
7 #include "base/macros.h" | 7 #include "base/macros.h" |
8 #include "base/memory/scoped_ptr.h" | 8 #include "base/memory/scoped_ptr.h" |
9 #include "base/test/simple_test_tick_clock.h" | 9 #include "base/test/simple_test_tick_clock.h" |
10 #include "media/cast/cast_environment.h" | 10 #include "media/cast/cast_environment.h" |
11 #include "media/cast/net/cast_transport_defines.h" | 11 #include "media/cast/net/cast_transport_defines.h" |
12 #include "media/cast/net/rtcp/rtcp_utility.h" | 12 #include "media/cast/net/rtcp/rtcp_utility.h" |
13 #include "media/cast/net/rtcp/test_rtcp_packet_builder.h" | 13 #include "media/cast/net/rtcp/test_rtcp_packet_builder.h" |
14 #include "media/cast/test/fake_single_thread_task_runner.h" | 14 #include "media/cast/test/fake_single_thread_task_runner.h" |
15 #include "testing/gtest/include/gtest/gtest.h" | 15 #include "testing/gtest/include/gtest/gtest.h" |
16 | 16 |
17 namespace media { | 17 namespace media { |
18 namespace cast { | 18 namespace cast { |
19 | 19 |
20 static const uint32_t kSenderSsrc = 0x10203; | 20 static const uint32_t kRemoteSsrc = 0x10203; |
21 static const uint32_t kSourceSsrc = 0x40506; | 21 static const uint32_t kLocalSsrc = 0x40506; |
22 static const uint32_t kUnknownSsrc = 0xDEAD; | 22 static const uint32_t kUnknownSsrc = 0xDEAD; |
23 static const base::TimeDelta kTargetDelay = | 23 static const base::TimeDelta kTargetDelay = |
24 base::TimeDelta::FromMilliseconds(100); | 24 base::TimeDelta::FromMilliseconds(100); |
25 | 25 |
26 class RtcpParserTest : public ::testing::Test { | 26 class RtcpParserTest : public ::testing::Test { |
27 protected: | 27 protected: |
28 RtcpParserTest() | 28 RtcpParserTest() |
29 : testing_clock_(new base::SimpleTestTickClock()), | 29 : testing_clock_(new base::SimpleTestTickClock()), |
30 task_runner_(new test::FakeSingleThreadTaskRunner( | 30 task_runner_(new test::FakeSingleThreadTaskRunner( |
31 testing_clock_.get())) { | 31 testing_clock_.get())) { |
(...skipping 18 matching lines...) Expand all Loading... |
50 } | 50 } |
51 | 51 |
52 void ExpectLastReport(const RtcpParser& parser) { | 52 void ExpectLastReport(const RtcpParser& parser) { |
53 EXPECT_TRUE(parser.has_last_report()); | 53 EXPECT_TRUE(parser.has_last_report()); |
54 EXPECT_EQ(kLastSr, parser.last_report()); | 54 EXPECT_EQ(kLastSr, parser.last_report()); |
55 EXPECT_EQ(kDelayLastSr, parser.delay_since_last_report()); | 55 EXPECT_EQ(kDelayLastSr, parser.delay_since_last_report()); |
56 } | 56 } |
57 | 57 |
58 void ExpectReceiverReference(const RtcpParser& parser) { | 58 void ExpectReceiverReference(const RtcpParser& parser) { |
59 EXPECT_TRUE(parser.has_receiver_reference_time_report()); | 59 EXPECT_TRUE(parser.has_receiver_reference_time_report()); |
60 EXPECT_EQ(kSenderSsrc, parser.receiver_reference_time_report().remote_ssrc); | 60 EXPECT_EQ(kRemoteSsrc, parser.receiver_reference_time_report().remote_ssrc); |
61 EXPECT_EQ(kNtpHigh, parser.receiver_reference_time_report().ntp_seconds); | 61 EXPECT_EQ(kNtpHigh, parser.receiver_reference_time_report().ntp_seconds); |
62 EXPECT_EQ(kNtpLow, parser.receiver_reference_time_report().ntp_fraction); | 62 EXPECT_EQ(kNtpLow, parser.receiver_reference_time_report().ntp_fraction); |
63 } | 63 } |
64 | 64 |
65 void ExpectCastFeedback(const RtcpParser& parser) { | 65 void ExpectCastFeedback(const RtcpParser& parser) { |
66 EXPECT_TRUE(parser.has_cast_message()); | 66 EXPECT_TRUE(parser.has_cast_message()); |
67 EXPECT_EQ(kSenderSsrc, parser.cast_message().media_ssrc); | 67 EXPECT_EQ(kRemoteSsrc, parser.cast_message().remote_ssrc); |
68 EXPECT_EQ(kAckFrameId, parser.cast_message().ack_frame_id); | 68 EXPECT_EQ(kAckFrameId, parser.cast_message().ack_frame_id); |
69 | 69 |
70 MissingFramesAndPacketsMap::const_iterator frame_it = | 70 MissingFramesAndPacketsMap::const_iterator frame_it = |
71 parser.cast_message().missing_frames_and_packets.begin(); | 71 parser.cast_message().missing_frames_and_packets.begin(); |
72 | 72 |
73 EXPECT_TRUE( | 73 EXPECT_TRUE( |
74 frame_it != parser.cast_message().missing_frames_and_packets.end()); | 74 frame_it != parser.cast_message().missing_frames_and_packets.end()); |
75 EXPECT_EQ(kLostFrameId, frame_it->first); | 75 EXPECT_EQ(kLostFrameId, frame_it->first); |
76 EXPECT_EQ(frame_it->second.size(), 1UL); | 76 EXPECT_EQ(frame_it->second.size(), 1UL); |
77 EXPECT_EQ(*frame_it->second.begin(), kRtcpCastAllPacketsLost); | 77 EXPECT_EQ(*frame_it->second.begin(), kRtcpCastAllPacketsLost); |
(...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
138 | 138 |
139 scoped_ptr<base::SimpleTestTickClock> testing_clock_; | 139 scoped_ptr<base::SimpleTestTickClock> testing_clock_; |
140 scoped_refptr<test::FakeSingleThreadTaskRunner> task_runner_; | 140 scoped_refptr<test::FakeSingleThreadTaskRunner> task_runner_; |
141 | 141 |
142 private: | 142 private: |
143 DISALLOW_COPY_AND_ASSIGN(RtcpParserTest); | 143 DISALLOW_COPY_AND_ASSIGN(RtcpParserTest); |
144 }; | 144 }; |
145 | 145 |
146 TEST_F(RtcpParserTest, BrokenPacketIsIgnored) { | 146 TEST_F(RtcpParserTest, BrokenPacketIsIgnored) { |
147 const char bad_packet[] = {0, 0, 0, 0}; | 147 const char bad_packet[] = {0, 0, 0, 0}; |
148 RtcpParser parser(kSourceSsrc, kSenderSsrc); | 148 RtcpParser parser(kLocalSsrc, kRemoteSsrc); |
149 base::BigEndianReader reader(bad_packet, sizeof(bad_packet)); | 149 base::BigEndianReader reader(bad_packet, sizeof(bad_packet)); |
150 EXPECT_FALSE(parser.Parse(&reader)); | 150 EXPECT_FALSE(parser.Parse(&reader)); |
151 } | 151 } |
152 | 152 |
153 TEST_F(RtcpParserTest, UnknownBlockIgnored) { | 153 TEST_F(RtcpParserTest, UnknownBlockIgnored) { |
154 // Only unknown data, nothing happens. | 154 // Only unknown data, nothing happens. |
155 TestRtcpPacketBuilder p; | 155 TestRtcpPacketBuilder p; |
156 p.AddUnknownBlock(); | 156 p.AddUnknownBlock(); |
157 RtcpParser parser1(kSourceSsrc, 0); | 157 RtcpParser parser1(kLocalSsrc, 0); |
158 EXPECT_TRUE(parser1.Parse(p.Reader())); | 158 EXPECT_TRUE(parser1.Parse(p.Reader())); |
159 EXPECT_FALSE(HasAnything(parser1)); | 159 EXPECT_FALSE(HasAnything(parser1)); |
160 | 160 |
161 // Add valid sender report *after* unknown data - should work fine. | 161 // Add valid sender report *after* unknown data - should work fine. |
162 p.AddSr(kSenderSsrc, 0); | 162 p.AddSr(kRemoteSsrc, 0); |
163 RtcpParser parser2(kSourceSsrc, kSenderSsrc); | 163 RtcpParser parser2(kLocalSsrc, kRemoteSsrc); |
164 EXPECT_TRUE(parser2.Parse(p.Reader())); | 164 EXPECT_TRUE(parser2.Parse(p.Reader())); |
165 ExpectSenderInfo(parser2); | 165 ExpectSenderInfo(parser2); |
166 } | 166 } |
167 | 167 |
168 TEST_F(RtcpParserTest, InjectSenderReportPacket) { | 168 TEST_F(RtcpParserTest, InjectSenderReportPacket) { |
169 TestRtcpPacketBuilder p; | 169 TestRtcpPacketBuilder p; |
170 p.AddSr(kSenderSsrc, 0); | 170 p.AddSr(kRemoteSsrc, 0); |
171 | 171 |
172 // Expected to be ignored since the sender ssrc does not match our | 172 // Expected to be ignored since the sender ssrc does not match our |
173 // remote ssrc. | 173 // remote ssrc. |
174 RtcpParser parser1(kSourceSsrc, 0); | 174 RtcpParser parser1(kLocalSsrc, 0); |
175 EXPECT_TRUE(parser1.Parse(p.Reader())); | 175 EXPECT_TRUE(parser1.Parse(p.Reader())); |
176 EXPECT_FALSE(HasAnything(parser1)); | 176 EXPECT_FALSE(HasAnything(parser1)); |
177 | 177 |
178 // Expected to be pass through since the sender ssrc match our remote ssrc. | 178 // Expected to be pass through since the sender ssrc match our remote ssrc. |
179 RtcpParser parser2(kSourceSsrc, kSenderSsrc); | 179 RtcpParser parser2(kLocalSsrc, kRemoteSsrc); |
180 EXPECT_TRUE(parser2.Parse(p.Reader())); | 180 EXPECT_TRUE(parser2.Parse(p.Reader())); |
181 ExpectSenderInfo(parser2); | 181 ExpectSenderInfo(parser2); |
182 } | 182 } |
183 | 183 |
184 TEST_F(RtcpParserTest, InjectReceiveReportPacket) { | 184 TEST_F(RtcpParserTest, InjectReceiveReportPacket) { |
185 TestRtcpPacketBuilder p1; | 185 TestRtcpPacketBuilder p1; |
186 p1.AddRr(kSenderSsrc, 1); | 186 p1.AddRr(kRemoteSsrc, 1); |
187 p1.AddRb(kUnknownSsrc); | 187 p1.AddRb(kUnknownSsrc); |
188 | 188 |
189 // Expected to be ignored since the source ssrc does not match our | 189 // Expected to be ignored since the source ssrc does not match our |
190 // local ssrc. | 190 // local ssrc. |
191 RtcpParser parser1(kSourceSsrc, kSenderSsrc); | 191 RtcpParser parser1(kLocalSsrc, kRemoteSsrc); |
192 EXPECT_TRUE(parser1.Parse(p1.Reader())); | 192 EXPECT_TRUE(parser1.Parse(p1.Reader())); |
193 EXPECT_FALSE(HasAnything(parser1)); | 193 EXPECT_FALSE(HasAnything(parser1)); |
194 | 194 |
195 TestRtcpPacketBuilder p2; | 195 TestRtcpPacketBuilder p2; |
196 p2.AddRr(kSenderSsrc, 1); | 196 p2.AddRr(kRemoteSsrc, 1); |
197 p2.AddRb(kSourceSsrc); | 197 p2.AddRb(kLocalSsrc); |
198 | 198 |
199 // Expected to be pass through since the sender ssrc match our local ssrc. | 199 // Expected to be pass through since the sender ssrc match our local ssrc. |
200 RtcpParser parser2(kSourceSsrc, kSenderSsrc); | 200 RtcpParser parser2(kLocalSsrc, kRemoteSsrc); |
201 EXPECT_TRUE(parser2.Parse(p2.Reader())); | 201 EXPECT_TRUE(parser2.Parse(p2.Reader())); |
202 ExpectLastReport(parser2); | 202 ExpectLastReport(parser2); |
203 } | 203 } |
204 | 204 |
205 TEST_F(RtcpParserTest, InjectSenderReportWithReportBlockPacket) { | 205 TEST_F(RtcpParserTest, InjectSenderReportWithReportBlockPacket) { |
206 TestRtcpPacketBuilder p1; | 206 TestRtcpPacketBuilder p1; |
207 p1.AddSr(kSenderSsrc, 1); | 207 p1.AddSr(kRemoteSsrc, 1); |
208 p1.AddRb(kUnknownSsrc); | 208 p1.AddRb(kUnknownSsrc); |
209 | 209 |
210 // Sender report expected to be ignored since the sender ssrc does not match | 210 // Sender report expected to be ignored since the sender ssrc does not match |
211 // our remote ssrc. | 211 // our remote ssrc. |
212 // Report block expected to be ignored since the source ssrc does not match | 212 // Report block expected to be ignored since the source ssrc does not match |
213 // our local ssrc. | 213 // our local ssrc. |
214 RtcpParser parser1(kSourceSsrc, 0); | 214 RtcpParser parser1(kLocalSsrc, 0); |
215 EXPECT_TRUE(parser1.Parse(p1.Reader())); | 215 EXPECT_TRUE(parser1.Parse(p1.Reader())); |
216 EXPECT_FALSE(HasAnything(parser1)); | 216 EXPECT_FALSE(HasAnything(parser1)); |
217 | 217 |
218 // Sender report expected to be pass through since the sender ssrc match our | 218 // Sender report expected to be pass through since the sender ssrc match our |
219 // remote ssrc. | 219 // remote ssrc. |
220 // Report block expected to be ignored since the source ssrc does not match | 220 // Report block expected to be ignored since the source ssrc does not match |
221 // our local ssrc. | 221 // our local ssrc. |
222 RtcpParser parser2(kSourceSsrc, kSenderSsrc); | 222 RtcpParser parser2(kLocalSsrc, kRemoteSsrc); |
223 EXPECT_TRUE(parser2.Parse(p1.Reader())); | 223 EXPECT_TRUE(parser2.Parse(p1.Reader())); |
224 ExpectSenderInfo(parser2); | 224 ExpectSenderInfo(parser2); |
225 EXPECT_FALSE(parser2.has_last_report()); | 225 EXPECT_FALSE(parser2.has_last_report()); |
226 | 226 |
227 // Sender report expected to be ignored since the sender ssrc does not match | 227 // Sender report expected to be ignored since the sender ssrc does not match |
228 // our remote ssrc. | 228 // our remote ssrc. |
229 // Report block expected to be ignored too since it's a part of the | 229 // Report block expected to be ignored too since it's a part of the |
230 // sender report. | 230 // sender report. |
231 TestRtcpPacketBuilder p2; | 231 TestRtcpPacketBuilder p2; |
232 p2.AddSr(kSenderSsrc, 1); | 232 p2.AddSr(kRemoteSsrc, 1); |
233 p2.AddRb(kSourceSsrc); | 233 p2.AddRb(kLocalSsrc); |
234 | 234 |
235 RtcpParser parser3(kSourceSsrc, 0); | 235 RtcpParser parser3(kLocalSsrc, 0); |
236 EXPECT_TRUE(parser3.Parse(p2.Reader())); | 236 EXPECT_TRUE(parser3.Parse(p2.Reader())); |
237 EXPECT_FALSE(parser3.has_last_report()); | 237 EXPECT_FALSE(parser3.has_last_report()); |
238 | 238 |
239 // Sender report expected to be pass through since the sender ssrc match our | 239 // Sender report expected to be pass through since the sender ssrc match our |
240 // remote ssrc. | 240 // remote ssrc. |
241 // Report block expected to be pass through since the sender ssrc match | 241 // Report block expected to be pass through since the sender ssrc match |
242 // our local ssrc. | 242 // our local ssrc. |
243 RtcpParser parser4(kSourceSsrc, kSenderSsrc); | 243 RtcpParser parser4(kLocalSsrc, kRemoteSsrc); |
244 EXPECT_TRUE(parser4.Parse(p2.Reader())); | 244 EXPECT_TRUE(parser4.Parse(p2.Reader())); |
245 ExpectSenderInfo(parser4); | 245 ExpectSenderInfo(parser4); |
246 ExpectLastReport(parser4); | 246 ExpectLastReport(parser4); |
247 } | 247 } |
248 | 248 |
249 TEST_F(RtcpParserTest, InjectSenderReportPacketWithDlrr) { | 249 TEST_F(RtcpParserTest, InjectSenderReportPacketWithDlrr) { |
250 TestRtcpPacketBuilder p; | 250 TestRtcpPacketBuilder p; |
251 p.AddSr(kSenderSsrc, 0); | 251 p.AddSr(kRemoteSsrc, 0); |
252 p.AddXrHeader(kSenderSsrc); | 252 p.AddXrHeader(kRemoteSsrc); |
253 p.AddXrUnknownBlock(); | 253 p.AddXrUnknownBlock(); |
254 p.AddXrExtendedDlrrBlock(kSenderSsrc); | 254 p.AddXrExtendedDlrrBlock(kRemoteSsrc); |
255 p.AddXrUnknownBlock(); | 255 p.AddXrUnknownBlock(); |
256 | 256 |
257 // Expected to be ignored since the source ssrc does not match our | 257 // Expected to be ignored since the source ssrc does not match our |
258 // local ssrc. | 258 // local ssrc. |
259 RtcpParser parser1(kSourceSsrc, 0); | 259 RtcpParser parser1(kLocalSsrc, 0); |
260 EXPECT_TRUE(parser1.Parse(p.Reader())); | 260 EXPECT_TRUE(parser1.Parse(p.Reader())); |
261 EXPECT_FALSE(HasAnything(parser1)); | 261 EXPECT_FALSE(HasAnything(parser1)); |
262 | 262 |
263 // Expected to be pass through since the sender ssrc match our local ssrc. | 263 // Expected to be pass through since the sender ssrc match our local ssrc. |
264 RtcpParser parser2(kSourceSsrc, kSenderSsrc); | 264 RtcpParser parser2(kLocalSsrc, kRemoteSsrc); |
265 EXPECT_TRUE(parser2.Parse(p.Reader())); | 265 EXPECT_TRUE(parser2.Parse(p.Reader())); |
266 ExpectSenderInfo(parser2); | 266 ExpectSenderInfo(parser2); |
267 // DLRRs are ignored. | 267 // DLRRs are ignored. |
268 EXPECT_FALSE(parser2.has_last_report()); | 268 EXPECT_FALSE(parser2.has_last_report()); |
269 } | 269 } |
270 | 270 |
271 TEST_F(RtcpParserTest, InjectReceiverReportPacketWithRrtr) { | 271 TEST_F(RtcpParserTest, InjectReceiverReportPacketWithRrtr) { |
272 TestRtcpPacketBuilder p1; | 272 TestRtcpPacketBuilder p1; |
273 p1.AddRr(kSenderSsrc, 1); | 273 p1.AddRr(kRemoteSsrc, 1); |
274 p1.AddRb(kUnknownSsrc); | 274 p1.AddRb(kUnknownSsrc); |
275 p1.AddXrHeader(kSenderSsrc); | 275 p1.AddXrHeader(kRemoteSsrc); |
276 p1.AddXrRrtrBlock(); | 276 p1.AddXrRrtrBlock(); |
277 | 277 |
278 // Expected to be ignored since the source ssrc does not match our | 278 // Expected to be ignored since the source ssrc does not match our |
279 // local ssrc. | 279 // local ssrc. |
280 RtcpParser parser1(kSourceSsrc, 0); | 280 RtcpParser parser1(kLocalSsrc, 0); |
281 EXPECT_TRUE(parser1.Parse(p1.Reader())); | 281 EXPECT_TRUE(parser1.Parse(p1.Reader())); |
282 EXPECT_FALSE(HasAnything(parser1)); | 282 EXPECT_FALSE(HasAnything(parser1)); |
283 | 283 |
284 TestRtcpPacketBuilder p2; | 284 TestRtcpPacketBuilder p2; |
285 p2.AddRr(kSenderSsrc, 1); | 285 p2.AddRr(kRemoteSsrc, 1); |
286 p2.AddRb(kSourceSsrc); | 286 p2.AddRb(kLocalSsrc); |
287 p2.AddXrHeader(kSenderSsrc); | 287 p2.AddXrHeader(kRemoteSsrc); |
288 p2.AddXrRrtrBlock(); | 288 p2.AddXrRrtrBlock(); |
289 | 289 |
290 // Expected to be pass through since the sender ssrc match our local ssrc. | 290 // Expected to be pass through since the sender ssrc match our local ssrc. |
291 RtcpParser parser2(kSourceSsrc, kSenderSsrc); | 291 RtcpParser parser2(kLocalSsrc, kRemoteSsrc); |
292 EXPECT_TRUE(parser2.Parse(p2.Reader())); | 292 EXPECT_TRUE(parser2.Parse(p2.Reader())); |
293 ExpectLastReport(parser2); | 293 ExpectLastReport(parser2); |
294 ExpectReceiverReference(parser2); | 294 ExpectReceiverReference(parser2); |
295 } | 295 } |
296 | 296 |
297 TEST_F(RtcpParserTest, InjectReceiverReportPacketWithIntraFrameRequest) { | 297 TEST_F(RtcpParserTest, InjectReceiverReportPacketWithIntraFrameRequest) { |
298 TestRtcpPacketBuilder p1; | 298 TestRtcpPacketBuilder p1; |
299 p1.AddRr(kSenderSsrc, 1); | 299 p1.AddRr(kRemoteSsrc, 1); |
300 p1.AddRb(kUnknownSsrc); | 300 p1.AddRb(kUnknownSsrc); |
301 | 301 |
302 // Expected to be ignored since the source ssrc does not match our | 302 // Expected to be ignored since the source ssrc does not match our |
303 // local ssrc. | 303 // local ssrc. |
304 RtcpParser parser1(kSourceSsrc, 0); | 304 RtcpParser parser1(kLocalSsrc, 0); |
305 EXPECT_TRUE(parser1.Parse(p1.Reader())); | 305 EXPECT_TRUE(parser1.Parse(p1.Reader())); |
306 EXPECT_FALSE(HasAnything(parser1)); | 306 EXPECT_FALSE(HasAnything(parser1)); |
307 | 307 |
308 TestRtcpPacketBuilder p2; | 308 TestRtcpPacketBuilder p2; |
309 p2.AddRr(kSenderSsrc, 1); | 309 p2.AddRr(kRemoteSsrc, 1); |
310 p2.AddRb(kSourceSsrc); | 310 p2.AddRb(kLocalSsrc); |
311 | 311 |
312 RtcpParser parser2(kSourceSsrc, kSenderSsrc); | 312 RtcpParser parser2(kLocalSsrc, kRemoteSsrc); |
313 EXPECT_TRUE(parser2.Parse(p2.Reader())); | 313 EXPECT_TRUE(parser2.Parse(p2.Reader())); |
314 ExpectLastReport(parser2); | 314 ExpectLastReport(parser2); |
315 } | 315 } |
316 | 316 |
317 TEST_F(RtcpParserTest, InjectReceiverReportPacketWithCastFeedback) { | 317 TEST_F(RtcpParserTest, InjectReceiverReportPacketWithCastFeedback) { |
318 TestRtcpPacketBuilder p1; | 318 TestRtcpPacketBuilder p1; |
319 p1.AddRr(kSenderSsrc, 1); | 319 p1.AddRr(kRemoteSsrc, 1); |
320 p1.AddRb(kUnknownSsrc); | 320 p1.AddRb(kUnknownSsrc); |
321 p1.AddCast(kSenderSsrc, kUnknownSsrc, kTargetDelay); | 321 p1.AddCast(kRemoteSsrc, kUnknownSsrc, kTargetDelay); |
322 | 322 |
323 // Expected to be ignored since the source ssrc does not match our | 323 // Expected to be ignored since the source ssrc does not match our |
324 // local ssrc. | 324 // local ssrc. |
325 RtcpParser parser1(kSourceSsrc, 0); | 325 RtcpParser parser1(kLocalSsrc, 0); |
326 EXPECT_TRUE(parser1.Parse(p1.Reader())); | 326 EXPECT_TRUE(parser1.Parse(p1.Reader())); |
327 EXPECT_FALSE(HasAnything(parser1)); | 327 EXPECT_FALSE(HasAnything(parser1)); |
328 | 328 |
329 TestRtcpPacketBuilder p2; | 329 TestRtcpPacketBuilder p2; |
330 p2.AddRr(kSenderSsrc, 1); | 330 p2.AddRr(kRemoteSsrc, 1); |
331 p2.AddRb(kSourceSsrc); | 331 p2.AddRb(kLocalSsrc); |
332 p2.AddCast(kSenderSsrc, kSourceSsrc, kTargetDelay); | 332 p2.AddCast(kRemoteSsrc, kLocalSsrc, kTargetDelay); |
333 | 333 |
334 // Expected to be pass through since the sender ssrc match our local ssrc. | 334 // Expected to be pass through since the sender ssrc match our local ssrc. |
335 RtcpParser parser2(kSourceSsrc, kSenderSsrc); | 335 RtcpParser parser2(kLocalSsrc, kRemoteSsrc); |
336 EXPECT_TRUE(parser2.Parse(p2.Reader())); | 336 EXPECT_TRUE(parser2.Parse(p2.Reader())); |
337 ExpectLastReport(parser2); | 337 ExpectLastReport(parser2); |
338 ExpectCastFeedback(parser2); | 338 ExpectCastFeedback(parser2); |
339 } | 339 } |
340 | 340 |
341 TEST_F(RtcpParserTest, ExtendedCastFeedbackParsing) { | 341 TEST_F(RtcpParserTest, ExtendedCastFeedbackParsing) { |
342 // Empty ACK field. | 342 // Empty ACK field. |
343 TestRtcpPacketBuilder builder; | 343 TestRtcpPacketBuilder builder; |
344 builder.AddRr(kSenderSsrc, 1); | 344 builder.AddRr(kRemoteSsrc, 1); |
345 builder.AddRb(kSourceSsrc); | 345 builder.AddRb(kLocalSsrc); |
346 builder.AddCast(kSenderSsrc, kSourceSsrc, kTargetDelay); | 346 builder.AddCast(kRemoteSsrc, kLocalSsrc, kTargetDelay); |
347 std::vector<uint32_t> receiving_frames; | 347 std::vector<uint32_t> receiving_frames; |
348 builder.AddCst2(receiving_frames); | 348 builder.AddCst2(receiving_frames); |
349 RtcpParser parser(kSourceSsrc, kSenderSsrc); | 349 RtcpParser parser(kLocalSsrc, kRemoteSsrc); |
350 EXPECT_TRUE(parser.Parse(builder.Reader())); | 350 EXPECT_TRUE(parser.Parse(builder.Reader())); |
351 ExpectLastReport(parser); | 351 ExpectLastReport(parser); |
352 ExpectCastFeedback(parser); | 352 ExpectCastFeedback(parser); |
353 ExpectExtendedCastFeedback(parser, receiving_frames); | 353 ExpectExtendedCastFeedback(parser, receiving_frames); |
354 | 354 |
355 // One ACK bitmask. | 355 // One ACK bitmask. |
356 TestRtcpPacketBuilder builder2; | 356 TestRtcpPacketBuilder builder2; |
357 builder2.AddRr(kSenderSsrc, 1); | 357 builder2.AddRr(kRemoteSsrc, 1); |
358 builder2.AddRb(kSourceSsrc); | 358 builder2.AddRb(kLocalSsrc); |
359 builder2.AddCast(kSenderSsrc, kSourceSsrc, kTargetDelay); | 359 builder2.AddCast(kRemoteSsrc, kLocalSsrc, kTargetDelay); |
360 receiving_frames.push_back(kAckFrameId + 2); | 360 receiving_frames.push_back(kAckFrameId + 2); |
361 receiving_frames.push_back(kAckFrameId + 3); | 361 receiving_frames.push_back(kAckFrameId + 3); |
362 builder2.AddCst2(receiving_frames); | 362 builder2.AddCst2(receiving_frames); |
363 RtcpParser parser2(kSourceSsrc, kSenderSsrc); | 363 RtcpParser parser2(kLocalSsrc, kRemoteSsrc); |
364 EXPECT_TRUE(parser2.Parse(builder2.Reader())); | 364 EXPECT_TRUE(parser2.Parse(builder2.Reader())); |
365 ExpectLastReport(parser2); | 365 ExpectLastReport(parser2); |
366 ExpectCastFeedback(parser2); | 366 ExpectCastFeedback(parser2); |
367 ExpectExtendedCastFeedback(parser2, receiving_frames); | 367 ExpectExtendedCastFeedback(parser2, receiving_frames); |
368 | 368 |
369 // Mutiple ACK bitmasks. | 369 // Mutiple ACK bitmasks. |
370 TestRtcpPacketBuilder builder3; | 370 TestRtcpPacketBuilder builder3; |
371 builder3.AddRr(kSenderSsrc, 1); | 371 builder3.AddRr(kRemoteSsrc, 1); |
372 builder3.AddRb(kSourceSsrc); | 372 builder3.AddRb(kLocalSsrc); |
373 builder3.AddCast(kSenderSsrc, kSourceSsrc, kTargetDelay); | 373 builder3.AddCast(kRemoteSsrc, kLocalSsrc, kTargetDelay); |
374 receiving_frames.clear(); | 374 receiving_frames.clear(); |
375 for (size_t i = 0; i < 15; ++i) | 375 for (size_t i = 0; i < 15; ++i) |
376 receiving_frames.push_back(kAckFrameId + 2 + i * 10); | 376 receiving_frames.push_back(kAckFrameId + 2 + i * 10); |
377 builder3.AddCst2(receiving_frames); | 377 builder3.AddCst2(receiving_frames); |
378 RtcpParser parser3(kSourceSsrc, kSenderSsrc); | 378 RtcpParser parser3(kLocalSsrc, kRemoteSsrc); |
379 EXPECT_TRUE(parser3.Parse(builder3.Reader())); | 379 EXPECT_TRUE(parser3.Parse(builder3.Reader())); |
380 ExpectLastReport(parser3); | 380 ExpectLastReport(parser3); |
381 ExpectCastFeedback(parser3); | 381 ExpectCastFeedback(parser3); |
382 ExpectExtendedCastFeedback(parser3, receiving_frames); | 382 ExpectExtendedCastFeedback(parser3, receiving_frames); |
383 | 383 |
384 // Expected to be ignored if there is error in the extended ACK message. | 384 // Expected to be ignored if there is error in the extended ACK message. |
385 TestRtcpPacketBuilder builder4; | 385 TestRtcpPacketBuilder builder4; |
386 builder4.AddRr(kSenderSsrc, 1); | 386 builder4.AddRr(kRemoteSsrc, 1); |
387 builder4.AddRb(kSourceSsrc); | 387 builder4.AddRb(kLocalSsrc); |
388 builder4.AddCast(kSenderSsrc, kSourceSsrc, kTargetDelay); | 388 builder4.AddCast(kRemoteSsrc, kLocalSsrc, kTargetDelay); |
389 builder4.AddErrorCst2(); | 389 builder4.AddErrorCst2(); |
390 RtcpParser parser4(kSourceSsrc, kSenderSsrc); | 390 RtcpParser parser4(kLocalSsrc, kRemoteSsrc); |
391 EXPECT_TRUE(parser4.Parse(builder4.Reader())); | 391 EXPECT_TRUE(parser4.Parse(builder4.Reader())); |
392 ExpectLastReport(parser4); | 392 ExpectLastReport(parser4); |
393 ExpectCastFeedback(parser4); | 393 ExpectCastFeedback(parser4); |
394 EXPECT_FALSE(parser4.has_cst2_message()); | 394 EXPECT_FALSE(parser4.has_cst2_message()); |
395 | 395 |
396 // Expected to be ignored if there is only "CST2" identifier. | 396 // Expected to be ignored if there is only "CST2" identifier. |
397 TestRtcpPacketBuilder builder5; | 397 TestRtcpPacketBuilder builder5; |
398 builder5.AddRr(kSenderSsrc, 1); | 398 builder5.AddRr(kRemoteSsrc, 1); |
399 builder5.AddRb(kSourceSsrc); | 399 builder5.AddRb(kLocalSsrc); |
400 receiving_frames.clear(); | 400 receiving_frames.clear(); |
401 builder5.AddCst2(receiving_frames); | 401 builder5.AddCst2(receiving_frames); |
402 RtcpParser parser5(kSourceSsrc, kSenderSsrc); | 402 RtcpParser parser5(kLocalSsrc, kRemoteSsrc); |
403 EXPECT_TRUE(parser5.Parse(builder5.Reader())); | 403 EXPECT_TRUE(parser5.Parse(builder5.Reader())); |
404 ExpectLastReport(parser5); | 404 ExpectLastReport(parser5); |
405 EXPECT_FALSE(parser5.has_cst2_message()); | 405 EXPECT_FALSE(parser5.has_cst2_message()); |
406 } | 406 } |
407 | 407 |
| 408 TEST_F(RtcpParserTest, InjectReceiverReportPli) { |
| 409 // Expect to be ignored since the sender ssrc does not match. |
| 410 TestRtcpPacketBuilder builder1; |
| 411 builder1.AddPli(kUnknownSsrc, kLocalSsrc); |
| 412 RtcpParser parser1(kLocalSsrc, kRemoteSsrc); |
| 413 EXPECT_TRUE(parser1.Parse(builder1.Reader())); |
| 414 EXPECT_FALSE(parser1.has_picture_loss_indicator()); |
| 415 |
| 416 // Expect to be ignored since the receiver ssrc does not match. |
| 417 TestRtcpPacketBuilder builder2; |
| 418 builder2.AddPli(kRemoteSsrc, kUnknownSsrc); |
| 419 RtcpParser parser2(kLocalSsrc, kRemoteSsrc); |
| 420 EXPECT_TRUE(parser2.Parse(builder2.Reader())); |
| 421 EXPECT_FALSE(parser2.has_picture_loss_indicator()); |
| 422 |
| 423 TestRtcpPacketBuilder builder3; |
| 424 builder3.AddPli(kRemoteSsrc, kLocalSsrc); |
| 425 RtcpParser parser3(kLocalSsrc, kRemoteSsrc); |
| 426 EXPECT_TRUE(parser3.Parse(builder3.Reader())); |
| 427 EXPECT_TRUE(parser3.has_picture_loss_indicator()); |
| 428 } |
| 429 |
408 TEST_F(RtcpParserTest, InjectReceiverReportWithReceiverLogVerificationBase) { | 430 TEST_F(RtcpParserTest, InjectReceiverReportWithReceiverLogVerificationBase) { |
409 static const uint32_t kTimeBaseMs = 12345678; | 431 static const uint32_t kTimeBaseMs = 12345678; |
410 static const uint32_t kTimeDelayMs = 10; | 432 static const uint32_t kTimeDelayMs = 10; |
411 static const uint32_t kDelayDeltaMs = 123; | 433 static const uint32_t kDelayDeltaMs = 123; |
412 base::SimpleTestTickClock testing_clock; | 434 base::SimpleTestTickClock testing_clock; |
413 testing_clock.Advance(base::TimeDelta::FromMilliseconds(kTimeBaseMs)); | 435 testing_clock.Advance(base::TimeDelta::FromMilliseconds(kTimeBaseMs)); |
414 | 436 |
415 RtcpReceiverLogMessage receiver_log; | 437 RtcpReceiverLogMessage receiver_log; |
416 RtcpReceiverFrameLogMessage frame_log(RtpTimeTicks().Expand(kRtpTimestamp)); | 438 RtcpReceiverFrameLogMessage frame_log(RtpTimeTicks().Expand(kRtpTimestamp)); |
417 RtcpReceiverEventLogMessage event_log; | 439 RtcpReceiverEventLogMessage event_log; |
(...skipping 10 matching lines...) Expand all Loading... |
428 frame_log.event_log_messages_.push_back(event_log); | 450 frame_log.event_log_messages_.push_back(event_log); |
429 | 451 |
430 event_log.type = PACKET_RECEIVED; | 452 event_log.type = PACKET_RECEIVED; |
431 event_log.event_timestamp = testing_clock.NowTicks(); | 453 event_log.event_timestamp = testing_clock.NowTicks(); |
432 event_log.packet_id = kLostPacketId2; | 454 event_log.packet_id = kLostPacketId2; |
433 frame_log.event_log_messages_.push_back(event_log); | 455 frame_log.event_log_messages_.push_back(event_log); |
434 | 456 |
435 receiver_log.push_back(frame_log); | 457 receiver_log.push_back(frame_log); |
436 | 458 |
437 TestRtcpPacketBuilder p; | 459 TestRtcpPacketBuilder p; |
438 p.AddRr(kSenderSsrc, 1); | 460 p.AddRr(kRemoteSsrc, 1); |
439 p.AddRb(kSourceSsrc); | 461 p.AddRb(kLocalSsrc); |
440 p.AddReceiverLog(kSenderSsrc); | 462 p.AddReceiverLog(kRemoteSsrc); |
441 p.AddReceiverFrameLog(kRtpTimestamp, 3, kTimeBaseMs); | 463 p.AddReceiverFrameLog(kRtpTimestamp, 3, kTimeBaseMs); |
442 p.AddReceiverEventLog(kDelayDeltaMs, FRAME_ACK_SENT, 0); | 464 p.AddReceiverEventLog(kDelayDeltaMs, FRAME_ACK_SENT, 0); |
443 p.AddReceiverEventLog(kLostPacketId1, PACKET_RECEIVED, kTimeDelayMs); | 465 p.AddReceiverEventLog(kLostPacketId1, PACKET_RECEIVED, kTimeDelayMs); |
444 p.AddReceiverEventLog(kLostPacketId2, PACKET_RECEIVED, kTimeDelayMs); | 466 p.AddReceiverEventLog(kLostPacketId2, PACKET_RECEIVED, kTimeDelayMs); |
445 | 467 |
446 RtcpParser parser(kSourceSsrc, kSenderSsrc); | 468 RtcpParser parser(kLocalSsrc, kRemoteSsrc); |
447 EXPECT_TRUE(parser.Parse(p.Reader())); | 469 EXPECT_TRUE(parser.Parse(p.Reader())); |
448 ExpectReceiverLog(parser, receiver_log); | 470 ExpectReceiverLog(parser, receiver_log); |
449 } | 471 } |
450 | 472 |
451 TEST_F(RtcpParserTest, InjectReceiverReportWithReceiverLogVerificationMulti) { | 473 TEST_F(RtcpParserTest, InjectReceiverReportWithReceiverLogVerificationMulti) { |
452 static const uint32_t kTimeBaseMs = 12345678; | 474 static const uint32_t kTimeBaseMs = 12345678; |
453 static const uint32_t kTimeDelayMs = 10; | 475 static const uint32_t kTimeDelayMs = 10; |
454 static const int kDelayDeltaMs = 123; // To be varied for every frame. | 476 static const int kDelayDeltaMs = 123; // To be varied for every frame. |
455 base::SimpleTestTickClock testing_clock; | 477 base::SimpleTestTickClock testing_clock; |
456 testing_clock.Advance(base::TimeDelta::FromMilliseconds(kTimeBaseMs)); | 478 testing_clock.Advance(base::TimeDelta::FromMilliseconds(kTimeBaseMs)); |
457 | 479 |
458 RtcpReceiverLogMessage receiver_log; | 480 RtcpReceiverLogMessage receiver_log; |
459 | 481 |
460 for (int j = 0; j < 100; ++j) { | 482 for (int j = 0; j < 100; ++j) { |
461 RtcpReceiverFrameLogMessage frame_log(RtpTimeTicks().Expand(kRtpTimestamp)); | 483 RtcpReceiverFrameLogMessage frame_log(RtpTimeTicks().Expand(kRtpTimestamp)); |
462 RtcpReceiverEventLogMessage event_log; | 484 RtcpReceiverEventLogMessage event_log; |
463 event_log.type = FRAME_ACK_SENT; | 485 event_log.type = FRAME_ACK_SENT; |
464 event_log.event_timestamp = testing_clock.NowTicks(); | 486 event_log.event_timestamp = testing_clock.NowTicks(); |
465 event_log.delay_delta = | 487 event_log.delay_delta = |
466 base::TimeDelta::FromMilliseconds((j - 50) * kDelayDeltaMs); | 488 base::TimeDelta::FromMilliseconds((j - 50) * kDelayDeltaMs); |
467 frame_log.event_log_messages_.push_back(event_log); | 489 frame_log.event_log_messages_.push_back(event_log); |
468 receiver_log.push_back(frame_log); | 490 receiver_log.push_back(frame_log); |
469 testing_clock.Advance(base::TimeDelta::FromMilliseconds(kTimeDelayMs)); | 491 testing_clock.Advance(base::TimeDelta::FromMilliseconds(kTimeDelayMs)); |
470 } | 492 } |
471 | 493 |
472 TestRtcpPacketBuilder p; | 494 TestRtcpPacketBuilder p; |
473 p.AddRr(kSenderSsrc, 1); | 495 p.AddRr(kRemoteSsrc, 1); |
474 p.AddRb(kSourceSsrc); | 496 p.AddRb(kLocalSsrc); |
475 p.AddReceiverLog(kSenderSsrc); | 497 p.AddReceiverLog(kRemoteSsrc); |
476 for (int i = 0; i < 100; ++i) { | 498 for (int i = 0; i < 100; ++i) { |
477 p.AddReceiverFrameLog(kRtpTimestamp, 1, kTimeBaseMs + i * kTimeDelayMs); | 499 p.AddReceiverFrameLog(kRtpTimestamp, 1, kTimeBaseMs + i * kTimeDelayMs); |
478 const int delay = (i - 50) * kDelayDeltaMs; | 500 const int delay = (i - 50) * kDelayDeltaMs; |
479 p.AddReceiverEventLog(static_cast<uint16_t>(delay), FRAME_ACK_SENT, 0); | 501 p.AddReceiverEventLog(static_cast<uint16_t>(delay), FRAME_ACK_SENT, 0); |
480 } | 502 } |
481 | 503 |
482 RtcpParser parser(kSourceSsrc, kSenderSsrc); | 504 RtcpParser parser(kLocalSsrc, kRemoteSsrc); |
483 EXPECT_TRUE(parser.Parse(p.Reader())); | 505 EXPECT_TRUE(parser.Parse(p.Reader())); |
484 ExpectReceiverLog(parser, receiver_log); | 506 ExpectReceiverLog(parser, receiver_log); |
485 } | 507 } |
486 | 508 |
487 TEST(RtcpUtilityTest, NtpAndTime) { | 509 TEST(RtcpUtilityTest, NtpAndTime) { |
488 const int64_t kSecondsbetweenYear1900and2010 = INT64_C(40176 * 24 * 60 * 60); | 510 const int64_t kSecondsbetweenYear1900and2010 = INT64_C(40176 * 24 * 60 * 60); |
489 const int64_t kSecondsbetweenYear1900and2030 = INT64_C(47481 * 24 * 60 * 60); | 511 const int64_t kSecondsbetweenYear1900and2030 = INT64_C(47481 * 24 * 60 * 60); |
490 | 512 |
491 uint32_t ntp_seconds_1 = 0; | 513 uint32_t ntp_seconds_1 = 0; |
492 uint32_t ntp_fraction_1 = 0; | 514 uint32_t ntp_fraction_1 = 0; |
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
525 base::TimeTicks out_3 = ConvertNtpToTimeTicks(ntp_seconds_3, ntp_fraction_3); | 547 base::TimeTicks out_3 = ConvertNtpToTimeTicks(ntp_seconds_3, ntp_fraction_3); |
526 EXPECT_EQ(input_time, out_3); // Verify inverse. | 548 EXPECT_EQ(input_time, out_3); // Verify inverse. |
527 | 549 |
528 // Verify delta. | 550 // Verify delta. |
529 EXPECT_EQ((out_3 - out_2), time_delta); | 551 EXPECT_EQ((out_3 - out_2), time_delta); |
530 EXPECT_NEAR((ntp_fraction_3 - ntp_fraction_2), 0xffffffff / 2, 1); | 552 EXPECT_NEAR((ntp_fraction_3 - ntp_fraction_2), 0xffffffff / 2, 1); |
531 } | 553 } |
532 | 554 |
533 } // namespace cast | 555 } // namespace cast |
534 } // namespace media | 556 } // namespace media |
OLD | NEW |