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

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

Issue 10837206: Rewrite media::Pipeline state transition machinery and simplify shutdown. (Closed) Base URL: svn://chrome-svn/chrome/trunk/src
Patch Set: nits Created 8 years, 3 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_status.h ('k') | media/base/serial_runner.cc » ('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) 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"
(...skipping 95 matching lines...) Expand 10 before | Expand all | Expand 10 after
106 EXPECT_CALL(*mocks_->demuxer(), GetStartTime()) 106 EXPECT_CALL(*mocks_->demuxer(), GetStartTime())
107 .WillRepeatedly(Return(base::TimeDelta())); 107 .WillRepeatedly(Return(base::TimeDelta()));
108 } 108 }
109 109
110 virtual ~PipelineTest() { 110 virtual ~PipelineTest() {
111 // Shutdown sequence. 111 // Shutdown sequence.
112 if (pipeline_->IsRunning()) { 112 if (pipeline_->IsRunning()) {
113 EXPECT_CALL(*mocks_->demuxer(), Stop(_)) 113 EXPECT_CALL(*mocks_->demuxer(), Stop(_))
114 .WillOnce(RunClosure()); 114 .WillOnce(RunClosure());
115 115
116 // TODO(scherkus): Don't pause+flush on shutdown, 116 if (audio_stream_)
117 // see http://crbug.com/110228 117 EXPECT_CALL(*mocks_->audio_renderer(), Stop(_)).WillOnce(RunClosure());
118 if (audio_stream_) {
119 EXPECT_CALL(*mocks_->audio_renderer(), Pause(_))
120 .WillOnce(RunClosure());
121 EXPECT_CALL(*mocks_->audio_renderer(), Flush(_))
122 .WillOnce(RunClosure());
123 EXPECT_CALL(*mocks_->audio_renderer(), Stop(_))
124 .WillOnce(RunClosure());
125 }
126 118
127 if (video_stream_) { 119 if (video_stream_)
128 EXPECT_CALL(*mocks_->video_renderer(), Pause(_)) 120 EXPECT_CALL(*mocks_->video_renderer(), Stop(_)).WillOnce(RunClosure());
129 .WillOnce(RunClosure());
130 EXPECT_CALL(*mocks_->video_renderer(), Flush(_))
131 .WillOnce(RunClosure());
132 EXPECT_CALL(*mocks_->video_renderer(), Stop(_))
133 .WillOnce(RunClosure());
134 }
135 } 121 }
136 122
137 // Expect a stop callback if we were started. 123 // Expect a stop callback if we were started.
138 EXPECT_CALL(callbacks_, OnStop()); 124 EXPECT_CALL(callbacks_, OnStop());
139 pipeline_->Stop(base::Bind(&CallbackHelper::OnStop, 125 pipeline_->Stop(base::Bind(&CallbackHelper::OnStop,
140 base::Unretained(&callbacks_))); 126 base::Unretained(&callbacks_)));
141 message_loop_.RunAllPending(); 127 message_loop_.RunAllPending();
142 128
143 pipeline_ = NULL; 129 pipeline_ = NULL;
144 mocks_.reset(); 130 mocks_.reset();
(...skipping 114 matching lines...) Expand 10 before | Expand all | Expand 10 after
259 } 245 }
260 246
261 MockDemuxerStream* video_stream() { 247 MockDemuxerStream* video_stream() {
262 return video_stream_; 248 return video_stream_;
263 } 249 }
264 250
265 void ExpectSeek(const base::TimeDelta& seek_time) { 251 void ExpectSeek(const base::TimeDelta& seek_time) {
266 // Every filter should receive a call to Seek(). 252 // Every filter should receive a call to Seek().
267 EXPECT_CALL(*mocks_->demuxer(), Seek(seek_time, _)) 253 EXPECT_CALL(*mocks_->demuxer(), Seek(seek_time, _))
268 .WillOnce(RunPipelineStatusCB()); 254 .WillOnce(RunPipelineStatusCB());
255 EXPECT_CALL(*mocks_->demuxer(), SetPlaybackRate(_));
269 256
270 if (audio_stream_) { 257 if (audio_stream_) {
271 EXPECT_CALL(*mocks_->audio_renderer(), Pause(_)) 258 EXPECT_CALL(*mocks_->audio_renderer(), Pause(_))
272 .WillOnce(RunClosure()); 259 .WillOnce(RunClosure());
273 EXPECT_CALL(*mocks_->audio_renderer(), Flush(_)) 260 EXPECT_CALL(*mocks_->audio_renderer(), Flush(_))
274 .WillOnce(RunClosure()); 261 .WillOnce(RunClosure());
275 EXPECT_CALL(*mocks_->audio_renderer(), Preroll(seek_time, _)) 262 EXPECT_CALL(*mocks_->audio_renderer(), Preroll(seek_time, _))
276 .WillOnce(RunPipelineStatusCB()); 263 .WillOnce(RunPipelineStatusCB());
264 EXPECT_CALL(*mocks_->audio_renderer(), SetPlaybackRate(_));
265 EXPECT_CALL(*mocks_->audio_renderer(), SetVolume(_));
277 EXPECT_CALL(*mocks_->audio_renderer(), Play(_)) 266 EXPECT_CALL(*mocks_->audio_renderer(), Play(_))
278 .WillOnce(RunClosure()); 267 .WillOnce(RunClosure());
279 } 268 }
280 269
281 if (video_stream_) { 270 if (video_stream_) {
282 EXPECT_CALL(*mocks_->video_renderer(), Pause(_)) 271 EXPECT_CALL(*mocks_->video_renderer(), Pause(_))
283 .WillOnce(RunClosure()); 272 .WillOnce(RunClosure());
284 EXPECT_CALL(*mocks_->video_renderer(), Flush(_)) 273 EXPECT_CALL(*mocks_->video_renderer(), Flush(_))
285 .WillOnce(RunClosure()); 274 .WillOnce(RunClosure());
286 EXPECT_CALL(*mocks_->video_renderer(), Preroll(seek_time, _)) 275 EXPECT_CALL(*mocks_->video_renderer(), Preroll(seek_time, _))
287 .WillOnce(RunPipelineStatusCB()); 276 .WillOnce(RunPipelineStatusCB());
277 EXPECT_CALL(*mocks_->video_renderer(), SetPlaybackRate(_));
288 EXPECT_CALL(*mocks_->video_renderer(), Play(_)) 278 EXPECT_CALL(*mocks_->video_renderer(), Play(_))
289 .WillOnce(RunClosure()); 279 .WillOnce(RunClosure());
290 } 280 }
291 281
292 EXPECT_CALL(callbacks_, OnBufferingState(Pipeline::kPrerollCompleted)); 282 EXPECT_CALL(callbacks_, OnBufferingState(Pipeline::kPrerollCompleted));
293 283
294 // We expect a successful seek callback. 284 // We expect a successful seek callback.
295 EXPECT_CALL(callbacks_, OnSeek(PIPELINE_OK)); 285 EXPECT_CALL(callbacks_, OnSeek(PIPELINE_OK));
296 } 286 }
297 287
(...skipping 75 matching lines...) Expand 10 before | Expand all | Expand 10 after
373 message_loop_.RunAllPending(); 363 message_loop_.RunAllPending();
374 364
375 365
376 // Because our callback will get executed when the test tears down, we'll 366 // Because our callback will get executed when the test tears down, we'll
377 // verify that nothing has been called, then set our expectation for the call 367 // verify that nothing has been called, then set our expectation for the call
378 // made during tear down. 368 // made during tear down.
379 Mock::VerifyAndClear(&callbacks_); 369 Mock::VerifyAndClear(&callbacks_);
380 EXPECT_CALL(callbacks_, OnStart(PIPELINE_OK)); 370 EXPECT_CALL(callbacks_, OnStart(PIPELINE_OK));
381 } 371 }
382 372
383 TEST_F(PipelineTest, RequiredFilterMissing) {
384 // Create a filter collection with missing filter.
385 scoped_ptr<FilterCollection> collection(mocks_->Create());
386 collection->SetDemuxer(NULL);
387
388 EXPECT_CALL(callbacks_, OnStart(PIPELINE_ERROR_REQUIRED_FILTER_MISSING));
389 pipeline_->Start(
390 collection.Pass(),
391 base::Bind(&CallbackHelper::OnEnded, base::Unretained(&callbacks_)),
392 base::Bind(&CallbackHelper::OnError, base::Unretained(&callbacks_)),
393 base::Bind(&CallbackHelper::OnStart, base::Unretained(&callbacks_)),
394 base::Bind(&CallbackHelper::OnBufferingState,
395 base::Unretained(&callbacks_)));
396 message_loop_.RunAllPending();
397 }
398
399 TEST_F(PipelineTest, URLNotFound) { 373 TEST_F(PipelineTest, URLNotFound) {
400 EXPECT_CALL(*mocks_->demuxer(), Initialize(_, _)) 374 EXPECT_CALL(*mocks_->demuxer(), Initialize(_, _))
401 .WillOnce(RunPipelineStatusCBWithStatus(PIPELINE_ERROR_URL_NOT_FOUND)); 375 .WillOnce(RunPipelineStatusCBWithStatus(PIPELINE_ERROR_URL_NOT_FOUND));
402 EXPECT_CALL(*mocks_->demuxer(), Stop(_)) 376 EXPECT_CALL(*mocks_->demuxer(), Stop(_))
403 .WillOnce(RunClosure()); 377 .WillOnce(RunClosure());
404 378
405 InitializePipeline(PIPELINE_ERROR_URL_NOT_FOUND); 379 InitializePipeline(PIPELINE_ERROR_URL_NOT_FOUND);
406 } 380 }
407 381
408 TEST_F(PipelineTest, NoStreams) { 382 TEST_F(PipelineTest, NoStreams) {
(...skipping 294 matching lines...) Expand 10 before | Expand all | Expand 10 after
703 InitializePipeline(PIPELINE_OK); 677 InitializePipeline(PIPELINE_OK);
704 678
705 float playback_rate = 1.0f; 679 float playback_rate = 1.0f;
706 EXPECT_CALL(*mocks_->demuxer(), SetPlaybackRate(playback_rate)); 680 EXPECT_CALL(*mocks_->demuxer(), SetPlaybackRate(playback_rate));
707 EXPECT_CALL(*mocks_->audio_renderer(), SetPlaybackRate(playback_rate)); 681 EXPECT_CALL(*mocks_->audio_renderer(), SetPlaybackRate(playback_rate));
708 pipeline_->SetPlaybackRate(playback_rate); 682 pipeline_->SetPlaybackRate(playback_rate);
709 message_loop_.RunAllPending(); 683 message_loop_.RunAllPending();
710 684
711 base::TimeDelta seek_time = base::TimeDelta::FromSeconds(5); 685 base::TimeDelta seek_time = base::TimeDelta::FromSeconds(5);
712 686
713 // Seek() isn't called as the demuxer errors out first. 687 // Preroll() isn't called as the demuxer errors out first.
714 EXPECT_CALL(*mocks_->audio_renderer(), Pause(_)) 688 EXPECT_CALL(*mocks_->audio_renderer(), Pause(_))
715 .WillOnce(RunClosure()); 689 .WillOnce(RunClosure());
716 EXPECT_CALL(*mocks_->audio_renderer(), Flush(_)) 690 EXPECT_CALL(*mocks_->audio_renderer(), Flush(_))
717 .WillOnce(RunClosure()); 691 .WillOnce(RunClosure());
718 EXPECT_CALL(*mocks_->audio_renderer(), Stop(_)) 692 EXPECT_CALL(*mocks_->audio_renderer(), Stop(_))
719 .WillOnce(RunClosure()); 693 .WillOnce(RunClosure());
720 694
721 EXPECT_CALL(*mocks_->demuxer(), Seek(seek_time, _)) 695 EXPECT_CALL(*mocks_->demuxer(), Seek(seek_time, _))
722 .WillOnce(RunPipelineStatusCBWithStatus(PIPELINE_ERROR_READ)); 696 .WillOnce(RunPipelineStatusCBWithStatus(PIPELINE_ERROR_READ));
723 EXPECT_CALL(*mocks_->demuxer(), Stop(_)) 697 EXPECT_CALL(*mocks_->demuxer(), Stop(_))
(...skipping 135 matching lines...) Expand 10 before | Expand all | Expand 10 after
859 EXPECT_CALL(*mocks_->demuxer(), Seek(seek_time, _)) 833 EXPECT_CALL(*mocks_->demuxer(), Seek(seek_time, _))
860 .WillOnce(DoAll(InvokeWithoutArgs(&closure, &base::Closure::Run), 834 .WillOnce(DoAll(InvokeWithoutArgs(&closure, &base::Closure::Run),
861 RunPipelineStatusCB())); 835 RunPipelineStatusCB()));
862 836
863 EXPECT_CALL(*mocks_->audio_renderer(), Pause(_)) 837 EXPECT_CALL(*mocks_->audio_renderer(), Pause(_))
864 .WillOnce(RunClosure()); 838 .WillOnce(RunClosure());
865 EXPECT_CALL(*mocks_->audio_renderer(), Flush(_)) 839 EXPECT_CALL(*mocks_->audio_renderer(), Flush(_))
866 .WillOnce(RunClosure()); 840 .WillOnce(RunClosure());
867 EXPECT_CALL(*mocks_->audio_renderer(), Preroll(seek_time, _)) 841 EXPECT_CALL(*mocks_->audio_renderer(), Preroll(seek_time, _))
868 .WillOnce(RunPipelineStatusCB()); 842 .WillOnce(RunPipelineStatusCB());
843 EXPECT_CALL(*mocks_->demuxer(), SetPlaybackRate(_));
844 EXPECT_CALL(*mocks_->audio_renderer(), SetPlaybackRate(_));
845 EXPECT_CALL(*mocks_->audio_renderer(), SetVolume(_));
869 EXPECT_CALL(*mocks_->audio_renderer(), Play(_)) 846 EXPECT_CALL(*mocks_->audio_renderer(), Play(_))
870 .WillOnce(RunClosure()); 847 .WillOnce(RunClosure());
871 848
872 EXPECT_CALL(callbacks_, OnBufferingState(Pipeline::kPrerollCompleted)); 849 EXPECT_CALL(callbacks_, OnBufferingState(Pipeline::kPrerollCompleted));
873 EXPECT_CALL(callbacks_, OnSeek(PIPELINE_OK)); 850 EXPECT_CALL(callbacks_, OnSeek(PIPELINE_OK));
874 DoSeek(seek_time); 851 DoSeek(seek_time);
875 852
876 EXPECT_EQ(pipeline_->GetMediaTime(), seek_time); 853 EXPECT_EQ(pipeline_->GetMediaTime(), seek_time);
877 854
878 // Now that the seek is complete, verify that time updates advance the current 855 // Now that the seek is complete, verify that time updates advance the current
(...skipping 86 matching lines...) Expand 10 before | Expand all | Expand 10 after
965 case kInitAudioDecoder: 942 case kInitAudioDecoder:
966 case kInitAudioRenderer: 943 case kInitAudioRenderer:
967 case kInitVideoRenderer: 944 case kInitVideoRenderer:
968 DoInitialize(state, stop_or_error); 945 DoInitialize(state, stop_or_error);
969 break; 946 break;
970 947
971 case kPausing: 948 case kPausing:
972 case kFlushing: 949 case kFlushing:
973 case kSeeking: 950 case kSeeking:
974 case kPrerolling: 951 case kPrerolling:
975 case kStarting: { 952 case kStarting:
976 DoInitialize(state, stop_or_error); 953 DoInitialize(state, stop_or_error);
954 DoSeek(state, stop_or_error);
955 break;
977 956
978 InSequence s; 957 case kPlaying:
979 if (stop_or_error == kStop) { 958 DoInitialize(state, stop_or_error);
980 ExpectSeekStop(state); 959 DoStopOrError(stop_or_error);
981 } else {
982 ExpectSeekError(state);
983 }
984 DoSeek();
985 break; 960 break;
986 }
987
988 case kPlaying: {
989 DoInitialize(state, stop_or_error);
990
991 InSequence s;
992 if (stop_or_error == kStop) {
993 ExpectStop();
994 DoStop();
995 } else {
996 ExpectPlaybackError();
997 DoPlaybackError();
998 }
999 break;
1000 }
1001 } 961 }
1002 } 962 }
1003 963
1004 private: 964 private:
1005 // TODO(scherkus): We do radically different things whether teardown is 965 // TODO(scherkus): We do radically different things whether teardown is
1006 // invoked via stop vs error. The teardown path should be the same, 966 // invoked via stop vs error. The teardown path should be the same,
1007 // see http://crbug.com/110228 967 // see http://crbug.com/110228
1008 void DoInitialize(TeardownState state, StopOrError stop_or_error) { 968 void DoInitialize(TeardownState state, StopOrError stop_or_error) {
1009 PipelineStatus expected_status = 969 PipelineStatus expected_status =
1010 SetInitializeExpectations(state, stop_or_error); 970 SetInitializeExpectations(state, stop_or_error);
(...skipping 93 matching lines...) Expand 10 before | Expand all | Expand 10 after
1104 return status; 1064 return status;
1105 } 1065 }
1106 1066
1107 EXPECT_CALL(*mocks_->video_renderer(), 1067 EXPECT_CALL(*mocks_->video_renderer(),
1108 Initialize(_, _, _, _, _, _, _, _, _, _)) 1068 Initialize(_, _, _, _, _, _, _, _, _, _))
1109 .WillOnce(RunPipelineStatusCB2()); 1069 .WillOnce(RunPipelineStatusCB2());
1110 1070
1111 EXPECT_CALL(callbacks_, OnBufferingState(Pipeline::kHaveMetadata)); 1071 EXPECT_CALL(callbacks_, OnBufferingState(Pipeline::kHaveMetadata));
1112 1072
1113 // If we get here it's a successful initialization. 1073 // If we get here it's a successful initialization.
1114 EXPECT_CALL(*mocks_->demuxer(), SetPlaybackRate(0.0f));
1115 EXPECT_CALL(*mocks_->audio_renderer(), SetPlaybackRate(0.0f));
1116 EXPECT_CALL(*mocks_->video_renderer(), SetPlaybackRate(0.0f));
1117
1118 EXPECT_CALL(*mocks_->audio_renderer(), SetVolume(1.0f));
1119
1120 EXPECT_CALL(*mocks_->audio_renderer(), Preroll(base::TimeDelta(), _)) 1074 EXPECT_CALL(*mocks_->audio_renderer(), Preroll(base::TimeDelta(), _))
1121 .WillOnce(RunPipelineStatusCB()); 1075 .WillOnce(RunPipelineStatusCB());
1122 EXPECT_CALL(*mocks_->video_renderer(), Preroll(base::TimeDelta(), _)) 1076 EXPECT_CALL(*mocks_->video_renderer(), Preroll(base::TimeDelta(), _))
1123 .WillOnce(RunPipelineStatusCB()); 1077 .WillOnce(RunPipelineStatusCB());
1124 1078
1079 EXPECT_CALL(*mocks_->demuxer(), SetPlaybackRate(0.0f));
1080 EXPECT_CALL(*mocks_->audio_renderer(), SetPlaybackRate(0.0f));
1081 EXPECT_CALL(*mocks_->video_renderer(), SetPlaybackRate(0.0f));
1082 EXPECT_CALL(*mocks_->audio_renderer(), SetVolume(1.0f));
1083
1125 EXPECT_CALL(*mocks_->audio_renderer(), Play(_)) 1084 EXPECT_CALL(*mocks_->audio_renderer(), Play(_))
1126 .WillOnce(RunClosure()); 1085 .WillOnce(RunClosure());
1127 EXPECT_CALL(*mocks_->video_renderer(), Play(_)) 1086 EXPECT_CALL(*mocks_->video_renderer(), Play(_))
1128 .WillOnce(RunClosure()); 1087 .WillOnce(RunClosure());
1129 1088
1130 if (status == PIPELINE_OK) 1089 if (status == PIPELINE_OK)
1131 EXPECT_CALL(callbacks_, OnBufferingState(Pipeline::kPrerollCompleted)); 1090 EXPECT_CALL(callbacks_, OnBufferingState(Pipeline::kPrerollCompleted));
1132 1091
1133 return status; 1092 return status;
1134 } 1093 }
1135 1094
1136 void ExpectSeekStop(TeardownState state) { 1095 void DoSeek(TeardownState state, StopOrError stop_or_error) {
1096 InSequence s;
1097 PipelineStatus status = SetSeekExpectations(state, stop_or_error);
1098
1099 EXPECT_CALL(*mocks_->demuxer(), Stop(_)).WillOnce(RunClosure());
1100 EXPECT_CALL(*mocks_->audio_renderer(), Stop(_)).WillOnce(RunClosure());
1101 EXPECT_CALL(*mocks_->video_renderer(), Stop(_)).WillOnce(RunClosure());
1102 EXPECT_CALL(callbacks_, OnSeek(status));
1103
1104 if (status == PIPELINE_OK) {
1105 EXPECT_CALL(callbacks_, OnStop());
1106 }
1107
1108 pipeline_->Seek(base::TimeDelta::FromSeconds(10), base::Bind(
1109 &CallbackHelper::OnSeek, base::Unretained(&callbacks_)));
1110 message_loop_.RunAllPending();
1111 }
1112
1113 PipelineStatus SetSeekExpectations(TeardownState state,
1114 StopOrError stop_or_error) {
1115 PipelineStatus status = PIPELINE_OK;
1137 base::Closure stop_cb = base::Bind( 1116 base::Closure stop_cb = base::Bind(
1138 &CallbackHelper::OnStop, base::Unretained(&callbacks_)); 1117 &CallbackHelper::OnStop, base::Unretained(&callbacks_));
1139 1118
1140 if (state == kPausing) { 1119 if (state == kPausing) {
1141 EXPECT_CALL(*mocks_->audio_renderer(), Pause(_)) 1120 if (stop_or_error == kStop) {
1142 .WillOnce(DoAll(Stop(pipeline_, stop_cb), RunClosure())); 1121 EXPECT_CALL(*mocks_->audio_renderer(), Pause(_))
1143 } else { 1122 .WillOnce(DoAll(Stop(pipeline_, stop_cb), RunClosure()));
1144 EXPECT_CALL(*mocks_->audio_renderer(), Pause(_)).WillOnce(RunClosure()); 1123 } else {
1145 } 1124 status = PIPELINE_ERROR_READ;
1125 EXPECT_CALL(*mocks_->audio_renderer(), Pause(_))
1126 .WillOnce(DoAll(SetError(pipeline_, status), RunClosure()));
1127 }
1146 1128
1147 EXPECT_CALL(*mocks_->video_renderer(), Pause(_)).WillOnce(RunClosure()); 1129 return status;
1148
1149 if (state == kFlushing) {
1150 EXPECT_CALL(*mocks_->audio_renderer(), Flush(_))
1151 .WillOnce(DoAll(Stop(pipeline_, stop_cb), RunClosure()));
1152 } else {
1153 EXPECT_CALL(*mocks_->audio_renderer(), Flush(_)).WillOnce(RunClosure());
1154 }
1155
1156 EXPECT_CALL(*mocks_->video_renderer(), Flush(_)).WillOnce(RunClosure());
1157
1158 if (state == kSeeking) {
1159 EXPECT_CALL(*mocks_->demuxer(), Seek(_, _))
1160 .WillOnce(DoAll(Stop(pipeline_, stop_cb), RunPipelineStatusCB()));
1161 } else {
1162 EXPECT_CALL(*mocks_->demuxer(), Seek(_, _))
1163 .WillOnce(RunPipelineStatusCB());
1164 }
1165
1166 if (state == kPrerolling) {
1167 EXPECT_CALL(*mocks_->audio_renderer(), Preroll(_, _))
1168 .WillOnce(DoAll(Stop(pipeline_, stop_cb), RunPipelineStatusCB()));
1169 } else {
1170 EXPECT_CALL(*mocks_->audio_renderer(), Preroll(_, _))
1171 .WillOnce(RunPipelineStatusCB());
1172 }
1173
1174 EXPECT_CALL(*mocks_->video_renderer(), Preroll(_, _))
1175 .WillOnce(RunPipelineStatusCB());
1176
1177 if (state == kStarting) {
1178 EXPECT_CALL(*mocks_->audio_renderer(), Play(_))
1179 .WillOnce(DoAll(Stop(pipeline_, stop_cb), RunClosure()));
1180 } else {
1181 EXPECT_CALL(*mocks_->audio_renderer(), Play(_)).WillOnce(RunClosure());
1182 }
1183
1184 EXPECT_CALL(*mocks_->video_renderer(), Play(_)).WillOnce(RunClosure());
1185
1186 EXPECT_CALL(callbacks_, OnBufferingState(Pipeline::kPrerollCompleted));
1187 EXPECT_CALL(callbacks_, OnSeek(PIPELINE_OK));
1188 ExpectStop();
1189 }
1190
1191 void ExpectSeekError(TeardownState state) {
1192 SetSeekErrorExpectations(state);
1193
1194 // Executed after the error is raised.
1195 EXPECT_CALL(callbacks_, OnSeek(PIPELINE_ERROR_READ));
1196 EXPECT_CALL(*mocks_->demuxer(), Stop(_)).WillOnce(RunClosure());
1197 EXPECT_CALL(*mocks_->audio_renderer(), Stop(_)).WillOnce(RunClosure());
1198 EXPECT_CALL(*mocks_->video_renderer(), Stop(_)).WillOnce(RunClosure());
1199 }
1200
1201 void SetSeekErrorExpectations(TeardownState state) {
1202 if (state == kPausing) {
1203 EXPECT_CALL(*mocks_->audio_renderer(), Pause(_))
1204 .WillOnce(DoAll(SetError(pipeline_, PIPELINE_ERROR_READ),
1205 RunClosure()));
1206 EXPECT_CALL(*mocks_->video_renderer(), Pause(_)).WillOnce(RunClosure());
1207 return;
1208 } 1130 }
1209 1131
1210 EXPECT_CALL(*mocks_->audio_renderer(), Pause(_)).WillOnce(RunClosure()); 1132 EXPECT_CALL(*mocks_->audio_renderer(), Pause(_)).WillOnce(RunClosure());
1211 EXPECT_CALL(*mocks_->video_renderer(), Pause(_)).WillOnce(RunClosure()); 1133 EXPECT_CALL(*mocks_->video_renderer(), Pause(_)).WillOnce(RunClosure());
1212 1134
1213 if (state == kFlushing) { 1135 if (state == kFlushing) {
1214 EXPECT_CALL(*mocks_->audio_renderer(), Flush(_)) 1136 if (stop_or_error == kStop) {
1215 .WillOnce(DoAll(SetError(pipeline_, PIPELINE_ERROR_READ), 1137 EXPECT_CALL(*mocks_->audio_renderer(), Flush(_))
1216 RunClosure())); 1138 .WillOnce(DoAll(Stop(pipeline_, stop_cb), RunClosure()));
1217 EXPECT_CALL(*mocks_->video_renderer(), Flush(_)).WillOnce(RunClosure()); 1139 } else {
1218 return; 1140 status = PIPELINE_ERROR_READ;
1141 EXPECT_CALL(*mocks_->audio_renderer(), Flush(_))
1142 .WillOnce(DoAll(SetError(pipeline_, status), RunClosure()));
1143 }
1144
1145 return status;
1219 } 1146 }
1220 1147
1221 EXPECT_CALL(*mocks_->audio_renderer(), Flush(_)).WillOnce(RunClosure()); 1148 EXPECT_CALL(*mocks_->audio_renderer(), Flush(_)).WillOnce(RunClosure());
1222 EXPECT_CALL(*mocks_->video_renderer(), Flush(_)).WillOnce(RunClosure()); 1149 EXPECT_CALL(*mocks_->video_renderer(), Flush(_)).WillOnce(RunClosure());
1223 1150
1224 if (state == kSeeking) { 1151 if (state == kSeeking) {
1225 EXPECT_CALL(*mocks_->demuxer(), Seek(_, _)) 1152 if (stop_or_error == kStop) {
1226 .WillOnce(RunPipelineStatusCBWithStatus(PIPELINE_ERROR_READ)); 1153 EXPECT_CALL(*mocks_->demuxer(), Seek(_, _))
1227 return; 1154 .WillOnce(DoAll(Stop(pipeline_, stop_cb), RunPipelineStatusCB()));
1155 } else {
1156 status = PIPELINE_ERROR_READ;
1157 EXPECT_CALL(*mocks_->demuxer(), Seek(_, _))
1158 .WillOnce(RunPipelineStatusCBWithStatus(status));
1159 }
1160
1161 return status;
1228 } 1162 }
1229 1163
1230 EXPECT_CALL(*mocks_->demuxer(), Seek(_, _)) 1164 EXPECT_CALL(*mocks_->demuxer(), Seek(_, _))
1231 .WillOnce(RunPipelineStatusCB()); 1165 .WillOnce(RunPipelineStatusCB());
1232 1166
1233 if (state == kPrerolling) { 1167 if (state == kPrerolling) {
1234 EXPECT_CALL(*mocks_->audio_renderer(), Preroll(_, _)) 1168 if (stop_or_error == kStop) {
1235 .WillOnce(RunPipelineStatusCBWithStatus(PIPELINE_ERROR_READ)); 1169 EXPECT_CALL(*mocks_->audio_renderer(), Preroll(_, _))
1236 return; 1170 .WillOnce(DoAll(Stop(pipeline_, stop_cb), RunPipelineStatusCB()));
1171 } else {
1172 status = PIPELINE_ERROR_READ;
1173 EXPECT_CALL(*mocks_->audio_renderer(), Preroll(_, _))
1174 .WillOnce(RunPipelineStatusCBWithStatus(status));
1175 }
1176
1177 return status;
1237 } 1178 }
1238 1179
1239 EXPECT_CALL(*mocks_->audio_renderer(), Preroll(_, _)) 1180 EXPECT_CALL(*mocks_->audio_renderer(), Preroll(_, _))
1240 .WillOnce(RunPipelineStatusCB()); 1181 .WillOnce(RunPipelineStatusCB());
1241 EXPECT_CALL(*mocks_->video_renderer(), Preroll(_, _)) 1182 EXPECT_CALL(*mocks_->video_renderer(), Preroll(_, _))
1242 .WillOnce(RunPipelineStatusCB()); 1183 .WillOnce(RunPipelineStatusCB());
1243 1184
1185 // Playback rate and volume are updated prior to starting.
1186 EXPECT_CALL(*mocks_->demuxer(), SetPlaybackRate(0.0f));
1187 EXPECT_CALL(*mocks_->audio_renderer(), SetPlaybackRate(0.0f));
1188 EXPECT_CALL(*mocks_->video_renderer(), SetPlaybackRate(0.0f));
1189 EXPECT_CALL(*mocks_->audio_renderer(), SetVolume(1.0f));
1190
1244 if (state == kStarting) { 1191 if (state == kStarting) {
1245 EXPECT_CALL(*mocks_->audio_renderer(), Play(_)) 1192 if (stop_or_error == kStop) {
1246 .WillOnce(DoAll(SetError(pipeline_, PIPELINE_ERROR_READ), 1193 EXPECT_CALL(*mocks_->audio_renderer(), Play(_))
1247 RunClosure())); 1194 .WillOnce(DoAll(Stop(pipeline_, stop_cb), RunClosure()));
1248 EXPECT_CALL(*mocks_->video_renderer(), Play(_)).WillOnce(RunClosure()); 1195 } else {
1249 return; 1196 status = PIPELINE_ERROR_READ;
1197 EXPECT_CALL(*mocks_->audio_renderer(), Play(_))
1198 .WillOnce(DoAll(SetError(pipeline_, status), RunClosure()));
1199 }
1200 return status;
1250 } 1201 }
1251 1202
1252 NOTREACHED() << "Unexpected TeardownState: " << state; 1203 NOTREACHED() << "State not supported: " << state;
1204 return status;
1253 } 1205 }
1254 1206
1255 void ExpectStop() { 1207 void DoStopOrError(StopOrError stop_or_error) {
1256 // TODO(scherkus): Don't pause+flush, see http://crbug.com/110228 1208 InSequence s;
1257 EXPECT_CALL(*mocks_->audio_renderer(), Pause(_)).WillOnce(RunClosure()); 1209
1258 EXPECT_CALL(*mocks_->video_renderer(), Pause(_)).WillOnce(RunClosure());
1259 EXPECT_CALL(*mocks_->audio_renderer(), Flush(_)).WillOnce(RunClosure());
1260 EXPECT_CALL(*mocks_->video_renderer(), Flush(_)).WillOnce(RunClosure());
1261 EXPECT_CALL(*mocks_->demuxer(), Stop(_)).WillOnce(RunClosure()); 1210 EXPECT_CALL(*mocks_->demuxer(), Stop(_)).WillOnce(RunClosure());
1262 EXPECT_CALL(*mocks_->audio_renderer(), Stop(_)).WillOnce(RunClosure()); 1211 EXPECT_CALL(*mocks_->audio_renderer(), Stop(_)).WillOnce(RunClosure());
1263 EXPECT_CALL(*mocks_->video_renderer(), Stop(_)).WillOnce(RunClosure()); 1212 EXPECT_CALL(*mocks_->video_renderer(), Stop(_)).WillOnce(RunClosure());
1264 1213
1265 EXPECT_CALL(callbacks_, OnStop()); 1214 if (stop_or_error == kStop) {
1266 } 1215 EXPECT_CALL(callbacks_, OnStop());
1216 pipeline_->Stop(base::Bind(
1217 &CallbackHelper::OnStop, base::Unretained(&callbacks_)));
1218 } else {
1219 EXPECT_CALL(callbacks_, OnError(PIPELINE_ERROR_READ));
1220 pipeline_->SetErrorForTesting(PIPELINE_ERROR_READ);
1221 }
1267 1222
1268 void ExpectPlaybackError() {
1269 // TODO(scherkus): Don't pause+flush, see http://crbug.com/110228
1270 EXPECT_CALL(*mocks_->audio_renderer(), Pause(_)).WillOnce(RunClosure());
1271 EXPECT_CALL(*mocks_->video_renderer(), Pause(_)).WillOnce(RunClosure());
1272 EXPECT_CALL(*mocks_->audio_renderer(), Flush(_)).WillOnce(RunClosure());
1273 EXPECT_CALL(*mocks_->video_renderer(), Flush(_)).WillOnce(RunClosure());
1274 EXPECT_CALL(*mocks_->demuxer(), Stop(_)).WillOnce(RunClosure());
1275 EXPECT_CALL(*mocks_->audio_renderer(), Stop(_)).WillOnce(RunClosure());
1276 EXPECT_CALL(*mocks_->video_renderer(), Stop(_)).WillOnce(RunClosure());
1277
1278 EXPECT_CALL(callbacks_, OnError(PIPELINE_ERROR_READ));
1279 }
1280
1281 void DoSeek() {
1282 pipeline_->Seek(base::TimeDelta::FromSeconds(10), base::Bind(
1283 &CallbackHelper::OnSeek, base::Unretained(&callbacks_)));
1284 message_loop_.RunAllPending(); 1223 message_loop_.RunAllPending();
1285 } 1224 }
1286 1225
1287 void DoStop() {
1288 pipeline_->Stop(base::Bind(
1289 &CallbackHelper::OnStop, base::Unretained(&callbacks_)));
1290 message_loop_.RunAllPending();
1291 }
1292
1293 void DoPlaybackError() {
1294 pipeline_->SetErrorForTesting(PIPELINE_ERROR_READ);
1295 message_loop_.RunAllPending();
1296 }
1297
1298 DISALLOW_COPY_AND_ASSIGN(PipelineTeardownTest); 1226 DISALLOW_COPY_AND_ASSIGN(PipelineTeardownTest);
1299 }; 1227 };
1300 1228
1301 #define INSTANTIATE_TEARDOWN_TEST(stop_or_error, state) \ 1229 #define INSTANTIATE_TEARDOWN_TEST(stop_or_error, state) \
1302 TEST_F(PipelineTeardownTest, stop_or_error##_##state) { \ 1230 TEST_F(PipelineTeardownTest, stop_or_error##_##state) { \
1303 RunTest(k##state, k##stop_or_error); \ 1231 RunTest(k##state, k##stop_or_error); \
1304 } 1232 }
1305 1233
1306 INSTANTIATE_TEARDOWN_TEST(Stop, InitDemuxer); 1234 INSTANTIATE_TEARDOWN_TEST(Stop, InitDemuxer);
1307 INSTANTIATE_TEARDOWN_TEST(Stop, InitAudioDecoder); 1235 INSTANTIATE_TEARDOWN_TEST(Stop, InitAudioDecoder);
(...skipping 11 matching lines...) Expand all
1319 INSTANTIATE_TEARDOWN_TEST(Error, InitAudioRenderer); 1247 INSTANTIATE_TEARDOWN_TEST(Error, InitAudioRenderer);
1320 INSTANTIATE_TEARDOWN_TEST(Error, InitVideoRenderer); 1248 INSTANTIATE_TEARDOWN_TEST(Error, InitVideoRenderer);
1321 INSTANTIATE_TEARDOWN_TEST(Error, Pausing); 1249 INSTANTIATE_TEARDOWN_TEST(Error, Pausing);
1322 INSTANTIATE_TEARDOWN_TEST(Error, Flushing); 1250 INSTANTIATE_TEARDOWN_TEST(Error, Flushing);
1323 INSTANTIATE_TEARDOWN_TEST(Error, Seeking); 1251 INSTANTIATE_TEARDOWN_TEST(Error, Seeking);
1324 INSTANTIATE_TEARDOWN_TEST(Error, Prerolling); 1252 INSTANTIATE_TEARDOWN_TEST(Error, Prerolling);
1325 INSTANTIATE_TEARDOWN_TEST(Error, Starting); 1253 INSTANTIATE_TEARDOWN_TEST(Error, Starting);
1326 INSTANTIATE_TEARDOWN_TEST(Error, Playing); 1254 INSTANTIATE_TEARDOWN_TEST(Error, Playing);
1327 1255
1328 } // namespace media 1256 } // namespace media
OLDNEW
« no previous file with comments | « media/base/pipeline_status.h ('k') | media/base/serial_runner.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698