blob: 032a5cdcbae193e577444e57ce9477886df5c02e [file] [log] [blame]
// Copyright 2018 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef MEDIA_CDM_LIBRARY_CDM_MOCK_LIBRARY_CDM_H_
#define MEDIA_CDM_LIBRARY_CDM_MOCK_LIBRARY_CDM_H_
#include <stdint.h>
#include <memory>
#include <string>
#include "media/cdm/api/content_decryption_module.h"
#include "testing/gmock/include/gmock/gmock.h"
namespace media {
class CdmHostProxy;
// Mock implementation of the cdm::ContentDecryptionModule interfaces.
class MockLibraryCdm : public cdm::ContentDecryptionModule_10,
public cdm::ContentDecryptionModule_11 {
public:
// Provides easy access to the MockLibraryCdm instance for testing to avoid
// going through multiple layers to get it (e.g. CdmAdapter -> CdmWrapper ->
// CdmWrapperImpl). It does impose a limitation that we cannot have more than
// one MockLibraryCdm instances at the same time, which is fine in most
// testing cases.
static MockLibraryCdm* GetInstance();
template <typename HostInterface>
MockLibraryCdm(HostInterface* host, const std::string& key_system);
CdmHostProxy* GetCdmHostProxy();
// cdm::ContentDecryptionModule_10 implementation.
MOCK_METHOD1(
InitializeVideoDecoder,
cdm::Status(const cdm::VideoDecoderConfig_2& video_decoder_config));
MOCK_METHOD2(DecryptAndDecodeFrame,
cdm::Status(const cdm::InputBuffer_2& encrypted_buffer,
cdm::VideoFrame* video_frame));
// cdm::ContentDecryptionModule_11 implementation.
MOCK_METHOD1(
InitializeVideoDecoder,
cdm::Status(const cdm::VideoDecoderConfig_3& video_decoder_config));
MOCK_METHOD2(DecryptAndDecodeFrame,
cdm::Status(const cdm::InputBuffer_2& encrypted_buffer,
cdm::VideoFrame_2* video_frame));
// cdm::ContentDecryptionModule_10/11 implementation.
void Initialize(bool allow_distinctive_identifier,
bool allow_persistent_state,
bool use_hw_secure_codecs) override;
MOCK_METHOD1(
InitializeAudioDecoder,
cdm::Status(const cdm::AudioDecoderConfig_2& audio_decoder_config));
MOCK_METHOD2(Decrypt,
cdm::Status(const cdm::InputBuffer_2& encrypted_buffer,
cdm::DecryptedBlock* decrypted_block));
MOCK_METHOD2(DecryptAndDecodeSamples,
cdm::Status(const cdm::InputBuffer_2& encrypted_buffer,
cdm::AudioFrames* audio_frames));
// Common cdm::ContentDecryptionModule_* implementation.
MOCK_METHOD2(GetStatusForPolicy,
void(uint32_t promise_id, const cdm::Policy& policy));
MOCK_METHOD5(CreateSessionAndGenerateRequest,
void(uint32_t promise_id,
cdm::SessionType session_type,
cdm::InitDataType init_data_type,
const uint8_t* init_data,
uint32_t init_data_size));
MOCK_METHOD4(LoadSession,
void(uint32_t promise_id,
cdm::SessionType session_type,
const char* session_id,
uint32_t session_id_length));
MOCK_METHOD5(UpdateSession,
void(uint32_t promise_id,
const char* session_id,
uint32_t session_id_length,
const uint8_t* response,
uint32_t response_size));
MOCK_METHOD3(CloseSession,
void(uint32_t promise_id,
const char* session_id,
uint32_t session_id_length));
MOCK_METHOD3(RemoveSession,
void(uint32_t promise_id,
const char* session_id,
uint32_t session_id_length));
MOCK_METHOD3(SetServerCertificate,
void(uint32_t promise_id,
const uint8_t* server_certificate_data,
uint32_t server_certificate_data_size));
MOCK_METHOD1(TimerExpired, void(void* context));
MOCK_METHOD1(DeinitializeDecoder, void(cdm::StreamType decoder_type));
MOCK_METHOD1(ResetDecoder, void(cdm::StreamType decoder_type));
MOCK_METHOD1(OnPlatformChallengeResponse,
void(const cdm::PlatformChallengeResponse& response));
MOCK_METHOD3(OnQueryOutputProtectionStatus,
void(cdm::QueryResult result,
uint32_t link_mask,
uint32_t output_protection_mask));
MOCK_METHOD3(OnStorageId,
void(uint32_t version,
const uint8_t* storage_id,
uint32_t storage_id_size));
// It could be tricky to expect Destroy() to be called and then delete
// MockLibraryCdm directly in the test. So call "delete this" in this class,
// same as a normal CDM implementation would do, but also add DestroyCalled()
// so that it's easy to ensure Destroy() is actually called.
MOCK_METHOD0(DestroyCalled, void());
void Destroy() override {
DestroyCalled();
delete this;
}
private:
// Can only be destructed through Destroy().
~MockLibraryCdm() override;
std::unique_ptr<CdmHostProxy> cdm_host_proxy_;
};
// Helper function to create MockLibraryCdm.
void* CreateMockLibraryCdm(int cdm_interface_version,
const char* key_system,
uint32_t key_system_size,
GetCdmHostFunc get_cdm_host_func,
void* user_data);
} // namespace media
#endif // MEDIA_CDM_LIBRARY_CDM_MOCK_LIBRARY_CDM_H_