Index: content/browser/renderer_host/media/media_stream_dispatcher_host_unittest.cc |
diff --git a/content/browser/renderer_host/media/media_stream_dispatcher_host_unittest.cc b/content/browser/renderer_host/media/media_stream_dispatcher_host_unittest.cc |
index 85f8485f0311b8e69f09b2f1dcffc240d27b6d9e..7b6862adba3a84a56373c00757156b40a14f71b9 100644 |
--- a/content/browser/renderer_host/media/media_stream_dispatcher_host_unittest.cc |
+++ b/content/browser/renderer_host/media/media_stream_dispatcher_host_unittest.cc |
@@ -5,7 +5,9 @@ |
#include <string> |
#include "base/bind.h" |
+#include "base/callback_helpers.h" |
#include "base/message_loop.h" |
+#include "base/run_loop.h" |
#include "content/browser/browser_thread_impl.h" |
#include "content/browser/renderer_host/media/media_stream_dispatcher_host.h" |
#include "content/browser/renderer_host/media/media_stream_manager.h" |
@@ -14,7 +16,7 @@ |
#include "content/common/media/media_stream_messages.h" |
#include "content/common/media/media_stream_options.h" |
#include "content/public/test/mock_resource_context.h" |
-#include "content/public/test/test_browser_thread.h" |
+#include "content/public/test/test_browser_thread_bundle.h" |
#include "content/test/test_content_browser_client.h" |
#include "content/test/test_content_client.h" |
#include "ipc/ipc_message_macros.h" |
@@ -39,8 +41,9 @@ namespace content { |
class MockMediaStreamDispatcherHost : public MediaStreamDispatcherHost, |
public TestContentBrowserClient { |
public: |
- MockMediaStreamDispatcherHost(base::MessageLoop* message_loop, |
- MediaStreamManager* manager) |
+ MockMediaStreamDispatcherHost( |
+ const scoped_refptr<base::MessageLoopProxy>& message_loop, |
+ MediaStreamManager* manager) |
: MediaStreamDispatcherHost(kProcessId, manager), |
message_loop_(message_loop) {} |
@@ -51,12 +54,14 @@ class MockMediaStreamDispatcherHost : public MediaStreamDispatcherHost, |
MOCK_METHOD2(OnStreamGenerationFailed, void(int routing_id, int request_id)); |
// Accessor to private functions. |
- void OnGenerateStream(int page_request_id, const StreamOptions& components) { |
- MediaStreamDispatcherHost::OnGenerateStream(kRenderId, |
- page_request_id, |
- components, |
- GURL()); |
+ void OnGenerateStream(int page_request_id, |
+ const StreamOptions& components, |
+ const base::Closure& quit_closure) { |
+ quit_closure_ = quit_closure; |
+ MediaStreamDispatcherHost::OnGenerateStream( |
+ kRenderId, page_request_id, components, GURL()); |
} |
+ |
void OnStopGeneratedStream(const std::string& label) { |
MediaStreamDispatcherHost::OnStopGeneratedStream(kRenderId, label); |
} |
@@ -104,7 +109,7 @@ class MockMediaStreamDispatcherHost : public MediaStreamDispatcherHost, |
OnStreamGenerated(msg.routing_id(), request_id, audio_device_list.size(), |
video_device_list.size()); |
// Notify that the event have occured. |
- message_loop_->PostTask(FROM_HERE, base::MessageLoop::QuitClosure()); |
+ message_loop_->PostTask(FROM_HERE, base::ResetAndReturn(&quit_closure_)); |
label_ = label; |
audio_devices_ = audio_device_list; |
video_devices_ = video_device_list; |
@@ -112,11 +117,13 @@ class MockMediaStreamDispatcherHost : public MediaStreamDispatcherHost, |
void OnStreamGenerationFailed(const IPC::Message& msg, int request_id) { |
OnStreamGenerationFailed(msg.routing_id(), request_id); |
- message_loop_->PostTask(FROM_HERE, base::MessageLoop::QuitClosure()); |
+ if (!quit_closure_.is_null()) |
+ message_loop_->PostTask(FROM_HERE, base::ResetAndReturn(&quit_closure_)); |
label_= ""; |
} |
- base::MessageLoop* message_loop_; |
+ scoped_refptr<base::MessageLoopProxy> message_loop_; |
+ base::Closure quit_closure_; |
}; |
class MockMediaStreamUIProxy : public FakeMediaStreamUIProxy { |
@@ -126,37 +133,31 @@ class MockMediaStreamUIProxy : public FakeMediaStreamUIProxy { |
class MediaStreamDispatcherHostTest : public testing::Test { |
public: |
- MediaStreamDispatcherHostTest() : old_browser_client_(NULL) {} |
- virtual ~MediaStreamDispatcherHostTest() {} |
- |
- void WaitForResult() { |
- message_loop_->Run(); |
- } |
- |
- protected: |
- virtual void SetUp() OVERRIDE { |
- // MediaStreamManager must be created and called on IO thread. |
- message_loop_.reset(new base::MessageLoop(base::MessageLoop::TYPE_IO)); |
- ui_thread_.reset(new TestBrowserThread(BrowserThread::UI, |
- message_loop_.get())); |
- io_thread_.reset(new TestBrowserThread(BrowserThread::IO, |
- message_loop_.get())); |
- |
+ MediaStreamDispatcherHostTest() |
+ : old_browser_client_(NULL), |
+ thread_bundle_(content::TestBrowserThreadBundle::IO_MAINLOOP) { |
// Create our own MediaStreamManager. |
audio_manager_.reset(media::AudioManager::Create()); |
media_stream_manager_.reset(new MediaStreamManager(audio_manager_.get())); |
// Make sure we use fake devices to avoid long delays. |
media_stream_manager_->UseFakeDevice(); |
- host_ = new MockMediaStreamDispatcherHost(message_loop_.get(), |
+ host_ = new MockMediaStreamDispatcherHost(base::MessageLoopProxy::current(), |
media_stream_manager_.get()); |
// Use the fake content client and browser. |
- content_client_.reset(new TestContentClient); |
+ content_client_.reset(new TestContentClient()); |
SetContentClient(content_client_.get()); |
old_browser_client_ = SetBrowserClientForTesting(host_.get()); |
} |
+ virtual ~MediaStreamDispatcherHostTest() { |
+ // Recover the old browser client and content client. |
+ SetBrowserClientForTesting(old_browser_client_); |
+ content_client_.reset(); |
+ } |
+ |
+ protected: |
virtual void SetupFakeUI(bool expect_started) { |
scoped_ptr<MockMediaStreamUIProxy> stream_ui(new MockMediaStreamUIProxy()); |
if (expect_started) { |
@@ -166,26 +167,19 @@ class MediaStreamDispatcherHostTest : public testing::Test { |
stream_ui.PassAs<FakeMediaStreamUIProxy>()); |
} |
- virtual void TearDown() OVERRIDE { |
- message_loop_->RunUntilIdle(); |
- |
- // Recover the old browser client and content client. |
- SetBrowserClientForTesting(old_browser_client_); |
- content_client_.reset(); |
- |
- // Delete the IO message loop to delete the device thread, |
- // AudioInputDeviceManager and VideoCaptureManager. |
- message_loop_.reset(); |
+ void GenerateStreamAndWaitForResult(int page_request_id, |
+ const StreamOptions& options) { |
+ base::RunLoop run_loop; |
+ host_->OnGenerateStream(page_request_id, options, run_loop.QuitClosure()); |
+ run_loop.Run(); |
} |
scoped_refptr<MockMediaStreamDispatcherHost> host_; |
- scoped_ptr<base::MessageLoop> message_loop_; |
- scoped_ptr<TestBrowserThread> ui_thread_; |
- scoped_ptr<TestBrowserThread> io_thread_; |
scoped_ptr<media::AudioManager> audio_manager_; |
scoped_ptr<MediaStreamManager> media_stream_manager_; |
ContentBrowserClient* old_browser_client_; |
scoped_ptr<ContentClient> content_client_; |
+ content::TestBrowserThreadBundle thread_bundle_; |
}; |
TEST_F(MediaStreamDispatcherHostTest, GenerateStream) { |
@@ -193,9 +187,7 @@ TEST_F(MediaStreamDispatcherHostTest, GenerateStream) { |
SetupFakeUI(true); |
EXPECT_CALL(*host_.get(), OnStreamGenerated(kRenderId, kPageRequestId, 0, 1)); |
- host_->OnGenerateStream(kPageRequestId, options); |
- |
- WaitForResult(); |
+ GenerateStreamAndWaitForResult(kPageRequestId, options); |
std::string label = host_->label_; |
@@ -216,9 +208,7 @@ TEST_F(MediaStreamDispatcherHostTest, GenerateThreeStreams) { |
// Generate first stream. |
SetupFakeUI(true); |
EXPECT_CALL(*host_.get(), OnStreamGenerated(kRenderId, kPageRequestId, 0, 1)); |
- host_->OnGenerateStream(kPageRequestId, options); |
- |
- WaitForResult(); |
+ GenerateStreamAndWaitForResult(kPageRequestId, options); |
// Check the latest generated stream. |
EXPECT_EQ(host_->audio_devices_.size(), 0u); |
@@ -233,9 +223,7 @@ TEST_F(MediaStreamDispatcherHostTest, GenerateThreeStreams) { |
SetupFakeUI(true); |
EXPECT_CALL(*host_.get(), |
OnStreamGenerated(kRenderId, kPageRequestId + 1, 0, 1)); |
- host_->OnGenerateStream(kPageRequestId + 1, options); |
- |
- WaitForResult(); |
+ GenerateStreamAndWaitForResult(kPageRequestId + 1, options); |
// Check the latest generated stream. |
EXPECT_EQ(host_->audio_devices_.size(), 0u); |
@@ -252,9 +240,7 @@ TEST_F(MediaStreamDispatcherHostTest, GenerateThreeStreams) { |
SetupFakeUI(true); |
EXPECT_CALL(*host_.get(), |
OnStreamGenerated(kRenderId, kPageRequestId + 2, 0, 1)); |
- host_->OnGenerateStream(kPageRequestId + 2, options); |
- |
- WaitForResult(); |
+ GenerateStreamAndWaitForResult(kPageRequestId + 2, options); |
// Check the latest generated stream. |
EXPECT_EQ(host_->audio_devices_.size(), 0u); |
@@ -279,24 +265,27 @@ TEST_F(MediaStreamDispatcherHostTest, FailOpenVideoDevice) { |
media::FakeVideoCaptureDevice::SetFailNextCreate(); |
SetupFakeUI(false); |
- host_->OnGenerateStream(kPageRequestId, options); |
EXPECT_CALL(*host_.get(), |
OnStreamGenerationFailed(kRenderId, kPageRequestId)); |
- WaitForResult(); |
+ GenerateStreamAndWaitForResult(kPageRequestId, options); |
} |
TEST_F(MediaStreamDispatcherHostTest, CancelPendingStreamsOnChannelClosing) { |
StreamOptions options(MEDIA_NO_SERVICE, MEDIA_DEVICE_VIDEO_CAPTURE); |
+ base::RunLoop run_loop; |
+ |
// Create multiple GenerateStream requests. |
size_t streams = 5; |
for (size_t i = 1; i <= streams; ++i) { |
- host_->OnGenerateStream(kPageRequestId + i, options); |
+ host_->OnGenerateStream( |
+ kPageRequestId + i, options, run_loop.QuitClosure()); |
EXPECT_EQ(host_->NumberOfStreams(), i); |
} |
// Calling OnChannelClosing() to cancel all the pending requests. |
host_->OnChannelClosing(); |
+ run_loop.RunUntilIdle(); |
// Streams should have been cleaned up. |
EXPECT_EQ(host_->NumberOfStreams(), 0u); |
@@ -311,17 +300,13 @@ TEST_F(MediaStreamDispatcherHostTest, StopGeneratedStreamsOnChannelClosing) { |
SetupFakeUI(true); |
EXPECT_CALL(*host_.get(), |
OnStreamGenerated(kRenderId, kPageRequestId + i, 0, 1)); |
- host_->OnGenerateStream(kPageRequestId + i, options); |
- |
- // Wait until the stream is generated. |
- WaitForResult(); |
+ GenerateStreamAndWaitForResult(kPageRequestId + i, options); |
} |
EXPECT_EQ(host_->NumberOfStreams(), generated_streams); |
// Calling OnChannelClosing() to cancel all the pending/generated streams. |
host_->OnChannelClosing(); |
- |
- message_loop_->RunUntilIdle(); |
+ base::RunLoop().RunUntilIdle(); |
// Streams should have been cleaned up. |
EXPECT_EQ(host_->NumberOfStreams(), 0u); |
@@ -333,15 +318,13 @@ TEST_F(MediaStreamDispatcherHostTest, CloseFromUI) { |
base::Closure close_callback; |
scoped_ptr<MockMediaStreamUIProxy> stream_ui(new MockMediaStreamUIProxy()); |
EXPECT_CALL(*stream_ui, OnStarted(_)) |
- .WillOnce(SaveArg<0>(&close_callback)); |
+ .WillOnce(SaveArg<0>(&close_callback)); |
media_stream_manager_->UseFakeUI(stream_ui.PassAs<FakeMediaStreamUIProxy>()); |
EXPECT_CALL(*host_.get(), OnStreamGenerated(kRenderId, kPageRequestId, 0, 1)); |
EXPECT_CALL(*host_.get(), |
OnStreamGenerationFailed(kRenderId, kPageRequestId)); |
- host_->OnGenerateStream(kPageRequestId, options); |
- |
- WaitForResult(); |
+ GenerateStreamAndWaitForResult(kPageRequestId, options); |
EXPECT_EQ(host_->audio_devices_.size(), 0u); |
EXPECT_EQ(host_->video_devices_.size(), 1u); |
@@ -349,7 +332,7 @@ TEST_F(MediaStreamDispatcherHostTest, CloseFromUI) { |
ASSERT_FALSE(close_callback.is_null()); |
close_callback.Run(); |
- message_loop_->RunUntilIdle(); |
+ base::RunLoop().RunUntilIdle(); |
EXPECT_EQ(host_->NumberOfStreams(), 0u); |
} |