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 "media/cast/rtcp/mock_rtcp_receiver_feedback.h"
7 #include "media/cast/rtcp/mock_rtcp_sender_feedback.h"
8 #include "media/cast/rtcp/rtcp_receiver.h"
9 #include "media/cast/rtcp/rtcp_utility.h"
10 #include "media/cast/rtcp/test_rtcp_packet_builder.h"
11 #include "testing/gmock/include/gmock/gmock.h"
18 static const uint32 kSenderSsrc = 0x10203;
19 static const uint32 kSourceSsrc = 0x40506;
20 static const uint32 kUnknownSsrc = 0xDEAD;
21 static const std::string kCName("test@10.1.1.1");
23 class SenderFeedbackCastVerification : public RtcpSenderFeedback {
25 SenderFeedbackCastVerification() : called_(false) {}
26 virtual void OnReceivedReportBlock(
27 const RtcpReportBlock& report_block) OVERRIDE {};
28 virtual void OnReceivedIntraFrameRequest() OVERRIDE {};
29 virtual void OnReceivedRpsi(uint8 payload_type,
30 uint64 picture_id) OVERRIDE {};
31 virtual void OnReceivedRemb(uint32 bitrate) OVERRIDE {};
32 virtual void OnReceivedNackRequest(
33 const std::list<uint16>& nack_sequence_numbers) OVERRIDE {};
35 virtual void OnReceivedCastFeedback(
36 const RtcpCastMessage& cast_feedback) OVERRIDE {
37 EXPECT_EQ(cast_feedback.media_ssrc_, kSenderSsrc);
38 EXPECT_EQ(cast_feedback.ack_frame_id_, kAckFrameId);
40 MissingFramesAndPacketsMap::const_iterator frame_it =
41 cast_feedback.missing_frames_and_packets_.begin();
43 EXPECT_TRUE(frame_it != cast_feedback.missing_frames_and_packets_.end());
44 EXPECT_EQ(kLostFrameId, frame_it->first);
45 EXPECT_TRUE(frame_it->second.empty());
47 EXPECT_TRUE(frame_it != cast_feedback.missing_frames_and_packets_.end());
48 EXPECT_EQ(kFrameIdWithLostPackets, frame_it->first);
49 EXPECT_EQ(3UL, frame_it->second.size());
50 PacketIdSet::const_iterator packet_it = frame_it->second.begin();
51 EXPECT_EQ(kLostPacketId1, *packet_it);
53 EXPECT_EQ(kLostPacketId2, *packet_it);
55 EXPECT_EQ(kLostPacketId3, *packet_it);
57 EXPECT_EQ(frame_it, cast_feedback.missing_frames_and_packets_.end());
61 bool called() { return called_; }
68 class RtcpReceiverTest : public ::testing::Test {
71 : rtcp_receiver_(new RtcpReceiver(&mock_sender_feedback_,
72 &mock_receiver_feedback_,
77 virtual ~RtcpReceiverTest() {}
79 virtual void SetUp() OVERRIDE {
80 EXPECT_CALL(mock_receiver_feedback_, OnReceivedSenderReport(_)).Times(0);
81 EXPECT_CALL(mock_receiver_feedback_,
82 OnReceiverReferenceTimeReport(_)).Times(0);
83 EXPECT_CALL(mock_receiver_feedback_,
84 OnReceivedSendReportRequest()).Times(0);
86 EXPECT_CALL(mock_sender_feedback_, OnReceivedReportBlock(_)).Times(0);
87 EXPECT_CALL(mock_sender_feedback_, OnReceivedIntraFrameRequest()).Times(0);
88 EXPECT_CALL(mock_sender_feedback_, OnReceivedRpsi(_, _)).Times(0);
89 EXPECT_CALL(mock_sender_feedback_, OnReceivedRemb(_)).Times(0);
90 EXPECT_CALL(mock_sender_feedback_, OnReceivedNackRequest(_)).Times(0);
91 EXPECT_CALL(mock_sender_feedback_, OnReceivedCastFeedback(_)).Times(0);
93 EXPECT_CALL(mock_rtt_feedback_,
94 OnReceivedDelaySinceLastReport(_, _, _)).Times(0);
96 expected_sender_info_.ntp_seconds = kNtpHigh;
97 expected_sender_info_.ntp_fraction = kNtpLow;
98 expected_sender_info_.rtp_timestamp = kRtpTimestamp;
99 expected_sender_info_.send_packet_count = kSendPacketCount;
100 expected_sender_info_.send_octet_count = kSendOctetCount;
102 expected_report_block_.remote_ssrc = kSenderSsrc;
103 expected_report_block_.media_ssrc = kSourceSsrc;
104 expected_report_block_.fraction_lost = kLoss >> 24;
105 expected_report_block_.cumulative_lost = kLoss & 0xffffff;
106 expected_report_block_.extended_high_sequence_number = kExtendedMax;
107 expected_report_block_.jitter = kJitter;
108 expected_report_block_.last_sr = kLastSr;
109 expected_report_block_.delay_since_last_sr = kDelayLastSr;
110 expected_receiver_reference_report_.remote_ssrc = kSenderSsrc;
111 expected_receiver_reference_report_.ntp_seconds = kNtpHigh;
112 expected_receiver_reference_report_.ntp_fraction = kNtpLow;
115 // Injects an RTCP packet into the receiver.
116 void InjectRtcpPacket(const uint8* packet, uint16 length) {
117 RtcpParser rtcp_parser(packet, length);
118 rtcp_receiver_->IncomingRtcpPacket(&rtcp_parser);
121 MockRtcpReceiverFeedback mock_receiver_feedback_;
122 MockRtcpRttFeedback mock_rtt_feedback_;
123 MockRtcpSenderFeedback mock_sender_feedback_;
124 scoped_ptr<RtcpReceiver> rtcp_receiver_;
125 RtcpSenderInfo expected_sender_info_;
126 RtcpReportBlock expected_report_block_;
127 RtcpReceiverReferenceTimeReport expected_receiver_reference_report_;
130 TEST_F(RtcpReceiverTest, BrokenPacketIsIgnored) {
131 const uint8 bad_packet[] = {0, 0, 0, 0};
132 InjectRtcpPacket(bad_packet, sizeof(bad_packet));
135 TEST_F(RtcpReceiverTest, InjectSenderReportPacket) {
136 TestRtcpPacketBuilder p;
137 p.AddSr(kSenderSsrc, 0);
139 // Expected to be ignored since the sender ssrc does not match our
141 InjectRtcpPacket(p.Packet(), p.Length());
143 EXPECT_CALL(mock_receiver_feedback_,
144 OnReceivedSenderReport(expected_sender_info_)).Times(1);
145 rtcp_receiver_->SetRemoteSSRC(kSenderSsrc);
147 // Expected to be pass through since the sender ssrc match our remote ssrc.
148 InjectRtcpPacket(p.Packet(), p.Length());
151 TEST_F(RtcpReceiverTest, InjectReceiveReportPacket) {
152 TestRtcpPacketBuilder p1;
153 p1.AddRr(kSenderSsrc, 1);
154 p1.AddRb(kUnknownSsrc);
156 // Expected to be ignored since the source ssrc does not match our
158 InjectRtcpPacket(p1.Packet(), p1.Length());
160 EXPECT_CALL(mock_sender_feedback_,
161 OnReceivedReportBlock(expected_report_block_)).Times(1);
163 EXPECT_CALL(mock_rtt_feedback_,
164 OnReceivedDelaySinceLastReport(kSourceSsrc,
166 kDelayLastSr)).Times(1);
168 TestRtcpPacketBuilder p2;
169 p2.AddRr(kSenderSsrc, 1);
170 p2.AddRb(kSourceSsrc);
172 // Expected to be pass through since the sender ssrc match our local ssrc.
173 InjectRtcpPacket(p2.Packet(), p2.Length());
176 TEST_F(RtcpReceiverTest, InjectSenderReportWithReportBlockPacket) {
177 TestRtcpPacketBuilder p1;
178 p1.AddSr(kSenderSsrc, 1);
179 p1.AddRb(kUnknownSsrc);
181 // Sender report expected to be ignored since the sender ssrc does not match
183 // Report block expected to be ignored since the source ssrc does not match
185 InjectRtcpPacket(p1.Packet(), p1.Length());
187 EXPECT_CALL(mock_receiver_feedback_,
188 OnReceivedSenderReport(expected_sender_info_)).Times(1);
189 rtcp_receiver_->SetRemoteSSRC(kSenderSsrc);
191 // Sender report expected to be pass through since the sender ssrc match our
193 // Report block expected to be ignored since the source ssrc does not match
195 InjectRtcpPacket(p1.Packet(), p1.Length());
197 EXPECT_CALL(mock_receiver_feedback_, OnReceivedSenderReport(_)).Times(0);
198 EXPECT_CALL(mock_sender_feedback_,
199 OnReceivedReportBlock(expected_report_block_)).Times(1);
200 EXPECT_CALL(mock_rtt_feedback_,
201 OnReceivedDelaySinceLastReport(kSourceSsrc,
203 kDelayLastSr)).Times(1);
205 rtcp_receiver_->SetRemoteSSRC(0);
207 TestRtcpPacketBuilder p2;
208 p2.AddSr(kSenderSsrc, 1);
209 p2.AddRb(kSourceSsrc);
211 // Sender report expected to be ignored since the sender ssrc does not match
213 // Receiver report expected to be pass through since the sender ssrc match
215 InjectRtcpPacket(p2.Packet(), p2.Length());
217 EXPECT_CALL(mock_receiver_feedback_,
218 OnReceivedSenderReport(expected_sender_info_)).Times(1);
219 EXPECT_CALL(mock_sender_feedback_,
220 OnReceivedReportBlock(expected_report_block_)).Times(1);
221 EXPECT_CALL(mock_rtt_feedback_,
222 OnReceivedDelaySinceLastReport(kSourceSsrc,
224 kDelayLastSr)).Times(1);
226 rtcp_receiver_->SetRemoteSSRC(kSenderSsrc);
228 // Sender report expected to be pass through since the sender ssrc match our
230 // Receiver report expected to be pass through since the sender ssrc match
232 InjectRtcpPacket(p2.Packet(), p2.Length());
235 TEST_F(RtcpReceiverTest, InjectSenderReportPacketWithDlrr) {
236 TestRtcpPacketBuilder p;
237 p.AddSr(kSenderSsrc, 0);
238 p.AddXrHeader(kSenderSsrc);
239 p.AddXrUnknownBlock();
240 p.AddXrExtendedDlrrBlock(kSenderSsrc);
241 p.AddXrUnknownBlock();
242 p.AddSdesCname(kSenderSsrc, kCName);
244 // Expected to be ignored since the source ssrc does not match our
246 InjectRtcpPacket(p.Packet(), p.Length());
248 EXPECT_CALL(mock_receiver_feedback_,
249 OnReceivedSenderReport(expected_sender_info_)).Times(1);
250 EXPECT_CALL(mock_rtt_feedback_,
251 OnReceivedDelaySinceLastReport(kSenderSsrc,
253 kDelayLastSr)).Times(1);
255 // Enable receiving sender report.
256 rtcp_receiver_->SetRemoteSSRC(kSenderSsrc);
258 // Expected to be pass through since the sender ssrc match our local ssrc.
259 InjectRtcpPacket(p.Packet(), p.Length());
262 TEST_F(RtcpReceiverTest, InjectReceiverReportPacketWithRrtr) {
263 TestRtcpPacketBuilder p1;
264 p1.AddRr(kSenderSsrc, 1);
265 p1.AddRb(kUnknownSsrc);
266 p1.AddXrHeader(kSenderSsrc);
269 // Expected to be ignored since the source ssrc does not match our
271 InjectRtcpPacket(p1.Packet(), p1.Length());
273 EXPECT_CALL(mock_sender_feedback_,
274 OnReceivedReportBlock(expected_report_block_)).Times(1);
275 EXPECT_CALL(mock_rtt_feedback_,
276 OnReceivedDelaySinceLastReport(kSourceSsrc,
278 kDelayLastSr)).Times(1);
279 EXPECT_CALL(mock_receiver_feedback_, OnReceiverReferenceTimeReport(
280 expected_receiver_reference_report_)).Times(1);
282 // Enable receiving reference time report.
283 rtcp_receiver_->SetRemoteSSRC(kSenderSsrc);
285 TestRtcpPacketBuilder p2;
286 p2.AddRr(kSenderSsrc, 1);
287 p2.AddRb(kSourceSsrc);
288 p2.AddXrHeader(kSenderSsrc);
291 // Expected to be pass through since the sender ssrc match our local ssrc.
292 InjectRtcpPacket(p2.Packet(), p2.Length());
295 TEST_F(RtcpReceiverTest, InjectReceiverReportPacketWithIntraFrameRequest) {
296 TestRtcpPacketBuilder p1;
297 p1.AddRr(kSenderSsrc, 1);
298 p1.AddRb(kUnknownSsrc);
299 p1.AddPli(kSenderSsrc, kUnknownSsrc);
301 // Expected to be ignored since the source ssrc does not match our
303 InjectRtcpPacket(p1.Packet(), p1.Length());
305 EXPECT_CALL(mock_sender_feedback_,
306 OnReceivedReportBlock(expected_report_block_)).Times(1);
307 EXPECT_CALL(mock_rtt_feedback_,
308 OnReceivedDelaySinceLastReport(kSourceSsrc,
310 kDelayLastSr)).Times(1);
311 EXPECT_CALL(mock_sender_feedback_, OnReceivedIntraFrameRequest()).Times(1);
313 TestRtcpPacketBuilder p2;
314 p2.AddRr(kSenderSsrc, 1);
315 p2.AddRb(kSourceSsrc);
316 p2.AddPli(kSenderSsrc, kSourceSsrc);
318 // Expected to be pass through since the sender ssrc match our local ssrc.
319 InjectRtcpPacket(p2.Packet(), p2.Length());
322 TEST_F(RtcpReceiverTest, InjectReceiverReportPacketWithCastFeedback) {
323 TestRtcpPacketBuilder p1;
324 p1.AddRr(kSenderSsrc, 1);
325 p1.AddRb(kUnknownSsrc);
326 p1.AddCast(kSenderSsrc, kUnknownSsrc);
328 // Expected to be ignored since the source ssrc does not match our
330 InjectRtcpPacket(p1.Packet(), p1.Length());
332 EXPECT_CALL(mock_sender_feedback_,
333 OnReceivedReportBlock(expected_report_block_)).Times(1);
334 EXPECT_CALL(mock_rtt_feedback_,
335 OnReceivedDelaySinceLastReport(kSourceSsrc,
337 kDelayLastSr)).Times(1);
338 EXPECT_CALL(mock_sender_feedback_, OnReceivedCastFeedback(_)).Times(1);
340 // Enable receiving the cast feedback.
341 rtcp_receiver_->SetRemoteSSRC(kSenderSsrc);
343 TestRtcpPacketBuilder p2;
344 p2.AddRr(kSenderSsrc, 1);
345 p2.AddRb(kSourceSsrc);
346 p2.AddCast(kSenderSsrc, kSourceSsrc);
348 // Expected to be pass through since the sender ssrc match our local ssrc.
349 InjectRtcpPacket(p2.Packet(), p2.Length());
352 TEST_F(RtcpReceiverTest, InjectReceiverReportPacketWithCastVerification) {
353 SenderFeedbackCastVerification sender_feedback_cast_verification;
354 RtcpReceiver rtcp_receiver(&sender_feedback_cast_verification,
355 &mock_receiver_feedback_,
359 EXPECT_CALL(mock_rtt_feedback_,
360 OnReceivedDelaySinceLastReport(kSourceSsrc,
362 kDelayLastSr)).Times(1);
364 // Enable receiving the cast feedback.
365 rtcp_receiver.SetRemoteSSRC(kSenderSsrc);
367 TestRtcpPacketBuilder p;
368 p.AddRr(kSenderSsrc, 1);
369 p.AddRb(kSourceSsrc);
370 p.AddCast(kSenderSsrc, kSourceSsrc);
372 // Expected to be pass through since the sender ssrc match our local ssrc.
373 RtcpParser rtcp_parser(p.Packet(), p.Length());
374 rtcp_receiver.IncomingRtcpPacket(&rtcp_parser);
376 EXPECT_TRUE(sender_feedback_cast_verification.called());