summaryrefslogtreecommitdiffstats
path: root/content/renderer/media/webrtc_audio_renderer_unittest.cc
diff options
context:
space:
mode:
authorxians@chromium.org <xians@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2014-03-17 06:47:08 +0000
committerxians@chromium.org <xians@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2014-03-17 06:47:08 +0000
commitf80e22f7fd8692fac935e3ea4f832c7a5f48d4fb (patch)
tree126a84ff57ac2ce98a60365c3b12bc9fe23645bd /content/renderer/media/webrtc_audio_renderer_unittest.cc
parent110f842793df57859ee2109d9f4042e23a5a68d5 (diff)
downloadchromium_src-f80e22f7fd8692fac935e3ea4f832c7a5f48d4fb.zip
chromium_src-f80e22f7fd8692fac935e3ea4f832c7a5f48d4fb.tar.gz
chromium_src-f80e22f7fd8692fac935e3ea4f832c7a5f48d4fb.tar.bz2
Added unittest to WebRtcAudioRenderer. This is to protect the use cases that WebRtcAudioRenderer will be shared by multiple audio tags.
NOTRY=true BUG=351895,264611,351270 Review URL: https://codereview.chromium.org/199063002 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@257388 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'content/renderer/media/webrtc_audio_renderer_unittest.cc')
-rw-r--r--content/renderer/media/webrtc_audio_renderer_unittest.cc153
1 files changed, 153 insertions, 0 deletions
diff --git a/content/renderer/media/webrtc_audio_renderer_unittest.cc b/content/renderer/media/webrtc_audio_renderer_unittest.cc
new file mode 100644
index 0000000..34d0c75
--- /dev/null
+++ b/content/renderer/media/webrtc_audio_renderer_unittest.cc
@@ -0,0 +1,153 @@
+// Copyright 2014 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include <vector>
+
+#include "content/renderer/media/audio_device_factory.h"
+#include "content/renderer/media/audio_message_filter.h"
+#include "content/renderer/media/media_stream_audio_renderer.h"
+#include "content/renderer/media/mock_media_stream_dependency_factory.h"
+#include "content/renderer/media/webrtc_audio_device_impl.h"
+#include "content/renderer/media/webrtc_audio_renderer.h"
+#include "media/audio/audio_output_device.h"
+#include "media/audio/audio_output_ipc.h"
+#include "media/base/audio_bus.h"
+#include "media/base/mock_audio_renderer_sink.h"
+#include "testing/gmock/include/gmock/gmock.h"
+#include "testing/gtest/include/gtest/gtest.h"
+#include "third_party/libjingle/source/talk/app/webrtc/mediastreaminterface.h"
+
+using testing::Return;
+
+namespace content {
+
+namespace {
+
+class MockAudioOutputIPC : public media::AudioOutputIPC {
+ public:
+ MockAudioOutputIPC() {}
+ virtual ~MockAudioOutputIPC() {}
+
+ MOCK_METHOD3(CreateStream, void(media::AudioOutputIPCDelegate* delegate,
+ const media::AudioParameters& params,
+ int session_id));
+ MOCK_METHOD0(PlayStream, void());
+ MOCK_METHOD0(PauseStream, void());
+ MOCK_METHOD0(CloseStream, void());
+ MOCK_METHOD1(SetVolume, void(double volume));
+};
+
+class FakeAudioOutputDevice
+ : NON_EXPORTED_BASE(public media::AudioOutputDevice) {
+ public:
+ FakeAudioOutputDevice(
+ scoped_ptr<media::AudioOutputIPC> ipc,
+ const scoped_refptr<base::SingleThreadTaskRunner>& io_task_runner)
+ : AudioOutputDevice(ipc.Pass(),
+ io_task_runner) {}
+ MOCK_METHOD0(Start, void());
+ MOCK_METHOD0(Stop, void());
+ MOCK_METHOD0(Pause, void());
+ MOCK_METHOD0(Play, void());
+ MOCK_METHOD1(SetVolume, bool(double volume));
+
+ protected:
+ virtual ~FakeAudioOutputDevice() {}
+};
+
+class MockAudioDeviceFactory : public AudioDeviceFactory {
+ public:
+ MockAudioDeviceFactory() {}
+ virtual ~MockAudioDeviceFactory() {}
+ MOCK_METHOD1(CreateOutputDevice, media::AudioOutputDevice*(int));
+ MOCK_METHOD1(CreateInputDevice, media::AudioInputDevice*(int));
+};
+
+class MockAudioRendererSource : public WebRtcAudioRendererSource {
+ public:
+ MockAudioRendererSource() {}
+ virtual ~MockAudioRendererSource() {}
+ MOCK_METHOD3(RenderData, void(media::AudioBus* audio_bus,
+ int sample_rate,
+ int audio_delay_milliseconds));
+ MOCK_METHOD1(RemoveAudioRenderer, void(WebRtcAudioRenderer* renderer));
+};
+
+} // namespace
+
+class WebRtcAudioRendererTest : public testing::Test {
+ protected:
+ WebRtcAudioRendererTest()
+ : message_loop_(new base::MessageLoopForIO),
+ mock_ipc_(new MockAudioOutputIPC()),
+ mock_output_device_(new FakeAudioOutputDevice(
+ scoped_ptr<media::AudioOutputIPC>(mock_ipc_),
+ message_loop_->message_loop_proxy())),
+ factory_(new MockAudioDeviceFactory()),
+ source_(new MockAudioRendererSource()),
+ stream_(new talk_base::RefCountedObject<MockMediaStream>("label")),
+ renderer_(new WebRtcAudioRenderer(stream_, 1, 1, 1, 44100, 441)) {
+ EXPECT_CALL(*factory_.get(), CreateOutputDevice(1))
+ .WillOnce(Return(mock_output_device_));
+ EXPECT_CALL(*mock_output_device_, Start());
+ EXPECT_TRUE(renderer_->Initialize(source_.get()));
+ renderer_proxy_ = renderer_->CreateSharedAudioRendererProxy(stream_);
+ }
+
+ // Used to construct |mock_output_device_|.
+ scoped_ptr<base::MessageLoopForIO> message_loop_;
+ MockAudioOutputIPC* mock_ipc_; // Owned by AudioOuputDevice.
+
+ scoped_refptr<FakeAudioOutputDevice> mock_output_device_;
+ scoped_ptr<MockAudioDeviceFactory> factory_;
+ scoped_ptr<MockAudioRendererSource> source_;
+ scoped_refptr<webrtc::MediaStreamInterface> stream_;
+ scoped_refptr<WebRtcAudioRenderer> renderer_;
+ scoped_refptr<MediaStreamAudioRenderer> renderer_proxy_;
+};
+
+// Verify that the renderer will be stopped if the only proxy is stopped.
+TEST_F(WebRtcAudioRendererTest, StopRenderer) {
+ renderer_proxy_->Start();
+
+ // |renderer_| has only one proxy, stopping the proxy should stop the sink of
+ // |renderer_|.
+ EXPECT_CALL(*mock_output_device_, Stop());
+ EXPECT_CALL(*source_.get(), RemoveAudioRenderer(renderer_.get()));
+ renderer_proxy_->Stop();
+}
+
+// Verify that the renderer will not be stopped unless the last proxy is
+// stopped.
+TEST_F(WebRtcAudioRendererTest, MultipleRenderers) {
+ renderer_proxy_->Start();
+
+ // Create a vector of renderer proxies from the |renderer_|.
+ std::vector<scoped_refptr<MediaStreamAudioRenderer> > renderer_proxies_;
+ static const int kNumberOfRendererProxy = 5;
+ for (int i = 0; i < kNumberOfRendererProxy; ++i) {
+ scoped_refptr<MediaStreamAudioRenderer> renderer_proxy(
+ renderer_->CreateSharedAudioRendererProxy(stream_));
+ renderer_proxy->Start();
+ renderer_proxies_.push_back(renderer_proxy);
+ }
+
+ // Stop the |renderer_proxy_| should not stop the sink since it is used by
+ // other proxies.
+ EXPECT_CALL(*mock_output_device_, Stop()).Times(0);
+ renderer_proxy_->Stop();
+
+ for (int i = 0; i < kNumberOfRendererProxy; ++i) {
+ if (i != kNumberOfRendererProxy -1) {
+ EXPECT_CALL(*mock_output_device_, Stop()).Times(0);
+ } else {
+ // When the last proxy is stopped, the sink will stop.
+ EXPECT_CALL(*source_.get(), RemoveAudioRenderer(renderer_.get()));
+ EXPECT_CALL(*mock_output_device_, Stop());
+ }
+ renderer_proxies_[i]->Stop();
+ }
+}
+
+} // namespace content