Index: content/browser/renderer_host/media/audio_renderer_host_unittest.cc |
diff --git a/content/browser/renderer_host/media/audio_renderer_host_unittest.cc b/content/browser/renderer_host/media/audio_renderer_host_unittest.cc |
index bd4913b2931a7f4d9a3f1399a10cb35d39268bfd..784798198b499f263557bb7af6a43e78458daf56 100644 |
--- a/content/browser/renderer_host/media/audio_renderer_host_unittest.cc |
+++ b/content/browser/renderer_host/media/audio_renderer_host_unittest.cc |
@@ -9,12 +9,16 @@ |
#include "base/process_util.h" |
#include "base/sync_socket.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_mirroring_manager.h" |
#include "content/browser/renderer_host/media/audio_renderer_host.h" |
+#include "content/browser/renderer_host/media/media_stream_manager.h" |
#include "content/browser/renderer_host/media/mock_media_observer.h" |
#include "content/common/media/audio_messages.h" |
+#include "content/common/media/media_stream_options.h" |
#include "ipc/ipc_message_utils.h" |
#include "media/audio/audio_manager.h" |
+#include "media/audio/audio_manager_base.h" |
#include "media/audio/fake_audio_output_stream.h" |
#include "net/url_request/url_request_context.h" |
#include "testing/gmock/include/gmock/gmock.h" |
@@ -56,11 +60,13 @@ class MockAudioRendererHost : public AudioRendererHost { |
explicit MockAudioRendererHost( |
media::AudioManager* audio_manager, |
AudioMirroringManager* mirroring_manager, |
- MediaInternals* media_internals) |
+ MediaInternals* media_internals, |
+ MediaStreamManager* media_stream_manager) |
: AudioRendererHost(kRenderProcessId, |
audio_manager, |
mirroring_manager, |
- media_internals), |
+ media_internals, |
+ media_stream_manager), |
shared_memory_length_(0) { |
} |
@@ -170,9 +176,12 @@ class AudioRendererHostTest : public testing::Test { |
ui_thread_.reset(new BrowserThreadImpl(BrowserThread::UI, |
message_loop_.get())); |
audio_manager_.reset(media::AudioManager::Create()); |
+ media_stream_manager_.reset(new MediaStreamManager(audio_manager_.get())); |
+ media_stream_manager_->UseFakeDevice(); |
observer_.reset(new MockMediaInternals()); |
host_ = new MockAudioRendererHost( |
- audio_manager_.get(), &mirroring_manager_, observer_.get()); |
+ audio_manager_.get(), &mirroring_manager_, observer_.get(), |
+ media_stream_manager_.get()); |
// Simulate IPC channel connected. |
host_->OnChannelConnected(base::GetCurrentProcId()); |
@@ -188,11 +197,14 @@ class AudioRendererHostTest : public testing::Test { |
// We need to continue running message_loop_ to complete all destructions. |
SyncWithAudioThread(); |
- |
audio_manager_.reset(); |
io_thread_.reset(); |
ui_thread_.reset(); |
+ |
+ // Delete the IO message loop. This will cause the MediaStreamManager to be |
+ // notified so it will stop its device thread and device managers. |
+ message_loop_.reset(); |
} |
void Create() { |
@@ -208,9 +220,47 @@ class AudioRendererHostTest : public testing::Test { |
// we receive the created message. |
host_->OnCreateStream(kStreamId, |
kRenderViewId, |
+ 0, |
+ media::AudioParameters( |
+ media::AudioParameters::AUDIO_FAKE, |
+ media::CHANNEL_LAYOUT_STEREO, |
+ media::AudioParameters::kAudioCDSampleRate, 16, |
+ media::AudioParameters::kAudioCDSampleRate / 10)); |
+ message_loop_->Run(); |
+ |
+ // At some point in the future, a corresponding RemoveDiverter() call must |
+ // be made. |
+ EXPECT_CALL(mirroring_manager_, |
+ RemoveDiverter(kRenderProcessId, kRenderViewId, NotNull())) |
+ .RetiresOnSaturation(); |
+ |
+ // All created streams should ultimately be closed. |
+ EXPECT_CALL(*observer_, |
+ OnSetAudioStreamStatus(_, kStreamId, "closed")); |
+ |
+ // Expect the audio stream will be deleted at some later point. |
+ EXPECT_CALL(*observer_, OnDeleteAudioStream(_, kStreamId)); |
+ } |
+ |
+ void CreateUnifiedStream() { |
+ EXPECT_CALL(*observer_, |
+ OnSetAudioStreamStatus(_, kStreamId, "created")); |
+ EXPECT_CALL(*host_, OnStreamCreated(kStreamId, _)) |
+ .WillOnce(QuitMessageLoop(message_loop_.get())); |
+ EXPECT_CALL(mirroring_manager_, |
+ AddDiverter(kRenderProcessId, kRenderViewId, NotNull())) |
+ .RetiresOnSaturation(); |
+ // Send a create stream message to the audio output stream and wait until |
+ // we receive the created message. |
+ // Use AudioInputDeviceManager::kFakeOpenSessionId as the session id to |
+ // pass the permission check. |
+ host_->OnCreateStream(kStreamId, |
+ kRenderViewId, |
+ AudioInputDeviceManager::kFakeOpenSessionId, |
media::AudioParameters( |
media::AudioParameters::AUDIO_FAKE, |
media::CHANNEL_LAYOUT_STEREO, |
+ 2, |
media::AudioParameters::kAudioCDSampleRate, 16, |
media::AudioParameters::kAudioCDSampleRate / 10)); |
message_loop_->Run(); |
@@ -315,6 +365,7 @@ class AudioRendererHostTest : public testing::Test { |
scoped_ptr<BrowserThreadImpl> io_thread_; |
scoped_ptr<BrowserThreadImpl> ui_thread_; |
scoped_ptr<media::AudioManager> audio_manager_; |
+ scoped_ptr<MediaStreamManager> media_stream_manager_; |
DISALLOW_COPY_AND_ASSIGN(AudioRendererHostTest); |
}; |
@@ -379,6 +430,11 @@ TEST_F(AudioRendererHostTest, SimulateErrorAndClose) { |
Close(); |
} |
+TEST_F(AudioRendererHostTest, CreateUnifiedStreamAndClose) { |
+ CreateUnifiedStream(); |
+ Close(); |
+} |
+ |
// TODO(hclam): Add tests for data conversation in low latency mode. |
} // namespace content |