Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(223)

Unified Diff: media/base/pipeline_unittest.cc

Issue 10831214: Fix Pipeline to properly handle errors during initialization. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 8 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« media/base/pipeline.cc ('K') | « media/base/pipeline.cc ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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,
« media/base/pipeline.cc ('K') | « media/base/pipeline.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698