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..447f538379bb7e1d08dc7e1c179929bc01ff7de0 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,11 @@ 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( |
+ CreateFakeEncryptedBuffer(), AudioDecoder::kNotEnoughData, buffer); |
} |
MATCHER(IsEndOfStream, "end of stream") { |
@@ -76,14 +79,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 +102,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 +126,46 @@ 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( |
+ scoped_refptr<DecoderBuffer> input, |
AudioDecoder::Status status, |
const scoped_refptr<AudioBuffer>& audio_frame) { |
- if (status != AudioDecoder::kOk) |
+ |
+ const scoped_refptr<AudioBuffer>& buffer = decoder_->GetDecodeOutput(); |
+ |
+ if (buffer) { |
+ 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(input, |
+ base::Bind(&DecryptingAudioDecoderTest::FrameReady, |
+ base::Unretained(this))); |
message_loop_.RunUntilIdle(); |
} |
@@ -146,61 +174,46 @@ class DecryptingAudioDecoderTest : public testing::Test { |
void EnterNormalDecodingState() { |
Decryptor::AudioBuffers end_of_stream_frames_(1, end_of_stream_frame_); |
- EXPECT_CALL(*demuxer_, Read(_)) |
- .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_); |
+ ReadAndExpectFrameReadyWith( |
+ encrypted_buffer_, AudioDecoder::kOk, decoded_frame_); |
} |
// Sets up expectations and actions to put DecryptingAudioDecoder in an end |
// of stream state. This function must be called after |
// EnterNormalDecodingState() to work. |
void EnterEndOfStreamState() { |
- 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()); |
+ ReadAndExpectFrameReadyWith(DecoderBuffer::CreateEOSBuffer(), |
+ AudioDecoder::kOk, |
+ end_of_stream_frame_); |
} |
// 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(_)) |
- .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(encrypted_buffer_, |
+ 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(_)) |
- .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(encrypted_buffer_, |
+ base::Bind(&DecryptingAudioDecoderTest::FrameReady, |
+ base::Unretained(this))); |
message_loop_.RunUntilIdle(); |
} |
@@ -247,16 +260,13 @@ class DecryptingAudioDecoderTest : public testing::Test { |
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,13 +328,12 @@ TEST_F(DecryptingAudioDecoderTest, DecryptAndDecode_Normal) { |
TEST_F(DecryptingAudioDecoderTest, DecryptAndDecode_DecodeError) { |
Initialize(); |
- EXPECT_CALL(*demuxer_, Read(_)) |
- .WillRepeatedly(ReturnBuffer(encrypted_buffer_)); |
EXPECT_CALL(*decryptor_, DecryptAndDecodeAudio(_, _)) |
.WillRepeatedly(RunCallback<1>(Decryptor::kError, |
Decryptor::AudioBuffers())); |
- ReadAndExpectFrameReadyWith(AudioDecoder::kDecodeError, NULL); |
+ ReadAndExpectFrameReadyWith( |
+ encrypted_buffer_, AudioDecoder::kDecodeError, NULL); |
} |
// Test the case where the decryptor returns kNeedMoreData to ask for more |
@@ -332,17 +341,16 @@ TEST_F(DecryptingAudioDecoderTest, DecryptAndDecode_DecodeError) { |
TEST_F(DecryptingAudioDecoderTest, DecryptAndDecode_NeedMoreData) { |
Initialize(); |
- EXPECT_CALL(*demuxer_, Read(_)) |
- .Times(2) |
- .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( |
+ encrypted_buffer_, AudioDecoder::kNotEnoughData, decoded_frame_); |
} |
// Test the case where the decryptor returns multiple decoded frames. |
@@ -362,15 +370,13 @@ 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(*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); |
- ReadAndExpectFrameReadyWith(AudioDecoder::kOk, frame_b); |
+ ReadAndExpectFrameReadyWith( |
+ encrypted_buffer_, AudioDecoder::kOk, decoded_frame_); |
+ ReadAndExpectFrameReadyWith(encrypted_buffer_, AudioDecoder::kOk, frame_a); |
+ ReadAndExpectFrameReadyWith(encrypted_buffer_, AudioDecoder::kOk, frame_b); |
} |
// Test the case where the decryptor receives end-of-stream buffer. |
@@ -380,63 +386,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 +418,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 +431,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 +455,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(); |