blob: 96547c4fc7f92f12ac406b7ca434490d261c51f6 [file] [log] [blame]
// Copyright 2016 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.
#include "content/browser/media/cdm_registry_impl.h"
#include <algorithm>
#include <string>
#include <vector>
#include "base/base_paths.h"
#include "base/containers/flat_set.h"
#include "base/files/file_path.h"
#include "base/strings/string_split.h"
#include "base/strings/string_util.h"
#include "base/strings/utf_string_conversions.h"
#include "base/version.h"
#include "content/public/common/cdm_info.h"
#include "media/base/video_codecs.h"
#include "testing/gtest/include/gtest/gtest.h"
namespace content {
const char kTestCdmName[] = "Test CDM";
const char kAlternateCdmName[] = "Alternate CDM";
const char kTestCdmGuid[] = "62FE9C4B-384E-48FD-B28A-9F6F248BC8CC";
const char kTestPath[] = "/aa/bb";
const char kVersion1[] = "1.1.1.1";
const char kVersion2[] = "1.1.1.2";
const char kTestKeySystem[] = "com.example.somesystem";
const char kTestFileSystemId[] = "file_system_id";
// For simplicity and to make failures easier to diagnose, this test uses
// std::string instead of base::FilePath and std::vector<std::string>.
class CdmRegistryImplTest : public testing::Test {
public:
CdmRegistryImplTest() {}
~CdmRegistryImplTest() override {}
protected:
void Register(const std::string& name,
const std::string& version,
const std::string& path,
const std::vector<media::VideoCodec>& supported_video_codecs,
bool supports_persistent_license,
const base::flat_set<media::EncryptionMode>& supported_modes,
std::string supported_key_system,
bool supports_sub_key_systems = false) {
cdm_registry_.RegisterCdm(CdmInfo(
name, kTestCdmGuid, base::Version(version),
base::FilePath::FromUTF8Unsafe(path), kTestFileSystemId,
supported_video_codecs, supports_persistent_license, supported_modes,
supported_key_system, supports_sub_key_systems));
}
bool IsRegistered(const std::string& name, const std::string& version) {
for (const auto& cdm : cdm_registry_.GetAllRegisteredCdms()) {
if (cdm.name == name && cdm.version.GetString() == version)
return true;
}
return false;
}
std::vector<std::string> GetVersions(const std::string& guid) {
std::vector<std::string> versions;
for (const auto& cdm : cdm_registry_.GetAllRegisteredCdms()) {
if (cdm.guid == guid)
versions.push_back(cdm.version.GetString());
}
return versions;
}
protected:
CdmRegistryImpl cdm_registry_;
};
TEST_F(CdmRegistryImplTest, Register) {
Register(kTestCdmName, kVersion1, kTestPath,
{media::kCodecVP8, media::kCodecVP9}, true,
{media::EncryptionMode::kCenc}, kTestKeySystem, true);
std::vector<CdmInfo> cdms = cdm_registry_.GetAllRegisteredCdms();
ASSERT_EQ(1u, cdms.size());
CdmInfo cdm = cdms[0];
EXPECT_EQ(kTestCdmName, cdm.name);
EXPECT_EQ(kVersion1, cdm.version.GetString());
EXPECT_EQ(kTestPath, cdm.path.MaybeAsASCII());
EXPECT_EQ(kTestFileSystemId, cdm.file_system_id);
EXPECT_EQ(2u, cdm.supported_video_codecs.size());
EXPECT_EQ(media::kCodecVP8, cdm.supported_video_codecs[0]);
EXPECT_EQ(media::kCodecVP9, cdm.supported_video_codecs[1]);
EXPECT_TRUE(cdm.supports_persistent_license);
EXPECT_EQ(1u, cdm.supported_encryption_schemes.size());
EXPECT_EQ(
1u, cdm.supported_encryption_schemes.count(media::EncryptionMode::kCenc));
EXPECT_EQ(kTestKeySystem, cdm.supported_key_system);
EXPECT_TRUE(cdm.supports_sub_key_systems);
}
TEST_F(CdmRegistryImplTest, ReRegister) {
Register(kTestCdmName, kVersion1, "/bb/cc", {}, false,
{media::EncryptionMode::kCenc}, kTestKeySystem);
EXPECT_TRUE(IsRegistered(kTestCdmName, kVersion1));
// Now register same key system with different values.
Register(kTestCdmName, kVersion1, kTestPath, {}, false,
{media::EncryptionMode::kCenc}, kTestKeySystem);
EXPECT_TRUE(IsRegistered(kTestCdmName, kVersion1));
}
TEST_F(CdmRegistryImplTest, MultipleVersions) {
Register(kTestCdmName, kVersion1, kTestPath, {}, false,
{media::EncryptionMode::kCenc}, kTestKeySystem);
Register(kTestCdmName, kVersion2, "/bb/cc", {}, false,
{media::EncryptionMode::kCenc}, kTestKeySystem);
EXPECT_TRUE(IsRegistered(kTestCdmName, kVersion1));
EXPECT_TRUE(IsRegistered(kTestCdmName, kVersion2));
}
TEST_F(CdmRegistryImplTest, NewVersionInsertedLast) {
Register(kTestCdmName, kVersion1, kTestPath, {}, false,
{media::EncryptionMode::kCenc}, kTestKeySystem);
Register(kTestCdmName, kVersion2, "/bb/cc", {}, false,
{media::EncryptionMode::kCenc}, kTestKeySystem);
const std::vector<std::string> versions = GetVersions(kTestCdmGuid);
EXPECT_EQ(2u, versions.size());
EXPECT_EQ(kVersion1, versions[0]);
EXPECT_EQ(kVersion2, versions[1]);
}
TEST_F(CdmRegistryImplTest, DifferentNames) {
Register(kTestCdmName, kVersion1, kTestPath, {}, false,
{media::EncryptionMode::kCenc}, kTestKeySystem);
Register(kAlternateCdmName, kVersion1, kTestPath, {}, false,
{media::EncryptionMode::kCbcs}, kTestKeySystem);
EXPECT_TRUE(IsRegistered(kTestCdmName, kVersion1));
EXPECT_TRUE(IsRegistered(kAlternateCdmName, kVersion1));
}
TEST_F(CdmRegistryImplTest, SupportedEncryptionSchemes) {
Register(kTestCdmName, kVersion1, kTestPath, {}, false,
{media::EncryptionMode::kCenc, media::EncryptionMode::kCbcs},
kTestKeySystem);
std::vector<CdmInfo> cdms = cdm_registry_.GetAllRegisteredCdms();
ASSERT_EQ(1u, cdms.size());
const CdmInfo& cdm = cdms[0];
EXPECT_EQ(2u, cdm.supported_encryption_schemes.size());
EXPECT_EQ(
1u, cdm.supported_encryption_schemes.count(media::EncryptionMode::kCenc));
EXPECT_EQ(
1u, cdm.supported_encryption_schemes.count(media::EncryptionMode::kCbcs));
}
} // namespace content