| 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/mock_callback.h" | 16 #include "media/base/mock_callback.h" |
| 16 #include "media/base/mock_filters.h" | 17 #include "media/base/mock_filters.h" |
| 17 #include "media/filters/decrypting_audio_decoder.h" | 18 #include "media/filters/decrypting_audio_decoder.h" |
| 18 #include "media/filters/ffmpeg_decoder_unittest.h" | 19 #include "media/filters/ffmpeg_decoder_unittest.h" |
| 19 #include "testing/gmock/include/gmock/gmock.h" | 20 #include "testing/gmock/include/gmock/gmock.h" |
| 20 | 21 |
| 21 using ::testing::_; | 22 using ::testing::_; |
| 22 using ::testing::AtMost; | 23 using ::testing::AtMost; |
| 23 using ::testing::Invoke; | 24 using ::testing::Invoke; |
| 24 using ::testing::IsNull; | 25 using ::testing::IsNull; |
| (...skipping 21 matching lines...) Expand all Loading... |
| 46 } | 47 } |
| 47 | 48 |
| 48 // Use anonymous namespace here to prevent the actions to be defined multiple | 49 // Use anonymous namespace here to prevent the actions to be defined multiple |
| 49 // times across multiple test files. Sadly we can't use static for them. | 50 // times across multiple test files. Sadly we can't use static for them. |
| 50 namespace { | 51 namespace { |
| 51 | 52 |
| 52 ACTION_P(ReturnBuffer, buffer) { | 53 ACTION_P(ReturnBuffer, buffer) { |
| 53 arg0.Run(buffer ? DemuxerStream::kOk : DemuxerStream::kAborted, buffer); | 54 arg0.Run(buffer ? DemuxerStream::kOk : DemuxerStream::kAborted, buffer); |
| 54 } | 55 } |
| 55 | 56 |
| 56 ACTION(ReturnConfigChanged) { | 57 ACTION_P(RunCallbackIfNotNull, param) { |
| 57 arg0.Run(DemuxerStream::kConfigChanged, scoped_refptr<DecoderBuffer>(NULL)); | |
| 58 } | |
| 59 | |
| 60 ACTION_P(RunCallback0, param) { | |
| 61 if (!arg0.is_null()) | 58 if (!arg0.is_null()) |
| 62 arg0.Run(param); | 59 arg0.Run(param); |
| 63 } | 60 } |
| 64 | 61 |
| 65 ACTION_P(RunCallback1, param) { | |
| 66 arg1.Run(param); | |
| 67 } | |
| 68 | |
| 69 ACTION_P2(RunCallback2, param1, param2) { | |
| 70 arg1.Run(param1, param2); | |
| 71 } | |
| 72 | |
| 73 ACTION_P2(ResetAndRunCallback, callback, param) { | 62 ACTION_P2(ResetAndRunCallback, callback, param) { |
| 74 base::ResetAndReturn(callback).Run(param); | 63 base::ResetAndReturn(callback).Run(param); |
| 75 } | 64 } |
| 76 | 65 |
| 77 MATCHER(IsNullCallback, "") { | 66 MATCHER(IsEndOfStream, "end of stream") { |
| 78 return (arg.is_null()); | |
| 79 } | |
| 80 | |
| 81 MATCHER(IsEndOfStream, "") { | |
| 82 return (arg->IsEndOfStream()); | 67 return (arg->IsEndOfStream()); |
| 83 } | 68 } |
| 84 | 69 |
| 85 } // namespace | 70 } // namespace |
| 86 | 71 |
| 87 class DecryptingAudioDecoderTest : public testing::Test { | 72 class DecryptingAudioDecoderTest : public testing::Test { |
| 88 public: | 73 public: |
| 89 DecryptingAudioDecoderTest() | 74 DecryptingAudioDecoderTest() |
| 90 : decoder_(new StrictMock<DecryptingAudioDecoder>( | 75 : decoder_(new StrictMock<DecryptingAudioDecoder>( |
| 91 base::Bind(&Identity<scoped_refptr<base::MessageLoopProxy> >, | 76 base::Bind(&Identity<scoped_refptr<base::MessageLoopProxy> >, |
| (...skipping 21 matching lines...) Expand all Loading... |
| 113 | 98 |
| 114 decoder_->Initialize(demuxer_, NewExpectedStatusCB(status), | 99 decoder_->Initialize(demuxer_, NewExpectedStatusCB(status), |
| 115 base::Bind(&MockStatisticsCB::OnStatistics, | 100 base::Bind(&MockStatisticsCB::OnStatistics, |
| 116 base::Unretained(&statistics_cb_))); | 101 base::Unretained(&statistics_cb_))); |
| 117 message_loop_.RunAllPending(); | 102 message_loop_.RunAllPending(); |
| 118 } | 103 } |
| 119 | 104 |
| 120 void Initialize() { | 105 void Initialize() { |
| 121 EXPECT_CALL(*decryptor_, InitializeAudioDecoderMock(_, _)) | 106 EXPECT_CALL(*decryptor_, InitializeAudioDecoderMock(_, _)) |
| 122 .Times(AtMost(1)) | 107 .Times(AtMost(1)) |
| 123 .WillOnce(RunCallback1(true)); | 108 .WillOnce(RunCallback<1>(true)); |
| 124 EXPECT_CALL(*this, RequestDecryptorNotification(_)) | 109 EXPECT_CALL(*this, RequestDecryptorNotification(_)) |
| 125 .WillOnce(RunCallback0(decryptor_.get())); | 110 .WillOnce(RunCallbackIfNotNull(decryptor_.get())); |
| 126 EXPECT_CALL(*decryptor_, RegisterKeyAddedCB(Decryptor::kAudio, _)) | 111 EXPECT_CALL(*decryptor_, RegisterKeyAddedCB(Decryptor::kAudio, _)) |
| 127 .WillOnce(SaveArg<1>(&key_added_cb_)); | 112 .WillOnce(SaveArg<1>(&key_added_cb_)); |
| 128 | 113 |
| 129 config_.Initialize(kCodecVorbis, 16, CHANNEL_LAYOUT_STEREO, 44100, | 114 config_.Initialize(kCodecVorbis, 16, CHANNEL_LAYOUT_STEREO, 44100, |
| 130 NULL, 0, true, true); | 115 NULL, 0, true, true); |
| 131 | 116 |
| 132 InitializeAndExpectStatus(config_, PIPELINE_OK); | 117 InitializeAndExpectStatus(config_, PIPELINE_OK); |
| 133 EXPECT_EQ(16, decoder_->bits_per_channel()); | 118 EXPECT_EQ(16, decoder_->bits_per_channel()); |
| 134 EXPECT_EQ(CHANNEL_LAYOUT_STEREO, decoder_->channel_layout()); | 119 EXPECT_EQ(CHANNEL_LAYOUT_STEREO, decoder_->channel_layout()); |
| 135 EXPECT_EQ(44100, decoder_->samples_per_second()); | 120 EXPECT_EQ(44100, decoder_->samples_per_second()); |
| (...skipping 16 matching lines...) Expand all Loading... |
| 152 | 137 |
| 153 // Sets up expectations and actions to put DecryptingAudioDecoder in an | 138 // Sets up expectations and actions to put DecryptingAudioDecoder in an |
| 154 // active normal decoding state. | 139 // active normal decoding state. |
| 155 void EnterNormalDecodingState() { | 140 void EnterNormalDecodingState() { |
| 156 Decryptor::AudioBuffers end_of_stream_frames_(1, end_of_stream_frame_); | 141 Decryptor::AudioBuffers end_of_stream_frames_(1, end_of_stream_frame_); |
| 157 | 142 |
| 158 EXPECT_CALL(*demuxer_, Read(_)) | 143 EXPECT_CALL(*demuxer_, Read(_)) |
| 159 .WillOnce(ReturnBuffer(encrypted_buffer_)) | 144 .WillOnce(ReturnBuffer(encrypted_buffer_)) |
| 160 .WillRepeatedly(ReturnBuffer(DecoderBuffer::CreateEOSBuffer())); | 145 .WillRepeatedly(ReturnBuffer(DecoderBuffer::CreateEOSBuffer())); |
| 161 EXPECT_CALL(*decryptor_, DecryptAndDecodeAudio(_, _)) | 146 EXPECT_CALL(*decryptor_, DecryptAndDecodeAudio(_, _)) |
| 162 .WillOnce(RunCallback2(Decryptor::kSuccess, | 147 .WillOnce(RunCallback<1>(Decryptor::kSuccess, decoded_frame_list_)) |
| 163 decoded_frame_list_)) | 148 .WillRepeatedly(RunCallback<1>(Decryptor::kNeedMoreData, |
| 164 .WillRepeatedly(RunCallback2(Decryptor::kNeedMoreData, | 149 Decryptor::AudioBuffers())); |
| 165 Decryptor::AudioBuffers())); | |
| 166 EXPECT_CALL(statistics_cb_, OnStatistics(_)); | 150 EXPECT_CALL(statistics_cb_, OnStatistics(_)); |
| 167 | 151 |
| 168 ReadAndExpectFrameReadyWith(AudioDecoder::kOk, decoded_frame_); | 152 ReadAndExpectFrameReadyWith(AudioDecoder::kOk, decoded_frame_); |
| 169 } | 153 } |
| 170 | 154 |
| 171 // Sets up expectations and actions to put DecryptingAudioDecoder in an end | 155 // Sets up expectations and actions to put DecryptingAudioDecoder in an end |
| 172 // of stream state. This function must be called after | 156 // of stream state. This function must be called after |
| 173 // EnterNormalDecodingState() to work. | 157 // EnterNormalDecodingState() to work. |
| 174 void EnterEndOfStreamState() { | 158 void EnterEndOfStreamState() { |
| 175 ReadAndExpectFrameReadyWith(AudioDecoder::kOk, end_of_stream_frame_); | 159 ReadAndExpectFrameReadyWith(AudioDecoder::kOk, end_of_stream_frame_); |
| (...skipping 24 matching lines...) Expand all Loading... |
| 200 message_loop_.RunAllPending(); | 184 message_loop_.RunAllPending(); |
| 201 // Make sure the Read() on the decoder triggers a DecryptAndDecode() on the | 185 // Make sure the Read() on the decoder triggers a DecryptAndDecode() on the |
| 202 // decryptor. | 186 // decryptor. |
| 203 EXPECT_FALSE(pending_audio_decode_cb_.is_null()); | 187 EXPECT_FALSE(pending_audio_decode_cb_.is_null()); |
| 204 } | 188 } |
| 205 | 189 |
| 206 void EnterWaitingForKeyState() { | 190 void EnterWaitingForKeyState() { |
| 207 EXPECT_CALL(*demuxer_, Read(_)) | 191 EXPECT_CALL(*demuxer_, Read(_)) |
| 208 .WillRepeatedly(ReturnBuffer(encrypted_buffer_)); | 192 .WillRepeatedly(ReturnBuffer(encrypted_buffer_)); |
| 209 EXPECT_CALL(*decryptor_, DecryptAndDecodeAudio(_, _)) | 193 EXPECT_CALL(*decryptor_, DecryptAndDecodeAudio(_, _)) |
| 210 .WillRepeatedly(RunCallback2(Decryptor::kNoKey, | 194 .WillRepeatedly(RunCallback<1>(Decryptor::kNoKey, |
| 211 Decryptor::AudioBuffers())); | 195 Decryptor::AudioBuffers())); |
| 212 decoder_->Read(base::Bind(&DecryptingAudioDecoderTest::FrameReady, | 196 decoder_->Read(base::Bind(&DecryptingAudioDecoderTest::FrameReady, |
| 213 base::Unretained(this))); | 197 base::Unretained(this))); |
| 214 message_loop_.RunAllPending(); | 198 message_loop_.RunAllPending(); |
| 215 } | 199 } |
| 216 | 200 |
| 217 void AbortPendingAudioDecodeCB() { | 201 void AbortPendingAudioDecodeCB() { |
| 218 if (!pending_audio_decode_cb_.is_null()) { | 202 if (!pending_audio_decode_cb_.is_null()) { |
| 219 base::ResetAndReturn(&pending_audio_decode_cb_).Run( | 203 base::ResetAndReturn(&pending_audio_decode_cb_).Run( |
| 220 Decryptor::kSuccess, Decryptor::AudioBuffers()); | 204 Decryptor::kSuccess, Decryptor::AudioBuffers()); |
| 221 } | 205 } |
| (...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 274 TEST_F(DecryptingAudioDecoderTest, Initialize_InvalidAudioConfig) { | 258 TEST_F(DecryptingAudioDecoderTest, Initialize_InvalidAudioConfig) { |
| 275 AudioDecoderConfig config(kUnknownAudioCodec, 0, CHANNEL_LAYOUT_STEREO, 0, | 259 AudioDecoderConfig config(kUnknownAudioCodec, 0, CHANNEL_LAYOUT_STEREO, 0, |
| 276 NULL, 0, true); | 260 NULL, 0, true); |
| 277 | 261 |
| 278 InitializeAndExpectStatus(config, PIPELINE_ERROR_DECODE); | 262 InitializeAndExpectStatus(config, PIPELINE_ERROR_DECODE); |
| 279 } | 263 } |
| 280 | 264 |
| 281 // Ensure decoder handles unsupported audio configs without crashing. | 265 // Ensure decoder handles unsupported audio configs without crashing. |
| 282 TEST_F(DecryptingAudioDecoderTest, Initialize_UnsupportedAudioConfig) { | 266 TEST_F(DecryptingAudioDecoderTest, Initialize_UnsupportedAudioConfig) { |
| 283 EXPECT_CALL(*decryptor_, InitializeAudioDecoderMock(_, _)) | 267 EXPECT_CALL(*decryptor_, InitializeAudioDecoderMock(_, _)) |
| 284 .WillOnce(RunCallback1(false)); | 268 .WillOnce(RunCallback<1>(false)); |
| 285 EXPECT_CALL(*this, RequestDecryptorNotification(_)) | 269 EXPECT_CALL(*this, RequestDecryptorNotification(_)) |
| 286 .WillOnce(RunCallback0(decryptor_.get())); | 270 .WillOnce(RunCallbackIfNotNull(decryptor_.get())); |
| 287 | 271 |
| 288 AudioDecoderConfig config(kCodecVorbis, 16, CHANNEL_LAYOUT_STEREO, 44100, | 272 AudioDecoderConfig config(kCodecVorbis, 16, CHANNEL_LAYOUT_STEREO, 44100, |
| 289 NULL, 0, true); | 273 NULL, 0, true); |
| 290 InitializeAndExpectStatus(config, DECODER_ERROR_NOT_SUPPORTED); | 274 InitializeAndExpectStatus(config, DECODER_ERROR_NOT_SUPPORTED); |
| 291 } | 275 } |
| 292 | 276 |
| 293 // Test normal decrypt and decode case. | 277 // Test normal decrypt and decode case. |
| 294 TEST_F(DecryptingAudioDecoderTest, DecryptAndDecode_Normal) { | 278 TEST_F(DecryptingAudioDecoderTest, DecryptAndDecode_Normal) { |
| 295 Initialize(); | 279 Initialize(); |
| 296 EnterNormalDecodingState(); | 280 EnterNormalDecodingState(); |
| 297 } | 281 } |
| 298 | 282 |
| 299 // Test the case where the decryptor returns error when doing decrypt and | 283 // Test the case where the decryptor returns error when doing decrypt and |
| 300 // decode. | 284 // decode. |
| 301 TEST_F(DecryptingAudioDecoderTest, DecryptAndDecode_DecodeError) { | 285 TEST_F(DecryptingAudioDecoderTest, DecryptAndDecode_DecodeError) { |
| 302 Initialize(); | 286 Initialize(); |
| 303 | 287 |
| 304 EXPECT_CALL(*demuxer_, Read(_)) | 288 EXPECT_CALL(*demuxer_, Read(_)) |
| 305 .WillRepeatedly(ReturnBuffer(encrypted_buffer_)); | 289 .WillRepeatedly(ReturnBuffer(encrypted_buffer_)); |
| 306 EXPECT_CALL(*decryptor_, DecryptAndDecodeAudio(_, _)) | 290 EXPECT_CALL(*decryptor_, DecryptAndDecodeAudio(_, _)) |
| 307 .WillRepeatedly(RunCallback2(Decryptor::kError, | 291 .WillRepeatedly(RunCallback<1>(Decryptor::kError, |
| 308 Decryptor::AudioBuffers())); | 292 Decryptor::AudioBuffers())); |
| 309 | 293 |
| 310 ReadAndExpectFrameReadyWith(AudioDecoder::kDecodeError, NULL); | 294 ReadAndExpectFrameReadyWith(AudioDecoder::kDecodeError, NULL); |
| 311 } | 295 } |
| 312 | 296 |
| 313 // Test the case where the decryptor returns kNeedMoreData to ask for more | 297 // Test the case where the decryptor returns kNeedMoreData to ask for more |
| 314 // buffers before it can produce a frame. | 298 // buffers before it can produce a frame. |
| 315 TEST_F(DecryptingAudioDecoderTest, DecryptAndDecode_NeedMoreData) { | 299 TEST_F(DecryptingAudioDecoderTest, DecryptAndDecode_NeedMoreData) { |
| 316 Initialize(); | 300 Initialize(); |
| 317 | 301 |
| 318 EXPECT_CALL(*demuxer_, Read(_)) | 302 EXPECT_CALL(*demuxer_, Read(_)) |
| 319 .Times(2) | 303 .Times(2) |
| 320 .WillRepeatedly(ReturnBuffer(encrypted_buffer_)); | 304 .WillRepeatedly(ReturnBuffer(encrypted_buffer_)); |
| 321 EXPECT_CALL(*decryptor_, DecryptAndDecodeAudio(_, _)) | 305 EXPECT_CALL(*decryptor_, DecryptAndDecodeAudio(_, _)) |
| 322 .WillOnce(RunCallback2(Decryptor::kNeedMoreData, | 306 .WillOnce(RunCallback<1>(Decryptor::kNeedMoreData, |
| 323 Decryptor::AudioBuffers())) | 307 Decryptor::AudioBuffers())) |
| 324 .WillRepeatedly(RunCallback2(Decryptor::kSuccess, decoded_frame_list_)); | 308 .WillRepeatedly(RunCallback<1>(Decryptor::kSuccess, decoded_frame_list_)); |
| 325 EXPECT_CALL(statistics_cb_, OnStatistics(_)) | 309 EXPECT_CALL(statistics_cb_, OnStatistics(_)) |
| 326 .Times(2); | 310 .Times(2); |
| 327 | 311 |
| 328 ReadAndExpectFrameReadyWith(AudioDecoder::kOk, decoded_frame_); | 312 ReadAndExpectFrameReadyWith(AudioDecoder::kOk, decoded_frame_); |
| 329 } | 313 } |
| 330 | 314 |
| 331 // Test the case where the decryptor returns multiple decoded frames. | 315 // Test the case where the decryptor returns multiple decoded frames. |
| 332 TEST_F(DecryptingAudioDecoderTest, DecryptAndDecode_MultipleFrames) { | 316 TEST_F(DecryptingAudioDecoderTest, DecryptAndDecode_MultipleFrames) { |
| 333 Initialize(); | 317 Initialize(); |
| 334 | 318 |
| 335 scoped_refptr<DataBuffer> frame_a = new DataBuffer(kFakeAudioFrameSize); | 319 scoped_refptr<DataBuffer> frame_a = new DataBuffer(kFakeAudioFrameSize); |
| 336 frame_a->SetDataSize(kFakeAudioFrameSize); | 320 frame_a->SetDataSize(kFakeAudioFrameSize); |
| 337 scoped_refptr<DataBuffer> frame_b = new DataBuffer(kFakeAudioFrameSize); | 321 scoped_refptr<DataBuffer> frame_b = new DataBuffer(kFakeAudioFrameSize); |
| 338 frame_b->SetDataSize(kFakeAudioFrameSize); | 322 frame_b->SetDataSize(kFakeAudioFrameSize); |
| 339 decoded_frame_list_.push_back(frame_a); | 323 decoded_frame_list_.push_back(frame_a); |
| 340 decoded_frame_list_.push_back(frame_b); | 324 decoded_frame_list_.push_back(frame_b); |
| 341 | 325 |
| 342 EXPECT_CALL(*demuxer_, Read(_)) | 326 EXPECT_CALL(*demuxer_, Read(_)) |
| 343 .WillOnce(ReturnBuffer(encrypted_buffer_)); | 327 .WillOnce(ReturnBuffer(encrypted_buffer_)); |
| 344 EXPECT_CALL(*decryptor_, DecryptAndDecodeAudio(_, _)) | 328 EXPECT_CALL(*decryptor_, DecryptAndDecodeAudio(_, _)) |
| 345 .WillOnce(RunCallback2(Decryptor::kSuccess, decoded_frame_list_)); | 329 .WillOnce(RunCallback<1>(Decryptor::kSuccess, decoded_frame_list_)); |
| 346 EXPECT_CALL(statistics_cb_, OnStatistics(_)); | 330 EXPECT_CALL(statistics_cb_, OnStatistics(_)); |
| 347 | 331 |
| 348 ReadAndExpectFrameReadyWith(AudioDecoder::kOk, decoded_frame_); | 332 ReadAndExpectFrameReadyWith(AudioDecoder::kOk, decoded_frame_); |
| 349 ReadAndExpectFrameReadyWith(AudioDecoder::kOk, frame_a); | 333 ReadAndExpectFrameReadyWith(AudioDecoder::kOk, frame_a); |
| 350 ReadAndExpectFrameReadyWith(AudioDecoder::kOk, frame_b); | 334 ReadAndExpectFrameReadyWith(AudioDecoder::kOk, frame_b); |
| 351 } | 335 } |
| 352 | 336 |
| 353 // Test the case where the decryptor receives end-of-stream buffer. | 337 // Test the case where the decryptor receives end-of-stream buffer. |
| 354 TEST_F(DecryptingAudioDecoderTest, DecryptAndDecode_EndOfStream) { | 338 TEST_F(DecryptingAudioDecoderTest, DecryptAndDecode_EndOfStream) { |
| 355 Initialize(); | 339 Initialize(); |
| 356 EnterNormalDecodingState(); | 340 EnterNormalDecodingState(); |
| 357 EnterEndOfStreamState(); | 341 EnterEndOfStreamState(); |
| 358 } | 342 } |
| 359 | 343 |
| 360 // Test the case where the a key is added when the decryptor is in | 344 // Test the case where the a key is added when the decryptor is in |
| 361 // kWaitingForKey state. | 345 // kWaitingForKey state. |
| 362 TEST_F(DecryptingAudioDecoderTest, KeyAdded_DuringWaitingForKey) { | 346 TEST_F(DecryptingAudioDecoderTest, KeyAdded_DuringWaitingForKey) { |
| 363 Initialize(); | 347 Initialize(); |
| 364 EnterWaitingForKeyState(); | 348 EnterWaitingForKeyState(); |
| 365 | 349 |
| 366 EXPECT_CALL(*decryptor_, DecryptAndDecodeAudio(_, _)) | 350 EXPECT_CALL(*decryptor_, DecryptAndDecodeAudio(_, _)) |
| 367 .WillRepeatedly(RunCallback2(Decryptor::kSuccess, decoded_frame_list_)); | 351 .WillRepeatedly(RunCallback<1>(Decryptor::kSuccess, decoded_frame_list_)); |
| 368 EXPECT_CALL(statistics_cb_, OnStatistics(_)); | 352 EXPECT_CALL(statistics_cb_, OnStatistics(_)); |
| 369 EXPECT_CALL(*this, FrameReady(AudioDecoder::kOk, decoded_frame_)); | 353 EXPECT_CALL(*this, FrameReady(AudioDecoder::kOk, decoded_frame_)); |
| 370 key_added_cb_.Run(); | 354 key_added_cb_.Run(); |
| 371 message_loop_.RunAllPending(); | 355 message_loop_.RunAllPending(); |
| 372 } | 356 } |
| 373 | 357 |
| 374 // Test the case where the a key is added when the decryptor is in | 358 // Test the case where the a key is added when the decryptor is in |
| 375 // kPendingDecode state. | 359 // kPendingDecode state. |
| 376 TEST_F(DecryptingAudioDecoderTest, KeyAdded_DruingPendingDecode) { | 360 TEST_F(DecryptingAudioDecoderTest, KeyAdded_DruingPendingDecode) { |
| 377 Initialize(); | 361 Initialize(); |
| 378 EnterPendingDecodeState(); | 362 EnterPendingDecodeState(); |
| 379 | 363 |
| 380 EXPECT_CALL(*decryptor_, DecryptAndDecodeAudio(_, _)) | 364 EXPECT_CALL(*decryptor_, DecryptAndDecodeAudio(_, _)) |
| 381 .WillRepeatedly(RunCallback2(Decryptor::kSuccess, decoded_frame_list_)); | 365 .WillRepeatedly(RunCallback<1>(Decryptor::kSuccess, decoded_frame_list_)); |
| 382 EXPECT_CALL(statistics_cb_, OnStatistics(_)); | 366 EXPECT_CALL(statistics_cb_, OnStatistics(_)); |
| 383 EXPECT_CALL(*this, FrameReady(AudioDecoder::kOk, decoded_frame_)); | 367 EXPECT_CALL(*this, FrameReady(AudioDecoder::kOk, decoded_frame_)); |
| 384 // The audio decode callback is returned after the correct decryption key is | 368 // The audio decode callback is returned after the correct decryption key is |
| 385 // added. | 369 // added. |
| 386 key_added_cb_.Run(); | 370 key_added_cb_.Run(); |
| 387 base::ResetAndReturn(&pending_audio_decode_cb_).Run( | 371 base::ResetAndReturn(&pending_audio_decode_cb_).Run( |
| 388 Decryptor::kNoKey, Decryptor::AudioBuffers()); | 372 Decryptor::kNoKey, Decryptor::AudioBuffers()); |
| 389 message_loop_.RunAllPending(); | 373 message_loop_.RunAllPending(); |
| 390 } | 374 } |
| 391 | 375 |
| (...skipping 85 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 477 base::ResetAndReturn(&pending_demuxer_read_cb_).Run(DemuxerStream::kAborted, | 461 base::ResetAndReturn(&pending_demuxer_read_cb_).Run(DemuxerStream::kAborted, |
| 478 NULL); | 462 NULL); |
| 479 message_loop_.RunAllPending(); | 463 message_loop_.RunAllPending(); |
| 480 } | 464 } |
| 481 | 465 |
| 482 // Test config change on the demuxer stream. | 466 // Test config change on the demuxer stream. |
| 483 TEST_F(DecryptingAudioDecoderTest, DemuxerRead_ConfigChanged) { | 467 TEST_F(DecryptingAudioDecoderTest, DemuxerRead_ConfigChanged) { |
| 484 Initialize(); | 468 Initialize(); |
| 485 | 469 |
| 486 EXPECT_CALL(*demuxer_, Read(_)) | 470 EXPECT_CALL(*demuxer_, Read(_)) |
| 487 .WillOnce(ReturnConfigChanged()); | 471 .WillOnce(RunCallback<0>(DemuxerStream::kConfigChanged, |
| 472 scoped_refptr<DecoderBuffer>())); |
| 488 | 473 |
| 489 // TODO(xhwang): Update this test when kConfigChanged is supported in | 474 // TODO(xhwang): Update this test when kConfigChanged is supported in |
| 490 // DecryptingAudioDecoder. | 475 // DecryptingAudioDecoder. |
| 491 ReadAndExpectFrameReadyWith(AudioDecoder::kDecodeError, NULL); | 476 ReadAndExpectFrameReadyWith(AudioDecoder::kDecodeError, NULL); |
| 492 } | 477 } |
| 493 | 478 |
| 494 } // namespace media | 479 } // namespace media |
| OLD | NEW |