Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include <vector> | 5 #include <vector> |
| 6 | 6 |
| 7 #include "base/bind.h" | 7 #include "base/bind.h" |
| 8 #include "base/message_loop/message_loop.h" | 8 #include "base/message_loop/message_loop.h" |
| 9 #include "base/stl_util.h" | 9 #include "base/stl_util.h" |
| 10 #include "base/test/simple_test_tick_clock.h" | 10 #include "base/test/simple_test_tick_clock.h" |
| (...skipping 162 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 173 | 173 |
| 174 void AddTextStream() { | 174 void AddTextStream() { |
| 175 EXPECT_CALL(*this, OnAddTextTrack(_,_)) | 175 EXPECT_CALL(*this, OnAddTextTrack(_,_)) |
| 176 .WillOnce(Invoke(this, &PipelineTest::DoOnAddTextTrack)); | 176 .WillOnce(Invoke(this, &PipelineTest::DoOnAddTextTrack)); |
| 177 static_cast<DemuxerHost*>(pipeline_.get())->AddTextStream(text_stream(), | 177 static_cast<DemuxerHost*>(pipeline_.get())->AddTextStream(text_stream(), |
| 178 TextTrackConfig(kTextSubtitles, "", "", "")); | 178 TextTrackConfig(kTextSubtitles, "", "", "")); |
| 179 message_loop_.RunUntilIdle(); | 179 message_loop_.RunUntilIdle(); |
| 180 } | 180 } |
| 181 | 181 |
| 182 void StartPipeline() { | 182 void StartPipeline() { |
| 183 EXPECT_CALL(*demuxer_, GetStartTime()).WillRepeatedly(Return(start_time_)); | |
|
scherkus (not reviewing)
2014/09/16 18:55:41
could we move these to Pipeline() along with the o
DaleCurtis
2014/09/16 20:03:03
Nice, I didn't know you could override like this.
| |
| 183 pipeline_->Start( | 184 pipeline_->Start( |
| 184 demuxer_.get(), | 185 demuxer_.get(), |
| 185 scoped_renderer_.PassAs<Renderer>(), | 186 scoped_renderer_.PassAs<Renderer>(), |
| 186 base::Bind(&CallbackHelper::OnEnded, base::Unretained(&callbacks_)), | 187 base::Bind(&CallbackHelper::OnEnded, base::Unretained(&callbacks_)), |
| 187 base::Bind(&CallbackHelper::OnError, base::Unretained(&callbacks_)), | 188 base::Bind(&CallbackHelper::OnError, base::Unretained(&callbacks_)), |
| 188 base::Bind(&CallbackHelper::OnStart, base::Unretained(&callbacks_)), | 189 base::Bind(&CallbackHelper::OnStart, base::Unretained(&callbacks_)), |
| 189 base::Bind(&CallbackHelper::OnMetadata, base::Unretained(&callbacks_)), | 190 base::Bind(&CallbackHelper::OnMetadata, base::Unretained(&callbacks_)), |
| 190 base::Bind(&CallbackHelper::OnBufferingStateChange, | 191 base::Bind(&CallbackHelper::OnBufferingStateChange, |
| 191 base::Unretained(&callbacks_)), | 192 base::Unretained(&callbacks_)), |
| 192 base::Bind(&CallbackHelper::OnDurationChange, | 193 base::Bind(&CallbackHelper::OnDurationChange, |
| 193 base::Unretained(&callbacks_)), | 194 base::Unretained(&callbacks_)), |
| 194 base::Bind(&PipelineTest::OnAddTextTrack, base::Unretained(this))); | 195 base::Bind(&PipelineTest::OnAddTextTrack, base::Unretained(this))); |
| 195 } | 196 } |
| 196 | 197 |
| 197 // Sets up expectations on the callback and initializes the pipeline. Called | 198 // Sets up expectations on the callback and initializes the pipeline. Called |
| 198 // after tests have set expectations any filters they wish to use. | 199 // after tests have set expectations any filters they wish to use. |
| 199 void StartPipelineAndExpect(PipelineStatus start_status) { | 200 void StartPipelineAndExpect(PipelineStatus start_status) { |
| 201 EXPECT_CALL(*demuxer_, GetStartTime()).WillRepeatedly(Return(start_time_)); | |
| 200 EXPECT_CALL(callbacks_, OnStart(start_status)); | 202 EXPECT_CALL(callbacks_, OnStart(start_status)); |
| 201 | 203 |
| 202 if (start_status == PIPELINE_OK) { | 204 if (start_status == PIPELINE_OK) { |
| 203 EXPECT_CALL(callbacks_, OnMetadata(_)).WillOnce(SaveArg<0>(&metadata_)); | 205 EXPECT_CALL(callbacks_, OnMetadata(_)).WillOnce(SaveArg<0>(&metadata_)); |
| 204 EXPECT_CALL(*renderer_, SetPlaybackRate(0.0f)); | 206 EXPECT_CALL(*renderer_, SetPlaybackRate(0.0f)); |
| 205 EXPECT_CALL(*renderer_, SetVolume(1.0f)); | 207 EXPECT_CALL(*renderer_, SetVolume(1.0f)); |
| 206 EXPECT_CALL(*renderer_, StartPlayingFrom(base::TimeDelta())) | 208 EXPECT_CALL(*renderer_, StartPlayingFrom(start_time_)) |
| 207 .WillOnce(SetBufferingState(&buffering_state_cb_, | 209 .WillOnce(SetBufferingState(&buffering_state_cb_, |
| 208 BUFFERING_HAVE_ENOUGH)); | 210 BUFFERING_HAVE_ENOUGH)); |
| 209 EXPECT_CALL(callbacks_, OnBufferingStateChange(BUFFERING_HAVE_ENOUGH)); | 211 EXPECT_CALL(callbacks_, OnBufferingStateChange(BUFFERING_HAVE_ENOUGH)); |
| 210 } | 212 } |
| 211 | 213 |
| 212 StartPipeline(); | 214 StartPipeline(); |
| 213 message_loop_.RunUntilIdle(); | 215 message_loop_.RunUntilIdle(); |
| 214 } | 216 } |
| 215 | 217 |
| 216 void CreateAudioStream() { | 218 void CreateAudioStream() { |
| (...skipping 89 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 306 StrictMock<MockRenderer>* renderer_; | 308 StrictMock<MockRenderer>* renderer_; |
| 307 StrictMock<CallbackHelper> text_renderer_callbacks_; | 309 StrictMock<CallbackHelper> text_renderer_callbacks_; |
| 308 TextRenderer* text_renderer_; | 310 TextRenderer* text_renderer_; |
| 309 scoped_ptr<StrictMock<MockDemuxerStream> > audio_stream_; | 311 scoped_ptr<StrictMock<MockDemuxerStream> > audio_stream_; |
| 310 scoped_ptr<StrictMock<MockDemuxerStream> > video_stream_; | 312 scoped_ptr<StrictMock<MockDemuxerStream> > video_stream_; |
| 311 scoped_ptr<FakeTextTrackStream> text_stream_; | 313 scoped_ptr<FakeTextTrackStream> text_stream_; |
| 312 BufferingStateCB buffering_state_cb_; | 314 BufferingStateCB buffering_state_cb_; |
| 313 base::Closure ended_cb_; | 315 base::Closure ended_cb_; |
| 314 VideoDecoderConfig video_decoder_config_; | 316 VideoDecoderConfig video_decoder_config_; |
| 315 PipelineMetadata metadata_; | 317 PipelineMetadata metadata_; |
| 318 base::TimeDelta start_time_; | |
| 316 | 319 |
| 317 private: | 320 private: |
| 318 DISALLOW_COPY_AND_ASSIGN(PipelineTest); | 321 DISALLOW_COPY_AND_ASSIGN(PipelineTest); |
| 319 }; | 322 }; |
| 320 | 323 |
| 321 // Test that playback controls methods no-op when the pipeline hasn't been | 324 // Test that playback controls methods no-op when the pipeline hasn't been |
| 322 // started. | 325 // started. |
| 323 TEST_F(PipelineTest, NotStarted) { | 326 TEST_F(PipelineTest, NotStarted) { |
| 324 const base::TimeDelta kZero; | 327 const base::TimeDelta kZero; |
| 325 | 328 |
| (...skipping 409 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 735 // Simulate underflow. | 738 // Simulate underflow. |
| 736 EXPECT_CALL(callbacks_, OnBufferingStateChange(BUFFERING_HAVE_NOTHING)); | 739 EXPECT_CALL(callbacks_, OnBufferingStateChange(BUFFERING_HAVE_NOTHING)); |
| 737 buffering_state_cb_.Run(BUFFERING_HAVE_NOTHING); | 740 buffering_state_cb_.Run(BUFFERING_HAVE_NOTHING); |
| 738 | 741 |
| 739 // Seek while underflowed. | 742 // Seek while underflowed. |
| 740 base::TimeDelta expected = base::TimeDelta::FromSeconds(5); | 743 base::TimeDelta expected = base::TimeDelta::FromSeconds(5); |
| 741 ExpectSeek(expected, true); | 744 ExpectSeek(expected, true); |
| 742 DoSeek(expected); | 745 DoSeek(expected); |
| 743 } | 746 } |
| 744 | 747 |
| 748 TEST_F(PipelineTest, PositiveStartTime) { | |
| 749 start_time_ = base::TimeDelta::FromSeconds(1); | |
| 750 CreateAudioStream(); | |
| 751 MockDemuxerStreamVector streams; | |
| 752 streams.push_back(audio_stream()); | |
| 753 SetDemuxerExpectations(&streams); | |
| 754 SetRendererExpectations(); | |
| 755 StartPipelineAndExpect(PIPELINE_OK); | |
| 756 ExpectDemuxerStop(); | |
| 757 ExpectPipelineStopAndDestroyPipeline(); | |
| 758 pipeline_->Stop( | |
| 759 base::Bind(&CallbackHelper::OnStop, base::Unretained(&callbacks_))); | |
| 760 message_loop_.RunUntilIdle(); | |
| 761 } | |
| 762 | |
| 745 class PipelineTeardownTest : public PipelineTest { | 763 class PipelineTeardownTest : public PipelineTest { |
| 746 public: | 764 public: |
| 747 enum TeardownState { | 765 enum TeardownState { |
| 748 kInitDemuxer, | 766 kInitDemuxer, |
| 749 kInitRenderer, | 767 kInitRenderer, |
| 750 kFlushing, | 768 kFlushing, |
| 751 kSeeking, | 769 kSeeking, |
| 752 kPlaying, | 770 kPlaying, |
| 753 }; | 771 }; |
| 754 | 772 |
| (...skipping 219 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 974 | 992 |
| 975 INSTANTIATE_TEARDOWN_TEST(Error, InitDemuxer); | 993 INSTANTIATE_TEARDOWN_TEST(Error, InitDemuxer); |
| 976 INSTANTIATE_TEARDOWN_TEST(Error, InitRenderer); | 994 INSTANTIATE_TEARDOWN_TEST(Error, InitRenderer); |
| 977 INSTANTIATE_TEARDOWN_TEST(Error, Flushing); | 995 INSTANTIATE_TEARDOWN_TEST(Error, Flushing); |
| 978 INSTANTIATE_TEARDOWN_TEST(Error, Seeking); | 996 INSTANTIATE_TEARDOWN_TEST(Error, Seeking); |
| 979 INSTANTIATE_TEARDOWN_TEST(Error, Playing); | 997 INSTANTIATE_TEARDOWN_TEST(Error, Playing); |
| 980 | 998 |
| 981 INSTANTIATE_TEARDOWN_TEST(ErrorAndStop, Playing); | 999 INSTANTIATE_TEARDOWN_TEST(ErrorAndStop, Playing); |
| 982 | 1000 |
| 983 } // namespace media | 1001 } // namespace media |
| OLD | NEW |