diff options
author | scherkus@chromium.org <scherkus@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2012-08-10 17:44:15 +0000 |
---|---|---|
committer | scherkus@chromium.org <scherkus@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2012-08-10 17:44:15 +0000 |
commit | c2fd0e4d6bfd1d9bbc0533738bf6d980175fdbb9 (patch) | |
tree | c34a15cf902aceafe557671509e979f4e22ca4c9 /media/base/pipeline_unittest.cc | |
parent | 4b0dcd8abdc7ca8f5dcb7408afe3074a18d0e50c (diff) | |
download | chromium_src-c2fd0e4d6bfd1d9bbc0533738bf6d980175fdbb9.zip chromium_src-c2fd0e4d6bfd1d9bbc0533738bf6d980175fdbb9.tar.gz chromium_src-c2fd0e4d6bfd1d9bbc0533738bf6d980175fdbb9.tar.bz2 |
Fold Pipeline initialization failure tests added in r150636 into PipelineTeardownTest.
As a bonus we now get coverage on stopping-while-initializing!
Review URL: https://chromiumcodereview.appspot.com/10834266
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@151075 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'media/base/pipeline_unittest.cc')
-rw-r--r-- | media/base/pipeline_unittest.cc | 319 |
1 files changed, 198 insertions, 121 deletions
diff --git a/media/base/pipeline_unittest.cc b/media/base/pipeline_unittest.cc index bb6ba61..7fc0c8e 100644 --- a/media/base/pipeline_unittest.cc +++ b/media/base/pipeline_unittest.cc @@ -878,114 +878,6 @@ TEST_F(PipelineTest, AudioTimeUpdateDuringSeek) { EXPECT_EQ(pipeline_->GetMediaTime(), new_time); } -TEST_F(PipelineTest, InitFailure_Demuxer) { - PipelineStatus expected_status = DEMUXER_ERROR_COULD_NOT_OPEN; - EXPECT_CALL(*mocks_->demuxer(), Initialize(_, _)) - .WillOnce(RunPipelineStatusCBWithStatus(expected_status)); - EXPECT_CALL(*mocks_->demuxer(), Stop(_)) - .WillOnce(RunClosure()); - InitializePipeline(expected_status); -} - -TEST_F(PipelineTest, InitFailure_AudioDecoder) { - CreateAudioStream(); - MockDemuxerStreamVector streams; - streams.push_back(audio_stream()); - - InitializeDemuxer(&streams); - - PipelineStatus expected_status = PIPELINE_ERROR_DECODE; - scoped_refptr<DemuxerStream> stream = streams[0]; - EXPECT_CALL(*mocks_->audio_decoder(), Initialize(stream, _, _)) - .WillOnce(RunPipelineStatusCBWithStatus(expected_status)); - - EXPECT_CALL(*mocks_->demuxer(), Stop(_)) - .WillOnce(RunClosure()); - - InitializePipeline(expected_status); - EXPECT_FALSE(pipeline_->HasAudio()); -} - -TEST_F(PipelineTest, InitFailure_AudioRenderer) { - CreateAudioStream(); - MockDemuxerStreamVector streams; - streams.push_back(audio_stream()); - - InitializeDemuxer(&streams); - InitializeAudioDecoder(audio_stream()); - - PipelineStatus expected_status = PIPELINE_ERROR_INITIALIZATION_FAILED; - EXPECT_CALL(*mocks_->audio_renderer(), Initialize( - scoped_refptr<AudioDecoder>(mocks_->audio_decoder()), - _, _, _, _, _, _)) - .WillOnce(RunPipelineStatusCBWithStatus(expected_status)); - - EXPECT_CALL(*mocks_->demuxer(), Stop(_)) - .WillOnce(RunClosure()); - EXPECT_CALL(*mocks_->audio_renderer(), Stop(_)) - .WillOnce(RunClosure()); - - InitializePipeline(expected_status); - EXPECT_TRUE(pipeline_->HasAudio()); -} - -TEST_F(PipelineTest, InitFailure_VideoDecoder) { - CreateAudioStream(); - CreateVideoStream(); - MockDemuxerStreamVector streams; - streams.push_back(audio_stream()); - streams.push_back(video_stream()); - - InitializeDemuxer(&streams); - InitializeAudioDecoder(audio_stream()); - InitializeAudioRenderer(); - - PipelineStatus expected_status = PIPELINE_ERROR_DECODE; - scoped_refptr<DemuxerStream> stream = streams[1]; - EXPECT_CALL(*mocks_->video_decoder(), - Initialize(stream, _, _)) - .WillOnce(RunPipelineStatusCBWithStatus(expected_status)); - - EXPECT_CALL(*mocks_->demuxer(), Stop(_)) - .WillOnce(RunClosure()); - EXPECT_CALL(*mocks_->audio_renderer(), Stop(_)) - .WillOnce(RunClosure()); - - InitializePipeline(expected_status); - EXPECT_TRUE(pipeline_->HasAudio()); - EXPECT_FALSE(pipeline_->HasVideo()); -} - -TEST_F(PipelineTest, InitFailure_VideoRenderer) { - CreateAudioStream(); - CreateVideoStream(); - MockDemuxerStreamVector streams; - streams.push_back(audio_stream()); - streams.push_back(video_stream()); - - InitializeDemuxer(&streams); - InitializeAudioDecoder(audio_stream()); - InitializeAudioRenderer(); - InitializeVideoDecoder(video_stream()); - - PipelineStatus expected_status = PIPELINE_ERROR_INITIALIZATION_FAILED; - EXPECT_CALL(*mocks_->video_renderer(), Initialize( - scoped_refptr<VideoDecoder>(mocks_->video_decoder()), - _, _, _, _, _, _, _, _)) - .WillOnce(RunPipelineStatusCBWithStatus(expected_status)); - - EXPECT_CALL(*mocks_->demuxer(), Stop(_)) - .WillOnce(RunClosure()); - EXPECT_CALL(*mocks_->audio_renderer(), Stop(_)) - .WillOnce(RunClosure()); - EXPECT_CALL(*mocks_->video_renderer(), Stop(_)) - .WillOnce(RunClosure()); - - InitializePipeline(expected_status); - EXPECT_TRUE(pipeline_->HasAudio()); - EXPECT_TRUE(pipeline_->HasVideo()); -} - class FlexibleCallbackRunner : public base::DelegateSimpleThread::Delegate { public: FlexibleCallbackRunner(base::TimeDelta delay, PipelineStatus status, @@ -1042,6 +934,11 @@ TEST(PipelineStatusNotificationTest, DelayedCallback) { class PipelineTeardownTest : public PipelineTest { public: enum TeardownState { + kInitDemuxer, + kInitAudioDecoder, + kInitAudioRenderer, + kInitVideoDecoder, + kInitVideoRenderer, kPausing, kFlushing, kSeeking, @@ -1055,25 +952,27 @@ class PipelineTeardownTest : public PipelineTest { kError, }; - PipelineTeardownTest() { - CreateAudioStream(); - MockDemuxerStreamVector streams; - streams.push_back(audio_stream()); - - InitializeDemuxer(&streams, base::TimeDelta::FromSeconds(3000)); - InitializeAudioDecoder(audio_stream()); - InitializeAudioRenderer(); - InitializePipeline(PIPELINE_OK); - } + PipelineTeardownTest() {} + virtual ~PipelineTeardownTest() {} void RunTest(TeardownState state, StopOrError stop_or_error) { - InSequence s; switch (state) { + case kInitDemuxer: + case kInitAudioDecoder: + case kInitAudioRenderer: + case kInitVideoDecoder: + case kInitVideoRenderer: + DoInitialize(state, stop_or_error); + break; + case kPausing: case kFlushing: case kSeeking: case kPrerolling: - case kStarting: + case kStarting: { + DoInitialize(state, stop_or_error); + + InSequence s; if (stop_or_error == kStop) { ExpectSeekStop(state); } else { @@ -1081,8 +980,12 @@ class PipelineTeardownTest : public PipelineTest { } DoSeek(); break; + } + + case kPlaying: { + DoInitialize(state, stop_or_error); - case kPlaying: + InSequence s; if (stop_or_error == kStop) { ExpectStop(); DoStop(); @@ -1091,6 +994,7 @@ class PipelineTeardownTest : public PipelineTest { DoPlaybackError(); } break; + } } } @@ -1098,6 +1002,146 @@ class PipelineTeardownTest : public PipelineTest { // TODO(scherkus): We do radically different things whether teardown is // invoked via stop vs error. The teardown path should be the same, // see http://crbug.com/110228 + void DoInitialize(TeardownState state, StopOrError stop_or_error) { + PipelineStatus expected_status = + SetInitializeExpectations(state, stop_or_error); + + EXPECT_CALL(callbacks_, OnStart(expected_status)); + pipeline_->Start( + mocks_->Create().Pass(), + base::Bind(&CallbackHelper::OnEnded, base::Unretained(&callbacks_)), + base::Bind(&CallbackHelper::OnError, base::Unretained(&callbacks_)), + base::Bind(&CallbackHelper::OnStart, base::Unretained(&callbacks_))); + message_loop_.RunAllPending(); + } + + PipelineStatus SetInitializeExpectations(TeardownState state, + StopOrError stop_or_error) { + PipelineStatus status = PIPELINE_OK; + base::Closure stop_cb = base::Bind( + &CallbackHelper::OnStop, base::Unretained(&callbacks_)); + + if (state == kInitDemuxer) { + if (stop_or_error == kStop) { + EXPECT_CALL(*mocks_->demuxer(), Initialize(_, _)) + .WillOnce(DoAll(Stop(pipeline_, stop_cb), RunPipelineStatusCB())); + EXPECT_CALL(callbacks_, OnStop()); + } else { + status = DEMUXER_ERROR_COULD_NOT_OPEN; + EXPECT_CALL(*mocks_->demuxer(), Initialize(_, _)) + .WillOnce(RunPipelineStatusCBWithStatus(status)); + } + + EXPECT_CALL(*mocks_->demuxer(), Stop(_)).WillOnce(RunClosure()); + return status; + } + + CreateAudioStream(); + CreateVideoStream(); + MockDemuxerStreamVector streams; + streams.push_back(audio_stream()); + streams.push_back(video_stream()); + InitializeDemuxer(&streams, base::TimeDelta::FromSeconds(3000)); + + if (state == kInitAudioDecoder) { + if (stop_or_error == kStop) { + EXPECT_CALL(*mocks_->audio_decoder(), Initialize(_, _, _)) + .WillOnce(DoAll(Stop(pipeline_, stop_cb), RunPipelineStatusCB())); + EXPECT_CALL(callbacks_, OnStop()); + } else { + status = PIPELINE_ERROR_DECODE; + EXPECT_CALL(*mocks_->audio_decoder(), Initialize(_, _, _)) + .WillOnce(RunPipelineStatusCBWithStatus(status)); + } + + EXPECT_CALL(*mocks_->demuxer(), Stop(_)).WillOnce(RunClosure()); + return status; + } + + EXPECT_CALL(*mocks_->audio_decoder(), Initialize(_, _, _)) + .WillOnce(RunPipelineStatusCB()); + + if (state == kInitAudioRenderer) { + if (stop_or_error == kStop) { + EXPECT_CALL(*mocks_->audio_renderer(), Initialize(_, _, _, _, _, _, _)) + .WillOnce(DoAll(Stop(pipeline_, stop_cb), RunPipelineStatusCB())); + EXPECT_CALL(callbacks_, OnStop()); + } else { + status = PIPELINE_ERROR_INITIALIZATION_FAILED; + EXPECT_CALL(*mocks_->audio_renderer(), Initialize(_, _, _, _, _, _, _)) + .WillOnce(RunPipelineStatusCBWithStatus(status)); + } + + EXPECT_CALL(*mocks_->demuxer(), Stop(_)).WillOnce(RunClosure()); + EXPECT_CALL(*mocks_->audio_renderer(), Stop(_)).WillOnce(RunClosure()); + return status; + } + + EXPECT_CALL(*mocks_->audio_renderer(), Initialize(_, _, _, _, _, _, _)) + .WillOnce(RunPipelineStatusCB()); + + if (state == kInitVideoDecoder) { + if (stop_or_error == kStop) { + EXPECT_CALL(*mocks_->video_decoder(), Initialize(_, _, _)) + .WillOnce(DoAll(Stop(pipeline_, stop_cb), RunPipelineStatusCB())); + EXPECT_CALL(callbacks_, OnStop()); + } else { + status = PIPELINE_ERROR_DECODE; + EXPECT_CALL(*mocks_->video_decoder(), Initialize(_, _, _)) + .WillOnce(RunPipelineStatusCBWithStatus(status)); + } + + EXPECT_CALL(*mocks_->demuxer(), Stop(_)).WillOnce(RunClosure()); + EXPECT_CALL(*mocks_->audio_renderer(), Stop(_)).WillOnce(RunClosure()); + return status; + } + + EXPECT_CALL(*mocks_->video_decoder(), Initialize(_, _, _)) + .WillOnce(RunPipelineStatusCB()); + + if (state == kInitVideoRenderer) { + if (stop_or_error == kStop) { + EXPECT_CALL(*mocks_->video_renderer(), + Initialize(_, _, _, _, _, _, _, _, _)) + .WillOnce(DoAll(Stop(pipeline_, stop_cb), RunPipelineStatusCB())); + EXPECT_CALL(callbacks_, OnStop()); + } else { + status = PIPELINE_ERROR_INITIALIZATION_FAILED; + EXPECT_CALL(*mocks_->video_renderer(), + Initialize(_, _, _, _, _, _, _, _, _)) + .WillOnce(RunPipelineStatusCBWithStatus(status)); + } + + EXPECT_CALL(*mocks_->demuxer(), Stop(_)).WillOnce(RunClosure()); + EXPECT_CALL(*mocks_->audio_renderer(), Stop(_)).WillOnce(RunClosure()); + EXPECT_CALL(*mocks_->video_renderer(), Stop(_)).WillOnce(RunClosure()); + return status; + } + + EXPECT_CALL(*mocks_->video_renderer(), + Initialize(_, _, _, _, _, _, _, _, _)) + .WillOnce(RunPipelineStatusCB()); + + // If we get here it's a successful initialization. + EXPECT_CALL(*mocks_->demuxer(), SetPlaybackRate(0.0f)); + EXPECT_CALL(*mocks_->audio_renderer(), SetPlaybackRate(0.0f)); + EXPECT_CALL(*mocks_->video_renderer(), SetPlaybackRate(0.0f)); + + EXPECT_CALL(*mocks_->audio_renderer(), SetVolume(1.0f)); + + EXPECT_CALL(*mocks_->audio_renderer(), Preroll(base::TimeDelta(), _)) + .WillOnce(RunPipelineStatusCB()); + EXPECT_CALL(*mocks_->video_renderer(), Preroll(base::TimeDelta(), _)) + .WillOnce(RunPipelineStatusCB()); + + EXPECT_CALL(*mocks_->audio_renderer(), Play(_)) + .WillOnce(RunClosure()); + EXPECT_CALL(*mocks_->video_renderer(), Play(_)) + .WillOnce(RunClosure()); + + return status; + } + void ExpectSeekStop(TeardownState state) { base::Closure stop_cb = base::Bind( &CallbackHelper::OnStop, base::Unretained(&callbacks_)); @@ -1109,6 +1153,8 @@ class PipelineTeardownTest : public PipelineTest { EXPECT_CALL(*mocks_->audio_renderer(), Pause(_)).WillOnce(RunClosure()); } + EXPECT_CALL(*mocks_->video_renderer(), Pause(_)).WillOnce(RunClosure()); + if (state == kFlushing) { EXPECT_CALL(*mocks_->audio_renderer(), Flush(_)) .WillOnce(DoAll(Stop(pipeline_, stop_cb), RunClosure())); @@ -1116,6 +1162,8 @@ class PipelineTeardownTest : public PipelineTest { EXPECT_CALL(*mocks_->audio_renderer(), Flush(_)).WillOnce(RunClosure()); } + EXPECT_CALL(*mocks_->video_renderer(), Flush(_)).WillOnce(RunClosure()); + if (state == kSeeking) { EXPECT_CALL(*mocks_->demuxer(), Seek(_, _)) .WillOnce(DoAll(Stop(pipeline_, stop_cb), RunPipelineStatusCB())); @@ -1132,6 +1180,9 @@ class PipelineTeardownTest : public PipelineTest { .WillOnce(RunPipelineStatusCB()); } + EXPECT_CALL(*mocks_->video_renderer(), Preroll(_, _)) + .WillOnce(RunPipelineStatusCB()); + if (state == kStarting) { EXPECT_CALL(*mocks_->audio_renderer(), Play(_)) .WillOnce(DoAll(Stop(pipeline_, stop_cb), RunClosure())); @@ -1139,6 +1190,8 @@ class PipelineTeardownTest : public PipelineTest { EXPECT_CALL(*mocks_->audio_renderer(), Play(_)).WillOnce(RunClosure()); } + EXPECT_CALL(*mocks_->video_renderer(), Play(_)).WillOnce(RunClosure()); + EXPECT_CALL(callbacks_, OnSeek(PIPELINE_OK)); ExpectStop(); } @@ -1150,6 +1203,7 @@ class PipelineTeardownTest : public PipelineTest { EXPECT_CALL(callbacks_, OnSeek(PIPELINE_ERROR_READ)); EXPECT_CALL(*mocks_->demuxer(), Stop(_)).WillOnce(RunClosure()); EXPECT_CALL(*mocks_->audio_renderer(), Stop(_)).WillOnce(RunClosure()); + EXPECT_CALL(*mocks_->video_renderer(), Stop(_)).WillOnce(RunClosure()); } void SetSeekErrorExpectations(TeardownState state) { @@ -1157,19 +1211,23 @@ class PipelineTeardownTest : public PipelineTest { EXPECT_CALL(*mocks_->audio_renderer(), Pause(_)) .WillOnce(DoAll(SetError(pipeline_, PIPELINE_ERROR_READ), RunClosure())); + EXPECT_CALL(*mocks_->video_renderer(), Pause(_)).WillOnce(RunClosure()); return; } EXPECT_CALL(*mocks_->audio_renderer(), Pause(_)).WillOnce(RunClosure()); + EXPECT_CALL(*mocks_->video_renderer(), Pause(_)).WillOnce(RunClosure()); if (state == kFlushing) { EXPECT_CALL(*mocks_->audio_renderer(), Flush(_)) .WillOnce(DoAll(SetError(pipeline_, PIPELINE_ERROR_READ), RunClosure())); + EXPECT_CALL(*mocks_->video_renderer(), Flush(_)).WillOnce(RunClosure()); return; } EXPECT_CALL(*mocks_->audio_renderer(), Flush(_)).WillOnce(RunClosure()); + EXPECT_CALL(*mocks_->video_renderer(), Flush(_)).WillOnce(RunClosure()); if (state == kSeeking) { EXPECT_CALL(*mocks_->demuxer(), Seek(_, _)) @@ -1188,11 +1246,14 @@ class PipelineTeardownTest : public PipelineTest { EXPECT_CALL(*mocks_->audio_renderer(), Preroll(_, _)) .WillOnce(RunPipelineStatusCB()); + EXPECT_CALL(*mocks_->video_renderer(), Preroll(_, _)) + .WillOnce(RunPipelineStatusCB()); if (state == kStarting) { EXPECT_CALL(*mocks_->audio_renderer(), Play(_)) .WillOnce(DoAll(SetError(pipeline_, PIPELINE_ERROR_READ), RunClosure())); + EXPECT_CALL(*mocks_->video_renderer(), Play(_)).WillOnce(RunClosure()); return; } @@ -1202,9 +1263,12 @@ class PipelineTeardownTest : public PipelineTest { void ExpectStop() { // TODO(scherkus): Don't pause+flush, see http://crbug.com/110228 EXPECT_CALL(*mocks_->audio_renderer(), Pause(_)).WillOnce(RunClosure()); + EXPECT_CALL(*mocks_->video_renderer(), Pause(_)).WillOnce(RunClosure()); EXPECT_CALL(*mocks_->audio_renderer(), Flush(_)).WillOnce(RunClosure()); + EXPECT_CALL(*mocks_->video_renderer(), Flush(_)).WillOnce(RunClosure()); EXPECT_CALL(*mocks_->demuxer(), Stop(_)).WillOnce(RunClosure()); EXPECT_CALL(*mocks_->audio_renderer(), Stop(_)).WillOnce(RunClosure()); + EXPECT_CALL(*mocks_->video_renderer(), Stop(_)).WillOnce(RunClosure()); EXPECT_CALL(callbacks_, OnStop()); } @@ -1212,9 +1276,12 @@ class PipelineTeardownTest : public PipelineTest { void ExpectPlaybackError() { // TODO(scherkus): Don't pause+flush, see http://crbug.com/110228 EXPECT_CALL(*mocks_->audio_renderer(), Pause(_)).WillOnce(RunClosure()); + EXPECT_CALL(*mocks_->video_renderer(), Pause(_)).WillOnce(RunClosure()); EXPECT_CALL(*mocks_->audio_renderer(), Flush(_)).WillOnce(RunClosure()); + EXPECT_CALL(*mocks_->video_renderer(), Flush(_)).WillOnce(RunClosure()); EXPECT_CALL(*mocks_->demuxer(), Stop(_)).WillOnce(RunClosure()); EXPECT_CALL(*mocks_->audio_renderer(), Stop(_)).WillOnce(RunClosure()); + EXPECT_CALL(*mocks_->video_renderer(), Stop(_)).WillOnce(RunClosure()); EXPECT_CALL(callbacks_, OnError(PIPELINE_ERROR_READ)); } @@ -1244,6 +1311,11 @@ class PipelineTeardownTest : public PipelineTest { RunTest(k##state, k##stop_or_error); \ } +INSTANTIATE_TEARDOWN_TEST(Stop, InitDemuxer); +INSTANTIATE_TEARDOWN_TEST(Stop, InitAudioDecoder); +INSTANTIATE_TEARDOWN_TEST(Stop, InitAudioRenderer); +INSTANTIATE_TEARDOWN_TEST(Stop, InitVideoDecoder); +INSTANTIATE_TEARDOWN_TEST(Stop, InitVideoRenderer); INSTANTIATE_TEARDOWN_TEST(Stop, Pausing); INSTANTIATE_TEARDOWN_TEST(Stop, Flushing); INSTANTIATE_TEARDOWN_TEST(Stop, Seeking); @@ -1251,6 +1323,11 @@ INSTANTIATE_TEARDOWN_TEST(Stop, Prerolling); INSTANTIATE_TEARDOWN_TEST(Stop, Starting); INSTANTIATE_TEARDOWN_TEST(Stop, Playing); +INSTANTIATE_TEARDOWN_TEST(Error, InitDemuxer); +INSTANTIATE_TEARDOWN_TEST(Error, InitAudioDecoder); +INSTANTIATE_TEARDOWN_TEST(Error, InitAudioRenderer); +INSTANTIATE_TEARDOWN_TEST(Error, InitVideoDecoder); +INSTANTIATE_TEARDOWN_TEST(Error, InitVideoRenderer); INSTANTIATE_TEARDOWN_TEST(Error, Pausing); INSTANTIATE_TEARDOWN_TEST(Error, Flushing); INSTANTIATE_TEARDOWN_TEST(Error, Seeking); |