Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(126)

Side by Side Diff: media/filters/decoder_base_unittest.cc

Issue 2101022: refactoring decoder interface (Closed)
Patch Set: q Created 10 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « media/filters/decoder_base.h ('k') | media/filters/video_renderer_base.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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
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
OLDNEW
« no previous file with comments | « media/filters/decoder_base.h ('k') | media/filters/video_renderer_base.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698