| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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 "content/test/webrtc_audio_device_test.h" | 5 #include "content/test/webrtc_audio_device_test.h" |
| 6 | 6 |
| 7 #include "base/bind.h" | 7 #include "base/bind.h" |
| 8 #include "base/bind_helpers.h" | 8 #include "base/bind_helpers.h" |
| 9 #include "base/compiler_specific.h" | 9 #include "base/compiler_specific.h" |
| 10 #include "base/file_util.h" | 10 #include "base/file_util.h" |
| (...skipping 27 matching lines...) Expand all Loading... |
| 38 | 38 |
| 39 #if defined(OS_WIN) | 39 #if defined(OS_WIN) |
| 40 #include "base/win/scoped_com_initializer.h" | 40 #include "base/win/scoped_com_initializer.h" |
| 41 #endif | 41 #endif |
| 42 | 42 |
| 43 using testing::_; | 43 using testing::_; |
| 44 using testing::InvokeWithoutArgs; | 44 using testing::InvokeWithoutArgs; |
| 45 using testing::Return; | 45 using testing::Return; |
| 46 using testing::StrEq; | 46 using testing::StrEq; |
| 47 | 47 |
| 48 namespace content { |
| 49 |
| 48 // This class is a mock of the child process singleton which is needed | 50 // This class is a mock of the child process singleton which is needed |
| 49 // to be able to create a RenderThread object. | 51 // to be able to create a RenderThread object. |
| 50 class WebRTCMockRenderProcess : public RenderProcess { | 52 class WebRTCMockRenderProcess : public RenderProcess { |
| 51 public: | 53 public: |
| 52 WebRTCMockRenderProcess() {} | 54 WebRTCMockRenderProcess() {} |
| 53 virtual ~WebRTCMockRenderProcess() {} | 55 virtual ~WebRTCMockRenderProcess() {} |
| 54 | 56 |
| 55 // RenderProcess implementation. | 57 // RenderProcess implementation. |
| 56 virtual skia::PlatformCanvas* GetDrawingCanvas( | 58 virtual skia::PlatformCanvas* GetDrawingCanvas( |
| 57 TransportDIB** memory, const gfx::Rect& rect) OVERRIDE { | 59 TransportDIB** memory, const gfx::Rect& rect) OVERRIDE { |
| 58 return NULL; | 60 return NULL; |
| 59 } | 61 } |
| 60 virtual void ReleaseTransportDIB(TransportDIB* memory) OVERRIDE {} | 62 virtual void ReleaseTransportDIB(TransportDIB* memory) OVERRIDE {} |
| 61 virtual bool UseInProcessPlugins() const OVERRIDE { return false; } | 63 virtual bool UseInProcessPlugins() const OVERRIDE { return false; } |
| 62 virtual void AddBindings(int bindings) OVERRIDE {} | 64 virtual void AddBindings(int bindings) OVERRIDE {} |
| 63 virtual int GetEnabledBindings() const { return 0; } | 65 virtual int GetEnabledBindings() const { return 0; } |
| 64 virtual TransportDIB* CreateTransportDIB(size_t size) { return NULL; } | 66 virtual TransportDIB* CreateTransportDIB(size_t size) { return NULL; } |
| 65 virtual void FreeTransportDIB(TransportDIB*) {} | 67 virtual void FreeTransportDIB(TransportDIB*) {} |
| 66 | 68 |
| 67 private: | 69 private: |
| 68 DISALLOW_COPY_AND_ASSIGN(WebRTCMockRenderProcess); | 70 DISALLOW_COPY_AND_ASSIGN(WebRTCMockRenderProcess); |
| 69 }; | 71 }; |
| 70 | 72 |
| 71 // Utility scoped class to replace the global content client's renderer for the | 73 // Utility scoped class to replace the global content client's renderer for the |
| 72 // duration of the test. | 74 // duration of the test. |
| 73 class ReplaceContentClientRenderer { | 75 class ReplaceContentClientRenderer { |
| 74 public: | 76 public: |
| 75 explicit ReplaceContentClientRenderer( | 77 explicit ReplaceContentClientRenderer(ContentRendererClient* new_renderer) { |
| 76 content::ContentRendererClient* new_renderer) { | 78 saved_renderer_ = GetContentClient()->renderer(); |
| 77 saved_renderer_ = content::GetContentClient()->renderer(); | 79 GetContentClient()->set_renderer_for_testing(new_renderer); |
| 78 content::GetContentClient()->set_renderer_for_testing(new_renderer); | |
| 79 } | 80 } |
| 80 ~ReplaceContentClientRenderer() { | 81 ~ReplaceContentClientRenderer() { |
| 81 // Restore the original renderer. | 82 // Restore the original renderer. |
| 82 content::GetContentClient()->set_renderer_for_testing(saved_renderer_); | 83 GetContentClient()->set_renderer_for_testing(saved_renderer_); |
| 83 } | 84 } |
| 84 private: | 85 private: |
| 85 content::ContentRendererClient* saved_renderer_; | 86 ContentRendererClient* saved_renderer_; |
| 86 DISALLOW_COPY_AND_ASSIGN(ReplaceContentClientRenderer); | 87 DISALLOW_COPY_AND_ASSIGN(ReplaceContentClientRenderer); |
| 87 }; | 88 }; |
| 88 | 89 |
| 89 namespace { | 90 class MockRTCResourceContext : public ResourceContext { |
| 90 | |
| 91 class MockResourceContext : public content::ResourceContext { | |
| 92 public: | 91 public: |
| 93 MockResourceContext() : test_request_context_(NULL) {} | 92 MockRTCResourceContext() : test_request_context_(NULL) {} |
| 94 virtual ~MockResourceContext() {} | 93 virtual ~MockRTCResourceContext() {} |
| 95 | 94 |
| 96 void set_request_context(net::URLRequestContext* request_context) { | 95 void set_request_context(net::URLRequestContext* request_context) { |
| 97 test_request_context_ = request_context; | 96 test_request_context_ = request_context; |
| 98 } | 97 } |
| 99 | 98 |
| 100 // ResourceContext implementation: | 99 // ResourceContext implementation: |
| 101 virtual net::HostResolver* GetHostResolver() OVERRIDE { | 100 virtual net::HostResolver* GetHostResolver() OVERRIDE { |
| 102 return NULL; | 101 return NULL; |
| 103 } | 102 } |
| 104 virtual net::URLRequestContext* GetRequestContext() OVERRIDE { | 103 virtual net::URLRequestContext* GetRequestContext() OVERRIDE { |
| 105 return test_request_context_; | 104 return test_request_context_; |
| 106 } | 105 } |
| 107 | 106 |
| 108 private: | 107 private: |
| 109 net::URLRequestContext* test_request_context_; | 108 net::URLRequestContext* test_request_context_; |
| 110 | 109 |
| 111 DISALLOW_COPY_AND_ASSIGN(MockResourceContext); | 110 DISALLOW_COPY_AND_ASSIGN(MockRTCResourceContext); |
| 112 }; | 111 }; |
| 113 | 112 |
| 114 ACTION_P(QuitMessageLoop, loop_or_proxy) { | 113 ACTION_P(QuitMessageLoop, loop_or_proxy) { |
| 115 loop_or_proxy->PostTask(FROM_HERE, MessageLoop::QuitClosure()); | 114 loop_or_proxy->PostTask(FROM_HERE, MessageLoop::QuitClosure()); |
| 116 } | 115 } |
| 117 | 116 |
| 118 } // namespace | |
| 119 | |
| 120 WebRTCAudioDeviceTest::WebRTCAudioDeviceTest() | 117 WebRTCAudioDeviceTest::WebRTCAudioDeviceTest() |
| 121 : render_thread_(NULL), audio_util_callback_(NULL), | 118 : render_thread_(NULL), audio_util_callback_(NULL), |
| 122 has_input_devices_(false), has_output_devices_(false) { | 119 has_input_devices_(false), has_output_devices_(false) { |
| 123 } | 120 } |
| 124 | 121 |
| 125 WebRTCAudioDeviceTest::~WebRTCAudioDeviceTest() {} | 122 WebRTCAudioDeviceTest::~WebRTCAudioDeviceTest() {} |
| 126 | 123 |
| 127 void WebRTCAudioDeviceTest::SetUp() { | 124 void WebRTCAudioDeviceTest::SetUp() { |
| 128 // This part sets up a RenderThread environment to ensure that | 125 // This part sets up a RenderThread environment to ensure that |
| 129 // RenderThread::current() (<=> TLS pointer) is valid. | 126 // RenderThread::current() (<=> TLS pointer) is valid. |
| 130 // Main parts are inspired by the RenderViewFakeResourcesTest. | 127 // Main parts are inspired by the RenderViewFakeResourcesTest. |
| 131 // Note that, the IPC part is not utilized in this test. | 128 // Note that, the IPC part is not utilized in this test. |
| 132 saved_content_renderer_.reset( | 129 saved_content_renderer_.reset( |
| 133 new ReplaceContentClientRenderer(&content_renderer_client_)); | 130 new ReplaceContentClientRenderer(&content_renderer_client_)); |
| 134 mock_process_.reset(new WebRTCMockRenderProcess()); | 131 mock_process_.reset(new WebRTCMockRenderProcess()); |
| 135 ui_thread_.reset(new content::TestBrowserThread(content::BrowserThread::UI, | 132 ui_thread_.reset(new TestBrowserThread(BrowserThread::UI, |
| 136 MessageLoop::current())); | 133 MessageLoop::current())); |
| 137 | 134 |
| 138 // Create our own AudioManager and MediaStreamManager. | 135 // Create our own AudioManager and MediaStreamManager. |
| 139 audio_manager_.reset(media::AudioManager::Create()); | 136 audio_manager_.reset(media::AudioManager::Create()); |
| 140 media_stream_manager_.reset( | 137 media_stream_manager_.reset( |
| 141 new media_stream::MediaStreamManager(audio_manager_.get())); | 138 new media_stream::MediaStreamManager(audio_manager_.get())); |
| 142 | 139 |
| 143 // Construct the resource context on the UI thread. | 140 // Construct the resource context on the UI thread. |
| 144 resource_context_.reset(new MockResourceContext); | 141 resource_context_.reset(new MockRTCResourceContext); |
| 145 | 142 |
| 146 static const char kThreadName[] = "RenderThread"; | 143 static const char kThreadName[] = "RenderThread"; |
| 147 ChildProcess::current()->io_message_loop()->PostTask(FROM_HERE, | 144 ChildProcess::current()->io_message_loop()->PostTask(FROM_HERE, |
| 148 base::Bind(&WebRTCAudioDeviceTest::InitializeIOThread, | 145 base::Bind(&WebRTCAudioDeviceTest::InitializeIOThread, |
| 149 base::Unretained(this), kThreadName)); | 146 base::Unretained(this), kThreadName)); |
| 150 WaitForIOThreadCompletion(); | 147 WaitForIOThreadCompletion(); |
| 151 | 148 |
| 152 sandbox_was_enabled_ = | 149 sandbox_was_enabled_ = |
| 153 RendererWebKitPlatformSupportImpl::SetSandboxEnabledForTesting(false); | 150 RendererWebKitPlatformSupportImpl::SetSandboxEnabledForTesting(false); |
| 154 render_thread_ = new RenderThreadImpl(kThreadName); | 151 render_thread_ = new RenderThreadImpl(kThreadName); |
| (...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 198 } | 195 } |
| 199 | 196 |
| 200 void WebRTCAudioDeviceTest::InitializeIOThread(const char* thread_name) { | 197 void WebRTCAudioDeviceTest::InitializeIOThread(const char* thread_name) { |
| 201 #if defined(OS_WIN) | 198 #if defined(OS_WIN) |
| 202 // We initialize COM (STA) on our IO thread as is done in Chrome. | 199 // We initialize COM (STA) on our IO thread as is done in Chrome. |
| 203 // See BrowserProcessSubThread::Init. | 200 // See BrowserProcessSubThread::Init. |
| 204 initialize_com_.reset(new base::win::ScopedCOMInitializer()); | 201 initialize_com_.reset(new base::win::ScopedCOMInitializer()); |
| 205 #endif | 202 #endif |
| 206 | 203 |
| 207 // Set the current thread as the IO thread. | 204 // Set the current thread as the IO thread. |
| 208 io_thread_.reset(new content::TestBrowserThread(content::BrowserThread::IO, | 205 io_thread_.reset(new TestBrowserThread(BrowserThread::IO, |
| 209 MessageLoop::current())); | 206 MessageLoop::current())); |
| 210 | 207 |
| 211 // Populate our resource context. | 208 // Populate our resource context. |
| 212 test_request_context_.reset(new TestURLRequestContext()); | 209 test_request_context_.reset(new TestURLRequestContext()); |
| 213 MockResourceContext* resource_context = | 210 MockRTCResourceContext* resource_context = |
| 214 static_cast<MockResourceContext*>(resource_context_.get()); | 211 static_cast<MockRTCResourceContext*>(resource_context_.get()); |
| 215 resource_context->set_request_context(test_request_context_.get()); | 212 resource_context->set_request_context(test_request_context_.get()); |
| 216 media_observer_.reset(new MockMediaObserver()); | 213 media_observer_.reset(new MockMediaObserver()); |
| 217 | 214 |
| 218 has_input_devices_ = audio_manager_->HasAudioInputDevices(); | 215 has_input_devices_ = audio_manager_->HasAudioInputDevices(); |
| 219 has_output_devices_ = audio_manager_->HasAudioOutputDevices(); | 216 has_output_devices_ = audio_manager_->HasAudioOutputDevices(); |
| 220 | 217 |
| 221 // Create an IPC channel that handles incoming messages on the IO thread. | 218 // Create an IPC channel that handles incoming messages on the IO thread. |
| 222 CreateChannel(thread_name); | 219 CreateChannel(thread_name); |
| 223 } | 220 } |
| 224 | 221 |
| 225 void WebRTCAudioDeviceTest::UninitializeIOThread() { | 222 void WebRTCAudioDeviceTest::UninitializeIOThread() { |
| 226 resource_context_.reset(); | 223 resource_context_.reset(); |
| 227 | 224 |
| 228 test_request_context_.reset(); | 225 test_request_context_.reset(); |
| 229 | 226 |
| 230 #if defined(OS_WIN) | 227 #if defined(OS_WIN) |
| 231 initialize_com_.reset(); | 228 initialize_com_.reset(); |
| 232 #endif | 229 #endif |
| 233 } | 230 } |
| 234 | 231 |
| 235 void WebRTCAudioDeviceTest::CreateChannel(const char* name) { | 232 void WebRTCAudioDeviceTest::CreateChannel(const char* name) { |
| 236 DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::IO)); | 233 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); |
| 237 audio_render_host_ = new AudioRendererHost( | 234 audio_render_host_ = new AudioRendererHost( |
| 238 audio_manager_.get(), media_observer_.get()); | 235 audio_manager_.get(), media_observer_.get()); |
| 239 audio_render_host_->OnChannelConnected(base::GetCurrentProcId()); | 236 audio_render_host_->OnChannelConnected(base::GetCurrentProcId()); |
| 240 | 237 |
| 241 audio_input_renderer_host_ = new AudioInputRendererHost( | 238 audio_input_renderer_host_ = new AudioInputRendererHost( |
| 242 audio_manager_.get(), media_stream_manager_.get()); | 239 audio_manager_.get(), media_stream_manager_.get()); |
| 243 audio_input_renderer_host_->OnChannelConnected(base::GetCurrentProcId()); | 240 audio_input_renderer_host_->OnChannelConnected(base::GetCurrentProcId()); |
| 244 | 241 |
| 245 channel_.reset(new IPC::Channel(name, IPC::Channel::MODE_SERVER, this)); | 242 channel_.reset(new IPC::Channel(name, IPC::Channel::MODE_SERVER, this)); |
| 246 ASSERT_TRUE(channel_->Connect()); | 243 ASSERT_TRUE(channel_->Connect()); |
| 247 | 244 |
| 248 audio_render_host_->OnFilterAdded(channel_.get()); | 245 audio_render_host_->OnFilterAdded(channel_.get()); |
| 249 audio_input_renderer_host_->OnFilterAdded(channel_.get()); | 246 audio_input_renderer_host_->OnFilterAdded(channel_.get()); |
| 250 } | 247 } |
| 251 | 248 |
| 252 void WebRTCAudioDeviceTest::DestroyChannel() { | 249 void WebRTCAudioDeviceTest::DestroyChannel() { |
| 253 DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::IO)); | 250 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); |
| 254 audio_render_host_->OnChannelClosing(); | 251 audio_render_host_->OnChannelClosing(); |
| 255 audio_render_host_->OnFilterRemoved(); | 252 audio_render_host_->OnFilterRemoved(); |
| 256 audio_input_renderer_host_->OnChannelClosing(); | 253 audio_input_renderer_host_->OnChannelClosing(); |
| 257 audio_input_renderer_host_->OnFilterRemoved(); | 254 audio_input_renderer_host_->OnFilterRemoved(); |
| 258 channel_.reset(); | 255 channel_.reset(); |
| 259 audio_render_host_ = NULL; | 256 audio_render_host_ = NULL; |
| 260 audio_input_renderer_host_ = NULL; | 257 audio_input_renderer_host_ = NULL; |
| 261 } | 258 } |
| 262 | 259 |
| 263 void WebRTCAudioDeviceTest::OnGetHardwareSampleRate(int* sample_rate) { | 260 void WebRTCAudioDeviceTest::OnGetHardwareSampleRate(int* sample_rate) { |
| (...skipping 80 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 344 } else { | 341 } else { |
| 345 // Don't delete the event object in case the message ever gets processed. | 342 // Don't delete the event object in case the message ever gets processed. |
| 346 // If we do, we will crash the test process. | 343 // If we do, we will crash the test process. |
| 347 ADD_FAILURE() << "Failed to wait for message loop"; | 344 ADD_FAILURE() << "Failed to wait for message loop"; |
| 348 } | 345 } |
| 349 } | 346 } |
| 350 | 347 |
| 351 std::string WebRTCAudioDeviceTest::GetTestDataPath( | 348 std::string WebRTCAudioDeviceTest::GetTestDataPath( |
| 352 const FilePath::StringType& file_name) { | 349 const FilePath::StringType& file_name) { |
| 353 FilePath path; | 350 FilePath path; |
| 354 EXPECT_TRUE(PathService::Get(content::DIR_TEST_DATA, &path)); | 351 EXPECT_TRUE(PathService::Get(DIR_TEST_DATA, &path)); |
| 355 path = path.Append(file_name); | 352 path = path.Append(file_name); |
| 356 EXPECT_TRUE(file_util::PathExists(path)); | 353 EXPECT_TRUE(file_util::PathExists(path)); |
| 357 #ifdef OS_WIN | 354 #ifdef OS_WIN |
| 358 return WideToUTF8(path.value()); | 355 return WideToUTF8(path.value()); |
| 359 #else | 356 #else |
| 360 return path.value(); | 357 return path.value(); |
| 361 #endif | 358 #endif |
| 362 } | 359 } |
| 363 | 360 |
| 364 WebRTCTransportImpl::WebRTCTransportImpl(webrtc::VoENetwork* network) | 361 WebRTCTransportImpl::WebRTCTransportImpl(webrtc::VoENetwork* network) |
| 365 : network_(network) { | 362 : network_(network) { |
| 366 } | 363 } |
| 367 | 364 |
| 368 WebRTCTransportImpl::~WebRTCTransportImpl() {} | 365 WebRTCTransportImpl::~WebRTCTransportImpl() {} |
| 369 | 366 |
| 370 int WebRTCTransportImpl::SendPacket(int channel, const void* data, int len) { | 367 int WebRTCTransportImpl::SendPacket(int channel, const void* data, int len) { |
| 371 return network_->ReceivedRTPPacket(channel, data, len); | 368 return network_->ReceivedRTPPacket(channel, data, len); |
| 372 } | 369 } |
| 373 | 370 |
| 374 int WebRTCTransportImpl::SendRTCPPacket(int channel, const void* data, | 371 int WebRTCTransportImpl::SendRTCPPacket(int channel, const void* data, |
| 375 int len) { | 372 int len) { |
| 376 return network_->ReceivedRTCPPacket(channel, data, len); | 373 return network_->ReceivedRTCPPacket(channel, data, len); |
| 377 } | 374 } |
| 375 |
| 376 } // namespace content |
| OLD | NEW |