Chromium Code Reviews| Index: media/filters/decrypting_audio_decoder_unittest.cc |
| diff --git a/media/filters/decrypting_audio_decoder_unittest.cc b/media/filters/decrypting_audio_decoder_unittest.cc |
| index deb917d1acb0e53ee6873a34febbf8319ad77d1d..de672ee99afba20dc309c762da110ffd9009a5d3 100644 |
| --- a/media/filters/decrypting_audio_decoder_unittest.cc |
| +++ b/media/filters/decrypting_audio_decoder_unittest.cc |
| @@ -49,7 +49,7 @@ static scoped_refptr<DecoderBuffer> CreateFakeEncryptedBuffer() { |
| namespace { |
| ACTION_P(ReturnBuffer, buffer) { |
| - arg0.Run(buffer.get() ? DemuxerStream::kOk : DemuxerStream::kAborted, buffer); |
| + return buffer; |
| } |
| ACTION_P(RunCallbackIfNotNull, param) { |
| @@ -57,8 +57,10 @@ ACTION_P(RunCallbackIfNotNull, param) { |
| arg0.Run(param); |
| } |
| -ACTION_P2(ResetAndRunCallback, callback, param) { |
| - base::ResetAndReturn(callback).Run(param); |
| +// Mock action which we use to repeatedly call ReadAndExpectFrameReadyWith() if |
| +// we get kNotEnoughData from a Decode() call to |decoder_|. |
| +ACTION_P2(CallExpectFrameReadyMoreData, test, buffer) { |
| + test->ReadAndExpectFrameReadyWith(AudioDecoder::kNotEnoughData, buffer); |
| } |
| MATCHER(IsEndOfStream, "end of stream") { |
| @@ -76,14 +78,14 @@ class DecryptingAudioDecoderTest : public testing::Test { |
| &DecryptingAudioDecoderTest::RequestDecryptorNotification, |
| base::Unretained(this)))), |
| decryptor_(new StrictMock<MockDecryptor>()), |
| - demuxer_(new StrictMock<MockDemuxerStream>(DemuxerStream::AUDIO)), |
| encrypted_buffer_(CreateFakeEncryptedBuffer()), |
| decoded_frame_(NULL), |
| end_of_stream_frame_(AudioBuffer::CreateEOSBuffer()), |
| - decoded_frame_list_() { |
| - } |
| + decoded_frame_list_() {} |
| virtual ~DecryptingAudioDecoderTest() { |
| + EXPECT_CALL(*this, RequestDecryptorNotification(_)) |
| + .Times(testing::AnyNumber()); |
| Stop(); |
| } |
| @@ -99,10 +101,7 @@ class DecryptingAudioDecoderTest : public testing::Test { |
| channels, kFakeAudioFrameSize, kNoTimestamp(), kNoTimestamp()); |
| decoded_frame_list_.push_back(decoded_frame_); |
| - demuxer_->set_audio_decoder_config(config); |
| - decoder_->Initialize(demuxer_.get(), NewExpectedStatusCB(status), |
| - base::Bind(&MockStatisticsCB::OnStatistics, |
| - base::Unretained(&statistics_cb_))); |
| + decoder_->Initialize(config, NewExpectedStatusCB(status)); |
| message_loop_.RunUntilIdle(); |
| } |
| @@ -126,18 +125,44 @@ class DecryptingAudioDecoderTest : public testing::Test { |
| EXPECT_EQ(config_.samples_per_second(), decoder_->samples_per_second()); |
| } |
| + void Reinitialize() { |
| + ReinitializeConfigChange(config_); |
| + } |
| + |
| + void ReinitializeConfigChange(AudioDecoderConfig& new_config) { |
| + EXPECT_CALL(*decryptor_, DeinitializeDecoder(Decryptor::kAudio)); |
| + EXPECT_CALL(*decryptor_, InitializeAudioDecoder(_, _)) |
| + .WillOnce(RunCallback<1>(true)); |
| + EXPECT_CALL(*decryptor_, RegisterNewKeyCB(Decryptor::kAudio, _)) |
| + .WillOnce(SaveArg<1>(&key_added_cb_)); |
| + decoder_->Initialize(new_config, NewExpectedStatusCB(PIPELINE_OK)); |
| + } |
| + |
| void ReadAndExpectFrameReadyWith( |
| AudioDecoder::Status status, |
| const scoped_refptr<AudioBuffer>& audio_frame) { |
| - if (status != AudioDecoder::kOk) |
| + |
| + if (const scoped_refptr<AudioBuffer>& buffer = |
| + decoder_->GetDecodeOutput()) { |
|
xhwang
2014/03/05 00:40:46
ditto about this style :)
rileya (GONE FROM CHROMIUM)
2014/03/05 08:08:28
Fixed.
|
| + EXPECT_EQ(audio_frame, buffer); |
| + EXPECT_EQ(status, AudioDecoder::kOk); |
| + return; |
| + } |
| + |
| + if (status == AudioDecoder::kNotEnoughData) |
| + // Keep calling again to give it more data if we get kNotEnoughData. |
| + EXPECT_CALL(*this, FrameReady(status, scoped_refptr<AudioBuffer>(NULL))). |
| + WillRepeatedly(CallExpectFrameReadyMoreData(this, audio_frame)); |
| + else if (status != AudioDecoder::kOk) |
| EXPECT_CALL(*this, FrameReady(status, IsNull())); |
| else if (audio_frame->end_of_stream()) |
| EXPECT_CALL(*this, FrameReady(status, IsEndOfStream())); |
| else |
| EXPECT_CALL(*this, FrameReady(status, audio_frame)); |
| - decoder_->Read(base::Bind(&DecryptingAudioDecoderTest::FrameReady, |
| - base::Unretained(this))); |
| + decoder_->Decode(ProvideDecoderBuffer(), |
|
xhwang
2014/03/05 00:40:46
It's odd that in a lot of tests we call PDB(), the
rileya (GONE FROM CHROMIUM)
2014/03/05 08:08:28
Good point. I'd pretty much just replaced all the
|
| + base::Bind(&DecryptingAudioDecoderTest::FrameReady, |
| + base::Unretained(this))); |
| message_loop_.RunUntilIdle(); |
| } |
| @@ -146,14 +171,13 @@ class DecryptingAudioDecoderTest : public testing::Test { |
| void EnterNormalDecodingState() { |
| Decryptor::AudioBuffers end_of_stream_frames_(1, end_of_stream_frame_); |
| - EXPECT_CALL(*demuxer_, Read(_)) |
| + EXPECT_CALL(*this, ProvideDecoderBuffer()) |
| .WillOnce(ReturnBuffer(encrypted_buffer_)) |
| .WillRepeatedly(ReturnBuffer(DecoderBuffer::CreateEOSBuffer())); |
| EXPECT_CALL(*decryptor_, DecryptAndDecodeAudio(_, _)) |
| .WillOnce(RunCallback<1>(Decryptor::kSuccess, decoded_frame_list_)) |
| .WillRepeatedly(RunCallback<1>(Decryptor::kNeedMoreData, |
| Decryptor::AudioBuffers())); |
| - EXPECT_CALL(statistics_cb_, OnStatistics(_)); |
| ReadAndExpectFrameReadyWith(AudioDecoder::kOk, decoded_frame_); |
| } |
| @@ -165,42 +189,32 @@ class DecryptingAudioDecoderTest : public testing::Test { |
| ReadAndExpectFrameReadyWith(AudioDecoder::kOk, end_of_stream_frame_); |
| } |
| - // Make the read callback pending by saving and not firing it. |
| - void EnterPendingReadState() { |
| - EXPECT_TRUE(pending_demuxer_read_cb_.is_null()); |
| - EXPECT_CALL(*demuxer_, Read(_)) |
| - .WillOnce(SaveArg<0>(&pending_demuxer_read_cb_)); |
| - decoder_->Read(base::Bind(&DecryptingAudioDecoderTest::FrameReady, |
| - base::Unretained(this))); |
| - message_loop_.RunUntilIdle(); |
| - // Make sure the Read() on the decoder triggers a Read() on the demuxer. |
| - EXPECT_FALSE(pending_demuxer_read_cb_.is_null()); |
| - } |
| - |
| // Make the audio decode callback pending by saving and not firing it. |
| void EnterPendingDecodeState() { |
| EXPECT_TRUE(pending_audio_decode_cb_.is_null()); |
| - EXPECT_CALL(*demuxer_, Read(_)) |
| + EXPECT_CALL(*this, ProvideDecoderBuffer()) |
| .WillRepeatedly(ReturnBuffer(encrypted_buffer_)); |
| EXPECT_CALL(*decryptor_, DecryptAndDecodeAudio(encrypted_buffer_, _)) |
| .WillOnce(SaveArg<1>(&pending_audio_decode_cb_)); |
| - decoder_->Read(base::Bind(&DecryptingAudioDecoderTest::FrameReady, |
| - base::Unretained(this))); |
| + decoder_->Decode(ProvideDecoderBuffer(), |
| + base::Bind(&DecryptingAudioDecoderTest::FrameReady, |
| + base::Unretained(this))); |
| message_loop_.RunUntilIdle(); |
| - // Make sure the Read() on the decoder triggers a DecryptAndDecode() on the |
| - // decryptor. |
| + // Make sure the Decode() on the decoder triggers a DecryptAndDecode() on |
| + // the decryptor. |
| EXPECT_FALSE(pending_audio_decode_cb_.is_null()); |
| } |
| void EnterWaitingForKeyState() { |
| - EXPECT_CALL(*demuxer_, Read(_)) |
| + EXPECT_CALL(*this, ProvideDecoderBuffer()) |
| .WillRepeatedly(ReturnBuffer(encrypted_buffer_)); |
| EXPECT_CALL(*decryptor_, DecryptAndDecodeAudio(encrypted_buffer_, _)) |
| .WillRepeatedly(RunCallback<1>(Decryptor::kNoKey, |
| Decryptor::AudioBuffers())); |
| - decoder_->Read(base::Bind(&DecryptingAudioDecoderTest::FrameReady, |
| - base::Unretained(this))); |
| + decoder_->Decode(ProvideDecoderBuffer(), |
| + base::Bind(&DecryptingAudioDecoderTest::FrameReady, |
| + base::Unretained(this))); |
| message_loop_.RunUntilIdle(); |
| } |
| @@ -244,19 +258,21 @@ class DecryptingAudioDecoderTest : public testing::Test { |
| MOCK_METHOD2(FrameReady, |
| void(AudioDecoder::Status, const scoped_refptr<AudioBuffer>&)); |
| + // Fills the role of the DemuxerStream, returns DecoderBuffers for |decoder_| |
| + // to decode. |
| + MOCK_METHOD0(ProvideDecoderBuffer, |
| + scoped_refptr<DecoderBuffer>(void)); |
| + |
| base::MessageLoop message_loop_; |
| scoped_ptr<DecryptingAudioDecoder> decoder_; |
| scoped_ptr<StrictMock<MockDecryptor> > decryptor_; |
| - scoped_ptr<StrictMock<MockDemuxerStream> > demuxer_; |
| - MockStatisticsCB statistics_cb_; |
| AudioDecoderConfig config_; |
| - DemuxerStream::ReadCB pending_demuxer_read_cb_; |
| Decryptor::DecoderInitCB pending_init_cb_; |
| Decryptor::NewKeyCB key_added_cb_; |
| Decryptor::AudioDecodeCB pending_audio_decode_cb_; |
| - // Constant buffer/frames to be returned by the |demuxer_| and |decryptor_|. |
| + // Constant buffer/frames, to be used/returned by |decoder_| and |decryptor_|. |
| scoped_refptr<DecoderBuffer> encrypted_buffer_; |
| scoped_refptr<AudioBuffer> decoded_frame_; |
| scoped_refptr<AudioBuffer> end_of_stream_frame_; |
| @@ -318,7 +334,7 @@ TEST_F(DecryptingAudioDecoderTest, DecryptAndDecode_Normal) { |
| TEST_F(DecryptingAudioDecoderTest, DecryptAndDecode_DecodeError) { |
| Initialize(); |
| - EXPECT_CALL(*demuxer_, Read(_)) |
| + EXPECT_CALL(*this, ProvideDecoderBuffer()) |
| .WillRepeatedly(ReturnBuffer(encrypted_buffer_)); |
| EXPECT_CALL(*decryptor_, DecryptAndDecodeAudio(_, _)) |
| .WillRepeatedly(RunCallback<1>(Decryptor::kError, |
| @@ -332,17 +348,17 @@ TEST_F(DecryptingAudioDecoderTest, DecryptAndDecode_DecodeError) { |
| TEST_F(DecryptingAudioDecoderTest, DecryptAndDecode_NeedMoreData) { |
| Initialize(); |
| - EXPECT_CALL(*demuxer_, Read(_)) |
| - .Times(2) |
| + EXPECT_CALL(*this, ProvideDecoderBuffer()) |
| .WillRepeatedly(ReturnBuffer(encrypted_buffer_)); |
| EXPECT_CALL(*decryptor_, DecryptAndDecodeAudio(_, _)) |
| .WillOnce(RunCallback<1>(Decryptor::kNeedMoreData, |
| Decryptor::AudioBuffers())) |
| .WillRepeatedly(RunCallback<1>(Decryptor::kSuccess, decoded_frame_list_)); |
| - EXPECT_CALL(statistics_cb_, OnStatistics(_)) |
| - .Times(2); |
| - ReadAndExpectFrameReadyWith(AudioDecoder::kOk, decoded_frame_); |
| + // We expect it to eventually return kOk, with any number of returns of |
| + // kNotEnoughData beforehand. |
| + EXPECT_CALL(*this, FrameReady(AudioDecoder::kOk, decoded_frame_)); |
| + ReadAndExpectFrameReadyWith(AudioDecoder::kNotEnoughData, decoded_frame_); |
| } |
| // Test the case where the decryptor returns multiple decoded frames. |
| @@ -362,11 +378,10 @@ TEST_F(DecryptingAudioDecoderTest, DecryptAndDecode_MultipleFrames) { |
| decoded_frame_list_.push_back(frame_a); |
| decoded_frame_list_.push_back(frame_b); |
| - EXPECT_CALL(*demuxer_, Read(_)) |
| - .WillOnce(ReturnBuffer(encrypted_buffer_)); |
| + EXPECT_CALL(*this, ProvideDecoderBuffer()) |
| + .WillRepeatedly(ReturnBuffer(encrypted_buffer_)); |
| EXPECT_CALL(*decryptor_, DecryptAndDecodeAudio(_, _)) |
| .WillOnce(RunCallback<1>(Decryptor::kSuccess, decoded_frame_list_)); |
| - EXPECT_CALL(statistics_cb_, OnStatistics(_)); |
| ReadAndExpectFrameReadyWith(AudioDecoder::kOk, decoded_frame_); |
| ReadAndExpectFrameReadyWith(AudioDecoder::kOk, frame_a); |
| @@ -380,63 +395,30 @@ TEST_F(DecryptingAudioDecoderTest, DecryptAndDecode_EndOfStream) { |
| EnterEndOfStreamState(); |
| } |
| -// Test aborted read on the demuxer stream. |
| -TEST_F(DecryptingAudioDecoderTest, DemuxerRead_Aborted) { |
| +// Test reinitializing decode with a new config |
| +TEST_F(DecryptingAudioDecoderTest, Reinitialize_ConfigChange) { |
| Initialize(); |
| - // ReturnBuffer() with NULL triggers aborted demuxer read. |
| - EXPECT_CALL(*demuxer_, Read(_)) |
| - .WillOnce(ReturnBuffer(scoped_refptr<DecoderBuffer>())); |
| - |
| - ReadAndExpectFrameReadyWith(AudioDecoder::kAborted, NULL); |
| -} |
| - |
| -// Test config change on the demuxer stream. |
| -TEST_F(DecryptingAudioDecoderTest, DemuxerRead_ConfigChange) { |
| - Initialize(); |
| + EXPECT_CALL(*decryptor_, InitializeAudioDecoder(_, _)) |
| + .Times(AtMost(1)) |
| + .WillOnce(RunCallback<1>(true)); |
| // The new config is different from the initial config in bits-per-channel, |
| // channel layout and samples_per_second. |
| AudioDecoderConfig new_config(kCodecVorbis, kSampleFormatPlanarS16, |
| - CHANNEL_LAYOUT_5_1, 88200, NULL, 0, false); |
| + CHANNEL_LAYOUT_5_1, 88200, NULL, 0, true); |
| EXPECT_NE(new_config.bits_per_channel(), config_.bits_per_channel()); |
| EXPECT_NE(new_config.channel_layout(), config_.channel_layout()); |
| EXPECT_NE(new_config.samples_per_second(), config_.samples_per_second()); |
| - demuxer_->set_audio_decoder_config(new_config); |
| - EXPECT_CALL(*decryptor_, DeinitializeDecoder(Decryptor::kAudio)); |
| - EXPECT_CALL(*decryptor_, InitializeAudioDecoder(_, _)) |
| - .WillOnce(RunCallback<1>(true)); |
| - EXPECT_CALL(*demuxer_, Read(_)) |
| - .WillOnce(RunCallback<0>(DemuxerStream::kConfigChanged, |
| - scoped_refptr<DecoderBuffer>())) |
| - .WillRepeatedly(ReturnBuffer(encrypted_buffer_)); |
| - EXPECT_CALL(*decryptor_, DecryptAndDecodeAudio(_, _)) |
| - .WillRepeatedly(RunCallback<1>(Decryptor::kSuccess, decoded_frame_list_)); |
| - EXPECT_CALL(statistics_cb_, OnStatistics(_)); |
| - |
| - ReadAndExpectFrameReadyWith(AudioDecoder::kOk, decoded_frame_); |
| + ReinitializeConfigChange(new_config); |
| + message_loop_.RunUntilIdle(); |
| EXPECT_EQ(new_config.bits_per_channel(), decoder_->bits_per_channel()); |
| EXPECT_EQ(new_config.channel_layout(), decoder_->channel_layout()); |
| EXPECT_EQ(new_config.samples_per_second(), decoder_->samples_per_second()); |
| } |
| -// Test config change failure. |
| -TEST_F(DecryptingAudioDecoderTest, DemuxerRead_ConfigChangeFailed) { |
| - Initialize(); |
| - |
| - EXPECT_CALL(*decryptor_, DeinitializeDecoder(Decryptor::kAudio)); |
| - EXPECT_CALL(*decryptor_, InitializeAudioDecoder(_, _)) |
| - .WillOnce(RunCallback<1>(false)); |
| - EXPECT_CALL(*demuxer_, Read(_)) |
| - .WillOnce(RunCallback<0>(DemuxerStream::kConfigChanged, |
| - scoped_refptr<DecoderBuffer>())) |
| - .WillRepeatedly(ReturnBuffer(encrypted_buffer_)); |
| - |
| - ReadAndExpectFrameReadyWith(AudioDecoder::kDecodeError, NULL); |
| -} |
| - |
| // Test the case where the a key is added when the decryptor is in |
| // kWaitingForKey state. |
| TEST_F(DecryptingAudioDecoderTest, KeyAdded_DuringWaitingForKey) { |
| @@ -445,7 +427,6 @@ TEST_F(DecryptingAudioDecoderTest, KeyAdded_DuringWaitingForKey) { |
| EXPECT_CALL(*decryptor_, DecryptAndDecodeAudio(_, _)) |
| .WillRepeatedly(RunCallback<1>(Decryptor::kSuccess, decoded_frame_list_)); |
| - EXPECT_CALL(statistics_cb_, OnStatistics(_)); |
| EXPECT_CALL(*this, FrameReady(AudioDecoder::kOk, decoded_frame_)); |
| key_added_cb_.Run(); |
| message_loop_.RunUntilIdle(); |
| @@ -459,7 +440,6 @@ TEST_F(DecryptingAudioDecoderTest, KeyAdded_DruingPendingDecode) { |
| EXPECT_CALL(*decryptor_, DecryptAndDecodeAudio(_, _)) |
| .WillRepeatedly(RunCallback<1>(Decryptor::kSuccess, decoded_frame_list_)); |
| - EXPECT_CALL(statistics_cb_, OnStatistics(_)); |
| EXPECT_CALL(*this, FrameReady(AudioDecoder::kOk, decoded_frame_)); |
| // The audio decode callback is returned after the correct decryption key is |
| // added. |
| @@ -484,112 +464,6 @@ TEST_F(DecryptingAudioDecoderTest, Reset_DuringIdleAfterDecodedOneFrame) { |
| Reset(); |
| } |
| -// Test resetting when the decoder is in kPendingDemuxerRead state and the read |
| -// callback is returned with kOk. |
| -TEST_F(DecryptingAudioDecoderTest, Reset_DuringDemuxerRead_Ok) { |
| - Initialize(); |
| - EnterPendingReadState(); |
| - |
| - EXPECT_CALL(*this, FrameReady(AudioDecoder::kAborted, IsNull())); |
| - |
| - Reset(); |
| - base::ResetAndReturn(&pending_demuxer_read_cb_).Run(DemuxerStream::kOk, |
| - encrypted_buffer_); |
| - message_loop_.RunUntilIdle(); |
| -} |
| - |
| -// Test resetting when the decoder is in kPendingDemuxerRead state and the read |
| -// callback is returned with kAborted. |
| -TEST_F(DecryptingAudioDecoderTest, Reset_DuringDemuxerRead_Aborted) { |
| - Initialize(); |
| - EnterPendingReadState(); |
| - |
| - // Make sure we get a NULL audio frame returned. |
| - EXPECT_CALL(*this, FrameReady(AudioDecoder::kAborted, IsNull())); |
| - |
| - Reset(); |
| - base::ResetAndReturn(&pending_demuxer_read_cb_).Run(DemuxerStream::kAborted, |
| - NULL); |
| - message_loop_.RunUntilIdle(); |
| -} |
| - |
| -// Test resetting when the decoder is in kPendingDemuxerRead state and the read |
| -// callback is returned with kConfigChanged. |
| -TEST_F(DecryptingAudioDecoderTest, Reset_DuringDemuxerRead_ConfigChange) { |
| - Initialize(); |
| - EnterPendingReadState(); |
| - |
| - Reset(); |
| - |
| - // The new config is different from the initial config in bits-per-channel, |
| - // channel layout and samples_per_second. |
| - AudioDecoderConfig new_config(kCodecVorbis, kSampleFormatPlanarS16, |
| - CHANNEL_LAYOUT_5_1, 88200, NULL, 0, false); |
| - EXPECT_NE(new_config.bits_per_channel(), config_.bits_per_channel()); |
| - EXPECT_NE(new_config.channel_layout(), config_.channel_layout()); |
| - EXPECT_NE(new_config.samples_per_second(), config_.samples_per_second()); |
| - |
| - // Even during pending reset, the decoder still needs to be initialized with |
| - // the new config. |
| - demuxer_->set_audio_decoder_config(new_config); |
| - EXPECT_CALL(*decryptor_, DeinitializeDecoder(Decryptor::kAudio)); |
| - EXPECT_CALL(*decryptor_, InitializeAudioDecoder(_, _)) |
| - .WillOnce(RunCallback<1>(true)); |
| - EXPECT_CALL(*this, FrameReady(AudioDecoder::kAborted, IsNull())); |
| - |
| - base::ResetAndReturn(&pending_demuxer_read_cb_) |
| - .Run(DemuxerStream::kConfigChanged, NULL); |
| - message_loop_.RunUntilIdle(); |
| - |
| - EXPECT_EQ(new_config.bits_per_channel(), decoder_->bits_per_channel()); |
| - EXPECT_EQ(new_config.channel_layout(), decoder_->channel_layout()); |
| - EXPECT_EQ(new_config.samples_per_second(), decoder_->samples_per_second()); |
| -} |
| - |
| -// Test resetting when the decoder is in kPendingDemuxerRead state, the read |
| -// callback is returned with kConfigChanged and the config change fails. |
| -TEST_F(DecryptingAudioDecoderTest, Reset_DuringDemuxerRead_ConfigChangeFailed) { |
| - Initialize(); |
| - EnterPendingReadState(); |
| - |
| - Reset(); |
| - |
| - // Even during pending reset, the decoder still needs to be initialized with |
| - // the new config. |
| - EXPECT_CALL(*decryptor_, DeinitializeDecoder(Decryptor::kAudio)); |
| - EXPECT_CALL(*decryptor_, InitializeAudioDecoder(_, _)) |
| - .WillOnce(RunCallback<1>(false)); |
| - EXPECT_CALL(*this, FrameReady(AudioDecoder::kDecodeError, IsNull())); |
| - |
| - base::ResetAndReturn(&pending_demuxer_read_cb_) |
| - .Run(DemuxerStream::kConfigChanged, NULL); |
| - message_loop_.RunUntilIdle(); |
| -} |
| - |
| -// Test resetting when the decoder is in kPendingConfigChange state. |
| -TEST_F(DecryptingAudioDecoderTest, Reset_DuringPendingConfigChange) { |
| - Initialize(); |
| - EnterNormalDecodingState(); |
| - |
| - EXPECT_CALL(*demuxer_, Read(_)) |
| - .WillOnce(RunCallback<0>(DemuxerStream::kConfigChanged, |
| - scoped_refptr<DecoderBuffer>())); |
| - EXPECT_CALL(*decryptor_, DeinitializeDecoder(Decryptor::kAudio)); |
| - EXPECT_CALL(*decryptor_, InitializeAudioDecoder(_, _)) |
| - .WillOnce(SaveArg<1>(&pending_init_cb_)); |
| - |
| - decoder_->Read(base::Bind(&DecryptingAudioDecoderTest::FrameReady, |
| - base::Unretained(this))); |
| - message_loop_.RunUntilIdle(); |
| - EXPECT_FALSE(pending_init_cb_.is_null()); |
| - |
| - EXPECT_CALL(*this, FrameReady(AudioDecoder::kAborted, IsNull())); |
| - |
| - Reset(); |
| - base::ResetAndReturn(&pending_init_cb_).Run(true); |
| - message_loop_.RunUntilIdle(); |
| -} |
| - |
| // Test resetting when the decoder is in kPendingDecode state. |
| TEST_F(DecryptingAudioDecoderTest, Reset_DuringPendingDecode) { |
| Initialize(); |