Index: media/base/pipeline_unittest.cc |
diff --git a/media/base/pipeline_unittest.cc b/media/base/pipeline_unittest.cc |
index 70c35bbbabba456dea91fe5810056f4a6d2990e5..412fd88bafd836fd51371eaefdf3922d42126ad3 100644 |
--- a/media/base/pipeline_unittest.cc |
+++ b/media/base/pipeline_unittest.cc |
@@ -122,7 +122,7 @@ class PipelineTest : public ::testing::Test { |
if (!pipeline_ || !pipeline_->IsRunning()) |
return; |
- ExpectStop(); |
+ ExpectDemuxerStop(); |
// The mock demuxer doesn't stop the fake text track stream, |
// so just stop it manually. |
@@ -132,7 +132,7 @@ class PipelineTest : public ::testing::Test { |
} |
// Expect a stop callback if we were started. |
- EXPECT_CALL(callbacks_, OnStop()); |
+ ExpectPipelineStopAndDestroyPipeline(); |
pipeline_->Stop(base::Bind(&CallbackHelper::OnStop, |
base::Unretained(&callbacks_))); |
message_loop_.RunUntilIdle(); |
@@ -314,11 +314,22 @@ class PipelineTest : public ::testing::Test { |
EXPECT_EQ(seek_time, pipeline_->GetMediaTime()); |
} |
- void ExpectStop() { |
+ void DestroyPipeline() { |
+ pipeline_.reset(); |
+ } |
+ |
+ void ExpectDemuxerStop() { |
if (demuxer_) |
EXPECT_CALL(*demuxer_, Stop(_)).WillOnce(RunClosure<0>()); |
} |
+ void ExpectPipelineStopAndDestroyPipeline() { |
+ // After the Pipeline is stopped, it could be destroyed any time. Always |
+ // destroy the pipeline immediately after OnStop() to test this. |
+ EXPECT_CALL(callbacks_, OnStop()) |
+ .WillOnce(Invoke(this, &PipelineTest::DestroyPipeline)); |
+ } |
+ |
MOCK_METHOD2(OnAddTextTrack, void(const TextTrackConfig&, |
const AddTextTrackDoneCB&)); |
@@ -409,7 +420,7 @@ TEST_F(PipelineTest, NeverInitializes) { |
} |
TEST_F(PipelineTest, StopWithoutStart) { |
- EXPECT_CALL(callbacks_, OnStop()); |
+ ExpectPipelineStopAndDestroyPipeline(); |
pipeline_->Stop( |
base::Bind(&CallbackHelper::OnStop, base::Unretained(&callbacks_))); |
message_loop_.RunUntilIdle(); |
@@ -435,7 +446,7 @@ TEST_F(PipelineTest, StartThenStopImmediately) { |
base::Unretained(&callbacks_))); |
// Expect a stop callback if we were started. |
- EXPECT_CALL(callbacks_, OnStop()); |
+ ExpectPipelineStopAndDestroyPipeline(); |
pipeline_->Stop( |
base::Bind(&CallbackHelper::OnStop, base::Unretained(&callbacks_))); |
message_loop_.RunUntilIdle(); |
@@ -454,7 +465,7 @@ TEST_F(PipelineTest, DemuxerErrorDuringStop) { |
EXPECT_CALL(*demuxer_, Stop(_)) |
.WillOnce(DoAll(InvokeWithoutArgs(this, &PipelineTest::OnDemuxerError), |
RunClosure<0>())); |
- EXPECT_CALL(callbacks_, OnStop()); |
+ ExpectPipelineStopAndDestroyPipeline(); |
pipeline_->Stop( |
base::Bind(&CallbackHelper::OnStop, base::Unretained(&callbacks_))); |
@@ -891,11 +902,7 @@ TEST_F(PipelineTest, AudioTimeUpdateDuringSeek) { |
EXPECT_EQ(pipeline_->GetMediaTime(), new_time); |
} |
-static void DeletePipeline(scoped_ptr<Pipeline> pipeline) { |
- // |pipeline| will go out of scope. |
-} |
- |
-TEST_F(PipelineTest, DeleteAfterStop) { |
+TEST_F(PipelineTest, DestroyAfterStop) { |
CreateAudioStream(); |
MockDemuxerStreamVector streams; |
streams.push_back(audio_stream()); |
@@ -903,10 +910,11 @@ TEST_F(PipelineTest, DeleteAfterStop) { |
SetAudioRendererExpectations(audio_stream()); |
StartPipeline(PIPELINE_OK); |
- ExpectStop(); |
+ ExpectDemuxerStop(); |
- Pipeline* pipeline = pipeline_.get(); |
- pipeline->Stop(base::Bind(&DeletePipeline, base::Passed(&pipeline_))); |
+ ExpectPipelineStopAndDestroyPipeline(); |
+ pipeline_->Stop( |
+ base::Bind(&CallbackHelper::OnStop, base::Unretained(&callbacks_))); |
message_loop_.RunUntilIdle(); |
} |
@@ -959,8 +967,9 @@ TEST_F(PipelineTest, TimeUpdateAfterStop) { |
EXPECT_CALL(*demuxer_, Stop(_)).WillOnce(RunClosure<0>()); |
- Pipeline* pipeline = pipeline_.get(); |
- pipeline->Stop(base::Bind(&DeletePipeline, base::Passed(&pipeline_))); |
+ ExpectPipelineStopAndDestroyPipeline(); |
+ pipeline_->Stop( |
+ base::Bind(&CallbackHelper::OnStop, base::Unretained(&callbacks_))); |
message_loop_.RunUntilIdle(); |
} |
@@ -1038,7 +1047,7 @@ class PipelineTeardownTest : public PipelineTest { |
EXPECT_CALL(*demuxer_, Initialize(_, _, _)) |
.WillOnce(DoAll(Stop(pipeline_.get(), stop_cb), |
RunCallback<1>(PIPELINE_OK))); |
- EXPECT_CALL(callbacks_, OnStop()); |
+ ExpectPipelineStopAndDestroyPipeline(); |
} else { |
status = DEMUXER_ERROR_COULD_NOT_OPEN; |
EXPECT_CALL(*demuxer_, Initialize(_, _, _)) |
@@ -1061,7 +1070,7 @@ class PipelineTeardownTest : public PipelineTest { |
EXPECT_CALL(*audio_renderer_, Initialize(_, _, _, _, _, _, _)) |
.WillOnce(DoAll(Stop(pipeline_.get(), stop_cb), |
RunCallback<1>(PIPELINE_OK))); |
- EXPECT_CALL(callbacks_, OnStop()); |
+ ExpectPipelineStopAndDestroyPipeline(); |
} else { |
status = PIPELINE_ERROR_INITIALIZATION_FAILED; |
EXPECT_CALL(*audio_renderer_, Initialize(_, _, _, _, _, _, _)) |
@@ -1081,7 +1090,7 @@ class PipelineTeardownTest : public PipelineTest { |
EXPECT_CALL(*video_renderer_, Initialize(_, _, _, _, _, _, _, _, _, _)) |
.WillOnce(DoAll(Stop(pipeline_.get(), stop_cb), |
RunCallback<2>(PIPELINE_OK))); |
- EXPECT_CALL(callbacks_, OnStop()); |
+ ExpectPipelineStopAndDestroyPipeline(); |
} else { |
status = PIPELINE_ERROR_INITIALIZATION_FAILED; |
EXPECT_CALL(*video_renderer_, Initialize(_, _, _, _, _, _, _, _, _, _)) |
@@ -1126,7 +1135,7 @@ class PipelineTeardownTest : public PipelineTest { |
EXPECT_CALL(callbacks_, OnSeek(status)); |
if (status == PIPELINE_OK) { |
- EXPECT_CALL(callbacks_, OnStop()); |
+ ExpectPipelineStopAndDestroyPipeline(); |
} |
pipeline_->Seek(base::TimeDelta::FromSeconds(10), base::Bind( |
@@ -1195,7 +1204,7 @@ class PipelineTeardownTest : public PipelineTest { |
switch (stop_or_error) { |
case kStop: |
- EXPECT_CALL(callbacks_, OnStop()); |
+ ExpectPipelineStopAndDestroyPipeline(); |
pipeline_->Stop(base::Bind( |
&CallbackHelper::OnStop, base::Unretained(&callbacks_))); |
break; |
@@ -1207,7 +1216,7 @@ class PipelineTeardownTest : public PipelineTest { |
case kErrorAndStop: |
EXPECT_CALL(callbacks_, OnError(PIPELINE_ERROR_READ)); |
- EXPECT_CALL(callbacks_, OnStop()); |
+ ExpectPipelineStopAndDestroyPipeline(); |
pipeline_->SetErrorForTesting(PIPELINE_ERROR_READ); |
pipeline_->Stop(base::Bind( |
&CallbackHelper::OnStop, base::Unretained(&callbacks_))); |