Index: media/renderers/renderer_impl_unittest.cc |
diff --git a/media/renderers/renderer_impl_unittest.cc b/media/renderers/renderer_impl_unittest.cc |
index 38748577e8ea97f2fd58e55454751c2bb3d13410..9c156dd026713a6dbd936d357e89064e408660d2 100644 |
--- a/media/renderers/renderer_impl_unittest.cc |
+++ b/media/renderers/renderer_impl_unittest.cc |
@@ -30,30 +30,26 @@ namespace media { |
const int64_t kStartPlayingTimeInMs = 100; |
-ACTION_P2(SetBufferingState, cb, buffering_state) { |
- cb->Run(buffering_state); |
+ACTION_P2(SetBufferingState, renderer_client, buffering_state) { |
+ (*renderer_client)->OnBufferingStateChange(buffering_state); |
} |
-ACTION_P2(AudioError, cb, error) { |
- cb->Run(error); |
+ACTION_P2(SetError, renderer_client, error) { |
+ (*renderer_client)->OnError(error); |
} |
class RendererImplTest : public ::testing::Test { |
public: |
// Used for setting expectations on pipeline callbacks. Using a StrictMock |
// also lets us test for missing callbacks. |
- class CallbackHelper { |
+ class CallbackHelper : public MockRendererClient { |
public: |
CallbackHelper() {} |
virtual ~CallbackHelper() {} |
+ // Completion callbacks. |
MOCK_METHOD1(OnInitialize, void(PipelineStatus)); |
MOCK_METHOD0(OnFlushed, void()); |
- MOCK_METHOD0(OnEnded, void()); |
- MOCK_METHOD1(OnError, void(PipelineStatus)); |
- MOCK_METHOD1(OnUpdateStatistics, void(const PipelineStatistics&)); |
- MOCK_METHOD1(OnBufferingStateChange, void(BufferingState)); |
- MOCK_METHOD0(OnWaitingForDecryptionKey, void()); |
MOCK_METHOD1(OnCdmAttached, void(bool)); |
private: |
@@ -69,6 +65,8 @@ class RendererImplTest : public ::testing::Test { |
std::unique_ptr<AudioRenderer>(audio_renderer_), |
std::unique_ptr<VideoRenderer>(video_renderer_))), |
cdm_context_(new StrictMock<MockCdmContext>()), |
+ video_renderer_client_(nullptr), |
+ audio_renderer_client_(nullptr), |
initialization_status_(PIPELINE_OK) { |
// SetDemuxerExpectations() adds overriding expectations for expected |
// non-NULL streams. |
@@ -96,19 +94,16 @@ class RendererImplTest : public ::testing::Test { |
// Sets up expectations to allow the audio renderer to initialize. |
void SetAudioRendererInitializeExpectations(PipelineStatus status) { |
- EXPECT_CALL(*audio_renderer_, |
- Initialize(audio_stream_.get(), _, _, _, _, _, _, _)) |
- .WillOnce(DoAll(SaveArg<4>(&audio_buffering_state_cb_), |
- SaveArg<5>(&audio_ended_cb_), |
- SaveArg<6>(&audio_error_cb_), RunCallback<1>(status))); |
+ EXPECT_CALL(*audio_renderer_, Initialize(audio_stream_.get(), _, _, _)) |
+ .WillOnce( |
+ DoAll(SaveArg<2>(&audio_renderer_client_), RunCallback<3>(status))); |
} |
// Sets up expectations to allow the video renderer to initialize. |
void SetVideoRendererInitializeExpectations(PipelineStatus status) { |
- EXPECT_CALL(*video_renderer_, |
- Initialize(video_stream_.get(), _, _, _, _, _, _, _, _)) |
- .WillOnce(DoAll(SaveArg<4>(&video_buffering_state_cb_), |
- SaveArg<5>(&video_ended_cb_), RunCallback<1>(status))); |
+ EXPECT_CALL(*video_renderer_, Initialize(video_stream_.get(), _, _, _, _)) |
+ .WillOnce( |
+ DoAll(SaveArg<2>(&video_renderer_client_), RunCallback<4>(status))); |
} |
void InitializeAndExpect(PipelineStatus start_status) { |
@@ -123,18 +118,9 @@ class RendererImplTest : public ::testing::Test { |
renderer_impl_->set_time_source_for_testing(&time_source_); |
} |
- renderer_impl_->Initialize( |
- demuxer_.get(), |
- base::Bind(&CallbackHelper::OnInitialize, |
- base::Unretained(&callbacks_)), |
- base::Bind(&CallbackHelper::OnUpdateStatistics, |
- base::Unretained(&callbacks_)), |
- base::Bind(&CallbackHelper::OnBufferingStateChange, |
- base::Unretained(&callbacks_)), |
- base::Bind(&CallbackHelper::OnEnded, base::Unretained(&callbacks_)), |
- base::Bind(&CallbackHelper::OnError, base::Unretained(&callbacks_)), |
- base::Bind(&CallbackHelper::OnWaitingForDecryptionKey, |
- base::Unretained(&callbacks_))); |
+ renderer_impl_->Initialize(demuxer_.get(), &callbacks_, |
+ base::Bind(&CallbackHelper::OnInitialize, |
+ base::Unretained(&callbacks_))); |
base::RunLoop().RunUntilIdle(); |
} |
@@ -192,13 +178,13 @@ class RendererImplTest : public ::testing::Test { |
if (audio_stream_) { |
EXPECT_CALL(*audio_renderer_, StartPlaying()) |
- .WillOnce(SetBufferingState(&audio_buffering_state_cb_, |
+ .WillOnce(SetBufferingState(&audio_renderer_client_, |
BUFFERING_HAVE_ENOUGH)); |
} |
if (video_stream_) { |
EXPECT_CALL(*video_renderer_, StartPlayingFrom(start_time)) |
- .WillOnce(SetBufferingState(&video_buffering_state_cb_, |
+ .WillOnce(SetBufferingState(&video_renderer_client_, |
BUFFERING_HAVE_ENOUGH)); |
} |
@@ -212,14 +198,14 @@ class RendererImplTest : public ::testing::Test { |
if (audio_stream_) { |
EXPECT_CALL(*audio_renderer_, Flush(_)) |
- .WillOnce(DoAll(SetBufferingState(&audio_buffering_state_cb_, |
+ .WillOnce(DoAll(SetBufferingState(&audio_renderer_client_, |
BUFFERING_HAVE_NOTHING), |
RunClosure<0>())); |
} |
if (video_stream_) { |
EXPECT_CALL(*video_renderer_, Flush(_)) |
- .WillOnce(DoAll(SetBufferingState(&video_buffering_state_cb_, |
+ .WillOnce(DoAll(SetBufferingState(&video_renderer_client_, |
BUFFERING_HAVE_NOTHING), |
RunClosure<0>())); |
} |
@@ -282,11 +268,8 @@ class RendererImplTest : public ::testing::Test { |
std::unique_ptr<StrictMock<MockDemuxerStream>> audio_stream_; |
std::unique_ptr<StrictMock<MockDemuxerStream>> video_stream_; |
MockDemuxerStreamVector streams_; |
- BufferingStateCB audio_buffering_state_cb_; |
- BufferingStateCB video_buffering_state_cb_; |
- base::Closure audio_ended_cb_; |
- base::Closure video_ended_cb_; |
- PipelineStatusCB audio_error_cb_; |
+ RendererClient* video_renderer_client_; |
+ RendererClient* audio_renderer_client_; |
VideoDecoderConfig video_decoder_config_; |
PipelineStatus initialization_status_; |
@@ -303,8 +286,7 @@ TEST_F(RendererImplTest, Destroy_PendingInitialize) { |
SetAudioRendererInitializeExpectations(PIPELINE_OK); |
// Not returning the video initialization callback. |
- EXPECT_CALL(*video_renderer_, |
- Initialize(video_stream_.get(), _, _, _, _, _, _, _, _)); |
+ EXPECT_CALL(*video_renderer_, Initialize(video_stream_.get(), _, _, _, _)); |
InitializeAndExpect(PIPELINE_ERROR_ABORT); |
EXPECT_EQ(PIPELINE_OK, initialization_status_); |
@@ -338,8 +320,7 @@ TEST_F(RendererImplTest, Destroy_PendingInitializeAfterSetCdm) { |
SetAudioRendererInitializeExpectations(PIPELINE_OK); |
// Not returning the video initialization callback. So initialization will |
// be pending. |
- EXPECT_CALL(*video_renderer_, |
- Initialize(video_stream_.get(), _, _, _, _, _, _, _, _)); |
+ EXPECT_CALL(*video_renderer_, Initialize(video_stream_.get(), _, _, _, _)); |
// SetCdm() will trigger the initialization to start. But it will not complete |
// because the |video_renderer_| is not returning the initialization callback. |
@@ -492,7 +473,7 @@ TEST_F(RendererImplTest, FlushAfterUnderflow) { |
// Simulate underflow. |
EXPECT_CALL(time_source_, StopTicking()); |
- audio_buffering_state_cb_.Run(BUFFERING_HAVE_NOTHING); |
+ audio_renderer_client_->OnBufferingStateChange(BUFFERING_HAVE_NOTHING); |
// Flush while underflowed. We shouldn't call StopTicking() again. |
Flush(true); |
@@ -517,7 +498,7 @@ TEST_F(RendererImplTest, AudioStreamEnded) { |
EXPECT_CALL(time_source_, StopTicking()); |
EXPECT_CALL(callbacks_, OnEnded()); |
- audio_ended_cb_.Run(); |
+ audio_renderer_client_->OnEnded(); |
base::RunLoop().RunUntilIdle(); |
} |
@@ -528,7 +509,7 @@ TEST_F(RendererImplTest, VideoStreamEnded) { |
EXPECT_CALL(time_source_, StopTicking()); |
EXPECT_CALL(callbacks_, OnEnded()); |
- video_ended_cb_.Run(); |
+ video_renderer_client_->OnEnded(); |
base::RunLoop().RunUntilIdle(); |
} |
@@ -537,20 +518,20 @@ TEST_F(RendererImplTest, AudioVideoStreamsEnded) { |
Play(); |
// OnEnded() is called only when all streams have finished. |
- audio_ended_cb_.Run(); |
+ audio_renderer_client_->OnEnded(); |
base::RunLoop().RunUntilIdle(); |
EXPECT_CALL(time_source_, StopTicking()); |
EXPECT_CALL(callbacks_, OnEnded()); |
- video_ended_cb_.Run(); |
+ video_renderer_client_->OnEnded(); |
base::RunLoop().RunUntilIdle(); |
} |
TEST_F(RendererImplTest, ErrorAfterInitialize) { |
InitializeWithAudio(); |
EXPECT_CALL(callbacks_, OnError(PIPELINE_ERROR_DECODE)); |
- audio_error_cb_.Run(PIPELINE_ERROR_DECODE); |
+ audio_renderer_client_->OnError(PIPELINE_ERROR_DECODE); |
base::RunLoop().RunUntilIdle(); |
} |
@@ -559,7 +540,7 @@ TEST_F(RendererImplTest, ErrorDuringPlaying) { |
Play(); |
EXPECT_CALL(callbacks_, OnError(PIPELINE_ERROR_DECODE)); |
- audio_error_cb_.Run(PIPELINE_ERROR_DECODE); |
+ audio_renderer_client_->OnError(PIPELINE_ERROR_DECODE); |
base::RunLoop().RunUntilIdle(); |
} |
@@ -569,9 +550,9 @@ TEST_F(RendererImplTest, ErrorDuringFlush) { |
InSequence s; |
EXPECT_CALL(time_source_, StopTicking()); |
- EXPECT_CALL(*audio_renderer_, Flush(_)).WillOnce(DoAll( |
- AudioError(&audio_error_cb_, PIPELINE_ERROR_DECODE), |
- RunClosure<0>())); |
+ EXPECT_CALL(*audio_renderer_, Flush(_)) |
+ .WillOnce(DoAll(SetError(&audio_renderer_client_, PIPELINE_ERROR_DECODE), |
+ RunClosure<0>())); |
EXPECT_CALL(callbacks_, OnError(PIPELINE_ERROR_DECODE)); |
EXPECT_CALL(callbacks_, OnFlushed()); |
renderer_impl_->Flush( |
@@ -585,7 +566,7 @@ TEST_F(RendererImplTest, ErrorAfterFlush) { |
Flush(false); |
EXPECT_CALL(callbacks_, OnError(PIPELINE_ERROR_DECODE)); |
- audio_error_cb_.Run(PIPELINE_ERROR_DECODE); |
+ audio_renderer_client_->OnError(PIPELINE_ERROR_DECODE); |
base::RunLoop().RunUntilIdle(); |
} |
@@ -594,12 +575,10 @@ TEST_F(RendererImplTest, ErrorDuringInitialize) { |
SetAudioRendererInitializeExpectations(PIPELINE_OK); |
// Force an audio error to occur during video renderer initialization. |
- EXPECT_CALL(*video_renderer_, |
- Initialize(video_stream_.get(), _, _, _, _, _, _, _, _)) |
- .WillOnce(DoAll(AudioError(&audio_error_cb_, PIPELINE_ERROR_DECODE), |
- SaveArg<4>(&video_buffering_state_cb_), |
- SaveArg<5>(&video_ended_cb_), |
- RunCallback<1>(PIPELINE_OK))); |
+ EXPECT_CALL(*video_renderer_, Initialize(video_stream_.get(), _, _, _, _)) |
+ .WillOnce(DoAll(SetError(&audio_renderer_client_, PIPELINE_ERROR_DECODE), |
+ SaveArg<2>(&video_renderer_client_), |
+ RunCallback<4>(PIPELINE_OK))); |
InitializeAndExpect(PIPELINE_ERROR_DECODE); |
} |
@@ -610,7 +589,7 @@ TEST_F(RendererImplTest, AudioUnderflow) { |
// Underflow should occur immediately with a single audio track. |
EXPECT_CALL(time_source_, StopTicking()); |
- audio_buffering_state_cb_.Run(BUFFERING_HAVE_NOTHING); |
+ audio_renderer_client_->OnBufferingStateChange(BUFFERING_HAVE_NOTHING); |
} |
TEST_F(RendererImplTest, AudioUnderflowWithVideo) { |
@@ -620,7 +599,7 @@ TEST_F(RendererImplTest, AudioUnderflowWithVideo) { |
// Underflow should be immediate when both audio and video are present and |
// audio underflows. |
EXPECT_CALL(time_source_, StopTicking()); |
- audio_buffering_state_cb_.Run(BUFFERING_HAVE_NOTHING); |
+ audio_renderer_client_->OnBufferingStateChange(BUFFERING_HAVE_NOTHING); |
} |
TEST_F(RendererImplTest, VideoUnderflow) { |
@@ -629,7 +608,7 @@ TEST_F(RendererImplTest, VideoUnderflow) { |
// Underflow should occur immediately with a single video track. |
EXPECT_CALL(time_source_, StopTicking()); |
- video_buffering_state_cb_.Run(BUFFERING_HAVE_NOTHING); |
+ video_renderer_client_->OnBufferingStateChange(BUFFERING_HAVE_NOTHING); |
} |
TEST_F(RendererImplTest, VideoUnderflowWithAudio) { |
@@ -642,7 +621,7 @@ TEST_F(RendererImplTest, VideoUnderflowWithAudio) { |
// Underflow should be delayed when both audio and video are present and video |
// underflows. |
- video_buffering_state_cb_.Run(BUFFERING_HAVE_NOTHING); |
+ video_renderer_client_->OnBufferingStateChange(BUFFERING_HAVE_NOTHING); |
Mock::VerifyAndClearExpectations(&time_source_); |
EXPECT_CALL(time_source_, StopTicking()); |
@@ -659,11 +638,11 @@ TEST_F(RendererImplTest, VideoUnderflowWithAudioVideoRecovers) { |
// Underflow should be delayed when both audio and video are present and video |
// underflows. |
- video_buffering_state_cb_.Run(BUFFERING_HAVE_NOTHING); |
+ video_renderer_client_->OnBufferingStateChange(BUFFERING_HAVE_NOTHING); |
Mock::VerifyAndClearExpectations(&time_source_); |
// If video recovers, the underflow should never occur. |
- video_buffering_state_cb_.Run(BUFFERING_HAVE_ENOUGH); |
+ video_renderer_client_->OnBufferingStateChange(BUFFERING_HAVE_ENOUGH); |
base::RunLoop().RunUntilIdle(); |
} |
@@ -677,11 +656,11 @@ TEST_F(RendererImplTest, VideoAndAudioUnderflow) { |
// Underflow should be delayed when both audio and video are present and video |
// underflows. |
- video_buffering_state_cb_.Run(BUFFERING_HAVE_NOTHING); |
+ video_renderer_client_->OnBufferingStateChange(BUFFERING_HAVE_NOTHING); |
Mock::VerifyAndClearExpectations(&time_source_); |
EXPECT_CALL(time_source_, StopTicking()); |
- audio_buffering_state_cb_.Run(BUFFERING_HAVE_NOTHING); |
+ audio_renderer_client_->OnBufferingStateChange(BUFFERING_HAVE_NOTHING); |
// Nothing else should primed on the message loop. |
base::RunLoop().RunUntilIdle(); |
@@ -697,8 +676,8 @@ TEST_F(RendererImplTest, VideoUnderflowWithAudioFlush) { |
// Simulate the cases where audio underflows and then video underflows. |
EXPECT_CALL(time_source_, StopTicking()); |
- audio_buffering_state_cb_.Run(BUFFERING_HAVE_NOTHING); |
- video_buffering_state_cb_.Run(BUFFERING_HAVE_NOTHING); |
+ audio_renderer_client_->OnBufferingStateChange(BUFFERING_HAVE_NOTHING); |
+ video_renderer_client_->OnBufferingStateChange(BUFFERING_HAVE_NOTHING); |
Mock::VerifyAndClearExpectations(&time_source_); |
// Flush the audio and video renderers, both think they're in an underflow |
@@ -717,7 +696,7 @@ TEST_F(RendererImplTest, VideoUnderflowWithAudioFlush) { |
EXPECT_CALL(time_source_, SetMediaTime(kStartTime)); |
EXPECT_CALL(*audio_renderer_, StartPlaying()) |
.WillOnce( |
- SetBufferingState(&audio_buffering_state_cb_, BUFFERING_HAVE_ENOUGH)); |
+ SetBufferingState(&audio_renderer_client_, BUFFERING_HAVE_ENOUGH)); |
EXPECT_CALL(*video_renderer_, StartPlayingFrom(kStartTime)); |
renderer_impl_->StartPlayingFrom(kStartTime); |