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

Side by Side Diff: media/base/pipeline_unittest.cc

Issue 10832197: Add a lot of Pipeline tests to cover stopping/error handling while in a variety of states. (Closed) Base URL: svn://chrome-svn/chrome/trunk/src
Patch Set: todo Created 8 years, 4 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 | Annotate | Revision Log
« no previous file with comments | « media/base/pipeline.cc ('k') | no next file » | 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) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 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 "base/bind.h" 7 #include "base/bind.h"
8 #include "base/message_loop.h" 8 #include "base/message_loop.h"
9 #include "base/stl_util.h" 9 #include "base/stl_util.h"
10 #include "base/threading/simple_thread.h" 10 #include "base/threading/simple_thread.h"
11 #include "media/base/clock.h" 11 #include "media/base/clock.h"
12 #include "media/base/media_log.h" 12 #include "media/base/media_log.h"
13 #include "media/base/pipeline.h" 13 #include "media/base/pipeline.h"
14 #include "media/base/mock_callback.h" 14 #include "media/base/mock_callback.h"
15 #include "media/base/mock_filters.h" 15 #include "media/base/mock_filters.h"
16 #include "testing/gtest/include/gtest/gtest.h" 16 #include "testing/gtest/include/gtest/gtest.h"
17 #include "ui/gfx/size.h" 17 #include "ui/gfx/size.h"
18 18
19 using ::testing::_; 19 using ::testing::_;
20 using ::testing::DeleteArg; 20 using ::testing::DeleteArg;
21 using ::testing::DoAll; 21 using ::testing::DoAll;
22 // TODO(scherkus): Remove InSequence after refactoring Pipeline.
22 using ::testing::InSequence; 23 using ::testing::InSequence;
23 using ::testing::Invoke; 24 using ::testing::Invoke;
24 using ::testing::InvokeWithoutArgs; 25 using ::testing::InvokeWithoutArgs;
25 using ::testing::Mock; 26 using ::testing::Mock;
26 using ::testing::NotNull; 27 using ::testing::NotNull;
27 using ::testing::Return; 28 using ::testing::Return;
28 using ::testing::ReturnRef; 29 using ::testing::ReturnRef;
29 using ::testing::SaveArg; 30 using ::testing::SaveArg;
30 using ::testing::StrictMock; 31 using ::testing::StrictMock;
31 using ::testing::WithArg; 32 using ::testing::WithArg;
32 33
33 namespace media { 34 namespace media {
34 35
35 // Demuxer properties. 36 // Demuxer properties.
36 static const int kTotalBytes = 1024; 37 static const int kTotalBytes = 1024;
37 static const int kBitrate = 1234; 38 static const int kBitrate = 1234;
38 39
39 ACTION_P(SetDemuxerProperties, duration) { 40 ACTION_P(SetDemuxerProperties, duration) {
40 arg0->SetTotalBytes(kTotalBytes); 41 arg0->SetTotalBytes(kTotalBytes);
41 arg0->SetDuration(duration); 42 arg0->SetDuration(duration);
42 } 43 }
43 44
44 ACTION(RunPipelineStatusCB1) { 45 ACTION_P2(Stop, pipeline, stop_cb) {
46 pipeline->Stop(stop_cb);
47 }
48
49 ACTION_P2(SetError, pipeline, status) {
50 pipeline->SetErrorForTesting(status);
51 }
52
53 ACTION(RunPipelineStatusCB) {
45 arg1.Run(PIPELINE_OK); 54 arg1.Run(PIPELINE_OK);
46 } 55 }
47 56
48 ACTION_P(RunPipelineStatusCB1WithStatus, status) { 57 ACTION_P(RunPipelineStatusCBWithStatus, status) {
49 arg1.Run(status); 58 arg1.Run(status);
50 } 59 }
51 60
52 // Used for setting expectations on pipeline callbacks. Using a StrictMock 61 // Used for setting expectations on pipeline callbacks. Using a StrictMock
53 // also lets us test for missing callbacks. 62 // also lets us test for missing callbacks.
54 class CallbackHelper { 63 class CallbackHelper {
55 public: 64 public:
56 CallbackHelper() {} 65 CallbackHelper() {}
57 virtual ~CallbackHelper() {} 66 virtual ~CallbackHelper() {}
58 67
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after
91 virtual ~PipelineTest() { 100 virtual ~PipelineTest() {
92 if (!pipeline_->IsRunning()) { 101 if (!pipeline_->IsRunning()) {
93 return; 102 return;
94 } 103 }
95 104
96 // Shutdown sequence. 105 // Shutdown sequence.
97 if (pipeline_->IsInitialized()) { 106 if (pipeline_->IsInitialized()) {
98 EXPECT_CALL(*mocks_->demuxer(), Stop(_)) 107 EXPECT_CALL(*mocks_->demuxer(), Stop(_))
99 .WillOnce(RunClosure()); 108 .WillOnce(RunClosure());
100 109
110 // TODO(scherkus): Don't pause+flush on shutdown,
111 // see http://crbug.com/110228
101 if (audio_stream_) { 112 if (audio_stream_) {
102 EXPECT_CALL(*mocks_->audio_renderer(), Pause(_)) 113 EXPECT_CALL(*mocks_->audio_renderer(), Pause(_))
103 .WillOnce(RunClosure()); 114 .WillOnce(RunClosure());
104 EXPECT_CALL(*mocks_->audio_renderer(), Flush(_)) 115 EXPECT_CALL(*mocks_->audio_renderer(), Flush(_))
105 .WillOnce(RunClosure()); 116 .WillOnce(RunClosure());
106 EXPECT_CALL(*mocks_->audio_renderer(), Stop(_)) 117 EXPECT_CALL(*mocks_->audio_renderer(), Stop(_))
107 .WillOnce(RunClosure()); 118 .WillOnce(RunClosure());
108 } 119 }
109 120
110 if (video_stream_) { 121 if (video_stream_) {
(...skipping 16 matching lines...) Expand all
127 mocks_.reset(); 138 mocks_.reset();
128 } 139 }
129 140
130 protected: 141 protected:
131 // Sets up expectations to allow the demuxer to initialize. 142 // Sets up expectations to allow the demuxer to initialize.
132 typedef std::vector<MockDemuxerStream*> MockDemuxerStreamVector; 143 typedef std::vector<MockDemuxerStream*> MockDemuxerStreamVector;
133 void InitializeDemuxer(MockDemuxerStreamVector* streams, 144 void InitializeDemuxer(MockDemuxerStreamVector* streams,
134 const base::TimeDelta& duration) { 145 const base::TimeDelta& duration) {
135 EXPECT_CALL(*mocks_->demuxer(), Initialize(_, _)) 146 EXPECT_CALL(*mocks_->demuxer(), Initialize(_, _))
136 .WillOnce(DoAll(SetDemuxerProperties(duration), 147 .WillOnce(DoAll(SetDemuxerProperties(duration),
137 RunPipelineStatusCB1())); 148 RunPipelineStatusCB()));
138 149
139 // Configure the demuxer to return the streams. 150 // Configure the demuxer to return the streams.
140 for (size_t i = 0; i < streams->size(); ++i) { 151 for (size_t i = 0; i < streams->size(); ++i) {
141 scoped_refptr<DemuxerStream> stream((*streams)[i]); 152 scoped_refptr<DemuxerStream> stream((*streams)[i]);
142 EXPECT_CALL(*mocks_->demuxer(), GetStream(stream->type())) 153 EXPECT_CALL(*mocks_->demuxer(), GetStream(stream->type()))
143 .WillRepeatedly(Return(stream)); 154 .WillRepeatedly(Return(stream));
144 } 155 }
145 } 156 }
146 157
147 void InitializeDemuxer(MockDemuxerStreamVector* streams) { 158 void InitializeDemuxer(MockDemuxerStreamVector* streams) {
148 // Initialize with a default non-zero duration. 159 // Initialize with a default non-zero duration.
149 InitializeDemuxer(streams, base::TimeDelta::FromSeconds(10)); 160 InitializeDemuxer(streams, base::TimeDelta::FromSeconds(10));
150 } 161 }
151 162
152 StrictMock<MockDemuxerStream>* CreateStream(DemuxerStream::Type type) { 163 StrictMock<MockDemuxerStream>* CreateStream(DemuxerStream::Type type) {
153 StrictMock<MockDemuxerStream>* stream = 164 StrictMock<MockDemuxerStream>* stream =
154 new StrictMock<MockDemuxerStream>(); 165 new StrictMock<MockDemuxerStream>();
155 EXPECT_CALL(*stream, type()) 166 EXPECT_CALL(*stream, type())
156 .WillRepeatedly(Return(type)); 167 .WillRepeatedly(Return(type));
157 return stream; 168 return stream;
158 } 169 }
159 170
160 // Sets up expectations to allow the video decoder to initialize. 171 // Sets up expectations to allow the video decoder to initialize.
161 void InitializeVideoDecoder(const scoped_refptr<DemuxerStream>& stream) { 172 void InitializeVideoDecoder(const scoped_refptr<DemuxerStream>& stream) {
162 EXPECT_CALL(*mocks_->video_decoder(), 173 EXPECT_CALL(*mocks_->video_decoder(),
163 Initialize(stream, _, _)) 174 Initialize(stream, _, _))
164 .WillOnce(RunPipelineStatusCB1()); 175 .WillOnce(RunPipelineStatusCB());
165 } 176 }
166 177
167 // Sets up expectations to allow the audio decoder to initialize. 178 // Sets up expectations to allow the audio decoder to initialize.
168 void InitializeAudioDecoder(const scoped_refptr<DemuxerStream>& stream) { 179 void InitializeAudioDecoder(const scoped_refptr<DemuxerStream>& stream) {
169 EXPECT_CALL(*mocks_->audio_decoder(), Initialize(stream, _, _)) 180 EXPECT_CALL(*mocks_->audio_decoder(), Initialize(stream, _, _))
170 .WillOnce(RunPipelineStatusCB1()); 181 .WillOnce(RunPipelineStatusCB());
171 } 182 }
172 183
173 // Sets up expectations to allow the video renderer to initialize. 184 // Sets up expectations to allow the video renderer to initialize.
174 void InitializeVideoRenderer() { 185 void InitializeVideoRenderer() {
175 EXPECT_CALL(*mocks_->video_renderer(), Initialize( 186 EXPECT_CALL(*mocks_->video_renderer(), Initialize(
176 scoped_refptr<VideoDecoder>(mocks_->video_decoder()), 187 scoped_refptr<VideoDecoder>(mocks_->video_decoder()),
177 _, _, _, _, _, _, _, _)) 188 _, _, _, _, _, _, _, _))
178 .WillOnce(RunPipelineStatusCB1()); 189 .WillOnce(RunPipelineStatusCB());
179 EXPECT_CALL(*mocks_->video_renderer(), SetPlaybackRate(0.0f)); 190 EXPECT_CALL(*mocks_->video_renderer(), SetPlaybackRate(0.0f));
180 191
181 // Startup sequence. 192 // Startup sequence.
182 EXPECT_CALL(*mocks_->video_renderer(), 193 EXPECT_CALL(*mocks_->video_renderer(),
183 Preroll(mocks_->demuxer()->GetStartTime(), _)) 194 Preroll(mocks_->demuxer()->GetStartTime(), _))
184 .WillOnce(RunPipelineStatusCB1()); 195 .WillOnce(RunPipelineStatusCB());
185 EXPECT_CALL(*mocks_->video_renderer(), Play(_)) 196 EXPECT_CALL(*mocks_->video_renderer(), Play(_))
186 .WillOnce(RunClosure()); 197 .WillOnce(RunClosure());
187 } 198 }
188 199
189 // Sets up expectations to allow the audio renderer to initialize. 200 // Sets up expectations to allow the audio renderer to initialize.
190 void InitializeAudioRenderer(bool disable_after_init_cb = false) { 201 void InitializeAudioRenderer(bool disable_after_init_cb = false) {
191 if (disable_after_init_cb) { 202 if (disable_after_init_cb) {
192 EXPECT_CALL(*mocks_->audio_renderer(), Initialize( 203 EXPECT_CALL(*mocks_->audio_renderer(), Initialize(
193 scoped_refptr<AudioDecoder>(mocks_->audio_decoder()), 204 scoped_refptr<AudioDecoder>(mocks_->audio_decoder()),
194 _, _, _, _, _, _)) 205 _, _, _, _, _, _))
195 .WillOnce(DoAll(RunPipelineStatusCB1(), 206 .WillOnce(DoAll(RunPipelineStatusCB(),
196 WithArg<5>(RunClosure()))); // |disabled_cb|. 207 WithArg<5>(RunClosure()))); // |disabled_cb|.
197 } else { 208 } else {
198 EXPECT_CALL(*mocks_->audio_renderer(), Initialize( 209 EXPECT_CALL(*mocks_->audio_renderer(), Initialize(
199 scoped_refptr<AudioDecoder>(mocks_->audio_decoder()), 210 scoped_refptr<AudioDecoder>(mocks_->audio_decoder()),
200 _, _, _, _, _, _)) 211 _, _, _, _, _, _))
201 .WillOnce(DoAll(SaveArg<3>(&audio_time_cb_), 212 .WillOnce(DoAll(SaveArg<3>(&audio_time_cb_),
202 RunPipelineStatusCB1())); 213 RunPipelineStatusCB()));
203 } 214 }
204 } 215 }
205 216
206 // Sets up expectations on the callback and initializes the pipeline. Called 217 // Sets up expectations on the callback and initializes the pipeline. Called
207 // after tests have set expectations any filters they wish to use. 218 // after tests have set expectations any filters they wish to use.
208 void InitializePipeline(PipelineStatus start_status) { 219 void InitializePipeline(PipelineStatus start_status) {
209 EXPECT_CALL(callbacks_, OnStart(start_status)); 220 EXPECT_CALL(callbacks_, OnStart(start_status));
210 221
211 if (start_status == PIPELINE_OK) { 222 if (start_status == PIPELINE_OK) {
212 EXPECT_CALL(*mocks_->demuxer(), SetPlaybackRate(0.0f)); 223 EXPECT_CALL(*mocks_->demuxer(), SetPlaybackRate(0.0f));
213 224
214 if (audio_stream_) { 225 if (audio_stream_) {
215 EXPECT_CALL(*mocks_->audio_renderer(), SetPlaybackRate(0.0f)); 226 EXPECT_CALL(*mocks_->audio_renderer(), SetPlaybackRate(0.0f));
216 EXPECT_CALL(*mocks_->audio_renderer(), SetVolume(1.0f)); 227 EXPECT_CALL(*mocks_->audio_renderer(), SetVolume(1.0f));
217 228
218 // Startup sequence. 229 // Startup sequence.
219 EXPECT_CALL(*mocks_->audio_renderer(), Preroll(base::TimeDelta(), _)) 230 EXPECT_CALL(*mocks_->audio_renderer(), Preroll(base::TimeDelta(), _))
220 .WillOnce(RunPipelineStatusCB1()); 231 .WillOnce(RunPipelineStatusCB());
221 EXPECT_CALL(*mocks_->audio_renderer(), Play(_)) 232 EXPECT_CALL(*mocks_->audio_renderer(), Play(_))
222 .WillOnce(RunClosure()); 233 .WillOnce(RunClosure());
223 } 234 }
224 } 235 }
225 236
226 pipeline_->Start( 237 pipeline_->Start(
227 mocks_->Create().Pass(), 238 mocks_->Create().Pass(),
228 base::Bind(&CallbackHelper::OnEnded, base::Unretained(&callbacks_)), 239 base::Bind(&CallbackHelper::OnEnded, base::Unretained(&callbacks_)),
229 base::Bind(&CallbackHelper::OnError, base::Unretained(&callbacks_)), 240 base::Bind(&CallbackHelper::OnError, base::Unretained(&callbacks_)),
230 base::Bind(&CallbackHelper::OnStart, base::Unretained(&callbacks_))); 241 base::Bind(&CallbackHelper::OnStart, base::Unretained(&callbacks_)));
(...skipping 12 matching lines...) Expand all
243 return audio_stream_; 254 return audio_stream_;
244 } 255 }
245 256
246 MockDemuxerStream* video_stream() { 257 MockDemuxerStream* video_stream() {
247 return video_stream_; 258 return video_stream_;
248 } 259 }
249 260
250 void ExpectSeek(const base::TimeDelta& seek_time) { 261 void ExpectSeek(const base::TimeDelta& seek_time) {
251 // Every filter should receive a call to Seek(). 262 // Every filter should receive a call to Seek().
252 EXPECT_CALL(*mocks_->demuxer(), Seek(seek_time, _)) 263 EXPECT_CALL(*mocks_->demuxer(), Seek(seek_time, _))
253 .WillOnce(RunPipelineStatusCB1()); 264 .WillOnce(RunPipelineStatusCB());
254 265
255 if (audio_stream_) { 266 if (audio_stream_) {
256 EXPECT_CALL(*mocks_->audio_renderer(), Pause(_)) 267 EXPECT_CALL(*mocks_->audio_renderer(), Pause(_))
257 .WillOnce(RunClosure()); 268 .WillOnce(RunClosure());
258 EXPECT_CALL(*mocks_->audio_renderer(), Flush(_)) 269 EXPECT_CALL(*mocks_->audio_renderer(), Flush(_))
259 .WillOnce(RunClosure()); 270 .WillOnce(RunClosure());
260 EXPECT_CALL(*mocks_->audio_renderer(), Preroll(seek_time, _)) 271 EXPECT_CALL(*mocks_->audio_renderer(), Preroll(seek_time, _))
261 .WillOnce(RunPipelineStatusCB1()); 272 .WillOnce(RunPipelineStatusCB());
262 EXPECT_CALL(*mocks_->audio_renderer(), Play(_)) 273 EXPECT_CALL(*mocks_->audio_renderer(), Play(_))
263 .WillOnce(RunClosure()); 274 .WillOnce(RunClosure());
264 } 275 }
265 276
266 if (video_stream_) { 277 if (video_stream_) {
267 EXPECT_CALL(*mocks_->video_renderer(), Pause(_)) 278 EXPECT_CALL(*mocks_->video_renderer(), Pause(_))
268 .WillOnce(RunClosure()); 279 .WillOnce(RunClosure());
269 EXPECT_CALL(*mocks_->video_renderer(), Flush(_)) 280 EXPECT_CALL(*mocks_->video_renderer(), Flush(_))
270 .WillOnce(RunClosure()); 281 .WillOnce(RunClosure());
271 EXPECT_CALL(*mocks_->video_renderer(), Preroll(seek_time, _)) 282 EXPECT_CALL(*mocks_->video_renderer(), Preroll(seek_time, _))
272 .WillOnce(RunPipelineStatusCB1()); 283 .WillOnce(RunPipelineStatusCB());
273 EXPECT_CALL(*mocks_->video_renderer(), Play(_)) 284 EXPECT_CALL(*mocks_->video_renderer(), Play(_))
274 .WillOnce(RunClosure()); 285 .WillOnce(RunClosure());
275 } 286 }
276 287
277 // We expect a successful seek callback. 288 // We expect a successful seek callback.
278 EXPECT_CALL(callbacks_, OnSeek(PIPELINE_OK)); 289 EXPECT_CALL(callbacks_, OnSeek(PIPELINE_OK));
279 } 290 }
280 291
281 void DoSeek(const base::TimeDelta& seek_time) { 292 void DoSeek(const base::TimeDelta& seek_time) {
282 pipeline_->Seek(seek_time, 293 pipeline_->Seek(seek_time,
(...skipping 91 matching lines...) Expand 10 before | Expand all | Expand 10 after
374 collection.Pass(), 385 collection.Pass(),
375 base::Bind(&CallbackHelper::OnEnded, base::Unretained(&callbacks_)), 386 base::Bind(&CallbackHelper::OnEnded, base::Unretained(&callbacks_)),
376 base::Bind(&CallbackHelper::OnError, base::Unretained(&callbacks_)), 387 base::Bind(&CallbackHelper::OnError, base::Unretained(&callbacks_)),
377 base::Bind(&CallbackHelper::OnStart, base::Unretained(&callbacks_))); 388 base::Bind(&CallbackHelper::OnStart, base::Unretained(&callbacks_)));
378 message_loop_.RunAllPending(); 389 message_loop_.RunAllPending();
379 EXPECT_FALSE(pipeline_->IsInitialized()); 390 EXPECT_FALSE(pipeline_->IsInitialized());
380 } 391 }
381 392
382 TEST_F(PipelineTest, URLNotFound) { 393 TEST_F(PipelineTest, URLNotFound) {
383 EXPECT_CALL(*mocks_->demuxer(), Initialize(_, _)) 394 EXPECT_CALL(*mocks_->demuxer(), Initialize(_, _))
384 .WillOnce(RunPipelineStatusCB1WithStatus(PIPELINE_ERROR_URL_NOT_FOUND)); 395 .WillOnce(RunPipelineStatusCBWithStatus(PIPELINE_ERROR_URL_NOT_FOUND));
385 EXPECT_CALL(*mocks_->demuxer(), Stop(_)) 396 EXPECT_CALL(*mocks_->demuxer(), Stop(_))
386 .WillOnce(RunClosure()); 397 .WillOnce(RunClosure());
387 398
388 InitializePipeline(PIPELINE_ERROR_URL_NOT_FOUND); 399 InitializePipeline(PIPELINE_ERROR_URL_NOT_FOUND);
389 EXPECT_FALSE(pipeline_->IsInitialized()); 400 EXPECT_FALSE(pipeline_->IsInitialized());
390 } 401 }
391 402
392 TEST_F(PipelineTest, NoStreams) { 403 TEST_F(PipelineTest, NoStreams) {
393 EXPECT_CALL(*mocks_->demuxer(), Initialize(_, _)) 404 EXPECT_CALL(*mocks_->demuxer(), Initialize(_, _))
394 .WillOnce(RunPipelineStatusCB1()); 405 .WillOnce(RunPipelineStatusCB());
395 EXPECT_CALL(*mocks_->demuxer(), Stop(_)) 406 EXPECT_CALL(*mocks_->demuxer(), Stop(_))
396 .WillOnce(RunClosure()); 407 .WillOnce(RunClosure());
397 408
398 InitializePipeline(PIPELINE_ERROR_COULD_NOT_RENDER); 409 InitializePipeline(PIPELINE_ERROR_COULD_NOT_RENDER);
399 EXPECT_FALSE(pipeline_->IsInitialized()); 410 EXPECT_FALSE(pipeline_->IsInitialized());
400 } 411 }
401 412
402 TEST_F(PipelineTest, AudioStream) { 413 TEST_F(PipelineTest, AudioStream) {
403 CreateAudioStream(); 414 CreateAudioStream();
404 MockDemuxerStreamVector streams; 415 MockDemuxerStreamVector streams;
(...skipping 308 matching lines...) Expand 10 before | Expand all | Expand 10 after
713 724
714 // Seek() isn't called as the demuxer errors out first. 725 // Seek() isn't called as the demuxer errors out first.
715 EXPECT_CALL(*mocks_->audio_renderer(), Pause(_)) 726 EXPECT_CALL(*mocks_->audio_renderer(), Pause(_))
716 .WillOnce(RunClosure()); 727 .WillOnce(RunClosure());
717 EXPECT_CALL(*mocks_->audio_renderer(), Flush(_)) 728 EXPECT_CALL(*mocks_->audio_renderer(), Flush(_))
718 .WillOnce(RunClosure()); 729 .WillOnce(RunClosure());
719 EXPECT_CALL(*mocks_->audio_renderer(), Stop(_)) 730 EXPECT_CALL(*mocks_->audio_renderer(), Stop(_))
720 .WillOnce(RunClosure()); 731 .WillOnce(RunClosure());
721 732
722 EXPECT_CALL(*mocks_->demuxer(), Seek(seek_time, _)) 733 EXPECT_CALL(*mocks_->demuxer(), Seek(seek_time, _))
723 .WillOnce(RunPipelineStatusCB1WithStatus(PIPELINE_ERROR_READ)); 734 .WillOnce(RunPipelineStatusCBWithStatus(PIPELINE_ERROR_READ));
724 EXPECT_CALL(*mocks_->demuxer(), Stop(_)) 735 EXPECT_CALL(*mocks_->demuxer(), Stop(_))
725 .WillOnce(RunClosure()); 736 .WillOnce(RunClosure());
726 737
727 pipeline_->Seek(seek_time, base::Bind(&CallbackHelper::OnSeek, 738 pipeline_->Seek(seek_time, base::Bind(&CallbackHelper::OnSeek,
728 base::Unretained(&callbacks_))); 739 base::Unretained(&callbacks_)));
729 EXPECT_CALL(callbacks_, OnSeek(PIPELINE_ERROR_READ)); 740 EXPECT_CALL(callbacks_, OnSeek(PIPELINE_ERROR_READ));
730 message_loop_.RunAllPending(); 741 message_loop_.RunAllPending();
731 } 742 }
732 743
733 // Invoked function OnError. This asserts that the pipeline does not enqueue 744 // Invoked function OnError. This asserts that the pipeline does not enqueue
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after
769 780
770 // Seek() isn't called as the demuxer errors out first. 781 // Seek() isn't called as the demuxer errors out first.
771 EXPECT_CALL(*mocks_->audio_renderer(), Pause(_)) 782 EXPECT_CALL(*mocks_->audio_renderer(), Pause(_))
772 .WillOnce(RunClosure()); 783 .WillOnce(RunClosure());
773 EXPECT_CALL(*mocks_->audio_renderer(), Flush(_)) 784 EXPECT_CALL(*mocks_->audio_renderer(), Flush(_))
774 .WillOnce(RunClosure()); 785 .WillOnce(RunClosure());
775 EXPECT_CALL(*mocks_->audio_renderer(), Stop(_)) 786 EXPECT_CALL(*mocks_->audio_renderer(), Stop(_))
776 .WillOnce(RunClosure()); 787 .WillOnce(RunClosure());
777 788
778 EXPECT_CALL(*mocks_->demuxer(), Seek(seek_time, _)) 789 EXPECT_CALL(*mocks_->demuxer(), Seek(seek_time, _))
779 .WillOnce(RunPipelineStatusCB1WithStatus(PIPELINE_ERROR_READ)); 790 .WillOnce(RunPipelineStatusCBWithStatus(PIPELINE_ERROR_READ));
780 EXPECT_CALL(*mocks_->demuxer(), Stop(_)) 791 EXPECT_CALL(*mocks_->demuxer(), Stop(_))
781 .WillOnce(RunClosure()); 792 .WillOnce(RunClosure());
782 793
783 pipeline_->Seek(seek_time, base::Bind(&CallbackHelper::OnSeek, 794 pipeline_->Seek(seek_time, base::Bind(&CallbackHelper::OnSeek,
784 base::Unretained(&callbacks_))); 795 base::Unretained(&callbacks_)));
785 EXPECT_CALL(callbacks_, OnSeek(PIPELINE_ERROR_READ)); 796 EXPECT_CALL(callbacks_, OnSeek(PIPELINE_ERROR_READ));
786 message_loop_.RunAllPending(); 797 message_loop_.RunAllPending();
787 } 798 }
788 799
789 TEST_F(PipelineTest, StartTimeIsZero) { 800 TEST_F(PipelineTest, StartTimeIsZero) {
(...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after
856 base::TimeDelta::FromMilliseconds(500)); 867 base::TimeDelta::FromMilliseconds(500));
857 868
858 base::TimeDelta seek_time = base::TimeDelta::FromSeconds(5); 869 base::TimeDelta seek_time = base::TimeDelta::FromSeconds(5);
859 870
860 // Arrange to trigger a time update while the demuxer is in the middle of 871 // Arrange to trigger a time update while the demuxer is in the middle of
861 // seeking. This update should be ignored by the pipeline and the clock should 872 // seeking. This update should be ignored by the pipeline and the clock should
862 // not get updated. 873 // not get updated.
863 base::Closure closure = base::Bind(&RunTimeCB, audio_time_cb_, 300, 700); 874 base::Closure closure = base::Bind(&RunTimeCB, audio_time_cb_, 300, 700);
864 EXPECT_CALL(*mocks_->demuxer(), Seek(seek_time, _)) 875 EXPECT_CALL(*mocks_->demuxer(), Seek(seek_time, _))
865 .WillOnce(DoAll(InvokeWithoutArgs(&closure, &base::Closure::Run), 876 .WillOnce(DoAll(InvokeWithoutArgs(&closure, &base::Closure::Run),
866 RunPipelineStatusCB1())); 877 RunPipelineStatusCB()));
867 878
868 EXPECT_CALL(*mocks_->audio_renderer(), Pause(_)) 879 EXPECT_CALL(*mocks_->audio_renderer(), Pause(_))
869 .WillOnce(RunClosure()); 880 .WillOnce(RunClosure());
870 EXPECT_CALL(*mocks_->audio_renderer(), Flush(_)) 881 EXPECT_CALL(*mocks_->audio_renderer(), Flush(_))
871 .WillOnce(RunClosure()); 882 .WillOnce(RunClosure());
872 EXPECT_CALL(*mocks_->audio_renderer(), Preroll(seek_time, _)) 883 EXPECT_CALL(*mocks_->audio_renderer(), Preroll(seek_time, _))
873 .WillOnce(RunPipelineStatusCB1()); 884 .WillOnce(RunPipelineStatusCB());
874 EXPECT_CALL(*mocks_->audio_renderer(), Play(_)) 885 EXPECT_CALL(*mocks_->audio_renderer(), Play(_))
875 .WillOnce(RunClosure()); 886 .WillOnce(RunClosure());
876 887
877 EXPECT_CALL(callbacks_, OnSeek(PIPELINE_OK)); 888 EXPECT_CALL(callbacks_, OnSeek(PIPELINE_OK));
878 DoSeek(seek_time); 889 DoSeek(seek_time);
879 890
880 EXPECT_EQ(pipeline_->GetMediaTime(), seek_time); 891 EXPECT_EQ(pipeline_->GetMediaTime(), seek_time);
881 892
882 // Now that the seek is complete, verify that time updates advance the current 893 // Now that the seek is complete, verify that time updates advance the current
883 // time. 894 // time.
884 base::TimeDelta new_time = seek_time + base::TimeDelta::FromMilliseconds(100); 895 base::TimeDelta new_time = seek_time + base::TimeDelta::FromMilliseconds(100);
885 audio_time_cb_.Run(new_time, new_time); 896 audio_time_cb_.Run(new_time, new_time);
886 897
887 EXPECT_EQ(pipeline_->GetMediaTime(), new_time); 898 EXPECT_EQ(pipeline_->GetMediaTime(), new_time);
888 } 899 }
889 900
890 TEST_F(PipelineTest, InitFailure_Demuxer) { 901 TEST_F(PipelineTest, InitFailure_Demuxer) {
891 PipelineStatus expected_status = DEMUXER_ERROR_COULD_NOT_OPEN; 902 PipelineStatus expected_status = DEMUXER_ERROR_COULD_NOT_OPEN;
892 EXPECT_CALL(*mocks_->demuxer(), Initialize(_, _)) 903 EXPECT_CALL(*mocks_->demuxer(), Initialize(_, _))
893 .WillOnce(RunPipelineStatusCB1WithStatus(expected_status)); 904 .WillOnce(RunPipelineStatusCBWithStatus(expected_status));
894 EXPECT_CALL(*mocks_->demuxer(), Stop(_)) 905 EXPECT_CALL(*mocks_->demuxer(), Stop(_))
895 .WillOnce(RunClosure()); 906 .WillOnce(RunClosure());
896 InitializePipeline(expected_status); 907 InitializePipeline(expected_status);
897 EXPECT_FALSE(pipeline_->IsInitialized()); 908 EXPECT_FALSE(pipeline_->IsInitialized());
898 } 909 }
899 910
900 TEST_F(PipelineTest, InitFailure_AudioDecoder) { 911 TEST_F(PipelineTest, InitFailure_AudioDecoder) {
901 CreateAudioStream(); 912 CreateAudioStream();
902 MockDemuxerStreamVector streams; 913 MockDemuxerStreamVector streams;
903 streams.push_back(audio_stream()); 914 streams.push_back(audio_stream());
904 915
905 InitializeDemuxer(&streams); 916 InitializeDemuxer(&streams);
906 917
907 PipelineStatus expected_status = PIPELINE_ERROR_DECODE; 918 PipelineStatus expected_status = PIPELINE_ERROR_DECODE;
908 scoped_refptr<DemuxerStream> stream = streams[0]; 919 scoped_refptr<DemuxerStream> stream = streams[0];
909 EXPECT_CALL(*mocks_->audio_decoder(), Initialize(stream, _, _)) 920 EXPECT_CALL(*mocks_->audio_decoder(), Initialize(stream, _, _))
910 .WillOnce(RunPipelineStatusCB1WithStatus(expected_status)); 921 .WillOnce(RunPipelineStatusCBWithStatus(expected_status));
911 922
912 EXPECT_CALL(*mocks_->demuxer(), Stop(_)) 923 EXPECT_CALL(*mocks_->demuxer(), Stop(_))
913 .WillOnce(RunClosure()); 924 .WillOnce(RunClosure());
914 925
915 InitializePipeline(expected_status); 926 InitializePipeline(expected_status);
916 EXPECT_FALSE(pipeline_->IsInitialized()); 927 EXPECT_FALSE(pipeline_->IsInitialized());
917 EXPECT_FALSE(pipeline_->HasAudio()); 928 EXPECT_FALSE(pipeline_->HasAudio());
918 } 929 }
919 930
920 TEST_F(PipelineTest, InitFailure_AudioRenderer) { 931 TEST_F(PipelineTest, InitFailure_AudioRenderer) {
921 CreateAudioStream(); 932 CreateAudioStream();
922 MockDemuxerStreamVector streams; 933 MockDemuxerStreamVector streams;
923 streams.push_back(audio_stream()); 934 streams.push_back(audio_stream());
924 935
925 InitializeDemuxer(&streams); 936 InitializeDemuxer(&streams);
926 InitializeAudioDecoder(audio_stream()); 937 InitializeAudioDecoder(audio_stream());
927 938
928 PipelineStatus expected_status = PIPELINE_ERROR_INITIALIZATION_FAILED; 939 PipelineStatus expected_status = PIPELINE_ERROR_INITIALIZATION_FAILED;
929 EXPECT_CALL(*mocks_->audio_renderer(), Initialize( 940 EXPECT_CALL(*mocks_->audio_renderer(), Initialize(
930 scoped_refptr<AudioDecoder>(mocks_->audio_decoder()), 941 scoped_refptr<AudioDecoder>(mocks_->audio_decoder()),
931 _, _, _, _, _, _)) 942 _, _, _, _, _, _))
932 .WillOnce(RunPipelineStatusCB1WithStatus(expected_status)); 943 .WillOnce(RunPipelineStatusCBWithStatus(expected_status));
933 944
934 EXPECT_CALL(*mocks_->demuxer(), Stop(_)) 945 EXPECT_CALL(*mocks_->demuxer(), Stop(_))
935 .WillOnce(RunClosure()); 946 .WillOnce(RunClosure());
936 EXPECT_CALL(*mocks_->audio_renderer(), Stop(_)) 947 EXPECT_CALL(*mocks_->audio_renderer(), Stop(_))
937 .WillOnce(RunClosure()); 948 .WillOnce(RunClosure());
938 949
939 InitializePipeline(expected_status); 950 InitializePipeline(expected_status);
940 EXPECT_FALSE(pipeline_->IsInitialized()); 951 EXPECT_FALSE(pipeline_->IsInitialized());
941 EXPECT_TRUE(pipeline_->HasAudio()); 952 EXPECT_TRUE(pipeline_->HasAudio());
942 } 953 }
943 954
944 TEST_F(PipelineTest, InitFailure_VideoDecoder) { 955 TEST_F(PipelineTest, InitFailure_VideoDecoder) {
945 CreateAudioStream(); 956 CreateAudioStream();
946 CreateVideoStream(); 957 CreateVideoStream();
947 MockDemuxerStreamVector streams; 958 MockDemuxerStreamVector streams;
948 streams.push_back(audio_stream()); 959 streams.push_back(audio_stream());
949 streams.push_back(video_stream()); 960 streams.push_back(video_stream());
950 961
951 InitializeDemuxer(&streams); 962 InitializeDemuxer(&streams);
952 InitializeAudioDecoder(audio_stream()); 963 InitializeAudioDecoder(audio_stream());
953 InitializeAudioRenderer(); 964 InitializeAudioRenderer();
954 965
955 PipelineStatus expected_status = PIPELINE_ERROR_DECODE; 966 PipelineStatus expected_status = PIPELINE_ERROR_DECODE;
956 scoped_refptr<DemuxerStream> stream = streams[1]; 967 scoped_refptr<DemuxerStream> stream = streams[1];
957 EXPECT_CALL(*mocks_->video_decoder(), 968 EXPECT_CALL(*mocks_->video_decoder(),
958 Initialize(stream, _, _)) 969 Initialize(stream, _, _))
959 .WillOnce(RunPipelineStatusCB1WithStatus(expected_status)); 970 .WillOnce(RunPipelineStatusCBWithStatus(expected_status));
960 971
961 EXPECT_CALL(*mocks_->demuxer(), Stop(_)) 972 EXPECT_CALL(*mocks_->demuxer(), Stop(_))
962 .WillOnce(RunClosure()); 973 .WillOnce(RunClosure());
963 EXPECT_CALL(*mocks_->audio_renderer(), Stop(_)) 974 EXPECT_CALL(*mocks_->audio_renderer(), Stop(_))
964 .WillOnce(RunClosure()); 975 .WillOnce(RunClosure());
965 976
966 InitializePipeline(expected_status); 977 InitializePipeline(expected_status);
967 EXPECT_FALSE(pipeline_->IsInitialized()); 978 EXPECT_FALSE(pipeline_->IsInitialized());
968 EXPECT_TRUE(pipeline_->HasAudio()); 979 EXPECT_TRUE(pipeline_->HasAudio());
969 EXPECT_FALSE(pipeline_->HasVideo()); 980 EXPECT_FALSE(pipeline_->HasVideo());
970 } 981 }
971 982
972 TEST_F(PipelineTest, InitFailure_VideoRenderer) { 983 TEST_F(PipelineTest, InitFailure_VideoRenderer) {
973 CreateAudioStream(); 984 CreateAudioStream();
974 CreateVideoStream(); 985 CreateVideoStream();
975 MockDemuxerStreamVector streams; 986 MockDemuxerStreamVector streams;
976 streams.push_back(audio_stream()); 987 streams.push_back(audio_stream());
977 streams.push_back(video_stream()); 988 streams.push_back(video_stream());
978 989
979 InitializeDemuxer(&streams); 990 InitializeDemuxer(&streams);
980 InitializeAudioDecoder(audio_stream()); 991 InitializeAudioDecoder(audio_stream());
981 InitializeAudioRenderer(); 992 InitializeAudioRenderer();
982 InitializeVideoDecoder(video_stream()); 993 InitializeVideoDecoder(video_stream());
983 994
984 PipelineStatus expected_status = PIPELINE_ERROR_INITIALIZATION_FAILED; 995 PipelineStatus expected_status = PIPELINE_ERROR_INITIALIZATION_FAILED;
985 EXPECT_CALL(*mocks_->video_renderer(), Initialize( 996 EXPECT_CALL(*mocks_->video_renderer(), Initialize(
986 scoped_refptr<VideoDecoder>(mocks_->video_decoder()), 997 scoped_refptr<VideoDecoder>(mocks_->video_decoder()),
987 _, _, _, _, _, _, _, _)) 998 _, _, _, _, _, _, _, _))
988 .WillOnce(RunPipelineStatusCB1WithStatus(expected_status)); 999 .WillOnce(RunPipelineStatusCBWithStatus(expected_status));
989 1000
990 EXPECT_CALL(*mocks_->demuxer(), Stop(_)) 1001 EXPECT_CALL(*mocks_->demuxer(), Stop(_))
991 .WillOnce(RunClosure()); 1002 .WillOnce(RunClosure());
992 EXPECT_CALL(*mocks_->audio_renderer(), Stop(_)) 1003 EXPECT_CALL(*mocks_->audio_renderer(), Stop(_))
993 .WillOnce(RunClosure()); 1004 .WillOnce(RunClosure());
994 EXPECT_CALL(*mocks_->video_renderer(), Stop(_)) 1005 EXPECT_CALL(*mocks_->video_renderer(), Stop(_))
995 .WillOnce(RunClosure()); 1006 .WillOnce(RunClosure());
996 1007
997 InitializePipeline(expected_status); 1008 InitializePipeline(expected_status);
998 EXPECT_FALSE(pipeline_->IsInitialized()); 1009 EXPECT_FALSE(pipeline_->IsInitialized());
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after
1046 TEST(PipelineStatusNotificationTest, ImmediateCallback) { 1057 TEST(PipelineStatusNotificationTest, ImmediateCallback) {
1047 TestPipelineStatusNotification(base::TimeDelta::FromMilliseconds(0)); 1058 TestPipelineStatusNotification(base::TimeDelta::FromMilliseconds(0));
1048 } 1059 }
1049 1060
1050 // Test that different-thread, some-delay callback (the expected common case) 1061 // Test that different-thread, some-delay callback (the expected common case)
1051 // works correctly. 1062 // works correctly.
1052 TEST(PipelineStatusNotificationTest, DelayedCallback) { 1063 TEST(PipelineStatusNotificationTest, DelayedCallback) {
1053 TestPipelineStatusNotification(base::TimeDelta::FromMilliseconds(20)); 1064 TestPipelineStatusNotification(base::TimeDelta::FromMilliseconds(20));
1054 } 1065 }
1055 1066
1067 class PipelineTeardownTest : public PipelineTest {
1068 public:
1069 enum TeardownState {
1070 kPausing,
1071 kFlushing,
1072 kSeeking,
1073 kPrerolling,
1074 kStarting,
1075 kPlaying,
1076 };
1077
1078 enum StopOrError {
1079 kStop,
1080 kError,
1081 };
1082
1083 PipelineTeardownTest() {
1084 CreateAudioStream();
1085 MockDemuxerStreamVector streams;
1086 streams.push_back(audio_stream());
1087
1088 InitializeDemuxer(&streams, base::TimeDelta::FromSeconds(3000));
1089 InitializeAudioDecoder(audio_stream());
1090 InitializeAudioRenderer();
1091 InitializePipeline(PIPELINE_OK);
1092 }
1093
1094 void RunTest(TeardownState state, StopOrError stop_or_error) {
1095 InSequence s;
1096 switch (state) {
1097 case kPausing:
1098 case kFlushing:
1099 case kSeeking:
1100 case kPrerolling:
1101 case kStarting:
1102 if (stop_or_error == kStop) {
1103 ExpectSeekStop(state);
1104 } else {
1105 ExpectSeekError(state);
1106 }
1107 DoSeek();
1108 break;
1109
1110 case kPlaying:
1111 if (stop_or_error == kStop) {
1112 ExpectStop();
1113 DoStop();
1114 } else {
1115 ExpectPlaybackError();
1116 DoPlaybackError();
1117 }
1118 break;
1119 }
1120 }
1121
1122 private:
1123 // TODO(scherkus): We do radically different things whether teardown is
1124 // invoked via stop vs error. The teardown path should be the same,
1125 // see http://crbug.com/110228
1126 void ExpectSeekStop(TeardownState state) {
1127 base::Closure stop_cb = base::Bind(
1128 &CallbackHelper::OnStop, base::Unretained(&callbacks_));
1129
1130 if (state == kPausing) {
1131 EXPECT_CALL(*mocks_->audio_renderer(), Pause(_))
1132 .WillOnce(DoAll(Stop(pipeline_, stop_cb), RunClosure()));
1133 } else {
1134 EXPECT_CALL(*mocks_->audio_renderer(), Pause(_)).WillOnce(RunClosure());
1135 }
1136
1137 if (state == kFlushing) {
1138 EXPECT_CALL(*mocks_->audio_renderer(), Flush(_))
1139 .WillOnce(DoAll(Stop(pipeline_, stop_cb), RunClosure()));
1140 } else {
1141 EXPECT_CALL(*mocks_->audio_renderer(), Flush(_)).WillOnce(RunClosure());
1142 }
1143
1144 if (state == kSeeking) {
1145 EXPECT_CALL(*mocks_->demuxer(), Seek(_, _))
1146 .WillOnce(DoAll(Stop(pipeline_, stop_cb), RunPipelineStatusCB()));
1147 } else {
1148 EXPECT_CALL(*mocks_->demuxer(), Seek(_, _))
1149 .WillOnce(RunPipelineStatusCB());
1150 }
1151
1152 if (state == kPrerolling) {
1153 EXPECT_CALL(*mocks_->audio_renderer(), Preroll(_, _))
1154 .WillOnce(DoAll(Stop(pipeline_, stop_cb), RunPipelineStatusCB()));
1155 } else {
1156 EXPECT_CALL(*mocks_->audio_renderer(), Preroll(_, _))
1157 .WillOnce(RunPipelineStatusCB());
1158 }
1159
1160 if (state == kStarting) {
1161 EXPECT_CALL(*mocks_->audio_renderer(), Play(_))
1162 .WillOnce(DoAll(Stop(pipeline_, stop_cb), RunClosure()));
1163 } else {
1164 EXPECT_CALL(*mocks_->audio_renderer(), Play(_)).WillOnce(RunClosure());
1165 }
1166
1167 EXPECT_CALL(callbacks_, OnSeek(PIPELINE_OK));
1168 ExpectStop();
1169 }
1170
1171 void ExpectSeekError(TeardownState state) {
1172 SetSeekErrorExpectations(state);
1173
1174 // Executed after the error is raised.
1175 EXPECT_CALL(callbacks_, OnSeek(PIPELINE_ERROR_READ));
1176 EXPECT_CALL(*mocks_->demuxer(), Stop(_)).WillOnce(RunClosure());
1177 EXPECT_CALL(*mocks_->audio_renderer(), Stop(_)).WillOnce(RunClosure());
1178 }
1179
1180 void SetSeekErrorExpectations(TeardownState state) {
1181 if (state == kPausing) {
1182 EXPECT_CALL(*mocks_->audio_renderer(), Pause(_))
1183 .WillOnce(DoAll(SetError(pipeline_, PIPELINE_ERROR_READ),
1184 RunClosure()));
1185 return;
1186 }
1187
1188 EXPECT_CALL(*mocks_->audio_renderer(), Pause(_)).WillOnce(RunClosure());
1189
1190 if (state == kFlushing) {
1191 EXPECT_CALL(*mocks_->audio_renderer(), Flush(_))
1192 .WillOnce(DoAll(SetError(pipeline_, PIPELINE_ERROR_READ),
1193 RunClosure()));
1194 return;
1195 }
1196
1197 EXPECT_CALL(*mocks_->audio_renderer(), Flush(_)).WillOnce(RunClosure());
1198
1199 if (state == kSeeking) {
1200 EXPECT_CALL(*mocks_->demuxer(), Seek(_, _))
1201 .WillOnce(RunPipelineStatusCBWithStatus(PIPELINE_ERROR_READ));
1202 return;
1203 }
1204
1205 EXPECT_CALL(*mocks_->demuxer(), Seek(_, _))
1206 .WillOnce(RunPipelineStatusCB());
1207
1208 if (state == kPrerolling) {
1209 EXPECT_CALL(*mocks_->audio_renderer(), Preroll(_, _))
1210 .WillOnce(RunPipelineStatusCBWithStatus(PIPELINE_ERROR_READ));
1211 return;
1212 }
1213
1214 EXPECT_CALL(*mocks_->audio_renderer(), Preroll(_, _))
1215 .WillOnce(RunPipelineStatusCB());
1216
1217 if (state == kStarting) {
1218 EXPECT_CALL(*mocks_->audio_renderer(), Play(_))
1219 .WillOnce(DoAll(SetError(pipeline_, PIPELINE_ERROR_READ),
1220 RunClosure()));
1221 return;
1222 }
1223
1224 NOTREACHED() << "Unexpected TeardownState: " << state;
1225 }
1226
1227 void ExpectStop() {
1228 // TODO(scherkus): Don't pause+flush, see http://crbug.com/110228
1229 EXPECT_CALL(*mocks_->audio_renderer(), Pause(_)).WillOnce(RunClosure());
1230 EXPECT_CALL(*mocks_->audio_renderer(), Flush(_)).WillOnce(RunClosure());
1231 EXPECT_CALL(*mocks_->demuxer(), Stop(_)).WillOnce(RunClosure());
1232 EXPECT_CALL(*mocks_->audio_renderer(), Stop(_)).WillOnce(RunClosure());
1233
1234 EXPECT_CALL(callbacks_, OnStop());
1235 }
1236
1237 void ExpectPlaybackError() {
1238 // TODO(scherkus): Don't pause+flush, see http://crbug.com/110228
1239 EXPECT_CALL(*mocks_->audio_renderer(), Pause(_)).WillOnce(RunClosure());
1240 EXPECT_CALL(*mocks_->audio_renderer(), Flush(_)).WillOnce(RunClosure());
1241 EXPECT_CALL(*mocks_->demuxer(), Stop(_)).WillOnce(RunClosure());
1242 EXPECT_CALL(*mocks_->audio_renderer(), Stop(_)).WillOnce(RunClosure());
1243
1244 EXPECT_CALL(callbacks_, OnError(PIPELINE_ERROR_READ));
1245 }
1246
1247 void DoSeek() {
1248 pipeline_->Seek(base::TimeDelta::FromSeconds(10), base::Bind(
1249 &CallbackHelper::OnSeek, base::Unretained(&callbacks_)));
1250 message_loop_.RunAllPending();
1251 }
1252
1253 void DoStop() {
1254 pipeline_->Stop(base::Bind(
1255 &CallbackHelper::OnStop, base::Unretained(&callbacks_)));
1256 message_loop_.RunAllPending();
1257 }
1258
1259 void DoPlaybackError() {
1260 pipeline_->SetErrorForTesting(PIPELINE_ERROR_READ);
1261 message_loop_.RunAllPending();
1262 }
1263
1264 DISALLOW_COPY_AND_ASSIGN(PipelineTeardownTest);
1265 };
1266
1267 #define INSTANTIATE_TEARDOWN_TEST(stop_or_error, state) \
1268 TEST_F(PipelineTeardownTest, stop_or_error##_##state) { \
1269 RunTest(k##state, k##stop_or_error); \
1270 }
1271
1272 INSTANTIATE_TEARDOWN_TEST(Stop, Pausing);
1273 INSTANTIATE_TEARDOWN_TEST(Stop, Flushing);
1274 INSTANTIATE_TEARDOWN_TEST(Stop, Seeking);
1275 INSTANTIATE_TEARDOWN_TEST(Stop, Prerolling);
1276 INSTANTIATE_TEARDOWN_TEST(Stop, Starting);
1277 INSTANTIATE_TEARDOWN_TEST(Stop, Playing);
1278
1279 INSTANTIATE_TEARDOWN_TEST(Error, Pausing);
1280 INSTANTIATE_TEARDOWN_TEST(Error, Flushing);
1281 INSTANTIATE_TEARDOWN_TEST(Error, Seeking);
1282 INSTANTIATE_TEARDOWN_TEST(Error, Prerolling);
1283 INSTANTIATE_TEARDOWN_TEST(Error, Starting);
1284 INSTANTIATE_TEARDOWN_TEST(Error, Playing);
1285
1056 } // namespace media 1286 } // namespace media
OLDNEW
« no previous file with comments | « media/base/pipeline.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698