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" | |
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 Loading... |
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 |
OLD | NEW |