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, |