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 |