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 <string> | 5 #include <string> |
6 #include <vector> | 6 #include <vector> |
7 | 7 |
8 #include "base/bind.h" | 8 #include "base/bind.h" |
9 #include "base/callback_helpers.h" | 9 #include "base/callback_helpers.h" |
10 #include "base/message_loop.h" | 10 #include "base/message_loop.h" |
11 #include "media/base/buffers.h" | 11 #include "media/base/buffers.h" |
12 #include "media/base/data_buffer.h" | 12 #include "media/base/data_buffer.h" |
13 #include "media/base/decoder_buffer.h" | 13 #include "media/base/decoder_buffer.h" |
14 #include "media/base/decrypt_config.h" | 14 #include "media/base/decrypt_config.h" |
15 #include "media/base/gmock_callback_support.h" | 15 #include "media/base/gmock_callback_support.h" |
16 #include "media/base/mock_callback.h" | 16 #include "media/base/mock_callback.h" |
17 #include "media/base/mock_filters.h" | 17 #include "media/base/mock_filters.h" |
18 #include "media/filters/decrypting_audio_decoder.h" | 18 #include "media/filters/decrypting_audio_decoder.h" |
19 #include "media/filters/ffmpeg_decoder_unittest.h" | 19 #include "media/filters/ffmpeg_decoder_unittest.h" |
20 #include "testing/gmock/include/gmock/gmock.h" | 20 #include "testing/gmock/include/gmock/gmock.h" |
21 | 21 |
22 using ::testing::_; | 22 using ::testing::_; |
23 using ::testing::AtMost; | 23 using ::testing::AtMost; |
24 using ::testing::Invoke; | |
25 using ::testing::IsNull; | 24 using ::testing::IsNull; |
26 using ::testing::ReturnRef; | 25 using ::testing::ReturnRef; |
27 using ::testing::SaveArg; | 26 using ::testing::SaveArg; |
28 using ::testing::StrictMock; | 27 using ::testing::StrictMock; |
29 | 28 |
30 namespace media { | 29 namespace media { |
31 | 30 |
32 static const int kFakeAudioFrameSize = 16; | 31 static const int kFakeAudioFrameSize = 16; |
33 static const uint8 kFakeKeyId[] = { 0x4b, 0x65, 0x79, 0x20, 0x49, 0x44 }; | 32 static const uint8 kFakeKeyId[] = { 0x4b, 0x65, 0x79, 0x20, 0x49, 0x44 }; |
34 static const uint8 kFakeIv[DecryptConfig::kDecryptionKeySize] = { 0 }; | 33 static const uint8 kFakeIv[DecryptConfig::kDecryptionKeySize] = { 0 }; |
(...skipping 30 matching lines...) Expand all Loading... |
65 | 64 |
66 MATCHER(IsEndOfStream, "end of stream") { | 65 MATCHER(IsEndOfStream, "end of stream") { |
67 return (arg->IsEndOfStream()); | 66 return (arg->IsEndOfStream()); |
68 } | 67 } |
69 | 68 |
70 } // namespace | 69 } // namespace |
71 | 70 |
72 class DecryptingAudioDecoderTest : public testing::Test { | 71 class DecryptingAudioDecoderTest : public testing::Test { |
73 public: | 72 public: |
74 DecryptingAudioDecoderTest() | 73 DecryptingAudioDecoderTest() |
75 : decoder_(new StrictMock<DecryptingAudioDecoder>( | 74 : decoder_(new DecryptingAudioDecoder( |
76 base::Bind(&Identity<scoped_refptr<base::MessageLoopProxy> >, | 75 base::Bind(&Identity<scoped_refptr<base::MessageLoopProxy> >, |
77 message_loop_.message_loop_proxy()), | 76 message_loop_.message_loop_proxy()), |
78 base::Bind( | 77 base::Bind( |
79 &DecryptingAudioDecoderTest::RequestDecryptorNotification, | 78 &DecryptingAudioDecoderTest::RequestDecryptorNotification, |
80 base::Unretained(this)))), | 79 base::Unretained(this)))), |
81 decryptor_(new StrictMock<MockDecryptor>()), | 80 decryptor_(new StrictMock<MockDecryptor>()), |
82 demuxer_(new StrictMock<MockDemuxerStream>()), | 81 demuxer_(new StrictMock<MockDemuxerStream>()), |
83 encrypted_buffer_(CreateFakeEncryptedBuffer()), | 82 encrypted_buffer_(CreateFakeEncryptedBuffer()), |
84 decoded_frame_(NULL), | 83 decoded_frame_(NULL), |
85 end_of_stream_frame_(new DataBuffer(0)), | 84 end_of_stream_frame_(new DataBuffer(0)), |
86 decoded_frame_list_() { | 85 decoded_frame_list_() { |
87 // TODO(xhwang): Fix this after DataBuffer(data, size) is public. | 86 scoped_refptr<DataBuffer> data_buffer = new DataBuffer(kFakeAudioFrameSize); |
88 scoped_refptr<DataBuffer> buffer = new DataBuffer(kFakeAudioFrameSize); | 87 data_buffer->SetDataSize(kFakeAudioFrameSize); |
89 buffer->SetDataSize(kFakeAudioFrameSize); | 88 // |decoded_frame_| contains random data. |
90 decoded_frame_ = buffer; | 89 decoded_frame_ = data_buffer; |
91 decoded_frame_list_.push_back(decoded_frame_); | 90 decoded_frame_list_.push_back(decoded_frame_); |
92 } | 91 } |
93 | 92 |
94 void InitializeAndExpectStatus(const AudioDecoderConfig& config, | 93 void InitializeAndExpectStatus(const AudioDecoderConfig& config, |
95 PipelineStatus status) { | 94 PipelineStatus status) { |
96 EXPECT_CALL(*demuxer_, audio_decoder_config()) | 95 EXPECT_CALL(*demuxer_, audio_decoder_config()) |
97 .WillRepeatedly(ReturnRef(config)); | 96 .WillRepeatedly(ReturnRef(config)); |
98 | 97 |
99 decoder_->Initialize(demuxer_, NewExpectedStatusCB(status), | 98 decoder_->Initialize(demuxer_, NewExpectedStatusCB(status), |
100 base::Bind(&MockStatisticsCB::OnStatistics, | 99 base::Bind(&MockStatisticsCB::OnStatistics, |
101 base::Unretained(&statistics_cb_))); | 100 base::Unretained(&statistics_cb_))); |
102 message_loop_.RunAllPending(); | 101 message_loop_.RunUntilIdle(); |
103 } | 102 } |
104 | 103 |
105 void Initialize() { | 104 void Initialize() { |
106 EXPECT_CALL(*decryptor_, InitializeAudioDecoderMock(_, _)) | 105 EXPECT_CALL(*decryptor_, InitializeAudioDecoderMock(_, _)) |
107 .Times(AtMost(1)) | 106 .Times(AtMost(1)) |
108 .WillOnce(RunCallback<1>(true)); | 107 .WillOnce(RunCallback<1>(true)); |
109 EXPECT_CALL(*this, RequestDecryptorNotification(_)) | 108 EXPECT_CALL(*this, RequestDecryptorNotification(_)) |
110 .WillOnce(RunCallbackIfNotNull(decryptor_.get())); | 109 .WillOnce(RunCallbackIfNotNull(decryptor_.get())); |
111 EXPECT_CALL(*decryptor_, RegisterKeyAddedCB(Decryptor::kAudio, _)) | 110 EXPECT_CALL(*decryptor_, RegisterKeyAddedCB(Decryptor::kAudio, _)) |
112 .WillOnce(SaveArg<1>(&key_added_cb_)); | 111 .WillOnce(SaveArg<1>(&key_added_cb_)); |
113 | 112 |
114 config_.Initialize(kCodecVorbis, 16, CHANNEL_LAYOUT_STEREO, 44100, | 113 AudioDecoderConfig config(kCodecVorbis, 16, CHANNEL_LAYOUT_STEREO, 44100, |
115 NULL, 0, true, true); | 114 NULL, 0, true); |
| 115 InitializeAndExpectStatus(config, PIPELINE_OK); |
116 | 116 |
117 InitializeAndExpectStatus(config_, PIPELINE_OK); | |
118 EXPECT_EQ(16, decoder_->bits_per_channel()); | 117 EXPECT_EQ(16, decoder_->bits_per_channel()); |
119 EXPECT_EQ(CHANNEL_LAYOUT_STEREO, decoder_->channel_layout()); | 118 EXPECT_EQ(CHANNEL_LAYOUT_STEREO, decoder_->channel_layout()); |
120 EXPECT_EQ(44100, decoder_->samples_per_second()); | 119 EXPECT_EQ(44100, decoder_->samples_per_second()); |
121 } | 120 } |
122 | 121 |
123 void ReadAndExpectFrameReadyWith( | 122 void ReadAndExpectFrameReadyWith( |
124 AudioDecoder::Status status, | 123 AudioDecoder::Status status, |
125 const scoped_refptr<Buffer>& audio_frame) { | 124 const scoped_refptr<Buffer>& audio_frame) { |
126 if (status != AudioDecoder::kOk) | 125 if (status != AudioDecoder::kOk) |
127 EXPECT_CALL(*this, FrameReady(status, IsNull())); | 126 EXPECT_CALL(*this, FrameReady(status, IsNull())); |
128 else if (audio_frame->IsEndOfStream()) | 127 else if (audio_frame->IsEndOfStream()) |
129 EXPECT_CALL(*this, FrameReady(status, IsEndOfStream())); | 128 EXPECT_CALL(*this, FrameReady(status, IsEndOfStream())); |
130 else | 129 else |
131 EXPECT_CALL(*this, FrameReady(status, audio_frame)); | 130 EXPECT_CALL(*this, FrameReady(status, audio_frame)); |
132 | 131 |
133 decoder_->Read(base::Bind(&DecryptingAudioDecoderTest::FrameReady, | 132 decoder_->Read(base::Bind(&DecryptingAudioDecoderTest::FrameReady, |
134 base::Unretained(this))); | 133 base::Unretained(this))); |
135 message_loop_.RunAllPending(); | 134 message_loop_.RunUntilIdle(); |
136 } | 135 } |
137 | 136 |
138 // Sets up expectations and actions to put DecryptingAudioDecoder in an | 137 // Sets up expectations and actions to put DecryptingAudioDecoder in an |
139 // active normal decoding state. | 138 // active normal decoding state. |
140 void EnterNormalDecodingState() { | 139 void EnterNormalDecodingState() { |
141 Decryptor::AudioBuffers end_of_stream_frames_(1, end_of_stream_frame_); | 140 Decryptor::AudioBuffers end_of_stream_frames_(1, end_of_stream_frame_); |
142 | 141 |
143 EXPECT_CALL(*demuxer_, Read(_)) | 142 EXPECT_CALL(*demuxer_, Read(_)) |
144 .WillOnce(ReturnBuffer(encrypted_buffer_)) | 143 .WillOnce(ReturnBuffer(encrypted_buffer_)) |
145 .WillRepeatedly(ReturnBuffer(DecoderBuffer::CreateEOSBuffer())); | 144 .WillRepeatedly(ReturnBuffer(DecoderBuffer::CreateEOSBuffer())); |
(...skipping 13 matching lines...) Expand all Loading... |
159 ReadAndExpectFrameReadyWith(AudioDecoder::kOk, end_of_stream_frame_); | 158 ReadAndExpectFrameReadyWith(AudioDecoder::kOk, end_of_stream_frame_); |
160 } | 159 } |
161 | 160 |
162 // Make the read callback pending by saving and not firing it. | 161 // Make the read callback pending by saving and not firing it. |
163 void EnterPendingReadState() { | 162 void EnterPendingReadState() { |
164 EXPECT_TRUE(pending_demuxer_read_cb_.is_null()); | 163 EXPECT_TRUE(pending_demuxer_read_cb_.is_null()); |
165 EXPECT_CALL(*demuxer_, Read(_)) | 164 EXPECT_CALL(*demuxer_, Read(_)) |
166 .WillOnce(SaveArg<0>(&pending_demuxer_read_cb_)); | 165 .WillOnce(SaveArg<0>(&pending_demuxer_read_cb_)); |
167 decoder_->Read(base::Bind(&DecryptingAudioDecoderTest::FrameReady, | 166 decoder_->Read(base::Bind(&DecryptingAudioDecoderTest::FrameReady, |
168 base::Unretained(this))); | 167 base::Unretained(this))); |
169 message_loop_.RunAllPending(); | 168 message_loop_.RunUntilIdle(); |
170 // Make sure the Read() on the decoder triggers a Read() on the demuxer. | 169 // Make sure the Read() on the decoder triggers a Read() on the demuxer. |
171 EXPECT_FALSE(pending_demuxer_read_cb_.is_null()); | 170 EXPECT_FALSE(pending_demuxer_read_cb_.is_null()); |
172 } | 171 } |
173 | 172 |
174 // Make the audio decode callback pending by saving and not firing it. | 173 // Make the audio decode callback pending by saving and not firing it. |
175 void EnterPendingDecodeState() { | 174 void EnterPendingDecodeState() { |
176 EXPECT_TRUE(pending_audio_decode_cb_.is_null()); | 175 EXPECT_TRUE(pending_audio_decode_cb_.is_null()); |
177 EXPECT_CALL(*demuxer_, Read(_)) | 176 EXPECT_CALL(*demuxer_, Read(_)) |
178 .WillRepeatedly(ReturnBuffer(encrypted_buffer_)); | 177 .WillRepeatedly(ReturnBuffer(encrypted_buffer_)); |
179 EXPECT_CALL(*decryptor_, DecryptAndDecodeAudio(encrypted_buffer_, _)) | 178 EXPECT_CALL(*decryptor_, DecryptAndDecodeAudio(encrypted_buffer_, _)) |
180 .WillOnce(SaveArg<1>(&pending_audio_decode_cb_)); | 179 .WillOnce(SaveArg<1>(&pending_audio_decode_cb_)); |
181 | 180 |
182 decoder_->Read(base::Bind(&DecryptingAudioDecoderTest::FrameReady, | 181 decoder_->Read(base::Bind(&DecryptingAudioDecoderTest::FrameReady, |
183 base::Unretained(this))); | 182 base::Unretained(this))); |
184 message_loop_.RunAllPending(); | 183 message_loop_.RunUntilIdle(); |
185 // Make sure the Read() on the decoder triggers a DecryptAndDecode() on the | 184 // Make sure the Read() on the decoder triggers a DecryptAndDecode() on the |
186 // decryptor. | 185 // decryptor. |
187 EXPECT_FALSE(pending_audio_decode_cb_.is_null()); | 186 EXPECT_FALSE(pending_audio_decode_cb_.is_null()); |
188 } | 187 } |
189 | 188 |
190 void EnterWaitingForKeyState() { | 189 void EnterWaitingForKeyState() { |
191 EXPECT_CALL(*demuxer_, Read(_)) | 190 EXPECT_CALL(*demuxer_, Read(_)) |
192 .WillRepeatedly(ReturnBuffer(encrypted_buffer_)); | 191 .WillRepeatedly(ReturnBuffer(encrypted_buffer_)); |
193 EXPECT_CALL(*decryptor_, DecryptAndDecodeAudio(_, _)) | 192 EXPECT_CALL(*decryptor_, DecryptAndDecodeAudio(encrypted_buffer_, _)) |
194 .WillRepeatedly(RunCallback<1>(Decryptor::kNoKey, | 193 .WillRepeatedly(RunCallback<1>(Decryptor::kNoKey, |
195 Decryptor::AudioBuffers())); | 194 Decryptor::AudioBuffers())); |
196 decoder_->Read(base::Bind(&DecryptingAudioDecoderTest::FrameReady, | 195 decoder_->Read(base::Bind(&DecryptingAudioDecoderTest::FrameReady, |
197 base::Unretained(this))); | 196 base::Unretained(this))); |
198 message_loop_.RunAllPending(); | 197 message_loop_.RunUntilIdle(); |
199 } | 198 } |
200 | 199 |
201 void AbortPendingAudioDecodeCB() { | 200 void AbortPendingAudioDecodeCB() { |
202 if (!pending_audio_decode_cb_.is_null()) { | 201 if (!pending_audio_decode_cb_.is_null()) { |
203 base::ResetAndReturn(&pending_audio_decode_cb_).Run( | 202 base::ResetAndReturn(&pending_audio_decode_cb_).Run( |
204 Decryptor::kSuccess, Decryptor::AudioBuffers()); | 203 Decryptor::kSuccess, Decryptor::AudioBuffers()); |
205 } | 204 } |
206 } | 205 } |
207 | 206 |
208 void Reset() { | 207 void Reset() { |
209 EXPECT_CALL(*decryptor_, ResetDecoder(Decryptor::kAudio)) | 208 EXPECT_CALL(*decryptor_, ResetDecoder(Decryptor::kAudio)) |
210 .WillRepeatedly(InvokeWithoutArgs( | 209 .WillRepeatedly(InvokeWithoutArgs( |
211 this, &DecryptingAudioDecoderTest::AbortPendingAudioDecodeCB)); | 210 this, &DecryptingAudioDecoderTest::AbortPendingAudioDecodeCB)); |
212 | 211 |
213 decoder_->Reset(NewExpectedClosure()); | 212 decoder_->Reset(NewExpectedClosure()); |
214 message_loop_.RunAllPending(); | 213 message_loop_.RunUntilIdle(); |
215 } | 214 } |
216 | 215 |
217 MOCK_METHOD1(RequestDecryptorNotification, | 216 MOCK_METHOD1(RequestDecryptorNotification, |
218 void(const DecryptingAudioDecoder::DecryptorNotificationCB&)); | 217 void(const DecryptingAudioDecoder::DecryptorNotificationCB&)); |
219 | 218 |
220 MOCK_METHOD2(FrameReady, void(AudioDecoder::Status, | 219 MOCK_METHOD2(FrameReady, void(AudioDecoder::Status, |
221 const scoped_refptr<Buffer>&)); | 220 const scoped_refptr<Buffer>&)); |
222 | 221 |
223 MessageLoop message_loop_; | 222 MessageLoop message_loop_; |
224 scoped_refptr<StrictMock<DecryptingAudioDecoder> > decoder_; | 223 scoped_refptr<DecryptingAudioDecoder> decoder_; |
225 scoped_ptr<StrictMock<MockDecryptor> > decryptor_; | 224 scoped_ptr<StrictMock<MockDecryptor> > decryptor_; |
226 scoped_refptr<StrictMock<MockDemuxerStream> > demuxer_; | 225 scoped_refptr<StrictMock<MockDemuxerStream> > demuxer_; |
227 MockStatisticsCB statistics_cb_; | 226 MockStatisticsCB statistics_cb_; |
228 AudioDecoderConfig config_; | |
229 | 227 |
230 DemuxerStream::ReadCB pending_demuxer_read_cb_; | 228 DemuxerStream::ReadCB pending_demuxer_read_cb_; |
231 Decryptor::DecoderInitCB pending_init_cb_; | 229 Decryptor::DecoderInitCB pending_init_cb_; |
232 Decryptor::KeyAddedCB key_added_cb_; | 230 Decryptor::KeyAddedCB key_added_cb_; |
233 Decryptor::AudioDecodeCB pending_audio_decode_cb_; | 231 Decryptor::AudioDecodeCB pending_audio_decode_cb_; |
234 | 232 |
235 // Constant buffer/frames to be returned by the |demuxer_| and |decryptor_|. | 233 // Constant buffer/frames to be returned by the |demuxer_| and |decryptor_|. |
236 scoped_refptr<DecoderBuffer> encrypted_buffer_; | 234 scoped_refptr<DecoderBuffer> encrypted_buffer_; |
237 scoped_refptr<Buffer> decoded_frame_; | 235 scoped_refptr<Buffer> decoded_frame_; |
238 scoped_refptr<Buffer> end_of_stream_frame_; | 236 scoped_refptr<Buffer> end_of_stream_frame_; |
(...skipping 106 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
345 // kWaitingForKey state. | 343 // kWaitingForKey state. |
346 TEST_F(DecryptingAudioDecoderTest, KeyAdded_DuringWaitingForKey) { | 344 TEST_F(DecryptingAudioDecoderTest, KeyAdded_DuringWaitingForKey) { |
347 Initialize(); | 345 Initialize(); |
348 EnterWaitingForKeyState(); | 346 EnterWaitingForKeyState(); |
349 | 347 |
350 EXPECT_CALL(*decryptor_, DecryptAndDecodeAudio(_, _)) | 348 EXPECT_CALL(*decryptor_, DecryptAndDecodeAudio(_, _)) |
351 .WillRepeatedly(RunCallback<1>(Decryptor::kSuccess, decoded_frame_list_)); | 349 .WillRepeatedly(RunCallback<1>(Decryptor::kSuccess, decoded_frame_list_)); |
352 EXPECT_CALL(statistics_cb_, OnStatistics(_)); | 350 EXPECT_CALL(statistics_cb_, OnStatistics(_)); |
353 EXPECT_CALL(*this, FrameReady(AudioDecoder::kOk, decoded_frame_)); | 351 EXPECT_CALL(*this, FrameReady(AudioDecoder::kOk, decoded_frame_)); |
354 key_added_cb_.Run(); | 352 key_added_cb_.Run(); |
355 message_loop_.RunAllPending(); | 353 message_loop_.RunUntilIdle(); |
356 } | 354 } |
357 | 355 |
358 // Test the case where the a key is added when the decryptor is in | 356 // Test the case where the a key is added when the decryptor is in |
359 // kPendingDecode state. | 357 // kPendingDecode state. |
360 TEST_F(DecryptingAudioDecoderTest, KeyAdded_DruingPendingDecode) { | 358 TEST_F(DecryptingAudioDecoderTest, KeyAdded_DruingPendingDecode) { |
361 Initialize(); | 359 Initialize(); |
362 EnterPendingDecodeState(); | 360 EnterPendingDecodeState(); |
363 | 361 |
364 EXPECT_CALL(*decryptor_, DecryptAndDecodeAudio(_, _)) | 362 EXPECT_CALL(*decryptor_, DecryptAndDecodeAudio(_, _)) |
365 .WillRepeatedly(RunCallback<1>(Decryptor::kSuccess, decoded_frame_list_)); | 363 .WillRepeatedly(RunCallback<1>(Decryptor::kSuccess, decoded_frame_list_)); |
366 EXPECT_CALL(statistics_cb_, OnStatistics(_)); | 364 EXPECT_CALL(statistics_cb_, OnStatistics(_)); |
367 EXPECT_CALL(*this, FrameReady(AudioDecoder::kOk, decoded_frame_)); | 365 EXPECT_CALL(*this, FrameReady(AudioDecoder::kOk, decoded_frame_)); |
368 // The audio decode callback is returned after the correct decryption key is | 366 // The audio decode callback is returned after the correct decryption key is |
369 // added. | 367 // added. |
370 key_added_cb_.Run(); | 368 key_added_cb_.Run(); |
371 base::ResetAndReturn(&pending_audio_decode_cb_).Run( | 369 base::ResetAndReturn(&pending_audio_decode_cb_).Run( |
372 Decryptor::kNoKey, Decryptor::AudioBuffers()); | 370 Decryptor::kNoKey, Decryptor::AudioBuffers()); |
373 message_loop_.RunAllPending(); | 371 message_loop_.RunUntilIdle(); |
374 } | 372 } |
375 | 373 |
376 // Test resetting when the decoder is in kIdle state but has not decoded any | 374 // Test resetting when the decoder is in kIdle state but has not decoded any |
377 // frame. | 375 // frame. |
378 TEST_F(DecryptingAudioDecoderTest, Reset_DuringIdleAfterInitialization) { | 376 TEST_F(DecryptingAudioDecoderTest, Reset_DuringIdleAfterInitialization) { |
379 Initialize(); | 377 Initialize(); |
380 Reset(); | 378 Reset(); |
381 } | 379 } |
382 | 380 |
383 // Test resetting when the decoder is in kIdle state after it has decoded one | 381 // Test resetting when the decoder is in kIdle state after it has decoded one |
384 // frame. | 382 // frame. |
385 TEST_F(DecryptingAudioDecoderTest, Reset_DuringIdleAfterDecodedOneFrame) { | 383 TEST_F(DecryptingAudioDecoderTest, Reset_DuringIdleAfterDecodedOneFrame) { |
386 Initialize(); | 384 Initialize(); |
387 EnterNormalDecodingState(); | 385 EnterNormalDecodingState(); |
388 Reset(); | 386 Reset(); |
389 } | 387 } |
390 | 388 |
391 // Test resetting when the decoder is in kPendingDemuxerRead state. | 389 // Test resetting when the decoder is in kPendingDemuxerRead state. |
392 TEST_F(DecryptingAudioDecoderTest, Reset_DuringPendingDemuxerRead) { | 390 TEST_F(DecryptingAudioDecoderTest, Reset_DuringPendingDemuxerRead) { |
393 Initialize(); | 391 Initialize(); |
394 EnterPendingReadState(); | 392 EnterPendingReadState(); |
395 | 393 |
396 EXPECT_CALL(*this, FrameReady(AudioDecoder::kAborted, IsNull())); | 394 EXPECT_CALL(*this, FrameReady(AudioDecoder::kAborted, IsNull())); |
397 | 395 |
398 Reset(); | 396 Reset(); |
399 base::ResetAndReturn(&pending_demuxer_read_cb_).Run(DemuxerStream::kOk, | 397 base::ResetAndReturn(&pending_demuxer_read_cb_).Run(DemuxerStream::kOk, |
400 encrypted_buffer_); | 398 encrypted_buffer_); |
401 message_loop_.RunAllPending(); | 399 message_loop_.RunUntilIdle(); |
402 } | 400 } |
403 | 401 |
404 // Test resetting when the decoder is in kPendingDecode state. | 402 // Test resetting when the decoder is in kPendingDecode state. |
405 TEST_F(DecryptingAudioDecoderTest, Reset_DuringPendingDecode) { | 403 TEST_F(DecryptingAudioDecoderTest, Reset_DuringPendingDecode) { |
406 Initialize(); | 404 Initialize(); |
407 EnterPendingDecodeState(); | 405 EnterPendingDecodeState(); |
408 | 406 |
409 EXPECT_CALL(*this, FrameReady(AudioDecoder::kAborted, IsNull())); | 407 EXPECT_CALL(*this, FrameReady(AudioDecoder::kAborted, IsNull())); |
410 | 408 |
411 Reset(); | 409 Reset(); |
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
453 TEST_F(DecryptingAudioDecoderTest, DemuxerRead_AbortedDuringReset) { | 451 TEST_F(DecryptingAudioDecoderTest, DemuxerRead_AbortedDuringReset) { |
454 Initialize(); | 452 Initialize(); |
455 EnterPendingReadState(); | 453 EnterPendingReadState(); |
456 | 454 |
457 // Make sure we get a NULL audio frame returned. | 455 // Make sure we get a NULL audio frame returned. |
458 EXPECT_CALL(*this, FrameReady(AudioDecoder::kAborted, IsNull())); | 456 EXPECT_CALL(*this, FrameReady(AudioDecoder::kAborted, IsNull())); |
459 | 457 |
460 Reset(); | 458 Reset(); |
461 base::ResetAndReturn(&pending_demuxer_read_cb_).Run(DemuxerStream::kAborted, | 459 base::ResetAndReturn(&pending_demuxer_read_cb_).Run(DemuxerStream::kAborted, |
462 NULL); | 460 NULL); |
463 message_loop_.RunAllPending(); | 461 message_loop_.RunUntilIdle(); |
464 } | 462 } |
465 | 463 |
466 // Test config change on the demuxer stream. | 464 // Test config change on the demuxer stream. |
467 TEST_F(DecryptingAudioDecoderTest, DemuxerRead_ConfigChanged) { | 465 TEST_F(DecryptingAudioDecoderTest, DemuxerRead_ConfigChanged) { |
468 Initialize(); | 466 Initialize(); |
469 | 467 |
470 EXPECT_CALL(*demuxer_, Read(_)) | 468 EXPECT_CALL(*demuxer_, Read(_)) |
471 .WillOnce(RunCallback<0>(DemuxerStream::kConfigChanged, | 469 .WillOnce(RunCallback<0>(DemuxerStream::kConfigChanged, |
472 scoped_refptr<DecoderBuffer>())); | 470 scoped_refptr<DecoderBuffer>())); |
473 | 471 |
474 // TODO(xhwang): Update this test when kConfigChanged is supported in | 472 // TODO(xhwang): Update this test when kConfigChanged is supported in |
475 // DecryptingAudioDecoder. | 473 // DecryptingAudioDecoder. |
476 ReadAndExpectFrameReadyWith(AudioDecoder::kDecodeError, NULL); | 474 ReadAndExpectFrameReadyWith(AudioDecoder::kDecodeError, NULL); |
477 } | 475 } |
478 | 476 |
479 } // namespace media | 477 } // namespace media |
OLD | NEW |