Chromium Code Reviews| Index: media/base/pipeline_unittest.cc |
| diff --git a/media/base/pipeline_unittest.cc b/media/base/pipeline_unittest.cc |
| index bd00361c47959848dbf2c66e8ff21d59480b0ed5..56f437a656f0e53b21511c51158197d9b3643427 100644 |
| --- a/media/base/pipeline_unittest.cc |
| +++ b/media/base/pipeline_unittest.cc |
| @@ -131,11 +131,13 @@ class PipelineTest : public ::testing::Test { |
| // Sets up expectations to allow the demuxer to initialize. |
| typedef std::vector<MockDemuxerStream*> MockDemuxerStreamVector; |
| void InitializeDemuxer(MockDemuxerStreamVector* streams, |
| - const base::TimeDelta& duration) { |
| + const base::TimeDelta& duration, |
| + bool expect_set_playback_rate) { |
| EXPECT_CALL(*mocks_->demuxer(), Initialize(_, _)) |
| .WillOnce(DoAll(SetDemuxerProperties(duration), |
| RunPipelineStatusCB1())); |
| - EXPECT_CALL(*mocks_->demuxer(), SetPlaybackRate(0.0f)); |
| + if (expect_set_playback_rate) |
|
scherkus (not reviewing)
2012/08/08 21:15:02
instead of a bool, can this block can get moves to
acolwell GONE FROM CHROMIUM
2012/08/08 21:40:59
Yes it can. Done.
|
| + EXPECT_CALL(*mocks_->demuxer(), SetPlaybackRate(0.0f)); |
| // Configure the demuxer to return the streams. |
| for (size_t i = 0; i < streams->size(); ++i) { |
| @@ -147,7 +149,14 @@ class PipelineTest : public ::testing::Test { |
| void InitializeDemuxer(MockDemuxerStreamVector* streams) { |
| // Initialize with a default non-zero duration. |
| - InitializeDemuxer(streams, base::TimeDelta::FromSeconds(10)); |
| + InitializeDemuxer(streams, base::TimeDelta::FromSeconds(10), true); |
| + } |
| + |
| + void InitializeDemuxer(MockDemuxerStreamVector* streams, |
| + bool expect_set_playback_rate) { |
| + // Initialize with a default non-zero duration. |
| + InitializeDemuxer(streams, base::TimeDelta::FromSeconds(10), |
| + expect_set_playback_rate); |
| } |
| StrictMock<MockDemuxerStream>* CreateStream(DemuxerStream::Type type) { |
| @@ -188,7 +197,12 @@ class PipelineTest : public ::testing::Test { |
| } |
| // Sets up expectations to allow the audio renderer to initialize. |
| - void InitializeAudioRenderer(bool disable_after_init_cb = false) { |
| + void InitializeAudioRenderer() { |
| + InitializeAudioRenderer(false, true); |
| + } |
| + |
| + void InitializeAudioRenderer(bool disable_after_init_cb, |
| + bool expect_to_play) { |
| if (disable_after_init_cb) { |
| EXPECT_CALL(*mocks_->audio_renderer(), Initialize( |
| scoped_refptr<AudioDecoder>(mocks_->audio_decoder()), |
| @@ -202,14 +216,17 @@ class PipelineTest : public ::testing::Test { |
| .WillOnce(DoAll(SaveArg<3>(&audio_time_cb_), |
| RunPipelineStatusCB1())); |
| } |
| - EXPECT_CALL(*mocks_->audio_renderer(), SetPlaybackRate(0.0f)); |
| - EXPECT_CALL(*mocks_->audio_renderer(), SetVolume(1.0f)); |
| - // Startup sequence. |
| - EXPECT_CALL(*mocks_->audio_renderer(), Preroll(base::TimeDelta(), _)) |
| - .WillOnce(RunPipelineStatusCB1()); |
| - EXPECT_CALL(*mocks_->audio_renderer(), Play(_)) |
| - .WillOnce(RunClosure()); |
| + if (expect_to_play) { |
| + EXPECT_CALL(*mocks_->audio_renderer(), SetPlaybackRate(0.0f)); |
|
scherkus (not reviewing)
2012/08/08 21:15:02
ditto (move to InitializePipeline when start_statu
acolwell GONE FROM CHROMIUM
2012/08/08 21:40:59
Done.
|
| + EXPECT_CALL(*mocks_->audio_renderer(), SetVolume(1.0f)); |
| + |
| + // Startup sequence. |
| + EXPECT_CALL(*mocks_->audio_renderer(), Preroll(base::TimeDelta(), _)) |
| + .WillOnce(RunPipelineStatusCB1()); |
| + EXPECT_CALL(*mocks_->audio_renderer(), Play(_)) |
| + .WillOnce(RunClosure()); |
| + } |
| } |
| // Sets up expectations on the callback and initializes the pipeline. Called |
| @@ -449,7 +466,7 @@ TEST_F(PipelineTest, Seek) { |
| streams.push_back(audio_stream()); |
| streams.push_back(video_stream()); |
| - InitializeDemuxer(&streams, base::TimeDelta::FromSeconds(3000)); |
| + InitializeDemuxer(&streams, base::TimeDelta::FromSeconds(3000), true); |
| InitializeAudioDecoder(audio_stream()); |
| InitializeAudioRenderer(); |
| InitializeVideoDecoder(video_stream()); |
| @@ -488,7 +505,7 @@ TEST_F(PipelineTest, Properties) { |
| streams.push_back(video_stream()); |
| const base::TimeDelta kDuration = base::TimeDelta::FromSeconds(100); |
| - InitializeDemuxer(&streams, kDuration); |
| + InitializeDemuxer(&streams, kDuration, true); |
| InitializeVideoDecoder(video_stream()); |
| InitializeVideoRenderer(); |
| @@ -506,7 +523,7 @@ TEST_F(PipelineTest, GetBufferedTimeRanges) { |
| streams.push_back(video_stream()); |
| const base::TimeDelta kDuration = base::TimeDelta::FromSeconds(100); |
| - InitializeDemuxer(&streams, kDuration); |
| + InitializeDemuxer(&streams, kDuration, true); |
| InitializeVideoDecoder(video_stream()); |
| InitializeVideoRenderer(); |
| @@ -590,7 +607,7 @@ TEST_F(PipelineTest, DisableAudioRendererDuringInit) { |
| InitializeDemuxer(&streams); |
| InitializeAudioDecoder(audio_stream()); |
| - InitializeAudioRenderer(true); |
| + InitializeAudioRenderer(true, true); |
| InitializeVideoDecoder(video_stream()); |
| InitializeVideoRenderer(); |
| @@ -662,7 +679,7 @@ TEST_F(PipelineTest, AudioStreamShorterThanVideo) { |
| // Sleep(). |
| pipeline_->SetClockForTesting(new Clock(&StaticClockFunction)); |
| - InitializeDemuxer(&streams, duration); |
| + InitializeDemuxer(&streams, duration, true); |
| InitializeAudioDecoder(audio_stream()); |
| InitializeAudioRenderer(); |
| InitializeVideoDecoder(video_stream()); |
| @@ -715,7 +732,7 @@ TEST_F(PipelineTest, ErrorDuringSeek) { |
| MockDemuxerStreamVector streams; |
| streams.push_back(audio_stream()); |
| - InitializeDemuxer(&streams, base::TimeDelta::FromSeconds(10)); |
| + InitializeDemuxer(&streams); |
| InitializeAudioDecoder(audio_stream()); |
| InitializeAudioRenderer(); |
| InitializePipeline(PIPELINE_OK); |
| @@ -771,7 +788,7 @@ TEST_F(PipelineTest, NoMessageDuringTearDownFromError) { |
| MockDemuxerStreamVector streams; |
| streams.push_back(audio_stream()); |
| - InitializeDemuxer(&streams, base::TimeDelta::FromSeconds(10)); |
| + InitializeDemuxer(&streams); |
| InitializeAudioDecoder(audio_stream()); |
| InitializeAudioRenderer(); |
| InitializePipeline(PIPELINE_OK); |
| @@ -809,7 +826,7 @@ TEST_F(PipelineTest, StartTimeIsZero) { |
| streams.push_back(video_stream()); |
| const base::TimeDelta kDuration = base::TimeDelta::FromSeconds(100); |
| - InitializeDemuxer(&streams, kDuration); |
| + InitializeDemuxer(&streams, kDuration, true); |
| InitializeVideoDecoder(video_stream()); |
| InitializeVideoRenderer(); |
| @@ -832,7 +849,7 @@ TEST_F(PipelineTest, StartTimeIsNonZero) { |
| MockDemuxerStreamVector streams; |
| streams.push_back(video_stream()); |
| - InitializeDemuxer(&streams, kDuration); |
| + InitializeDemuxer(&streams, kDuration, true); |
| InitializeVideoDecoder(video_stream()); |
| InitializeVideoRenderer(); |
| @@ -856,7 +873,7 @@ TEST_F(PipelineTest, AudioTimeUpdateDuringSeek) { |
| MockDemuxerStreamVector streams; |
| streams.push_back(audio_stream()); |
| - InitializeDemuxer(&streams, base::TimeDelta::FromSeconds(10)); |
| + InitializeDemuxer(&streams); |
| InitializeAudioDecoder(audio_stream()); |
| InitializeAudioRenderer(); |
| InitializePipeline(PIPELINE_OK); |
| @@ -904,6 +921,120 @@ 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(RunPipelineStatusCB1WithStatus(expected_status)); |
| + EXPECT_CALL(*mocks_->demuxer(), Stop(_)) |
| + .WillOnce(RunClosure()); |
| + InitializePipeline(expected_status); |
| + EXPECT_FALSE(pipeline_->IsInitialized()); |
| +} |
| + |
| +TEST_F(PipelineTest, InitFailure_AudioDecoder) { |
| + CreateAudioStream(); |
| + MockDemuxerStreamVector streams; |
| + streams.push_back(audio_stream()); |
| + |
| + InitializeDemuxer(&streams, false); |
| + |
| + PipelineStatus expected_status = PIPELINE_ERROR_DECODE; |
| + scoped_refptr<DemuxerStream> stream = streams[0]; |
| + EXPECT_CALL(*mocks_->audio_decoder(), Initialize(stream, _, _)) |
| + .WillOnce(RunPipelineStatusCB1WithStatus(expected_status)); |
| + |
| + EXPECT_CALL(*mocks_->demuxer(), Stop(_)) |
| + .WillOnce(RunClosure()); |
| + |
| + InitializePipeline(expected_status); |
| + EXPECT_FALSE(pipeline_->IsInitialized()); |
| + EXPECT_FALSE(pipeline_->HasAudio()); |
| +} |
| + |
| +TEST_F(PipelineTest, InitFailure_AudioRenderer) { |
| + CreateAudioStream(); |
| + MockDemuxerStreamVector streams; |
| + streams.push_back(audio_stream()); |
| + |
| + InitializeDemuxer(&streams, false); |
| + InitializeAudioDecoder(audio_stream()); |
| + |
| + PipelineStatus expected_status = PIPELINE_ERROR_INITIALIZATION_FAILED; |
| + EXPECT_CALL(*mocks_->audio_renderer(), Initialize( |
| + scoped_refptr<AudioDecoder>(mocks_->audio_decoder()), |
| + _, _, _, _, _, _)) |
| + .WillOnce(RunPipelineStatusCB1WithStatus(expected_status)); |
| + |
| + EXPECT_CALL(*mocks_->demuxer(), Stop(_)) |
| + .WillOnce(RunClosure()); |
| + EXPECT_CALL(*mocks_->audio_renderer(), Stop(_)) |
| + .WillOnce(RunClosure()); |
| + |
| + InitializePipeline(expected_status); |
| + EXPECT_FALSE(pipeline_->IsInitialized()); |
| + 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, false); |
| + InitializeAudioDecoder(audio_stream()); |
| + InitializeAudioRenderer(false, false); |
| + |
| + PipelineStatus expected_status = PIPELINE_ERROR_DECODE; |
| + scoped_refptr<DemuxerStream> stream = streams[1]; |
| + EXPECT_CALL(*mocks_->video_decoder(), |
| + Initialize(stream, _, _)) |
| + .WillOnce(RunPipelineStatusCB1WithStatus(expected_status)); |
| + |
| + EXPECT_CALL(*mocks_->demuxer(), Stop(_)) |
| + .WillOnce(RunClosure()); |
| + EXPECT_CALL(*mocks_->audio_renderer(), Stop(_)) |
| + .WillOnce(RunClosure()); |
| + |
| + InitializePipeline(expected_status); |
| + EXPECT_FALSE(pipeline_->IsInitialized()); |
| + EXPECT_TRUE(pipeline_->HasAudio()); |
| + EXPECT_FALSE(pipeline_->HasVideo()); |
| +} |
| + |
|
scherkus (not reviewing)
2012/08/08 21:15:02
remove extra blank line
acolwell GONE FROM CHROMIUM
2012/08/08 21:40:59
Done.
|
| + |
| +TEST_F(PipelineTest, InitFailure_VideoRenderer) { |
| + CreateAudioStream(); |
| + CreateVideoStream(); |
| + MockDemuxerStreamVector streams; |
| + streams.push_back(audio_stream()); |
| + streams.push_back(video_stream()); |
| + |
| + InitializeDemuxer(&streams, false); |
| + InitializeAudioDecoder(audio_stream()); |
| + InitializeAudioRenderer(false, false); |
| + InitializeVideoDecoder(video_stream()); |
| + |
| + PipelineStatus expected_status = PIPELINE_ERROR_INITIALIZATION_FAILED; |
| + EXPECT_CALL(*mocks_->video_renderer(), Initialize( |
| + scoped_refptr<VideoDecoder>(mocks_->video_decoder()), |
| + _, _, _, _, _, _, _, _)) |
| + .WillOnce(RunPipelineStatusCB1WithStatus(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_FALSE(pipeline_->IsInitialized()); |
| + EXPECT_TRUE(pipeline_->HasAudio()); |
| + EXPECT_TRUE(pipeline_->HasVideo()); |
| +} |
| + |
| class FlexibleCallbackRunner : public base::DelegateSimpleThread::Delegate { |
| public: |
| FlexibleCallbackRunner(base::TimeDelta delay, PipelineStatus status, |