Upstream version 9.37.197.0
[platform/framework/web/crosswalk.git] / src / media / cast / rtcp / rtcp_receiver_unittest.cc
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 "base/memory/scoped_ptr.h"
6 #include "base/test/simple_test_tick_clock.h"
7 #include "media/cast/cast_environment.h"
8 #include "media/cast/rtcp/mock_rtcp_receiver_feedback.h"
9 #include "media/cast/rtcp/mock_rtcp_sender_feedback.h"
10 #include "media/cast/rtcp/rtcp_receiver.h"
11 #include "media/cast/rtcp/rtcp_utility.h"
12 #include "media/cast/rtcp/test_rtcp_packet_builder.h"
13 #include "media/cast/test/fake_single_thread_task_runner.h"
14 #include "media/cast/transport/cast_transport_defines.h"
15 #include "testing/gmock/include/gmock/gmock.h"
16
17 namespace media {
18 namespace cast {
19
20 using testing::_;
21
22 static const uint32 kSenderSsrc = 0x10203;
23 static const uint32 kSourceSsrc = 0x40506;
24 static const uint32 kUnknownSsrc = 0xDEAD;
25 static const uint16 kTargetDelayMs = 100;
26 static const std::string kCName("test@10.1.1.1");
27
28 namespace {
29 class SenderFeedbackCastVerification : public RtcpSenderFeedback {
30  public:
31   SenderFeedbackCastVerification() : called_(false) {}
32
33   virtual void OnReceivedCastFeedback(const RtcpCastMessage& cast_feedback)
34       OVERRIDE {
35     EXPECT_EQ(cast_feedback.media_ssrc_, kSenderSsrc);
36     EXPECT_EQ(cast_feedback.ack_frame_id_, kAckFrameId);
37
38     MissingFramesAndPacketsMap::const_iterator frame_it =
39         cast_feedback.missing_frames_and_packets_.begin();
40
41     EXPECT_TRUE(frame_it != cast_feedback.missing_frames_and_packets_.end());
42     EXPECT_EQ(kLostFrameId, frame_it->first);
43     EXPECT_EQ(frame_it->second.size(), 1UL);
44     EXPECT_EQ(*frame_it->second.begin(), kRtcpCastAllPacketsLost);
45     ++frame_it;
46     EXPECT_TRUE(frame_it != cast_feedback.missing_frames_and_packets_.end());
47     EXPECT_EQ(kFrameIdWithLostPackets, frame_it->first);
48     EXPECT_EQ(3UL, frame_it->second.size());
49     PacketIdSet::const_iterator packet_it = frame_it->second.begin();
50     EXPECT_EQ(kLostPacketId1, *packet_it);
51     ++packet_it;
52     EXPECT_EQ(kLostPacketId2, *packet_it);
53     ++packet_it;
54     EXPECT_EQ(kLostPacketId3, *packet_it);
55     ++frame_it;
56     EXPECT_EQ(frame_it, cast_feedback.missing_frames_and_packets_.end());
57     called_ = true;
58   }
59
60   bool called() const { return called_; }
61
62  private:
63   bool called_;
64
65   DISALLOW_COPY_AND_ASSIGN(SenderFeedbackCastVerification);
66 };
67
68 class RtcpReceiverCastLogVerification : public RtcpReceiverFeedback {
69  public:
70   RtcpReceiverCastLogVerification()
71       : called_on_received_sender_log_(false),
72         called_on_received_receiver_log_(false) {}
73
74   virtual void OnReceivedSenderReport(
75       const transport::RtcpSenderInfo& remote_sender_info) OVERRIDE{};
76
77   virtual void OnReceiverReferenceTimeReport(
78       const RtcpReceiverReferenceTimeReport& remote_time_report) OVERRIDE{};
79
80   virtual void OnReceivedSendReportRequest() OVERRIDE{};
81
82   virtual void OnReceivedReceiverLog(const RtcpReceiverLogMessage& receiver_log)
83       OVERRIDE {
84     EXPECT_EQ(expected_receiver_log_.size(), receiver_log.size());
85     RtcpReceiverLogMessage::const_iterator expected_it =
86         expected_receiver_log_.begin();
87     RtcpReceiverLogMessage::const_iterator incoming_it = receiver_log.begin();
88     for (; incoming_it != receiver_log.end(); ++incoming_it) {
89       EXPECT_EQ(expected_it->rtp_timestamp_, incoming_it->rtp_timestamp_);
90       EXPECT_EQ(expected_it->event_log_messages_.size(),
91                 incoming_it->event_log_messages_.size());
92
93       RtcpReceiverEventLogMessages::const_iterator event_incoming_it =
94           incoming_it->event_log_messages_.begin();
95       RtcpReceiverEventLogMessages::const_iterator event_expected_it =
96           expected_it->event_log_messages_.begin();
97       for (; event_incoming_it != incoming_it->event_log_messages_.end();
98            ++event_incoming_it, ++event_expected_it) {
99         EXPECT_EQ(event_expected_it->type, event_incoming_it->type);
100         EXPECT_EQ(event_expected_it->event_timestamp,
101                   event_incoming_it->event_timestamp);
102         if (event_expected_it->type == PACKET_RECEIVED) {
103           EXPECT_EQ(event_expected_it->packet_id, event_incoming_it->packet_id);
104         } else {
105           EXPECT_EQ(event_expected_it->delay_delta,
106                     event_incoming_it->delay_delta);
107         }
108       }
109       expected_receiver_log_.pop_front();
110       expected_it = expected_receiver_log_.begin();
111     }
112     called_on_received_receiver_log_ = true;
113   }
114
115   bool OnReceivedReceiverLogCalled() {
116     return called_on_received_receiver_log_ && expected_receiver_log_.empty();
117   }
118
119   void SetExpectedReceiverLog(const RtcpReceiverLogMessage& receiver_log) {
120     expected_receiver_log_ = receiver_log;
121   }
122
123  private:
124   RtcpReceiverLogMessage expected_receiver_log_;
125   bool called_on_received_sender_log_;
126   bool called_on_received_receiver_log_;
127
128   DISALLOW_COPY_AND_ASSIGN(RtcpReceiverCastLogVerification);
129 };
130
131 }  // namespace
132
133 class RtcpReceiverTest : public ::testing::Test {
134  protected:
135   RtcpReceiverTest()
136       : testing_clock_(new base::SimpleTestTickClock()),
137         task_runner_(new test::FakeSingleThreadTaskRunner(testing_clock_)),
138         cast_environment_(new CastEnvironment(
139             scoped_ptr<base::TickClock>(testing_clock_).Pass(),
140             task_runner_,
141             task_runner_,
142             task_runner_)),
143         rtcp_receiver_(new RtcpReceiver(cast_environment_,
144                                         &mock_sender_feedback_,
145                                         &mock_receiver_feedback_,
146                                         &mock_rtt_feedback_,
147                                         kSourceSsrc)) {
148     EXPECT_CALL(mock_receiver_feedback_, OnReceivedSenderReport(_)).Times(0);
149     EXPECT_CALL(mock_receiver_feedback_, OnReceiverReferenceTimeReport(_))
150         .Times(0);
151     EXPECT_CALL(mock_receiver_feedback_, OnReceivedSendReportRequest())
152         .Times(0);
153     EXPECT_CALL(mock_sender_feedback_, OnReceivedCastFeedback(_)).Times(0);
154     EXPECT_CALL(mock_rtt_feedback_, OnReceivedDelaySinceLastReport(_, _, _))
155         .Times(0);
156
157     expected_sender_info_.ntp_seconds = kNtpHigh;
158     expected_sender_info_.ntp_fraction = kNtpLow;
159     expected_sender_info_.rtp_timestamp = kRtpTimestamp;
160     expected_sender_info_.send_packet_count = kSendPacketCount;
161     expected_sender_info_.send_octet_count = kSendOctetCount;
162
163     expected_report_block_.remote_ssrc = kSenderSsrc;
164     expected_report_block_.media_ssrc = kSourceSsrc;
165     expected_report_block_.fraction_lost = kLoss >> 24;
166     expected_report_block_.cumulative_lost = kLoss & 0xffffff;
167     expected_report_block_.extended_high_sequence_number = kExtendedMax;
168     expected_report_block_.jitter = kTestJitter;
169     expected_report_block_.last_sr = kLastSr;
170     expected_report_block_.delay_since_last_sr = kDelayLastSr;
171     expected_receiver_reference_report_.remote_ssrc = kSenderSsrc;
172     expected_receiver_reference_report_.ntp_seconds = kNtpHigh;
173     expected_receiver_reference_report_.ntp_fraction = kNtpLow;
174   }
175
176   virtual ~RtcpReceiverTest() {}
177
178   // Injects an RTCP packet into the receiver.
179   void InjectRtcpPacket(const uint8* packet, uint16 length) {
180     RtcpParser rtcp_parser(packet, length);
181     rtcp_receiver_->IncomingRtcpPacket(&rtcp_parser);
182   }
183
184   base::SimpleTestTickClock* testing_clock_;  // Owned by CastEnvironment.
185   scoped_refptr<test::FakeSingleThreadTaskRunner> task_runner_;
186   scoped_refptr<CastEnvironment> cast_environment_;
187   MockRtcpReceiverFeedback mock_receiver_feedback_;
188   MockRtcpRttFeedback mock_rtt_feedback_;
189   MockRtcpSenderFeedback mock_sender_feedback_;
190   scoped_ptr<RtcpReceiver> rtcp_receiver_;
191   transport::RtcpSenderInfo expected_sender_info_;
192   transport::RtcpReportBlock expected_report_block_;
193   RtcpReceiverReferenceTimeReport expected_receiver_reference_report_;
194
195   DISALLOW_COPY_AND_ASSIGN(RtcpReceiverTest);
196 };
197
198 TEST_F(RtcpReceiverTest, BrokenPacketIsIgnored) {
199   const uint8 bad_packet[] = {0, 0, 0, 0};
200   InjectRtcpPacket(bad_packet, sizeof(bad_packet));
201 }
202
203 TEST_F(RtcpReceiverTest, InjectSenderReportPacket) {
204   TestRtcpPacketBuilder p;
205   p.AddSr(kSenderSsrc, 0);
206
207   // Expected to be ignored since the sender ssrc does not match our
208   // remote ssrc.
209   InjectRtcpPacket(p.Data(), p.Length());
210
211   EXPECT_CALL(mock_receiver_feedback_,
212               OnReceivedSenderReport(expected_sender_info_)).Times(1);
213   rtcp_receiver_->SetRemoteSSRC(kSenderSsrc);
214
215   // Expected to be pass through since the sender ssrc match our remote ssrc.
216   InjectRtcpPacket(p.Data(), p.Length());
217 }
218
219 TEST_F(RtcpReceiverTest, InjectReceiveReportPacket) {
220   TestRtcpPacketBuilder p1;
221   p1.AddRr(kSenderSsrc, 1);
222   p1.AddRb(kUnknownSsrc);
223
224   // Expected to be ignored since the source ssrc does not match our
225   // local ssrc.
226   InjectRtcpPacket(p1.Data(), p1.Length());
227
228   EXPECT_CALL(mock_rtt_feedback_,
229               OnReceivedDelaySinceLastReport(
230                   kSourceSsrc, kLastSr, kDelayLastSr)).Times(1);
231
232   TestRtcpPacketBuilder p2;
233   p2.AddRr(kSenderSsrc, 1);
234   p2.AddRb(kSourceSsrc);
235
236   // Expected to be pass through since the sender ssrc match our local ssrc.
237   InjectRtcpPacket(p2.Data(), p2.Length());
238 }
239
240 TEST_F(RtcpReceiverTest, InjectSenderReportWithReportBlockPacket) {
241   TestRtcpPacketBuilder p1;
242   p1.AddSr(kSenderSsrc, 1);
243   p1.AddRb(kUnknownSsrc);
244
245   // Sender report expected to be ignored since the sender ssrc does not match
246   // our remote ssrc.
247   // Report block expected to be ignored since the source ssrc does not match
248   // our local ssrc.
249   InjectRtcpPacket(p1.Data(), p1.Length());
250
251   EXPECT_CALL(mock_receiver_feedback_,
252               OnReceivedSenderReport(expected_sender_info_)).Times(1);
253   rtcp_receiver_->SetRemoteSSRC(kSenderSsrc);
254
255   // Sender report expected to be pass through since the sender ssrc match our
256   // remote ssrc.
257   // Report block expected to be ignored since the source ssrc does not match
258   // our local ssrc.
259   InjectRtcpPacket(p1.Data(), p1.Length());
260
261   EXPECT_CALL(mock_receiver_feedback_, OnReceivedSenderReport(_)).Times(0);
262   EXPECT_CALL(mock_rtt_feedback_,
263               OnReceivedDelaySinceLastReport(
264                   kSourceSsrc, kLastSr, kDelayLastSr)).Times(1);
265
266   rtcp_receiver_->SetRemoteSSRC(0);
267
268   TestRtcpPacketBuilder p2;
269   p2.AddSr(kSenderSsrc, 1);
270   p2.AddRb(kSourceSsrc);
271
272   // Sender report expected to be ignored since the sender ssrc does not match
273   // our remote ssrc.
274   // Receiver report expected to be pass through since the sender ssrc match
275   // our local ssrc.
276   InjectRtcpPacket(p2.Data(), p2.Length());
277
278   EXPECT_CALL(mock_receiver_feedback_,
279               OnReceivedSenderReport(expected_sender_info_)).Times(1);
280   EXPECT_CALL(mock_rtt_feedback_,
281               OnReceivedDelaySinceLastReport(
282                   kSourceSsrc, kLastSr, kDelayLastSr)).Times(1);
283
284   rtcp_receiver_->SetRemoteSSRC(kSenderSsrc);
285
286   // Sender report expected to be pass through since the sender ssrc match our
287   // remote ssrc.
288   // Receiver report expected to be pass through since the sender ssrc match
289   // our local ssrc.
290   InjectRtcpPacket(p2.Data(), p2.Length());
291 }
292
293 TEST_F(RtcpReceiverTest, InjectSenderReportPacketWithDlrr) {
294   TestRtcpPacketBuilder p;
295   p.AddSr(kSenderSsrc, 0);
296   p.AddXrHeader(kSenderSsrc);
297   p.AddXrUnknownBlock();
298   p.AddXrExtendedDlrrBlock(kSenderSsrc);
299   p.AddXrUnknownBlock();
300   p.AddSdesCname(kSenderSsrc, kCName);
301
302   // Expected to be ignored since the source ssrc does not match our
303   // local ssrc.
304   InjectRtcpPacket(p.Data(), p.Length());
305
306   EXPECT_CALL(mock_receiver_feedback_,
307               OnReceivedSenderReport(expected_sender_info_)).Times(1);
308   EXPECT_CALL(mock_rtt_feedback_,
309               OnReceivedDelaySinceLastReport(
310                   kSenderSsrc, kLastSr, kDelayLastSr)).Times(1);
311
312   // Enable receiving sender report.
313   rtcp_receiver_->SetRemoteSSRC(kSenderSsrc);
314
315   // Expected to be pass through since the sender ssrc match our local ssrc.
316   InjectRtcpPacket(p.Data(), p.Length());
317 }
318
319 TEST_F(RtcpReceiverTest, InjectReceiverReportPacketWithRrtr) {
320   TestRtcpPacketBuilder p1;
321   p1.AddRr(kSenderSsrc, 1);
322   p1.AddRb(kUnknownSsrc);
323   p1.AddXrHeader(kSenderSsrc);
324   p1.AddXrRrtrBlock();
325
326   // Expected to be ignored since the source ssrc does not match our
327   // local ssrc.
328   InjectRtcpPacket(p1.Data(), p1.Length());
329
330   EXPECT_CALL(mock_rtt_feedback_,
331               OnReceivedDelaySinceLastReport(
332                   kSourceSsrc, kLastSr, kDelayLastSr)).Times(1);
333   EXPECT_CALL(mock_receiver_feedback_,
334               OnReceiverReferenceTimeReport(
335                   expected_receiver_reference_report_)).Times(1);
336
337   // Enable receiving reference time report.
338   rtcp_receiver_->SetRemoteSSRC(kSenderSsrc);
339
340   TestRtcpPacketBuilder p2;
341   p2.AddRr(kSenderSsrc, 1);
342   p2.AddRb(kSourceSsrc);
343   p2.AddXrHeader(kSenderSsrc);
344   p2.AddXrRrtrBlock();
345
346   // Expected to be pass through since the sender ssrc match our local ssrc.
347   InjectRtcpPacket(p2.Data(), p2.Length());
348 }
349
350 TEST_F(RtcpReceiverTest, InjectReceiverReportPacketWithIntraFrameRequest) {
351   TestRtcpPacketBuilder p1;
352   p1.AddRr(kSenderSsrc, 1);
353   p1.AddRb(kUnknownSsrc);
354   p1.AddPli(kSenderSsrc, kUnknownSsrc);
355
356   // Expected to be ignored since the source ssrc does not match our
357   // local ssrc.
358   InjectRtcpPacket(p1.Data(), p1.Length());
359
360   EXPECT_CALL(mock_rtt_feedback_,
361               OnReceivedDelaySinceLastReport(
362                   kSourceSsrc, kLastSr, kDelayLastSr)).Times(1);
363
364   TestRtcpPacketBuilder p2;
365   p2.AddRr(kSenderSsrc, 1);
366   p2.AddRb(kSourceSsrc);
367   p2.AddPli(kSenderSsrc, kSourceSsrc);
368
369   // Expected to be pass through since the sender ssrc match our local ssrc.
370   InjectRtcpPacket(p2.Data(), p2.Length());
371 }
372
373 TEST_F(RtcpReceiverTest, InjectReceiverReportPacketWithCastFeedback) {
374   TestRtcpPacketBuilder p1;
375   p1.AddRr(kSenderSsrc, 1);
376   p1.AddRb(kUnknownSsrc);
377   p1.AddCast(kSenderSsrc, kUnknownSsrc, kTargetDelayMs);
378
379   // Expected to be ignored since the source ssrc does not match our
380   // local ssrc.
381   InjectRtcpPacket(p1.Data(), p1.Length());
382
383   EXPECT_CALL(mock_rtt_feedback_,
384               OnReceivedDelaySinceLastReport(
385                   kSourceSsrc, kLastSr, kDelayLastSr)).Times(1);
386   EXPECT_CALL(mock_sender_feedback_, OnReceivedCastFeedback(_)).Times(1);
387
388   // Enable receiving the cast feedback.
389   rtcp_receiver_->SetRemoteSSRC(kSenderSsrc);
390
391   TestRtcpPacketBuilder p2;
392   p2.AddRr(kSenderSsrc, 1);
393   p2.AddRb(kSourceSsrc);
394   p2.AddCast(kSenderSsrc, kSourceSsrc, kTargetDelayMs);
395
396   // Expected to be pass through since the sender ssrc match our local ssrc.
397   InjectRtcpPacket(p2.Data(), p2.Length());
398 }
399
400 TEST_F(RtcpReceiverTest, InjectReceiverReportPacketWithCastVerification) {
401   SenderFeedbackCastVerification sender_feedback_cast_verification;
402   RtcpReceiver rtcp_receiver(cast_environment_,
403                              &sender_feedback_cast_verification,
404                              &mock_receiver_feedback_,
405                              &mock_rtt_feedback_,
406                              kSourceSsrc);
407
408   EXPECT_CALL(mock_rtt_feedback_,
409               OnReceivedDelaySinceLastReport(
410                   kSourceSsrc, kLastSr, kDelayLastSr)).Times(1);
411
412   // Enable receiving the cast feedback.
413   rtcp_receiver.SetRemoteSSRC(kSenderSsrc);
414
415   TestRtcpPacketBuilder p;
416   p.AddRr(kSenderSsrc, 1);
417   p.AddRb(kSourceSsrc);
418   p.AddCast(kSenderSsrc, kSourceSsrc, kTargetDelayMs);
419
420   // Expected to be pass through since the sender ssrc match our local ssrc.
421   RtcpParser rtcp_parser(p.Data(), p.Length());
422   rtcp_receiver.IncomingRtcpPacket(&rtcp_parser);
423
424   EXPECT_TRUE(sender_feedback_cast_verification.called());
425 }
426
427 TEST_F(RtcpReceiverTest, InjectReceiverReportWithReceiverLogVerificationBase) {
428   static const uint32 kTimeBaseMs = 12345678;
429   static const uint32 kTimeDelayMs = 10;
430   static const uint32 kDelayDeltaMs = 123;
431   base::SimpleTestTickClock testing_clock;
432   testing_clock.Advance(base::TimeDelta::FromMilliseconds(kTimeBaseMs));
433
434   RtcpReceiverCastLogVerification cast_log_verification;
435   RtcpReceiver rtcp_receiver(cast_environment_,
436                              &mock_sender_feedback_,
437                              &cast_log_verification,
438                              &mock_rtt_feedback_,
439                              kSourceSsrc);
440   rtcp_receiver.SetRemoteSSRC(kSenderSsrc);
441   rtcp_receiver.SetCastReceiverEventHistorySize(100);
442
443   RtcpReceiverLogMessage receiver_log;
444   RtcpReceiverFrameLogMessage frame_log(kRtpTimestamp);
445   RtcpReceiverEventLogMessage event_log;
446
447   event_log.type = FRAME_ACK_SENT;
448   event_log.event_timestamp = testing_clock.NowTicks();
449   event_log.delay_delta = base::TimeDelta::FromMilliseconds(kDelayDeltaMs);
450   frame_log.event_log_messages_.push_back(event_log);
451
452   testing_clock.Advance(base::TimeDelta::FromMilliseconds(kTimeDelayMs));
453   event_log.type = PACKET_RECEIVED;
454   event_log.event_timestamp = testing_clock.NowTicks();
455   event_log.packet_id = kLostPacketId1;
456   frame_log.event_log_messages_.push_back(event_log);
457
458   event_log.type = PACKET_RECEIVED;
459   event_log.event_timestamp = testing_clock.NowTicks();
460   event_log.packet_id = kLostPacketId2;
461   frame_log.event_log_messages_.push_back(event_log);
462
463   receiver_log.push_back(frame_log);
464
465   cast_log_verification.SetExpectedReceiverLog(receiver_log);
466
467   TestRtcpPacketBuilder p;
468   p.AddRr(kSenderSsrc, 1);
469   p.AddRb(kSourceSsrc);
470   p.AddReceiverLog(kSenderSsrc);
471   p.AddReceiverFrameLog(kRtpTimestamp, 3, kTimeBaseMs);
472   p.AddReceiverEventLog(kDelayDeltaMs, FRAME_ACK_SENT, 0);
473   p.AddReceiverEventLog(kLostPacketId1, PACKET_RECEIVED, kTimeDelayMs);
474   p.AddReceiverEventLog(kLostPacketId2, PACKET_RECEIVED, kTimeDelayMs);
475
476   // Adds duplicated receiver event.
477   p.AddReceiverFrameLog(kRtpTimestamp, 3, kTimeBaseMs);
478   p.AddReceiverEventLog(kDelayDeltaMs, FRAME_ACK_SENT, 0);
479   p.AddReceiverEventLog(kLostPacketId1, PACKET_RECEIVED, kTimeDelayMs);
480   p.AddReceiverEventLog(kLostPacketId2, PACKET_RECEIVED, kTimeDelayMs);
481
482   EXPECT_CALL(mock_rtt_feedback_,
483               OnReceivedDelaySinceLastReport(
484                   kSourceSsrc, kLastSr, kDelayLastSr)).Times(1);
485
486   RtcpParser rtcp_parser(p.Data(), p.Length());
487   rtcp_receiver.IncomingRtcpPacket(&rtcp_parser);
488
489   EXPECT_TRUE(cast_log_verification.OnReceivedReceiverLogCalled());
490 }
491
492 TEST_F(RtcpReceiverTest, InjectReceiverReportWithReceiverLogVerificationMulti) {
493   static const uint32 kTimeBaseMs = 12345678;
494   static const uint32 kTimeDelayMs = 10;
495   static const uint32 kDelayDeltaMs = 123;
496   base::SimpleTestTickClock testing_clock;
497   testing_clock.Advance(base::TimeDelta::FromMilliseconds(kTimeBaseMs));
498
499   RtcpReceiverCastLogVerification cast_log_verification;
500   RtcpReceiver rtcp_receiver(cast_environment_,
501                              &mock_sender_feedback_,
502                              &cast_log_verification,
503                              &mock_rtt_feedback_,
504                              kSourceSsrc);
505   rtcp_receiver.SetRemoteSSRC(kSenderSsrc);
506
507   RtcpReceiverLogMessage receiver_log;
508
509   for (int j = 0; j < 100; ++j) {
510     RtcpReceiverFrameLogMessage frame_log(kRtpTimestamp);
511     RtcpReceiverEventLogMessage event_log;
512     event_log.type = FRAME_ACK_SENT;
513     event_log.event_timestamp = testing_clock.NowTicks();
514     event_log.delay_delta = base::TimeDelta::FromMilliseconds(kDelayDeltaMs);
515     frame_log.event_log_messages_.push_back(event_log);
516     receiver_log.push_back(frame_log);
517     testing_clock.Advance(base::TimeDelta::FromMilliseconds(kTimeDelayMs));
518   }
519
520   cast_log_verification.SetExpectedReceiverLog(receiver_log);
521
522   TestRtcpPacketBuilder p;
523   p.AddRr(kSenderSsrc, 1);
524   p.AddRb(kSourceSsrc);
525   p.AddReceiverLog(kSenderSsrc);
526   for (int i = 0; i < 100; ++i) {
527     p.AddReceiverFrameLog(kRtpTimestamp, 1, kTimeBaseMs + i * kTimeDelayMs);
528     p.AddReceiverEventLog(kDelayDeltaMs, FRAME_ACK_SENT, 0);
529   }
530
531   EXPECT_CALL(mock_rtt_feedback_,
532               OnReceivedDelaySinceLastReport(
533                   kSourceSsrc, kLastSr, kDelayLastSr)).Times(1);
534
535   RtcpParser rtcp_parser(p.Data(), p.Length());
536   rtcp_receiver.IncomingRtcpPacket(&rtcp_parser);
537
538   EXPECT_TRUE(cast_log_verification.OnReceivedReceiverLogCalled());
539 }
540
541 }  // namespace cast
542 }  // namespace media