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); |