Chromium Code Reviews| 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 a0cdfdb4dafea0c650105473b642152f361f5a8e..46703d4b19b378b81580fc2c43818fe73ec3bebd 100644 | 
| --- a/content/browser/renderer_host/media/audio_renderer_host_unittest.cc | 
| +++ b/content/browser/renderer_host/media/audio_renderer_host_unittest.cc | 
| @@ -13,6 +13,7 @@ | 
| #include "base/macros.h" | 
| #include "base/run_loop.h" | 
| #include "base/sync_socket.h" | 
| +#include "content/browser/media/audio_output_impl.h" | 
| #include "content/browser/media/capture/audio_mirroring_manager.h" | 
| #include "content/browser/media/media_internals.h" | 
| #include "content/browser/renderer_host/media/audio_input_device_manager.h" | 
| @@ -24,6 +25,8 @@ | 
| #include "media/audio/audio_manager.h" | 
| #include "media/base/bind_to_current_loop.h" | 
| #include "media/base/media_switches.h" | 
| +#include "media/mojo/common/media_type_converters.h" | 
| +#include "mojo/edk/embedder/embedder.h" | 
| #include "testing/gmock/include/gmock/gmock.h" | 
| #include "testing/gtest/include/gtest/gtest.h" | 
| @@ -75,6 +78,13 @@ class MockAudioRendererHost : public AudioRendererHost { | 
| salt_callback), | 
| shared_memory_length_(0) {} | 
| + AudioOutputImpl* Init(scoped_refptr<MockAudioRendererHost> host) { | 
| + media::interfaces::AudioOutputPtr* stream = | 
| + new media::interfaces::AudioOutputPtr(); | 
| + audio_output_impl_ = (new AudioOutputImpl(0, mojo::GetProxy(stream))); | 
| + return audio_output_impl_; | 
| + } | 
| + | 
| // A list of mock methods. | 
| MOCK_METHOD4(OnDeviceAuthorized, | 
| void(int stream_id, | 
| @@ -86,6 +96,26 @@ class MockAudioRendererHost : public AudioRendererHost { | 
| MOCK_METHOD1(OnStreamPaused, void(int stream_id)); | 
| MOCK_METHOD1(OnStreamError, void(int stream_id)); | 
| + void OnNotifyStreamCreated( | 
| 
 
Henrik Grunell
2016/05/02 12:12:23
As we talked about offline, this function should e
 
rchtara
2016/05/23 16:38:17
Done.
 
 | 
| + int stream_id, | 
| + base::SharedMemoryHandle handle, | 
| + base::SyncSocket::TransitDescriptor socket_descriptor, | 
| + uint32_t length) { | 
| + // Maps the shared memory. | 
| + shared_memory_.reset(new base::SharedMemory(handle, false)); | 
| 
 
Henrik Grunell
2016/05/02 12:12:23
As we talked about offline, storing in member vari
 
rchtara
2016/05/23 16:38:17
Done.
 
 | 
| + CHECK(shared_memory_->Map(length)); | 
| + CHECK(shared_memory_->memory()); | 
| + shared_memory_length_ = length; | 
| + | 
| + // Create the SyncSocket using the handle. | 
| + base::SyncSocket::Handle sync_socket_handle = | 
| + base::SyncSocket::UnwrapHandle(socket_descriptor); | 
| + sync_socket_.reset(new base::SyncSocket(sync_socket_handle)); | 
| + | 
| + // And then delegate the call to the mock method. | 
| + OnStreamCreated(stream_id, length); | 
| + } | 
| + | 
| private: | 
| virtual ~MockAudioRendererHost() { | 
| // Make sure all audio streams have been deleted. | 
| @@ -104,8 +134,6 @@ class MockAudioRendererHost : public AudioRendererHost { | 
| IPC_BEGIN_MESSAGE_MAP(MockAudioRendererHost, *message) | 
| IPC_MESSAGE_HANDLER(AudioMsg_NotifyDeviceAuthorized, | 
| OnNotifyDeviceAuthorized) | 
| - IPC_MESSAGE_HANDLER(AudioMsg_NotifyStreamCreated, | 
| - OnNotifyStreamCreated) | 
| IPC_MESSAGE_HANDLER(AudioMsg_NotifyStreamStateChanged, | 
| OnNotifyStreamStateChanged) | 
| IPC_MESSAGE_UNHANDLED(handled = false) | 
| @@ -124,26 +152,6 @@ class MockAudioRendererHost : public AudioRendererHost { | 
| matched_device_id); | 
| } | 
| - void OnNotifyStreamCreated( | 
| - int stream_id, | 
| - base::SharedMemoryHandle handle, | 
| - base::SyncSocket::TransitDescriptor socket_descriptor, | 
| - uint32_t length) { | 
| - // Maps the shared memory. | 
| - shared_memory_.reset(new base::SharedMemory(handle, false)); | 
| - CHECK(shared_memory_->Map(length)); | 
| - CHECK(shared_memory_->memory()); | 
| - shared_memory_length_ = length; | 
| - | 
| - // Create the SyncSocket using the handle. | 
| - base::SyncSocket::Handle sync_socket_handle = | 
| - base::SyncSocket::UnwrapHandle(socket_descriptor); | 
| - sync_socket_.reset(new base::SyncSocket(sync_socket_handle)); | 
| - | 
| - // And then delegate the call to the mock method. | 
| - OnStreamCreated(stream_id, length); | 
| - } | 
| - | 
| void OnNotifyStreamStateChanged(int stream_id, | 
| media::AudioOutputIPCDelegateState state) { | 
| switch (state) { | 
| @@ -206,6 +214,8 @@ class AudioRendererHostTest : public testing::Test { | 
| media_stream_manager_.get(), | 
| GetMockSaltCallback()); | 
| + audio_output_impl_.reset(host_->Init(host_.get())); | 
| + | 
| // Simulate IPC channel connected. | 
| host_->set_peer_process_for_testing(base::Process::Current()); | 
| } | 
| @@ -261,7 +271,9 @@ class AudioRendererHostTest : public testing::Test { | 
| host_->OnRequestDeviceAuthorization(kStreamId, kRenderFrameId, session_id, | 
| device_id, security_origin); | 
| if (expected_device_status == media::OUTPUT_DEVICE_STATUS_OK) { | 
| - host_->OnCreateStream(kStreamId, kRenderFrameId, params); | 
| + host_->CreateStream(kStreamId, kRenderFrameId, params, | 
| + base::Bind(&AudioRendererHostTest::CreateCallback, | 
| + base::Unretained(this))); | 
| // At some point in the future, a corresponding RemoveDiverter() call must | 
| // be made. | 
| @@ -271,6 +283,46 @@ class AudioRendererHostTest : public testing::Test { | 
| SyncWithAudioThread(); | 
| } | 
| + void CreateCallback(int stream_id, | 
| + media::interfaces::AudioOutputStreamPtr stream, | 
| + mojo::ScopedSharedBufferHandle shared_buffer, | 
| + mojo::ScopedHandle socket_descriptor) { | 
| + base::SharedMemoryHandle shared_memory_handle; | 
| + size_t length; | 
| + MojoResult pass_shared_memory_result = mojo::edk::PassSharedMemoryHandle( | 
| + shared_buffer.release().value(), &shared_memory_handle, &length, | 
| + nullptr); | 
| + | 
| + if (pass_shared_memory_result != MOJO_RESULT_OK) { | 
| + LOG(ERROR) << "Failed to pass shared memory. Closing: " | 
| + << pass_shared_memory_result; | 
| + return; | 
| + } | 
| + mojo::edk::ScopedPlatformHandle platform_handle; | 
| + | 
| + MojoResult pass_platform_handle_result = | 
| + mojo::edk::PassWrappedPlatformHandle( | 
| + socket_descriptor.release().value(), &platform_handle); | 
| + | 
| + if (pass_platform_handle_result != MOJO_RESULT_OK) { | 
| + LOG(ERROR) << "Failed to pass transit descriptor. Closing: " | 
| + << pass_platform_handle_result; | 
| + return; | 
| + } | 
| + | 
| + base::SyncSocket::TransitDescriptor descriptor; | 
| +#if defined(OS_WIN) | 
| + descriptor = platform_handle.release().handle; | 
| +#else | 
| + descriptor.fd = platform_handle.release().handle; | 
| +#endif | 
| + | 
| + host_->OnNotifyStreamCreated(stream_id, shared_memory_handle, descriptor, | 
| + length); | 
| + streams_[stream_id] = make_scoped_ptr( | 
| 
 
Henrik Grunell
2016/05/02 12:12:23
This isn't used anywhere. We talked about this off
 
rchtara
2016/05/23 16:38:17
it's not needed anymore.
 
 | 
| + new media::interfaces::AudioOutputStreamPtr(std::move(stream))); | 
| + } | 
| + | 
| void Close() { | 
| // Send a message to AudioRendererHost to tell it we want to close the | 
| // stream. | 
| @@ -324,6 +376,9 @@ class AudioRendererHostTest : public testing::Test { | 
| } | 
| private: | 
| + typedef std::map<int, | 
| + std::unique_ptr<media::interfaces::AudioOutputStreamPtr>> | 
| + ScopedAudioOutputStreamPtrMap; | 
| // MediaStreamManager uses a DestructionObserver, so it must outlive the | 
| // TestBrowserThreadBundle. | 
| std::unique_ptr<MediaStreamManager> media_stream_manager_; | 
| @@ -331,6 +386,8 @@ class AudioRendererHostTest : public testing::Test { | 
| std::unique_ptr<media::AudioManager> audio_manager_; | 
| MockAudioMirroringManager mirroring_manager_; | 
| scoped_refptr<MockAudioRendererHost> host_; | 
| + std::unique_ptr<AudioOutputImpl> audio_output_impl_; | 
| + ScopedAudioOutputStreamPtrMap streams_; | 
| DISALLOW_COPY_AND_ASSIGN(AudioRendererHostTest); | 
| }; |