Chromium Code Reviews| Index: media/renderers/renderer_impl_unittest.cc |
| diff --git a/media/renderers/renderer_impl_unittest.cc b/media/renderers/renderer_impl_unittest.cc |
| index 3fc74307f58a292851cd40c47be835f95a1dd97b..185b46a64dfb5867c6eb60b298e7ef0679fab81a 100644 |
| --- a/media/renderers/renderer_impl_unittest.cc |
| +++ b/media/renderers/renderer_impl_unittest.cc |
| @@ -82,9 +82,8 @@ class RendererImplTest : public ::testing::Test { |
| initialization_status_(PIPELINE_OK) { |
| // CreateAudioStream() and CreateVideoStream() overrides expectations for |
| // expected non-NULL streams. |
| - DemuxerStream* null_pointer = NULL; |
| - EXPECT_CALL(*demuxer_, GetStream(_)) |
| - .WillRepeatedly(Return(null_pointer)); |
| + std::vector<DemuxerStream*> empty; |
| + EXPECT_CALL(*demuxer_, GetStreams()).WillRepeatedly(Return(empty)); |
| } |
| virtual ~RendererImplTest() { Destroy(); } |
| @@ -99,7 +98,8 @@ class RendererImplTest : public ::testing::Test { |
| DemuxerStream::Type type) { |
| std::unique_ptr<StrictMock<MockDemuxerStream>> stream( |
| new StrictMock<MockDemuxerStream>(type)); |
| - EXPECT_CALL(*stream, SetStreamStatusChangeCB(_)) |
| + EXPECT_CALL(*stream, enabled()).WillRepeatedly(Return(true)); |
| + EXPECT_CALL(*demuxer_, SetStreamStatusChangeCB(_)) |
| .Times(testing::AnyNumber()); |
| return stream; |
| } |
| @@ -138,8 +138,11 @@ class RendererImplTest : public ::testing::Test { |
| void CreateAudioStream() { |
| audio_stream_ = CreateStream(DemuxerStream::AUDIO); |
| - EXPECT_CALL(*demuxer_, GetStream(DemuxerStream::AUDIO)) |
| - .WillRepeatedly(Return(audio_stream_.get())); |
| + std::vector<DemuxerStream*> streams; |
| + streams.push_back(audio_stream_.get()); |
| + if (video_stream_) |
| + streams.push_back(video_stream_.get()); |
|
xhwang
2017/02/01 18:26:04
ditto about refactor this test, e.g. maybe just s/
servolk
2017/02/01 22:29:21
Done.
|
| + EXPECT_CALL(*demuxer_, GetStreams()).WillRepeatedly(Return(streams)); |
| } |
| void CreateVideoStream(bool is_encrypted = false) { |
| @@ -147,8 +150,11 @@ class RendererImplTest : public ::testing::Test { |
| video_stream_->set_video_decoder_config( |
| is_encrypted ? TestVideoConfig::NormalEncrypted() |
| : TestVideoConfig::Normal()); |
| - EXPECT_CALL(*demuxer_, GetStream(DemuxerStream::VIDEO)) |
| - .WillRepeatedly(Return(video_stream_.get())); |
| + std::vector<DemuxerStream*> streams; |
| + if (audio_stream_) |
| + streams.push_back(audio_stream_.get()); |
| + streams.push_back(video_stream_.get()); |
| + EXPECT_CALL(*demuxer_, GetStreams()).WillRepeatedly(Return(streams)); |
| } |
| void CreateEncryptedVideoStream() { CreateVideoStream(true); } |
| @@ -162,16 +168,19 @@ class RendererImplTest : public ::testing::Test { |
| CreateAudioStream(); |
| SetAudioRendererInitializeExpectations(PIPELINE_OK); |
| // There is a potential race between HTMLMediaElement/WMPI shutdown and |
| - // renderers being initialized which might result in DemuxerStreamProvider |
| - // GetStream suddenly returning NULL (see crbug.com/668604). So we are going |
| - // to check here that GetStream will be invoked exactly 3 times during |
| + // renderers being initialized which might result in MediaResource |
| + // GetStreams suddenly returning fewer streams than before or even returning |
| + // and empty stream collection (see crbug.com/668604). So we are going to |
| + // check here that GetStreams will be invoked exactly 3 times during |
| // RendererImpl initialization to help catch potential issues. Currently the |
| - // GetStream is invoked once directly from RendererImpl::Initialize, once |
| - // indirectly from RendererImpl::Initialize via HasEncryptedStream and once |
| - // from RendererImpl::InitializeAudioRenderer. |
| - EXPECT_CALL(*demuxer_, GetStream(DemuxerStream::AUDIO)) |
| - .Times(2) |
| - .WillRepeatedly(Return(audio_stream_.get())); |
| + // GetStreams is invoked once from the RendererImpl::Initialize via |
| + // HasEncryptedStream, once from the RendererImpl::InitializeAudioRenderer |
| + // and once from the RendererImpl::InitializeVideoRenderer. |
| + std::vector<DemuxerStream*> streams; |
| + streams.push_back(audio_stream_.get()); |
| + EXPECT_CALL(*demuxer_, GetStreams()) |
| + .Times(3) |
| + .WillRepeatedly(Return(streams)); |
| InitializeAndExpect(PIPELINE_OK); |
| } |
| @@ -179,16 +188,19 @@ class RendererImplTest : public ::testing::Test { |
| CreateVideoStream(); |
| SetVideoRendererInitializeExpectations(PIPELINE_OK); |
| // There is a potential race between HTMLMediaElement/WMPI shutdown and |
| - // renderers being initialized which might result in DemuxerStreamProvider |
| - // GetStream suddenly returning NULL (see crbug.com/668604). So we are going |
| - // to check here that GetStream will be invoked exactly 3 times during |
| + // renderers being initialized which might result in MediaResource |
| + // GetStreams suddenly returning fewer streams than before or even returning |
| + // and empty stream collection (see crbug.com/668604). So we are going to |
| + // check here that GetStreams will be invoked exactly 3 times during |
| // RendererImpl initialization to help catch potential issues. Currently the |
| - // GetStream is invoked once directly from RendererImpl::Initialize, once |
| - // indirectly from RendererImpl::Initialize via HasEncryptedStream and once |
| - // from RendererImpl::InitializeVideoRenderer. |
| - EXPECT_CALL(*demuxer_, GetStream(DemuxerStream::VIDEO)) |
| - .Times(2) |
| - .WillRepeatedly(Return(video_stream_.get())); |
| + // GetStreams is invoked once from the RendererImpl::Initialize via |
| + // HasEncryptedStream, once from the RendererImpl::InitializeAudioRenderer |
| + // and once from the RendererImpl::InitializeVideoRenderer. |
| + std::vector<DemuxerStream*> streams; |
| + streams.push_back(video_stream_.get()); |
| + EXPECT_CALL(*demuxer_, GetStreams()) |
| + .Times(3) |
| + .WillRepeatedly(Return(streams)); |
| InitializeAndExpect(PIPELINE_OK); |
| } |
| @@ -751,12 +763,9 @@ TEST_F(RendererImplTest, VideoUnderflowWithAudioFlush) { |
| TEST_F(RendererImplTest, StreamStatusNotificationHandling) { |
| CreateAudioAndVideoStream(); |
| - DemuxerStream::StreamStatusChangeCB audio_stream_status_change_cb; |
| - DemuxerStream::StreamStatusChangeCB video_stream_status_change_cb; |
| - EXPECT_CALL(*audio_stream_, SetStreamStatusChangeCB(_)) |
| - .WillOnce(SaveArg<0>(&audio_stream_status_change_cb)); |
| - EXPECT_CALL(*video_stream_, SetStreamStatusChangeCB(_)) |
| - .WillOnce(SaveArg<0>(&video_stream_status_change_cb)); |
| + StreamStatusChangeCB stream_status_change_cb; |
| + EXPECT_CALL(*demuxer_, SetStreamStatusChangeCB(_)) |
| + .WillOnce(SaveArg<0>(&stream_status_change_cb)); |
| SetAudioRendererInitializeExpectations(PIPELINE_OK); |
| SetVideoRendererInitializeExpectations(PIPELINE_OK); |
| InitializeAndExpect(PIPELINE_OK); |
| @@ -770,7 +779,7 @@ TEST_F(RendererImplTest, StreamStatusNotificationHandling) { |
| .Times(1) |
| .WillOnce( |
| SetBufferingState(&audio_renderer_client_, BUFFERING_HAVE_ENOUGH)); |
| - audio_stream_status_change_cb.Run(false, base::TimeDelta()); |
| + stream_status_change_cb.Run(audio_stream_.get(), false, base::TimeDelta()); |
| EXPECT_CALL(*video_renderer_, Flush(_)).WillOnce(RunClosure<0>()); |
| EXPECT_CALL(*video_renderer_, StartPlayingFrom(_)) |
| @@ -779,7 +788,7 @@ TEST_F(RendererImplTest, StreamStatusNotificationHandling) { |
| SetBufferingState(&video_renderer_client_, BUFFERING_HAVE_ENOUGH), |
| PostQuitWhenIdle())); |
| - video_stream_status_change_cb.Run(false, base::TimeDelta()); |
| + stream_status_change_cb.Run(video_stream_.get(), false, base::TimeDelta()); |
| base::RunLoop().Run(); |
| } |
| @@ -792,12 +801,9 @@ TEST_F(RendererImplTest, StreamStatusNotificationHandling) { |
| TEST_F(RendererImplTest, PostponedStreamStatusNotificationHandling) { |
| CreateAudioAndVideoStream(); |
| - DemuxerStream::StreamStatusChangeCB audio_stream_status_change_cb; |
| - DemuxerStream::StreamStatusChangeCB video_stream_status_change_cb; |
| - EXPECT_CALL(*audio_stream_, SetStreamStatusChangeCB(_)) |
| - .WillOnce(SaveArg<0>(&audio_stream_status_change_cb)); |
| - EXPECT_CALL(*video_stream_, SetStreamStatusChangeCB(_)) |
| - .WillOnce(SaveArg<0>(&video_stream_status_change_cb)); |
| + StreamStatusChangeCB stream_status_change_cb; |
| + EXPECT_CALL(*demuxer_, SetStreamStatusChangeCB(_)) |
| + .WillOnce(SaveArg<0>(&stream_status_change_cb)); |
| SetAudioRendererInitializeExpectations(PIPELINE_OK); |
| SetVideoRendererInitializeExpectations(PIPELINE_OK); |
| InitializeAndExpect(PIPELINE_OK); |
| @@ -825,8 +831,8 @@ TEST_F(RendererImplTest, PostponedStreamStatusNotificationHandling) { |
| // Flush operation is async in this case, so the second status change will be |
| // postponed by renderer until after processing the first one is finished. But |
| // we must still get two pairs of Flush/StartPlaying calls eventually. |
| - audio_stream_status_change_cb.Run(false, base::TimeDelta()); |
| - audio_stream_status_change_cb.Run(true, base::TimeDelta()); |
| + stream_status_change_cb.Run(audio_stream_.get(), false, base::TimeDelta()); |
| + stream_status_change_cb.Run(audio_stream_.get(), true, base::TimeDelta()); |
| base::RunLoop().Run(); |
| EXPECT_CALL(*video_renderer_, Flush(_)) |
| @@ -846,8 +852,8 @@ TEST_F(RendererImplTest, PostponedStreamStatusNotificationHandling) { |
| // Flush operation is async in this case, so the second status change will be |
| // postponed by renderer until after processing the first one is finished. But |
| // we must still get two pairs of Flush/StartPlaying calls eventually. |
| - video_stream_status_change_cb.Run(false, base::TimeDelta()); |
| - video_stream_status_change_cb.Run(true, base::TimeDelta()); |
| + stream_status_change_cb.Run(video_stream_.get(), false, base::TimeDelta()); |
| + stream_status_change_cb.Run(video_stream_.get(), true, base::TimeDelta()); |
| base::RunLoop().Run(); |
| } |