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

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: one more time 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
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,
117 // see http://crbug.com/110228
118 if (audio_stream_) { 116 if (audio_stream_) {
Ami GONE FROM CHROMIUM 2012/09/02 20:29:29 braces no longer necessary (here and below).
scherkus (not reviewing) 2012/09/05 15:04:17 Done.
119 EXPECT_CALL(*mocks_->audio_renderer(), Pause(_)) 117 EXPECT_CALL(*mocks_->audio_renderer(), Stop(_)).WillOnce(RunClosure());
120 .WillOnce(RunClosure());
121 EXPECT_CALL(*mocks_->audio_renderer(), Flush(_))
122 .WillOnce(RunClosure());
123 EXPECT_CALL(*mocks_->audio_renderer(), Stop(_))
124 .WillOnce(RunClosure());
125 } 118 }
126 119
127 if (video_stream_) { 120 if (video_stream_) {
128 EXPECT_CALL(*mocks_->video_renderer(), Pause(_)) 121 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 } 122 }
135 } 123 }
136 124
137 // Expect a stop callback if we were started. 125 // Expect a stop callback if we were started.
138 EXPECT_CALL(callbacks_, OnStop()); 126 EXPECT_CALL(callbacks_, OnStop());
139 pipeline_->Stop(base::Bind(&CallbackHelper::OnStop, 127 pipeline_->Stop(base::Bind(&CallbackHelper::OnStop,
140 base::Unretained(&callbacks_))); 128 base::Unretained(&callbacks_)));
141 message_loop_.RunAllPending(); 129 message_loop_.RunAllPending();
142 130
143 pipeline_ = NULL; 131 pipeline_ = NULL;
(...skipping 115 matching lines...) Expand 10 before | Expand all | Expand 10 after
259 } 247 }
260 248
261 MockDemuxerStream* video_stream() { 249 MockDemuxerStream* video_stream() {
262 return video_stream_; 250 return video_stream_;
263 } 251 }
264 252
265 void ExpectSeek(const base::TimeDelta& seek_time) { 253 void ExpectSeek(const base::TimeDelta& seek_time) {
266 // Every filter should receive a call to Seek(). 254 // Every filter should receive a call to Seek().
267 EXPECT_CALL(*mocks_->demuxer(), Seek(seek_time, _)) 255 EXPECT_CALL(*mocks_->demuxer(), Seek(seek_time, _))
268 .WillOnce(RunPipelineStatusCB()); 256 .WillOnce(RunPipelineStatusCB());
257 EXPECT_CALL(*mocks_->demuxer(), SetPlaybackRate(_));
269 258
270 if (audio_stream_) { 259 if (audio_stream_) {
271 EXPECT_CALL(*mocks_->audio_renderer(), Pause(_)) 260 EXPECT_CALL(*mocks_->audio_renderer(), Pause(_))
272 .WillOnce(RunClosure()); 261 .WillOnce(RunClosure());
273 EXPECT_CALL(*mocks_->audio_renderer(), Flush(_)) 262 EXPECT_CALL(*mocks_->audio_renderer(), Flush(_))
274 .WillOnce(RunClosure()); 263 .WillOnce(RunClosure());
275 EXPECT_CALL(*mocks_->audio_renderer(), Preroll(seek_time, _)) 264 EXPECT_CALL(*mocks_->audio_renderer(), Preroll(seek_time, _))
276 .WillOnce(RunPipelineStatusCB()); 265 .WillOnce(RunPipelineStatusCB());
266 EXPECT_CALL(*mocks_->audio_renderer(), SetPlaybackRate(_));
267 EXPECT_CALL(*mocks_->audio_renderer(), SetVolume(_));
277 EXPECT_CALL(*mocks_->audio_renderer(), Play(_)) 268 EXPECT_CALL(*mocks_->audio_renderer(), Play(_))
278 .WillOnce(RunClosure()); 269 .WillOnce(RunClosure());
279 } 270 }
280 271
281 if (video_stream_) { 272 if (video_stream_) {
282 EXPECT_CALL(*mocks_->video_renderer(), Pause(_)) 273 EXPECT_CALL(*mocks_->video_renderer(), Pause(_))
283 .WillOnce(RunClosure()); 274 .WillOnce(RunClosure());
284 EXPECT_CALL(*mocks_->video_renderer(), Flush(_)) 275 EXPECT_CALL(*mocks_->video_renderer(), Flush(_))
285 .WillOnce(RunClosure()); 276 .WillOnce(RunClosure());
286 EXPECT_CALL(*mocks_->video_renderer(), Preroll(seek_time, _)) 277 EXPECT_CALL(*mocks_->video_renderer(), Preroll(seek_time, _))
287 .WillOnce(RunPipelineStatusCB()); 278 .WillOnce(RunPipelineStatusCB());
279 EXPECT_CALL(*mocks_->video_renderer(), SetPlaybackRate(_));
288 EXPECT_CALL(*mocks_->video_renderer(), Play(_)) 280 EXPECT_CALL(*mocks_->video_renderer(), Play(_))
289 .WillOnce(RunClosure()); 281 .WillOnce(RunClosure());
290 } 282 }
291 283
292 EXPECT_CALL(callbacks_, OnBufferingState(Pipeline::kPrerollCompleted)); 284 EXPECT_CALL(callbacks_, OnBufferingState(Pipeline::kPrerollCompleted));
293 285
294 // We expect a successful seek callback. 286 // We expect a successful seek callback.
295 EXPECT_CALL(callbacks_, OnSeek(PIPELINE_OK)); 287 EXPECT_CALL(callbacks_, OnSeek(PIPELINE_OK));
296 } 288 }
297 289
(...skipping 405 matching lines...) Expand 10 before | Expand all | Expand 10 after
703 InitializePipeline(PIPELINE_OK); 695 InitializePipeline(PIPELINE_OK);
704 696
705 float playback_rate = 1.0f; 697 float playback_rate = 1.0f;
706 EXPECT_CALL(*mocks_->demuxer(), SetPlaybackRate(playback_rate)); 698 EXPECT_CALL(*mocks_->demuxer(), SetPlaybackRate(playback_rate));
707 EXPECT_CALL(*mocks_->audio_renderer(), SetPlaybackRate(playback_rate)); 699 EXPECT_CALL(*mocks_->audio_renderer(), SetPlaybackRate(playback_rate));
708 pipeline_->SetPlaybackRate(playback_rate); 700 pipeline_->SetPlaybackRate(playback_rate);
709 message_loop_.RunAllPending(); 701 message_loop_.RunAllPending();
710 702
711 base::TimeDelta seek_time = base::TimeDelta::FromSeconds(5); 703 base::TimeDelta seek_time = base::TimeDelta::FromSeconds(5);
712 704
713 // Seek() isn't called as the demuxer errors out first. 705 // Preroll() isn't called as the demuxer errors out first.
714 EXPECT_CALL(*mocks_->audio_renderer(), Pause(_)) 706 EXPECT_CALL(*mocks_->audio_renderer(), Pause(_))
715 .WillOnce(RunClosure()); 707 .WillOnce(RunClosure());
716 EXPECT_CALL(*mocks_->audio_renderer(), Flush(_)) 708 EXPECT_CALL(*mocks_->audio_renderer(), Flush(_))
717 .WillOnce(RunClosure()); 709 .WillOnce(RunClosure());
718 EXPECT_CALL(*mocks_->audio_renderer(), Stop(_)) 710 EXPECT_CALL(*mocks_->audio_renderer(), Stop(_))
719 .WillOnce(RunClosure()); 711 .WillOnce(RunClosure());
720 712
721 EXPECT_CALL(*mocks_->demuxer(), Seek(seek_time, _)) 713 EXPECT_CALL(*mocks_->demuxer(), Seek(seek_time, _))
722 .WillOnce(RunPipelineStatusCBWithStatus(PIPELINE_ERROR_READ)); 714 .WillOnce(RunPipelineStatusCBWithStatus(PIPELINE_ERROR_READ));
723 EXPECT_CALL(*mocks_->demuxer(), Stop(_)) 715 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, _)) 851 EXPECT_CALL(*mocks_->demuxer(), Seek(seek_time, _))
860 .WillOnce(DoAll(InvokeWithoutArgs(&closure, &base::Closure::Run), 852 .WillOnce(DoAll(InvokeWithoutArgs(&closure, &base::Closure::Run),
861 RunPipelineStatusCB())); 853 RunPipelineStatusCB()));
862 854
863 EXPECT_CALL(*mocks_->audio_renderer(), Pause(_)) 855 EXPECT_CALL(*mocks_->audio_renderer(), Pause(_))
864 .WillOnce(RunClosure()); 856 .WillOnce(RunClosure());
865 EXPECT_CALL(*mocks_->audio_renderer(), Flush(_)) 857 EXPECT_CALL(*mocks_->audio_renderer(), Flush(_))
866 .WillOnce(RunClosure()); 858 .WillOnce(RunClosure());
867 EXPECT_CALL(*mocks_->audio_renderer(), Preroll(seek_time, _)) 859 EXPECT_CALL(*mocks_->audio_renderer(), Preroll(seek_time, _))
868 .WillOnce(RunPipelineStatusCB()); 860 .WillOnce(RunPipelineStatusCB());
861 EXPECT_CALL(*mocks_->demuxer(), SetPlaybackRate(_));
862 EXPECT_CALL(*mocks_->audio_renderer(), SetPlaybackRate(_));
863 EXPECT_CALL(*mocks_->audio_renderer(), SetVolume(_));
869 EXPECT_CALL(*mocks_->audio_renderer(), Play(_)) 864 EXPECT_CALL(*mocks_->audio_renderer(), Play(_))
870 .WillOnce(RunClosure()); 865 .WillOnce(RunClosure());
871 866
872 EXPECT_CALL(callbacks_, OnBufferingState(Pipeline::kPrerollCompleted)); 867 EXPECT_CALL(callbacks_, OnBufferingState(Pipeline::kPrerollCompleted));
873 EXPECT_CALL(callbacks_, OnSeek(PIPELINE_OK)); 868 EXPECT_CALL(callbacks_, OnSeek(PIPELINE_OK));
874 DoSeek(seek_time); 869 DoSeek(seek_time);
875 870
876 EXPECT_EQ(pipeline_->GetMediaTime(), seek_time); 871 EXPECT_EQ(pipeline_->GetMediaTime(), seek_time);
877 872
878 // Now that the seek is complete, verify that time updates advance the current 873 // 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: 960 case kInitAudioDecoder:
966 case kInitAudioRenderer: 961 case kInitAudioRenderer:
967 case kInitVideoRenderer: 962 case kInitVideoRenderer:
968 DoInitialize(state, stop_or_error); 963 DoInitialize(state, stop_or_error);
969 break; 964 break;
970 965
971 case kPausing: 966 case kPausing:
972 case kFlushing: 967 case kFlushing:
973 case kSeeking: 968 case kSeeking:
974 case kPrerolling: 969 case kPrerolling:
975 case kStarting: { 970 case kStarting:
976 DoInitialize(state, stop_or_error); 971 DoInitialize(state, stop_or_error);
972 DoSeek(state, stop_or_error);
973 break;
977 974
978 InSequence s; 975 case kPlaying:
979 if (stop_or_error == kStop) { 976 DoInitialize(state, stop_or_error);
980 ExpectSeekStop(state); 977 DoStopOrError(stop_or_error);
981 } else {
982 ExpectSeekError(state);
983 }
984 DoSeek();
985 break; 978 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 } 979 }
1002 } 980 }
1003 981
1004 private: 982 private:
1005 // TODO(scherkus): We do radically different things whether teardown is 983 // TODO(scherkus): We do radically different things whether teardown is
1006 // invoked via stop vs error. The teardown path should be the same, 984 // invoked via stop vs error. The teardown path should be the same,
1007 // see http://crbug.com/110228 985 // see http://crbug.com/110228
1008 void DoInitialize(TeardownState state, StopOrError stop_or_error) { 986 void DoInitialize(TeardownState state, StopOrError stop_or_error) {
1009 PipelineStatus expected_status = 987 PipelineStatus expected_status =
1010 SetInitializeExpectations(state, stop_or_error); 988 SetInitializeExpectations(state, stop_or_error);
(...skipping 93 matching lines...) Expand 10 before | Expand all | Expand 10 after
1104 return status; 1082 return status;
1105 } 1083 }
1106 1084
1107 EXPECT_CALL(*mocks_->video_renderer(), 1085 EXPECT_CALL(*mocks_->video_renderer(),
1108 Initialize(_, _, _, _, _, _, _, _, _, _)) 1086 Initialize(_, _, _, _, _, _, _, _, _, _))
1109 .WillOnce(RunPipelineStatusCB2()); 1087 .WillOnce(RunPipelineStatusCB2());
1110 1088
1111 EXPECT_CALL(callbacks_, OnBufferingState(Pipeline::kHaveMetadata)); 1089 EXPECT_CALL(callbacks_, OnBufferingState(Pipeline::kHaveMetadata));
1112 1090
1113 // If we get here it's a successful initialization. 1091 // 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(), _)) 1092 EXPECT_CALL(*mocks_->audio_renderer(), Preroll(base::TimeDelta(), _))
1121 .WillOnce(RunPipelineStatusCB()); 1093 .WillOnce(RunPipelineStatusCB());
1122 EXPECT_CALL(*mocks_->video_renderer(), Preroll(base::TimeDelta(), _)) 1094 EXPECT_CALL(*mocks_->video_renderer(), Preroll(base::TimeDelta(), _))
1123 .WillOnce(RunPipelineStatusCB()); 1095 .WillOnce(RunPipelineStatusCB());
1124 1096
1097 EXPECT_CALL(*mocks_->demuxer(), SetPlaybackRate(0.0f));
1098 EXPECT_CALL(*mocks_->audio_renderer(), SetPlaybackRate(0.0f));
1099 EXPECT_CALL(*mocks_->video_renderer(), SetPlaybackRate(0.0f));
1100 EXPECT_CALL(*mocks_->audio_renderer(), SetVolume(1.0f));
1101
1125 EXPECT_CALL(*mocks_->audio_renderer(), Play(_)) 1102 EXPECT_CALL(*mocks_->audio_renderer(), Play(_))
1126 .WillOnce(RunClosure()); 1103 .WillOnce(RunClosure());
1127 EXPECT_CALL(*mocks_->video_renderer(), Play(_)) 1104 EXPECT_CALL(*mocks_->video_renderer(), Play(_))
1128 .WillOnce(RunClosure()); 1105 .WillOnce(RunClosure());
1129 1106
1130 if (status == PIPELINE_OK) 1107 if (status == PIPELINE_OK)
1131 EXPECT_CALL(callbacks_, OnBufferingState(Pipeline::kPrerollCompleted)); 1108 EXPECT_CALL(callbacks_, OnBufferingState(Pipeline::kPrerollCompleted));
1132 1109
1133 return status; 1110 return status;
1134 } 1111 }
1135 1112
1136 void ExpectSeekStop(TeardownState state) { 1113 void DoSeek(TeardownState state, StopOrError stop_or_error) {
1114 InSequence s;
1115 PipelineStatus status = SetSeekExpectations(state, stop_or_error);
1116
1117 EXPECT_CALL(*mocks_->demuxer(), Stop(_)).WillOnce(RunClosure());
1118 EXPECT_CALL(*mocks_->audio_renderer(), Stop(_)).WillOnce(RunClosure());
1119 EXPECT_CALL(*mocks_->video_renderer(), Stop(_)).WillOnce(RunClosure());
1120 EXPECT_CALL(callbacks_, OnSeek(status));
1121
1122 if (status == PIPELINE_OK) {
1123 EXPECT_CALL(callbacks_, OnStop());
1124 }
1125
1126 pipeline_->Seek(base::TimeDelta::FromSeconds(10), base::Bind(
1127 &CallbackHelper::OnSeek, base::Unretained(&callbacks_)));
1128 message_loop_.RunAllPending();
1129 }
1130
1131 PipelineStatus SetSeekExpectations(TeardownState state,
1132 StopOrError stop_or_error) {
1133 PipelineStatus status = PIPELINE_OK;
1137 base::Closure stop_cb = base::Bind( 1134 base::Closure stop_cb = base::Bind(
1138 &CallbackHelper::OnStop, base::Unretained(&callbacks_)); 1135 &CallbackHelper::OnStop, base::Unretained(&callbacks_));
1139 1136
1140 if (state == kPausing) { 1137 if (state == kPausing) {
1141 EXPECT_CALL(*mocks_->audio_renderer(), Pause(_)) 1138 if (stop_or_error == kStop) {
1142 .WillOnce(DoAll(Stop(pipeline_, stop_cb), RunClosure())); 1139 EXPECT_CALL(*mocks_->audio_renderer(), Pause(_))
1143 } else { 1140 .WillOnce(DoAll(Stop(pipeline_, stop_cb), RunClosure()));
1144 EXPECT_CALL(*mocks_->audio_renderer(), Pause(_)).WillOnce(RunClosure()); 1141 } else {
1145 } 1142 status = PIPELINE_ERROR_READ;
1143 EXPECT_CALL(*mocks_->audio_renderer(), Pause(_))
1144 .WillOnce(DoAll(SetError(pipeline_, status), RunClosure()));
1145 }
1146 1146
1147 EXPECT_CALL(*mocks_->video_renderer(), Pause(_)).WillOnce(RunClosure()); 1147 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 } 1148 }
1209 1149
1210 EXPECT_CALL(*mocks_->audio_renderer(), Pause(_)).WillOnce(RunClosure()); 1150 EXPECT_CALL(*mocks_->audio_renderer(), Pause(_)).WillOnce(RunClosure());
1211 EXPECT_CALL(*mocks_->video_renderer(), Pause(_)).WillOnce(RunClosure()); 1151 EXPECT_CALL(*mocks_->video_renderer(), Pause(_)).WillOnce(RunClosure());
1212 1152
1213 if (state == kFlushing) { 1153 if (state == kFlushing) {
1214 EXPECT_CALL(*mocks_->audio_renderer(), Flush(_)) 1154 if (stop_or_error == kStop) {
1215 .WillOnce(DoAll(SetError(pipeline_, PIPELINE_ERROR_READ), 1155 EXPECT_CALL(*mocks_->audio_renderer(), Flush(_))
1216 RunClosure())); 1156 .WillOnce(DoAll(Stop(pipeline_, stop_cb), RunClosure()));
1217 EXPECT_CALL(*mocks_->video_renderer(), Flush(_)).WillOnce(RunClosure()); 1157 } else {
1218 return; 1158 status = PIPELINE_ERROR_READ;
1159 EXPECT_CALL(*mocks_->audio_renderer(), Flush(_))
1160 .WillOnce(DoAll(SetError(pipeline_, status), RunClosure()));
1161 }
1162
1163 return status;
1219 } 1164 }
1220 1165
1221 EXPECT_CALL(*mocks_->audio_renderer(), Flush(_)).WillOnce(RunClosure()); 1166 EXPECT_CALL(*mocks_->audio_renderer(), Flush(_)).WillOnce(RunClosure());
1222 EXPECT_CALL(*mocks_->video_renderer(), Flush(_)).WillOnce(RunClosure()); 1167 EXPECT_CALL(*mocks_->video_renderer(), Flush(_)).WillOnce(RunClosure());
1223 1168
1224 if (state == kSeeking) { 1169 if (state == kSeeking) {
1225 EXPECT_CALL(*mocks_->demuxer(), Seek(_, _)) 1170 if (stop_or_error == kStop) {
1226 .WillOnce(RunPipelineStatusCBWithStatus(PIPELINE_ERROR_READ)); 1171 EXPECT_CALL(*mocks_->demuxer(), Seek(_, _))
1227 return; 1172 .WillOnce(DoAll(Stop(pipeline_, stop_cb), RunPipelineStatusCB()));
1173 } else {
1174 status = PIPELINE_ERROR_READ;
1175 EXPECT_CALL(*mocks_->demuxer(), Seek(_, _))
1176 .WillOnce(RunPipelineStatusCBWithStatus(status));
1177 }
1178
1179 return status;
1228 } 1180 }
1229 1181
1230 EXPECT_CALL(*mocks_->demuxer(), Seek(_, _)) 1182 EXPECT_CALL(*mocks_->demuxer(), Seek(_, _))
1231 .WillOnce(RunPipelineStatusCB()); 1183 .WillOnce(RunPipelineStatusCB());
1232 1184
1233 if (state == kPrerolling) { 1185 if (state == kPrerolling) {
1234 EXPECT_CALL(*mocks_->audio_renderer(), Preroll(_, _)) 1186 if (stop_or_error == kStop) {
1235 .WillOnce(RunPipelineStatusCBWithStatus(PIPELINE_ERROR_READ)); 1187 EXPECT_CALL(*mocks_->audio_renderer(), Preroll(_, _))
1236 return; 1188 .WillOnce(DoAll(Stop(pipeline_, stop_cb), RunPipelineStatusCB()));
1189 } else {
1190 status = PIPELINE_ERROR_READ;
1191 EXPECT_CALL(*mocks_->audio_renderer(), Preroll(_, _))
1192 .WillOnce(RunPipelineStatusCBWithStatus(status));
1193 }
1194
1195 return status;
1237 } 1196 }
1238 1197
1239 EXPECT_CALL(*mocks_->audio_renderer(), Preroll(_, _)) 1198 EXPECT_CALL(*mocks_->audio_renderer(), Preroll(_, _))
1240 .WillOnce(RunPipelineStatusCB()); 1199 .WillOnce(RunPipelineStatusCB());
1241 EXPECT_CALL(*mocks_->video_renderer(), Preroll(_, _)) 1200 EXPECT_CALL(*mocks_->video_renderer(), Preroll(_, _))
1242 .WillOnce(RunPipelineStatusCB()); 1201 .WillOnce(RunPipelineStatusCB());
1243 1202
1203 // Playback rate and volume are updated prior to starting.
1204 EXPECT_CALL(*mocks_->demuxer(), SetPlaybackRate(0.0f));
1205 EXPECT_CALL(*mocks_->audio_renderer(), SetPlaybackRate(0.0f));
1206 EXPECT_CALL(*mocks_->video_renderer(), SetPlaybackRate(0.0f));
1207 EXPECT_CALL(*mocks_->audio_renderer(), SetVolume(1.0f));
1208
1244 if (state == kStarting) { 1209 if (state == kStarting) {
1245 EXPECT_CALL(*mocks_->audio_renderer(), Play(_)) 1210 if (stop_or_error == kStop) {
1246 .WillOnce(DoAll(SetError(pipeline_, PIPELINE_ERROR_READ), 1211 EXPECT_CALL(*mocks_->audio_renderer(), Play(_))
1247 RunClosure())); 1212 .WillOnce(DoAll(Stop(pipeline_, stop_cb), RunClosure()));
1248 EXPECT_CALL(*mocks_->video_renderer(), Play(_)).WillOnce(RunClosure()); 1213 } else {
1249 return; 1214 status = PIPELINE_ERROR_READ;
1215 EXPECT_CALL(*mocks_->audio_renderer(), Play(_))
1216 .WillOnce(DoAll(SetError(pipeline_, status), RunClosure()));
1217 }
1218 return status;
1250 } 1219 }
1251 1220
1252 NOTREACHED() << "Unexpected TeardownState: " << state; 1221 EXPECT_CALL(*mocks_->audio_renderer(), Play(_)).WillOnce(RunClosure());
1222 EXPECT_CALL(*mocks_->video_renderer(), Play(_)).WillOnce(RunClosure());
1223 NOTREACHED() << "WTF";
acolwell GONE FROM CHROMIUM 2012/09/05 13:22:22 Remove WTF or replace with a more helpful comment.
scherkus (not reviewing) 2012/09/05 15:04:17 whoops haha
1224 return status;
1253 } 1225 }
1254 1226
1255 void ExpectStop() { 1227 void DoStopOrError(StopOrError stop_or_error) {
1256 // TODO(scherkus): Don't pause+flush, see http://crbug.com/110228 1228 InSequence s;
1257 EXPECT_CALL(*mocks_->audio_renderer(), Pause(_)).WillOnce(RunClosure()); 1229
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()); 1230 EXPECT_CALL(*mocks_->demuxer(), Stop(_)).WillOnce(RunClosure());
1262 EXPECT_CALL(*mocks_->audio_renderer(), Stop(_)).WillOnce(RunClosure()); 1231 EXPECT_CALL(*mocks_->audio_renderer(), Stop(_)).WillOnce(RunClosure());
1263 EXPECT_CALL(*mocks_->video_renderer(), Stop(_)).WillOnce(RunClosure()); 1232 EXPECT_CALL(*mocks_->video_renderer(), Stop(_)).WillOnce(RunClosure());
1264 1233
1265 EXPECT_CALL(callbacks_, OnStop()); 1234 if (stop_or_error == kStop) {
1266 } 1235 EXPECT_CALL(callbacks_, OnStop());
1236 pipeline_->Stop(base::Bind(
1237 &CallbackHelper::OnStop, base::Unretained(&callbacks_)));
1238 } else {
1239 EXPECT_CALL(callbacks_, OnError(PIPELINE_ERROR_READ));
1240 pipeline_->SetErrorForTesting(PIPELINE_ERROR_READ);
1241 }
1267 1242
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(); 1243 message_loop_.RunAllPending();
1285 } 1244 }
1286 1245
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); 1246 DISALLOW_COPY_AND_ASSIGN(PipelineTeardownTest);
1299 }; 1247 };
1300 1248
1301 #define INSTANTIATE_TEARDOWN_TEST(stop_or_error, state) \ 1249 #define INSTANTIATE_TEARDOWN_TEST(stop_or_error, state) \
1302 TEST_F(PipelineTeardownTest, stop_or_error##_##state) { \ 1250 TEST_F(PipelineTeardownTest, stop_or_error##_##state) { \
1303 RunTest(k##state, k##stop_or_error); \ 1251 RunTest(k##state, k##stop_or_error); \
1304 } 1252 }
1305 1253
1306 INSTANTIATE_TEARDOWN_TEST(Stop, InitDemuxer); 1254 INSTANTIATE_TEARDOWN_TEST(Stop, InitDemuxer);
1307 INSTANTIATE_TEARDOWN_TEST(Stop, InitAudioDecoder); 1255 INSTANTIATE_TEARDOWN_TEST(Stop, InitAudioDecoder);
(...skipping 11 matching lines...) Expand all
1319 INSTANTIATE_TEARDOWN_TEST(Error, InitAudioRenderer); 1267 INSTANTIATE_TEARDOWN_TEST(Error, InitAudioRenderer);
1320 INSTANTIATE_TEARDOWN_TEST(Error, InitVideoRenderer); 1268 INSTANTIATE_TEARDOWN_TEST(Error, InitVideoRenderer);
1321 INSTANTIATE_TEARDOWN_TEST(Error, Pausing); 1269 INSTANTIATE_TEARDOWN_TEST(Error, Pausing);
1322 INSTANTIATE_TEARDOWN_TEST(Error, Flushing); 1270 INSTANTIATE_TEARDOWN_TEST(Error, Flushing);
1323 INSTANTIATE_TEARDOWN_TEST(Error, Seeking); 1271 INSTANTIATE_TEARDOWN_TEST(Error, Seeking);
1324 INSTANTIATE_TEARDOWN_TEST(Error, Prerolling); 1272 INSTANTIATE_TEARDOWN_TEST(Error, Prerolling);
1325 INSTANTIATE_TEARDOWN_TEST(Error, Starting); 1273 INSTANTIATE_TEARDOWN_TEST(Error, Starting);
1326 INSTANTIATE_TEARDOWN_TEST(Error, Playing); 1274 INSTANTIATE_TEARDOWN_TEST(Error, Playing);
1327 1275
1328 } // namespace media 1276 } // namespace media
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698