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.
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/rtcp/rtcp_sender.h"
10 #include "media/cast/rtcp/rtcp_utility.h"
11 #include "media/cast/rtcp/test_rtcp_packet_builder.h"
12 #include "media/cast/test/fake_task_runner.h"
13 #include "media/cast/transport/cast_transport_defines.h"
14 #include "media/cast/transport/pacing/paced_sender.h"
15 #include "testing/gmock/include/gmock/gmock.h"
21 static const uint32 kSendingSsrc
= 0x12345678;
22 static const uint32 kMediaSsrc
= 0x87654321;
23 static const std::string
kCName("test@10.1.1.1");
26 class TestRtcpTransport
: public transport::PacedPacketSender
{
29 : expected_packet_length_(0),
33 virtual bool SendRtcpPacket(const Packet
& packet
) OVERRIDE
{
34 EXPECT_EQ(expected_packet_length_
, packet
.size());
35 EXPECT_EQ(0, memcmp(expected_packet_
, &(packet
[0]), packet
.size()));
40 virtual bool SendPackets(const PacketList
& packets
) OVERRIDE
{
44 virtual bool ResendPackets(const PacketList
& packets
) OVERRIDE
{
48 void SetExpectedRtcpPacket(const uint8
* rtcp_buffer
, size_t length
) {
49 expected_packet_length_
= length
;
50 memcpy(expected_packet_
, rtcp_buffer
, length
);
53 int packet_count() const { return packet_count_
; }
56 uint8 expected_packet_
[kMaxIpPacketSize
];
57 size_t expected_packet_length_
;
61 class RtcpSenderTest
: public ::testing::Test
{
64 : task_runner_(new test::FakeTaskRunner(&testing_clock_
)),
65 cast_environment_(new CastEnvironment(&testing_clock_
, task_runner_
,
66 task_runner_
, task_runner_
, task_runner_
, task_runner_
,
67 task_runner_
, GetDefaultCastLoggingConfig())),
68 rtcp_sender_(new RtcpSender(cast_environment_
,
74 base::SimpleTestTickClock testing_clock_
;
75 TestRtcpTransport test_transport_
;
76 scoped_refptr
<test::FakeTaskRunner
> task_runner_
;
77 scoped_refptr
<CastEnvironment
> cast_environment_
;
78 scoped_ptr
<RtcpSender
> rtcp_sender_
;
81 TEST_F(RtcpSenderTest
, RtcpReceiverReport
) {
82 // Empty receiver report + c_name.
83 TestRtcpPacketBuilder p1
;
84 p1
.AddRr(kSendingSsrc
, 0);
85 p1
.AddSdesCname(kSendingSsrc
, kCName
);
86 test_transport_
.SetExpectedRtcpPacket(p1
.Packet(), p1
.Length());
88 rtcp_sender_
->SendRtcpFromRtpReceiver(RtcpSender::kRtcpRr
,
89 NULL
, NULL
, NULL
, NULL
);
91 EXPECT_EQ(1, test_transport_
.packet_count());
93 // Receiver report with report block + c_name.
94 TestRtcpPacketBuilder p2
;
95 p2
.AddRr(kSendingSsrc
, 1);
97 p2
.AddSdesCname(kSendingSsrc
, kCName
);
98 test_transport_
.SetExpectedRtcpPacket(p2
.Packet(), p2
.Length());
100 transport::RtcpReportBlock report_block
;
101 // Initialize remote_ssrc to a "clearly illegal" value.
102 report_block
.remote_ssrc
= 0xDEAD;
103 report_block
.media_ssrc
= kMediaSsrc
; // SSRC of the RTP packet sender.
104 report_block
.fraction_lost
= kLoss
>> 24;
105 report_block
.cumulative_lost
= kLoss
; // 24 bits valid.
106 report_block
.extended_high_sequence_number
= kExtendedMax
;
107 report_block
.jitter
= kTestJitter
;
108 report_block
.last_sr
= kLastSr
;
109 report_block
.delay_since_last_sr
= kDelayLastSr
;
111 rtcp_sender_
->SendRtcpFromRtpReceiver(RtcpSender::kRtcpRr
, &report_block
,
114 EXPECT_EQ(2, test_transport_
.packet_count());
117 TEST_F(RtcpSenderTest
, RtcpReceiverReportWithRrtr
) {
118 // Receiver report with report block + c_name.
119 TestRtcpPacketBuilder p
;
120 p
.AddRr(kSendingSsrc
, 1);
122 p
.AddSdesCname(kSendingSsrc
, kCName
);
123 p
.AddXrHeader(kSendingSsrc
);
125 test_transport_
.SetExpectedRtcpPacket(p
.Packet(), p
.Length());
127 transport::RtcpReportBlock report_block
;
128 // Initialize remote_ssrc to a "clearly illegal" value.
129 report_block
.remote_ssrc
= 0xDEAD;
130 report_block
.media_ssrc
= kMediaSsrc
; // SSRC of the RTP packet sender.
131 report_block
.fraction_lost
= kLoss
>> 24;
132 report_block
.cumulative_lost
= kLoss
; // 24 bits valid.
133 report_block
.extended_high_sequence_number
= kExtendedMax
;
134 report_block
.jitter
= kTestJitter
;
135 report_block
.last_sr
= kLastSr
;
136 report_block
.delay_since_last_sr
= kDelayLastSr
;
138 RtcpReceiverReferenceTimeReport rrtr
;
139 rrtr
.ntp_seconds
= kNtpHigh
;
140 rrtr
.ntp_fraction
= kNtpLow
;
142 rtcp_sender_
->SendRtcpFromRtpReceiver(
143 RtcpSender::kRtcpRr
| RtcpSender::kRtcpRrtr
,
149 EXPECT_EQ(1, test_transport_
.packet_count());
152 TEST_F(RtcpSenderTest
, RtcpReceiverReportWithCast
) {
153 // Receiver report with report block + c_name.
154 TestRtcpPacketBuilder p
;
155 p
.AddRr(kSendingSsrc
, 1);
157 p
.AddSdesCname(kSendingSsrc
, kCName
);
158 p
.AddCast(kSendingSsrc
, kMediaSsrc
);
159 test_transport_
.SetExpectedRtcpPacket(p
.Packet(), p
.Length());
161 transport::RtcpReportBlock report_block
;
162 // Initialize remote_ssrc to a "clearly illegal" value.
163 report_block
.remote_ssrc
= 0xDEAD;
164 report_block
.media_ssrc
= kMediaSsrc
; // SSRC of the RTP packet sender.
165 report_block
.fraction_lost
= kLoss
>> 24;
166 report_block
.cumulative_lost
= kLoss
; // 24 bits valid.
167 report_block
.extended_high_sequence_number
= kExtendedMax
;
168 report_block
.jitter
= kTestJitter
;
169 report_block
.last_sr
= kLastSr
;
170 report_block
.delay_since_last_sr
= kDelayLastSr
;
172 RtcpCastMessage
cast_message(kMediaSsrc
);
173 cast_message
.ack_frame_id_
= kAckFrameId
;
174 PacketIdSet missing_packets
;
175 cast_message
.missing_frames_and_packets_
[kLostFrameId
] = missing_packets
;
177 missing_packets
.insert(kLostPacketId1
);
178 missing_packets
.insert(kLostPacketId2
);
179 missing_packets
.insert(kLostPacketId3
);
180 cast_message
.missing_frames_and_packets_
[kFrameIdWithLostPackets
] =
183 rtcp_sender_
->SendRtcpFromRtpReceiver(
184 RtcpSender::kRtcpRr
| RtcpSender::kRtcpCast
,
190 EXPECT_EQ(1, test_transport_
.packet_count());
193 TEST_F(RtcpSenderTest
, RtcpReceiverReportWithRrtraAndCastMessage
) {
194 TestRtcpPacketBuilder p
;
195 p
.AddRr(kSendingSsrc
, 1);
197 p
.AddSdesCname(kSendingSsrc
, kCName
);
198 p
.AddXrHeader(kSendingSsrc
);
200 p
.AddCast(kSendingSsrc
, kMediaSsrc
);
201 test_transport_
.SetExpectedRtcpPacket(p
.Packet(), p
.Length());
203 transport::RtcpReportBlock report_block
;
204 // Initialize remote_ssrc to a "clearly illegal" value.
205 report_block
.remote_ssrc
= 0xDEAD;
206 report_block
.media_ssrc
= kMediaSsrc
; // SSRC of the RTP packet sender.
207 report_block
.fraction_lost
= kLoss
>> 24;
208 report_block
.cumulative_lost
= kLoss
; // 24 bits valid.
209 report_block
.extended_high_sequence_number
= kExtendedMax
;
210 report_block
.jitter
= kTestJitter
;
211 report_block
.last_sr
= kLastSr
;
212 report_block
.delay_since_last_sr
= kDelayLastSr
;
214 RtcpReceiverReferenceTimeReport rrtr
;
215 rrtr
.ntp_seconds
= kNtpHigh
;
216 rrtr
.ntp_fraction
= kNtpLow
;
218 RtcpCastMessage
cast_message(kMediaSsrc
);
219 cast_message
.ack_frame_id_
= kAckFrameId
;
220 PacketIdSet missing_packets
;
221 cast_message
.missing_frames_and_packets_
[kLostFrameId
] = missing_packets
;
223 missing_packets
.insert(kLostPacketId1
);
224 missing_packets
.insert(kLostPacketId2
);
225 missing_packets
.insert(kLostPacketId3
);
226 cast_message
.missing_frames_and_packets_
[kFrameIdWithLostPackets
] =
229 rtcp_sender_
->SendRtcpFromRtpReceiver(
230 RtcpSender::kRtcpRr
| RtcpSender::kRtcpRrtr
| RtcpSender::kRtcpCast
,
236 EXPECT_EQ(1, test_transport_
.packet_count());
239 TEST_F(RtcpSenderTest
, RtcpReceiverReportWithRrtrCastMessageAndLog
) {
240 static const uint32 kTimeBaseMs
= 12345678;
241 static const uint32 kTimeDelayMs
= 10;
242 static const uint32 kDelayDeltaMs
= 123;
244 TestRtcpPacketBuilder p
;
245 p
.AddRr(kSendingSsrc
, 1);
247 p
.AddSdesCname(kSendingSsrc
, kCName
);
248 p
.AddXrHeader(kSendingSsrc
);
250 p
.AddCast(kSendingSsrc
, kMediaSsrc
);
251 test_transport_
.SetExpectedRtcpPacket(p
.Packet(), p
.Length());
253 transport::RtcpReportBlock report_block
;
254 // Initialize remote_ssrc to a "clearly illegal" value.
255 report_block
.remote_ssrc
= 0xDEAD;
256 report_block
.media_ssrc
= kMediaSsrc
; // SSRC of the RTP packet sender.
257 report_block
.fraction_lost
= kLoss
>> 24;
258 report_block
.cumulative_lost
= kLoss
; // 24 bits valid.
259 report_block
.extended_high_sequence_number
= kExtendedMax
;
260 report_block
.jitter
= kTestJitter
;
261 report_block
.last_sr
= kLastSr
;
262 report_block
.delay_since_last_sr
= kDelayLastSr
;
264 RtcpReceiverReferenceTimeReport rrtr
;
265 rrtr
.ntp_seconds
= kNtpHigh
;
266 rrtr
.ntp_fraction
= kNtpLow
;
268 RtcpCastMessage
cast_message(kMediaSsrc
);
269 cast_message
.ack_frame_id_
= kAckFrameId
;
270 PacketIdSet missing_packets
;
271 cast_message
.missing_frames_and_packets_
[kLostFrameId
] = missing_packets
;
273 missing_packets
.insert(kLostPacketId1
);
274 missing_packets
.insert(kLostPacketId2
);
275 missing_packets
.insert(kLostPacketId3
);
276 cast_message
.missing_frames_and_packets_
[kFrameIdWithLostPackets
] =
279 // Test empty Log message.
280 RtcpReceiverLogMessage receiver_log
;
282 VLOG(0) << " Test empty Log " ;
283 rtcp_sender_
->SendRtcpFromRtpReceiver(
284 RtcpSender::kRtcpRr
| RtcpSender::kRtcpRrtr
| RtcpSender::kRtcpCast
|
285 RtcpSender::kRtcpReceiverLog
,
292 base::SimpleTestTickClock testing_clock
;
293 testing_clock
.Advance(base::TimeDelta::FromMilliseconds(kTimeBaseMs
));
295 p
.AddReceiverLog(kSendingSsrc
);
296 p
.AddReceiverFrameLog(kRtpTimestamp
, 2, kTimeBaseMs
);
297 p
.AddReceiverEventLog(kDelayDeltaMs
, 1, 0);
298 p
.AddReceiverEventLog(kLostPacketId1
, 6, kTimeDelayMs
);
300 test_transport_
.SetExpectedRtcpPacket(p
.Packet(), p
.Length());
302 RtcpReceiverFrameLogMessage
frame_log(kRtpTimestamp
);
303 RtcpReceiverEventLogMessage event_log
;
305 event_log
.type
= kAckSent
;
306 event_log
.event_timestamp
= testing_clock
.NowTicks();
307 event_log
.delay_delta
= base::TimeDelta::FromMilliseconds(kDelayDeltaMs
);
308 frame_log
.event_log_messages_
.push_back(event_log
);
310 testing_clock
.Advance(base::TimeDelta::FromMilliseconds(kTimeDelayMs
));
311 event_log
.type
= kPacketReceived
;
312 event_log
.event_timestamp
= testing_clock
.NowTicks();
313 event_log
.packet_id
= kLostPacketId1
;
314 frame_log
.event_log_messages_
.push_back(event_log
);
316 receiver_log
.push_back(frame_log
);
318 VLOG(0) << " Test Log " ;
319 rtcp_sender_
->SendRtcpFromRtpReceiver(
320 RtcpSender::kRtcpRr
| RtcpSender::kRtcpRrtr
| RtcpSender::kRtcpCast
|
321 RtcpSender::kRtcpReceiverLog
,
327 EXPECT_TRUE(receiver_log
.empty());
328 EXPECT_EQ(2, test_transport_
.packet_count());
331 TEST_F(RtcpSenderTest
, RtcpReceiverReportWithOversizedFrameLog
) {
332 static const uint32 kTimeBaseMs
= 12345678;
333 static const uint32 kTimeDelayMs
= 10;
334 static const uint32 kDelayDeltaMs
= 123;
336 TestRtcpPacketBuilder p
;
337 p
.AddRr(kSendingSsrc
, 1);
339 p
.AddSdesCname(kSendingSsrc
, kCName
);
341 transport::RtcpReportBlock report_block
;
342 // Initialize remote_ssrc to a "clearly illegal" value.
343 report_block
.remote_ssrc
= 0xDEAD;
344 report_block
.media_ssrc
= kMediaSsrc
; // SSRC of the RTP packet sender.
345 report_block
.fraction_lost
= kLoss
>> 24;
346 report_block
.cumulative_lost
= kLoss
; // 24 bits valid.
347 report_block
.extended_high_sequence_number
= kExtendedMax
;
348 report_block
.jitter
= kTestJitter
;
349 report_block
.last_sr
= kLastSr
;
350 report_block
.delay_since_last_sr
= kDelayLastSr
;
352 base::SimpleTestTickClock testing_clock
;
353 testing_clock
.Advance(base::TimeDelta::FromMilliseconds(kTimeBaseMs
));
355 p
.AddReceiverLog(kSendingSsrc
);
357 p
.AddReceiverFrameLog(kRtpTimestamp
, 1, kTimeBaseMs
);
358 p
.AddReceiverEventLog(kDelayDeltaMs
, 1, 0);
359 p
.AddReceiverFrameLog(kRtpTimestamp
+ 2345,
360 kRtcpMaxReceiverLogMessages
, kTimeBaseMs
);
362 for (size_t i
= 0; i
< kRtcpMaxReceiverLogMessages
; ++i
) {
363 p
.AddReceiverEventLog(
364 kLostPacketId1
, 6, static_cast<uint16
>(kTimeDelayMs
* i
));
367 test_transport_
.SetExpectedRtcpPacket(p
.Packet(), p
.Length());
369 RtcpReceiverFrameLogMessage
frame_1_log(kRtpTimestamp
);
370 RtcpReceiverEventLogMessage event_log
;
372 event_log
.type
= kAckSent
;
373 event_log
.event_timestamp
= testing_clock
.NowTicks();
374 event_log
.delay_delta
= base::TimeDelta::FromMilliseconds(kDelayDeltaMs
);
375 frame_1_log
.event_log_messages_
.push_back(event_log
);
377 RtcpReceiverLogMessage receiver_log
;
378 receiver_log
.push_back(frame_1_log
);
380 RtcpReceiverFrameLogMessage
frame_2_log(kRtpTimestamp
+ 2345);
382 for (int j
= 0; j
< 300; ++j
) {
383 event_log
.type
= kPacketReceived
;
384 event_log
.event_timestamp
= testing_clock
.NowTicks();
385 event_log
.packet_id
= kLostPacketId1
;
386 frame_2_log
.event_log_messages_
.push_back(event_log
);
387 testing_clock
.Advance(base::TimeDelta::FromMilliseconds(kTimeDelayMs
));
389 receiver_log
.push_back(frame_2_log
);
391 rtcp_sender_
->SendRtcpFromRtpReceiver(
392 RtcpSender::kRtcpRr
| RtcpSender::kRtcpReceiverLog
,
398 EXPECT_EQ(1, test_transport_
.packet_count());
399 EXPECT_EQ(1u, receiver_log
.size());
400 EXPECT_EQ(300u - kRtcpMaxReceiverLogMessages
,
401 receiver_log
.front().event_log_messages_
.size());
404 TEST_F(RtcpSenderTest
, RtcpReceiverReportWithTooManyLogFrames
) {
405 static const uint32 kTimeBaseMs
= 12345678;
406 static const uint32 kTimeDelayMs
= 10;
407 static const uint32 kDelayDeltaMs
= 123;
409 TestRtcpPacketBuilder p
;
410 p
.AddRr(kSendingSsrc
, 1);
412 p
.AddSdesCname(kSendingSsrc
, kCName
);
414 transport::RtcpReportBlock report_block
;
415 // Initialize remote_ssrc to a "clearly illegal" value.
416 report_block
.remote_ssrc
= 0xDEAD;
417 report_block
.media_ssrc
= kMediaSsrc
; // SSRC of the RTP packet sender.
418 report_block
.fraction_lost
= kLoss
>> 24;
419 report_block
.cumulative_lost
= kLoss
; // 24 bits valid.
420 report_block
.extended_high_sequence_number
= kExtendedMax
;
421 report_block
.jitter
= kTestJitter
;
422 report_block
.last_sr
= kLastSr
;
423 report_block
.delay_since_last_sr
= kDelayLastSr
;
425 base::SimpleTestTickClock testing_clock
;
426 testing_clock
.Advance(base::TimeDelta::FromMilliseconds(kTimeBaseMs
));
428 p
.AddReceiverLog(kSendingSsrc
);
430 for (int i
= 0; i
< 119; ++i
) {
431 p
.AddReceiverFrameLog(kRtpTimestamp
, 1, kTimeBaseMs
+ i
* kTimeDelayMs
);
432 p
.AddReceiverEventLog(kDelayDeltaMs
, 1, 0);
434 test_transport_
.SetExpectedRtcpPacket(p
.Packet(), p
.Length());
436 RtcpReceiverLogMessage receiver_log
;
438 for (int j
= 0; j
< 200; ++j
) {
439 RtcpReceiverFrameLogMessage
frame_log(kRtpTimestamp
);
440 RtcpReceiverEventLogMessage event_log
;
442 event_log
.type
= kAckSent
;
443 event_log
.event_timestamp
= testing_clock
.NowTicks();
444 event_log
.delay_delta
= base::TimeDelta::FromMilliseconds(kDelayDeltaMs
);
445 frame_log
.event_log_messages_
.push_back(event_log
);
446 receiver_log
.push_back(frame_log
);
447 testing_clock
.Advance(base::TimeDelta::FromMilliseconds(kTimeDelayMs
));
449 rtcp_sender_
->SendRtcpFromRtpReceiver(
450 RtcpSender::kRtcpRr
| RtcpSender::kRtcpReceiverLog
,
456 EXPECT_EQ(1, test_transport_
.packet_count());
457 EXPECT_EQ(81u, receiver_log
.size());