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
3 // found in the LICENSE file.
7 #include "base/test/simple_test_tick_clock.h"
8 #include "media/cast/cast_defines.h"
9 #include "media/cast/net/cast_transport_config.h"
10 #include "media/cast/net/cast_transport_sender_impl.h"
11 #include "media/cast/net/pacing/paced_sender.h"
12 #include "media/cast/net/rtcp/mock_rtcp_receiver_feedback.h"
13 #include "media/cast/net/rtcp/rtcp.h"
14 #include "media/cast/net/rtcp/test_rtcp_packet_builder.h"
15 #include "media/cast/test/fake_single_thread_task_runner.h"
16 #include "testing/gmock/include/gmock/gmock.h"
23 static const uint32 kSenderSsrc = 0x10203;
24 static const uint32 kReceiverSsrc = 0x40506;
25 static const int64 kAddedDelay = 123;
26 static const int64 kAddedShortDelay = 100;
28 class RtcpTestPacketSender : public PacketSender {
30 explicit RtcpTestPacketSender(base::SimpleTestTickClock* testing_clock)
31 : drop_packets_(false),
34 testing_clock_(testing_clock) {}
35 virtual ~RtcpTestPacketSender() {}
36 // Packet lists imply a RTP packet.
37 void set_rtcp_receiver(Rtcp* rtcp) { rtcp_receiver_ = rtcp; }
39 void set_short_delay() { short_delay_ = true; }
41 void set_drop_packets(bool drop_packets) { drop_packets_ = drop_packets; }
43 // A singular packet implies a RTCP packet.
44 virtual bool SendPacket(PacketRef packet,
45 const base::Closure& cb) OVERRIDE {
47 testing_clock_->Advance(
48 base::TimeDelta::FromMilliseconds(kAddedShortDelay));
50 testing_clock_->Advance(base::TimeDelta::FromMilliseconds(kAddedDelay));
55 rtcp_receiver_->IncomingRtcpPacket(&packet->data[0], packet->data.size());
63 base::SimpleTestTickClock* testing_clock_;
65 DISALLOW_COPY_AND_ASSIGN(RtcpTestPacketSender);
68 class LocalRtcpTransport : public PacedPacketSender {
70 explicit LocalRtcpTransport(base::SimpleTestTickClock* testing_clock)
71 : drop_packets_(false),
73 testing_clock_(testing_clock) {}
75 void set_rtcp_receiver(Rtcp* rtcp) { rtcp_ = rtcp; }
77 void set_short_delay() { short_delay_ = true; }
79 void set_drop_packets(bool drop_packets) { drop_packets_ = drop_packets; }
81 virtual bool SendRtcpPacket(uint32 ssrc,
82 PacketRef packet) OVERRIDE {
84 testing_clock_->Advance(
85 base::TimeDelta::FromMilliseconds(kAddedShortDelay));
87 testing_clock_->Advance(base::TimeDelta::FromMilliseconds(kAddedDelay));
92 rtcp_->IncomingRtcpPacket(&packet->data[0], packet->data.size());
96 virtual bool SendPackets(
97 const SendPacketVector& packets) OVERRIDE {
101 virtual bool ResendPackets(
102 const SendPacketVector& packets,
103 base::TimeDelta dedupe_window) OVERRIDE {
107 virtual void CancelSendingPacket(
108 const PacketKey& packet_key) OVERRIDE {
115 base::SimpleTestTickClock* testing_clock_;
117 DISALLOW_COPY_AND_ASSIGN(LocalRtcpTransport);
120 class MockReceiverStats : public RtpReceiverStatistics {
122 MockReceiverStats() {}
123 virtual ~MockReceiverStats() {}
125 virtual void GetStatistics(uint8* fraction_lost,
126 uint32* cumulative_lost,
127 uint32* extended_high_sequence_number,
128 uint32* jitter) OVERRIDE {
130 *cumulative_lost = 0;
131 *extended_high_sequence_number = 0;
136 DISALLOW_COPY_AND_ASSIGN(MockReceiverStats);
139 class MockFrameSender {
142 virtual ~MockFrameSender() {}
144 MOCK_METHOD1(OnReceivedCastFeedback,
145 void(const RtcpCastMessage& cast_message));
146 MOCK_METHOD4(OnReceivedRtt,
147 void(base::TimeDelta rtt,
148 base::TimeDelta avg_rtt,
149 base::TimeDelta min_rtt,
150 base::TimeDelta max_rtt));
152 DISALLOW_COPY_AND_ASSIGN(MockFrameSender);
155 class RtcpTest : public ::testing::Test {
158 : testing_clock_(new base::SimpleTestTickClock()),
159 task_runner_(new test::FakeSingleThreadTaskRunner(testing_clock_)),
160 sender_to_receiver_(testing_clock_),
161 receiver_to_sender_(testing_clock_) {
162 testing_clock_->Advance(base::TimeTicks::Now() - base::TimeTicks());
165 virtual ~RtcpTest() {}
167 static void UpdateCastTransportStatus(CastTransportStatus status) {
168 bool result = (status == TRANSPORT_AUDIO_INITIALIZED ||
169 status == TRANSPORT_VIDEO_INITIALIZED);
173 void RunTasks(int during_ms) {
174 for (int i = 0; i < during_ms; ++i) {
175 // Call process the timers every 1 ms.
176 testing_clock_->Advance(base::TimeDelta::FromMilliseconds(1));
177 task_runner_->RunTasks();
181 base::SimpleTestTickClock* testing_clock_; // Owned by CastEnvironment.
182 scoped_refptr<test::FakeSingleThreadTaskRunner> task_runner_;
183 LocalRtcpTransport sender_to_receiver_;
184 LocalRtcpTransport receiver_to_sender_;
185 MockFrameSender mock_frame_sender_;
186 MockReceiverStats stats_;
188 DISALLOW_COPY_AND_ASSIGN(RtcpTest);
191 TEST_F(RtcpTest, BasicSenderReport) {
192 Rtcp rtcp(base::Bind(&MockFrameSender::OnReceivedCastFeedback,
193 base::Unretained(&mock_frame_sender_)),
194 base::Bind(&MockFrameSender::OnReceivedRtt,
195 base::Unretained(&mock_frame_sender_)),
196 RtcpLogMessageCallback(),
198 &sender_to_receiver_,
201 sender_to_receiver_.set_rtcp_receiver(&rtcp);
202 rtcp.SendRtcpFromRtpSender(base::TimeTicks(), 0, 1, 1);
205 TEST_F(RtcpTest, BasicReceiverReport) {
206 Rtcp rtcp(base::Bind(&MockFrameSender::OnReceivedCastFeedback,
207 base::Unretained(&mock_frame_sender_)),
208 base::Bind(&MockFrameSender::OnReceivedRtt,
209 base::Unretained(&mock_frame_sender_)),
210 RtcpLogMessageCallback(),
212 &receiver_to_sender_,
215 receiver_to_sender_.set_rtcp_receiver(&rtcp);
216 rtcp.SendRtcpFromRtpReceiver(NULL, base::TimeDelta(), NULL, &stats_);
219 TEST_F(RtcpTest, BasicCast) {
220 EXPECT_CALL(mock_frame_sender_, OnReceivedCastFeedback(_)).Times(1);
223 Rtcp rtcp(base::Bind(&MockFrameSender::OnReceivedCastFeedback,
224 base::Unretained(&mock_frame_sender_)),
225 base::Bind(&MockFrameSender::OnReceivedRtt,
226 base::Unretained(&mock_frame_sender_)),
227 RtcpLogMessageCallback(),
229 &receiver_to_sender_,
232 receiver_to_sender_.set_rtcp_receiver(&rtcp);
233 RtcpCastMessage cast_message(kSenderSsrc);
234 cast_message.ack_frame_id = kAckFrameId;
235 PacketIdSet missing_packets;
236 cast_message.missing_frames_and_packets[kLostFrameId] = missing_packets;
238 missing_packets.insert(kLostPacketId1);
239 missing_packets.insert(kLostPacketId2);
240 missing_packets.insert(kLostPacketId3);
241 cast_message.missing_frames_and_packets[kFrameIdWithLostPackets] =
243 rtcp.SendRtcpFromRtpReceiver(&cast_message, base::TimeDelta(), NULL, NULL);
246 TEST_F(RtcpTest, RttReducedSizeRtcp) {
248 Rtcp rtcp_receiver(RtcpCastMessageCallback(),
250 RtcpLogMessageCallback(),
252 &receiver_to_sender_,
257 Rtcp rtcp_sender(base::Bind(&MockFrameSender::OnReceivedCastFeedback,
258 base::Unretained(&mock_frame_sender_)),
259 base::Bind(&MockFrameSender::OnReceivedRtt,
260 base::Unretained(&mock_frame_sender_)),
261 RtcpLogMessageCallback(),
263 &sender_to_receiver_,
267 sender_to_receiver_.set_rtcp_receiver(&rtcp_receiver);
268 receiver_to_sender_.set_rtcp_receiver(&rtcp_sender);
271 base::TimeDelta avg_rtt;
272 base::TimeDelta min_rtt;
273 base::TimeDelta max_rtt;
274 EXPECT_FALSE(rtcp_sender.Rtt(&rtt, &avg_rtt, &min_rtt, &max_rtt));
275 EXPECT_FALSE(rtcp_receiver.Rtt(&rtt, &avg_rtt, &min_rtt, &max_rtt));
277 rtcp_sender.SendRtcpFromRtpSender(testing_clock_->NowTicks(), 1, 1, 1);
279 rtcp_receiver.SendRtcpFromRtpReceiver(NULL, base::TimeDelta(), NULL, &stats_);
280 EXPECT_TRUE(rtcp_sender.Rtt(&rtt, &avg_rtt, &min_rtt, &max_rtt));
281 EXPECT_FALSE(rtcp_receiver.Rtt(&rtt, &avg_rtt, &min_rtt, &max_rtt));
282 EXPECT_NEAR(2 * kAddedDelay, rtt.InMilliseconds(), 2);
283 EXPECT_NEAR(2 * kAddedDelay, avg_rtt.InMilliseconds(), 2);
284 EXPECT_NEAR(2 * kAddedDelay, min_rtt.InMilliseconds(), 2);
285 EXPECT_NEAR(2 * kAddedDelay, max_rtt.InMilliseconds(), 2);
286 rtcp_sender.SendRtcpFromRtpSender(testing_clock_->NowTicks(), 2, 1, 1);
288 EXPECT_TRUE(rtcp_receiver.Rtt(&rtt, &avg_rtt, &min_rtt, &max_rtt));
290 EXPECT_NEAR(2 * kAddedDelay, rtt.InMilliseconds(), 2);
291 EXPECT_NEAR(2 * kAddedDelay, avg_rtt.InMilliseconds(), 2);
292 EXPECT_NEAR(2 * kAddedDelay, min_rtt.InMilliseconds(), 2);
293 EXPECT_NEAR(2 * kAddedDelay, max_rtt.InMilliseconds(), 2);
296 TEST_F(RtcpTest, Rtt) {
298 Rtcp rtcp_receiver(RtcpCastMessageCallback(),
300 RtcpLogMessageCallback(),
302 &receiver_to_sender_,
307 Rtcp rtcp_sender(base::Bind(&MockFrameSender::OnReceivedCastFeedback,
308 base::Unretained(&mock_frame_sender_)),
309 base::Bind(&MockFrameSender::OnReceivedRtt,
310 base::Unretained(&mock_frame_sender_)),
311 RtcpLogMessageCallback(),
313 &sender_to_receiver_,
317 receiver_to_sender_.set_rtcp_receiver(&rtcp_sender);
318 sender_to_receiver_.set_rtcp_receiver(&rtcp_receiver);
321 base::TimeDelta avg_rtt;
322 base::TimeDelta min_rtt;
323 base::TimeDelta max_rtt;
324 EXPECT_FALSE(rtcp_sender.Rtt(&rtt, &avg_rtt, &min_rtt, &max_rtt));
325 EXPECT_FALSE(rtcp_receiver.Rtt(&rtt, &avg_rtt, &min_rtt, &max_rtt));
327 rtcp_sender.SendRtcpFromRtpSender(testing_clock_->NowTicks(), 1, 1, 1);
329 rtcp_receiver.SendRtcpFromRtpReceiver(NULL, base::TimeDelta(), NULL, &stats_);
331 EXPECT_TRUE(rtcp_sender.Rtt(&rtt, &avg_rtt, &min_rtt, &max_rtt));
334 EXPECT_FALSE(rtcp_receiver.Rtt(&rtt, &avg_rtt, &min_rtt, &max_rtt));
337 EXPECT_NEAR(2 * kAddedDelay, rtt.InMilliseconds(), 2);
338 EXPECT_NEAR(2 * kAddedDelay, avg_rtt.InMilliseconds(), 2);
339 EXPECT_NEAR(2 * kAddedDelay, min_rtt.InMilliseconds(), 2);
340 EXPECT_NEAR(2 * kAddedDelay, max_rtt.InMilliseconds(), 2);
342 rtcp_sender.SendRtcpFromRtpSender(testing_clock_->NowTicks(), 2, 1, 1);
344 EXPECT_TRUE(rtcp_receiver.Rtt(&rtt, &avg_rtt, &min_rtt, &max_rtt));
345 EXPECT_NEAR(2 * kAddedDelay, rtt.InMilliseconds(), 2);
346 EXPECT_NEAR(2 * kAddedDelay, avg_rtt.InMilliseconds(), 2);
347 EXPECT_NEAR(2 * kAddedDelay, min_rtt.InMilliseconds(), 2);
348 EXPECT_NEAR(2 * kAddedDelay, max_rtt.InMilliseconds(), 2);
350 receiver_to_sender_.set_short_delay();
351 sender_to_receiver_.set_short_delay();
352 rtcp_receiver.SendRtcpFromRtpReceiver(NULL, base::TimeDelta(), NULL, &stats_);
353 EXPECT_TRUE(rtcp_sender.Rtt(&rtt, &avg_rtt, &min_rtt, &max_rtt));
354 EXPECT_NEAR(kAddedDelay + kAddedShortDelay, rtt.InMilliseconds(), 2);
356 (kAddedShortDelay + 3 * kAddedDelay) / 2, avg_rtt.InMilliseconds(), 2);
357 EXPECT_NEAR(kAddedDelay + kAddedShortDelay, min_rtt.InMilliseconds(), 2);
358 EXPECT_NEAR(2 * kAddedDelay, max_rtt.InMilliseconds(), 2);
360 rtcp_sender.SendRtcpFromRtpSender(testing_clock_->NowTicks(), 3, 1, 1);
362 EXPECT_TRUE(rtcp_receiver.Rtt(&rtt, &avg_rtt, &min_rtt, &max_rtt));
363 EXPECT_NEAR(2 * kAddedShortDelay, rtt.InMilliseconds(), 1);
364 EXPECT_NEAR((2 * kAddedShortDelay + 2 * kAddedDelay) / 2,
365 avg_rtt.InMilliseconds(),
367 EXPECT_NEAR(2 * kAddedShortDelay, min_rtt.InMilliseconds(), 2);
368 EXPECT_NEAR(2 * kAddedDelay, max_rtt.InMilliseconds(), 2);
370 rtcp_receiver.SendRtcpFromRtpReceiver(NULL, base::TimeDelta(), NULL, &stats_);
371 EXPECT_TRUE(rtcp_sender.Rtt(&rtt, &avg_rtt, &min_rtt, &max_rtt));
372 EXPECT_NEAR(2 * kAddedShortDelay, rtt.InMilliseconds(), 2);
373 EXPECT_NEAR(2 * kAddedShortDelay, min_rtt.InMilliseconds(), 2);
374 EXPECT_NEAR(2 * kAddedDelay, max_rtt.InMilliseconds(), 2);
376 rtcp_receiver.SendRtcpFromRtpReceiver(NULL, base::TimeDelta(), NULL, &stats_);
377 EXPECT_TRUE(rtcp_sender.Rtt(&rtt, &avg_rtt, &min_rtt, &max_rtt));
378 EXPECT_NEAR(2 * kAddedShortDelay, rtt.InMilliseconds(), 2);
379 EXPECT_NEAR(2 * kAddedShortDelay, min_rtt.InMilliseconds(), 2);
380 EXPECT_NEAR(2 * kAddedDelay, max_rtt.InMilliseconds(), 2);
383 TEST_F(RtcpTest, RttWithPacketLoss) {
385 Rtcp rtcp_receiver(RtcpCastMessageCallback(),
387 RtcpLogMessageCallback(),
389 &receiver_to_sender_,
394 Rtcp rtcp_sender(base::Bind(&MockFrameSender::OnReceivedCastFeedback,
395 base::Unretained(&mock_frame_sender_)),
396 base::Bind(&MockFrameSender::OnReceivedRtt,
397 base::Unretained(&mock_frame_sender_)),
398 RtcpLogMessageCallback(),
400 &sender_to_receiver_,
404 receiver_to_sender_.set_rtcp_receiver(&rtcp_sender);
405 sender_to_receiver_.set_rtcp_receiver(&rtcp_receiver);
407 rtcp_receiver.SendRtcpFromRtpReceiver(NULL, base::TimeDelta(), NULL, &stats_);
408 rtcp_sender.SendRtcpFromRtpSender(testing_clock_->NowTicks(), 0, 1, 1);
412 base::TimeDelta avg_rtt;
413 base::TimeDelta min_rtt;
414 base::TimeDelta max_rtt;
415 EXPECT_FALSE(rtcp_sender.Rtt(&rtt, &avg_rtt, &min_rtt, &max_rtt));
416 EXPECT_TRUE(rtcp_receiver.Rtt(&rtt, &avg_rtt, &min_rtt, &max_rtt));
417 EXPECT_NEAR(2 * kAddedDelay, rtt.InMilliseconds(), 1);
418 EXPECT_NEAR(2 * kAddedDelay, avg_rtt.InMilliseconds(), 1);
419 EXPECT_NEAR(2 * kAddedDelay, min_rtt.InMilliseconds(), 1);
420 EXPECT_NEAR(2 * kAddedDelay, max_rtt.InMilliseconds(), 1);
422 receiver_to_sender_.set_short_delay();
423 sender_to_receiver_.set_short_delay();
424 receiver_to_sender_.set_drop_packets(true);
426 rtcp_receiver.SendRtcpFromRtpReceiver(NULL, base::TimeDelta(), NULL, &stats_);
427 rtcp_sender.SendRtcpFromRtpSender(testing_clock_->NowTicks(), 1, 1, 1);
430 EXPECT_TRUE(rtcp_receiver.Rtt(&rtt, &avg_rtt, &min_rtt, &max_rtt));
431 EXPECT_NEAR(kAddedDelay + kAddedShortDelay, rtt.InMilliseconds(), 2);
434 TEST_F(RtcpTest, NtpAndTime) {
435 const int64 kSecondsbetweenYear1900and2010 = INT64_C(40176 * 24 * 60 * 60);
436 const int64 kSecondsbetweenYear1900and2030 = INT64_C(47481 * 24 * 60 * 60);
438 uint32 ntp_seconds_1 = 0;
439 uint32 ntp_fraction_1 = 0;
440 base::TimeTicks input_time = base::TimeTicks::Now();
441 ConvertTimeTicksToNtp(input_time, &ntp_seconds_1, &ntp_fraction_1);
443 // Verify absolute value.
444 EXPECT_GT(ntp_seconds_1, kSecondsbetweenYear1900and2010);
445 EXPECT_LT(ntp_seconds_1, kSecondsbetweenYear1900and2030);
447 base::TimeTicks out_1 = ConvertNtpToTimeTicks(ntp_seconds_1, ntp_fraction_1);
448 EXPECT_EQ(input_time, out_1); // Verify inverse.
450 base::TimeDelta time_delta = base::TimeDelta::FromMilliseconds(1000);
451 input_time += time_delta;
453 uint32 ntp_seconds_2 = 0;
454 uint32 ntp_fraction_2 = 0;
456 ConvertTimeTicksToNtp(input_time, &ntp_seconds_2, &ntp_fraction_2);
457 base::TimeTicks out_2 = ConvertNtpToTimeTicks(ntp_seconds_2, ntp_fraction_2);
458 EXPECT_EQ(input_time, out_2); // Verify inverse.
461 EXPECT_EQ((out_2 - out_1), time_delta);
462 EXPECT_EQ((ntp_seconds_2 - ntp_seconds_1), UINT32_C(1));
463 EXPECT_NEAR(ntp_fraction_2, ntp_fraction_1, 1);
465 time_delta = base::TimeDelta::FromMilliseconds(500);
466 input_time += time_delta;
468 uint32 ntp_seconds_3 = 0;
469 uint32 ntp_fraction_3 = 0;
471 ConvertTimeTicksToNtp(input_time, &ntp_seconds_3, &ntp_fraction_3);
472 base::TimeTicks out_3 = ConvertNtpToTimeTicks(ntp_seconds_3, ntp_fraction_3);
473 EXPECT_EQ(input_time, out_3); // Verify inverse.
476 EXPECT_EQ((out_3 - out_2), time_delta);
477 EXPECT_NEAR((ntp_fraction_3 - ntp_fraction_2), 0xffffffff / 2, 1);