156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks// Copyright (c) 2012 The Chromium Authors. All rights reserved. 256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks// Use of this source code is governed by a BSD-style license that can be 356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks// found in the LICENSE file. 456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#include <string> 656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#include <vector> 756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#include "base/bind.h" 956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#include "base/callback_helpers.h" 107df30109963092559d3760c0661a020f9daf1030The Android Open Source Project#include "base/message_loop/message_loop.h" 117df30109963092559d3760c0661a020f9daf1030The Android Open Source Project#include "media/base/audio_buffer.h" 127df30109963092559d3760c0661a020f9daf1030The Android Open Source Project#include "media/base/buffers.h" 137df30109963092559d3760c0661a020f9daf1030The Android Open Source Project#include "media/base/decoder_buffer.h" 147df30109963092559d3760c0661a020f9daf1030The Android Open Source Project#include "media/base/decrypt_config.h" 157df30109963092559d3760c0661a020f9daf1030The Android Open Source Project#include "media/base/gmock_callback_support.h" 167df30109963092559d3760c0661a020f9daf1030The Android Open Source Project#include "media/base/mock_filters.h" 177df30109963092559d3760c0661a020f9daf1030The Android Open Source Project#include "media/base/test_helpers.h" 187df30109963092559d3760c0661a020f9daf1030The Android Open Source Project#include "media/filters/decrypting_audio_decoder.h" 197df30109963092559d3760c0661a020f9daf1030The Android Open Source Project#include "testing/gmock/include/gmock/gmock.h" 207df30109963092559d3760c0661a020f9daf1030The Android Open Source Project 217df30109963092559d3760c0661a020f9daf1030The Android Open Source Projectusing ::testing::_; 2256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparksusing ::testing::AtMost; 2356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparksusing ::testing::SaveArg; 2456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparksusing ::testing::StrictMock; 2556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 2656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparksnamespace media { 2756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 2856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparksconst int kSampleRate = 44100; 2956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 3056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks// Make sure the kFakeAudioFrameSize is a valid frame size for all audio decoder 3156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks// configs used in this test. 3256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparksconst int kFakeAudioFrameSize = 48; 3356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparksconst uint8 kFakeKeyId[] = { 0x4b, 0x65, 0x79, 0x20, 0x49, 0x44 }; 3456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparksconst uint8 kFakeIv[DecryptConfig::kDecryptionKeySize] = { 0 }; 3556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparksconst int kDecodingDelay = 3; 3656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 3756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks// Create a fake non-empty encrypted buffer. 3856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparksstatic scoped_refptr<DecoderBuffer> CreateFakeEncryptedBuffer() { 3956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks const int buffer_size = 16; // Need a non-empty buffer; 4056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks scoped_refptr<DecoderBuffer> buffer(new DecoderBuffer(buffer_size)); 4156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks buffer->set_decrypt_config(scoped_ptr<DecryptConfig>(new DecryptConfig( 4256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks std::string(reinterpret_cast<const char*>(kFakeKeyId), 4356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks arraysize(kFakeKeyId)), 4456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks std::string(reinterpret_cast<const char*>(kFakeIv), arraysize(kFakeIv)), 4556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks std::vector<SubsampleEntry>()))); 4656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks return buffer; 4756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks} 4856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 4956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks// Use anonymous namespace here to prevent the actions to be defined multiple 5056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks// times across multiple test files. Sadly we can't use static for them. 5156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparksnamespace { 5256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 5356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave SparksACTION_P(ReturnBuffer, buffer) { 5456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks return buffer; 5556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks} 5656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 5756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks} // namespace 5856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 5956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparksclass DecryptingAudioDecoderTest : public testing::Test { 6056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks public: 6156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks DecryptingAudioDecoderTest() 6256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks : decoder_(new DecryptingAudioDecoder( 6356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks message_loop_.message_loop_proxy(), 6456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks base::Bind( 6556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks &DecryptingAudioDecoderTest::RequestDecryptorNotification, 6656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks base::Unretained(this)))), 6756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks decryptor_(new StrictMock<MockDecryptor>()), 6856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks num_decrypt_and_decode_calls_(0), 6956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks num_frames_in_decryptor_(0), 7056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks encrypted_buffer_(CreateFakeEncryptedBuffer()), 7156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks decoded_frame_(NULL), 7256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks decoded_frame_list_() {} 7356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 7456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks virtual ~DecryptingAudioDecoderTest() { 7556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks EXPECT_CALL(*this, RequestDecryptorNotification(_)) 7656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks .Times(testing::AnyNumber()); 7756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks Destroy(); 7856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks } 7956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 8056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks void InitializeAndExpectStatus(const AudioDecoderConfig& config, 8156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks PipelineStatus status) { 8256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks // Initialize data now that the config is known. Since the code uses 8356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks // invalid values (that CreateEmptyBuffer() doesn't support), tweak them 8456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks // just for CreateEmptyBuffer(). 8556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks int channels = ChannelLayoutToChannelCount(config.channel_layout()); 8656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks if (channels < 0) 8756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks channels = 0; 8856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks decoded_frame_ = AudioBuffer::CreateEmptyBuffer(config.channel_layout(), 8956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks channels, 9056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks kSampleRate, 9156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks kFakeAudioFrameSize, 9256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks kNoTimestamp()); 9356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks decoded_frame_list_.push_back(decoded_frame_); 9456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 9556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks decoder_->Initialize(config, NewExpectedStatusCB(status), 9656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks base::Bind(&DecryptingAudioDecoderTest::FrameReady, 9756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks base::Unretained(this))); 9856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks message_loop_.RunUntilIdle(); 9956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks } 10056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 10156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks void ExpectDecryptorNotification(Decryptor* decryptor, bool expected_result) { 10256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks EXPECT_CALL(*this, RequestDecryptorNotification(_)).WillOnce( 10356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks RunCallback<0>(decryptor, 10456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks base::Bind(&DecryptingAudioDecoderTest::DecryptorSet, 10556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks base::Unretained(this)))); 10656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks EXPECT_CALL(*this, DecryptorSet(expected_result)); 10756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks } 10856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 10956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks void Initialize() { 11056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks EXPECT_CALL(*decryptor_, InitializeAudioDecoder(_, _)) 11156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks .Times(AtMost(1)) 11256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks .WillOnce(RunCallback<1>(true)); 11356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks ExpectDecryptorNotification(decryptor_.get(), true); 11456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks EXPECT_CALL(*decryptor_, RegisterNewKeyCB(Decryptor::kAudio, _)) 11556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks .WillOnce(SaveArg<1>(&key_added_cb_)); 11656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 11756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks config_.Initialize(kCodecVorbis, kSampleFormatPlanarF32, 11856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks CHANNEL_LAYOUT_STEREO, kSampleRate, NULL, 0, true, true, 11956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks base::TimeDelta(), 0); 12056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks InitializeAndExpectStatus(config_, PIPELINE_OK); 12156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks } 12256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 12356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks void Reinitialize() { 12456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks ReinitializeConfigChange(config_); 12556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks } 12656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 12756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks void ReinitializeConfigChange(const AudioDecoderConfig& new_config) { 12856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks EXPECT_CALL(*decryptor_, DeinitializeDecoder(Decryptor::kAudio)); 12956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks EXPECT_CALL(*decryptor_, InitializeAudioDecoder(_, _)) 13056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks .WillOnce(RunCallback<1>(true)); 13156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks EXPECT_CALL(*decryptor_, RegisterNewKeyCB(Decryptor::kAudio, _)) 13256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks .WillOnce(SaveArg<1>(&key_added_cb_)); 13356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks decoder_->Initialize(new_config, NewExpectedStatusCB(PIPELINE_OK), 13456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks base::Bind(&DecryptingAudioDecoderTest::FrameReady, 13556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks base::Unretained(this))); 13656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks } 13756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 13856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks // Decode |buffer| and expect DecodeDone to get called with |status|. 13956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks void DecodeAndExpect(const scoped_refptr<DecoderBuffer>& buffer, 14056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks AudioDecoder::Status status) { 14156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks EXPECT_CALL(*this, DecodeDone(status)); 14256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks decoder_->Decode(buffer, 14356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks base::Bind(&DecryptingAudioDecoderTest::DecodeDone, 14456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks base::Unretained(this))); 14556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks message_loop_.RunUntilIdle(); 14656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks } 14756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 14856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks // Helper function to simulate the decrypting and decoding process in the 14956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks // |decryptor_| with a decoding delay of kDecodingDelay buffers. 15056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks void DecryptAndDecodeAudio(const scoped_refptr<DecoderBuffer>& encrypted, 15156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks const Decryptor::AudioDecodeCB& audio_decode_cb) { 15256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks num_decrypt_and_decode_calls_++; 15356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks if (!encrypted->end_of_stream()) 15456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks num_frames_in_decryptor_++; 15556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 15656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks if (num_decrypt_and_decode_calls_ <= kDecodingDelay || 15756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks num_frames_in_decryptor_ == 0) { 15856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks audio_decode_cb.Run(Decryptor::kNeedMoreData, Decryptor::AudioBuffers()); 15956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks return; 16056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks } 16156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 16256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks num_frames_in_decryptor_--; 16356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks audio_decode_cb.Run(Decryptor::kSuccess, 16456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks Decryptor::AudioBuffers(1, decoded_frame_)); 16556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks } 16656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 16756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks // Sets up expectations and actions to put DecryptingAudioDecoder in an 16856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks // active normal decoding state. 16956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks void EnterNormalDecodingState() { 17056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks EXPECT_CALL(*decryptor_, DecryptAndDecodeAudio(_, _)).WillRepeatedly( 17156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks Invoke(this, &DecryptingAudioDecoderTest::DecryptAndDecodeAudio)); 17256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks EXPECT_CALL(*this, FrameReady(decoded_frame_)); 17356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks for (int i = 0; i < kDecodingDelay + 1; ++i) 17456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks DecodeAndExpect(encrypted_buffer_, AudioDecoder::kOk); 17556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks } 17656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 17756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks // Sets up expectations and actions to put DecryptingAudioDecoder in an end 17856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks // of stream state. This function must be called after 17956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks // EnterNormalDecodingState() to work. 18056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks void EnterEndOfStreamState() { 18156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks // The codec in the |decryptor_| will be flushed. 18256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks EXPECT_CALL(*this, FrameReady(decoded_frame_)) 18356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks .Times(kDecodingDelay); 18456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks DecodeAndExpect(DecoderBuffer::CreateEOSBuffer(), AudioDecoder::kOk); 18556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks EXPECT_EQ(0, num_frames_in_decryptor_); 18656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks } 18756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 18856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks // Make the audio decode callback pending by saving and not firing it. 18956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks void EnterPendingDecodeState() { 19056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks EXPECT_TRUE(pending_audio_decode_cb_.is_null()); 19156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks EXPECT_CALL(*decryptor_, DecryptAndDecodeAudio(encrypted_buffer_, _)) 19256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks .WillOnce(SaveArg<1>(&pending_audio_decode_cb_)); 19356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 19456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks decoder_->Decode(encrypted_buffer_, 19556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks base::Bind(&DecryptingAudioDecoderTest::DecodeDone, 19656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks base::Unretained(this))); 19756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks message_loop_.RunUntilIdle(); 19856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks // Make sure the Decode() on the decoder triggers a DecryptAndDecode() on 19956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks // the decryptor. 20056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks EXPECT_FALSE(pending_audio_decode_cb_.is_null()); 20156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks } 20256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 20356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks void EnterWaitingForKeyState() { 20456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks EXPECT_CALL(*decryptor_, DecryptAndDecodeAudio(encrypted_buffer_, _)) 20556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks .WillRepeatedly(RunCallback<1>(Decryptor::kNoKey, 20656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks Decryptor::AudioBuffers())); 20756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks decoder_->Decode(encrypted_buffer_, 20856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks base::Bind(&DecryptingAudioDecoderTest::DecodeDone, 20956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks base::Unretained(this))); 21056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks message_loop_.RunUntilIdle(); 21156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks } 21256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 21356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks void AbortPendingAudioDecodeCB() { 21456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks if (!pending_audio_decode_cb_.is_null()) { 21556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks base::ResetAndReturn(&pending_audio_decode_cb_).Run( 21656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks Decryptor::kSuccess, Decryptor::AudioBuffers()); 21756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks } 21856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks } 21956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 22056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks void AbortAllPendingCBs() { 22156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks if (!pending_init_cb_.is_null()) { 22256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks ASSERT_TRUE(pending_audio_decode_cb_.is_null()); 22356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks base::ResetAndReturn(&pending_init_cb_).Run(false); 22456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks return; 22556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks } 22656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 22756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks AbortPendingAudioDecodeCB(); 22856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks } 22956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 23056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks void Reset() { 23156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks EXPECT_CALL(*decryptor_, ResetDecoder(Decryptor::kAudio)) 23256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks .WillRepeatedly(InvokeWithoutArgs( 23356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks this, &DecryptingAudioDecoderTest::AbortPendingAudioDecodeCB)); 23456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 23556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks decoder_->Reset(NewExpectedClosure()); 23656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks message_loop_.RunUntilIdle(); 23756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks } 23856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 23956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks void Destroy() { 24056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks EXPECT_CALL(*decryptor_, DeinitializeDecoder(Decryptor::kAudio)) 24156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks .WillRepeatedly(InvokeWithoutArgs( 24256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks this, &DecryptingAudioDecoderTest::AbortAllPendingCBs)); 24356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 24456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks decoder_.reset(); 24556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks message_loop_.RunUntilIdle(); 24656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks } 24756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 24856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks MOCK_METHOD1(RequestDecryptorNotification, void(const DecryptorReadyCB&)); 24956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 25056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks MOCK_METHOD1(FrameReady, void(const scoped_refptr<AudioBuffer>&)); 25156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks MOCK_METHOD1(DecodeDone, void(AudioDecoder::Status)); 25256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 25356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks MOCK_METHOD1(DecryptorSet, void(bool)); 25456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 25556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks base::MessageLoop message_loop_; 25656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks scoped_ptr<DecryptingAudioDecoder> decoder_; 25756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks scoped_ptr<StrictMock<MockDecryptor> > decryptor_; 25856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks AudioDecoderConfig config_; 25956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 26056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks // Variables to help the |decryptor_| to simulate decoding delay and flushing. 26156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks int num_decrypt_and_decode_calls_; 26256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks int num_frames_in_decryptor_; 26356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 26456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks Decryptor::DecoderInitCB pending_init_cb_; 26556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks Decryptor::NewKeyCB key_added_cb_; 26656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks Decryptor::AudioDecodeCB pending_audio_decode_cb_; 26756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 26856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks // Constant buffer/frames, to be used/returned by |decoder_| and |decryptor_|. 26956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks scoped_refptr<DecoderBuffer> encrypted_buffer_; 27056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks scoped_refptr<AudioBuffer> decoded_frame_; 27156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks Decryptor::AudioBuffers decoded_frame_list_; 27256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 27356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks private: 27456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks DISALLOW_COPY_AND_ASSIGN(DecryptingAudioDecoderTest); 27556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks}; 27656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 27756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave SparksTEST_F(DecryptingAudioDecoderTest, Initialize_Normal) { 27856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks Initialize(); 27956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks} 28056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 28156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks// Ensure that DecryptingAudioDecoder only accepts encrypted audio. 28256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave SparksTEST_F(DecryptingAudioDecoderTest, Initialize_UnencryptedAudioConfig) { 28356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks AudioDecoderConfig config(kCodecVorbis, kSampleFormatPlanarF32, 28456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks CHANNEL_LAYOUT_STEREO, kSampleRate, NULL, 0, false); 28556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 28656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks InitializeAndExpectStatus(config, DECODER_ERROR_NOT_SUPPORTED); 28756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks} 28856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 28956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks// Ensure decoder handles invalid audio configs without crashing. 29056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave SparksTEST_F(DecryptingAudioDecoderTest, Initialize_InvalidAudioConfig) { 29156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks AudioDecoderConfig config(kUnknownAudioCodec, kUnknownSampleFormat, 29256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks CHANNEL_LAYOUT_STEREO, 0, NULL, 0, true); 29356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 29456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks InitializeAndExpectStatus(config, PIPELINE_ERROR_DECODE); 29556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks} 29656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 29756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks// Ensure decoder handles unsupported audio configs without crashing. 29856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave SparksTEST_F(DecryptingAudioDecoderTest, Initialize_UnsupportedAudioConfig) { 29956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks EXPECT_CALL(*decryptor_, InitializeAudioDecoder(_, _)) 30056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks .WillOnce(RunCallback<1>(false)); 30156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks ExpectDecryptorNotification(decryptor_.get(), true); 30256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 30356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks AudioDecoderConfig config(kCodecVorbis, kSampleFormatPlanarF32, 30456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks CHANNEL_LAYOUT_STEREO, kSampleRate, NULL, 0, true); 30556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks InitializeAndExpectStatus(config, DECODER_ERROR_NOT_SUPPORTED); 30656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks} 30756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 30856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave SparksTEST_F(DecryptingAudioDecoderTest, Initialize_NullDecryptor) { 30956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks ExpectDecryptorNotification(NULL, false); 31056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks AudioDecoderConfig config(kCodecVorbis, kSampleFormatPlanarF32, 31156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks CHANNEL_LAYOUT_STEREO, kSampleRate, NULL, 0, true); 31256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks InitializeAndExpectStatus(config, DECODER_ERROR_NOT_SUPPORTED); 31356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks} 31456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 31556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks// Test normal decrypt and decode case. 31656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave SparksTEST_F(DecryptingAudioDecoderTest, DecryptAndDecode_Normal) { 31756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks Initialize(); 31856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks EnterNormalDecodingState(); 31956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks} 32056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 32156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks// Test the case where the decryptor returns error when doing decrypt and 32256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks// decode. 32356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave SparksTEST_F(DecryptingAudioDecoderTest, DecryptAndDecode_DecodeError) { 32456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks Initialize(); 32556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 32656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks EXPECT_CALL(*decryptor_, DecryptAndDecodeAudio(_, _)) 32756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks .WillRepeatedly(RunCallback<1>(Decryptor::kError, 32856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks Decryptor::AudioBuffers())); 32956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 33056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks DecodeAndExpect(encrypted_buffer_, AudioDecoder::kDecodeError); 33156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks} 33256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 33356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks// Test the case where the decryptor returns multiple decoded frames. 33456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave SparksTEST_F(DecryptingAudioDecoderTest, DecryptAndDecode_MultipleFrames) { 33556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks Initialize(); 33656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 33756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks scoped_refptr<AudioBuffer> frame_a = AudioBuffer::CreateEmptyBuffer( 33856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks config_.channel_layout(), 33956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks ChannelLayoutToChannelCount(config_.channel_layout()), 34056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks kSampleRate, 34156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks kFakeAudioFrameSize, 34256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks kNoTimestamp()); 34356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks scoped_refptr<AudioBuffer> frame_b = AudioBuffer::CreateEmptyBuffer( 34456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks config_.channel_layout(), 34556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks ChannelLayoutToChannelCount(config_.channel_layout()), 34656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks kSampleRate, 34756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks kFakeAudioFrameSize, 34856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks kNoTimestamp()); 34956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks decoded_frame_list_.push_back(frame_a); 35056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks decoded_frame_list_.push_back(frame_b); 35156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 35256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks EXPECT_CALL(*decryptor_, DecryptAndDecodeAudio(_, _)) 35356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks .WillOnce(RunCallback<1>(Decryptor::kSuccess, decoded_frame_list_)); 35456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 35556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks EXPECT_CALL(*this, FrameReady(decoded_frame_)); 35656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks EXPECT_CALL(*this, FrameReady(frame_a)); 35756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks EXPECT_CALL(*this, FrameReady(frame_b)); 35856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks DecodeAndExpect(encrypted_buffer_, AudioDecoder::kOk); 35956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks} 36056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 36156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks// Test the case where the decryptor receives end-of-stream buffer. 36256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave SparksTEST_F(DecryptingAudioDecoderTest, DecryptAndDecode_EndOfStream) { 36356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks Initialize(); 36456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks EnterNormalDecodingState(); 36556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks EnterEndOfStreamState(); 36656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks} 36756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 36856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks// Test reinitializing decode with a new config 369TEST_F(DecryptingAudioDecoderTest, Reinitialize_ConfigChange) { 370 Initialize(); 371 372 EXPECT_CALL(*decryptor_, InitializeAudioDecoder(_, _)) 373 .Times(AtMost(1)) 374 .WillOnce(RunCallback<1>(true)); 375 376 // The new config is different from the initial config in bits-per-channel, 377 // channel layout and samples_per_second. 378 AudioDecoderConfig new_config(kCodecVorbis, kSampleFormatPlanarS16, 379 CHANNEL_LAYOUT_5_1, 88200, NULL, 0, true); 380 EXPECT_NE(new_config.bits_per_channel(), config_.bits_per_channel()); 381 EXPECT_NE(new_config.channel_layout(), config_.channel_layout()); 382 EXPECT_NE(new_config.samples_per_second(), config_.samples_per_second()); 383 384 ReinitializeConfigChange(new_config); 385 message_loop_.RunUntilIdle(); 386} 387 388// Test the case where the a key is added when the decryptor is in 389// kWaitingForKey state. 390TEST_F(DecryptingAudioDecoderTest, KeyAdded_DuringWaitingForKey) { 391 Initialize(); 392 EnterWaitingForKeyState(); 393 394 EXPECT_CALL(*decryptor_, DecryptAndDecodeAudio(_, _)) 395 .WillRepeatedly(RunCallback<1>(Decryptor::kSuccess, decoded_frame_list_)); 396 EXPECT_CALL(*this, FrameReady(decoded_frame_)); 397 EXPECT_CALL(*this, DecodeDone(AudioDecoder::kOk)); 398 key_added_cb_.Run(); 399 message_loop_.RunUntilIdle(); 400} 401 402// Test the case where the a key is added when the decryptor is in 403// kPendingDecode state. 404TEST_F(DecryptingAudioDecoderTest, KeyAdded_DruingPendingDecode) { 405 Initialize(); 406 EnterPendingDecodeState(); 407 408 EXPECT_CALL(*decryptor_, DecryptAndDecodeAudio(_, _)) 409 .WillRepeatedly(RunCallback<1>(Decryptor::kSuccess, decoded_frame_list_)); 410 EXPECT_CALL(*this, FrameReady(decoded_frame_)); 411 EXPECT_CALL(*this, DecodeDone(AudioDecoder::kOk)); 412 // The audio decode callback is returned after the correct decryption key is 413 // added. 414 key_added_cb_.Run(); 415 base::ResetAndReturn(&pending_audio_decode_cb_).Run( 416 Decryptor::kNoKey, Decryptor::AudioBuffers()); 417 message_loop_.RunUntilIdle(); 418} 419 420// Test resetting when the decoder is in kIdle state but has not decoded any 421// frame. 422TEST_F(DecryptingAudioDecoderTest, Reset_DuringIdleAfterInitialization) { 423 Initialize(); 424 Reset(); 425} 426 427// Test resetting when the decoder is in kIdle state after it has decoded one 428// frame. 429TEST_F(DecryptingAudioDecoderTest, Reset_DuringIdleAfterDecodedOneFrame) { 430 Initialize(); 431 EnterNormalDecodingState(); 432 Reset(); 433} 434 435// Test resetting when the decoder is in kPendingDecode state. 436TEST_F(DecryptingAudioDecoderTest, Reset_DuringPendingDecode) { 437 Initialize(); 438 EnterPendingDecodeState(); 439 440 EXPECT_CALL(*this, DecodeDone(AudioDecoder::kAborted)); 441 442 Reset(); 443} 444 445// Test resetting when the decoder is in kWaitingForKey state. 446TEST_F(DecryptingAudioDecoderTest, Reset_DuringWaitingForKey) { 447 Initialize(); 448 EnterWaitingForKeyState(); 449 450 EXPECT_CALL(*this, DecodeDone(AudioDecoder::kAborted)); 451 452 Reset(); 453} 454 455// Test resetting when the decoder has hit end of stream and is in 456// kDecodeFinished state. 457TEST_F(DecryptingAudioDecoderTest, Reset_AfterDecodeFinished) { 458 Initialize(); 459 EnterNormalDecodingState(); 460 EnterEndOfStreamState(); 461 Reset(); 462} 463 464// Test resetting after the decoder has been reset. 465TEST_F(DecryptingAudioDecoderTest, Reset_AfterReset) { 466 Initialize(); 467 EnterNormalDecodingState(); 468 Reset(); 469 Reset(); 470} 471 472} // namespace media 473