OLD | NEW |
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" | 10 #include "media/cast/net/cast_transport_sender_impl.h" |
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
52 return true; | 52 return true; |
53 | 53 |
54 rtcp_receiver_->IncomingRtcpPacket(&packet->data[0], packet->data.size()); | 54 rtcp_receiver_->IncomingRtcpPacket(&packet->data[0], packet->data.size()); |
55 return true; | 55 return true; |
56 } | 56 } |
57 | 57 |
58 private: | 58 private: |
59 bool drop_packets_; | 59 bool drop_packets_; |
60 bool short_delay_; | 60 bool short_delay_; |
61 Rtcp* rtcp_receiver_; | 61 Rtcp* rtcp_receiver_; |
62 base::SimpleTestTickClock* testing_clock_; | 62 base::SimpleTestTickClock* testing_clock_; // Not owned. |
63 | 63 |
64 DISALLOW_COPY_AND_ASSIGN(RtcpTestPacketSender); | 64 DISALLOW_COPY_AND_ASSIGN(RtcpTestPacketSender); |
65 }; | 65 }; |
66 | 66 |
67 class LocalRtcpTransport : public PacedPacketSender { | 67 class LocalRtcpTransport : public PacedPacketSender { |
68 public: | 68 public: |
69 explicit LocalRtcpTransport(base::SimpleTestTickClock* testing_clock) | 69 explicit LocalRtcpTransport(base::SimpleTestTickClock* testing_clock) |
70 : drop_packets_(false), | 70 : drop_packets_(false), |
71 short_delay_(false), | 71 short_delay_(false), |
72 testing_clock_(testing_clock) {} | 72 testing_clock_(testing_clock) {} |
(...skipping 30 matching lines...) Expand all Loading... |
103 } | 103 } |
104 | 104 |
105 virtual void CancelSendingPacket( | 105 virtual void CancelSendingPacket( |
106 const PacketKey& packet_key) OVERRIDE { | 106 const PacketKey& packet_key) OVERRIDE { |
107 } | 107 } |
108 | 108 |
109 private: | 109 private: |
110 bool drop_packets_; | 110 bool drop_packets_; |
111 bool short_delay_; | 111 bool short_delay_; |
112 Rtcp* rtcp_; | 112 Rtcp* rtcp_; |
113 base::SimpleTestTickClock* testing_clock_; | 113 base::SimpleTestTickClock* testing_clock_; // Not owned. |
114 | 114 |
115 DISALLOW_COPY_AND_ASSIGN(LocalRtcpTransport); | 115 DISALLOW_COPY_AND_ASSIGN(LocalRtcpTransport); |
116 }; | 116 }; |
117 | 117 |
118 class MockReceiverStats : public RtpReceiverStatistics { | 118 class MockReceiverStats : public RtpReceiverStatistics { |
119 public: | 119 public: |
120 MockReceiverStats() {} | 120 MockReceiverStats() {} |
121 virtual ~MockReceiverStats() {} | 121 virtual ~MockReceiverStats() {} |
122 | 122 |
123 virtual void GetStatistics(uint8* fraction_lost, | 123 virtual void GetStatistics(uint8* fraction_lost, |
(...skipping 23 matching lines...) Expand all Loading... |
147 base::TimeDelta min_rtt, | 147 base::TimeDelta min_rtt, |
148 base::TimeDelta max_rtt)); | 148 base::TimeDelta max_rtt)); |
149 private: | 149 private: |
150 DISALLOW_COPY_AND_ASSIGN(MockFrameSender); | 150 DISALLOW_COPY_AND_ASSIGN(MockFrameSender); |
151 }; | 151 }; |
152 | 152 |
153 class RtcpTest : public ::testing::Test { | 153 class RtcpTest : public ::testing::Test { |
154 protected: | 154 protected: |
155 RtcpTest() | 155 RtcpTest() |
156 : testing_clock_(new base::SimpleTestTickClock()), | 156 : testing_clock_(new base::SimpleTestTickClock()), |
157 task_runner_(new test::FakeSingleThreadTaskRunner(testing_clock_)), | 157 task_runner_( |
158 sender_to_receiver_(testing_clock_), | 158 new test::FakeSingleThreadTaskRunner(testing_clock_.get())), |
159 receiver_to_sender_(testing_clock_) { | 159 sender_to_receiver_(testing_clock_.get()), |
| 160 receiver_to_sender_(testing_clock_.get()) { |
160 testing_clock_->Advance(base::TimeTicks::Now() - base::TimeTicks()); | 161 testing_clock_->Advance(base::TimeTicks::Now() - base::TimeTicks()); |
161 } | 162 } |
162 | 163 |
163 virtual ~RtcpTest() {} | 164 virtual ~RtcpTest() {} |
164 | 165 |
165 static void UpdateCastTransportStatus(CastTransportStatus status) { | 166 static void UpdateCastTransportStatus(CastTransportStatus status) { |
166 bool result = (status == TRANSPORT_AUDIO_INITIALIZED || | 167 bool result = (status == TRANSPORT_AUDIO_INITIALIZED || |
167 status == TRANSPORT_VIDEO_INITIALIZED); | 168 status == TRANSPORT_VIDEO_INITIALIZED); |
168 EXPECT_TRUE(result); | 169 EXPECT_TRUE(result); |
169 } | 170 } |
170 | 171 |
171 void RunTasks(int during_ms) { | 172 void RunTasks(int during_ms) { |
172 for (int i = 0; i < during_ms; ++i) { | 173 for (int i = 0; i < during_ms; ++i) { |
173 // Call process the timers every 1 ms. | 174 // Call process the timers every 1 ms. |
174 testing_clock_->Advance(base::TimeDelta::FromMilliseconds(1)); | 175 testing_clock_->Advance(base::TimeDelta::FromMilliseconds(1)); |
175 task_runner_->RunTasks(); | 176 task_runner_->RunTasks(); |
176 } | 177 } |
177 } | 178 } |
178 | 179 |
179 base::SimpleTestTickClock* testing_clock_; // Owned by CastEnvironment. | 180 scoped_ptr<base::SimpleTestTickClock> testing_clock_; |
180 scoped_refptr<test::FakeSingleThreadTaskRunner> task_runner_; | 181 scoped_refptr<test::FakeSingleThreadTaskRunner> task_runner_; |
181 LocalRtcpTransport sender_to_receiver_; | 182 LocalRtcpTransport sender_to_receiver_; |
182 LocalRtcpTransport receiver_to_sender_; | 183 LocalRtcpTransport receiver_to_sender_; |
183 MockFrameSender mock_frame_sender_; | 184 MockFrameSender mock_frame_sender_; |
184 MockReceiverStats stats_; | 185 MockReceiverStats stats_; |
185 | 186 |
186 DISALLOW_COPY_AND_ASSIGN(RtcpTest); | 187 DISALLOW_COPY_AND_ASSIGN(RtcpTest); |
187 }; | 188 }; |
188 | 189 |
189 TEST_F(RtcpTest, BasicSenderReport) { | 190 TEST_F(RtcpTest, BasicSenderReport) { |
190 Rtcp rtcp(base::Bind(&MockFrameSender::OnReceivedCastFeedback, | 191 Rtcp rtcp(base::Bind(&MockFrameSender::OnReceivedCastFeedback, |
191 base::Unretained(&mock_frame_sender_)), | 192 base::Unretained(&mock_frame_sender_)), |
192 base::Bind(&MockFrameSender::OnReceivedRtt, | 193 base::Bind(&MockFrameSender::OnReceivedRtt, |
193 base::Unretained(&mock_frame_sender_)), | 194 base::Unretained(&mock_frame_sender_)), |
194 RtcpLogMessageCallback(), | 195 RtcpLogMessageCallback(), |
195 testing_clock_, | 196 testing_clock_.get(), |
196 &sender_to_receiver_, | 197 &sender_to_receiver_, |
197 kSenderSsrc, | 198 kSenderSsrc, |
198 kReceiverSsrc); | 199 kReceiverSsrc); |
199 sender_to_receiver_.set_rtcp_receiver(&rtcp); | 200 sender_to_receiver_.set_rtcp_receiver(&rtcp); |
200 rtcp.SendRtcpFromRtpSender(base::TimeTicks(), 0, 1, 1); | 201 rtcp.SendRtcpFromRtpSender(base::TimeTicks(), 0, 1, 1); |
201 } | 202 } |
202 | 203 |
203 TEST_F(RtcpTest, BasicReceiverReport) { | 204 TEST_F(RtcpTest, BasicReceiverReport) { |
204 Rtcp rtcp(base::Bind(&MockFrameSender::OnReceivedCastFeedback, | 205 Rtcp rtcp(base::Bind(&MockFrameSender::OnReceivedCastFeedback, |
205 base::Unretained(&mock_frame_sender_)), | 206 base::Unretained(&mock_frame_sender_)), |
206 base::Bind(&MockFrameSender::OnReceivedRtt, | 207 base::Bind(&MockFrameSender::OnReceivedRtt, |
207 base::Unretained(&mock_frame_sender_)), | 208 base::Unretained(&mock_frame_sender_)), |
208 RtcpLogMessageCallback(), | 209 RtcpLogMessageCallback(), |
209 testing_clock_, | 210 testing_clock_.get(), |
210 &receiver_to_sender_, | 211 &receiver_to_sender_, |
211 kSenderSsrc, | 212 kSenderSsrc, |
212 kReceiverSsrc); | 213 kReceiverSsrc); |
213 receiver_to_sender_.set_rtcp_receiver(&rtcp); | 214 receiver_to_sender_.set_rtcp_receiver(&rtcp); |
214 rtcp.SendRtcpFromRtpReceiver(NULL, base::TimeDelta(), NULL, &stats_); | 215 rtcp.SendRtcpFromRtpReceiver(NULL, base::TimeDelta(), NULL, &stats_); |
215 } | 216 } |
216 | 217 |
217 TEST_F(RtcpTest, BasicCast) { | 218 TEST_F(RtcpTest, BasicCast) { |
218 EXPECT_CALL(mock_frame_sender_, OnReceivedCastFeedback(_)).Times(1); | 219 EXPECT_CALL(mock_frame_sender_, OnReceivedCastFeedback(_)).Times(1); |
219 | 220 |
220 // Media sender. | 221 // Media sender. |
221 Rtcp rtcp(base::Bind(&MockFrameSender::OnReceivedCastFeedback, | 222 Rtcp rtcp(base::Bind(&MockFrameSender::OnReceivedCastFeedback, |
222 base::Unretained(&mock_frame_sender_)), | 223 base::Unretained(&mock_frame_sender_)), |
223 base::Bind(&MockFrameSender::OnReceivedRtt, | 224 base::Bind(&MockFrameSender::OnReceivedRtt, |
224 base::Unretained(&mock_frame_sender_)), | 225 base::Unretained(&mock_frame_sender_)), |
225 RtcpLogMessageCallback(), | 226 RtcpLogMessageCallback(), |
226 testing_clock_, | 227 testing_clock_.get(), |
227 &receiver_to_sender_, | 228 &receiver_to_sender_, |
228 kSenderSsrc, | 229 kSenderSsrc, |
229 kSenderSsrc); | 230 kSenderSsrc); |
230 receiver_to_sender_.set_rtcp_receiver(&rtcp); | 231 receiver_to_sender_.set_rtcp_receiver(&rtcp); |
231 RtcpCastMessage cast_message(kSenderSsrc); | 232 RtcpCastMessage cast_message(kSenderSsrc); |
232 cast_message.ack_frame_id = kAckFrameId; | 233 cast_message.ack_frame_id = kAckFrameId; |
233 PacketIdSet missing_packets; | 234 PacketIdSet missing_packets; |
234 cast_message.missing_frames_and_packets[kLostFrameId] = missing_packets; | 235 cast_message.missing_frames_and_packets[kLostFrameId] = missing_packets; |
235 | 236 |
236 missing_packets.insert(kLostPacketId1); | 237 missing_packets.insert(kLostPacketId1); |
237 missing_packets.insert(kLostPacketId2); | 238 missing_packets.insert(kLostPacketId2); |
238 missing_packets.insert(kLostPacketId3); | 239 missing_packets.insert(kLostPacketId3); |
239 cast_message.missing_frames_and_packets[kFrameIdWithLostPackets] = | 240 cast_message.missing_frames_and_packets[kFrameIdWithLostPackets] = |
240 missing_packets; | 241 missing_packets; |
241 rtcp.SendRtcpFromRtpReceiver(&cast_message, base::TimeDelta(), NULL, NULL); | 242 rtcp.SendRtcpFromRtpReceiver(&cast_message, base::TimeDelta(), NULL, NULL); |
242 } | 243 } |
243 | 244 |
244 TEST_F(RtcpTest, RttReducedSizeRtcp) { | 245 TEST_F(RtcpTest, RttReducedSizeRtcp) { |
245 // Media receiver. | 246 // Media receiver. |
246 Rtcp rtcp_receiver(RtcpCastMessageCallback(), | 247 Rtcp rtcp_receiver(RtcpCastMessageCallback(), |
247 RtcpRttCallback(), | 248 RtcpRttCallback(), |
248 RtcpLogMessageCallback(), | 249 RtcpLogMessageCallback(), |
249 testing_clock_, | 250 testing_clock_.get(), |
250 &receiver_to_sender_, | 251 &receiver_to_sender_, |
251 kReceiverSsrc, | 252 kReceiverSsrc, |
252 kSenderSsrc); | 253 kSenderSsrc); |
253 | 254 |
254 // Media sender. | 255 // Media sender. |
255 Rtcp rtcp_sender(base::Bind(&MockFrameSender::OnReceivedCastFeedback, | 256 Rtcp rtcp_sender(base::Bind(&MockFrameSender::OnReceivedCastFeedback, |
256 base::Unretained(&mock_frame_sender_)), | 257 base::Unretained(&mock_frame_sender_)), |
257 base::Bind(&MockFrameSender::OnReceivedRtt, | 258 base::Bind(&MockFrameSender::OnReceivedRtt, |
258 base::Unretained(&mock_frame_sender_)), | 259 base::Unretained(&mock_frame_sender_)), |
259 RtcpLogMessageCallback(), | 260 RtcpLogMessageCallback(), |
260 testing_clock_, | 261 testing_clock_.get(), |
261 &sender_to_receiver_, | 262 &sender_to_receiver_, |
262 kSenderSsrc, | 263 kSenderSsrc, |
263 kReceiverSsrc); | 264 kReceiverSsrc); |
264 | 265 |
265 sender_to_receiver_.set_rtcp_receiver(&rtcp_receiver); | 266 sender_to_receiver_.set_rtcp_receiver(&rtcp_receiver); |
266 receiver_to_sender_.set_rtcp_receiver(&rtcp_sender); | 267 receiver_to_sender_.set_rtcp_receiver(&rtcp_sender); |
267 | 268 |
268 base::TimeDelta rtt; | 269 base::TimeDelta rtt; |
269 base::TimeDelta avg_rtt; | 270 base::TimeDelta avg_rtt; |
270 base::TimeDelta min_rtt; | 271 base::TimeDelta min_rtt; |
(...skipping 18 matching lines...) Expand all Loading... |
289 EXPECT_NEAR(2 * kAddedDelay, avg_rtt.InMilliseconds(), 2); | 290 EXPECT_NEAR(2 * kAddedDelay, avg_rtt.InMilliseconds(), 2); |
290 EXPECT_NEAR(2 * kAddedDelay, min_rtt.InMilliseconds(), 2); | 291 EXPECT_NEAR(2 * kAddedDelay, min_rtt.InMilliseconds(), 2); |
291 EXPECT_NEAR(2 * kAddedDelay, max_rtt.InMilliseconds(), 2); | 292 EXPECT_NEAR(2 * kAddedDelay, max_rtt.InMilliseconds(), 2); |
292 } | 293 } |
293 | 294 |
294 TEST_F(RtcpTest, Rtt) { | 295 TEST_F(RtcpTest, Rtt) { |
295 // Media receiver. | 296 // Media receiver. |
296 Rtcp rtcp_receiver(RtcpCastMessageCallback(), | 297 Rtcp rtcp_receiver(RtcpCastMessageCallback(), |
297 RtcpRttCallback(), | 298 RtcpRttCallback(), |
298 RtcpLogMessageCallback(), | 299 RtcpLogMessageCallback(), |
299 testing_clock_, | 300 testing_clock_.get(), |
300 &receiver_to_sender_, | 301 &receiver_to_sender_, |
301 kReceiverSsrc, | 302 kReceiverSsrc, |
302 kSenderSsrc); | 303 kSenderSsrc); |
303 | 304 |
304 // Media sender. | 305 // Media sender. |
305 Rtcp rtcp_sender(base::Bind(&MockFrameSender::OnReceivedCastFeedback, | 306 Rtcp rtcp_sender(base::Bind(&MockFrameSender::OnReceivedCastFeedback, |
306 base::Unretained(&mock_frame_sender_)), | 307 base::Unretained(&mock_frame_sender_)), |
307 base::Bind(&MockFrameSender::OnReceivedRtt, | 308 base::Bind(&MockFrameSender::OnReceivedRtt, |
308 base::Unretained(&mock_frame_sender_)), | 309 base::Unretained(&mock_frame_sender_)), |
309 RtcpLogMessageCallback(), | 310 RtcpLogMessageCallback(), |
310 testing_clock_, | 311 testing_clock_.get(), |
311 &sender_to_receiver_, | 312 &sender_to_receiver_, |
312 kSenderSsrc, | 313 kSenderSsrc, |
313 kReceiverSsrc); | 314 kReceiverSsrc); |
314 | 315 |
315 receiver_to_sender_.set_rtcp_receiver(&rtcp_sender); | 316 receiver_to_sender_.set_rtcp_receiver(&rtcp_sender); |
316 sender_to_receiver_.set_rtcp_receiver(&rtcp_receiver); | 317 sender_to_receiver_.set_rtcp_receiver(&rtcp_receiver); |
317 | 318 |
318 base::TimeDelta rtt; | 319 base::TimeDelta rtt; |
319 base::TimeDelta avg_rtt; | 320 base::TimeDelta avg_rtt; |
320 base::TimeDelta min_rtt; | 321 base::TimeDelta min_rtt; |
(...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
376 EXPECT_NEAR(2 * kAddedShortDelay, rtt.InMilliseconds(), 2); | 377 EXPECT_NEAR(2 * kAddedShortDelay, rtt.InMilliseconds(), 2); |
377 EXPECT_NEAR(2 * kAddedShortDelay, min_rtt.InMilliseconds(), 2); | 378 EXPECT_NEAR(2 * kAddedShortDelay, min_rtt.InMilliseconds(), 2); |
378 EXPECT_NEAR(2 * kAddedDelay, max_rtt.InMilliseconds(), 2); | 379 EXPECT_NEAR(2 * kAddedDelay, max_rtt.InMilliseconds(), 2); |
379 } | 380 } |
380 | 381 |
381 TEST_F(RtcpTest, RttWithPacketLoss) { | 382 TEST_F(RtcpTest, RttWithPacketLoss) { |
382 // Media receiver. | 383 // Media receiver. |
383 Rtcp rtcp_receiver(RtcpCastMessageCallback(), | 384 Rtcp rtcp_receiver(RtcpCastMessageCallback(), |
384 RtcpRttCallback(), | 385 RtcpRttCallback(), |
385 RtcpLogMessageCallback(), | 386 RtcpLogMessageCallback(), |
386 testing_clock_, | 387 testing_clock_.get(), |
387 &receiver_to_sender_, | 388 &receiver_to_sender_, |
388 kReceiverSsrc, | 389 kReceiverSsrc, |
389 kSenderSsrc); | 390 kSenderSsrc); |
390 | 391 |
391 // Media sender. | 392 // Media sender. |
392 Rtcp rtcp_sender(base::Bind(&MockFrameSender::OnReceivedCastFeedback, | 393 Rtcp rtcp_sender(base::Bind(&MockFrameSender::OnReceivedCastFeedback, |
393 base::Unretained(&mock_frame_sender_)), | 394 base::Unretained(&mock_frame_sender_)), |
394 base::Bind(&MockFrameSender::OnReceivedRtt, | 395 base::Bind(&MockFrameSender::OnReceivedRtt, |
395 base::Unretained(&mock_frame_sender_)), | 396 base::Unretained(&mock_frame_sender_)), |
396 RtcpLogMessageCallback(), | 397 RtcpLogMessageCallback(), |
397 testing_clock_, | 398 testing_clock_.get(), |
398 &sender_to_receiver_, | 399 &sender_to_receiver_, |
399 kSenderSsrc, | 400 kSenderSsrc, |
400 kReceiverSsrc); | 401 kReceiverSsrc); |
401 | 402 |
402 receiver_to_sender_.set_rtcp_receiver(&rtcp_sender); | 403 receiver_to_sender_.set_rtcp_receiver(&rtcp_sender); |
403 sender_to_receiver_.set_rtcp_receiver(&rtcp_receiver); | 404 sender_to_receiver_.set_rtcp_receiver(&rtcp_receiver); |
404 | 405 |
405 rtcp_receiver.SendRtcpFromRtpReceiver(NULL, base::TimeDelta(), NULL, &stats_); | 406 rtcp_receiver.SendRtcpFromRtpReceiver(NULL, base::TimeDelta(), NULL, &stats_); |
406 rtcp_sender.SendRtcpFromRtpSender(testing_clock_->NowTicks(), 0, 1, 1); | 407 rtcp_sender.SendRtcpFromRtpSender(testing_clock_->NowTicks(), 0, 1, 1); |
407 RunTasks(33); | 408 RunTasks(33); |
(...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
470 base::TimeTicks out_3 = ConvertNtpToTimeTicks(ntp_seconds_3, ntp_fraction_3); | 471 base::TimeTicks out_3 = ConvertNtpToTimeTicks(ntp_seconds_3, ntp_fraction_3); |
471 EXPECT_EQ(input_time, out_3); // Verify inverse. | 472 EXPECT_EQ(input_time, out_3); // Verify inverse. |
472 | 473 |
473 // Verify delta. | 474 // Verify delta. |
474 EXPECT_EQ((out_3 - out_2), time_delta); | 475 EXPECT_EQ((out_3 - out_2), time_delta); |
475 EXPECT_NEAR((ntp_fraction_3 - ntp_fraction_2), 0xffffffff / 2, 1); | 476 EXPECT_NEAR((ntp_fraction_3 - ntp_fraction_2), 0xffffffff / 2, 1); |
476 } | 477 } |
477 | 478 |
478 } // namespace cast | 479 } // namespace cast |
479 } // namespace media | 480 } // namespace media |
OLD | NEW |