| OLD | NEW |
| 1 // Copyright (c) 2010 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2011 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/callback.h" | |
| 6 #include "base/process_util.h" | 5 #include "base/process_util.h" |
| 7 #include "chrome/common/render_messages.h" | 6 #include "chrome/common/render_messages.h" |
| 8 #include "chrome/common/render_messages_params.h" | 7 #include "chrome/common/render_messages_params.h" |
| 9 #include "chrome/renderer/media/audio_renderer_impl.h" | 8 #include "chrome/renderer/media/audio_renderer_impl.h" |
| 10 #include "media/base/data_buffer.h" | 9 #include "media/base/data_buffer.h" |
| 11 #include "media/base/media_format.h" | 10 #include "media/base/media_format.h" |
| 11 #include "media/base/mock_callback.h" |
| 12 #include "media/base/mock_filter_host.h" | 12 #include "media/base/mock_filter_host.h" |
| 13 #include "media/base/mock_filters.h" | 13 #include "media/base/mock_filters.h" |
| 14 #include "testing/gtest/include/gtest/gtest.h" | 14 #include "testing/gtest/include/gtest/gtest.h" |
| 15 | 15 |
| 16 using ::testing::ReturnRef; | 16 using ::testing::ReturnRef; |
| 17 | 17 |
| 18 class AudioRendererImplTest : public ::testing::Test { | 18 class AudioRendererImplTest : public ::testing::Test { |
| 19 public: | 19 public: |
| 20 static const int kRouteId = 0; | 20 static const int kRouteId = 0; |
| 21 static const int kSize = 1024; | 21 static const int kSize = 1024; |
| 22 | 22 |
| 23 AudioRendererImplTest() { | 23 AudioRendererImplTest() { |
| 24 message_loop_.reset(new MessageLoop(MessageLoop::TYPE_IO)); | 24 message_loop_.reset(new MessageLoop(MessageLoop::TYPE_IO)); |
| 25 | 25 |
| 26 // TODO(scherkus): use gmock with AudioMessageFilter to verify | 26 // TODO(scherkus): use gmock with AudioMessageFilter to verify |
| 27 // AudioRendererImpl calls or doesn't call Send(). | 27 // AudioRendererImpl calls or doesn't call Send(). |
| 28 filter_ = new AudioMessageFilter(kRouteId); | 28 filter_ = new AudioMessageFilter(kRouteId); |
| 29 filter_->message_loop_ = message_loop_.get(); | 29 filter_->message_loop_ = message_loop_.get(); |
| 30 | 30 |
| 31 // Create temporary shared memory. | 31 // Create temporary shared memory. |
| 32 CHECK(shared_mem_.CreateAnonymous(kSize)); | 32 CHECK(shared_mem_.CreateAnonymous(kSize)); |
| 33 | 33 |
| 34 // Setup expectations for initialization. | 34 // Setup expectations for initialization. |
| 35 EXPECT_CALL(callback_, OnFilterCallback()); | |
| 36 EXPECT_CALL(callback_, OnCallbackDestroyed()); | |
| 37 decoder_ = new media::MockAudioDecoder(); | 35 decoder_ = new media::MockAudioDecoder(); |
| 38 | 36 |
| 39 // Associate media format with decoder | 37 // Associate media format with decoder |
| 40 decoder_media_format_.SetAsString(media::MediaFormat::kMimeType, | 38 decoder_media_format_.SetAsString(media::MediaFormat::kMimeType, |
| 41 media::mime_type::kUncompressedAudio); | 39 media::mime_type::kUncompressedAudio); |
| 42 decoder_media_format_.SetAsInteger(media::MediaFormat::kChannels, 2); | 40 decoder_media_format_.SetAsInteger(media::MediaFormat::kChannels, 2); |
| 43 decoder_media_format_.SetAsInteger(media::MediaFormat::kSampleRate, 48000); | 41 decoder_media_format_.SetAsInteger(media::MediaFormat::kSampleRate, 48000); |
| 44 decoder_media_format_.SetAsInteger(media::MediaFormat::kSampleBits, 16); | 42 decoder_media_format_.SetAsInteger(media::MediaFormat::kSampleBits, 16); |
| 45 EXPECT_CALL(*decoder_, media_format()) | 43 EXPECT_CALL(*decoder_, media_format()) |
| 46 .WillRepeatedly(ReturnRef(decoder_media_format_)); | 44 .WillRepeatedly(ReturnRef(decoder_media_format_)); |
| 47 | 45 |
| 48 // Create and initialize audio renderer. | 46 // Create and initialize audio renderer. |
| 49 renderer_ = new AudioRendererImpl(filter_); | 47 renderer_ = new AudioRendererImpl(filter_); |
| 50 renderer_->set_host(&host_); | 48 renderer_->set_host(&host_); |
| 51 renderer_->set_message_loop(message_loop_.get()); | 49 renderer_->set_message_loop(message_loop_.get()); |
| 52 renderer_->Initialize(decoder_, callback_.NewCallback()); | 50 renderer_->Initialize(decoder_, media::NewExpectedCallback()); |
| 53 | 51 |
| 54 // Run pending tasks and simulate responding with a created audio stream. | 52 // Run pending tasks and simulate responding with a created audio stream. |
| 55 message_loop_->RunAllPending(); | 53 message_loop_->RunAllPending(); |
| 56 | 54 |
| 57 // Duplicate the shared memory handle so both the test and the callee can | 55 // Duplicate the shared memory handle so both the test and the callee can |
| 58 // close their copy. | 56 // close their copy. |
| 59 base::SharedMemoryHandle duplicated_handle; | 57 base::SharedMemoryHandle duplicated_handle; |
| 60 EXPECT_TRUE(shared_mem_.ShareToProcess(base::GetCurrentProcessHandle(), | 58 EXPECT_TRUE(shared_mem_.ShareToProcess(base::GetCurrentProcessHandle(), |
| 61 &duplicated_handle)); | 59 &duplicated_handle)); |
| 62 | 60 |
| 63 renderer_->OnCreated(duplicated_handle, kSize); | 61 renderer_->OnCreated(duplicated_handle, kSize); |
| 64 } | 62 } |
| 65 | 63 |
| 66 virtual ~AudioRendererImplTest() { | 64 virtual ~AudioRendererImplTest() { |
| 67 } | 65 } |
| 68 | 66 |
| 69 protected: | 67 protected: |
| 70 // Fixtures. | 68 // Fixtures. |
| 71 scoped_ptr<MessageLoop> message_loop_; | 69 scoped_ptr<MessageLoop> message_loop_; |
| 72 scoped_refptr<AudioMessageFilter> filter_; | 70 scoped_refptr<AudioMessageFilter> filter_; |
| 73 base::SharedMemory shared_mem_; | 71 base::SharedMemory shared_mem_; |
| 74 media::MockFilterHost host_; | 72 media::MockFilterHost host_; |
| 75 media::MockFilterCallback callback_; | |
| 76 media::MockFilterCallback stop_callback_; | |
| 77 scoped_refptr<media::MockAudioDecoder> decoder_; | 73 scoped_refptr<media::MockAudioDecoder> decoder_; |
| 78 scoped_refptr<AudioRendererImpl> renderer_; | 74 scoped_refptr<AudioRendererImpl> renderer_; |
| 79 media::MediaFormat decoder_media_format_; | 75 media::MediaFormat decoder_media_format_; |
| 80 | 76 |
| 81 private: | 77 private: |
| 82 DISALLOW_COPY_AND_ASSIGN(AudioRendererImplTest); | 78 DISALLOW_COPY_AND_ASSIGN(AudioRendererImplTest); |
| 83 }; | 79 }; |
| 84 | 80 |
| 85 TEST_F(AudioRendererImplTest, SetPlaybackRate) { | 81 TEST_F(AudioRendererImplTest, SetPlaybackRate) { |
| 86 // Execute SetPlaybackRate() codepath to create an IPC message. | 82 // Execute SetPlaybackRate() codepath to create an IPC message. |
| 87 | 83 |
| 88 // Toggle play/pause to generate some IPC messages. | 84 // Toggle play/pause to generate some IPC messages. |
| 89 renderer_->SetPlaybackRate(0.0f); | 85 renderer_->SetPlaybackRate(0.0f); |
| 90 renderer_->SetPlaybackRate(1.0f); | 86 renderer_->SetPlaybackRate(1.0f); |
| 91 renderer_->SetPlaybackRate(0.0f); | 87 renderer_->SetPlaybackRate(0.0f); |
| 92 | 88 |
| 93 EXPECT_CALL(stop_callback_, OnFilterCallback()); | 89 renderer_->Stop(media::NewExpectedCallback()); |
| 94 renderer_->Stop(stop_callback_.NewCallback()); | |
| 95 message_loop_->RunAllPending(); | 90 message_loop_->RunAllPending(); |
| 96 } | 91 } |
| 97 | 92 |
| 98 TEST_F(AudioRendererImplTest, SetVolume) { | 93 TEST_F(AudioRendererImplTest, SetVolume) { |
| 99 // Execute SetVolume() codepath to create an IPC message. | 94 // Execute SetVolume() codepath to create an IPC message. |
| 100 renderer_->SetVolume(0.5f); | 95 renderer_->SetVolume(0.5f); |
| 101 EXPECT_CALL(stop_callback_, OnFilterCallback()); | 96 renderer_->Stop(media::NewExpectedCallback()); |
| 102 renderer_->Stop(stop_callback_.NewCallback()); | |
| 103 message_loop_->RunAllPending(); | 97 message_loop_->RunAllPending(); |
| 104 } | 98 } |
| 105 | 99 |
| 106 TEST_F(AudioRendererImplTest, Stop) { | 100 TEST_F(AudioRendererImplTest, Stop) { |
| 107 // Declare some state messages. | 101 // Declare some state messages. |
| 108 const ViewMsg_AudioStreamState_Params kError( | 102 const ViewMsg_AudioStreamState_Params kError( |
| 109 ViewMsg_AudioStreamState_Params::kError); | 103 ViewMsg_AudioStreamState_Params::kError); |
| 110 const ViewMsg_AudioStreamState_Params kPlaying( | 104 const ViewMsg_AudioStreamState_Params kPlaying( |
| 111 ViewMsg_AudioStreamState_Params::kPlaying); | 105 ViewMsg_AudioStreamState_Params::kPlaying); |
| 112 const ViewMsg_AudioStreamState_Params kPaused( | 106 const ViewMsg_AudioStreamState_Params kPaused( |
| 113 ViewMsg_AudioStreamState_Params::kPaused); | 107 ViewMsg_AudioStreamState_Params::kPaused); |
| 114 | 108 |
| 115 // Execute Stop() codepath to create an IPC message. | 109 // Execute Stop() codepath to create an IPC message. |
| 116 EXPECT_CALL(stop_callback_, OnFilterCallback()); | 110 renderer_->Stop(media::NewExpectedCallback()); |
| 117 renderer_->Stop(stop_callback_.NewCallback()); | |
| 118 message_loop_->RunAllPending(); | 111 message_loop_->RunAllPending(); |
| 119 | 112 |
| 120 // Run AudioMessageFilter::Delegate methods, which can be executed after being | 113 // Run AudioMessageFilter::Delegate methods, which can be executed after being |
| 121 // stopped. AudioRendererImpl shouldn't create any messages. | 114 // stopped. AudioRendererImpl shouldn't create any messages. |
| 122 renderer_->OnRequestPacket(AudioBuffersState(kSize, 0)); | 115 renderer_->OnRequestPacket(AudioBuffersState(kSize, 0)); |
| 123 renderer_->OnStateChanged(kError); | 116 renderer_->OnStateChanged(kError); |
| 124 renderer_->OnStateChanged(kPlaying); | 117 renderer_->OnStateChanged(kPlaying); |
| 125 renderer_->OnStateChanged(kPaused); | 118 renderer_->OnStateChanged(kPaused); |
| 126 renderer_->OnCreated(shared_mem_.handle(), kSize); | 119 renderer_->OnCreated(shared_mem_.handle(), kSize); |
| 127 renderer_->OnVolume(0.5); | 120 renderer_->OnVolume(0.5); |
| 128 | 121 |
| 129 // It's possible that the upstream decoder replies right after being stopped. | 122 // It's possible that the upstream decoder replies right after being stopped. |
| 130 scoped_refptr<media::Buffer> buffer(new media::DataBuffer(kSize)); | 123 scoped_refptr<media::Buffer> buffer(new media::DataBuffer(kSize)); |
| 131 renderer_->ConsumeAudioSamples(buffer); | 124 renderer_->ConsumeAudioSamples(buffer); |
| 132 } | 125 } |
| 133 | 126 |
| 134 TEST_F(AudioRendererImplTest, DestroyedMessageLoop_SetPlaybackRate) { | 127 TEST_F(AudioRendererImplTest, DestroyedMessageLoop_SetPlaybackRate) { |
| 135 // Kill the message loop and verify SetPlaybackRate() still works. | 128 // Kill the message loop and verify SetPlaybackRate() still works. |
| 136 message_loop_.reset(); | 129 message_loop_.reset(); |
| 137 renderer_->SetPlaybackRate(0.0f); | 130 renderer_->SetPlaybackRate(0.0f); |
| 138 renderer_->SetPlaybackRate(1.0f); | 131 renderer_->SetPlaybackRate(1.0f); |
| 139 renderer_->SetPlaybackRate(0.0f); | 132 renderer_->SetPlaybackRate(0.0f); |
| 140 EXPECT_CALL(stop_callback_, OnFilterCallback()); | 133 renderer_->Stop(media::NewExpectedCallback()); |
| 141 renderer_->Stop(stop_callback_.NewCallback()); | |
| 142 } | 134 } |
| 143 | 135 |
| 144 TEST_F(AudioRendererImplTest, DestroyedMessageLoop_SetVolume) { | 136 TEST_F(AudioRendererImplTest, DestroyedMessageLoop_SetVolume) { |
| 145 // Kill the message loop and verify SetVolume() still works. | 137 // Kill the message loop and verify SetVolume() still works. |
| 146 message_loop_.reset(); | 138 message_loop_.reset(); |
| 147 renderer_->SetVolume(0.5f); | 139 renderer_->SetVolume(0.5f); |
| 148 EXPECT_CALL(stop_callback_, OnFilterCallback()); | 140 renderer_->Stop(media::NewExpectedCallback()); |
| 149 renderer_->Stop(stop_callback_.NewCallback()); | |
| 150 } | 141 } |
| 151 | 142 |
| 152 TEST_F(AudioRendererImplTest, DestroyedMessageLoop_ConsumeAudioSamples) { | 143 TEST_F(AudioRendererImplTest, DestroyedMessageLoop_ConsumeAudioSamples) { |
| 153 // Kill the message loop and verify OnReadComplete() still works. | 144 // Kill the message loop and verify OnReadComplete() still works. |
| 154 message_loop_.reset(); | 145 message_loop_.reset(); |
| 155 scoped_refptr<media::Buffer> buffer(new media::DataBuffer(kSize)); | 146 scoped_refptr<media::Buffer> buffer(new media::DataBuffer(kSize)); |
| 156 renderer_->ConsumeAudioSamples(buffer); | 147 renderer_->ConsumeAudioSamples(buffer); |
| 157 EXPECT_CALL(stop_callback_, OnFilterCallback()); | 148 renderer_->Stop(media::NewExpectedCallback()); |
| 158 renderer_->Stop(stop_callback_.NewCallback()); | |
| 159 } | 149 } |
| OLD | NEW |