Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(206)

Side by Side Diff: media/cast/net/rtcp/rtcp_unittest.cc

Issue 532373003: [Cast] RTT clean-up to the max! (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 6 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright 2014 The Chromium Authors. All rights reserved. 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 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include <stdint.h> 5 #include <stdint.h>
6 6
7 #include "base/test/simple_test_tick_clock.h" 7 #include "base/test/simple_test_tick_clock.h"
8 #include "media/cast/cast_defines.h" 8 #include "media/cast/cast_defines.h"
9 #include "media/cast/net/cast_transport_config.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" 10 #include "media/cast/net/pacing/paced_sender.h"
12 #include "media/cast/net/rtcp/rtcp.h" 11 #include "media/cast/net/rtcp/rtcp.h"
13 #include "media/cast/net/rtcp/test_rtcp_packet_builder.h" 12 #include "media/cast/test/skewed_tick_clock.h"
14 #include "media/cast/test/fake_single_thread_task_runner.h"
15 #include "testing/gmock/include/gmock/gmock.h" 13 #include "testing/gmock/include/gmock/gmock.h"
16 14
17 namespace media { 15 namespace media {
18 namespace cast { 16 namespace cast {
19 17
20 using testing::_; 18 using testing::_;
21 19
22 static const uint32 kSenderSsrc = 0x10203; 20 static const uint32 kSenderSsrc = 0x10203;
23 static const uint32 kReceiverSsrc = 0x40506; 21 static const uint32 kReceiverSsrc = 0x40506;
24 static const int64 kAddedDelay = 123; 22 static const int kInitialReceiverClockOffsetSeconds = -5;
25 static const int64 kAddedShortDelay = 100;
26 23
27 class RtcpTestPacketSender : public PacketSender { 24 class FakeRtcpTransport : public PacedPacketSender {
28 public: 25 public:
29 explicit RtcpTestPacketSender(base::SimpleTestTickClock* testing_clock) 26 explicit FakeRtcpTransport(base::SimpleTestTickClock* clock)
30 : drop_packets_(false), 27 : clock_(clock),
31 short_delay_(false), 28 packet_delay_(base::TimeDelta::FromMilliseconds(42)) {}
32 rtcp_receiver_(NULL),
33 testing_clock_(testing_clock) {}
34 virtual ~RtcpTestPacketSender() {}
35 // Packet lists imply a RTP packet.
36 void set_rtcp_receiver(Rtcp* rtcp) { rtcp_receiver_ = rtcp; }
37 29
38 void set_short_delay() { short_delay_ = true; } 30 void set_rtcp_destination(Rtcp* rtcp) { rtcp_ = rtcp; }
39 31
40 void set_drop_packets(bool drop_packets) { drop_packets_ = drop_packets; } 32 base::TimeDelta packet_delay() const { return packet_delay_; }
33 void set_packet_delay(base::TimeDelta delay) { packet_delay_ = delay; }
41 34
42 // A singular packet implies a RTCP packet. 35 virtual bool SendRtcpPacket(uint32 ssrc, PacketRef packet) OVERRIDE {
43 virtual bool SendPacket(PacketRef packet, 36 clock_->Advance(packet_delay_);
44 const base::Closure& cb) OVERRIDE {
45 if (short_delay_) {
46 testing_clock_->Advance(
47 base::TimeDelta::FromMilliseconds(kAddedShortDelay));
48 } else {
49 testing_clock_->Advance(base::TimeDelta::FromMilliseconds(kAddedDelay));
50 }
51 if (drop_packets_)
52 return true;
53
54 rtcp_receiver_->IncomingRtcpPacket(&packet->data[0], packet->data.size());
55 return true;
56 }
57
58 private:
59 bool drop_packets_;
60 bool short_delay_;
61 Rtcp* rtcp_receiver_;
62 base::SimpleTestTickClock* testing_clock_; // Not owned.
63
64 DISALLOW_COPY_AND_ASSIGN(RtcpTestPacketSender);
65 };
66
67 class LocalRtcpTransport : public PacedPacketSender {
68 public:
69 explicit LocalRtcpTransport(base::SimpleTestTickClock* testing_clock)
70 : drop_packets_(false),
71 short_delay_(false),
72 testing_clock_(testing_clock) {}
73
74 void set_rtcp_receiver(Rtcp* rtcp) { rtcp_ = rtcp; }
75
76 void set_short_delay() { short_delay_ = true; }
77
78 void set_drop_packets(bool drop_packets) { drop_packets_ = drop_packets; }
79
80 virtual bool SendRtcpPacket(uint32 ssrc,
81 PacketRef packet) OVERRIDE {
82 if (short_delay_) {
83 testing_clock_->Advance(
84 base::TimeDelta::FromMilliseconds(kAddedShortDelay));
85 } else {
86 testing_clock_->Advance(base::TimeDelta::FromMilliseconds(kAddedDelay));
87 }
88 if (drop_packets_)
89 return true;
90
91 rtcp_->IncomingRtcpPacket(&packet->data[0], packet->data.size()); 37 rtcp_->IncomingRtcpPacket(&packet->data[0], packet->data.size());
92 return true; 38 return true;
93 } 39 }
94 40
95 virtual bool SendPackets( 41 virtual bool SendPackets(const SendPacketVector& packets) OVERRIDE {
96 const SendPacketVector& packets) OVERRIDE {
97 return false; 42 return false;
98 } 43 }
99 44
100 virtual bool ResendPackets( 45 virtual bool ResendPackets(
101 const SendPacketVector& packets, const DedupInfo& dedup_info) OVERRIDE { 46 const SendPacketVector& packets, const DedupInfo& dedup_info) OVERRIDE {
102 return false; 47 return false;
103 } 48 }
104 49
105 virtual void CancelSendingPacket( 50 virtual void CancelSendingPacket(const PacketKey& packet_key) OVERRIDE {
106 const PacketKey& packet_key) OVERRIDE {
107 } 51 }
108 52
109 private: 53 private:
110 bool drop_packets_; 54 base::SimpleTestTickClock* const clock_;
111 bool short_delay_; 55 base::TimeDelta packet_delay_;
112 Rtcp* rtcp_; 56 Rtcp* rtcp_;
113 base::SimpleTestTickClock* testing_clock_; // Not owned.
114 57
115 DISALLOW_COPY_AND_ASSIGN(LocalRtcpTransport); 58 DISALLOW_COPY_AND_ASSIGN(FakeRtcpTransport);
116 }; 59 };
117 60
118 class MockReceiverStats : public RtpReceiverStatistics { 61 class FakeReceiverStats : public RtpReceiverStatistics {
119 public: 62 public:
120 MockReceiverStats() {} 63 FakeReceiverStats() {}
121 virtual ~MockReceiverStats() {} 64 virtual ~FakeReceiverStats() {}
122 65
123 virtual void GetStatistics(uint8* fraction_lost, 66 virtual void GetStatistics(uint8* fraction_lost,
124 uint32* cumulative_lost, 67 uint32* cumulative_lost,
125 uint32* extended_high_sequence_number, 68 uint32* extended_high_sequence_number,
126 uint32* jitter) OVERRIDE { 69 uint32* jitter) OVERRIDE {
127 *fraction_lost = 0; 70 *fraction_lost = 0;
128 *cumulative_lost = 0; 71 *cumulative_lost = 0;
129 *extended_high_sequence_number = 0; 72 *extended_high_sequence_number = 0;
130 *jitter = 0; 73 *jitter = 0;
131 } 74 }
132 75
133 private: 76 private:
134 DISALLOW_COPY_AND_ASSIGN(MockReceiverStats); 77 DISALLOW_COPY_AND_ASSIGN(FakeReceiverStats);
135 }; 78 };
136 79
137 class MockFrameSender { 80 class MockFrameSender {
138 public: 81 public:
139 MockFrameSender() {} 82 MockFrameSender() {}
140 virtual ~MockFrameSender() {} 83 virtual ~MockFrameSender() {}
141 84
142 MOCK_METHOD1(OnReceivedCastFeedback, 85 MOCK_METHOD1(OnReceivedCastFeedback,
143 void(const RtcpCastMessage& cast_message)); 86 void(const RtcpCastMessage& cast_message));
144 MOCK_METHOD4(OnReceivedRtt, 87 MOCK_METHOD1(OnMeasuredRoundTripTime, void(base::TimeDelta rtt));
145 void(base::TimeDelta rtt, 88
146 base::TimeDelta avg_rtt,
147 base::TimeDelta min_rtt,
148 base::TimeDelta max_rtt));
149 private: 89 private:
150 DISALLOW_COPY_AND_ASSIGN(MockFrameSender); 90 DISALLOW_COPY_AND_ASSIGN(MockFrameSender);
151 }; 91 };
152 92
153 class RtcpTest : public ::testing::Test { 93 class RtcpTest : public ::testing::Test {
154 protected: 94 protected:
155 RtcpTest() 95 RtcpTest()
156 : testing_clock_(new base::SimpleTestTickClock()), 96 : sender_clock_(new base::SimpleTestTickClock()),
157 task_runner_( 97 receiver_clock_(new test::SkewedTickClock(sender_clock_.get())),
158 new test::FakeSingleThreadTaskRunner(testing_clock_.get())), 98 sender_to_receiver_(sender_clock_.get()),
159 sender_to_receiver_(testing_clock_.get()), 99 receiver_to_sender_(sender_clock_.get()),
160 receiver_to_sender_(testing_clock_.get()) { 100 rtcp_for_sender_(base::Bind(&MockFrameSender::OnReceivedCastFeedback,
161 testing_clock_->Advance(base::TimeTicks::Now() - base::TimeTicks()); 101 base::Unretained(&mock_frame_sender_)),
102 base::Bind(&MockFrameSender::OnMeasuredRoundTripTime,
103 base::Unretained(&mock_frame_sender_)),
104 RtcpLogMessageCallback(),
105 sender_clock_.get(),
106 &sender_to_receiver_,
107 kSenderSsrc,
108 kReceiverSsrc),
109 rtcp_for_receiver_(RtcpCastMessageCallback(),
110 RtcpRttCallback(),
111 RtcpLogMessageCallback(),
112 receiver_clock_.get(),
113 &receiver_to_sender_,
114 kReceiverSsrc,
115 kSenderSsrc) {
116 sender_clock_->Advance(base::TimeTicks::Now() - base::TimeTicks());
117 receiver_clock_->SetSkew(
118 1.0, // No skew.
119 base::TimeDelta::FromSeconds(kInitialReceiverClockOffsetSeconds));
120
121 sender_to_receiver_.set_rtcp_destination(&rtcp_for_receiver_);
122 receiver_to_sender_.set_rtcp_destination(&rtcp_for_sender_);
162 } 123 }
163 124
164 virtual ~RtcpTest() {} 125 virtual ~RtcpTest() {}
165 126
166 static void UpdateCastTransportStatus(CastTransportStatus status) { 127 scoped_ptr<base::SimpleTestTickClock> sender_clock_;
167 bool result = (status == TRANSPORT_AUDIO_INITIALIZED || 128 scoped_ptr<test::SkewedTickClock> receiver_clock_;
168 status == TRANSPORT_VIDEO_INITIALIZED); 129 FakeRtcpTransport sender_to_receiver_;
169 EXPECT_TRUE(result); 130 FakeRtcpTransport receiver_to_sender_;
170 }
171
172 void RunTasks(int during_ms) {
173 for (int i = 0; i < during_ms; ++i) {
174 // Call process the timers every 1 ms.
175 testing_clock_->Advance(base::TimeDelta::FromMilliseconds(1));
176 task_runner_->RunTasks();
177 }
178 }
179
180 scoped_ptr<base::SimpleTestTickClock> testing_clock_;
181 scoped_refptr<test::FakeSingleThreadTaskRunner> task_runner_;
182 LocalRtcpTransport sender_to_receiver_;
183 LocalRtcpTransport receiver_to_sender_;
184 MockFrameSender mock_frame_sender_; 131 MockFrameSender mock_frame_sender_;
185 MockReceiverStats stats_; 132 Rtcp rtcp_for_sender_;
133 Rtcp rtcp_for_receiver_;
134 FakeReceiverStats stats_;
186 135
187 DISALLOW_COPY_AND_ASSIGN(RtcpTest); 136 DISALLOW_COPY_AND_ASSIGN(RtcpTest);
188 }; 137 };
189 138
190 TEST_F(RtcpTest, BasicSenderReport) { 139 TEST_F(RtcpTest, LipSyncGleanedFromSenderReport) {
191 Rtcp rtcp(base::Bind(&MockFrameSender::OnReceivedCastFeedback, 140 // Initially, expect no lip-sync info receiver-side without having first
192 base::Unretained(&mock_frame_sender_)), 141 // received a RTCP packet.
193 base::Bind(&MockFrameSender::OnReceivedRtt, 142 base::TimeTicks reference_time;
194 base::Unretained(&mock_frame_sender_)), 143 uint32 rtp_timestamp;
195 RtcpLogMessageCallback(), 144 ASSERT_FALSE(rtcp_for_receiver_.GetLatestLipSyncTimes(&rtp_timestamp,
196 testing_clock_.get(), 145 &reference_time));
197 &sender_to_receiver_, 146
198 kSenderSsrc, 147 // Send a Sender Report to the receiver.
199 kReceiverSsrc); 148 const base::TimeTicks reference_time_sent = sender_clock_->NowTicks();
200 sender_to_receiver_.set_rtcp_receiver(&rtcp); 149 const uint32 rtp_timestamp_sent = 0xbee5;
201 rtcp.SendRtcpFromRtpSender(base::TimeTicks(), 0, 1, 1); 150 rtcp_for_sender_.SendRtcpFromRtpSender(
151 reference_time_sent, rtp_timestamp_sent, 1, 1);
152
153 // Now the receiver should have lip-sync info. Confirm that the lip-sync
154 // reference time is the same as that sent.
155 EXPECT_TRUE(rtcp_for_receiver_.GetLatestLipSyncTimes(&rtp_timestamp,
156 &reference_time));
157 const base::TimeTicks rolled_back_time =
158 (reference_time -
159 // Roll-back relative clock offset:
160 base::TimeDelta::FromSeconds(kInitialReceiverClockOffsetSeconds) -
161 // Roll-back packet transmission time (because RTT is not yet known):
162 sender_to_receiver_.packet_delay());
163 EXPECT_NEAR(0, (reference_time_sent - rolled_back_time).InMicroseconds(), 5);
164 EXPECT_EQ(rtp_timestamp_sent, rtp_timestamp);
202 } 165 }
203 166
204 TEST_F(RtcpTest, BasicReceiverReport) { 167 // TODO(miu): There were a few tests here that didn't actually test anything
205 Rtcp rtcp(base::Bind(&MockFrameSender::OnReceivedCastFeedback, 168 // except that the code wouldn't crash and a callback method was invoked. We
206 base::Unretained(&mock_frame_sender_)), 169 // need to fill-in more testing of RTCP now that much of the refactoring work
207 base::Bind(&MockFrameSender::OnReceivedRtt, 170 // has been completed.
208 base::Unretained(&mock_frame_sender_)), 171
209 RtcpLogMessageCallback(), 172 TEST_F(RtcpTest, RoundTripTimesDeterminedFromReportPingPong) {
210 testing_clock_.get(), 173 const int iterations = 12;
211 &receiver_to_sender_, 174 EXPECT_CALL(mock_frame_sender_, OnMeasuredRoundTripTime(_))
212 kSenderSsrc, 175 .Times(iterations);
213 kReceiverSsrc); 176
214 receiver_to_sender_.set_rtcp_receiver(&rtcp); 177 // Initially, neither side knows the round trip time.
215 rtcp.SendRtcpFromRtpReceiver(NULL, base::TimeDelta(), NULL, &stats_); 178 ASSERT_EQ(base::TimeDelta(), rtcp_for_sender_.current_round_trip_time());
179 ASSERT_EQ(base::TimeDelta(), rtcp_for_receiver_.current_round_trip_time());
180
181 // Do a number of ping-pongs, checking how the round trip times are measured
182 // by the sender and receiver.
183 base::TimeDelta expected_rtt_according_to_sender;
184 base::TimeDelta expected_rtt_according_to_receiver;
185 for (int i = 0; i < iterations; ++i) {
186 const base::TimeDelta one_way_trip_time =
187 base::TimeDelta::FromMilliseconds(1 << i);
188 sender_to_receiver_.set_packet_delay(one_way_trip_time);
189 receiver_to_sender_.set_packet_delay(one_way_trip_time);
190
191 // Sender --> Receiver
192 base::TimeTicks reference_time_sent = sender_clock_->NowTicks();
193 uint32 rtp_timestamp_sent = 0xbee5 + i;
194 rtcp_for_sender_.SendRtcpFromRtpSender(
195 reference_time_sent, rtp_timestamp_sent, 1, 1);
196 EXPECT_EQ(expected_rtt_according_to_sender,
197 rtcp_for_sender_.current_round_trip_time());
198 #ifdef SENDER_PROVIDES_REPORT_BLOCK
199 EXPECT_EQ(expected_rtt_according_to_receiver,
200 rtcp_for_receiver_.current_round_trip_time());
201 #endif
202
203 // Receiver --> Sender
204 rtcp_for_receiver_.SendRtcpFromRtpReceiver(
205 NULL, base::TimeDelta(), NULL, &stats_);
206 expected_rtt_according_to_sender = one_way_trip_time * 2;
207 EXPECT_EQ(expected_rtt_according_to_sender,
208 rtcp_for_sender_.current_round_trip_time());
209 #ifdef SENDER_PROVIDES_REPORT_BLOCK
210 EXPECT_EQ(expected_rtt_according_to_receiver,
211 rtcp_for_receiver_.current_round_trip_time();
212 #endif
213
214 // In the next iteration of this loop, after the receiver gets the sender
215 // report, it will be measuring a round trip time consisting of two
216 // different one-way trip times.
217 expected_rtt_according_to_receiver =
218 (one_way_trip_time + one_way_trip_time * 2) / 2;
219 }
216 } 220 }
217 221
218 TEST_F(RtcpTest, BasicCast) { 222 // TODO(miu): Find a better home for this test.
219 EXPECT_CALL(mock_frame_sender_, OnReceivedCastFeedback(_)).Times(1); 223 TEST(MisplacedCastTest, NtpAndTime) {
220
221 // Media sender.
222 Rtcp rtcp(base::Bind(&MockFrameSender::OnReceivedCastFeedback,
223 base::Unretained(&mock_frame_sender_)),
224 base::Bind(&MockFrameSender::OnReceivedRtt,
225 base::Unretained(&mock_frame_sender_)),
226 RtcpLogMessageCallback(),
227 testing_clock_.get(),
228 &receiver_to_sender_,
229 kSenderSsrc,
230 kSenderSsrc);
231 receiver_to_sender_.set_rtcp_receiver(&rtcp);
232 RtcpCastMessage cast_message(kSenderSsrc);
233 cast_message.ack_frame_id = kAckFrameId;
234 PacketIdSet missing_packets;
235 cast_message.missing_frames_and_packets[kLostFrameId] = missing_packets;
236
237 missing_packets.insert(kLostPacketId1);
238 missing_packets.insert(kLostPacketId2);
239 missing_packets.insert(kLostPacketId3);
240 cast_message.missing_frames_and_packets[kFrameIdWithLostPackets] =
241 missing_packets;
242 rtcp.SendRtcpFromRtpReceiver(&cast_message, base::TimeDelta(), NULL, NULL);
243 }
244
245 TEST_F(RtcpTest, RttReducedSizeRtcp) {
246 // Media receiver.
247 Rtcp rtcp_receiver(RtcpCastMessageCallback(),
248 RtcpRttCallback(),
249 RtcpLogMessageCallback(),
250 testing_clock_.get(),
251 &receiver_to_sender_,
252 kReceiverSsrc,
253 kSenderSsrc);
254
255 // Media sender.
256 Rtcp rtcp_sender(base::Bind(&MockFrameSender::OnReceivedCastFeedback,
257 base::Unretained(&mock_frame_sender_)),
258 base::Bind(&MockFrameSender::OnReceivedRtt,
259 base::Unretained(&mock_frame_sender_)),
260 RtcpLogMessageCallback(),
261 testing_clock_.get(),
262 &sender_to_receiver_,
263 kSenderSsrc,
264 kReceiverSsrc);
265
266 sender_to_receiver_.set_rtcp_receiver(&rtcp_receiver);
267 receiver_to_sender_.set_rtcp_receiver(&rtcp_sender);
268
269 base::TimeDelta rtt;
270 base::TimeDelta avg_rtt;
271 base::TimeDelta min_rtt;
272 base::TimeDelta max_rtt;
273 EXPECT_FALSE(rtcp_sender.Rtt(&rtt, &avg_rtt, &min_rtt, &max_rtt));
274
275 rtcp_sender.SendRtcpFromRtpSender(testing_clock_->NowTicks(), 1, 1, 1);
276 RunTasks(33);
277 rtcp_receiver.SendRtcpFromRtpReceiver(NULL, base::TimeDelta(), NULL, &stats_);
278 EXPECT_TRUE(rtcp_sender.Rtt(&rtt, &avg_rtt, &min_rtt, &max_rtt));
279 rtcp_sender.SendRtcpFromRtpSender(testing_clock_->NowTicks(), 2, 1, 1);
280 RunTasks(33);
281 }
282
283 TEST_F(RtcpTest, Rtt) {
284 // Media receiver.
285 Rtcp rtcp_receiver(RtcpCastMessageCallback(),
286 RtcpRttCallback(),
287 RtcpLogMessageCallback(),
288 testing_clock_.get(),
289 &receiver_to_sender_,
290 kReceiverSsrc,
291 kSenderSsrc);
292
293 // Media sender.
294 Rtcp rtcp_sender(base::Bind(&MockFrameSender::OnReceivedCastFeedback,
295 base::Unretained(&mock_frame_sender_)),
296 base::Bind(&MockFrameSender::OnReceivedRtt,
297 base::Unretained(&mock_frame_sender_)),
298 RtcpLogMessageCallback(),
299 testing_clock_.get(),
300 &sender_to_receiver_,
301 kSenderSsrc,
302 kReceiverSsrc);
303
304 receiver_to_sender_.set_rtcp_receiver(&rtcp_sender);
305 sender_to_receiver_.set_rtcp_receiver(&rtcp_receiver);
306
307 base::TimeDelta rtt;
308 base::TimeDelta avg_rtt;
309 base::TimeDelta min_rtt;
310 base::TimeDelta max_rtt;
311 EXPECT_FALSE(rtcp_sender.Rtt(&rtt, &avg_rtt, &min_rtt, &max_rtt));
312
313 rtcp_sender.SendRtcpFromRtpSender(testing_clock_->NowTicks(), 1, 1, 1);
314 RunTasks(33);
315 rtcp_receiver.SendRtcpFromRtpReceiver(NULL, base::TimeDelta(), NULL, &stats_);
316
317 EXPECT_TRUE(rtcp_sender.Rtt(&rtt, &avg_rtt, &min_rtt, &max_rtt));
318 RunTasks(33);
319
320 RunTasks(33);
321
322 EXPECT_NEAR(2 * kAddedDelay, rtt.InMilliseconds(), 2);
323 EXPECT_NEAR(2 * kAddedDelay, avg_rtt.InMilliseconds(), 2);
324 EXPECT_NEAR(2 * kAddedDelay, min_rtt.InMilliseconds(), 2);
325 EXPECT_NEAR(2 * kAddedDelay, max_rtt.InMilliseconds(), 2);
326
327 rtcp_sender.SendRtcpFromRtpSender(testing_clock_->NowTicks(), 2, 1, 1);
328 RunTasks(33);
329
330 receiver_to_sender_.set_short_delay();
331 sender_to_receiver_.set_short_delay();
332 rtcp_receiver.SendRtcpFromRtpReceiver(NULL, base::TimeDelta(), NULL, &stats_);
333 EXPECT_TRUE(rtcp_sender.Rtt(&rtt, &avg_rtt, &min_rtt, &max_rtt));
334 EXPECT_NEAR(kAddedDelay + kAddedShortDelay, rtt.InMilliseconds(), 2);
335 EXPECT_NEAR(
336 (kAddedShortDelay + 3 * kAddedDelay) / 2, avg_rtt.InMilliseconds(), 2);
337 EXPECT_NEAR(kAddedDelay + kAddedShortDelay, min_rtt.InMilliseconds(), 2);
338 EXPECT_NEAR(2 * kAddedDelay, max_rtt.InMilliseconds(), 2);
339
340 rtcp_sender.SendRtcpFromRtpSender(testing_clock_->NowTicks(), 3, 1, 1);
341 RunTasks(33);
342
343 rtcp_receiver.SendRtcpFromRtpReceiver(NULL, base::TimeDelta(), NULL, &stats_);
344 EXPECT_TRUE(rtcp_sender.Rtt(&rtt, &avg_rtt, &min_rtt, &max_rtt));
345 EXPECT_NEAR(2 * kAddedShortDelay, rtt.InMilliseconds(), 2);
346 EXPECT_NEAR(2 * kAddedShortDelay, min_rtt.InMilliseconds(), 2);
347 EXPECT_NEAR(2 * kAddedDelay, max_rtt.InMilliseconds(), 2);
348
349 rtcp_receiver.SendRtcpFromRtpReceiver(NULL, base::TimeDelta(), NULL, &stats_);
350 EXPECT_TRUE(rtcp_sender.Rtt(&rtt, &avg_rtt, &min_rtt, &max_rtt));
351 EXPECT_NEAR(2 * kAddedShortDelay, rtt.InMilliseconds(), 2);
352 EXPECT_NEAR(2 * kAddedShortDelay, min_rtt.InMilliseconds(), 2);
353 EXPECT_NEAR(2 * kAddedDelay, max_rtt.InMilliseconds(), 2);
354 }
355
356 TEST_F(RtcpTest, RttWithPacketLoss) {
357 // Media receiver.
358 Rtcp rtcp_receiver(RtcpCastMessageCallback(),
359 RtcpRttCallback(),
360 RtcpLogMessageCallback(),
361 testing_clock_.get(),
362 &receiver_to_sender_,
363 kReceiverSsrc,
364 kSenderSsrc);
365
366 // Media sender.
367 Rtcp rtcp_sender(base::Bind(&MockFrameSender::OnReceivedCastFeedback,
368 base::Unretained(&mock_frame_sender_)),
369 base::Bind(&MockFrameSender::OnReceivedRtt,
370 base::Unretained(&mock_frame_sender_)),
371 RtcpLogMessageCallback(),
372 testing_clock_.get(),
373 &sender_to_receiver_,
374 kSenderSsrc,
375 kReceiverSsrc);
376
377 receiver_to_sender_.set_rtcp_receiver(&rtcp_sender);
378 sender_to_receiver_.set_rtcp_receiver(&rtcp_receiver);
379
380 rtcp_receiver.SendRtcpFromRtpReceiver(NULL, base::TimeDelta(), NULL, &stats_);
381 rtcp_sender.SendRtcpFromRtpSender(testing_clock_->NowTicks(), 0, 1, 1);
382 RunTasks(33);
383
384 base::TimeDelta rtt;
385 base::TimeDelta avg_rtt;
386 base::TimeDelta min_rtt;
387 base::TimeDelta max_rtt;
388 EXPECT_FALSE(rtcp_sender.Rtt(&rtt, &avg_rtt, &min_rtt, &max_rtt));
389
390 receiver_to_sender_.set_short_delay();
391 sender_to_receiver_.set_short_delay();
392 receiver_to_sender_.set_drop_packets(true);
393
394 rtcp_receiver.SendRtcpFromRtpReceiver(NULL, base::TimeDelta(), NULL, &stats_);
395 rtcp_sender.SendRtcpFromRtpSender(testing_clock_->NowTicks(), 1, 1, 1);
396 RunTasks(33);
397
398 }
399
400 TEST_F(RtcpTest, NtpAndTime) {
401 const int64 kSecondsbetweenYear1900and2010 = INT64_C(40176 * 24 * 60 * 60); 224 const int64 kSecondsbetweenYear1900and2010 = INT64_C(40176 * 24 * 60 * 60);
402 const int64 kSecondsbetweenYear1900and2030 = INT64_C(47481 * 24 * 60 * 60); 225 const int64 kSecondsbetweenYear1900and2030 = INT64_C(47481 * 24 * 60 * 60);
403 226
404 uint32 ntp_seconds_1 = 0; 227 uint32 ntp_seconds_1 = 0;
405 uint32 ntp_fraction_1 = 0; 228 uint32 ntp_fraction_1 = 0;
406 base::TimeTicks input_time = base::TimeTicks::Now(); 229 base::TimeTicks input_time = base::TimeTicks::Now();
407 ConvertTimeTicksToNtp(input_time, &ntp_seconds_1, &ntp_fraction_1); 230 ConvertTimeTicksToNtp(input_time, &ntp_seconds_1, &ntp_fraction_1);
408 231
409 // Verify absolute value. 232 // Verify absolute value.
410 EXPECT_GT(ntp_seconds_1, kSecondsbetweenYear1900and2010); 233 EXPECT_GT(ntp_seconds_1, kSecondsbetweenYear1900and2010);
(...skipping 27 matching lines...) Expand all
438 base::TimeTicks out_3 = ConvertNtpToTimeTicks(ntp_seconds_3, ntp_fraction_3); 261 base::TimeTicks out_3 = ConvertNtpToTimeTicks(ntp_seconds_3, ntp_fraction_3);
439 EXPECT_EQ(input_time, out_3); // Verify inverse. 262 EXPECT_EQ(input_time, out_3); // Verify inverse.
440 263
441 // Verify delta. 264 // Verify delta.
442 EXPECT_EQ((out_3 - out_2), time_delta); 265 EXPECT_EQ((out_3 - out_2), time_delta);
443 EXPECT_NEAR((ntp_fraction_3 - ntp_fraction_2), 0xffffffff / 2, 1); 266 EXPECT_NEAR((ntp_fraction_3 - ntp_fraction_2), 0xffffffff / 2, 1);
444 } 267 }
445 268
446 } // namespace cast 269 } // namespace cast
447 } // namespace media 270 } // namespace media
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698