| Index: media/filters/audio_renderer_base_unittest.cc
|
| diff --git a/media/filters/audio_renderer_base_unittest.cc b/media/filters/audio_renderer_base_unittest.cc
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..aa0808c2f826b348da6d5c581b26b71984d05817
|
| --- /dev/null
|
| +++ b/media/filters/audio_renderer_base_unittest.cc
|
| @@ -0,0 +1,135 @@
|
| +// Copyright (c) 2009 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 "base/stl_util-inl.h"
|
| +#include "media/base/data_buffer.h"
|
| +#include "media/base/mock_filter_host.h"
|
| +#include "media/base/mock_filters.h"
|
| +#include "media/filters/audio_renderer_base.h"
|
| +#include "testing/gtest/include/gtest/gtest.h"
|
| +
|
| +using ::testing::_;
|
| +using ::testing::InSequence;
|
| +using ::testing::Invoke;
|
| +using ::testing::NotNull;
|
| +using ::testing::Return;
|
| +using ::testing::StrictMock;
|
| +
|
| +namespace media {
|
| +
|
| +// Mocked subclass of AudioRendererBase for testing purposes.
|
| +class MockAudioRendererBase : public AudioRendererBase {
|
| + public:
|
| + MockAudioRendererBase(size_t max_queue_size)
|
| + : AudioRendererBase(max_queue_size) {}
|
| + virtual ~MockAudioRendererBase() {}
|
| +
|
| + // AudioRenderer implementation.
|
| + MOCK_METHOD1(SetVolume, void(float volume));
|
| +
|
| + // AudioRendererBase implementation.
|
| + MOCK_METHOD1(OnInitialize, bool(const MediaFormat& media_format));
|
| + MOCK_METHOD0(OnStop, void());
|
| +
|
| + // Used for verifying check points during tests.
|
| + MOCK_METHOD1(CheckPoint, void(int id));
|
| +
|
| + private:
|
| + DISALLOW_COPY_AND_ASSIGN(MockAudioRendererBase);
|
| +};
|
| +
|
| +class AudioRendererBaseTest : public ::testing::Test {
|
| + public:
|
| + AudioRendererBaseTest()
|
| + : renderer_(new MockAudioRendererBase(kMaxQueueSize)),
|
| + decoder_(new MockAudioDecoder()) {
|
| + renderer_->set_host(&host_);
|
| +
|
| + // Queue all reads from the decoder.
|
| + EXPECT_CALL(*decoder_, Read(NotNull()))
|
| + .WillRepeatedly(Invoke(this, &AudioRendererBaseTest::EnqueueCallback));
|
| + }
|
| +
|
| + virtual ~AudioRendererBaseTest() {
|
| + STLDeleteElements(&read_queue_);
|
| +
|
| + // Expect a call into the subclass.
|
| + EXPECT_CALL(*renderer_, OnStop());
|
| + renderer_->Stop();
|
| + }
|
| +
|
| + protected:
|
| + static const size_t kMaxQueueSize;
|
| +
|
| + // Fixture members.
|
| + scoped_refptr<MockAudioRendererBase> renderer_;
|
| + scoped_refptr<MockAudioDecoder> decoder_;
|
| + StrictMock<MockFilterHost> host_;
|
| + StrictMock<MockFilterCallback> callback_;
|
| +
|
| + // Receives asynchronous read requests sent to |decoder_|.
|
| + std::deque<Callback1<Buffer*>::Type*> read_queue_;
|
| +
|
| + private:
|
| + void EnqueueCallback(Callback1<Buffer*>::Type* callback) {
|
| + read_queue_.push_back(callback);
|
| + }
|
| +
|
| + DISALLOW_COPY_AND_ASSIGN(AudioRendererBaseTest);
|
| +};
|
| +
|
| +const size_t AudioRendererBaseTest::kMaxQueueSize = 16u;
|
| +
|
| +TEST_F(AudioRendererBaseTest, Initialize_Failed) {
|
| + InSequence s;
|
| +
|
| + // Our subclass will fail when asked to initialize.
|
| + EXPECT_CALL(*renderer_, OnInitialize(_))
|
| + .WillOnce(Return(false));
|
| +
|
| + // We expect to receive an error.
|
| + EXPECT_CALL(host_, Error(PIPELINE_ERROR_INITIALIZATION_FAILED));
|
| +
|
| + // We expect our callback to be executed.
|
| + EXPECT_CALL(callback_, OnFilterCallback());
|
| + EXPECT_CALL(callback_, OnCallbackDestroyed());
|
| +
|
| + // Initialize, we expect to get a bunch of read requests.
|
| + renderer_->Initialize(decoder_, callback_.NewCallback());
|
| + EXPECT_EQ(kMaxQueueSize, read_queue_.size());
|
| +}
|
| +
|
| +TEST_F(AudioRendererBaseTest, Initialize_Successful) {
|
| + InSequence s;
|
| +
|
| + // Then our subclass will be asked to initialize.
|
| + EXPECT_CALL(*renderer_, OnInitialize(_))
|
| + .WillOnce(Return(true));
|
| +
|
| + // Set up a check point to verify that the callback hasn't been executed yet.
|
| + EXPECT_CALL(*renderer_, CheckPoint(0));
|
| +
|
| + // After finishing preroll, we expect our callback to be executed.
|
| + EXPECT_CALL(callback_, OnFilterCallback());
|
| + EXPECT_CALL(callback_, OnCallbackDestroyed());
|
| +
|
| + // Initialize, we expect to get a bunch of read requests.
|
| + renderer_->Initialize(decoder_, callback_.NewCallback());
|
| + EXPECT_EQ(kMaxQueueSize, read_queue_.size());
|
| +
|
| + // Verify our callback hasn't been executed yet.
|
| + renderer_->CheckPoint(0);
|
| +
|
| + // Now satisfy the read requests. Our callback should be executed after
|
| + // exiting this loop.
|
| + while (!read_queue_.empty()) {
|
| + scoped_refptr<DataBuffer> buffer = new DataBuffer();
|
| + buffer->GetWritableData(1);
|
| + read_queue_.front()->Run(buffer);
|
| + delete read_queue_.front();
|
| + read_queue_.pop_front();
|
| + }
|
| +}
|
| +
|
| +} // namespace media
|
|
|