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

Unified Diff: content/browser/renderer_host/media/audio_input_device_manager_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, 6 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 side-by-side diff with in-line comments
Download patch
Index: content/browser/renderer_host/media/audio_input_device_manager_unittest.cc
diff --git a/content/browser/renderer_host/media/audio_input_device_manager_unittest.cc b/content/browser/renderer_host/media/audio_input_device_manager_unittest.cc
index fe57150d6747de15616b50c29d8ad9b4a1fd0b82..38917d4f5c47851f45a860a8b16c362a5e4bfe0a 100644
--- a/content/browser/renderer_host/media/audio_input_device_manager_unittest.cc
+++ b/content/browser/renderer_host/media/audio_input_device_manager_unittest.cc
@@ -8,6 +8,7 @@
#include "base/memory/ref_counted.h"
#include "base/memory/scoped_ptr.h"
#include "base/message_loop.h"
+#include "content/browser/browser_main_loop.h"
#include "content/browser/browser_thread_impl.h"
#include "content/browser/renderer_host/media/audio_input_device_manager.h"
#include "content/browser/renderer_host/media/audio_input_device_manager_event_handler.h"
@@ -15,6 +16,7 @@
#include "testing/gmock/include/gmock/gmock.h"
#include "testing/gtest/include/gtest/gtest.h"
+using content::BrowserMainLoop;
using content::BrowserThread;
using content::BrowserThreadImpl;
using media_stream::AudioInputDeviceManager;
@@ -105,28 +107,60 @@ class AudioInputDeviceManagerTest : public testing::Test {
message_loop_.reset(new MessageLoop(MessageLoop::TYPE_IO));
io_thread_.reset(new BrowserThreadImpl(BrowserThread::IO,
message_loop_.get()));
- audio_manager_.reset(media::AudioManager::Create());
- manager_ = new AudioInputDeviceManager(audio_manager_.get());
+ device_thread_.reset(new base::Thread("AudioInputDeviceManagerTestThread"));
scherkus (not reviewing) 2012/06/27 00:52:31 given that you can inject message loops I'm curiou
no longer working on chromium 2012/06/27 14:07:16 True, I did not do this simply because I was not s
+ CHECK(device_thread_->Start());
+
+ manager_ = new AudioInputDeviceManager(
+ device_thread_->message_loop_proxy());
audio_input_listener_.reset(new MockAudioInputDeviceManagerListener());
manager_->Register(audio_input_listener_.get());
+ audio_manager_.reset(media::AudioManager::Create());
+ manager_->SetAudioManagerForTesting(audio_manager_.get());
scherkus (not reviewing) 2012/06/27 00:52:31 can't we recreate a BrowserMainLoop for each test
no longer working on chromium 2012/06/27 14:07:16 Good idea, done.
+
// Gets the enumerated device list from the AudioInputDeviceManager.
manager_->EnumerateDevices();
EXPECT_CALL(*audio_input_listener_, DevicesEnumerated(_))
.Times(1);
- // Waits for the callback.
- message_loop_->RunAllPending();
+ // Sync up the threads to make sure we get the list.
+ SyncWithAudioInputDeviceManagerThread();
}
virtual void TearDown() {
manager_->Unregister();
io_thread_.reset();
+ device_thread_->Stop();
+ }
+
+ // Called on the device thread.
+ static void PostQuitMessageLoop(MessageLoop* message_loop) {
+ message_loop->PostTask(FROM_HERE, MessageLoop::QuitClosure());
+ }
+
+ // Called on the main thread.
+ static void PostQuitOnAudioInputDeviceManagerThread(
+ MessageLoop* message_loop, MessageLoop* device_message_loop) {
+ device_message_loop->PostTask(
+ FROM_HERE, base::Bind(&PostQuitMessageLoop, message_loop));
+ }
+
+ // SyncWithAudioInputDeviceManagerThread() waits until all pending tasks on
+ // the audio_input_device_manager thread are executed while also processing
+ // pending task in message_loop_ on the current thread.
+ void SyncWithAudioInputDeviceManagerThread() {
+ message_loop_->PostTask(
+ FROM_HERE,
+ base::Bind(&PostQuitOnAudioInputDeviceManagerThread,
+ message_loop_.get(),
+ device_thread_->message_loop()));
+ message_loop_->Run();
}
scoped_ptr<MessageLoop> message_loop_;
scoped_ptr<BrowserThreadImpl> io_thread_;
+ scoped_ptr<base::Thread> device_thread_;
scoped_refptr<AudioInputDeviceManager> manager_;
scoped_ptr<MockAudioInputDeviceManagerListener> audio_input_listener_;
scoped_ptr<media::AudioManager> audio_manager_;
@@ -161,8 +195,7 @@ TEST_F(AudioInputDeviceManagerTest, OpenAndCloseDevice) {
session_id))
.Times(1);
- // Waits for the callback.
- message_loop_->RunAllPending();
+ SyncWithAudioInputDeviceManagerThread();
}
}
@@ -192,8 +225,7 @@ TEST_F(AudioInputDeviceManagerTest, OpenMultipleDevices) {
session_id[index]))
.Times(1);
- // Waits for the callback.
- message_loop_->RunAllPending();
+ SyncWithAudioInputDeviceManagerThread();
}
// Checks if the session_ids are unique.
@@ -211,8 +243,7 @@ TEST_F(AudioInputDeviceManagerTest, OpenMultipleDevices) {
session_id[i]))
.Times(1);
- // Waits for the callback.
- message_loop_->RunAllPending();
+ SyncWithAudioInputDeviceManagerThread();
}
}
@@ -233,8 +264,7 @@ TEST_F(AudioInputDeviceManagerTest, OpenNotExistingDevice) {
session_id))
.Times(1);
- // Waits for the callback.
- message_loop_->RunAllPending();
+ SyncWithAudioInputDeviceManagerThread();
}
// Opens default device twice.
@@ -273,8 +303,7 @@ TEST_F(AudioInputDeviceManagerTest, OpenDeviceTwice) {
second_session_id))
.Times(1);
- // Waits for the callback.
- message_loop_->RunAllPending();
+ SyncWithAudioInputDeviceManagerThread();
}
// Starts and closes the sessions after opening the devices.
@@ -307,7 +336,7 @@ TEST_F(AudioInputDeviceManagerTest, StartAndStopSession) {
Opened(content::MEDIA_STREAM_DEVICE_TYPE_AUDIO_CAPTURE,
session_id[index]))
.Times(1);
- message_loop_->RunAllPending();
+ SyncWithAudioInputDeviceManagerThread();
manager_->Start(session_id[index], audio_input_event_handler.get());
EXPECT_CALL(*audio_input_event_handler,
@@ -321,7 +350,7 @@ TEST_F(AudioInputDeviceManagerTest, StartAndStopSession) {
Closed(content::MEDIA_STREAM_DEVICE_TYPE_AUDIO_CAPTURE,
session_id[index]))
.Times(1);
- message_loop_->RunAllPending();
+ SyncWithAudioInputDeviceManagerThread();
}
}
@@ -354,7 +383,7 @@ TEST_F(AudioInputDeviceManagerTest, CloseWithoutStopSession) {
Opened(content::MEDIA_STREAM_DEVICE_TYPE_AUDIO_CAPTURE,
session_id[index]))
.Times(1);
- message_loop_->RunAllPending();
+ SyncWithAudioInputDeviceManagerThread();
manager_->Start(session_id[index], audio_input_event_handler.get());
EXPECT_CALL(*audio_input_event_handler,
@@ -372,7 +401,7 @@ TEST_F(AudioInputDeviceManagerTest, CloseWithoutStopSession) {
Closed(content::MEDIA_STREAM_DEVICE_TYPE_AUDIO_CAPTURE,
session_id[index]))
.Times(1);
- message_loop_->RunAllPending();
+ SyncWithAudioInputDeviceManagerThread();
}
}
@@ -407,7 +436,7 @@ TEST_F(AudioInputDeviceManagerTest, StartDeviceTwice) {
Opened(content::MEDIA_STREAM_DEVICE_TYPE_AUDIO_CAPTURE,
second_session_id))
.Times(1);
- message_loop_->RunAllPending();
+ SyncWithAudioInputDeviceManagerThread();
// Calls Start()/Stop()/Close() for the default device twice.
manager_->Start(first_session_id, first_event_handler.get());
@@ -434,7 +463,7 @@ TEST_F(AudioInputDeviceManagerTest, StartDeviceTwice) {
Closed(content::MEDIA_STREAM_DEVICE_TYPE_AUDIO_CAPTURE,
second_session_id))
.Times(1);
- message_loop_->RunAllPending();
+ SyncWithAudioInputDeviceManagerThread();
}
// Starts an invalid session.
@@ -456,7 +485,7 @@ TEST_F(AudioInputDeviceManagerTest, StartInvalidSession) {
Opened(content::MEDIA_STREAM_DEVICE_TYPE_AUDIO_CAPTURE,
session_id))
.Times(1);
- message_loop_->RunAllPending();
+ SyncWithAudioInputDeviceManagerThread();
// Starts a non-opened device.
// This should fail and trigger error code 'kDeviceNotAvailable'.
@@ -473,7 +502,7 @@ TEST_F(AudioInputDeviceManagerTest, StartInvalidSession) {
Closed(content::MEDIA_STREAM_DEVICE_TYPE_AUDIO_CAPTURE,
session_id))
.Times(1);
- message_loop_->RunAllPending();
+ SyncWithAudioInputDeviceManagerThread();
}
// Starts a session twice, the first time should succeed, while the second
@@ -496,7 +525,7 @@ TEST_F(AudioInputDeviceManagerTest, StartSessionTwice) {
Opened(content::MEDIA_STREAM_DEVICE_TYPE_AUDIO_CAPTURE,
session_id))
.Times(1);
- message_loop_->RunAllPending();
+ SyncWithAudioInputDeviceManagerThread();
// Starts the session, it should succeed.
manager_->Start(session_id, audio_input_event_handler.get());
@@ -519,7 +548,7 @@ TEST_F(AudioInputDeviceManagerTest, StartSessionTwice) {
Closed(content::MEDIA_STREAM_DEVICE_TYPE_AUDIO_CAPTURE,
session_id))
.Times(1);
- message_loop_->RunAllPending();
+ SyncWithAudioInputDeviceManagerThread();
}
} // namespace media_stream

Powered by Google App Engine
This is Rietveld 408576698