| 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 e8bd79c9d28e3aa48135e9bf43b3bbae6c56e962..d94fb13c06665377a05f1c45b34e21c36a695073 100644
|
| --- a/content/browser/renderer_host/media/audio_renderer_host_unittest.cc
|
| +++ b/content/browser/renderer_host/media/audio_renderer_host_unittest.cc
|
| @@ -9,6 +9,7 @@
|
| #include "base/process_util.h"
|
| #include "base/sync_socket.h"
|
| #include "content/browser/browser_thread_impl.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/mock_media_observer.h"
|
| #include "content/common/media/audio_messages.h"
|
| @@ -23,28 +24,41 @@ using ::testing::_;
|
| using ::testing::AtLeast;
|
| using ::testing::DoAll;
|
| using ::testing::InSequence;
|
| -using ::testing::InvokeWithoutArgs;
|
| +using ::testing::NotNull;
|
| using ::testing::Return;
|
| using ::testing::SaveArg;
|
| using ::testing::SetArgumentPointee;
|
|
|
| namespace content {
|
|
|
| +static const int kRenderProcessId = 1;
|
| +static const int kRenderViewId = 4;
|
| static const int kStreamId = 50;
|
|
|
| -static bool IsRunningHeadless() {
|
| - scoped_ptr<base::Environment> env(base::Environment::Create());
|
| - if (env->HasVar("CHROME_HEADLESS"))
|
| - return true;
|
| - return false;
|
| -}
|
| +class MockAudioMirroringManager : public AudioMirroringManager {
|
| + public:
|
| + MockAudioMirroringManager() {}
|
| + virtual ~MockAudioMirroringManager() {}
|
| +
|
| + MOCK_METHOD3(AddDiverter,
|
| + void(int render_process_id, int render_view_id,
|
| + Diverter* diverter));
|
| + MOCK_METHOD3(RemoveDiverter,
|
| + void(int render_process_id, int render_view_id,
|
| + Diverter* diverter));
|
| +
|
| + private:
|
| + DISALLOW_COPY_AND_ASSIGN(MockAudioMirroringManager);
|
| +};
|
|
|
| class MockAudioRendererHost : public AudioRendererHost {
|
| public:
|
| explicit MockAudioRendererHost(
|
| media::AudioManager* audio_manager,
|
| + AudioMirroringManager* mirroring_manager,
|
| MediaObserver* media_observer)
|
| - : AudioRendererHost(audio_manager, media_observer),
|
| + : AudioRendererHost(
|
| + kRenderProcessId, audio_manager, mirroring_manager, media_observer),
|
| shared_memory_length_(0) {
|
| }
|
|
|
| @@ -142,9 +156,7 @@ ACTION_P(QuitMessageLoop, message_loop) {
|
|
|
| class AudioRendererHostTest : public testing::Test {
|
| public:
|
| - AudioRendererHostTest()
|
| - : mock_stream_(true) {
|
| - }
|
| + AudioRendererHostTest() {}
|
|
|
| protected:
|
| virtual void SetUp() {
|
| @@ -158,10 +170,8 @@ class AudioRendererHostTest : public testing::Test {
|
| message_loop_.get()));
|
| audio_manager_.reset(media::AudioManager::Create());
|
| observer_.reset(new MockMediaObserver());
|
| - host_ = new MockAudioRendererHost(audio_manager_.get(), observer_.get());
|
| -
|
| - // Expect the audio stream will be deleted.
|
| - EXPECT_CALL(*observer_, OnDeleteAudioStream(_, kStreamId));
|
| + host_ = new MockAudioRendererHost(
|
| + audio_manager_.get(), &mirroring_manager_, observer_.get());
|
|
|
| // Simulate IPC channel connected.
|
| host_->OnChannelConnected(base::GetCurrentProcId());
|
| @@ -193,21 +203,34 @@ class AudioRendererHostTest : public testing::Test {
|
| EXPECT_CALL(*host_, OnStreamCreated(kStreamId, _))
|
| .WillOnce(QuitMessageLoop(message_loop_.get()));
|
|
|
| - media::AudioParameters::Format format;
|
| - if (mock_stream_)
|
| - format = media::AudioParameters::AUDIO_FAKE;
|
| - else
|
| - format = media::AudioParameters::AUDIO_PCM_LINEAR;
|
| -
|
| - media::AudioParameters params(
|
| - format, media::CHANNEL_LAYOUT_STEREO,
|
| - media::AudioParameters::kAudioCDSampleRate, 16,
|
| - media::AudioParameters::kAudioCDSampleRate / 10);
|
| -
|
| // Send a create stream message to the audio output stream and wait until
|
| // we receive the created message.
|
| - host_->OnCreateStream(kStreamId, params, 0);
|
| + host_->OnCreateStream(kStreamId,
|
| + media::AudioParameters(
|
| + media::AudioParameters::AUDIO_FAKE,
|
| + media::CHANNEL_LAYOUT_STEREO,
|
| + media::AudioParameters::kAudioCDSampleRate, 16,
|
| + media::AudioParameters::kAudioCDSampleRate / 10),
|
| + 0);
|
| message_loop_->Run();
|
| +
|
| + // Simulate the renderer process associating a stream with a render view.
|
| + EXPECT_CALL(mirroring_manager_,
|
| + RemoveDiverter(kRenderProcessId, MSG_ROUTING_NONE, _))
|
| + .RetiresOnSaturation();
|
| + EXPECT_CALL(mirroring_manager_,
|
| + AddDiverter(kRenderProcessId, kRenderViewId, NotNull()))
|
| + .RetiresOnSaturation();
|
| + host_->OnAssociateStreamWithProducer(kStreamId, kRenderViewId);
|
| + message_loop_->RunUntilIdle();
|
| + // At some point in the future, a corresponding RemoveDiverter() call must
|
| + // be made.
|
| + EXPECT_CALL(mirroring_manager_,
|
| + RemoveDiverter(kRenderProcessId, kRenderViewId, NotNull()))
|
| + .RetiresOnSaturation();
|
| +
|
| + // Expect the audio stream will be deleted at some later point.
|
| + EXPECT_CALL(*observer_, OnDeleteAudioStream(_, kStreamId));
|
| }
|
|
|
| void Close() {
|
| @@ -295,11 +318,9 @@ class AudioRendererHostTest : public testing::Test {
|
| message_loop_->Run();
|
| }
|
|
|
| - void EnableRealDevice() { mock_stream_ = false; }
|
| -
|
| private:
|
| - bool mock_stream_;
|
| scoped_ptr<MockMediaObserver> observer_;
|
| + MockAudioMirroringManager mirroring_manager_;
|
| scoped_refptr<MockAudioRendererHost> host_;
|
| scoped_ptr<MessageLoop> message_loop_;
|
| scoped_ptr<BrowserThreadImpl> io_thread_;
|
| @@ -310,34 +331,22 @@ class AudioRendererHostTest : public testing::Test {
|
| };
|
|
|
| TEST_F(AudioRendererHostTest, CreateAndClose) {
|
| - if (!IsRunningHeadless())
|
| - EnableRealDevice();
|
| -
|
| Create();
|
| Close();
|
| }
|
|
|
| // Simulate the case where a stream is not properly closed.
|
| TEST_F(AudioRendererHostTest, CreateAndShutdown) {
|
| - if (!IsRunningHeadless())
|
| - EnableRealDevice();
|
| -
|
| Create();
|
| }
|
|
|
| TEST_F(AudioRendererHostTest, CreatePlayAndClose) {
|
| - if (!IsRunningHeadless())
|
| - EnableRealDevice();
|
| -
|
| Create();
|
| Play();
|
| Close();
|
| }
|
|
|
| TEST_F(AudioRendererHostTest, CreatePlayPauseAndClose) {
|
| - if (!IsRunningHeadless())
|
| - EnableRealDevice();
|
| -
|
| Create();
|
| Play();
|
| Pause();
|
| @@ -345,9 +354,6 @@ TEST_F(AudioRendererHostTest, CreatePlayPauseAndClose) {
|
| }
|
|
|
| TEST_F(AudioRendererHostTest, SetVolume) {
|
| - if (!IsRunningHeadless())
|
| - EnableRealDevice();
|
| -
|
| Create();
|
| SetVolume(0.5);
|
| Play();
|
| @@ -357,27 +363,18 @@ TEST_F(AudioRendererHostTest, SetVolume) {
|
|
|
| // Simulate the case where a stream is not properly closed.
|
| TEST_F(AudioRendererHostTest, CreatePlayAndShutdown) {
|
| - if (!IsRunningHeadless())
|
| - EnableRealDevice();
|
| -
|
| Create();
|
| Play();
|
| }
|
|
|
| // Simulate the case where a stream is not properly closed.
|
| TEST_F(AudioRendererHostTest, CreatePlayPauseAndShutdown) {
|
| - if (!IsRunningHeadless())
|
| - EnableRealDevice();
|
| -
|
| Create();
|
| Play();
|
| Pause();
|
| }
|
|
|
| TEST_F(AudioRendererHostTest, SimulateError) {
|
| - if (!IsRunningHeadless())
|
| - EnableRealDevice();
|
| -
|
| Create();
|
| Play();
|
| SimulateError();
|
| @@ -387,9 +384,6 @@ TEST_F(AudioRendererHostTest, SimulateError) {
|
| // the audio device is closed but the render process try to close the
|
| // audio stream again.
|
| TEST_F(AudioRendererHostTest, SimulateErrorAndClose) {
|
| - if (!IsRunningHeadless())
|
| - EnableRealDevice();
|
| -
|
| Create();
|
| Play();
|
| SimulateError();
|
|
|