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