OLD | NEW |
| (Empty) |
1 // Copyright 2013 The Chromium Authors. All rights reserved. | |
2 // Use of this source code is governed by a BSD-style license that can be | |
3 // found in the LICENSE file. | |
4 | |
5 #include <stdint.h> | |
6 | |
7 #include "base/test/simple_test_tick_clock.h" | |
8 #include "media/cast/cast_defines.h" | |
9 #include "media/cast/cast_environment.h" | |
10 #include "media/cast/rtcp/mock_rtcp_receiver_feedback.h" | |
11 #include "media/cast/rtcp/mock_rtcp_sender_feedback.h" | |
12 #include "media/cast/rtcp/rtcp.h" | |
13 #include "media/cast/rtcp/test_rtcp_packet_builder.h" | |
14 #include "media/cast/test/fake_single_thread_task_runner.h" | |
15 #include "media/cast/transport/cast_transport_config.h" | |
16 #include "media/cast/transport/cast_transport_sender_impl.h" | |
17 #include "media/cast/transport/pacing/paced_sender.h" | |
18 #include "testing/gmock/include/gmock/gmock.h" | |
19 | |
20 namespace media { | |
21 namespace cast { | |
22 | |
23 using testing::_; | |
24 | |
25 static const uint32 kSenderSsrc = 0x10203; | |
26 static const uint32 kReceiverSsrc = 0x40506; | |
27 static const std::string kCName("test@10.1.1.1"); | |
28 static const uint32 kRtcpIntervalMs = 500; | |
29 static const int64 kAddedDelay = 123; | |
30 static const int64 kAddedShortDelay = 100; | |
31 | |
32 class RtcpTestPacketSender : public transport::PacketSender { | |
33 public: | |
34 explicit RtcpTestPacketSender(base::SimpleTestTickClock* testing_clock) | |
35 : drop_packets_(false), | |
36 short_delay_(false), | |
37 rtcp_receiver_(NULL), | |
38 testing_clock_(testing_clock) {} | |
39 virtual ~RtcpTestPacketSender() {} | |
40 // Packet lists imply a RTP packet. | |
41 void set_rtcp_receiver(Rtcp* rtcp) { rtcp_receiver_ = rtcp; } | |
42 | |
43 void set_short_delay() { short_delay_ = true; } | |
44 | |
45 void set_drop_packets(bool drop_packets) { drop_packets_ = drop_packets; } | |
46 | |
47 // A singular packet implies a RTCP packet. | |
48 virtual bool SendPacket(transport::PacketRef packet, | |
49 const base::Closure& cb) OVERRIDE { | |
50 if (short_delay_) { | |
51 testing_clock_->Advance( | |
52 base::TimeDelta::FromMilliseconds(kAddedShortDelay)); | |
53 } else { | |
54 testing_clock_->Advance(base::TimeDelta::FromMilliseconds(kAddedDelay)); | |
55 } | |
56 if (drop_packets_) | |
57 return true; | |
58 | |
59 rtcp_receiver_->IncomingRtcpPacket(&packet->data[0], packet->data.size()); | |
60 return true; | |
61 } | |
62 | |
63 private: | |
64 bool drop_packets_; | |
65 bool short_delay_; | |
66 Rtcp* rtcp_receiver_; | |
67 base::SimpleTestTickClock* testing_clock_; | |
68 | |
69 DISALLOW_COPY_AND_ASSIGN(RtcpTestPacketSender); | |
70 }; | |
71 | |
72 class LocalRtcpTransport : public transport::PacedPacketSender { | |
73 public: | |
74 LocalRtcpTransport(scoped_refptr<CastEnvironment> cast_environment, | |
75 base::SimpleTestTickClock* testing_clock) | |
76 : drop_packets_(false), | |
77 short_delay_(false), | |
78 testing_clock_(testing_clock) {} | |
79 | |
80 void set_rtcp_receiver(Rtcp* rtcp) { rtcp_ = rtcp; } | |
81 | |
82 void set_short_delay() { short_delay_ = true; } | |
83 | |
84 void set_drop_packets(bool drop_packets) { drop_packets_ = drop_packets; } | |
85 | |
86 virtual bool SendRtcpPacket(uint32 ssrc, | |
87 transport::PacketRef packet) OVERRIDE { | |
88 if (short_delay_) { | |
89 testing_clock_->Advance( | |
90 base::TimeDelta::FromMilliseconds(kAddedShortDelay)); | |
91 } else { | |
92 testing_clock_->Advance(base::TimeDelta::FromMilliseconds(kAddedDelay)); | |
93 } | |
94 if (drop_packets_) | |
95 return true; | |
96 | |
97 rtcp_->IncomingRtcpPacket(&packet->data[0], packet->data.size()); | |
98 return true; | |
99 } | |
100 | |
101 virtual bool SendPackets( | |
102 const transport::SendPacketVector& packets) OVERRIDE { | |
103 return false; | |
104 } | |
105 | |
106 virtual bool ResendPackets( | |
107 const transport::SendPacketVector& packets, | |
108 base::TimeDelta dedupe_window) OVERRIDE { | |
109 return false; | |
110 } | |
111 | |
112 virtual void CancelSendingPacket( | |
113 const transport::PacketKey& packet_key) OVERRIDE { | |
114 } | |
115 | |
116 private: | |
117 bool drop_packets_; | |
118 bool short_delay_; | |
119 Rtcp* rtcp_; | |
120 base::SimpleTestTickClock* testing_clock_; | |
121 scoped_refptr<CastEnvironment> cast_environment_; | |
122 | |
123 DISALLOW_COPY_AND_ASSIGN(LocalRtcpTransport); | |
124 }; | |
125 | |
126 class RtcpPeer : public Rtcp { | |
127 public: | |
128 RtcpPeer(scoped_refptr<CastEnvironment> cast_environment, | |
129 RtcpSenderFeedback* sender_feedback, | |
130 transport::CastTransportSender* const transport_sender, | |
131 transport::PacedPacketSender* paced_packet_sender, | |
132 RtpReceiverStatistics* rtp_receiver_statistics, | |
133 RtcpMode rtcp_mode, | |
134 const base::TimeDelta& rtcp_interval, | |
135 uint32 local_ssrc, | |
136 uint32 remote_ssrc, | |
137 const std::string& c_name) | |
138 : Rtcp(cast_environment, | |
139 sender_feedback, | |
140 transport_sender, | |
141 paced_packet_sender, | |
142 rtp_receiver_statistics, | |
143 rtcp_mode, | |
144 rtcp_interval, | |
145 local_ssrc, | |
146 remote_ssrc, | |
147 c_name, | |
148 AUDIO_EVENT) {} | |
149 | |
150 using Rtcp::OnReceivedNtp; | |
151 using Rtcp::OnReceivedLipSyncInfo; | |
152 }; | |
153 | |
154 class RtcpTest : public ::testing::Test { | |
155 protected: | |
156 RtcpTest() | |
157 : testing_clock_(new base::SimpleTestTickClock()), | |
158 task_runner_(new test::FakeSingleThreadTaskRunner(testing_clock_)), | |
159 cast_environment_(new CastEnvironment( | |
160 scoped_ptr<base::TickClock>(testing_clock_).Pass(), | |
161 task_runner_, | |
162 task_runner_, | |
163 task_runner_)), | |
164 sender_to_receiver_(testing_clock_), | |
165 receiver_to_sender_(cast_environment_, testing_clock_) { | |
166 testing_clock_->Advance(base::TimeTicks::Now() - base::TimeTicks()); | |
167 net::IPEndPoint dummy_endpoint; | |
168 transport_sender_.reset(new transport::CastTransportSenderImpl( | |
169 NULL, | |
170 testing_clock_, | |
171 dummy_endpoint, | |
172 base::Bind(&UpdateCastTransportStatus), | |
173 transport::BulkRawEventsCallback(), | |
174 base::TimeDelta(), | |
175 task_runner_, | |
176 &sender_to_receiver_)); | |
177 transport::CastTransportRtpConfig config; | |
178 config.ssrc = kSenderSsrc; | |
179 config.rtp_payload_type = 127; | |
180 config.stored_frames = 1; | |
181 transport_sender_->InitializeAudio(config); | |
182 EXPECT_CALL(mock_sender_feedback_, OnReceivedCastFeedback(_)).Times(0); | |
183 } | |
184 | |
185 virtual ~RtcpTest() {} | |
186 | |
187 static void UpdateCastTransportStatus(transport::CastTransportStatus status) { | |
188 bool result = (status == transport::TRANSPORT_AUDIO_INITIALIZED || | |
189 status == transport::TRANSPORT_VIDEO_INITIALIZED); | |
190 EXPECT_TRUE(result); | |
191 } | |
192 | |
193 void RunTasks(int during_ms) { | |
194 for (int i = 0; i < during_ms; ++i) { | |
195 // Call process the timers every 1 ms. | |
196 testing_clock_->Advance(base::TimeDelta::FromMilliseconds(1)); | |
197 task_runner_->RunTasks(); | |
198 } | |
199 } | |
200 | |
201 base::SimpleTestTickClock* testing_clock_; // Owned by CastEnvironment. | |
202 scoped_refptr<test::FakeSingleThreadTaskRunner> task_runner_; | |
203 scoped_refptr<CastEnvironment> cast_environment_; | |
204 RtcpTestPacketSender sender_to_receiver_; | |
205 scoped_ptr<transport::CastTransportSenderImpl> transport_sender_; | |
206 LocalRtcpTransport receiver_to_sender_; | |
207 MockRtcpSenderFeedback mock_sender_feedback_; | |
208 | |
209 DISALLOW_COPY_AND_ASSIGN(RtcpTest); | |
210 }; | |
211 | |
212 TEST_F(RtcpTest, TimeToSend) { | |
213 const base::TimeTicks start_time = testing_clock_->NowTicks(); | |
214 Rtcp rtcp(cast_environment_, | |
215 &mock_sender_feedback_, | |
216 transport_sender_.get(), | |
217 &receiver_to_sender_, | |
218 NULL, | |
219 kRtcpCompound, | |
220 base::TimeDelta::FromMilliseconds(kRtcpIntervalMs), | |
221 kSenderSsrc, | |
222 kReceiverSsrc, | |
223 kCName, | |
224 AUDIO_EVENT); | |
225 receiver_to_sender_.set_rtcp_receiver(&rtcp); | |
226 EXPECT_LE(start_time, rtcp.TimeToSendNextRtcpReport()); | |
227 EXPECT_GE( | |
228 start_time + base::TimeDelta::FromMilliseconds(kRtcpIntervalMs * 3 / 2), | |
229 rtcp.TimeToSendNextRtcpReport()); | |
230 base::TimeDelta delta = rtcp.TimeToSendNextRtcpReport() - start_time; | |
231 testing_clock_->Advance(delta); | |
232 EXPECT_EQ(testing_clock_->NowTicks(), rtcp.TimeToSendNextRtcpReport()); | |
233 } | |
234 | |
235 TEST_F(RtcpTest, BasicSenderReport) { | |
236 Rtcp rtcp(cast_environment_, | |
237 &mock_sender_feedback_, | |
238 transport_sender_.get(), | |
239 NULL, | |
240 NULL, | |
241 kRtcpCompound, | |
242 base::TimeDelta::FromMilliseconds(kRtcpIntervalMs), | |
243 kSenderSsrc, | |
244 kReceiverSsrc, | |
245 kCName, | |
246 AUDIO_EVENT); | |
247 sender_to_receiver_.set_rtcp_receiver(&rtcp); | |
248 rtcp.SendRtcpFromRtpSender(base::TimeTicks(), 0); | |
249 } | |
250 | |
251 TEST_F(RtcpTest, BasicReceiverReport) { | |
252 Rtcp rtcp(cast_environment_, | |
253 &mock_sender_feedback_, | |
254 NULL, | |
255 &receiver_to_sender_, | |
256 NULL, | |
257 kRtcpCompound, | |
258 base::TimeDelta::FromMilliseconds(kRtcpIntervalMs), | |
259 kSenderSsrc, | |
260 kReceiverSsrc, | |
261 kCName, | |
262 AUDIO_EVENT); | |
263 receiver_to_sender_.set_rtcp_receiver(&rtcp); | |
264 rtcp.SendRtcpFromRtpReceiver(NULL, NULL); | |
265 } | |
266 | |
267 TEST_F(RtcpTest, BasicCast) { | |
268 EXPECT_CALL(mock_sender_feedback_, OnReceivedCastFeedback(_)).Times(1); | |
269 | |
270 // Media receiver. | |
271 Rtcp rtcp(cast_environment_, | |
272 &mock_sender_feedback_, | |
273 NULL, | |
274 &receiver_to_sender_, | |
275 NULL, | |
276 kRtcpReducedSize, | |
277 base::TimeDelta::FromMilliseconds(kRtcpIntervalMs), | |
278 kSenderSsrc, | |
279 kSenderSsrc, | |
280 kCName, | |
281 AUDIO_EVENT); | |
282 receiver_to_sender_.set_rtcp_receiver(&rtcp); | |
283 RtcpCastMessage cast_message(kSenderSsrc); | |
284 cast_message.ack_frame_id_ = kAckFrameId; | |
285 PacketIdSet missing_packets; | |
286 cast_message.missing_frames_and_packets_[kLostFrameId] = missing_packets; | |
287 | |
288 missing_packets.insert(kLostPacketId1); | |
289 missing_packets.insert(kLostPacketId2); | |
290 missing_packets.insert(kLostPacketId3); | |
291 cast_message.missing_frames_and_packets_[kFrameIdWithLostPackets] = | |
292 missing_packets; | |
293 rtcp.SendRtcpFromRtpReceiver(&cast_message, NULL); | |
294 } | |
295 | |
296 TEST_F(RtcpTest, RttReducedSizeRtcp) { | |
297 // Media receiver. | |
298 Rtcp rtcp_receiver(cast_environment_, | |
299 &mock_sender_feedback_, | |
300 NULL, | |
301 &receiver_to_sender_, | |
302 NULL, | |
303 kRtcpReducedSize, | |
304 base::TimeDelta::FromMilliseconds(kRtcpIntervalMs), | |
305 kReceiverSsrc, | |
306 kSenderSsrc, | |
307 kCName, | |
308 AUDIO_EVENT); | |
309 | |
310 // Media sender. | |
311 Rtcp rtcp_sender(cast_environment_, | |
312 &mock_sender_feedback_, | |
313 transport_sender_.get(), | |
314 NULL, | |
315 NULL, | |
316 kRtcpReducedSize, | |
317 base::TimeDelta::FromMilliseconds(kRtcpIntervalMs), | |
318 kSenderSsrc, | |
319 kReceiverSsrc, | |
320 kCName, | |
321 AUDIO_EVENT); | |
322 | |
323 sender_to_receiver_.set_rtcp_receiver(&rtcp_receiver); | |
324 receiver_to_sender_.set_rtcp_receiver(&rtcp_sender); | |
325 | |
326 base::TimeDelta rtt; | |
327 base::TimeDelta avg_rtt; | |
328 base::TimeDelta min_rtt; | |
329 base::TimeDelta max_rtt; | |
330 EXPECT_FALSE(rtcp_sender.Rtt(&rtt, &avg_rtt, &min_rtt, &max_rtt)); | |
331 EXPECT_FALSE(rtcp_receiver.Rtt(&rtt, &avg_rtt, &min_rtt, &max_rtt)); | |
332 | |
333 rtcp_sender.SendRtcpFromRtpSender(testing_clock_->NowTicks(), 1); | |
334 RunTasks(33); | |
335 rtcp_receiver.SendRtcpFromRtpReceiver(NULL, NULL); | |
336 EXPECT_TRUE(rtcp_sender.Rtt(&rtt, &avg_rtt, &min_rtt, &max_rtt)); | |
337 EXPECT_FALSE(rtcp_receiver.Rtt(&rtt, &avg_rtt, &min_rtt, &max_rtt)); | |
338 EXPECT_NEAR(2 * kAddedDelay, rtt.InMilliseconds(), 2); | |
339 EXPECT_NEAR(2 * kAddedDelay, avg_rtt.InMilliseconds(), 2); | |
340 EXPECT_NEAR(2 * kAddedDelay, min_rtt.InMilliseconds(), 2); | |
341 EXPECT_NEAR(2 * kAddedDelay, max_rtt.InMilliseconds(), 2); | |
342 rtcp_sender.SendRtcpFromRtpSender(testing_clock_->NowTicks(), 2); | |
343 RunTasks(33); | |
344 EXPECT_TRUE(rtcp_receiver.Rtt(&rtt, &avg_rtt, &min_rtt, &max_rtt)); | |
345 | |
346 EXPECT_NEAR(2 * kAddedDelay, rtt.InMilliseconds(), 2); | |
347 EXPECT_NEAR(2 * kAddedDelay, avg_rtt.InMilliseconds(), 2); | |
348 EXPECT_NEAR(2 * kAddedDelay, min_rtt.InMilliseconds(), 2); | |
349 EXPECT_NEAR(2 * kAddedDelay, max_rtt.InMilliseconds(), 2); | |
350 } | |
351 | |
352 TEST_F(RtcpTest, Rtt) { | |
353 // Media receiver. | |
354 Rtcp rtcp_receiver(cast_environment_, | |
355 &mock_sender_feedback_, | |
356 NULL, | |
357 &receiver_to_sender_, | |
358 NULL, | |
359 kRtcpCompound, | |
360 base::TimeDelta::FromMilliseconds(kRtcpIntervalMs), | |
361 kReceiverSsrc, | |
362 kSenderSsrc, | |
363 kCName, | |
364 AUDIO_EVENT); | |
365 | |
366 // Media sender. | |
367 Rtcp rtcp_sender(cast_environment_, | |
368 &mock_sender_feedback_, | |
369 transport_sender_.get(), | |
370 NULL, | |
371 NULL, | |
372 kRtcpCompound, | |
373 base::TimeDelta::FromMilliseconds(kRtcpIntervalMs), | |
374 kSenderSsrc, | |
375 kReceiverSsrc, | |
376 kCName, | |
377 AUDIO_EVENT); | |
378 | |
379 receiver_to_sender_.set_rtcp_receiver(&rtcp_sender); | |
380 sender_to_receiver_.set_rtcp_receiver(&rtcp_receiver); | |
381 | |
382 base::TimeDelta rtt; | |
383 base::TimeDelta avg_rtt; | |
384 base::TimeDelta min_rtt; | |
385 base::TimeDelta max_rtt; | |
386 EXPECT_FALSE(rtcp_sender.Rtt(&rtt, &avg_rtt, &min_rtt, &max_rtt)); | |
387 EXPECT_FALSE(rtcp_receiver.Rtt(&rtt, &avg_rtt, &min_rtt, &max_rtt)); | |
388 | |
389 rtcp_sender.SendRtcpFromRtpSender(testing_clock_->NowTicks(), 1); | |
390 RunTasks(33); | |
391 rtcp_receiver.SendRtcpFromRtpReceiver(NULL, NULL); | |
392 | |
393 EXPECT_TRUE(rtcp_sender.Rtt(&rtt, &avg_rtt, &min_rtt, &max_rtt)); | |
394 RunTasks(33); | |
395 | |
396 EXPECT_FALSE(rtcp_receiver.Rtt(&rtt, &avg_rtt, &min_rtt, &max_rtt)); | |
397 RunTasks(33); | |
398 | |
399 EXPECT_NEAR(2 * kAddedDelay, rtt.InMilliseconds(), 2); | |
400 EXPECT_NEAR(2 * kAddedDelay, avg_rtt.InMilliseconds(), 2); | |
401 EXPECT_NEAR(2 * kAddedDelay, min_rtt.InMilliseconds(), 2); | |
402 EXPECT_NEAR(2 * kAddedDelay, max_rtt.InMilliseconds(), 2); | |
403 | |
404 rtcp_sender.SendRtcpFromRtpSender(testing_clock_->NowTicks(), 2); | |
405 RunTasks(33); | |
406 EXPECT_TRUE(rtcp_receiver.Rtt(&rtt, &avg_rtt, &min_rtt, &max_rtt)); | |
407 EXPECT_NEAR(2 * kAddedDelay, rtt.InMilliseconds(), 2); | |
408 EXPECT_NEAR(2 * kAddedDelay, avg_rtt.InMilliseconds(), 2); | |
409 EXPECT_NEAR(2 * kAddedDelay, min_rtt.InMilliseconds(), 2); | |
410 EXPECT_NEAR(2 * kAddedDelay, max_rtt.InMilliseconds(), 2); | |
411 | |
412 receiver_to_sender_.set_short_delay(); | |
413 sender_to_receiver_.set_short_delay(); | |
414 rtcp_receiver.SendRtcpFromRtpReceiver(NULL, NULL); | |
415 EXPECT_TRUE(rtcp_sender.Rtt(&rtt, &avg_rtt, &min_rtt, &max_rtt)); | |
416 EXPECT_NEAR(kAddedDelay + kAddedShortDelay, rtt.InMilliseconds(), 2); | |
417 EXPECT_NEAR( | |
418 (kAddedShortDelay + 3 * kAddedDelay) / 2, avg_rtt.InMilliseconds(), 2); | |
419 EXPECT_NEAR(kAddedDelay + kAddedShortDelay, min_rtt.InMilliseconds(), 2); | |
420 EXPECT_NEAR(2 * kAddedDelay, max_rtt.InMilliseconds(), 2); | |
421 | |
422 rtcp_sender.SendRtcpFromRtpSender(testing_clock_->NowTicks(), 3); | |
423 RunTasks(33); | |
424 EXPECT_TRUE(rtcp_receiver.Rtt(&rtt, &avg_rtt, &min_rtt, &max_rtt)); | |
425 EXPECT_NEAR(2 * kAddedShortDelay, rtt.InMilliseconds(), 1); | |
426 EXPECT_NEAR((2 * kAddedShortDelay + 2 * kAddedDelay) / 2, | |
427 avg_rtt.InMilliseconds(), | |
428 1); | |
429 EXPECT_NEAR(2 * kAddedShortDelay, min_rtt.InMilliseconds(), 2); | |
430 EXPECT_NEAR(2 * kAddedDelay, max_rtt.InMilliseconds(), 2); | |
431 | |
432 rtcp_receiver.SendRtcpFromRtpReceiver(NULL, NULL); | |
433 EXPECT_TRUE(rtcp_sender.Rtt(&rtt, &avg_rtt, &min_rtt, &max_rtt)); | |
434 EXPECT_NEAR(2 * kAddedShortDelay, rtt.InMilliseconds(), 2); | |
435 EXPECT_NEAR(2 * kAddedShortDelay, min_rtt.InMilliseconds(), 2); | |
436 EXPECT_NEAR(2 * kAddedDelay, max_rtt.InMilliseconds(), 2); | |
437 | |
438 rtcp_receiver.SendRtcpFromRtpReceiver(NULL, NULL); | |
439 EXPECT_TRUE(rtcp_sender.Rtt(&rtt, &avg_rtt, &min_rtt, &max_rtt)); | |
440 EXPECT_NEAR(2 * kAddedShortDelay, rtt.InMilliseconds(), 2); | |
441 EXPECT_NEAR(2 * kAddedShortDelay, min_rtt.InMilliseconds(), 2); | |
442 EXPECT_NEAR(2 * kAddedDelay, max_rtt.InMilliseconds(), 2); | |
443 } | |
444 | |
445 TEST_F(RtcpTest, RttWithPacketLoss) { | |
446 // Media receiver. | |
447 Rtcp rtcp_receiver(cast_environment_, | |
448 &mock_sender_feedback_, | |
449 NULL, | |
450 &receiver_to_sender_, | |
451 NULL, | |
452 kRtcpReducedSize, | |
453 base::TimeDelta::FromMilliseconds(kRtcpIntervalMs), | |
454 kReceiverSsrc, | |
455 kSenderSsrc, | |
456 kCName, | |
457 AUDIO_EVENT); | |
458 | |
459 // Media sender. | |
460 Rtcp rtcp_sender(cast_environment_, | |
461 &mock_sender_feedback_, | |
462 transport_sender_.get(), | |
463 NULL, | |
464 NULL, | |
465 kRtcpReducedSize, | |
466 base::TimeDelta::FromMilliseconds(kRtcpIntervalMs), | |
467 kSenderSsrc, | |
468 kReceiverSsrc, | |
469 kCName, | |
470 AUDIO_EVENT); | |
471 | |
472 receiver_to_sender_.set_rtcp_receiver(&rtcp_sender); | |
473 sender_to_receiver_.set_rtcp_receiver(&rtcp_receiver); | |
474 | |
475 rtcp_receiver.SendRtcpFromRtpReceiver(NULL, NULL); | |
476 rtcp_sender.SendRtcpFromRtpSender(testing_clock_->NowTicks(), 0); | |
477 RunTasks(33); | |
478 | |
479 base::TimeDelta rtt; | |
480 base::TimeDelta avg_rtt; | |
481 base::TimeDelta min_rtt; | |
482 base::TimeDelta max_rtt; | |
483 EXPECT_FALSE(rtcp_sender.Rtt(&rtt, &avg_rtt, &min_rtt, &max_rtt)); | |
484 EXPECT_TRUE(rtcp_receiver.Rtt(&rtt, &avg_rtt, &min_rtt, &max_rtt)); | |
485 EXPECT_NEAR(2 * kAddedDelay, rtt.InMilliseconds(), 1); | |
486 EXPECT_NEAR(2 * kAddedDelay, avg_rtt.InMilliseconds(), 1); | |
487 EXPECT_NEAR(2 * kAddedDelay, min_rtt.InMilliseconds(), 1); | |
488 EXPECT_NEAR(2 * kAddedDelay, max_rtt.InMilliseconds(), 1); | |
489 | |
490 receiver_to_sender_.set_short_delay(); | |
491 sender_to_receiver_.set_short_delay(); | |
492 receiver_to_sender_.set_drop_packets(true); | |
493 | |
494 rtcp_receiver.SendRtcpFromRtpReceiver(NULL, NULL); | |
495 rtcp_sender.SendRtcpFromRtpSender(testing_clock_->NowTicks(), 1); | |
496 RunTasks(33); | |
497 | |
498 EXPECT_TRUE(rtcp_receiver.Rtt(&rtt, &avg_rtt, &min_rtt, &max_rtt)); | |
499 EXPECT_NEAR(kAddedDelay + kAddedShortDelay, rtt.InMilliseconds(), 2); | |
500 } | |
501 | |
502 TEST_F(RtcpTest, NtpAndTime) { | |
503 const int64 kSecondsbetweenYear1900and2010 = INT64_C(40176 * 24 * 60 * 60); | |
504 const int64 kSecondsbetweenYear1900and2030 = INT64_C(47481 * 24 * 60 * 60); | |
505 | |
506 uint32 ntp_seconds_1 = 0; | |
507 uint32 ntp_fraction_1 = 0; | |
508 base::TimeTicks input_time = base::TimeTicks::Now(); | |
509 ConvertTimeTicksToNtp(input_time, &ntp_seconds_1, &ntp_fraction_1); | |
510 | |
511 // Verify absolute value. | |
512 EXPECT_GT(ntp_seconds_1, kSecondsbetweenYear1900and2010); | |
513 EXPECT_LT(ntp_seconds_1, kSecondsbetweenYear1900and2030); | |
514 | |
515 base::TimeTicks out_1 = ConvertNtpToTimeTicks(ntp_seconds_1, ntp_fraction_1); | |
516 EXPECT_EQ(input_time, out_1); // Verify inverse. | |
517 | |
518 base::TimeDelta time_delta = base::TimeDelta::FromMilliseconds(1000); | |
519 input_time += time_delta; | |
520 | |
521 uint32 ntp_seconds_2 = 0; | |
522 uint32 ntp_fraction_2 = 0; | |
523 | |
524 ConvertTimeTicksToNtp(input_time, &ntp_seconds_2, &ntp_fraction_2); | |
525 base::TimeTicks out_2 = ConvertNtpToTimeTicks(ntp_seconds_2, ntp_fraction_2); | |
526 EXPECT_EQ(input_time, out_2); // Verify inverse. | |
527 | |
528 // Verify delta. | |
529 EXPECT_EQ((out_2 - out_1), time_delta); | |
530 EXPECT_EQ((ntp_seconds_2 - ntp_seconds_1), UINT32_C(1)); | |
531 EXPECT_NEAR(ntp_fraction_2, ntp_fraction_1, 1); | |
532 | |
533 time_delta = base::TimeDelta::FromMilliseconds(500); | |
534 input_time += time_delta; | |
535 | |
536 uint32 ntp_seconds_3 = 0; | |
537 uint32 ntp_fraction_3 = 0; | |
538 | |
539 ConvertTimeTicksToNtp(input_time, &ntp_seconds_3, &ntp_fraction_3); | |
540 base::TimeTicks out_3 = ConvertNtpToTimeTicks(ntp_seconds_3, ntp_fraction_3); | |
541 EXPECT_EQ(input_time, out_3); // Verify inverse. | |
542 | |
543 // Verify delta. | |
544 EXPECT_EQ((out_3 - out_2), time_delta); | |
545 EXPECT_NEAR((ntp_fraction_3 - ntp_fraction_2), 0xffffffff / 2, 1); | |
546 } | |
547 | |
548 } // namespace cast | |
549 } // namespace media | |
OLD | NEW |