OLD | NEW |
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 "media/base/pipeline_impl.h" | 5 #include "media/base/pipeline_impl.h" |
6 | 6 |
7 #include <stddef.h> | 7 #include <stddef.h> |
8 #include <memory> | 8 #include <memory> |
9 #include <utility> | 9 #include <utility> |
10 #include <vector> | 10 #include <vector> |
11 | 11 |
12 #include "base/bind.h" | 12 #include "base/bind.h" |
13 #include "base/location.h" | 13 #include "base/location.h" |
14 #include "base/macros.h" | 14 #include "base/macros.h" |
15 #include "base/message_loop/message_loop.h" | 15 #include "base/message_loop/message_loop.h" |
| 16 #include "base/run_loop.h" |
16 #include "base/single_thread_task_runner.h" | 17 #include "base/single_thread_task_runner.h" |
17 #include "base/stl_util.h" | 18 #include "base/stl_util.h" |
18 #include "base/test/simple_test_tick_clock.h" | 19 #include "base/test/simple_test_tick_clock.h" |
19 #include "base/threading/simple_thread.h" | 20 #include "base/threading/simple_thread.h" |
20 #include "base/threading/thread_task_runner_handle.h" | 21 #include "base/threading/thread_task_runner_handle.h" |
21 #include "base/time/clock.h" | 22 #include "base/time/clock.h" |
22 #include "media/base/fake_text_track_stream.h" | 23 #include "media/base/fake_text_track_stream.h" |
23 #include "media/base/gmock_callback_support.h" | 24 #include "media/base/gmock_callback_support.h" |
24 #include "media/base/media_log.h" | 25 #include "media/base/media_log.h" |
25 #include "media/base/mock_filters.h" | 26 #include "media/base/mock_filters.h" |
(...skipping 96 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
122 | 123 |
123 // The mock demuxer doesn't stop the fake text track stream, | 124 // The mock demuxer doesn't stop the fake text track stream, |
124 // so just stop it manually. | 125 // so just stop it manually. |
125 if (text_stream_) | 126 if (text_stream_) |
126 text_stream_->Stop(); | 127 text_stream_->Stop(); |
127 | 128 |
128 pipeline_->Stop(); | 129 pipeline_->Stop(); |
129 } | 130 } |
130 | 131 |
131 pipeline_.reset(); | 132 pipeline_.reset(); |
132 message_loop_.RunUntilIdle(); | 133 base::RunLoop().RunUntilIdle(); |
133 } | 134 } |
134 | 135 |
135 void OnDemuxerError() { demuxer_host_->OnDemuxerError(PIPELINE_ERROR_ABORT); } | 136 void OnDemuxerError() { demuxer_host_->OnDemuxerError(PIPELINE_ERROR_ABORT); } |
136 | 137 |
137 protected: | 138 protected: |
138 // Sets up expectations to allow the demuxer to initialize. | 139 // Sets up expectations to allow the demuxer to initialize. |
139 typedef std::vector<MockDemuxerStream*> MockDemuxerStreamVector; | 140 typedef std::vector<MockDemuxerStream*> MockDemuxerStreamVector; |
140 void SetDemuxerExpectations(MockDemuxerStreamVector* streams, | 141 void SetDemuxerExpectations(MockDemuxerStreamVector* streams, |
141 const base::TimeDelta& duration) { | 142 const base::TimeDelta& duration) { |
142 EXPECT_CALL(callbacks_, OnDurationChange()); | 143 EXPECT_CALL(callbacks_, OnDurationChange()); |
(...skipping 29 matching lines...) Expand all Loading... |
172 DoAll(SaveArg<1>(&renderer_client_), PostCallback<2>(PIPELINE_OK))); | 173 DoAll(SaveArg<1>(&renderer_client_), PostCallback<2>(PIPELINE_OK))); |
173 EXPECT_CALL(*renderer_, HasAudio()).WillRepeatedly(Return(audio_stream())); | 174 EXPECT_CALL(*renderer_, HasAudio()).WillRepeatedly(Return(audio_stream())); |
174 EXPECT_CALL(*renderer_, HasVideo()).WillRepeatedly(Return(video_stream())); | 175 EXPECT_CALL(*renderer_, HasVideo()).WillRepeatedly(Return(video_stream())); |
175 } | 176 } |
176 | 177 |
177 void AddTextStream() { | 178 void AddTextStream() { |
178 EXPECT_CALL(callbacks_, OnAddTextTrack(_, _)) | 179 EXPECT_CALL(callbacks_, OnAddTextTrack(_, _)) |
179 .WillOnce(Invoke(this, &PipelineImplTest::DoOnAddTextTrack)); | 180 .WillOnce(Invoke(this, &PipelineImplTest::DoOnAddTextTrack)); |
180 demuxer_host_->AddTextStream(text_stream(), | 181 demuxer_host_->AddTextStream(text_stream(), |
181 TextTrackConfig(kTextSubtitles, "", "", "")); | 182 TextTrackConfig(kTextSubtitles, "", "", "")); |
182 message_loop_.RunUntilIdle(); | 183 base::RunLoop().RunUntilIdle(); |
183 } | 184 } |
184 | 185 |
185 void StartPipeline() { | 186 void StartPipeline() { |
186 EXPECT_CALL(callbacks_, OnWaitingForDecryptionKey()).Times(0); | 187 EXPECT_CALL(callbacks_, OnWaitingForDecryptionKey()).Times(0); |
187 pipeline_->Start( | 188 pipeline_->Start( |
188 demuxer_.get(), std::move(scoped_renderer_), &callbacks_, | 189 demuxer_.get(), std::move(scoped_renderer_), &callbacks_, |
189 base::Bind(&CallbackHelper::OnStart, base::Unretained(&callbacks_))); | 190 base::Bind(&CallbackHelper::OnStart, base::Unretained(&callbacks_))); |
190 } | 191 } |
191 | 192 |
192 // Sets up expectations on the callback and initializes the pipeline. Called | 193 // Sets up expectations on the callback and initializes the pipeline. Called |
193 // after tests have set expectations any filters they wish to use. | 194 // after tests have set expectations any filters they wish to use. |
194 void StartPipelineAndExpect(PipelineStatus start_status) { | 195 void StartPipelineAndExpect(PipelineStatus start_status) { |
195 EXPECT_CALL(callbacks_, OnStart(start_status)); | 196 EXPECT_CALL(callbacks_, OnStart(start_status)); |
196 | 197 |
197 if (start_status == PIPELINE_OK) { | 198 if (start_status == PIPELINE_OK) { |
198 EXPECT_CALL(callbacks_, OnMetadata(_)).WillOnce(SaveArg<0>(&metadata_)); | 199 EXPECT_CALL(callbacks_, OnMetadata(_)).WillOnce(SaveArg<0>(&metadata_)); |
199 EXPECT_CALL(*renderer_, SetPlaybackRate(0.0)); | 200 EXPECT_CALL(*renderer_, SetPlaybackRate(0.0)); |
200 EXPECT_CALL(*renderer_, SetVolume(1.0f)); | 201 EXPECT_CALL(*renderer_, SetVolume(1.0f)); |
201 EXPECT_CALL(*renderer_, StartPlayingFrom(start_time_)) | 202 EXPECT_CALL(*renderer_, StartPlayingFrom(start_time_)) |
202 .WillOnce( | 203 .WillOnce( |
203 SetBufferingState(&renderer_client_, BUFFERING_HAVE_ENOUGH)); | 204 SetBufferingState(&renderer_client_, BUFFERING_HAVE_ENOUGH)); |
204 EXPECT_CALL(callbacks_, OnBufferingStateChange(BUFFERING_HAVE_ENOUGH)); | 205 EXPECT_CALL(callbacks_, OnBufferingStateChange(BUFFERING_HAVE_ENOUGH)); |
205 } | 206 } |
206 | 207 |
207 StartPipeline(); | 208 StartPipeline(); |
208 message_loop_.RunUntilIdle(); | 209 base::RunLoop().RunUntilIdle(); |
209 } | 210 } |
210 | 211 |
211 void CreateAudioStream() { | 212 void CreateAudioStream() { |
212 audio_stream_ = CreateStream(DemuxerStream::AUDIO); | 213 audio_stream_ = CreateStream(DemuxerStream::AUDIO); |
213 } | 214 } |
214 | 215 |
215 void CreateVideoStream() { | 216 void CreateVideoStream() { |
216 video_stream_ = CreateStream(DemuxerStream::VIDEO); | 217 video_stream_ = CreateStream(DemuxerStream::VIDEO); |
217 video_stream_->set_video_decoder_config(video_decoder_config_); | 218 video_stream_->set_video_decoder_config(video_decoder_config_); |
218 } | 219 } |
(...skipping 25 matching lines...) Expand all Loading... |
244 EXPECT_CALL(callbacks_, OnBufferingStateChange(BUFFERING_HAVE_NOTHING)); | 245 EXPECT_CALL(callbacks_, OnBufferingStateChange(BUFFERING_HAVE_NOTHING)); |
245 | 246 |
246 // We expect a successful seek callback followed by a buffering update. | 247 // We expect a successful seek callback followed by a buffering update. |
247 EXPECT_CALL(callbacks_, OnSeek(PIPELINE_OK)); | 248 EXPECT_CALL(callbacks_, OnSeek(PIPELINE_OK)); |
248 EXPECT_CALL(callbacks_, OnBufferingStateChange(BUFFERING_HAVE_ENOUGH)); | 249 EXPECT_CALL(callbacks_, OnBufferingStateChange(BUFFERING_HAVE_ENOUGH)); |
249 } | 250 } |
250 | 251 |
251 void DoSeek(const base::TimeDelta& seek_time) { | 252 void DoSeek(const base::TimeDelta& seek_time) { |
252 pipeline_->Seek(seek_time, base::Bind(&CallbackHelper::OnSeek, | 253 pipeline_->Seek(seek_time, base::Bind(&CallbackHelper::OnSeek, |
253 base::Unretained(&callbacks_))); | 254 base::Unretained(&callbacks_))); |
254 message_loop_.RunUntilIdle(); | 255 base::RunLoop().RunUntilIdle(); |
255 } | 256 } |
256 | 257 |
257 void ExpectSuspend() { | 258 void ExpectSuspend() { |
258 EXPECT_CALL(*renderer_, SetPlaybackRate(0)); | 259 EXPECT_CALL(*renderer_, SetPlaybackRate(0)); |
259 EXPECT_CALL(*renderer_, Flush(_)) | 260 EXPECT_CALL(*renderer_, Flush(_)) |
260 .WillOnce( | 261 .WillOnce( |
261 DoAll(SetBufferingState(&renderer_client_, BUFFERING_HAVE_NOTHING), | 262 DoAll(SetBufferingState(&renderer_client_, BUFFERING_HAVE_NOTHING), |
262 RunClosure<0>())); | 263 RunClosure<0>())); |
263 EXPECT_CALL(callbacks_, OnBufferingStateChange(BUFFERING_HAVE_NOTHING)); | 264 EXPECT_CALL(callbacks_, OnBufferingStateChange(BUFFERING_HAVE_NOTHING)); |
264 EXPECT_CALL(callbacks_, OnSuspend(PIPELINE_OK)); | 265 EXPECT_CALL(callbacks_, OnSuspend(PIPELINE_OK)); |
265 } | 266 } |
266 | 267 |
267 void DoSuspend() { | 268 void DoSuspend() { |
268 pipeline_->Suspend( | 269 pipeline_->Suspend( |
269 base::Bind(&CallbackHelper::OnSuspend, base::Unretained(&callbacks_))); | 270 base::Bind(&CallbackHelper::OnSuspend, base::Unretained(&callbacks_))); |
270 message_loop_.RunUntilIdle(); | 271 base::RunLoop().RunUntilIdle(); |
271 | 272 |
272 // |renderer_| has been deleted, replace it. | 273 // |renderer_| has been deleted, replace it. |
273 scoped_renderer_.reset(new StrictMock<MockRenderer>()), | 274 scoped_renderer_.reset(new StrictMock<MockRenderer>()), |
274 renderer_ = scoped_renderer_.get(); | 275 renderer_ = scoped_renderer_.get(); |
275 } | 276 } |
276 | 277 |
277 void ExpectResume(const base::TimeDelta& seek_time) { | 278 void ExpectResume(const base::TimeDelta& seek_time) { |
278 SetRendererExpectations(); | 279 SetRendererExpectations(); |
279 EXPECT_CALL(*demuxer_, Seek(seek_time, _)) | 280 EXPECT_CALL(*demuxer_, Seek(seek_time, _)) |
280 .WillOnce(RunCallback<1>(PIPELINE_OK)); | 281 .WillOnce(RunCallback<1>(PIPELINE_OK)); |
281 EXPECT_CALL(*renderer_, SetPlaybackRate(_)); | 282 EXPECT_CALL(*renderer_, SetPlaybackRate(_)); |
282 EXPECT_CALL(*renderer_, SetVolume(_)); | 283 EXPECT_CALL(*renderer_, SetVolume(_)); |
283 EXPECT_CALL(*renderer_, StartPlayingFrom(seek_time)) | 284 EXPECT_CALL(*renderer_, StartPlayingFrom(seek_time)) |
284 .WillOnce(SetBufferingState(&renderer_client_, BUFFERING_HAVE_ENOUGH)); | 285 .WillOnce(SetBufferingState(&renderer_client_, BUFFERING_HAVE_ENOUGH)); |
285 EXPECT_CALL(callbacks_, OnBufferingStateChange(BUFFERING_HAVE_ENOUGH)); | 286 EXPECT_CALL(callbacks_, OnBufferingStateChange(BUFFERING_HAVE_ENOUGH)); |
286 EXPECT_CALL(callbacks_, OnResume(PIPELINE_OK)); | 287 EXPECT_CALL(callbacks_, OnResume(PIPELINE_OK)); |
287 } | 288 } |
288 | 289 |
289 void DoResume(const base::TimeDelta& seek_time) { | 290 void DoResume(const base::TimeDelta& seek_time) { |
290 pipeline_->Resume( | 291 pipeline_->Resume( |
291 std::move(scoped_renderer_), seek_time, | 292 std::move(scoped_renderer_), seek_time, |
292 base::Bind(&CallbackHelper::OnResume, base::Unretained(&callbacks_))); | 293 base::Bind(&CallbackHelper::OnResume, base::Unretained(&callbacks_))); |
293 message_loop_.RunUntilIdle(); | 294 base::RunLoop().RunUntilIdle(); |
294 } | 295 } |
295 | 296 |
296 void ExpectDemuxerStop() { | 297 void ExpectDemuxerStop() { |
297 if (demuxer_) | 298 if (demuxer_) |
298 EXPECT_CALL(*demuxer_, Stop()); | 299 EXPECT_CALL(*demuxer_, Stop()); |
299 } | 300 } |
300 | 301 |
301 void DoOnAddTextTrack(const TextTrackConfig& config, | 302 void DoOnAddTextTrack(const TextTrackConfig& config, |
302 const AddTextTrackDoneCB& done_cb) { | 303 const AddTextTrackDoneCB& done_cb) { |
303 std::unique_ptr<TextTrack> text_track(new MockTextTrack); | 304 std::unique_ptr<TextTrack> text_track(new MockTextTrack); |
304 done_cb.Run(std::move(text_track)); | 305 done_cb.Run(std::move(text_track)); |
305 } | 306 } |
306 | 307 |
307 void RunBufferedTimeRangesTest(const base::TimeDelta duration) { | 308 void RunBufferedTimeRangesTest(const base::TimeDelta duration) { |
308 EXPECT_EQ(0u, pipeline_->GetBufferedTimeRanges().size()); | 309 EXPECT_EQ(0u, pipeline_->GetBufferedTimeRanges().size()); |
309 EXPECT_FALSE(pipeline_->DidLoadingProgress()); | 310 EXPECT_FALSE(pipeline_->DidLoadingProgress()); |
310 | 311 |
311 Ranges<base::TimeDelta> ranges; | 312 Ranges<base::TimeDelta> ranges; |
312 ranges.Add(base::TimeDelta(), duration); | 313 ranges.Add(base::TimeDelta(), duration); |
313 demuxer_host_->OnBufferedTimeRangesChanged(ranges); | 314 demuxer_host_->OnBufferedTimeRangesChanged(ranges); |
314 message_loop_.RunUntilIdle(); | 315 base::RunLoop().RunUntilIdle(); |
315 | 316 |
316 EXPECT_TRUE(pipeline_->DidLoadingProgress()); | 317 EXPECT_TRUE(pipeline_->DidLoadingProgress()); |
317 EXPECT_FALSE(pipeline_->DidLoadingProgress()); | 318 EXPECT_FALSE(pipeline_->DidLoadingProgress()); |
318 EXPECT_EQ(1u, pipeline_->GetBufferedTimeRanges().size()); | 319 EXPECT_EQ(1u, pipeline_->GetBufferedTimeRanges().size()); |
319 EXPECT_EQ(base::TimeDelta(), pipeline_->GetBufferedTimeRanges().start(0)); | 320 EXPECT_EQ(base::TimeDelta(), pipeline_->GetBufferedTimeRanges().start(0)); |
320 EXPECT_EQ(duration, pipeline_->GetBufferedTimeRanges().end(0)); | 321 EXPECT_EQ(duration, pipeline_->GetBufferedTimeRanges().end(0)); |
321 } | 322 } |
322 | 323 |
323 // Fixture members. | 324 // Fixture members. |
324 StrictMock<CallbackHelper> callbacks_; | 325 StrictMock<CallbackHelper> callbacks_; |
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
371 } | 372 } |
372 | 373 |
373 TEST_F(PipelineImplTest, NeverInitializes) { | 374 TEST_F(PipelineImplTest, NeverInitializes) { |
374 // Don't execute the callback passed into Initialize(). | 375 // Don't execute the callback passed into Initialize(). |
375 EXPECT_CALL(*demuxer_, Initialize(_, _, _)); | 376 EXPECT_CALL(*demuxer_, Initialize(_, _, _)); |
376 | 377 |
377 // This test hangs during initialization by never calling | 378 // This test hangs during initialization by never calling |
378 // InitializationComplete(). StrictMock<> will ensure that the callback is | 379 // InitializationComplete(). StrictMock<> will ensure that the callback is |
379 // never executed. | 380 // never executed. |
380 StartPipeline(); | 381 StartPipeline(); |
381 message_loop_.RunUntilIdle(); | 382 base::RunLoop().RunUntilIdle(); |
382 | 383 |
383 // Because our callback will get executed when the test tears down, we'll | 384 // Because our callback will get executed when the test tears down, we'll |
384 // verify that nothing has been called, then set our expectation for the call | 385 // verify that nothing has been called, then set our expectation for the call |
385 // made during tear down. | 386 // made during tear down. |
386 Mock::VerifyAndClear(&callbacks_); | 387 Mock::VerifyAndClear(&callbacks_); |
387 } | 388 } |
388 | 389 |
389 TEST_F(PipelineImplTest, StopWithoutStart) { | 390 TEST_F(PipelineImplTest, StopWithoutStart) { |
390 pipeline_->Stop(); | 391 pipeline_->Stop(); |
391 message_loop_.RunUntilIdle(); | 392 base::RunLoop().RunUntilIdle(); |
392 } | 393 } |
393 | 394 |
394 TEST_F(PipelineImplTest, StartThenStopImmediately) { | 395 TEST_F(PipelineImplTest, StartThenStopImmediately) { |
395 EXPECT_CALL(*demuxer_, Initialize(_, _, _)) | 396 EXPECT_CALL(*demuxer_, Initialize(_, _, _)) |
396 .WillOnce(PostCallback<1>(PIPELINE_OK)); | 397 .WillOnce(PostCallback<1>(PIPELINE_OK)); |
397 EXPECT_CALL(*demuxer_, Stop()); | 398 EXPECT_CALL(*demuxer_, Stop()); |
398 EXPECT_CALL(callbacks_, OnMetadata(_)); | 399 EXPECT_CALL(callbacks_, OnMetadata(_)); |
399 | 400 |
400 EXPECT_CALL(callbacks_, OnStart(_)); | 401 EXPECT_CALL(callbacks_, OnStart(_)); |
401 StartPipeline(); | 402 StartPipeline(); |
402 message_loop_.RunUntilIdle(); | 403 base::RunLoop().RunUntilIdle(); |
403 | 404 |
404 pipeline_->Stop(); | 405 pipeline_->Stop(); |
405 } | 406 } |
406 | 407 |
407 TEST_F(PipelineImplTest, DemuxerErrorDuringStop) { | 408 TEST_F(PipelineImplTest, DemuxerErrorDuringStop) { |
408 CreateAudioStream(); | 409 CreateAudioStream(); |
409 MockDemuxerStreamVector streams; | 410 MockDemuxerStreamVector streams; |
410 streams.push_back(audio_stream()); | 411 streams.push_back(audio_stream()); |
411 | 412 |
412 SetDemuxerExpectations(&streams); | 413 SetDemuxerExpectations(&streams); |
413 SetRendererExpectations(); | 414 SetRendererExpectations(); |
414 | 415 |
415 StartPipelineAndExpect(PIPELINE_OK); | 416 StartPipelineAndExpect(PIPELINE_OK); |
416 message_loop_.RunUntilIdle(); | 417 base::RunLoop().RunUntilIdle(); |
417 | 418 |
418 EXPECT_CALL(*demuxer_, Stop()) | 419 EXPECT_CALL(*demuxer_, Stop()) |
419 .WillOnce(InvokeWithoutArgs(this, &PipelineImplTest::OnDemuxerError)); | 420 .WillOnce(InvokeWithoutArgs(this, &PipelineImplTest::OnDemuxerError)); |
420 pipeline_->Stop(); | 421 pipeline_->Stop(); |
421 message_loop_.RunUntilIdle(); | 422 base::RunLoop().RunUntilIdle(); |
422 } | 423 } |
423 | 424 |
424 TEST_F(PipelineImplTest, NoStreams) { | 425 TEST_F(PipelineImplTest, NoStreams) { |
425 EXPECT_CALL(*demuxer_, Initialize(_, _, _)) | 426 EXPECT_CALL(*demuxer_, Initialize(_, _, _)) |
426 .WillOnce(PostCallback<1>(PIPELINE_OK)); | 427 .WillOnce(PostCallback<1>(PIPELINE_OK)); |
427 EXPECT_CALL(*demuxer_, Stop()); | 428 EXPECT_CALL(*demuxer_, Stop()); |
428 EXPECT_CALL(callbacks_, OnMetadata(_)); | 429 EXPECT_CALL(callbacks_, OnMetadata(_)); |
429 | 430 |
430 StartPipelineAndExpect(PIPELINE_ERROR_COULD_NOT_RENDER); | 431 StartPipelineAndExpect(PIPELINE_ERROR_COULD_NOT_RENDER); |
431 } | 432 } |
(...skipping 100 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
532 | 533 |
533 SetDemuxerExpectations(&streams, base::TimeDelta::FromSeconds(3000)); | 534 SetDemuxerExpectations(&streams, base::TimeDelta::FromSeconds(3000)); |
534 SetRendererExpectations(); | 535 SetRendererExpectations(); |
535 | 536 |
536 // Initialize then seek! | 537 // Initialize then seek! |
537 StartPipelineAndExpect(PIPELINE_OK); | 538 StartPipelineAndExpect(PIPELINE_OK); |
538 | 539 |
539 EXPECT_CALL(*demuxer_, Stop()); | 540 EXPECT_CALL(*demuxer_, Stop()); |
540 EXPECT_CALL(callbacks_, OnError(_)); | 541 EXPECT_CALL(callbacks_, OnError(_)); |
541 OnDemuxerError(); | 542 OnDemuxerError(); |
542 message_loop_.RunUntilIdle(); | 543 base::RunLoop().RunUntilIdle(); |
543 | 544 |
544 pipeline_->Seek( | 545 pipeline_->Seek( |
545 base::TimeDelta::FromMilliseconds(100), | 546 base::TimeDelta::FromMilliseconds(100), |
546 base::Bind(&CallbackHelper::OnSeek, base::Unretained(&callbacks_))); | 547 base::Bind(&CallbackHelper::OnSeek, base::Unretained(&callbacks_))); |
547 message_loop_.RunUntilIdle(); | 548 base::RunLoop().RunUntilIdle(); |
548 } | 549 } |
549 | 550 |
550 TEST_F(PipelineImplTest, SuspendResume) { | 551 TEST_F(PipelineImplTest, SuspendResume) { |
551 CreateAudioStream(); | 552 CreateAudioStream(); |
552 CreateVideoStream(); | 553 CreateVideoStream(); |
553 CreateTextStream(); | 554 CreateTextStream(); |
554 MockDemuxerStreamVector streams; | 555 MockDemuxerStreamVector streams; |
555 streams.push_back(audio_stream()); | 556 streams.push_back(audio_stream()); |
556 streams.push_back(video_stream()); | 557 streams.push_back(video_stream()); |
557 | 558 |
558 SetDemuxerExpectations(&streams, base::TimeDelta::FromSeconds(3000)); | 559 SetDemuxerExpectations(&streams, base::TimeDelta::FromSeconds(3000)); |
559 SetRendererExpectations(); | 560 SetRendererExpectations(); |
560 | 561 |
561 StartPipelineAndExpect(PIPELINE_OK); | 562 StartPipelineAndExpect(PIPELINE_OK); |
562 | 563 |
563 // Inject some fake memory usage to verify its cleared after suspend. | 564 // Inject some fake memory usage to verify its cleared after suspend. |
564 PipelineStatistics stats; | 565 PipelineStatistics stats; |
565 stats.audio_memory_usage = 12345; | 566 stats.audio_memory_usage = 12345; |
566 stats.video_memory_usage = 67890; | 567 stats.video_memory_usage = 67890; |
567 renderer_client_->OnStatisticsUpdate(stats); | 568 renderer_client_->OnStatisticsUpdate(stats); |
568 message_loop_.RunUntilIdle(); | 569 base::RunLoop().RunUntilIdle(); |
569 | 570 |
570 EXPECT_EQ(stats.audio_memory_usage, | 571 EXPECT_EQ(stats.audio_memory_usage, |
571 pipeline_->GetStatistics().audio_memory_usage); | 572 pipeline_->GetStatistics().audio_memory_usage); |
572 EXPECT_EQ(stats.video_memory_usage, | 573 EXPECT_EQ(stats.video_memory_usage, |
573 pipeline_->GetStatistics().video_memory_usage); | 574 pipeline_->GetStatistics().video_memory_usage); |
574 | 575 |
575 ExpectSuspend(); | 576 ExpectSuspend(); |
576 DoSuspend(); | 577 DoSuspend(); |
577 | 578 |
578 EXPECT_EQ(0, pipeline_->GetStatistics().audio_memory_usage); | 579 EXPECT_EQ(0, pipeline_->GetStatistics().audio_memory_usage); |
(...skipping 12 matching lines...) Expand all Loading... |
591 SetDemuxerExpectations(&streams); | 592 SetDemuxerExpectations(&streams); |
592 SetRendererExpectations(); | 593 SetRendererExpectations(); |
593 | 594 |
594 // The audio renderer should receive a call to SetVolume(). | 595 // The audio renderer should receive a call to SetVolume(). |
595 float expected = 0.5f; | 596 float expected = 0.5f; |
596 EXPECT_CALL(*renderer_, SetVolume(expected)); | 597 EXPECT_CALL(*renderer_, SetVolume(expected)); |
597 | 598 |
598 // Initialize then set volume! | 599 // Initialize then set volume! |
599 StartPipelineAndExpect(PIPELINE_OK); | 600 StartPipelineAndExpect(PIPELINE_OK); |
600 pipeline_->SetVolume(expected); | 601 pipeline_->SetVolume(expected); |
601 message_loop_.RunUntilIdle(); | 602 base::RunLoop().RunUntilIdle(); |
602 } | 603 } |
603 | 604 |
604 TEST_F(PipelineImplTest, Properties) { | 605 TEST_F(PipelineImplTest, Properties) { |
605 CreateVideoStream(); | 606 CreateVideoStream(); |
606 MockDemuxerStreamVector streams; | 607 MockDemuxerStreamVector streams; |
607 streams.push_back(video_stream()); | 608 streams.push_back(video_stream()); |
608 | 609 |
609 const base::TimeDelta kDuration = base::TimeDelta::FromSeconds(100); | 610 const base::TimeDelta kDuration = base::TimeDelta::FromSeconds(100); |
610 SetDemuxerExpectations(&streams, kDuration); | 611 SetDemuxerExpectations(&streams, kDuration); |
611 SetRendererExpectations(); | 612 SetRendererExpectations(); |
(...skipping 24 matching lines...) Expand all Loading... |
636 } | 637 } |
637 | 638 |
638 TEST_F(PipelineImplTest, BufferedTimeRangesCanChangeAfterStop) { | 639 TEST_F(PipelineImplTest, BufferedTimeRangesCanChangeAfterStop) { |
639 EXPECT_CALL(*demuxer_, Initialize(_, _, _)) | 640 EXPECT_CALL(*demuxer_, Initialize(_, _, _)) |
640 .WillOnce( | 641 .WillOnce( |
641 DoAll(SaveArg<0>(&demuxer_host_), PostCallback<1>(PIPELINE_OK))); | 642 DoAll(SaveArg<0>(&demuxer_host_), PostCallback<1>(PIPELINE_OK))); |
642 EXPECT_CALL(*demuxer_, Stop()); | 643 EXPECT_CALL(*demuxer_, Stop()); |
643 EXPECT_CALL(callbacks_, OnMetadata(_)); | 644 EXPECT_CALL(callbacks_, OnMetadata(_)); |
644 EXPECT_CALL(callbacks_, OnStart(_)); | 645 EXPECT_CALL(callbacks_, OnStart(_)); |
645 StartPipeline(); | 646 StartPipeline(); |
646 message_loop_.RunUntilIdle(); | 647 base::RunLoop().RunUntilIdle(); |
647 | 648 |
648 pipeline_->Stop(); | 649 pipeline_->Stop(); |
649 RunBufferedTimeRangesTest(base::TimeDelta::FromSeconds(5)); | 650 RunBufferedTimeRangesTest(base::TimeDelta::FromSeconds(5)); |
650 } | 651 } |
651 | 652 |
652 TEST_F(PipelineImplTest, EndedCallback) { | 653 TEST_F(PipelineImplTest, EndedCallback) { |
653 CreateAudioStream(); | 654 CreateAudioStream(); |
654 CreateVideoStream(); | 655 CreateVideoStream(); |
655 CreateTextStream(); | 656 CreateTextStream(); |
656 MockDemuxerStreamVector streams; | 657 MockDemuxerStreamVector streams; |
657 streams.push_back(audio_stream()); | 658 streams.push_back(audio_stream()); |
658 streams.push_back(video_stream()); | 659 streams.push_back(video_stream()); |
659 | 660 |
660 SetDemuxerExpectations(&streams); | 661 SetDemuxerExpectations(&streams); |
661 SetRendererExpectations(); | 662 SetRendererExpectations(); |
662 StartPipelineAndExpect(PIPELINE_OK); | 663 StartPipelineAndExpect(PIPELINE_OK); |
663 | 664 |
664 AddTextStream(); | 665 AddTextStream(); |
665 | 666 |
666 // The ended callback shouldn't run until all renderers have ended. | 667 // The ended callback shouldn't run until all renderers have ended. |
667 renderer_client_->OnEnded(); | 668 renderer_client_->OnEnded(); |
668 message_loop_.RunUntilIdle(); | 669 base::RunLoop().RunUntilIdle(); |
669 | 670 |
670 EXPECT_CALL(callbacks_, OnEnded()); | 671 EXPECT_CALL(callbacks_, OnEnded()); |
671 text_stream()->SendEosNotification(); | 672 text_stream()->SendEosNotification(); |
672 message_loop_.RunUntilIdle(); | 673 base::RunLoop().RunUntilIdle(); |
673 } | 674 } |
674 | 675 |
675 TEST_F(PipelineImplTest, ErrorDuringSeek) { | 676 TEST_F(PipelineImplTest, ErrorDuringSeek) { |
676 CreateAudioStream(); | 677 CreateAudioStream(); |
677 MockDemuxerStreamVector streams; | 678 MockDemuxerStreamVector streams; |
678 streams.push_back(audio_stream()); | 679 streams.push_back(audio_stream()); |
679 | 680 |
680 SetDemuxerExpectations(&streams); | 681 SetDemuxerExpectations(&streams); |
681 SetRendererExpectations(); | 682 SetRendererExpectations(); |
682 StartPipelineAndExpect(PIPELINE_OK); | 683 StartPipelineAndExpect(PIPELINE_OK); |
683 | 684 |
684 double playback_rate = 1.0; | 685 double playback_rate = 1.0; |
685 EXPECT_CALL(*renderer_, SetPlaybackRate(playback_rate)); | 686 EXPECT_CALL(*renderer_, SetPlaybackRate(playback_rate)); |
686 pipeline_->SetPlaybackRate(playback_rate); | 687 pipeline_->SetPlaybackRate(playback_rate); |
687 message_loop_.RunUntilIdle(); | 688 base::RunLoop().RunUntilIdle(); |
688 | 689 |
689 base::TimeDelta seek_time = base::TimeDelta::FromSeconds(5); | 690 base::TimeDelta seek_time = base::TimeDelta::FromSeconds(5); |
690 | 691 |
691 EXPECT_CALL(callbacks_, OnBufferingStateChange(BUFFERING_HAVE_NOTHING)); | 692 EXPECT_CALL(callbacks_, OnBufferingStateChange(BUFFERING_HAVE_NOTHING)); |
692 EXPECT_CALL(*renderer_, Flush(_)) | 693 EXPECT_CALL(*renderer_, Flush(_)) |
693 .WillOnce( | 694 .WillOnce( |
694 DoAll(SetBufferingState(&renderer_client_, BUFFERING_HAVE_NOTHING), | 695 DoAll(SetBufferingState(&renderer_client_, BUFFERING_HAVE_NOTHING), |
695 RunClosure<0>())); | 696 RunClosure<0>())); |
696 | 697 |
697 EXPECT_CALL(*demuxer_, Seek(seek_time, _)) | 698 EXPECT_CALL(*demuxer_, Seek(seek_time, _)) |
698 .WillOnce(RunCallback<1>(PIPELINE_ERROR_READ)); | 699 .WillOnce(RunCallback<1>(PIPELINE_ERROR_READ)); |
699 EXPECT_CALL(*demuxer_, Stop()); | 700 EXPECT_CALL(*demuxer_, Stop()); |
700 | 701 |
701 pipeline_->Seek(seek_time, base::Bind(&CallbackHelper::OnSeek, | 702 pipeline_->Seek(seek_time, base::Bind(&CallbackHelper::OnSeek, |
702 base::Unretained(&callbacks_))); | 703 base::Unretained(&callbacks_))); |
703 EXPECT_CALL(callbacks_, OnSeek(PIPELINE_ERROR_READ)); | 704 EXPECT_CALL(callbacks_, OnSeek(PIPELINE_ERROR_READ)); |
704 message_loop_.RunUntilIdle(); | 705 base::RunLoop().RunUntilIdle(); |
705 } | 706 } |
706 | 707 |
707 // Invoked function OnError. This asserts that the pipeline does not enqueue | 708 // Invoked function OnError. This asserts that the pipeline does not enqueue |
708 // non-teardown related tasks while tearing down. | 709 // non-teardown related tasks while tearing down. |
709 static void TestNoCallsAfterError(PipelineImpl* pipeline, | 710 static void TestNoCallsAfterError(PipelineImpl* pipeline, |
710 base::MessageLoop* message_loop, | 711 base::MessageLoop* message_loop, |
711 PipelineStatus /* status */) { | 712 PipelineStatus /* status */) { |
712 CHECK(pipeline); | 713 CHECK(pipeline); |
713 CHECK(message_loop); | 714 CHECK(message_loop); |
714 | 715 |
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
747 RunClosure<0>())); | 748 RunClosure<0>())); |
748 EXPECT_CALL(callbacks_, OnBufferingStateChange(BUFFERING_HAVE_NOTHING)); | 749 EXPECT_CALL(callbacks_, OnBufferingStateChange(BUFFERING_HAVE_NOTHING)); |
749 | 750 |
750 EXPECT_CALL(*demuxer_, Seek(seek_time, _)) | 751 EXPECT_CALL(*demuxer_, Seek(seek_time, _)) |
751 .WillOnce(RunCallback<1>(PIPELINE_ERROR_READ)); | 752 .WillOnce(RunCallback<1>(PIPELINE_ERROR_READ)); |
752 EXPECT_CALL(*demuxer_, Stop()); | 753 EXPECT_CALL(*demuxer_, Stop()); |
753 | 754 |
754 pipeline_->Seek(seek_time, base::Bind(&CallbackHelper::OnSeek, | 755 pipeline_->Seek(seek_time, base::Bind(&CallbackHelper::OnSeek, |
755 base::Unretained(&callbacks_))); | 756 base::Unretained(&callbacks_))); |
756 EXPECT_CALL(callbacks_, OnSeek(PIPELINE_ERROR_READ)); | 757 EXPECT_CALL(callbacks_, OnSeek(PIPELINE_ERROR_READ)); |
757 message_loop_.RunUntilIdle(); | 758 base::RunLoop().RunUntilIdle(); |
758 } | 759 } |
759 | 760 |
760 TEST_F(PipelineImplTest, DestroyAfterStop) { | 761 TEST_F(PipelineImplTest, DestroyAfterStop) { |
761 CreateAudioStream(); | 762 CreateAudioStream(); |
762 MockDemuxerStreamVector streams; | 763 MockDemuxerStreamVector streams; |
763 streams.push_back(audio_stream()); | 764 streams.push_back(audio_stream()); |
764 SetDemuxerExpectations(&streams); | 765 SetDemuxerExpectations(&streams); |
765 SetRendererExpectations(); | 766 SetRendererExpectations(); |
766 StartPipelineAndExpect(PIPELINE_OK); | 767 StartPipelineAndExpect(PIPELINE_OK); |
767 | 768 |
768 ExpectDemuxerStop(); | 769 ExpectDemuxerStop(); |
769 pipeline_->Stop(); | 770 pipeline_->Stop(); |
770 message_loop_.RunUntilIdle(); | 771 base::RunLoop().RunUntilIdle(); |
771 } | 772 } |
772 | 773 |
773 TEST_F(PipelineImplTest, Underflow) { | 774 TEST_F(PipelineImplTest, Underflow) { |
774 CreateAudioStream(); | 775 CreateAudioStream(); |
775 CreateVideoStream(); | 776 CreateVideoStream(); |
776 MockDemuxerStreamVector streams; | 777 MockDemuxerStreamVector streams; |
777 streams.push_back(audio_stream()); | 778 streams.push_back(audio_stream()); |
778 streams.push_back(video_stream()); | 779 streams.push_back(video_stream()); |
779 | 780 |
780 SetDemuxerExpectations(&streams); | 781 SetDemuxerExpectations(&streams); |
781 SetRendererExpectations(); | 782 SetRendererExpectations(); |
782 StartPipelineAndExpect(PIPELINE_OK); | 783 StartPipelineAndExpect(PIPELINE_OK); |
783 | 784 |
784 // Simulate underflow. | 785 // Simulate underflow. |
785 EXPECT_CALL(callbacks_, OnBufferingStateChange(BUFFERING_HAVE_NOTHING)); | 786 EXPECT_CALL(callbacks_, OnBufferingStateChange(BUFFERING_HAVE_NOTHING)); |
786 renderer_client_->OnBufferingStateChange(BUFFERING_HAVE_NOTHING); | 787 renderer_client_->OnBufferingStateChange(BUFFERING_HAVE_NOTHING); |
787 message_loop_.RunUntilIdle(); | 788 base::RunLoop().RunUntilIdle(); |
788 | 789 |
789 // Seek while underflowed. | 790 // Seek while underflowed. |
790 base::TimeDelta expected = base::TimeDelta::FromSeconds(5); | 791 base::TimeDelta expected = base::TimeDelta::FromSeconds(5); |
791 ExpectSeek(expected, true); | 792 ExpectSeek(expected, true); |
792 DoSeek(expected); | 793 DoSeek(expected); |
793 } | 794 } |
794 | 795 |
795 TEST_F(PipelineImplTest, PositiveStartTime) { | 796 TEST_F(PipelineImplTest, PositiveStartTime) { |
796 start_time_ = base::TimeDelta::FromSeconds(1); | 797 start_time_ = base::TimeDelta::FromSeconds(1); |
797 EXPECT_CALL(*demuxer_, GetStartTime()).WillRepeatedly(Return(start_time_)); | 798 EXPECT_CALL(*demuxer_, GetStartTime()).WillRepeatedly(Return(start_time_)); |
798 CreateAudioStream(); | 799 CreateAudioStream(); |
799 MockDemuxerStreamVector streams; | 800 MockDemuxerStreamVector streams; |
800 streams.push_back(audio_stream()); | 801 streams.push_back(audio_stream()); |
801 SetDemuxerExpectations(&streams); | 802 SetDemuxerExpectations(&streams); |
802 SetRendererExpectations(); | 803 SetRendererExpectations(); |
803 StartPipelineAndExpect(PIPELINE_OK); | 804 StartPipelineAndExpect(PIPELINE_OK); |
804 ExpectDemuxerStop(); | 805 ExpectDemuxerStop(); |
805 pipeline_->Stop(); | 806 pipeline_->Stop(); |
806 message_loop_.RunUntilIdle(); | 807 base::RunLoop().RunUntilIdle(); |
807 } | 808 } |
808 | 809 |
809 class PipelineTeardownTest : public PipelineImplTest { | 810 class PipelineTeardownTest : public PipelineImplTest { |
810 public: | 811 public: |
811 enum TeardownState { | 812 enum TeardownState { |
812 kInitDemuxer, | 813 kInitDemuxer, |
813 kInitRenderer, | 814 kInitRenderer, |
814 kFlushing, | 815 kFlushing, |
815 kSeeking, | 816 kSeeking, |
816 kPlaying, | 817 kPlaying, |
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
855 } | 856 } |
856 } | 857 } |
857 | 858 |
858 private: | 859 private: |
859 // TODO(scherkus): We do radically different things whether teardown is | 860 // TODO(scherkus): We do radically different things whether teardown is |
860 // invoked via stop vs error. The teardown path should be the same, | 861 // invoked via stop vs error. The teardown path should be the same, |
861 // see http://crbug.com/110228 | 862 // see http://crbug.com/110228 |
862 void DoInitialize(TeardownState state, StopOrError stop_or_error) { | 863 void DoInitialize(TeardownState state, StopOrError stop_or_error) { |
863 SetInitializeExpectations(state, stop_or_error); | 864 SetInitializeExpectations(state, stop_or_error); |
864 StartPipeline(); | 865 StartPipeline(); |
865 message_loop_.RunUntilIdle(); | 866 base::RunLoop().RunUntilIdle(); |
866 } | 867 } |
867 | 868 |
868 void SetInitializeExpectations(TeardownState state, | 869 void SetInitializeExpectations(TeardownState state, |
869 StopOrError stop_or_error) { | 870 StopOrError stop_or_error) { |
870 if (state == kInitDemuxer) { | 871 if (state == kInitDemuxer) { |
871 if (stop_or_error == kStop) { | 872 if (stop_or_error == kStop) { |
872 EXPECT_CALL(*demuxer_, Initialize(_, _, _)) | 873 EXPECT_CALL(*demuxer_, Initialize(_, _, _)) |
873 .WillOnce( | 874 .WillOnce( |
874 DoAll(Stop(pipeline_.get()), PostCallback<1>(PIPELINE_OK))); | 875 DoAll(Stop(pipeline_.get()), PostCallback<1>(PIPELINE_OK))); |
875 // Note: OnStart callback is not called after pipeline is stopped. | 876 // Note: OnStart callback is not called after pipeline is stopped. |
(...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
927 } | 928 } |
928 | 929 |
929 void DoSeek(TeardownState state, StopOrError stop_or_error) { | 930 void DoSeek(TeardownState state, StopOrError stop_or_error) { |
930 SetSeekExpectations(state, stop_or_error); | 931 SetSeekExpectations(state, stop_or_error); |
931 | 932 |
932 EXPECT_CALL(*demuxer_, Stop()); | 933 EXPECT_CALL(*demuxer_, Stop()); |
933 | 934 |
934 pipeline_->Seek( | 935 pipeline_->Seek( |
935 base::TimeDelta::FromSeconds(10), | 936 base::TimeDelta::FromSeconds(10), |
936 base::Bind(&CallbackHelper::OnSeek, base::Unretained(&callbacks_))); | 937 base::Bind(&CallbackHelper::OnSeek, base::Unretained(&callbacks_))); |
937 message_loop_.RunUntilIdle(); | 938 base::RunLoop().RunUntilIdle(); |
938 } | 939 } |
939 | 940 |
940 void SetSeekExpectations(TeardownState state, StopOrError stop_or_error) { | 941 void SetSeekExpectations(TeardownState state, StopOrError stop_or_error) { |
941 if (state == kFlushing) { | 942 if (state == kFlushing) { |
942 if (stop_or_error == kStop) { | 943 if (stop_or_error == kStop) { |
943 EXPECT_CALL(*renderer_, Flush(_)) | 944 EXPECT_CALL(*renderer_, Flush(_)) |
944 .WillOnce(DoAll( | 945 .WillOnce(DoAll( |
945 SetBufferingState(&renderer_client_, BUFFERING_HAVE_NOTHING), | 946 SetBufferingState(&renderer_client_, BUFFERING_HAVE_NOTHING), |
946 Stop(pipeline_.get()), RunClosure<0>())); | 947 Stop(pipeline_.get()), RunClosure<0>())); |
947 // Note: OnBufferingStateChange or OnSeek callbacks are not called | 948 // Note: OnBufferingStateChange or OnSeek callbacks are not called |
(...skipping 89 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1037 EXPECT_CALL(callbacks_, OnError(PIPELINE_ERROR_READ)); | 1038 EXPECT_CALL(callbacks_, OnError(PIPELINE_ERROR_READ)); |
1038 } | 1039 } |
1039 renderer_client_->OnError(PIPELINE_ERROR_READ); | 1040 renderer_client_->OnError(PIPELINE_ERROR_READ); |
1040 break; | 1041 break; |
1041 | 1042 |
1042 case kErrorAndStop: | 1043 case kErrorAndStop: |
1043 EXPECT_CALL(*demuxer_, Stop()); | 1044 EXPECT_CALL(*demuxer_, Stop()); |
1044 if (expect_errors) | 1045 if (expect_errors) |
1045 EXPECT_CALL(callbacks_, OnError(PIPELINE_ERROR_READ)); | 1046 EXPECT_CALL(callbacks_, OnError(PIPELINE_ERROR_READ)); |
1046 renderer_client_->OnError(PIPELINE_ERROR_READ); | 1047 renderer_client_->OnError(PIPELINE_ERROR_READ); |
1047 message_loop_.RunUntilIdle(); | 1048 base::RunLoop().RunUntilIdle(); |
1048 pipeline_->Stop(); | 1049 pipeline_->Stop(); |
1049 break; | 1050 break; |
1050 } | 1051 } |
1051 | 1052 |
1052 message_loop_.RunUntilIdle(); | 1053 base::RunLoop().RunUntilIdle(); |
1053 } | 1054 } |
1054 | 1055 |
1055 DISALLOW_COPY_AND_ASSIGN(PipelineTeardownTest); | 1056 DISALLOW_COPY_AND_ASSIGN(PipelineTeardownTest); |
1056 }; | 1057 }; |
1057 | 1058 |
1058 #define INSTANTIATE_TEARDOWN_TEST(stop_or_error, state) \ | 1059 #define INSTANTIATE_TEARDOWN_TEST(stop_or_error, state) \ |
1059 TEST_F(PipelineTeardownTest, stop_or_error##_##state) { \ | 1060 TEST_F(PipelineTeardownTest, stop_or_error##_##state) { \ |
1060 RunTest(k##state, k##stop_or_error); \ | 1061 RunTest(k##state, k##stop_or_error); \ |
1061 } | 1062 } |
1062 | 1063 |
(...skipping 12 matching lines...) Expand all Loading... |
1075 INSTANTIATE_TEARDOWN_TEST(Error, Seeking); | 1076 INSTANTIATE_TEARDOWN_TEST(Error, Seeking); |
1076 INSTANTIATE_TEARDOWN_TEST(Error, Playing); | 1077 INSTANTIATE_TEARDOWN_TEST(Error, Playing); |
1077 INSTANTIATE_TEARDOWN_TEST(Error, Suspending); | 1078 INSTANTIATE_TEARDOWN_TEST(Error, Suspending); |
1078 INSTANTIATE_TEARDOWN_TEST(Error, Suspended); | 1079 INSTANTIATE_TEARDOWN_TEST(Error, Suspended); |
1079 INSTANTIATE_TEARDOWN_TEST(Error, Resuming); | 1080 INSTANTIATE_TEARDOWN_TEST(Error, Resuming); |
1080 | 1081 |
1081 INSTANTIATE_TEARDOWN_TEST(ErrorAndStop, Playing); | 1082 INSTANTIATE_TEARDOWN_TEST(ErrorAndStop, Playing); |
1082 INSTANTIATE_TEARDOWN_TEST(ErrorAndStop, Suspended); | 1083 INSTANTIATE_TEARDOWN_TEST(ErrorAndStop, Suspended); |
1083 | 1084 |
1084 } // namespace media | 1085 } // namespace media |
OLD | NEW |