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 |