| OLD | NEW |
| 1 // Copyright 2013 The Chromium Authors. All rights reserved. | 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 | 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/cast_environment.h" | 9 #include "media/cast/cast_environment.h" |
| 10 #include "media/cast/rtcp/mock_rtcp_receiver_feedback.h" | 10 #include "media/cast/net/cast_transport_config.h" |
| 11 #include "media/cast/rtcp/mock_rtcp_sender_feedback.h" | 11 #include "media/cast/net/cast_transport_sender_impl.h" |
| 12 #include "media/cast/rtcp/rtcp.h" | 12 #include "media/cast/net/pacing/paced_sender.h" |
| 13 #include "media/cast/rtcp/test_rtcp_packet_builder.h" | 13 #include "media/cast/net/rtcp/mock_rtcp_receiver_feedback.h" |
| 14 #include "media/cast/net/rtcp/mock_rtcp_sender_feedback.h" |
| 15 #include "media/cast/net/rtcp/rtcp.h" |
| 16 #include "media/cast/net/rtcp/test_rtcp_packet_builder.h" |
| 14 #include "media/cast/test/fake_single_thread_task_runner.h" | 17 #include "media/cast/test/fake_single_thread_task_runner.h" |
| 15 #include "media/cast/transport/cast_transport_config.h" | |
| 16 #include "media/cast/transport/cast_transport_sender_impl.h" | |
| 17 #include "media/cast/transport/pacing/paced_sender.h" | |
| 18 #include "testing/gmock/include/gmock/gmock.h" | 18 #include "testing/gmock/include/gmock/gmock.h" |
| 19 | 19 |
| 20 namespace media { | 20 namespace media { |
| 21 namespace cast { | 21 namespace cast { |
| 22 | 22 |
| 23 using testing::_; | 23 using testing::_; |
| 24 | 24 |
| 25 static const uint32 kSenderSsrc = 0x10203; | 25 static const uint32 kSenderSsrc = 0x10203; |
| 26 static const uint32 kReceiverSsrc = 0x40506; | 26 static const uint32 kReceiverSsrc = 0x40506; |
| 27 static const std::string kCName("test@10.1.1.1"); | 27 static const std::string kCName("test@10.1.1.1"); |
| 28 static const uint32 kRtcpIntervalMs = 500; | 28 static const uint32 kRtcpIntervalMs = 500; |
| 29 static const int64 kAddedDelay = 123; | 29 static const int64 kAddedDelay = 123; |
| 30 static const int64 kAddedShortDelay = 100; | 30 static const int64 kAddedShortDelay = 100; |
| 31 | 31 |
| 32 class RtcpTestPacketSender : public transport::PacketSender { | 32 class RtcpTestPacketSender : public PacketSender { |
| 33 public: | 33 public: |
| 34 explicit RtcpTestPacketSender(base::SimpleTestTickClock* testing_clock) | 34 explicit RtcpTestPacketSender(base::SimpleTestTickClock* testing_clock) |
| 35 : drop_packets_(false), | 35 : drop_packets_(false), |
| 36 short_delay_(false), | 36 short_delay_(false), |
| 37 rtcp_receiver_(NULL), | 37 rtcp_receiver_(NULL), |
| 38 testing_clock_(testing_clock) {} | 38 testing_clock_(testing_clock) {} |
| 39 virtual ~RtcpTestPacketSender() {} | 39 virtual ~RtcpTestPacketSender() {} |
| 40 // Packet lists imply a RTP packet. | 40 // Packet lists imply a RTP packet. |
| 41 void set_rtcp_receiver(Rtcp* rtcp) { rtcp_receiver_ = rtcp; } | 41 void set_rtcp_receiver(Rtcp* rtcp) { rtcp_receiver_ = rtcp; } |
| 42 | 42 |
| 43 void set_short_delay() { short_delay_ = true; } | 43 void set_short_delay() { short_delay_ = true; } |
| 44 | 44 |
| 45 void set_drop_packets(bool drop_packets) { drop_packets_ = drop_packets; } | 45 void set_drop_packets(bool drop_packets) { drop_packets_ = drop_packets; } |
| 46 | 46 |
| 47 // A singular packet implies a RTCP packet. | 47 // A singular packet implies a RTCP packet. |
| 48 virtual bool SendPacket(transport::PacketRef packet, | 48 virtual bool SendPacket(PacketRef packet, |
| 49 const base::Closure& cb) OVERRIDE { | 49 const base::Closure& cb) OVERRIDE { |
| 50 if (short_delay_) { | 50 if (short_delay_) { |
| 51 testing_clock_->Advance( | 51 testing_clock_->Advance( |
| 52 base::TimeDelta::FromMilliseconds(kAddedShortDelay)); | 52 base::TimeDelta::FromMilliseconds(kAddedShortDelay)); |
| 53 } else { | 53 } else { |
| 54 testing_clock_->Advance(base::TimeDelta::FromMilliseconds(kAddedDelay)); | 54 testing_clock_->Advance(base::TimeDelta::FromMilliseconds(kAddedDelay)); |
| 55 } | 55 } |
| 56 if (drop_packets_) | 56 if (drop_packets_) |
| 57 return true; | 57 return true; |
| 58 | 58 |
| 59 rtcp_receiver_->IncomingRtcpPacket(&packet->data[0], packet->data.size()); | 59 rtcp_receiver_->IncomingRtcpPacket(&packet->data[0], packet->data.size()); |
| 60 return true; | 60 return true; |
| 61 } | 61 } |
| 62 | 62 |
| 63 private: | 63 private: |
| 64 bool drop_packets_; | 64 bool drop_packets_; |
| 65 bool short_delay_; | 65 bool short_delay_; |
| 66 Rtcp* rtcp_receiver_; | 66 Rtcp* rtcp_receiver_; |
| 67 base::SimpleTestTickClock* testing_clock_; | 67 base::SimpleTestTickClock* testing_clock_; |
| 68 | 68 |
| 69 DISALLOW_COPY_AND_ASSIGN(RtcpTestPacketSender); | 69 DISALLOW_COPY_AND_ASSIGN(RtcpTestPacketSender); |
| 70 }; | 70 }; |
| 71 | 71 |
| 72 class LocalRtcpTransport : public transport::PacedPacketSender { | 72 class LocalRtcpTransport : public PacedPacketSender { |
| 73 public: | 73 public: |
| 74 LocalRtcpTransport(scoped_refptr<CastEnvironment> cast_environment, | 74 LocalRtcpTransport(scoped_refptr<CastEnvironment> cast_environment, |
| 75 base::SimpleTestTickClock* testing_clock) | 75 base::SimpleTestTickClock* testing_clock) |
| 76 : drop_packets_(false), | 76 : drop_packets_(false), |
| 77 short_delay_(false), | 77 short_delay_(false), |
| 78 testing_clock_(testing_clock) {} | 78 testing_clock_(testing_clock) {} |
| 79 | 79 |
| 80 void set_rtcp_receiver(Rtcp* rtcp) { rtcp_ = rtcp; } | 80 void set_rtcp_receiver(Rtcp* rtcp) { rtcp_ = rtcp; } |
| 81 | 81 |
| 82 void set_short_delay() { short_delay_ = true; } | 82 void set_short_delay() { short_delay_ = true; } |
| 83 | 83 |
| 84 void set_drop_packets(bool drop_packets) { drop_packets_ = drop_packets; } | 84 void set_drop_packets(bool drop_packets) { drop_packets_ = drop_packets; } |
| 85 | 85 |
| 86 virtual bool SendRtcpPacket(uint32 ssrc, | 86 virtual bool SendRtcpPacket(uint32 ssrc, |
| 87 transport::PacketRef packet) OVERRIDE { | 87 PacketRef packet) OVERRIDE { |
| 88 if (short_delay_) { | 88 if (short_delay_) { |
| 89 testing_clock_->Advance( | 89 testing_clock_->Advance( |
| 90 base::TimeDelta::FromMilliseconds(kAddedShortDelay)); | 90 base::TimeDelta::FromMilliseconds(kAddedShortDelay)); |
| 91 } else { | 91 } else { |
| 92 testing_clock_->Advance(base::TimeDelta::FromMilliseconds(kAddedDelay)); | 92 testing_clock_->Advance(base::TimeDelta::FromMilliseconds(kAddedDelay)); |
| 93 } | 93 } |
| 94 if (drop_packets_) | 94 if (drop_packets_) |
| 95 return true; | 95 return true; |
| 96 | 96 |
| 97 rtcp_->IncomingRtcpPacket(&packet->data[0], packet->data.size()); | 97 rtcp_->IncomingRtcpPacket(&packet->data[0], packet->data.size()); |
| 98 return true; | 98 return true; |
| 99 } | 99 } |
| 100 | 100 |
| 101 virtual bool SendPackets( | 101 virtual bool SendPackets( |
| 102 const transport::SendPacketVector& packets) OVERRIDE { | 102 const SendPacketVector& packets) OVERRIDE { |
| 103 return false; | 103 return false; |
| 104 } | 104 } |
| 105 | 105 |
| 106 virtual bool ResendPackets( | 106 virtual bool ResendPackets( |
| 107 const transport::SendPacketVector& packets, | 107 const SendPacketVector& packets, |
| 108 base::TimeDelta dedupe_window) OVERRIDE { | 108 base::TimeDelta dedupe_window) OVERRIDE { |
| 109 return false; | 109 return false; |
| 110 } | 110 } |
| 111 | 111 |
| 112 virtual void CancelSendingPacket( | 112 virtual void CancelSendingPacket( |
| 113 const transport::PacketKey& packet_key) OVERRIDE { | 113 const PacketKey& packet_key) OVERRIDE { |
| 114 } | 114 } |
| 115 | 115 |
| 116 private: | 116 private: |
| 117 bool drop_packets_; | 117 bool drop_packets_; |
| 118 bool short_delay_; | 118 bool short_delay_; |
| 119 Rtcp* rtcp_; | 119 Rtcp* rtcp_; |
| 120 base::SimpleTestTickClock* testing_clock_; | 120 base::SimpleTestTickClock* testing_clock_; |
| 121 scoped_refptr<CastEnvironment> cast_environment_; | 121 scoped_refptr<CastEnvironment> cast_environment_; |
| 122 | 122 |
| 123 DISALLOW_COPY_AND_ASSIGN(LocalRtcpTransport); | 123 DISALLOW_COPY_AND_ASSIGN(LocalRtcpTransport); |
| 124 }; | 124 }; |
| 125 | 125 |
| 126 class RtcpPeer : public Rtcp { | 126 class RtcpPeer : public Rtcp { |
| 127 public: | 127 public: |
| 128 RtcpPeer(scoped_refptr<CastEnvironment> cast_environment, | 128 RtcpPeer(scoped_refptr<CastEnvironment> cast_environment, |
| 129 RtcpSenderFeedback* sender_feedback, | 129 RtcpSenderFeedback* sender_feedback, |
| 130 transport::CastTransportSender* const transport_sender, | 130 CastTransportSender* const transport_sender, |
| 131 transport::PacedPacketSender* paced_packet_sender, | 131 PacedPacketSender* paced_packet_sender, |
| 132 RtpReceiverStatistics* rtp_receiver_statistics, | 132 RtpReceiverStatistics* rtp_receiver_statistics, |
| 133 RtcpMode rtcp_mode, | 133 RtcpMode rtcp_mode, |
| 134 const base::TimeDelta& rtcp_interval, | 134 const base::TimeDelta& rtcp_interval, |
| 135 uint32 local_ssrc, | 135 uint32 local_ssrc, |
| 136 uint32 remote_ssrc, | 136 uint32 remote_ssrc, |
| 137 const std::string& c_name) | 137 const std::string& c_name) |
| 138 : Rtcp(cast_environment, | 138 : Rtcp(cast_environment, |
| 139 sender_feedback, | 139 sender_feedback, |
| 140 transport_sender, | 140 transport_sender, |
| 141 paced_packet_sender, | 141 paced_packet_sender, |
| (...skipping 16 matching lines...) Expand all Loading... |
| 158 task_runner_(new test::FakeSingleThreadTaskRunner(testing_clock_)), | 158 task_runner_(new test::FakeSingleThreadTaskRunner(testing_clock_)), |
| 159 cast_environment_(new CastEnvironment( | 159 cast_environment_(new CastEnvironment( |
| 160 scoped_ptr<base::TickClock>(testing_clock_).Pass(), | 160 scoped_ptr<base::TickClock>(testing_clock_).Pass(), |
| 161 task_runner_, | 161 task_runner_, |
| 162 task_runner_, | 162 task_runner_, |
| 163 task_runner_)), | 163 task_runner_)), |
| 164 sender_to_receiver_(testing_clock_), | 164 sender_to_receiver_(testing_clock_), |
| 165 receiver_to_sender_(cast_environment_, testing_clock_) { | 165 receiver_to_sender_(cast_environment_, testing_clock_) { |
| 166 testing_clock_->Advance(base::TimeTicks::Now() - base::TimeTicks()); | 166 testing_clock_->Advance(base::TimeTicks::Now() - base::TimeTicks()); |
| 167 net::IPEndPoint dummy_endpoint; | 167 net::IPEndPoint dummy_endpoint; |
| 168 transport_sender_.reset(new transport::CastTransportSenderImpl( | 168 transport_sender_.reset(new CastTransportSenderImpl( |
| 169 NULL, | 169 NULL, |
| 170 testing_clock_, | 170 testing_clock_, |
| 171 dummy_endpoint, | 171 dummy_endpoint, |
| 172 base::Bind(&UpdateCastTransportStatus), | 172 base::Bind(&UpdateCastTransportStatus), |
| 173 transport::BulkRawEventsCallback(), | 173 BulkRawEventsCallback(), |
| 174 base::TimeDelta(), | 174 base::TimeDelta(), |
| 175 task_runner_, | 175 task_runner_, |
| 176 &sender_to_receiver_)); | 176 &sender_to_receiver_)); |
| 177 transport::CastTransportRtpConfig config; | 177 CastTransportRtpConfig config; |
| 178 config.ssrc = kSenderSsrc; | 178 config.ssrc = kSenderSsrc; |
| 179 config.rtp_payload_type = 127; | 179 config.rtp_payload_type = 127; |
| 180 config.stored_frames = 1; | 180 config.stored_frames = 1; |
| 181 transport_sender_->InitializeAudio(config); | 181 transport_sender_->InitializeAudio(config); |
| 182 EXPECT_CALL(mock_sender_feedback_, OnReceivedCastFeedback(_)).Times(0); | 182 EXPECT_CALL(mock_sender_feedback_, OnReceivedCastFeedback(_)).Times(0); |
| 183 } | 183 } |
| 184 | 184 |
| 185 virtual ~RtcpTest() {} | 185 virtual ~RtcpTest() {} |
| 186 | 186 |
| 187 static void UpdateCastTransportStatus(transport::CastTransportStatus status) { | 187 static void UpdateCastTransportStatus(CastTransportStatus status) { |
| 188 bool result = (status == transport::TRANSPORT_AUDIO_INITIALIZED || | 188 bool result = (status == TRANSPORT_AUDIO_INITIALIZED || |
| 189 status == transport::TRANSPORT_VIDEO_INITIALIZED); | 189 status == TRANSPORT_VIDEO_INITIALIZED); |
| 190 EXPECT_TRUE(result); | 190 EXPECT_TRUE(result); |
| 191 } | 191 } |
| 192 | 192 |
| 193 void RunTasks(int during_ms) { | 193 void RunTasks(int during_ms) { |
| 194 for (int i = 0; i < during_ms; ++i) { | 194 for (int i = 0; i < during_ms; ++i) { |
| 195 // Call process the timers every 1 ms. | 195 // Call process the timers every 1 ms. |
| 196 testing_clock_->Advance(base::TimeDelta::FromMilliseconds(1)); | 196 testing_clock_->Advance(base::TimeDelta::FromMilliseconds(1)); |
| 197 task_runner_->RunTasks(); | 197 task_runner_->RunTasks(); |
| 198 } | 198 } |
| 199 } | 199 } |
| 200 | 200 |
| 201 base::SimpleTestTickClock* testing_clock_; // Owned by CastEnvironment. | 201 base::SimpleTestTickClock* testing_clock_; // Owned by CastEnvironment. |
| 202 scoped_refptr<test::FakeSingleThreadTaskRunner> task_runner_; | 202 scoped_refptr<test::FakeSingleThreadTaskRunner> task_runner_; |
| 203 scoped_refptr<CastEnvironment> cast_environment_; | 203 scoped_refptr<CastEnvironment> cast_environment_; |
| 204 RtcpTestPacketSender sender_to_receiver_; | 204 RtcpTestPacketSender sender_to_receiver_; |
| 205 scoped_ptr<transport::CastTransportSenderImpl> transport_sender_; | 205 scoped_ptr<CastTransportSenderImpl> transport_sender_; |
| 206 LocalRtcpTransport receiver_to_sender_; | 206 LocalRtcpTransport receiver_to_sender_; |
| 207 MockRtcpSenderFeedback mock_sender_feedback_; | 207 MockRtcpSenderFeedback mock_sender_feedback_; |
| 208 | 208 |
| 209 DISALLOW_COPY_AND_ASSIGN(RtcpTest); | 209 DISALLOW_COPY_AND_ASSIGN(RtcpTest); |
| 210 }; | 210 }; |
| 211 | 211 |
| 212 TEST_F(RtcpTest, TimeToSend) { | 212 TEST_F(RtcpTest, TimeToSend) { |
| 213 const base::TimeTicks start_time = testing_clock_->NowTicks(); | 213 const base::TimeTicks start_time = testing_clock_->NowTicks(); |
| 214 Rtcp rtcp(cast_environment_, | 214 Rtcp rtcp(cast_environment_, |
| 215 &mock_sender_feedback_, | 215 &mock_sender_feedback_, |
| (...skipping 324 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 540 base::TimeTicks out_3 = ConvertNtpToTimeTicks(ntp_seconds_3, ntp_fraction_3); | 540 base::TimeTicks out_3 = ConvertNtpToTimeTicks(ntp_seconds_3, ntp_fraction_3); |
| 541 EXPECT_EQ(input_time, out_3); // Verify inverse. | 541 EXPECT_EQ(input_time, out_3); // Verify inverse. |
| 542 | 542 |
| 543 // Verify delta. | 543 // Verify delta. |
| 544 EXPECT_EQ((out_3 - out_2), time_delta); | 544 EXPECT_EQ((out_3 - out_2), time_delta); |
| 545 EXPECT_NEAR((ntp_fraction_3 - ntp_fraction_2), 0xffffffff / 2, 1); | 545 EXPECT_NEAR((ntp_fraction_3 - ntp_fraction_2), 0xffffffff / 2, 1); |
| 546 } | 546 } |
| 547 | 547 |
| 548 } // namespace cast | 548 } // namespace cast |
| 549 } // namespace media | 549 } // namespace media |
| OLD | NEW |