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.
5 #include "base/memory/scoped_ptr.h"
6 #include "base/test/simple_test_tick_clock.h"
7 #include "media/cast/cast_defines.h"
8 #include "media/cast/cast_environment.h"
9 #include "media/cast/net/cast_transport_defines.h"
10 #include "media/cast/net/pacing/paced_sender.h"
11 #include "media/cast/net/rtcp/receiver_rtcp_event_subscriber.h"
12 #include "media/cast/net/rtcp/rtcp_sender.h"
13 #include "media/cast/net/rtcp/rtcp_utility.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"
22 static const uint32 kSendingSsrc = 0x12345678;
23 static const uint32 kMediaSsrc = 0x87654321;
24 static const base::TimeDelta kDefaultDelay =
25 base::TimeDelta::FromMilliseconds(100);
27 RtcpReportBlock GetReportBlock() {
28 RtcpReportBlock report_block;
29 // Initialize remote_ssrc to a "clearly illegal" value.
30 report_block.remote_ssrc = 0xDEAD;
31 report_block.media_ssrc = kMediaSsrc; // SSRC of the RTP packet sender.
32 report_block.fraction_lost = kLoss >> 24;
33 report_block.cumulative_lost = kLoss; // 24 bits valid.
34 report_block.extended_high_sequence_number = kExtendedMax;
35 report_block.jitter = kTestJitter;
36 report_block.last_sr = kLastSr;
37 report_block.delay_since_last_sr = kDelayLastSr;
43 class TestRtcpTransport : public PacedPacketSender {
45 TestRtcpTransport() : packet_count_(0) {}
47 virtual bool SendRtcpPacket(uint32 ssrc,
48 PacketRef packet) OVERRIDE {
49 EXPECT_EQ(expected_packet_.size(), packet->data.size());
50 if (expected_packet_.size() != packet->data.size())
52 EXPECT_EQ(0, memcmp(&expected_packet_[0],
54 packet->data.size()));
59 virtual bool SendPackets(
60 const SendPacketVector& packets) OVERRIDE {
63 virtual bool ResendPackets(
64 const SendPacketVector& packets,
65 base::TimeDelta dedupe_window) OVERRIDE {
69 virtual void CancelSendingPacket(
70 const PacketKey& packet_key) OVERRIDE {
73 void SetExpectedRtcpPacket(scoped_ptr<Packet> packet) {
74 expected_packet_.swap(*packet);
77 int packet_count() const { return packet_count_; }
80 Packet expected_packet_;
83 DISALLOW_COPY_AND_ASSIGN(TestRtcpTransport);
86 class RtcpSenderTest : public ::testing::Test {
89 : testing_clock_(new base::SimpleTestTickClock()),
90 task_runner_(new test::FakeSingleThreadTaskRunner(testing_clock_)),
91 cast_environment_(new CastEnvironment(
92 scoped_ptr<base::TickClock>(testing_clock_).Pass(),
96 rtcp_sender_(new RtcpSender(&test_transport_, kSendingSsrc)) {}
98 base::SimpleTestTickClock* testing_clock_; // Owned by CastEnvironment.
99 TestRtcpTransport test_transport_;
100 scoped_refptr<test::FakeSingleThreadTaskRunner> task_runner_;
101 scoped_refptr<CastEnvironment> cast_environment_;
102 scoped_ptr<RtcpSender> rtcp_sender_;
104 DISALLOW_COPY_AND_ASSIGN(RtcpSenderTest);
107 TEST_F(RtcpSenderTest, RtcpReceiverReport) {
108 // Empty receiver report.
109 TestRtcpPacketBuilder p1;
110 p1.AddRr(kSendingSsrc, 0);
111 test_transport_.SetExpectedRtcpPacket(p1.GetPacket());
113 rtcp_sender_->SendRtcpFromRtpReceiver(
114 kRtcpRr, NULL, NULL, NULL, NULL, kDefaultDelay);
116 EXPECT_EQ(1, test_transport_.packet_count());
118 // Receiver report with report block.
119 TestRtcpPacketBuilder p2;
120 p2.AddRr(kSendingSsrc, 1);
121 p2.AddRb(kMediaSsrc);
122 test_transport_.SetExpectedRtcpPacket(p2.GetPacket().Pass());
124 RtcpReportBlock report_block = GetReportBlock();
126 rtcp_sender_->SendRtcpFromRtpReceiver(
127 kRtcpRr, &report_block, NULL, NULL, NULL, kDefaultDelay);
129 EXPECT_EQ(2, test_transport_.packet_count());
132 TEST_F(RtcpSenderTest, RtcpReceiverReportWithRrtr) {
133 // Receiver report with report block.
134 TestRtcpPacketBuilder p;
135 p.AddRr(kSendingSsrc, 1);
137 p.AddXrHeader(kSendingSsrc);
139 test_transport_.SetExpectedRtcpPacket(p.GetPacket().Pass());
141 RtcpReportBlock report_block = GetReportBlock();
143 RtcpReceiverReferenceTimeReport rrtr;
144 rrtr.ntp_seconds = kNtpHigh;
145 rrtr.ntp_fraction = kNtpLow;
147 rtcp_sender_->SendRtcpFromRtpReceiver(
155 EXPECT_EQ(1, test_transport_.packet_count());
158 TEST_F(RtcpSenderTest, RtcpReceiverReportWithCast) {
159 // Receiver report with report block.
160 TestRtcpPacketBuilder p;
161 p.AddRr(kSendingSsrc, 1);
163 p.AddCast(kSendingSsrc, kMediaSsrc, kDefaultDelay);
164 test_transport_.SetExpectedRtcpPacket(p.GetPacket().Pass());
166 RtcpReportBlock report_block = GetReportBlock();
168 RtcpCastMessage cast_message(kMediaSsrc);
169 cast_message.ack_frame_id = kAckFrameId;
170 PacketIdSet missing_packets;
171 cast_message.missing_frames_and_packets[kLostFrameId] = missing_packets;
173 missing_packets.insert(kLostPacketId1);
174 missing_packets.insert(kLostPacketId2);
175 missing_packets.insert(kLostPacketId3);
176 cast_message.missing_frames_and_packets[kFrameIdWithLostPackets] =
179 rtcp_sender_->SendRtcpFromRtpReceiver(
187 EXPECT_EQ(1, test_transport_.packet_count());
190 TEST_F(RtcpSenderTest, RtcpReceiverReportWithRrtraAndCastMessage) {
191 TestRtcpPacketBuilder p;
192 p.AddRr(kSendingSsrc, 1);
194 p.AddXrHeader(kSendingSsrc);
196 p.AddCast(kSendingSsrc, kMediaSsrc, kDefaultDelay);
197 test_transport_.SetExpectedRtcpPacket(p.GetPacket().Pass());
199 RtcpReportBlock report_block = GetReportBlock();
201 RtcpReceiverReferenceTimeReport rrtr;
202 rrtr.ntp_seconds = kNtpHigh;
203 rrtr.ntp_fraction = kNtpLow;
205 RtcpCastMessage cast_message(kMediaSsrc);
206 cast_message.ack_frame_id = kAckFrameId;
207 PacketIdSet missing_packets;
208 cast_message.missing_frames_and_packets[kLostFrameId] = missing_packets;
210 missing_packets.insert(kLostPacketId1);
211 missing_packets.insert(kLostPacketId2);
212 missing_packets.insert(kLostPacketId3);
213 cast_message.missing_frames_and_packets[kFrameIdWithLostPackets] =
216 rtcp_sender_->SendRtcpFromRtpReceiver(
217 kRtcpRr | kRtcpRrtr | kRtcpCast,
224 EXPECT_EQ(1, test_transport_.packet_count());
227 TEST_F(RtcpSenderTest, RtcpReceiverReportWithRrtrCastMessageAndLog) {
228 static const uint32 kTimeBaseMs = 12345678;
229 static const uint32 kTimeDelayMs = 10;
231 TestRtcpPacketBuilder p;
232 p.AddRr(kSendingSsrc, 1);
234 p.AddXrHeader(kSendingSsrc);
236 p.AddCast(kSendingSsrc, kMediaSsrc, kDefaultDelay);
237 test_transport_.SetExpectedRtcpPacket(p.GetPacket().Pass());
239 RtcpReportBlock report_block = GetReportBlock();
241 RtcpReceiverReferenceTimeReport rrtr;
242 rrtr.ntp_seconds = kNtpHigh;
243 rrtr.ntp_fraction = kNtpLow;
245 RtcpCastMessage cast_message(kMediaSsrc);
246 cast_message.ack_frame_id = kAckFrameId;
247 PacketIdSet missing_packets;
248 cast_message.missing_frames_and_packets[kLostFrameId] = missing_packets;
250 missing_packets.insert(kLostPacketId1);
251 missing_packets.insert(kLostPacketId2);
252 missing_packets.insert(kLostPacketId3);
253 cast_message.missing_frames_and_packets[kFrameIdWithLostPackets] =
256 ReceiverRtcpEventSubscriber event_subscriber(500, VIDEO_EVENT);
257 ReceiverRtcpEventSubscriber::RtcpEventMultiMap rtcp_events;
259 rtcp_sender_->SendRtcpFromRtpReceiver(
260 kRtcpRr | kRtcpRrtr | kRtcpCast |
268 base::SimpleTestTickClock testing_clock;
269 testing_clock.Advance(base::TimeDelta::FromMilliseconds(kTimeBaseMs));
271 p.AddReceiverLog(kSendingSsrc);
272 p.AddReceiverFrameLog(kRtpTimestamp, 2, kTimeBaseMs);
273 p.AddReceiverEventLog(0, FRAME_ACK_SENT, 0);
274 p.AddReceiverEventLog(kLostPacketId1, PACKET_RECEIVED, kTimeDelayMs);
276 test_transport_.SetExpectedRtcpPacket(p.GetPacket().Pass());
278 FrameEvent frame_event;
279 frame_event.rtp_timestamp = kRtpTimestamp;
280 frame_event.type = FRAME_ACK_SENT;
281 frame_event.media_type = VIDEO_EVENT;
282 frame_event.timestamp = testing_clock.NowTicks();
283 event_subscriber.OnReceiveFrameEvent(frame_event);
284 testing_clock.Advance(base::TimeDelta::FromMilliseconds(kTimeDelayMs));
286 PacketEvent packet_event;
287 packet_event.rtp_timestamp = kRtpTimestamp;
288 packet_event.type = PACKET_RECEIVED;
289 packet_event.media_type = VIDEO_EVENT;
290 packet_event.timestamp = testing_clock.NowTicks();
291 packet_event.packet_id = kLostPacketId1;
292 event_subscriber.OnReceivePacketEvent(packet_event);
293 event_subscriber.GetRtcpEventsAndReset(&rtcp_events);
294 EXPECT_EQ(2u, rtcp_events.size());
296 rtcp_sender_->SendRtcpFromRtpReceiver(
297 kRtcpRr | kRtcpRrtr | kRtcpCast |
305 EXPECT_EQ(2, test_transport_.packet_count());
308 TEST_F(RtcpSenderTest, RtcpReceiverReportWithOversizedFrameLog) {
309 static const uint32 kTimeBaseMs = 12345678;
310 static const uint32 kTimeDelayMs = 10;
312 TestRtcpPacketBuilder p;
313 p.AddRr(kSendingSsrc, 1);
316 RtcpReportBlock report_block = GetReportBlock();
318 base::SimpleTestTickClock testing_clock;
319 testing_clock.Advance(base::TimeDelta::FromMilliseconds(kTimeBaseMs));
321 p.AddReceiverLog(kSendingSsrc);
323 int remaining_bytes = kMaxReceiverLogBytes;
324 remaining_bytes -= kRtcpCastLogHeaderSize;
326 remaining_bytes -= kRtcpReceiverFrameLogSize;
327 int num_events = remaining_bytes / kRtcpReceiverEventLogSize;
328 EXPECT_LE(num_events, static_cast<int>(kRtcpMaxReceiverLogMessages));
329 // Only the last |num_events| events are sent due to receiver log size cap.
330 p.AddReceiverFrameLog(
331 kRtpTimestamp + 2345,
333 kTimeBaseMs + (kRtcpMaxReceiverLogMessages - num_events) * kTimeDelayMs);
334 for (int i = 0; i < num_events; i++) {
335 p.AddReceiverEventLog(
336 kLostPacketId1, PACKET_RECEIVED,
337 static_cast<uint16>(kTimeDelayMs * i));
340 test_transport_.SetExpectedRtcpPacket(p.GetPacket().Pass());
342 ReceiverRtcpEventSubscriber event_subscriber(500, VIDEO_EVENT);
343 FrameEvent frame_event;
344 frame_event.rtp_timestamp = kRtpTimestamp;
345 frame_event.type = FRAME_ACK_SENT;
346 frame_event.media_type = VIDEO_EVENT;
347 frame_event.timestamp = testing_clock.NowTicks();
348 event_subscriber.OnReceiveFrameEvent(frame_event);
350 for (size_t i = 0; i < kRtcpMaxReceiverLogMessages; ++i) {
351 PacketEvent packet_event;
352 packet_event.rtp_timestamp = kRtpTimestamp + 2345;
353 packet_event.type = PACKET_RECEIVED;
354 packet_event.media_type = VIDEO_EVENT;
355 packet_event.timestamp = testing_clock.NowTicks();
356 packet_event.packet_id = kLostPacketId1;
357 event_subscriber.OnReceivePacketEvent(packet_event);
358 testing_clock.Advance(base::TimeDelta::FromMilliseconds(kTimeDelayMs));
361 ReceiverRtcpEventSubscriber::RtcpEventMultiMap rtcp_events;
362 event_subscriber.GetRtcpEventsAndReset(&rtcp_events);
364 rtcp_sender_->SendRtcpFromRtpReceiver(
365 kRtcpRr | kRtcpReceiverLog,
372 EXPECT_EQ(1, test_transport_.packet_count());
375 TEST_F(RtcpSenderTest, RtcpReceiverReportWithTooManyLogFrames) {
376 static const uint32 kTimeBaseMs = 12345678;
377 static const uint32 kTimeDelayMs = 10;
379 TestRtcpPacketBuilder p;
380 p.AddRr(kSendingSsrc, 1);
383 RtcpReportBlock report_block = GetReportBlock();
385 base::SimpleTestTickClock testing_clock;
386 testing_clock.Advance(base::TimeDelta::FromMilliseconds(kTimeBaseMs));
388 p.AddReceiverLog(kSendingSsrc);
390 int remaining_bytes = kMaxReceiverLogBytes;
391 remaining_bytes -= kRtcpCastLogHeaderSize;
394 remaining_bytes / (kRtcpReceiverFrameLogSize + kRtcpReceiverEventLogSize);
396 // The last |num_events| events are sent due to receiver log size cap.
397 for (size_t i = kRtcpMaxReceiverLogMessages - num_events;
398 i < kRtcpMaxReceiverLogMessages;
400 p.AddReceiverFrameLog(kRtpTimestamp + i, 1, kTimeBaseMs + i * kTimeDelayMs);
401 p.AddReceiverEventLog(0, FRAME_ACK_SENT, 0);
403 test_transport_.SetExpectedRtcpPacket(p.GetPacket().Pass());
405 ReceiverRtcpEventSubscriber event_subscriber(500, VIDEO_EVENT);
407 for (size_t i = 0; i < kRtcpMaxReceiverLogMessages; ++i) {
408 FrameEvent frame_event;
409 frame_event.rtp_timestamp = kRtpTimestamp + static_cast<int>(i);
410 frame_event.type = FRAME_ACK_SENT;
411 frame_event.media_type = VIDEO_EVENT;
412 frame_event.timestamp = testing_clock.NowTicks();
413 event_subscriber.OnReceiveFrameEvent(frame_event);
414 testing_clock.Advance(base::TimeDelta::FromMilliseconds(kTimeDelayMs));
417 ReceiverRtcpEventSubscriber::RtcpEventMultiMap rtcp_events;
418 event_subscriber.GetRtcpEventsAndReset(&rtcp_events);
420 rtcp_sender_->SendRtcpFromRtpReceiver(
421 kRtcpRr | kRtcpReceiverLog,
428 EXPECT_EQ(1, test_transport_.packet_count());
431 TEST_F(RtcpSenderTest, RtcpReceiverReportWithOldLogFrames) {
432 static const uint32 kTimeBaseMs = 12345678;
434 TestRtcpPacketBuilder p;
435 p.AddRr(kSendingSsrc, 1);
438 RtcpReportBlock report_block = GetReportBlock();
440 base::SimpleTestTickClock testing_clock;
441 testing_clock.Advance(base::TimeDelta::FromMilliseconds(kTimeBaseMs));
443 p.AddReceiverLog(kSendingSsrc);
445 // Log 11 events for a single frame, each |kTimeBetweenEventsMs| apart.
446 // Only last 10 events will be sent because the first event is more than
447 // 4095 milliseconds away from latest event.
448 const int kTimeBetweenEventsMs = 410;
449 p.AddReceiverFrameLog(kRtpTimestamp, 10, kTimeBaseMs + kTimeBetweenEventsMs);
450 for (int i = 0; i < 10; ++i) {
451 p.AddReceiverEventLog(0, FRAME_ACK_SENT, i * kTimeBetweenEventsMs);
453 test_transport_.SetExpectedRtcpPacket(p.GetPacket().Pass());
455 ReceiverRtcpEventSubscriber event_subscriber(500, VIDEO_EVENT);
456 for (int i = 0; i < 11; ++i) {
457 FrameEvent frame_event;
458 frame_event.rtp_timestamp = kRtpTimestamp;
459 frame_event.type = FRAME_ACK_SENT;
460 frame_event.media_type = VIDEO_EVENT;
461 frame_event.timestamp = testing_clock.NowTicks();
462 event_subscriber.OnReceiveFrameEvent(frame_event);
463 testing_clock.Advance(
464 base::TimeDelta::FromMilliseconds(kTimeBetweenEventsMs));
467 ReceiverRtcpEventSubscriber::RtcpEventMultiMap rtcp_events;
468 event_subscriber.GetRtcpEventsAndReset(&rtcp_events);
470 rtcp_sender_->SendRtcpFromRtpReceiver(
471 kRtcpRr | kRtcpReceiverLog,
478 EXPECT_EQ(1, test_transport_.packet_count());
481 TEST_F(RtcpSenderTest, RtcpReceiverReportRedundancy) {
482 uint32 time_base_ms = 12345678;
483 int kTimeBetweenEventsMs = 10;
485 RtcpReportBlock report_block = GetReportBlock();
487 base::SimpleTestTickClock testing_clock;
488 testing_clock.Advance(base::TimeDelta::FromMilliseconds(time_base_ms));
490 ReceiverRtcpEventSubscriber event_subscriber(500, VIDEO_EVENT);
491 size_t packet_count = kReceiveLogMessageHistorySize + 10;
492 for (size_t i = 0; i < packet_count; i++) {
493 TestRtcpPacketBuilder p;
494 p.AddRr(kSendingSsrc, 1);
497 p.AddReceiverLog(kSendingSsrc);
499 if (i >= kSecondRedundancyOffset) {
500 p.AddReceiverFrameLog(
503 time_base_ms - kSecondRedundancyOffset * kTimeBetweenEventsMs);
504 p.AddReceiverEventLog(0, FRAME_ACK_SENT, 0);
506 if (i >= kFirstRedundancyOffset) {
507 p.AddReceiverFrameLog(
510 time_base_ms - kFirstRedundancyOffset * kTimeBetweenEventsMs);
511 p.AddReceiverEventLog(0, FRAME_ACK_SENT, 0);
513 p.AddReceiverFrameLog(kRtpTimestamp, 1, time_base_ms);
514 p.AddReceiverEventLog(0, FRAME_ACK_SENT, 0);
516 test_transport_.SetExpectedRtcpPacket(p.GetPacket().Pass());
518 FrameEvent frame_event;
519 frame_event.rtp_timestamp = kRtpTimestamp;
520 frame_event.type = FRAME_ACK_SENT;
521 frame_event.media_type = VIDEO_EVENT;
522 frame_event.timestamp = testing_clock.NowTicks();
523 event_subscriber.OnReceiveFrameEvent(frame_event);
525 ReceiverRtcpEventSubscriber::RtcpEventMultiMap rtcp_events;
526 event_subscriber.GetRtcpEventsAndReset(&rtcp_events);
528 rtcp_sender_->SendRtcpFromRtpReceiver(
529 kRtcpRr | kRtcpReceiverLog,
536 testing_clock.Advance(
537 base::TimeDelta::FromMilliseconds(kTimeBetweenEventsMs));
538 time_base_ms += kTimeBetweenEventsMs;
541 EXPECT_EQ(static_cast<int>(packet_count), test_transport_.packet_count());
544 TEST_F(RtcpSenderTest, RtcpSenderReport) {
545 RtcpSenderInfo sender_info;
546 sender_info.ntp_seconds = kNtpHigh;
547 sender_info.ntp_fraction = kNtpLow;
548 sender_info.rtp_timestamp = kRtpTimestamp;
549 sender_info.send_packet_count = kSendPacketCount;
550 sender_info.send_octet_count = kSendOctetCount;
552 RtcpDlrrReportBlock dlrr_rb;
553 dlrr_rb.last_rr = kLastRr;
554 dlrr_rb.delay_since_last_rr = kDelayLastRr;
557 TestRtcpPacketBuilder p;
558 p.AddSr(kSendingSsrc, 0);
559 test_transport_.SetExpectedRtcpPacket(p.GetPacket().Pass());
561 rtcp_sender_->SendRtcpFromRtpSender(kRtcpSr,
565 EXPECT_EQ(1, test_transport_.packet_count());
568 TEST_F(RtcpSenderTest, RtcpSenderReportWithDlrr) {
569 RtcpSenderInfo sender_info;
570 sender_info.ntp_seconds = kNtpHigh;
571 sender_info.ntp_fraction = kNtpLow;
572 sender_info.rtp_timestamp = kRtpTimestamp;
573 sender_info.send_packet_count = kSendPacketCount;
574 sender_info.send_octet_count = kSendOctetCount;
576 // Sender report + dlrr.
577 TestRtcpPacketBuilder p1;
578 p1.AddSr(kSendingSsrc, 0);
579 p1.AddXrHeader(kSendingSsrc);
580 p1.AddXrDlrrBlock(kSendingSsrc);
581 test_transport_.SetExpectedRtcpPacket(p1.GetPacket().Pass());
583 RtcpDlrrReportBlock dlrr_rb;
584 dlrr_rb.last_rr = kLastRr;
585 dlrr_rb.delay_since_last_rr = kDelayLastRr;
587 rtcp_sender_->SendRtcpFromRtpSender(
592 EXPECT_EQ(1, test_transport_.packet_count());