Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1684)

Side by Side Diff: content/browser/renderer_host/media/media_stream_dispatcher_host_unittest.cc

Issue 10662049: Move the device enumerate/open/close work to device thread from IO thread (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: ready for review. Created 8 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
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 <string> 5 #include <string>
6 6
7 #include "base/bind.h" 7 #include "base/bind.h"
8 #include "base/message_loop.h" 8 #include "base/message_loop.h"
9 #include "content/browser/browser_thread_impl.h" 9 #include "content/browser/browser_thread_impl.h"
10 #include "content/browser/renderer_host/media/media_stream_dispatcher_host.h" 10 #include "content/browser/renderer_host/media/media_stream_dispatcher_host.h"
11 #include "content/browser/renderer_host/media/media_stream_manager.h" 11 #include "content/browser/renderer_host/media/media_stream_manager.h"
12 #include "content/browser/renderer_host/media/mock_media_observer.h" 12 #include "content/browser/renderer_host/media/mock_media_observer.h"
13 #include "content/browser/renderer_host/media/video_capture_manager.h" 13 #include "content/browser/renderer_host/media/video_capture_manager.h"
14 #include "content/common/media/media_stream_messages.h" 14 #include "content/common/media/media_stream_messages.h"
15 #include "content/common/media/media_stream_options.h" 15 #include "content/common/media/media_stream_options.h"
16 #include "content/public/test/mock_resource_context.h" 16 #include "content/public/test/mock_resource_context.h"
17 #include "content/test/test_content_browser_client.h" 17 #include "content/test/test_content_browser_client.h"
18 #include "content/test/test_content_client.h" 18 #include "content/test/test_content_client.h"
19 #include "ipc/ipc_message_macros.h" 19 #include "ipc/ipc_message_macros.h"
20 #include "media/audio/audio_manager.h"
21 #include "net/url_request/url_request_context.h" 20 #include "net/url_request/url_request_context.h"
22 #include "testing/gmock/include/gmock/gmock.h" 21 #include "testing/gmock/include/gmock/gmock.h"
23 #include "testing/gtest/include/gtest/gtest.h" 22 #include "testing/gtest/include/gtest/gtest.h"
24 23
25 using ::testing::_; 24 using ::testing::_;
26 using ::testing::DeleteArg; 25 using ::testing::DeleteArg;
27 using ::testing::DoAll; 26 using ::testing::DoAll;
28 using ::testing::Return; 27 using ::testing::Return;
29 28
30 using content::BrowserThread; 29 using content::BrowserThread;
31 using content::BrowserThreadImpl; 30 using content::BrowserThreadImpl;
32 31
33 const int kProcessId = 5; 32 const int kProcessId = 5;
34 const int kRenderId = 6; 33 const int kRenderId = 6;
35 const int kPageRequestId = 7; 34 const int kPageRequestId = 7;
36 35
37 namespace media_stream { 36 namespace media_stream {
38 37
39 class MockMediaStreamDispatcherHost : public MediaStreamDispatcherHost, 38 class MockMediaStreamDispatcherHost : public MediaStreamDispatcherHost,
40 public content::TestContentBrowserClient { 39 public content::TestContentBrowserClient {
41 public: 40 public:
42 MockMediaStreamDispatcherHost(content::ResourceContext* resource_context, 41 MockMediaStreamDispatcherHost(content::ResourceContext* resource_context,
43 MessageLoop* message_loop, 42 MessageLoop* message_loop)
44 media::AudioManager* audio_manager) 43 : MediaStreamDispatcherHost(resource_context, kProcessId),
45 : MediaStreamDispatcherHost(resource_context, kProcessId, audio_manager),
46 message_loop_(message_loop) {} 44 message_loop_(message_loop) {}
47 45
48 // A list of mock methods. 46 // A list of mock methods.
49 MOCK_METHOD4(OnStreamGenerated, 47 MOCK_METHOD4(OnStreamGenerated,
50 void(int routing_id, int request_id, int audio_array_size, 48 void(int routing_id, int request_id, int audio_array_size,
51 int video_array_size)); 49 int video_array_size));
52 MOCK_METHOD2(OnStreamGenerationFailed, void(int routing_id, int request_id)); 50 MOCK_METHOD2(OnStreamGenerationFailed, void(int routing_id, int request_id));
53 MOCK_METHOD2(OnAudioDeviceFailed, void(int routing_id, int index)); 51 MOCK_METHOD2(OnAudioDeviceFailed, void(int routing_id, int index));
54 MOCK_METHOD2(OnVideoDeviceFailed, void(int routing_id, int index)); 52 MOCK_METHOD2(OnVideoDeviceFailed, void(int routing_id, int index));
55 MOCK_METHOD0(GetMediaObserver, content::MediaObserver*()); 53 MOCK_METHOD0(GetMediaObserver, content::MediaObserver*());
(...skipping 99 matching lines...) Expand 10 before | Expand all | Expand 10 after
155 protected: 153 protected:
156 virtual void SetUp() { 154 virtual void SetUp() {
157 message_loop_.reset(new MessageLoop(MessageLoop::TYPE_IO)); 155 message_loop_.reset(new MessageLoop(MessageLoop::TYPE_IO));
158 // ResourceContext must be created on UI thread. 156 // ResourceContext must be created on UI thread.
159 ui_thread_.reset(new BrowserThreadImpl(BrowserThread::UI, 157 ui_thread_.reset(new BrowserThreadImpl(BrowserThread::UI,
160 message_loop_.get())); 158 message_loop_.get()));
161 // MediaStreamManager must be created and called on IO thread. 159 // MediaStreamManager must be created and called on IO thread.
162 io_thread_.reset(new BrowserThreadImpl(BrowserThread::IO, 160 io_thread_.reset(new BrowserThreadImpl(BrowserThread::IO,
163 message_loop_.get())); 161 message_loop_.get()));
164 162
165 audio_manager_.reset(media::AudioManager::Create());
166
167 // Create our own media observer. 163 // Create our own media observer.
168 media_observer_.reset(new MockMediaObserver()); 164 media_observer_.reset(new MockMediaObserver());
169 165
170 // Make sure we use fake devices to avoid long delays. 166 // Make sure we use fake devices to avoid long delays.
171 MediaStreamManager::GetForResourceContext( 167 MediaStreamManager::GetForResourceContext(
172 &resource_context_, audio_manager_.get())->UseFakeDevice(); 168 &resource_context_)->UseFakeDevice();
173 169
174 host_ = new MockMediaStreamDispatcherHost( 170 host_ = new MockMediaStreamDispatcherHost(&resource_context_,
175 &resource_context_, message_loop_.get(), audio_manager_.get()); 171 message_loop_.get());
176 172
177 // Use the fake content client and browser. 173 // Use the fake content client and browser.
178 old_client_ = content::GetContentClient(); 174 old_client_ = content::GetContentClient();
179 old_browser_client_ = content::GetContentClient()->browser(); 175 old_browser_client_ = content::GetContentClient()->browser();
180 content_client_.reset(new TestContentClient); 176 content_client_.reset(new TestContentClient);
181 content::SetContentClient(content_client_.get()); 177 content::SetContentClient(content_client_.get());
182 content_client_->set_browser_for_testing(host_); 178 content_client_->set_browser_for_testing(host_);
183 } 179 }
184 180
185 virtual void TearDown() { 181 virtual void TearDown() {
186 // Needed to make sure the manager finishes all tasks on its own thread. 182 // Needed to make sure the manager finishes all tasks on its own thread.
187 SyncWithVideoCaptureManagerThread(); 183 SyncWithVideoCaptureManagerThread();
188 184
189 // Recover the old browser client and content client. 185 // Recover the old browser client and content client.
190 content::GetContentClient()->set_browser_for_testing(old_browser_client_); 186 content::GetContentClient()->set_browser_for_testing(old_browser_client_);
191 content::SetContentClient(old_client_); 187 content::SetContentClient(old_client_);
192 content_client_.reset(); 188 content_client_.reset();
193 } 189 }
194 190
195 // Called on the VideoCaptureManager thread. 191 // Called on the VideoCaptureManager thread.
196 static void PostQuitMessageLoop(MessageLoop* message_loop) { 192 static void PostQuitMessageLoop(MessageLoop* message_loop) {
197 message_loop->PostTask(FROM_HERE, MessageLoop::QuitClosure()); 193 message_loop->PostTask(FROM_HERE, MessageLoop::QuitClosure());
198 } 194 }
199 195
200 // Called on the main thread. 196 // Called on the main thread.
201 static void PostQuitOnVideoCaptureManagerThread( 197 static void PostQuitOnVideoCaptureManagerThread(
202 MessageLoop* message_loop, 198 MessageLoop* message_loop,
203 media_stream::MediaStreamManager* media_stream_manager) { 199 media_stream::MediaStreamManager* media_stream_manager) {
204 media_stream_manager->video_capture_manager()->GetMessageLoop()-> 200 media_stream_manager->GetMessageLoop()->PostTask(
205 PostTask(FROM_HERE, 201 FROM_HERE, base::Bind(&PostQuitMessageLoop, message_loop));
206 base::Bind(&PostQuitMessageLoop, message_loop));
207 } 202 }
208 203
209 // SyncWithVideoCaptureManagerThread() waits until all pending tasks on the 204 // SyncWithVideoCaptureManagerThread() waits until all pending tasks on the
210 // video_capture_manager thread are executed while also processing pending 205 // video_capture_manager thread are executed while also processing pending
211 // task in message_loop_ on the current thread. It is used to synchronize 206 // task in message_loop_ on the current thread. It is used to synchronize
212 // with the video capture manager thread when we are stopping a video 207 // with the video capture manager thread when we are stopping a video
213 // capture device. 208 // capture device.
214 void SyncWithVideoCaptureManagerThread() { 209 void SyncWithVideoCaptureManagerThread() {
scherkus (not reviewing) 2012/06/27 00:52:31 do you really need to sync here? would the followi
no longer working on chromium 2012/06/27 14:07:16 I am not familiar with the code here, but the comm
215 message_loop_->PostTask( 210 message_loop_->PostTask(
216 FROM_HERE, 211 FROM_HERE,
217 base::Bind(&PostQuitOnVideoCaptureManagerThread, 212 base::Bind(&PostQuitOnVideoCaptureManagerThread,
218 message_loop_.get(), 213 message_loop_.get(),
219 MediaStreamManager::GetForResourceContext( 214 MediaStreamManager::GetForResourceContext(
220 &resource_context_, audio_manager_.get()))); 215 &resource_context_)));
221 message_loop_->Run(); 216 message_loop_->Run();
222 } 217 }
223 218
224 scoped_refptr<MockMediaStreamDispatcherHost> host_; 219 scoped_refptr<MockMediaStreamDispatcherHost> host_;
225 scoped_ptr<MessageLoop> message_loop_; 220 scoped_ptr<MessageLoop> message_loop_;
226 scoped_ptr<BrowserThreadImpl> ui_thread_; 221 scoped_ptr<BrowserThreadImpl> ui_thread_;
227 scoped_ptr<BrowserThreadImpl> io_thread_; 222 scoped_ptr<BrowserThreadImpl> io_thread_;
228 scoped_ptr<media::AudioManager> audio_manager_;
229 content::MockResourceContext resource_context_; 223 content::MockResourceContext resource_context_;
230 content::ContentClient* old_client_; 224 content::ContentClient* old_client_;
231 content::ContentBrowserClient* old_browser_client_; 225 content::ContentBrowserClient* old_browser_client_;
232 scoped_ptr<content::ContentClient> content_client_; 226 scoped_ptr<content::ContentClient> content_client_;
233 scoped_ptr<MockMediaObserver> media_observer_; 227 scoped_ptr<MockMediaObserver> media_observer_;
234 }; 228 };
235 229
236 TEST_F(MediaStreamDispatcherHostTest, GenerateStream) { 230 TEST_F(MediaStreamDispatcherHostTest, GenerateStream) {
237 StreamOptions options(false, true); 231 StreamOptions options(false, true);
238 232
(...skipping 100 matching lines...) Expand 10 before | Expand all | Expand 10 after
339 EXPECT_CALL(*media_observer_.get(), OnCaptureDevicesOpened(_, _, _)); 333 EXPECT_CALL(*media_observer_.get(), OnCaptureDevicesOpened(_, _, _));
340 WaitForResult(); 334 WaitForResult();
341 std::string label = host_->label_; 335 std::string label = host_->label_;
342 336
343 EXPECT_EQ(host_->audio_devices_.size(), 0u); 337 EXPECT_EQ(host_->audio_devices_.size(), 0u);
344 EXPECT_EQ(host_->video_devices_.size(), 1u); 338 EXPECT_EQ(host_->video_devices_.size(), 1u);
345 EXPECT_EQ(host_->NumberOfStreams(), 1u); 339 EXPECT_EQ(host_->NumberOfStreams(), 1u);
346 340
347 EXPECT_CALL(*host_, OnVideoDeviceFailed(kRenderId, 0)); 341 EXPECT_CALL(*host_, OnVideoDeviceFailed(kRenderId, 0));
348 int session_id = host_->video_devices_[0].session_id; 342 int session_id = host_->video_devices_[0].session_id;
349 MediaStreamManager::GetForResourceContext( 343 MediaStreamManager::GetForResourceContext(&resource_context_)->
350 &resource_context_, audio_manager_.get())->
351 video_capture_manager()->Error(session_id); 344 video_capture_manager()->Error(session_id);
scherkus (not reviewing) 2012/06/27 00:52:31 fix indent
no longer working on chromium 2012/06/27 14:07:16 Done.
352 WaitForResult(); 345 WaitForResult();
353 EXPECT_EQ(host_->video_devices_.size(), 0u); 346 EXPECT_EQ(host_->video_devices_.size(), 0u);
354 EXPECT_EQ(host_->NumberOfStreams(), 1u); 347 EXPECT_EQ(host_->NumberOfStreams(), 1u);
355 348
356 // TODO(perkj): test audio device failure? 349 // TODO(perkj): test audio device failure?
357 350
358 host_->OnStopGeneratedStream(label); 351 host_->OnStopGeneratedStream(label);
359 EXPECT_EQ(host_->NumberOfStreams(), 0u); 352 EXPECT_EQ(host_->NumberOfStreams(), 0u);
360 } 353 }
361 354
362 }; // namespace media_stream 355 }; // namespace media_stream
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698