| 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 467e2be3645b9d8010a85a3cb2654f10efc9873c..feb8cac0a72e209aa172dc5f28a29371ad05e7ce 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,9 +25,10 @@
|
| #include "media/audio/audio_manager.h"
|
| #include "media/base/bind_to_current_loop.h"
|
| #include "media/base/media_switches.h"
|
| +#include "mojo/edk/embedder/embedder.h"
|
| #include "testing/gmock/include/gmock/gmock.h"
|
| #include "testing/gtest/include/gtest/gtest.h"
|
| -
|
| +/*
|
| using ::testing::_;
|
| using ::testing::Assign;
|
| using ::testing::DoAll;
|
| @@ -73,7 +75,17 @@ class MockAudioRendererHost : public AudioRendererHost {
|
| media_internals,
|
| media_stream_manager,
|
| salt_callback),
|
| - shared_memory_length_(0) {}
|
| + shared_memory_length_(0) {
|
| + LOG(ERROR) << "rm MockAudioRendererHost";
|
| + }
|
| +
|
| + AudioOutputImpl* Init(scoped_refptr<MockAudioRendererHost> host) {
|
| + media::mojom::AudioOutputPtr* stream = new media::mojom::AudioOutputPtr();
|
| + set_audio_output_impl(
|
| + kRenderFrameId,
|
| + new AudioOutputImpl(0, kRenderFrameId, mojo::GetProxy(stream)));
|
| + return get_audio_output_impl(kRenderFrameId);
|
| + }
|
|
|
| // A list of mock methods.
|
| MOCK_METHOD4(OnDeviceAuthorized,
|
| @@ -88,6 +100,7 @@ class MockAudioRendererHost : public AudioRendererHost {
|
|
|
| private:
|
| virtual ~MockAudioRendererHost() {
|
| + LOG(ERROR) << "rrm MockAudioRendererHost";
|
| // Make sure all audio streams have been deleted.
|
| EXPECT_TRUE(audio_entries_.empty());
|
| }
|
| @@ -104,8 +117,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 +135,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) {
|
| @@ -207,6 +198,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());
|
| }
|
| @@ -237,9 +230,6 @@ class AudioRendererHostTest : public testing::Test {
|
| ? media::OUTPUT_DEVICE_STATUS_ERROR_NOT_AUTHORIZED
|
| : media::OUTPUT_DEVICE_STATUS_ERROR_NOT_FOUND;
|
|
|
| - EXPECT_CALL(*host_.get(),
|
| - OnDeviceAuthorized(kStreamId, expected_device_status, _, _));
|
| -
|
| if (expected_device_status == media::OUTPUT_DEVICE_STATUS_OK) {
|
| EXPECT_CALL(*host_.get(), OnStreamCreated(kStreamId, _));
|
| EXPECT_CALL(mirroring_manager_,
|
| @@ -262,7 +252,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.
|
| @@ -272,10 +264,68 @@ class AudioRendererHostTest : public testing::Test {
|
| SyncWithAudioThread();
|
| }
|
|
|
| + void CreateCallback(int stream_id,
|
| + media::mojom::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
|
| +
|
| + // Maps the shared memory.
|
| + base::SharedMemory shared_memory(shared_memory_handle, false);
|
| + CHECK(shared_memory.Map(length));
|
| + CHECK(shared_memory.memory());
|
| +
|
| + // Create the SyncSocket using the handle.
|
| + base::SyncSocket::Handle sync_socket_handle =
|
| + base::SyncSocket::UnwrapHandle(descriptor);
|
| + base::SyncSocket sync_socket(sync_socket_handle);
|
| +
|
| + // And then delegate the call to the mock method.
|
| + host_->OnStreamCreated(stream_id, length);
|
| + // |stream| will be released when its corresponding AudioOutputStreamImpl
|
| + // will be destructed in |audio_output_impl_| destructor.
|
| + // |stream| needs to be moved to somewhere else, otherwise it will be reset
|
| + // twice: once when it goes out of scope in this function and once in
|
| + // |audio_output_impl_| destructor in AudioOutputImpl which will cause an
|
| + // error.
|
| + streams_.insert(std::make_pair(
|
| + stream_id,
|
| + std::unique_ptr<media::mojom::AudioOutputStreamPtr>(
|
| + new media::mojom::AudioOutputStreamPtr(std::move(stream)))));
|
| + }
|
| +
|
| void Close() {
|
| // Send a message to AudioRendererHost to tell it we want to close the
|
| // stream.
|
| - host_->OnCloseStream(kStreamId);
|
| + host_->CloseStream(kStreamId);
|
| SyncWithAudioThread();
|
| }
|
|
|
| @@ -325,6 +375,8 @@ class AudioRendererHostTest : public testing::Test {
|
| }
|
|
|
| private:
|
| + typedef std::map<int, std::unique_ptr<media::mojom::AudioOutputStreamPtr>>
|
| + ScopedAudioOutputStreamPtrMap;
|
| // MediaStreamManager uses a DestructionObserver, so it must outlive the
|
| // TestBrowserThreadBundle.
|
| std::unique_ptr<MediaStreamManager> media_stream_manager_;
|
| @@ -332,6 +384,8 @@ class AudioRendererHostTest : public testing::Test {
|
| media::ScopedAudioManagerPtr audio_manager_;
|
| MockAudioMirroringManager mirroring_manager_;
|
| scoped_refptr<MockAudioRendererHost> host_;
|
| + std::unique_ptr<AudioOutputImpl> audio_output_impl_;
|
| + ScopedAudioOutputStreamPtrMap streams_;
|
|
|
| DISALLOW_COPY_AND_ASSIGN(AudioRendererHostTest);
|
| };
|
| @@ -414,3 +468,4 @@ TEST_F(AudioRendererHostTest, CreateInvalidDevice) {
|
| // TODO(hclam): Add tests for data conversation in low latency mode.
|
|
|
| } // namespace content
|
| +*/
|
|
|