Index: media/filters/decoder_base_unittest.cc |
diff --git a/media/filters/decoder_base_unittest.cc b/media/filters/decoder_base_unittest.cc |
new file mode 100644 |
index 0000000000000000000000000000000000000000..26fed483c810a283112851cb87dd9f2de6cb4134 |
--- /dev/null |
+++ b/media/filters/decoder_base_unittest.cc |
@@ -0,0 +1,130 @@ |
+// Copyright (c) 2010 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 "media/base/mock_filters.h" |
+#include "media/filters/decoder_base.h" |
+#include "testing/gmock/include/gmock/gmock.h" |
+#include "testing/gtest/include/gtest/gtest.h" |
+ |
+using ::testing::NotNull; |
+ |
+namespace media { |
+ |
+class MockOutput : public StreamSample { |
+ MOCK_CONST_METHOD0(IsEndOfStream, bool()); |
+}; |
+ |
+class MockDecoder : public MediaFilter {}; |
+ |
+class MockBuffer : public Buffer { |
+ public: |
+ MOCK_CONST_METHOD0(GetData, const uint8*()); |
+ MOCK_CONST_METHOD0(GetDataSize, size_t()); |
+}; |
+ |
+ACTION(Initialize) { |
+ AutoTaskRunner done_runner(arg2); |
+ *arg1 = true; |
+} |
+ |
+ACTION_P(SaveDecodeRequest, list) { |
+ scoped_refptr<Buffer> buffer = arg0; |
+ list->push_back(arg1); |
+} |
+ |
+ACTION(CompleteDemuxRequest) { |
+ arg0->Run(new MockBuffer()); |
+ delete arg0; |
+} |
+ |
+class MockDecoderImpl : public DecoderBase<MockDecoder, MockOutput> { |
+ public: |
+ MockDecoderImpl() { |
+ media_format_.SetAsString(MediaFormat::kMimeType, "mock"); |
+ } |
+ |
+ // DecoderBase Implementations. |
+ MOCK_METHOD3(DoInitialize, |
+ void(DemuxerStream* demuxer_stream, bool* success, |
+ Task* done_cb)); |
+ MOCK_METHOD0(DoStop, void()); |
+ MOCK_METHOD2(DoSeek, void(base::TimeDelta time, Task* done_cb)); |
+ MOCK_METHOD2(DoDecode, void(Buffer* input, Task* done_cb)); |
+ |
+ private: |
+ FRIEND_TEST(DecoderBaseTest, FlowControl); |
+ |
+ DISALLOW_COPY_AND_ASSIGN(MockDecoderImpl); |
+}; |
+ |
+class MockReadCallback { |
+ public: |
+ MockReadCallback() {} |
+ MOCK_METHOD1(ReadCallback, void(MockOutput* output)); |
+ |
+ private: |
+ DISALLOW_COPY_AND_ASSIGN(MockReadCallback); |
+}; |
+ |
+// Test the flow control of decoder base by the following sequnce of actions: |
+// - Read() -> DecoderStream |
+// \ Read() -> DemuxerStream |
+// - Read() -> DecoderBase |
+// \ Read() -> DemixerStream |
+// - ReadCallback() -> DecoderBase |
+// \ DoDecode() -> Decoder |
+// - ReadCallback() -> DecoderBase |
+// \ DoDecode() -> Decoder |
+// - DecodeCallback() -> DecoderBase |
+// \ ReadCallback() -> client |
+// - DecodeCallback() -> DecoderBase |
+// \ ReadCallback() -> client |
+TEST(DecoderBaseTest, FlowControl) { |
+ MessageLoop message_loop; |
+ scoped_refptr<MockDecoderImpl> decoder = new MockDecoderImpl(); |
+ scoped_refptr<MockDemuxerStream> demuxer_stream = new MockDemuxerStream(); |
+ MockFilterCallback callback; |
+ MockReadCallback read_callback; |
+ decoder->set_message_loop(&message_loop); |
+ |
+ // Initailize. |
+ EXPECT_CALL(callback, OnFilterCallback()); |
+ EXPECT_CALL(callback, OnCallbackDestroyed()); |
+ EXPECT_CALL(*decoder, DoInitialize(NotNull(), NotNull(), NotNull())) |
+ .WillOnce(Initialize()); |
+ decoder->Initialize(demuxer_stream.get(), callback.NewCallback()); |
+ message_loop.RunAllPending(); |
+ |
+ // Read. |
+ std::vector<Task*> decode_requests; |
+ EXPECT_CALL(*demuxer_stream, Read(NotNull())) |
+ .Times(2) |
+ .WillRepeatedly(CompleteDemuxRequest()); |
+ EXPECT_CALL(*decoder, DoDecode(NotNull(), NotNull())) |
+ .Times(2) |
+ .WillRepeatedly(SaveDecodeRequest(&decode_requests)); |
+ decoder->Read(NewCallback(&read_callback, |
+ &MockReadCallback::ReadCallback)); |
scherkus (not reviewing)
2010/02/26 22:03:17
make sure this passes on try servesr.. I had to us
|
+ decoder->Read(NewCallback(&read_callback, |
+ &MockReadCallback::ReadCallback)); |
+ message_loop.RunAllPending(); |
+ |
+ // Fulfill the decode request. |
+ EXPECT_CALL(read_callback, ReadCallback(NotNull())).Times(2); |
+ for (size_t i = 0; i < decode_requests.size(); ++i) { |
+ decoder->EnqueueResult(new MockOutput()); |
+ AutoTaskRunner done_cb(decode_requests[i]); |
+ } |
+ decode_requests.clear(); |
+ message_loop.RunAllPending(); |
+ |
+ // Stop. |
+ EXPECT_CALL(*decoder, DoStop()); |
+ decoder->Stop(); |
+ message_loop.RunAllPending(); |
+} |
+ |
+} // namespace media |