| 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 "base/bind.h" | 5 #include "base/bind.h" |
| 6 #include "base/bind_helpers.h" | 6 #include "base/bind_helpers.h" |
| 7 #include "base/memory/scoped_ptr.h" | 7 #include "base/memory/scoped_ptr.h" |
| 8 #include "base/test/simple_test_tick_clock.h" | 8 #include "base/test/simple_test_tick_clock.h" |
| 9 #include "media/base/media.h" | 9 #include "media/base/media.h" |
| 10 #include "media/cast/audio_sender/audio_sender.h" | 10 #include "media/cast/audio_sender/audio_sender.h" |
| (...skipping 10 matching lines...) Expand all Loading... |
| 21 namespace media { | 21 namespace media { |
| 22 namespace cast { | 22 namespace cast { |
| 23 | 23 |
| 24 static const int64 kStartMillisecond = GG_INT64_C(12345678900000); | 24 static const int64 kStartMillisecond = GG_INT64_C(12345678900000); |
| 25 | 25 |
| 26 using testing::_; | 26 using testing::_; |
| 27 using testing::Exactly; | 27 using testing::Exactly; |
| 28 | 28 |
| 29 class TestPacketSender : public transport::PacketSender { | 29 class TestPacketSender : public transport::PacketSender { |
| 30 public: | 30 public: |
| 31 TestPacketSender() | 31 TestPacketSender() : number_of_rtp_packets_(0), number_of_rtcp_packets_(0) {} |
| 32 : number_of_rtp_packets_(0), | |
| 33 number_of_rtcp_packets_(0) {} | |
| 34 | 32 |
| 35 virtual bool SendPacket(const Packet& packet) OVERRIDE { | 33 virtual bool SendPacket(const Packet& packet) OVERRIDE { |
| 36 if (Rtcp::IsRtcpPacket(&packet[0], packet.size())) { | 34 if (Rtcp::IsRtcpPacket(&packet[0], packet.size())) { |
| 37 ++number_of_rtcp_packets_; | 35 ++number_of_rtcp_packets_; |
| 38 } else { | 36 } else { |
| 39 ++number_of_rtp_packets_; | 37 ++number_of_rtp_packets_; |
| 40 } | 38 } |
| 41 return true; | 39 return true; |
| 42 } | 40 } |
| 43 | 41 |
| 44 int number_of_rtp_packets() const { | 42 int number_of_rtp_packets() const { return number_of_rtp_packets_; } |
| 45 return number_of_rtp_packets_; | |
| 46 } | |
| 47 | 43 |
| 48 int number_of_rtcp_packets() const { | 44 int number_of_rtcp_packets() const { return number_of_rtcp_packets_; } |
| 49 return number_of_rtcp_packets_; | |
| 50 } | |
| 51 | 45 |
| 52 private: | 46 private: |
| 53 int number_of_rtp_packets_; | 47 int number_of_rtp_packets_; |
| 54 int number_of_rtcp_packets_; | 48 int number_of_rtcp_packets_; |
| 55 | 49 |
| 56 DISALLOW_COPY_AND_ASSIGN(TestPacketSender); | 50 DISALLOW_COPY_AND_ASSIGN(TestPacketSender); |
| 57 }; | 51 }; |
| 58 | 52 |
| 59 class AudioSenderTest : public ::testing::Test { | 53 class AudioSenderTest : public ::testing::Test { |
| 60 public: | 54 public: |
| 61 MOCK_METHOD0(InsertAudioCallback, void()); | 55 MOCK_METHOD0(InsertAudioCallback, void()); |
| 62 | 56 |
| 63 protected: | 57 protected: |
| 64 AudioSenderTest() { | 58 AudioSenderTest() { |
| 65 InitializeMediaLibraryForTesting(); | 59 InitializeMediaLibraryForTesting(); |
| 66 testing_clock_ = new base::SimpleTestTickClock(); | 60 testing_clock_ = new base::SimpleTestTickClock(); |
| 67 testing_clock_->Advance( | 61 testing_clock_->Advance( |
| 68 base::TimeDelta::FromMilliseconds(kStartMillisecond)); | 62 base::TimeDelta::FromMilliseconds(kStartMillisecond)); |
| 69 task_runner_ = new test::FakeTaskRunner(testing_clock_); | 63 task_runner_ = new test::FakeTaskRunner(testing_clock_); |
| 70 cast_environment_ = new CastEnvironment( | 64 cast_environment_ = |
| 71 scoped_ptr<base::TickClock>(testing_clock_).Pass(), | 65 new CastEnvironment(scoped_ptr<base::TickClock>(testing_clock_).Pass(), |
| 72 task_runner_, task_runner_, task_runner_, task_runner_, | 66 task_runner_, |
| 73 task_runner_, task_runner_, GetDefaultCastSenderLoggingConfig()); | 67 task_runner_, |
| 68 task_runner_, |
| 69 task_runner_, |
| 70 task_runner_, |
| 71 task_runner_, |
| 72 GetDefaultCastSenderLoggingConfig()); |
| 74 audio_config_.codec = transport::kOpus; | 73 audio_config_.codec = transport::kOpus; |
| 75 audio_config_.use_external_encoder = false; | 74 audio_config_.use_external_encoder = false; |
| 76 audio_config_.frequency = kDefaultAudioSamplingRate; | 75 audio_config_.frequency = kDefaultAudioSamplingRate; |
| 77 audio_config_.channels = 2; | 76 audio_config_.channels = 2; |
| 78 audio_config_.bitrate = kDefaultAudioEncoderBitrate; | 77 audio_config_.bitrate = kDefaultAudioEncoderBitrate; |
| 79 audio_config_.rtp_payload_type = 127; | 78 audio_config_.rtp_payload_type = 127; |
| 80 | 79 |
| 81 transport::CastTransportConfig transport_config; | 80 transport::CastTransportConfig transport_config; |
| 82 transport_config.audio_rtp_payload_type = 127; | 81 transport_config.audio_rtp_payload_type = 127; |
| 83 transport_config.audio_channels = 2; | 82 transport_config.audio_channels = 2; |
| 84 transport_sender_.reset(new transport::CastTransportSenderImpl( | 83 transport_sender_.reset(new transport::CastTransportSenderImpl( |
| 85 testing_clock_, | 84 testing_clock_, |
| 86 transport_config, | 85 transport_config, |
| 87 base::Bind(&UpdateCastTransportStatus), task_runner_)); | 86 base::Bind(&UpdateCastTransportStatus), |
| 87 task_runner_)); |
| 88 transport_sender_->InsertFakeTransportForTesting(&transport_); | 88 transport_sender_->InsertFakeTransportForTesting(&transport_); |
| 89 audio_sender_.reset(new AudioSender( | 89 audio_sender_.reset(new AudioSender( |
| 90 cast_environment_, audio_config_, transport_sender_.get())); | 90 cast_environment_, audio_config_, transport_sender_.get())); |
| 91 task_runner_->RunTasks(); | 91 task_runner_->RunTasks(); |
| 92 } | 92 } |
| 93 | 93 |
| 94 virtual ~AudioSenderTest() {} | 94 virtual ~AudioSenderTest() {} |
| 95 | 95 |
| 96 static void UpdateCastTransportStatus(transport::CastTransportStatus status) { | 96 static void UpdateCastTransportStatus(transport::CastTransportStatus status) { |
| 97 EXPECT_EQ(status, transport::TRANSPORT_INITIALIZED); | 97 EXPECT_EQ(status, transport::TRANSPORT_INITIALIZED); |
| 98 } | 98 } |
| 99 | 99 |
| 100 base::SimpleTestTickClock* testing_clock_; // Owned by CastEnvironment. | 100 base::SimpleTestTickClock* testing_clock_; // Owned by CastEnvironment. |
| 101 TestPacketSender transport_; | 101 TestPacketSender transport_; |
| 102 scoped_ptr<transport::CastTransportSenderImpl> transport_sender_; | 102 scoped_ptr<transport::CastTransportSenderImpl> transport_sender_; |
| 103 scoped_refptr<test::FakeTaskRunner> task_runner_; | 103 scoped_refptr<test::FakeTaskRunner> task_runner_; |
| 104 scoped_ptr<AudioSender> audio_sender_; | 104 scoped_ptr<AudioSender> audio_sender_; |
| 105 scoped_refptr<CastEnvironment> cast_environment_; | 105 scoped_refptr<CastEnvironment> cast_environment_; |
| 106 AudioSenderConfig audio_config_; | 106 AudioSenderConfig audio_config_; |
| 107 }; | 107 }; |
| 108 | 108 |
| 109 TEST_F(AudioSenderTest, Encode20ms) { | 109 TEST_F(AudioSenderTest, Encode20ms) { |
| 110 EXPECT_CALL(*this, InsertAudioCallback()).Times(Exactly(1)); | 110 EXPECT_CALL(*this, InsertAudioCallback()).Times(Exactly(1)); |
| 111 | 111 |
| 112 const base::TimeDelta kDuration = base::TimeDelta::FromMilliseconds(20); | 112 const base::TimeDelta kDuration = base::TimeDelta::FromMilliseconds(20); |
| 113 scoped_ptr<AudioBus> bus(TestAudioBusFactory( | 113 scoped_ptr<AudioBus> bus( |
| 114 audio_config_.channels, audio_config_.frequency, | 114 TestAudioBusFactory(audio_config_.channels, |
| 115 TestAudioBusFactory::kMiddleANoteFreq, 0.5f).NextAudioBus(kDuration)); | 115 audio_config_.frequency, |
| 116 TestAudioBusFactory::kMiddleANoteFreq, |
| 117 0.5f).NextAudioBus(kDuration)); |
| 116 | 118 |
| 117 base::TimeTicks recorded_time = base::TimeTicks::Now(); | 119 base::TimeTicks recorded_time = base::TimeTicks::Now(); |
| 118 audio_sender_->InsertAudio( | 120 audio_sender_->InsertAudio(bus.get(), |
| 119 bus.get(), | 121 recorded_time, |
| 120 recorded_time, | 122 base::Bind(&AudioSenderTest::InsertAudioCallback, |
| 121 base::Bind( | 123 base::Unretained(this))); |
| 122 &AudioSenderTest::InsertAudioCallback, | |
| 123 base::Unretained(this))); | |
| 124 task_runner_->RunTasks(); | 124 task_runner_->RunTasks(); |
| 125 EXPECT_GE(transport_.number_of_rtp_packets() + | 125 EXPECT_GE( |
| 126 transport_.number_of_rtcp_packets(), 1); | 126 transport_.number_of_rtp_packets() + transport_.number_of_rtcp_packets(), |
| 127 1); |
| 127 } | 128 } |
| 128 | 129 |
| 129 TEST_F(AudioSenderTest, RtcpTimer) { | 130 TEST_F(AudioSenderTest, RtcpTimer) { |
| 130 EXPECT_CALL(*this, InsertAudioCallback()).Times(Exactly(1)); | 131 EXPECT_CALL(*this, InsertAudioCallback()).Times(Exactly(1)); |
| 131 | 132 |
| 132 const base::TimeDelta kDuration = base::TimeDelta::FromMilliseconds(20); | 133 const base::TimeDelta kDuration = base::TimeDelta::FromMilliseconds(20); |
| 133 scoped_ptr<AudioBus> bus(TestAudioBusFactory( | 134 scoped_ptr<AudioBus> bus( |
| 134 audio_config_.channels, audio_config_.frequency, | 135 TestAudioBusFactory(audio_config_.channels, |
| 135 TestAudioBusFactory::kMiddleANoteFreq, 0.5f).NextAudioBus(kDuration)); | 136 audio_config_.frequency, |
| 137 TestAudioBusFactory::kMiddleANoteFreq, |
| 138 0.5f).NextAudioBus(kDuration)); |
| 136 | 139 |
| 137 base::TimeTicks recorded_time = base::TimeTicks::Now(); | 140 base::TimeTicks recorded_time = base::TimeTicks::Now(); |
| 138 audio_sender_->InsertAudio( | 141 audio_sender_->InsertAudio(bus.get(), |
| 139 bus.get(), recorded_time, | 142 recorded_time, |
| 140 base::Bind( | 143 base::Bind(&AudioSenderTest::InsertAudioCallback, |
| 141 &AudioSenderTest::InsertAudioCallback, | 144 base::Unretained(this))); |
| 142 base::Unretained(this))); | |
| 143 task_runner_->RunTasks(); | 145 task_runner_->RunTasks(); |
| 144 | 146 |
| 145 // Make sure that we send at least one RTCP packet. | 147 // Make sure that we send at least one RTCP packet. |
| 146 base::TimeDelta max_rtcp_timeout = | 148 base::TimeDelta max_rtcp_timeout = |
| 147 base::TimeDelta::FromMilliseconds(1 + kDefaultRtcpIntervalMs * 3 / 2); | 149 base::TimeDelta::FromMilliseconds(1 + kDefaultRtcpIntervalMs * 3 / 2); |
| 148 testing_clock_->Advance(max_rtcp_timeout); | 150 testing_clock_->Advance(max_rtcp_timeout); |
| 149 task_runner_->RunTasks(); | 151 task_runner_->RunTasks(); |
| 150 EXPECT_GE(transport_.number_of_rtp_packets(), 1); | 152 EXPECT_GE(transport_.number_of_rtp_packets(), 1); |
| 151 EXPECT_EQ(transport_.number_of_rtcp_packets(), 1); | 153 EXPECT_EQ(transport_.number_of_rtcp_packets(), 1); |
| 152 } | 154 } |
| 153 | 155 |
| 154 } // namespace cast | 156 } // namespace cast |
| 155 } // namespace media | 157 } // namespace media |
| OLD | NEW |