Chromium Code Reviews| Index: media/base/pipeline_unittest.cc |
| diff --git a/media/base/pipeline_unittest.cc b/media/base/pipeline_unittest.cc |
| index bb6ba61895727bb8e9ee5c69cb99de6b5ed52b08..b126add875c5975e9d34a41a5480740f46b79712 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: |
| + ExpectInitializeTeardown(state, stop_or_error); |
| + break; |
| + |
| case kPausing: |
| case kFlushing: |
| case kSeeking: |
| case kPrerolling: |
| - case kStarting: |
| + case kStarting: { |
| + DoInitialize(); |
| + |
| + InSequence s; |
|
acolwell GONE FROM CHROMIUM
2012/08/10 17:13:08
Why did this need to move to here ane below?
scherkus (not reviewing)
2012/08/10 17:35:55
DoInitialize() / ExpectInitializeTeardown() aren't
|
| if (stop_or_error == kStop) { |
| ExpectSeekStop(state); |
| } else { |
| @@ -1081,8 +980,12 @@ class PipelineTeardownTest : public PipelineTest { |
| } |
| DoSeek(); |
| break; |
| + } |
| + |
| + case kPlaying: { |
| + DoInitialize(); |
| - case kPlaying: |
| + InSequence s; |
| if (stop_or_error == kStop) { |
| ExpectStop(); |
| DoStop(); |
| @@ -1091,13 +994,158 @@ class PipelineTeardownTest : public PipelineTest { |
| DoPlaybackError(); |
| } |
| break; |
| + } |
| } |
| } |
| private: |
| + void DoInitialize() { |
| + CreateAudioStream(); |
| + MockDemuxerStreamVector streams; |
| + streams.push_back(audio_stream()); |
| + |
| + InitializeDemuxer(&streams, base::TimeDelta::FromSeconds(3000)); |
| + InitializeAudioDecoder(audio_stream()); |
| + InitializeAudioRenderer(); |
| + InitializePipeline(PIPELINE_OK); |
| + } |
| + |
| // 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 ExpectInitializeTeardown(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) { |
|
acolwell GONE FROM CHROMIUM
2012/08/10 17:13:08
nit: remove if and DCHECK_EQ(state, kInitVideoRend
scherkus (not reviewing)
2012/08/10 17:35:55
True! My initial plan for this function was to use
|
| + 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_->audio_renderer(), SetVolume(1.0f)); |
| + EXPECT_CALL(*mocks_->audio_renderer(), Preroll(base::TimeDelta(), _)) |
| + .WillOnce(RunPipelineStatusCB()); |
| + EXPECT_CALL(*mocks_->audio_renderer(), Play(_)) |
| + .WillOnce(RunClosure()); |
| + |
| + return status; |
| + } |
| + |
| void ExpectSeekStop(TeardownState state) { |
| base::Closure stop_cb = base::Bind( |
| &CallbackHelper::OnStop, base::Unretained(&callbacks_)); |
| @@ -1244,6 +1292,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 +1304,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); |