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 <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 Loading... | |
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 Loading... | |
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 |
OLD | NEW |