| OLD | NEW |
| 1 // Copyright (c) 2010 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2010 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include <vector> | 5 #include <vector> |
| 6 | 6 |
| 7 #include "media/base/mock_filters.h" | 7 #include "media/base/mock_filters.h" |
| 8 #include "media/filters/decoder_base.h" | 8 #include "media/filters/decoder_base.h" |
| 9 #include "testing/gmock/include/gmock/gmock.h" | 9 #include "testing/gmock/include/gmock/gmock.h" |
| 10 #include "testing/gtest/include/gtest/gtest.h" | 10 #include "testing/gtest/include/gtest/gtest.h" |
| 11 | 11 |
| 12 using ::testing::_; |
| 12 using ::testing::NotNull; | 13 using ::testing::NotNull; |
| 13 using ::testing::StrictMock; | 14 using ::testing::StrictMock; |
| 14 | 15 |
| 15 namespace media { | 16 namespace media { |
| 16 | 17 |
| 17 class GTEST_TEST_CLASS_NAME_(DecoderBaseTest, FlowControl); | 18 class GTEST_TEST_CLASS_NAME_(DecoderBaseTest, FlowControl); |
| 18 | 19 |
| 19 } // namespace media | 20 } // namespace media |
| 20 | 21 |
| 21 namespace { | 22 namespace { |
| 22 | 23 |
| 23 class MockDecoderOutput : public media::StreamSample { | 24 class MockDecoderOutput : public media::StreamSample { |
| 24 public: | 25 public: |
| 25 MOCK_CONST_METHOD0(IsEndOfStream, bool()); | 26 MOCK_CONST_METHOD0(IsEndOfStream, bool()); |
| 26 }; | 27 }; |
| 27 | 28 |
| 28 class MockDecoder : public media::MediaFilter {}; | |
| 29 | |
| 30 class MockBuffer : public media::Buffer { | 29 class MockBuffer : public media::Buffer { |
| 31 public: | 30 public: |
| 32 MockBuffer() {} | 31 MockBuffer() {} |
| 33 virtual ~MockBuffer() {} | 32 virtual ~MockBuffer() {} |
| 34 MOCK_CONST_METHOD0(GetData, const uint8*()); | 33 MOCK_CONST_METHOD0(GetData, const uint8*()); |
| 35 MOCK_CONST_METHOD0(GetDataSize, size_t()); | 34 MOCK_CONST_METHOD0(GetDataSize, size_t()); |
| 36 | 35 |
| 37 private: | 36 private: |
| 38 DISALLOW_COPY_AND_ASSIGN(MockBuffer); | 37 DISALLOW_COPY_AND_ASSIGN(MockBuffer); |
| 39 }; | 38 }; |
| 40 | 39 |
| 40 class MockDecoder : public media::MediaFilter { |
| 41 public: |
| 42 typedef Callback1<scoped_refptr<MockDecoderOutput> >::Type |
| 43 FillBufferDoneCallback; |
| 44 void set_fill_buffer_done_callback_(FillBufferDoneCallback* callback) { |
| 45 fill_buffer_done_callback_.reset(callback); |
| 46 } |
| 47 FillBufferDoneCallback* fill_buffer_done_callback() { |
| 48 return fill_buffer_done_callback_.get(); |
| 49 } |
| 50 scoped_ptr<FillBufferDoneCallback> fill_buffer_done_callback_; |
| 51 }; |
| 52 |
| 53 class MockDecoderCallback { |
| 54 public: |
| 55 MOCK_METHOD1(OnReadComplete, void(scoped_refptr<MockDecoderOutput> output)); |
| 56 }; |
| 57 |
| 41 class MockDecoderImpl : public media::DecoderBase< | 58 class MockDecoderImpl : public media::DecoderBase< |
| 42 MockDecoder, MockDecoderOutput> { | 59 MockDecoder, MockDecoderOutput> { |
| 43 public: | 60 public: |
| 44 MockDecoderImpl() { | 61 MockDecoderImpl() { |
| 45 media_format_.SetAsString(media::MediaFormat::kMimeType, "mock"); | 62 media_format_.SetAsString(media::MediaFormat::kMimeType, "mock"); |
| 46 } | 63 } |
| 47 | 64 |
| 48 virtual ~MockDecoderImpl() {} | 65 virtual ~MockDecoderImpl() {} |
| 49 | 66 |
| 50 // DecoderBase Implementations. | 67 // DecoderBase Implementations. |
| 51 MOCK_METHOD3(DoInitialize, | 68 MOCK_METHOD3(DoInitialize, |
| 52 void(media::DemuxerStream* demuxer_stream, | 69 void(media::DemuxerStream* demuxer_stream, |
| 53 bool* success, | 70 bool* success, |
| 54 Task* done_cb)); | 71 Task* done_cb)); |
| 55 MOCK_METHOD0(DoStop, void()); | 72 MOCK_METHOD0(DoStop, void()); |
| 56 MOCK_METHOD2(DoSeek, void(base::TimeDelta time, Task* done_cb)); | 73 MOCK_METHOD2(DoSeek, void(base::TimeDelta time, Task* done_cb)); |
| 57 MOCK_METHOD1(DoDecode, void(media::Buffer* input)); | 74 MOCK_METHOD1(DoDecode, void(media::Buffer* input)); |
| 58 | 75 |
| 59 private: | 76 private: |
| 60 FRIEND_TEST(media::DecoderBaseTest, FlowControl); | 77 FRIEND_TEST(media::DecoderBaseTest, FlowControl); |
| 61 | 78 |
| 62 DISALLOW_COPY_AND_ASSIGN(MockDecoderImpl); | 79 DISALLOW_COPY_AND_ASSIGN(MockDecoderImpl); |
| 63 }; | 80 }; |
| 64 | 81 |
| 65 class MockDecoderReadCallback { | |
| 66 public: | |
| 67 MockDecoderReadCallback() {} | |
| 68 virtual ~MockDecoderReadCallback() {} | |
| 69 MOCK_METHOD1(ReadCallback, void(MockDecoderOutput* output)); | |
| 70 | |
| 71 private: | |
| 72 DISALLOW_COPY_AND_ASSIGN(MockDecoderReadCallback); | |
| 73 }; | |
| 74 | |
| 75 } // namespace | 82 } // namespace |
| 76 | 83 |
| 77 namespace media { | 84 namespace media { |
| 78 | 85 |
| 79 ACTION(Initialize) { | 86 ACTION(Initialize) { |
| 80 AutoTaskRunner done_runner(arg2); | 87 AutoTaskRunner done_runner(arg2); |
| 81 *arg1 = true; | 88 *arg1 = true; |
| 82 } | 89 } |
| 83 | 90 |
| 84 ACTION_P(SaveDecodeRequest, list) { | 91 ACTION_P(SaveDecodeRequest, list) { |
| (...skipping 15 matching lines...) Expand all Loading... |
| 100 // \ DoDecode() -> Decoder | 107 // \ DoDecode() -> Decoder |
| 101 // - ReadCallback() -> DecoderBase | 108 // - ReadCallback() -> DecoderBase |
| 102 // \ DoDecode() -> Decoder | 109 // \ DoDecode() -> Decoder |
| 103 // - DecodeCallback() -> DecoderBase | 110 // - DecodeCallback() -> DecoderBase |
| 104 // \ ReadCallback() -> client | 111 // \ ReadCallback() -> client |
| 105 // - DecodeCallback() -> DecoderBase | 112 // - DecodeCallback() -> DecoderBase |
| 106 // \ ReadCallback() -> client | 113 // \ ReadCallback() -> client |
| 107 TEST(DecoderBaseTest, FlowControl) { | 114 TEST(DecoderBaseTest, FlowControl) { |
| 108 MessageLoop message_loop; | 115 MessageLoop message_loop; |
| 109 scoped_refptr<MockDecoderImpl> decoder = new MockDecoderImpl(); | 116 scoped_refptr<MockDecoderImpl> decoder = new MockDecoderImpl(); |
| 117 MockDecoderCallback read_callback; |
| 118 decoder->set_fill_buffer_done_callback_( |
| 119 NewCallback(&read_callback, &MockDecoderCallback::OnReadComplete)); |
| 110 scoped_refptr<MockDemuxerStream> demuxer_stream = new MockDemuxerStream(); | 120 scoped_refptr<MockDemuxerStream> demuxer_stream = new MockDemuxerStream(); |
| 111 StrictMock<MockFilterCallback> callback; | 121 StrictMock<MockFilterCallback> callback; |
| 112 decoder->set_message_loop(&message_loop); | 122 decoder->set_message_loop(&message_loop); |
| 113 | 123 |
| 114 // Initailize. | 124 // Initailize. |
| 115 EXPECT_CALL(callback, OnFilterCallback()); | 125 EXPECT_CALL(callback, OnFilterCallback()); |
| 116 EXPECT_CALL(callback, OnCallbackDestroyed()); | 126 EXPECT_CALL(callback, OnCallbackDestroyed()); |
| 117 EXPECT_CALL(*decoder, DoInitialize(NotNull(), NotNull(), NotNull())) | 127 EXPECT_CALL(*decoder, DoInitialize(NotNull(), NotNull(), NotNull())) |
| 118 .WillOnce(Initialize()); | 128 .WillOnce(Initialize()); |
| 119 decoder->Initialize(demuxer_stream.get(), callback.NewCallback()); | 129 decoder->Initialize(demuxer_stream.get(), callback.NewCallback()); |
| 120 message_loop.RunAllPending(); | 130 message_loop.RunAllPending(); |
| 121 | 131 |
| 122 // Read. | 132 // Read. |
| 123 StrictMock<MockDecoderReadCallback> read_callback; | |
| 124 std::vector<scoped_refptr<Buffer> > decode_requests; | 133 std::vector<scoped_refptr<Buffer> > decode_requests; |
| 125 EXPECT_CALL(*demuxer_stream, Read(NotNull())) | 134 EXPECT_CALL(*demuxer_stream, Read(NotNull())) |
| 126 .Times(2) | 135 .Times(2) |
| 127 .WillRepeatedly(CompleteDemuxRequest()); | 136 .WillRepeatedly(CompleteDemuxRequest()); |
| 128 EXPECT_CALL(*decoder, DoDecode(NotNull())) | 137 EXPECT_CALL(*decoder, DoDecode(NotNull())) |
| 129 .Times(2) | 138 .Times(2) |
| 130 .WillRepeatedly(SaveDecodeRequest(&decode_requests)); | 139 .WillRepeatedly(SaveDecodeRequest(&decode_requests)); |
| 131 decoder->Read( | 140 scoped_refptr<MockDecoderOutput> output; |
| 132 NewCallback(reinterpret_cast<MockDecoderReadCallback*>(&read_callback), | 141 decoder->FillThisBuffer(output); |
| 133 &MockDecoderReadCallback::ReadCallback)); | 142 decoder->FillThisBuffer(output); |
| 134 decoder->Read( | |
| 135 NewCallback(reinterpret_cast<MockDecoderReadCallback*>(&read_callback), | |
| 136 &MockDecoderReadCallback::ReadCallback)); | |
| 137 message_loop.RunAllPending(); | 143 message_loop.RunAllPending(); |
| 138 | 144 |
| 139 // Fulfill the decode request. | 145 // Fulfill the decode request. |
| 140 EXPECT_CALL(read_callback, ReadCallback(NotNull())).Times(2); | 146 EXPECT_CALL(read_callback, OnReadComplete(_)).Times(2); |
| 141 for (size_t i = 0; i < decode_requests.size(); ++i) { | 147 for (size_t i = 0; i < decode_requests.size(); ++i) { |
| 142 decoder->EnqueueResult(new MockDecoderOutput()); | 148 decoder->EnqueueResult(new MockDecoderOutput()); |
| 143 decoder->OnDecodeComplete(); | 149 decoder->OnDecodeComplete(); |
| 144 } | 150 } |
| 145 decode_requests.clear(); | 151 decode_requests.clear(); |
| 146 message_loop.RunAllPending(); | 152 message_loop.RunAllPending(); |
| 147 | 153 |
| 148 // Stop. | 154 // Stop. |
| 149 EXPECT_CALL(*decoder, DoStop()); | 155 EXPECT_CALL(*decoder, DoStop()); |
| 150 decoder->Stop(); | 156 decoder->Stop(); |
| 151 message_loop.RunAllPending(); | 157 message_loop.RunAllPending(); |
| 152 } | 158 } |
| 153 | 159 |
| 154 } // namespace media | 160 } // namespace media |
| OLD | NEW |