Chromium Code Reviews| Index: media/filters/audio_renderer_base_unittest.cc |
| diff --git a/media/filters/audio_renderer_base_unittest.cc b/media/filters/audio_renderer_base_unittest.cc |
| index 93fe785d16873fd5a87cf90f7c750ddbe5282860..a78943713f5bca58b0def1cac06b91e1e2e80c52 100644 |
| --- a/media/filters/audio_renderer_base_unittest.cc |
| +++ b/media/filters/audio_renderer_base_unittest.cc |
| @@ -16,6 +16,8 @@ using ::testing::_; |
| using ::testing::AnyNumber; |
| using ::testing::Invoke; |
| using ::testing::Return; |
| +using ::testing::ReturnPointee; |
| +using ::testing::SaveArg; |
| using ::testing::StrictMock; |
| namespace media { |
| @@ -110,6 +112,18 @@ class AudioRendererBaseTest : public ::testing::Test { |
| renderer_->SetPlaybackRate(1.0f); |
| } |
| + void Seek(base::TimeDelta seek_time) { |
| + next_timestamp_ = seek_time; |
| + |
| + // Seek to trigger prerolling. |
| + EXPECT_CALL(*decoder_, Read(_)); |
| + renderer_->Seek(seek_time, NewSeekCB()); |
| + |
| + // Fill entire buffer to complete prerolling. |
| + EXPECT_CALL(*this, OnSeekComplete(PIPELINE_OK)); |
| + DeliverRemainingAudio(); |
| + } |
| + |
| // Delivers |size| bytes with value kPlayingAudio to |renderer_|. |
| // |
| // There must be a pending read callback. |
| @@ -119,11 +133,22 @@ class AudioRendererBaseTest : public ::testing::Test { |
| buffer->SetDataSize(size); |
| memset(buffer->GetWritableData(), kPlayingAudio, buffer->GetDataSize()); |
| + buffer->SetTimestamp(next_timestamp_); |
| + int64 bps = decoder_->bits_per_channel() * decoder_->samples_per_second(); |
| + buffer->SetDuration(base::TimeDelta::FromMilliseconds(8000 * size / bps)); |
| + next_timestamp_ += buffer->GetDuration(); |
| + |
| AudioDecoder::ReadCB read_cb; |
| std::swap(read_cb, read_cb_); |
| read_cb.Run(buffer); |
| } |
| + void AbortPendingRead() { |
| + AudioDecoder::ReadCB read_cb; |
| + std::swap(read_cb, read_cb_); |
| + read_cb.Run(NULL); |
| + } |
| + |
| // Delivers an end of stream buffer to |renderer_|. |
| // |
| // There must be a pending read callback. |
| @@ -181,6 +206,7 @@ class AudioRendererBaseTest : public ::testing::Test { |
| scoped_refptr<MockAudioDecoder> decoder_; |
| StrictMock<MockFilterHost> host_; |
| AudioDecoder::ReadCB read_cb_; |
| + base::TimeDelta next_timestamp_; |
| private: |
| void SaveReadCallback(const AudioDecoder::ReadCB& callback) { |
| @@ -283,6 +309,7 @@ TEST_F(AudioRendererBaseTest, Underflow_EndOfStream) { |
| Preroll(); |
| Play(); |
| + |
|
Ami GONE FROM CHROMIUM
2012/01/29 22:12:38
Extra \n
acolwell GONE FROM CHROMIUM
2012/01/30 00:14:14
Done.
|
| // Drain internal buffer, we should have a pending read. |
| EXPECT_CALL(*decoder_, Read(_)); |
| EXPECT_TRUE(ConsumeBufferedData(bytes_buffered(), NULL)); |
| @@ -321,6 +348,10 @@ TEST_F(AudioRendererBaseTest, Underflow_EndOfStream) { |
| // called NotifyEnded() http://crbug.com/106641 |
| DeliverEndOfStream(); |
| EXPECT_CALL(host_, NotifyEnded()); |
| + |
| + EXPECT_CALL(host_, GetTime()) |
| + .WillOnce(Return(base::TimeDelta())); |
|
Ami GONE FROM CHROMIUM
2012/01/29 22:12:38
one line?
acolwell GONE FROM CHROMIUM
2012/01/30 00:14:14
Done.
|
| + EXPECT_CALL(host_, SetTime(base::TimeDelta::FromMilliseconds(754))); |
|
Ami GONE FROM CHROMIUM
2012/01/29 22:12:38
754? Why not _? More generally, wat???
acolwell GONE FROM CHROMIUM
2012/01/30 00:14:14
Changed to _ since I don't actually care what the
|
| EXPECT_FALSE(ConsumeBufferedData(kDataSize, &muted)); |
| EXPECT_FALSE(muted); |
| } |
| @@ -354,4 +385,39 @@ TEST_F(AudioRendererBaseTest, Underflow_ResumeFromCallback) { |
| EXPECT_FALSE(muted); |
| } |
| +TEST_F(AudioRendererBaseTest, AbortPendingRead_Preroll) { |
| + Initialize(); |
| + |
| + // Seek to trigger prerolling. |
| + EXPECT_CALL(*decoder_, Read(_)); |
| + renderer_->Seek(base::TimeDelta(), NewSeekCB()); |
| + |
| + // Simulate the decoder aborting the pending read. |
| + EXPECT_CALL(*this, OnSeekComplete(PIPELINE_OK)); |
| + AbortPendingRead(); |
| + |
| + // Seek to trigger another preroll and verify it completes |
| + // normally. |
| + Seek(base::TimeDelta::FromSeconds(1)); |
| + |
| + ASSERT_TRUE(read_cb_.is_null()); |
| +} |
| + |
| +TEST_F(AudioRendererBaseTest, AbortPendingRead_Pause) { |
| + Initialize(); |
| + |
| + Preroll(); |
| + Play(); |
| + |
| + // Partially drain internal buffer so we get a pending read. |
| + EXPECT_CALL(*decoder_, Read(_)); |
| + EXPECT_TRUE(ConsumeBufferedData(bytes_buffered() / 2, NULL)); |
| + |
| + renderer_->Pause(NewExpectedClosure()); |
| + |
| + AbortPendingRead(); |
| + |
| + Seek(base::TimeDelta::FromSeconds(1)); |
| +} |
| + |
| } // namespace media |