Source release v3.5.0
This commit is contained in:
@@ -12,11 +12,11 @@
|
||||
#include "cdm_engine.h"
|
||||
#include "config_test_env.h"
|
||||
#include "initialization_data.h"
|
||||
#include "file_store.h"
|
||||
#include "license_request.h"
|
||||
#include "log.h"
|
||||
#include "OEMCryptoCENC.h"
|
||||
#include "properties.h"
|
||||
#include "properties_ce.h"
|
||||
#include "scoped_ptr.h"
|
||||
#include "string_conversions.h"
|
||||
#include "test_printers.h"
|
||||
@@ -49,7 +49,7 @@ const std::string kWebmMimeType = "video/webm";
|
||||
static void CommonSetup(ServerConfigurationId which,
|
||||
bool bin_prov = false) {
|
||||
|
||||
widevine::PropertiesCE::SetProvisioningMessagesAreBinary(bin_prov);
|
||||
Properties::set_provisioning_messages_are_binary(bin_prov);
|
||||
Properties::Init();
|
||||
|
||||
// NOTE: Select configuration
|
||||
@@ -119,13 +119,29 @@ class WvCdmEnginePreProvTest : public testing::Test {
|
||||
virtual ~WvCdmEnginePreProvTest() {}
|
||||
|
||||
virtual void SetUp() {
|
||||
session_opened_ = false;
|
||||
}
|
||||
|
||||
virtual void OpenSession() {
|
||||
CdmResponseType status =
|
||||
cdm_engine_.OpenSession(g_key_system, NULL, NULL, &session_id_);
|
||||
if (status == NEED_PROVISIONING) {
|
||||
Provision();
|
||||
status = cdm_engine_.OpenSession(g_key_system, NULL, NULL, &session_id_);
|
||||
}
|
||||
ASSERT_EQ(status, NO_ERROR);
|
||||
ASSERT_NE("", session_id_) << "Could not open CDM session.";
|
||||
ASSERT_TRUE(cdm_engine_.IsOpenSession(session_id_));
|
||||
session_opened_ = true;
|
||||
}
|
||||
|
||||
virtual void TearDown() {
|
||||
if (cdm_engine_.IsProvisioned(kSecurityLevelL1)) {
|
||||
cdm_engine_.Unprovision(kSecurityLevelL1);
|
||||
}
|
||||
if (cdm_engine_.IsProvisioned(kSecurityLevelL3)) {
|
||||
cdm_engine_.Unprovision(kSecurityLevelL3);
|
||||
}
|
||||
if (session_opened_) {
|
||||
cdm_engine_.CloseSession(session_id_);
|
||||
session_opened_ = false;
|
||||
@@ -169,9 +185,19 @@ class WvCdmEnginePreProvTest : public testing::Test {
|
||||
std::string cert, wrapped_key;
|
||||
ASSERT_EQ(NO_ERROR, cdm_engine_.SetServiceCertificate(
|
||||
g_provisioning_service_certificate));
|
||||
ASSERT_EQ(NO_ERROR, cdm_engine_.GetProvisioningRequest(
|
||||
cert_type, cert_authority, &prov_request,
|
||||
&provisioning_server_url));
|
||||
CdmResponseType result = NO_ERROR;
|
||||
for(int i = 0; i < 2; ++i) { // Retry once if there is a nonce problem.
|
||||
result = cdm_engine_.GetProvisioningRequest(
|
||||
cert_type, cert_authority, &prov_request,
|
||||
&provisioning_server_url);
|
||||
if (result == CERT_PROVISIONING_NONCE_GENERATION_ERROR) {
|
||||
LOGW("Woops. Nonce problem. Try again?");
|
||||
sleep(1);
|
||||
} else {
|
||||
break;
|
||||
}
|
||||
}
|
||||
ASSERT_EQ(NO_ERROR, result);
|
||||
|
||||
LOGV("WvCdmEnginePreProvTest::Provision: req=%s", prov_request.c_str());
|
||||
|
||||
@@ -211,7 +237,7 @@ class WvCdmEnginePreProvTestStaging : public WvCdmEnginePreProvTest {
|
||||
|
||||
static void SetUpTestCase() {
|
||||
// NOTE: Select server configuration
|
||||
CommonSetup(kContentProtectionStagingLicense);
|
||||
CommonSetup(kContentProtectionStagingServer);
|
||||
}
|
||||
};
|
||||
|
||||
@@ -223,7 +249,7 @@ class WvCdmEnginePreProvTestProd : public WvCdmEnginePreProvTest {
|
||||
|
||||
static void SetUpTestCase() {
|
||||
// NOTE: Select server configuration
|
||||
CommonSetup(kContentProtectionProdLicense);
|
||||
CommonSetup(kContentProtectionProductionServer);
|
||||
}
|
||||
};
|
||||
|
||||
@@ -235,32 +261,20 @@ class WvCdmEnginePreProvTestUat : public WvCdmEnginePreProvTest {
|
||||
|
||||
static void SetUpTestCase() {
|
||||
// NOTE: Select server configuration
|
||||
CommonSetup(kContentProtectionUatLicense);
|
||||
CommonSetup(kContentProtectionUatServer);
|
||||
}
|
||||
};
|
||||
|
||||
class WvCdmEnginePreProvTestStagingProv30 : public WvCdmEnginePreProvTest {
|
||||
class WvCdmEnginePreProvTestUatBinary : public WvCdmEnginePreProvTest {
|
||||
public:
|
||||
WvCdmEnginePreProvTestStagingProv30() {}
|
||||
WvCdmEnginePreProvTestUatBinary() {}
|
||||
|
||||
virtual ~WvCdmEnginePreProvTestStagingProv30() {}
|
||||
|
||||
static void SetUpTestCase() {
|
||||
// NOTE: Select server configuration
|
||||
CommonSetup(kContentProtectionStagingPlusProv30);
|
||||
}
|
||||
};
|
||||
|
||||
class WvCdmEnginePreProvTestStagingProv30Binary : public WvCdmEnginePreProvTest {
|
||||
public:
|
||||
WvCdmEnginePreProvTestStagingProv30Binary() {}
|
||||
|
||||
virtual ~WvCdmEnginePreProvTestStagingProv30Binary() {}
|
||||
virtual ~WvCdmEnginePreProvTestUatBinary() {}
|
||||
|
||||
static void SetUpTestCase() {
|
||||
// NOTE: Select server configuration
|
||||
// Override default setting of provisioning_messages_are_binary property
|
||||
CommonSetup(kContentProtectionUatPlusProv30, true);
|
||||
CommonSetup(kContentProtectionUatServer, true);
|
||||
}
|
||||
|
||||
protected:
|
||||
@@ -326,25 +340,13 @@ class WvCdmEnginePreProvTestStagingProv30Binary : public WvCdmEnginePreProvTest
|
||||
|
||||
};
|
||||
|
||||
class WvCdmEnginePreProvTestUatProv30 : public WvCdmEnginePreProvTest {
|
||||
public:
|
||||
WvCdmEnginePreProvTestUatProv30() {}
|
||||
|
||||
virtual ~WvCdmEnginePreProvTestUatProv30() {}
|
||||
|
||||
static void SetUpTestCase() {
|
||||
// NOTE: Select server configuration
|
||||
CommonSetup(kContentProtectionStagingPlusProv30);
|
||||
}
|
||||
};
|
||||
|
||||
class WvCdmEngineTest : public WvCdmEnginePreProvTest {
|
||||
public:
|
||||
WvCdmEngineTest() {}
|
||||
|
||||
static void SetUpTestCase() {
|
||||
// NOTE: Select server configuration
|
||||
CommonSetup(kContentProtectionStagingLicense);
|
||||
CommonSetup(kContentProtectionUatServer);
|
||||
}
|
||||
|
||||
virtual void SetUp() {
|
||||
@@ -370,10 +372,20 @@ class WvCdmEngineTest : public WvCdmEnginePreProvTest {
|
||||
|
||||
CdmKeyRequest key_request;
|
||||
|
||||
EXPECT_EQ(KEY_MESSAGE, cdm_engine_.GenerateKeyRequest(
|
||||
session_id_, key_set_id, init_data,
|
||||
kLicenseTypeStreaming, app_parameters,
|
||||
&key_request));
|
||||
CdmResponseType result = NO_ERROR;
|
||||
for(int i=0; i < 2; i++) { // Retry once if there is a nonce problem.
|
||||
result = cdm_engine_.GenerateKeyRequest(
|
||||
session_id_, key_set_id, init_data,
|
||||
kLicenseTypeStreaming, app_parameters,
|
||||
&key_request);
|
||||
if (result == LICENSE_REQUEST_NONCE_GENERATION_ERROR) {
|
||||
LOGW("Woops. Nonce problem. Try again?");
|
||||
sleep(1);
|
||||
} else {
|
||||
break;
|
||||
}
|
||||
}
|
||||
EXPECT_EQ(KEY_MESSAGE, result);
|
||||
|
||||
key_msg_ = key_request.message;
|
||||
EXPECT_EQ(kKeyRequestTypeInitial, key_request.type);
|
||||
@@ -381,8 +393,17 @@ class WvCdmEngineTest : public WvCdmEnginePreProvTest {
|
||||
|
||||
void GenerateRenewalRequest() {
|
||||
CdmKeyRequest request;
|
||||
EXPECT_EQ(KEY_MESSAGE,
|
||||
cdm_engine_.GenerateRenewalRequest(session_id_, &request));
|
||||
CdmResponseType result = NO_ERROR;
|
||||
for (int i = 0; i < 2; i++) { // Retry once if there is a nonce problem.
|
||||
result = cdm_engine_.GenerateRenewalRequest(session_id_, &request);
|
||||
if (result == LICENSE_RENEWAL_NONCE_GENERATION_ERROR) {
|
||||
LOGW("Woops. Nonce problem. Try again?");
|
||||
sleep(1);
|
||||
} else {
|
||||
break;
|
||||
}
|
||||
}
|
||||
EXPECT_EQ(KEY_MESSAGE, result);
|
||||
|
||||
key_msg_ = request.message;
|
||||
server_url_ = request.url;
|
||||
@@ -463,84 +484,8 @@ TEST_F(WvCdmEnginePreProvTestStaging, ServiceCertificateGoodTest) {
|
||||
ASSERT_TRUE(cdm_engine_.HasServiceCertificate());
|
||||
};
|
||||
|
||||
// Test that service certificate can be retrieved from the license server.
|
||||
TEST_F(WvCdmEnginePreProvTestStaging, ServiceCertificateRequestResponse) {
|
||||
CdmKeyMessage request;
|
||||
std::string certificate;
|
||||
|
||||
// Initial condition - no service certificate.
|
||||
ASSERT_FALSE(cdm_engine_.HasServiceCertificate());
|
||||
|
||||
// Generate request.
|
||||
// The request will be a serialized protobuf message.
|
||||
ASSERT_TRUE(cdm_engine_.GetServiceCertificateRequest(&request));
|
||||
|
||||
std::string response;
|
||||
ASSERT_TRUE(LicenseServerRequestResponse(request, &response));
|
||||
|
||||
// Extract the service certificate
|
||||
ASSERT_EQ(cdm_engine_.ParseServiceCertificateResponse(response, &certificate),
|
||||
NO_ERROR);
|
||||
|
||||
ASSERT_TRUE(cdm_engine_.HasServiceCertificate());
|
||||
LOGV("ret'd service certificate:\n%s\n", b2a_hex(certificate).c_str());
|
||||
};
|
||||
|
||||
// Test that service certificate can be retrieved from the license server.
|
||||
TEST_F(WvCdmEnginePreProvTestUat, ServiceCertificateRequestResponse) {
|
||||
CdmKeyMessage request;
|
||||
std::string certificate;
|
||||
|
||||
// Initial condition - no service certificate.
|
||||
ASSERT_FALSE(cdm_engine_.HasServiceCertificate());
|
||||
|
||||
// Generate request.
|
||||
// The request will be a serialized protobuf message.
|
||||
ASSERT_TRUE(cdm_engine_.GetServiceCertificateRequest(&request));
|
||||
|
||||
std::string response;
|
||||
ASSERT_TRUE(LicenseServerRequestResponse(request, &response));
|
||||
|
||||
// Extract the service certificate
|
||||
ASSERT_EQ(cdm_engine_.ParseServiceCertificateResponse(response, &certificate),
|
||||
NO_ERROR);
|
||||
|
||||
ASSERT_TRUE(cdm_engine_.HasServiceCertificate());
|
||||
LOGV("ret'd service certificate:\n%s\n", b2a_hex(certificate).c_str());
|
||||
};
|
||||
|
||||
// Test that service certificate can be retrieved from the license server.
|
||||
TEST_F(WvCdmEnginePreProvTestProd, ServiceCertificateRequestResponse) {
|
||||
CdmKeyMessage request;
|
||||
std::string certificate;
|
||||
|
||||
// Initial condition - no service certificate.
|
||||
ASSERT_FALSE(cdm_engine_.HasServiceCertificate());
|
||||
|
||||
// Generate request.
|
||||
// The request will be a serialized protobuf message.
|
||||
ASSERT_TRUE(cdm_engine_.GetServiceCertificateRequest(&request));
|
||||
|
||||
std::string response;
|
||||
ASSERT_TRUE(LicenseServerRequestResponse(request, &response));
|
||||
|
||||
// Extract the service certificate
|
||||
ASSERT_EQ(cdm_engine_.ParseServiceCertificateResponse(response, &certificate),
|
||||
NO_ERROR);
|
||||
|
||||
ASSERT_TRUE(cdm_engine_.HasServiceCertificate());
|
||||
LOGV("ret'd service certificate:\n%s\n", b2a_hex(certificate).c_str());
|
||||
};
|
||||
|
||||
// Test that empty service certificate fails.
|
||||
TEST_F(WvCdmEnginePreProvTestStaging, ServiceCertificateEmptyFailTest) {
|
||||
std::string empty_cert;
|
||||
ASSERT_EQ(cdm_engine_.SetServiceCertificate(g_license_service_certificate),
|
||||
NO_ERROR);
|
||||
ASSERT_TRUE(cdm_engine_.HasServiceCertificate());
|
||||
};
|
||||
|
||||
TEST_F(WvCdmEnginePreProvTestStaging, ProvisioningTest) {
|
||||
// Test that provisioning works, even if device is already provisioned.
|
||||
TEST_F(WvCdmEnginePreProvTestStaging, DISABLED_ProvisioningTest) {
|
||||
uint32_t nonce = 0;
|
||||
uint8_t buffer[1];
|
||||
size_t size = 0;
|
||||
@@ -568,16 +513,12 @@ TEST_F(WvCdmEnginePreProvTestStaging, ProvisioningTest) {
|
||||
Provision();
|
||||
}
|
||||
|
||||
TEST_F(WvCdmEnginePreProvTestStagingProv30, ProvisioningTest) {
|
||||
Provision();
|
||||
}
|
||||
|
||||
TEST_F(WvCdmEnginePreProvTestStagingProv30Binary, ProvisioningTest) {
|
||||
TEST_F(WvCdmEnginePreProvTestUatBinary, DISABLED_ProvisioningTest) {
|
||||
Provision();
|
||||
}
|
||||
|
||||
// Test that provisioning works, even if device is already provisioned.
|
||||
TEST_F(WvCdmEngineTest, ProvisioningTest) {
|
||||
TEST_F(WvCdmEngineTest, DISABLED_ProvisioningTest) {
|
||||
|
||||
Provision();
|
||||
}
|
||||
|
||||
@@ -1,4 +1,3 @@
|
||||
|
||||
// Copyright 2014 Google Inc. All Rights Reserved.
|
||||
|
||||
#include <gmock/gmock.h>
|
||||
@@ -103,6 +102,8 @@ class MockDeviceFiles : public DeviceFiles {
|
||||
|
||||
class MockCryptoSession : public CryptoSession {
|
||||
public:
|
||||
MockCryptoSession(metrics::CryptoMetrics* crypto_metrics)
|
||||
: CryptoSession(crypto_metrics) { }
|
||||
MOCK_METHOD1(GetClientToken, bool(std::string*));
|
||||
MOCK_METHOD1(GetProvisioningToken, bool(std::string*));
|
||||
MOCK_METHOD0(GetPreProvisionTokenType, CdmClientTokenType());
|
||||
@@ -125,8 +126,8 @@ class MockCdmLicense : public CdmLicense {
|
||||
MockCdmLicense(const CdmSessionId& session_id)
|
||||
: CdmLicense(session_id) {}
|
||||
|
||||
MOCK_METHOD6(Init, bool(ServiceCertificate*, const std::string&,
|
||||
CdmClientTokenType, const std::string&,
|
||||
MOCK_METHOD7(Init, bool(const std::string&, CdmClientTokenType,
|
||||
const std::string&, bool, const std::string&,
|
||||
CryptoSession*, PolicyEngine*));
|
||||
};
|
||||
|
||||
@@ -144,12 +145,11 @@ using ::testing::StrEq;
|
||||
class CdmSessionTest : public ::testing::Test {
|
||||
protected:
|
||||
virtual void SetUp() {
|
||||
service_cert_ = new ServiceCertificate;
|
||||
cdm_session_.reset(new CdmSession(NULL));
|
||||
cdm_session_.reset(new CdmSession(NULL, &metrics_));
|
||||
// Inject testing mocks.
|
||||
license_parser_ = new MockCdmLicense(cdm_session_->session_id());
|
||||
cdm_session_->set_license_parser(license_parser_);
|
||||
crypto_session_ = new MockCryptoSession();
|
||||
crypto_session_ = new MockCryptoSession(&crypto_metrics_);
|
||||
cdm_session_->set_crypto_session(crypto_session_);
|
||||
policy_engine_ = new MockPolicyEngine();
|
||||
cdm_session_->set_policy_engine(policy_engine_);
|
||||
@@ -157,12 +157,19 @@ class CdmSessionTest : public ::testing::Test {
|
||||
cdm_session_->set_file_handle(file_handle_);
|
||||
}
|
||||
|
||||
virtual void TearDown() {
|
||||
// Force the cdm_session_ to be deleted. This enforces a requirement that
|
||||
// the CDM session metrics exist at least as long as the CDM session.
|
||||
cdm_session_.reset();
|
||||
}
|
||||
|
||||
metrics::SessionMetrics metrics_;
|
||||
scoped_ptr<CdmSession> cdm_session_;
|
||||
MockCdmLicense* license_parser_;
|
||||
metrics::CryptoMetrics crypto_metrics_;
|
||||
MockCryptoSession* crypto_session_;
|
||||
MockPolicyEngine* policy_engine_;
|
||||
MockDeviceFiles* file_handle_;
|
||||
ServiceCertificate* service_cert_;
|
||||
};
|
||||
|
||||
TEST_F(CdmSessionTest, InitWithBuiltInCertificate) {
|
||||
@@ -185,12 +192,11 @@ TEST_F(CdmSessionTest, InitWithBuiltInCertificate) {
|
||||
.WillOnce(Return(true));
|
||||
EXPECT_CALL(*file_handle_, Init(Eq(level))).WillOnce(Return(true));
|
||||
EXPECT_CALL(*license_parser_,
|
||||
Init(NULL, Eq(kToken), Eq(kClientTokenDrmCert),
|
||||
Eq(kEmptyString), Eq(crypto_session_), Eq(policy_engine_)))
|
||||
Init(Eq(kToken), Eq(kClientTokenDrmCert), Eq(kEmptyString),
|
||||
false, Eq(kEmptyString), Eq(crypto_session_),
|
||||
Eq(policy_engine_)))
|
||||
.WillOnce(Return(true));
|
||||
|
||||
Properties::set_use_certificates_as_identification(true);
|
||||
|
||||
ASSERT_EQ(NO_ERROR, cdm_session_->Init(NULL));
|
||||
}
|
||||
|
||||
@@ -214,37 +220,11 @@ TEST_F(CdmSessionTest, InitWithCertificate) {
|
||||
.InSequence(crypto_session_seq)
|
||||
.WillOnce(Return(true));
|
||||
EXPECT_CALL(*license_parser_,
|
||||
Init(NULL, Eq(kToken), Eq(kClientTokenDrmCert),
|
||||
Eq(kEmptyString), Eq(crypto_session_), Eq(policy_engine_)))
|
||||
Init(Eq(kToken), Eq(kClientTokenDrmCert), Eq(kEmptyString),
|
||||
false, Eq(kEmptyString), Eq(crypto_session_),
|
||||
Eq(policy_engine_)))
|
||||
.WillOnce(Return(true));
|
||||
|
||||
Properties::set_use_certificates_as_identification(true);
|
||||
|
||||
ASSERT_EQ(NO_ERROR, cdm_session_->Init(NULL));
|
||||
}
|
||||
|
||||
TEST_F(CdmSessionTest, InitWithKeybox) {
|
||||
Sequence crypto_session_seq;
|
||||
CdmSecurityLevel level = kSecurityLevelL1;
|
||||
EXPECT_CALL(*crypto_session_, Open(Eq(kLevelDefault)))
|
||||
.InSequence(crypto_session_seq)
|
||||
.WillOnce(Return(NO_ERROR));
|
||||
EXPECT_CALL(*crypto_session_, GetSecurityLevel())
|
||||
.InSequence(crypto_session_seq)
|
||||
.WillOnce(Return(level));
|
||||
EXPECT_CALL(*crypto_session_, GetClientToken(NotNull()))
|
||||
.InSequence(crypto_session_seq)
|
||||
.WillOnce(DoAll(SetArgPointee<0>(kToken), Return(true)));
|
||||
EXPECT_CALL(*crypto_session_, GetPreProvisionTokenType())
|
||||
.WillOnce(Return(kClientTokenKeybox));
|
||||
EXPECT_CALL(*file_handle_, Init(Eq(level))).WillOnce(Return(true));
|
||||
EXPECT_CALL(*license_parser_,
|
||||
Init(NULL, Eq(kToken), Eq(kClientTokenKeybox),
|
||||
Eq(kEmptyString), Eq(crypto_session_), Eq(policy_engine_)))
|
||||
.WillOnce(Return(true));
|
||||
|
||||
Properties::set_use_certificates_as_identification(false);
|
||||
|
||||
ASSERT_EQ(NO_ERROR, cdm_session_->Init(NULL));
|
||||
}
|
||||
|
||||
@@ -268,12 +248,10 @@ TEST_F(CdmSessionTest, ReInitFail) {
|
||||
.InSequence(crypto_session_seq)
|
||||
.WillOnce(Return(true));
|
||||
EXPECT_CALL(*license_parser_,
|
||||
Init(NULL, Eq(kToken), Eq(kClientTokenDrmCert),
|
||||
Init(Eq(kToken), Eq(kClientTokenDrmCert), Eq(kEmptyString), false,
|
||||
Eq(kEmptyString), Eq(crypto_session_), Eq(policy_engine_)))
|
||||
.WillOnce(Return(true));
|
||||
|
||||
Properties::set_use_certificates_as_identification(true);
|
||||
|
||||
ASSERT_EQ(NO_ERROR, cdm_session_->Init(NULL));
|
||||
ASSERT_NE(NO_ERROR, cdm_session_->Init(NULL));
|
||||
}
|
||||
@@ -282,8 +260,6 @@ TEST_F(CdmSessionTest, InitFailCryptoError) {
|
||||
EXPECT_CALL(*crypto_session_, Open(Eq(kLevelDefault)))
|
||||
.WillOnce(Return(UNKNOWN_ERROR));
|
||||
|
||||
Properties::set_use_certificates_as_identification(true);
|
||||
|
||||
ASSERT_EQ(UNKNOWN_ERROR, cdm_session_->Init(NULL));
|
||||
}
|
||||
|
||||
@@ -303,8 +279,6 @@ TEST_F(CdmSessionTest, InitNeedsProvisioning) {
|
||||
NotNull(), _))
|
||||
.WillOnce(Return(false));
|
||||
|
||||
Properties::set_use_certificates_as_identification(true);
|
||||
|
||||
ASSERT_EQ(NEED_PROVISIONING, cdm_session_->Init(NULL));
|
||||
}
|
||||
|
||||
|
||||
@@ -15,11 +15,109 @@ namespace {
|
||||
|
||||
const std::string kWidevineKeySystem = "com.widevine.alpha";
|
||||
|
||||
// For staging servers
|
||||
// NOTE: This matches the service cert returned by the staging
|
||||
// server. This is the one that the staging provisioning server uses.
|
||||
// Content Protection license server (Production) data
|
||||
// Testing should not be directed at this server.
|
||||
const std::string kCpProductionLicenseServer =
|
||||
"https://widevine-proxy.appspot.com/proxy";
|
||||
// NOTE: Provider ID = staging.google.com
|
||||
const std::string kCpProductionServiceCertificate =
|
||||
"0ABF020803121028703454C008F63618ADE7443DB6C4C8188BE7F9900522"
|
||||
"8E023082010A0282010100B52112B8D05D023FCC5D95E2C251C1C649B417"
|
||||
"7CD8D2BEEF355BB06743DE661E3D2ABC3182B79946D55FDC08DFE9540781"
|
||||
"5E9A6274B322A2C7F5E067BB5F0AC07A89D45AEA94B2516F075B66EF811D"
|
||||
"0D26E1B9A6B894F2B9857962AA171C4F66630D3E4C602718897F5E1EF9B6"
|
||||
"AAF5AD4DBA2A7E14176DF134A1D3185B5A218AC05A4C41F081EFFF80A3A0"
|
||||
"40C50B09BBC740EEDCD8F14D675A91980F92CA7DDC646A06ADAD5101F74A"
|
||||
"0E498CC01F00532BAC217850BD905E90923656B7DFEFEF42486767F33EF6"
|
||||
"283D4F4254AB72589390BEE55808F1D668080D45D893C2BCA2F74D60A0C0"
|
||||
"D0A0993CEF01604703334C3638139486BC9DAF24FD67A07F9AD943020301"
|
||||
"00013A1273746167696E672E676F6F676C652E636F6D128003983E303526"
|
||||
"75F40BA715FC249BDAE5D4AC7249A2666521E43655739529721FF880E0AA"
|
||||
"EFC5E27BC980DAEADABF3FC386D084A02C82537848CC753FF497B011A7DA"
|
||||
"97788A00E2AA6B84CD7D71C07A48EBF61602CCA5A3F32030A7295C30DA91"
|
||||
"5B91DC18B9BC9593B8DE8BB50F0DEDC12938B8E9E039CDDE18FA82E81BB0"
|
||||
"32630FE955D85A566CE154300BF6D4C1BD126966356B287D657B18CE63D0"
|
||||
"EFD45FC5269E97EAB11CB563E55643B26FF49F109C2101AFCAF35B832F28"
|
||||
"8F0D9D45960E259E85FB5D24DBD2CF82764C5DD9BF727EFBE9C861F86932"
|
||||
"1F6ADE18905F4D92F9A6DA6536DB8475871D168E870BB2303CF70C6E9784"
|
||||
"C93D2DE845AD8262BE7E0D4E2E4A0759CEF82D109D2592C72429F8C01742"
|
||||
"BAE2B3DECADBC33C3E5F4BAF5E16ECB74EADBAFCB7C6705F7A9E3B6F3940"
|
||||
"383F9C5116D202A20C9229EE969C2519718303B50D0130C3352E06B014D8"
|
||||
"38540F8A0C227C0011E0F5B38E4E298ED2CB301EB4564965F55C5D79757A"
|
||||
"250A4EB9C84AB3E6539F6B6FDF56899EA29914";
|
||||
|
||||
// Content Protection license server (UAT) data
|
||||
// Testing should be directed to this server. The only exception
|
||||
// is when testing against a new server feature that is not yet
|
||||
// deployed to this server (which would be directed to staging).
|
||||
const std::string kCpUatLicenseServer =
|
||||
"https://proxy.uat.widevine.com/proxy";
|
||||
// TODO(rfrias): replace when b62880305 is addressed. For now use production URL
|
||||
const std::string kCpUatProvisioningServerUrl =
|
||||
"https://www.googleapis.com/"
|
||||
"certificateprovisioning/v1/devicecertificates/create"
|
||||
"?key=AIzaSyB-5OLKTx2iU5mko18DfdwK5611JIjbUhE";
|
||||
// NOTE: Provider ID = staging.google.com
|
||||
const std::string kCpUatServiceCertificate =
|
||||
"0ABF020803121028703454C008F63618ADE7443DB6C4C8188BE7F9900522"
|
||||
"8E023082010A0282010100B52112B8D05D023FCC5D95E2C251C1C649B417"
|
||||
"7CD8D2BEEF355BB06743DE661E3D2ABC3182B79946D55FDC08DFE9540781"
|
||||
"5E9A6274B322A2C7F5E067BB5F0AC07A89D45AEA94B2516F075B66EF811D"
|
||||
"0D26E1B9A6B894F2B9857962AA171C4F66630D3E4C602718897F5E1EF9B6"
|
||||
"AAF5AD4DBA2A7E14176DF134A1D3185B5A218AC05A4C41F081EFFF80A3A0"
|
||||
"40C50B09BBC740EEDCD8F14D675A91980F92CA7DDC646A06ADAD5101F74A"
|
||||
"0E498CC01F00532BAC217850BD905E90923656B7DFEFEF42486767F33EF6"
|
||||
"283D4F4254AB72589390BEE55808F1D668080D45D893C2BCA2F74D60A0C0"
|
||||
"D0A0993CEF01604703334C3638139486BC9DAF24FD67A07F9AD943020301"
|
||||
"00013A1273746167696E672E676F6F676C652E636F6D128003983E303526"
|
||||
"75F40BA715FC249BDAE5D4AC7249A2666521E43655739529721FF880E0AA"
|
||||
"EFC5E27BC980DAEADABF3FC386D084A02C82537848CC753FF497B011A7DA"
|
||||
"97788A00E2AA6B84CD7D71C07A48EBF61602CCA5A3F32030A7295C30DA91"
|
||||
"5B91DC18B9BC9593B8DE8BB50F0DEDC12938B8E9E039CDDE18FA82E81BB0"
|
||||
"32630FE955D85A566CE154300BF6D4C1BD126966356B287D657B18CE63D0"
|
||||
"EFD45FC5269E97EAB11CB563E55643B26FF49F109C2101AFCAF35B832F28"
|
||||
"8F0D9D45960E259E85FB5D24DBD2CF82764C5DD9BF727EFBE9C861F86932"
|
||||
"1F6ADE18905F4D92F9A6DA6536DB8475871D168E870BB2303CF70C6E9784"
|
||||
"C93D2DE845AD8262BE7E0D4E2E4A0759CEF82D109D2592C72429F8C01742"
|
||||
"BAE2B3DECADBC33C3E5F4BAF5E16ECB74EADBAFCB7C6705F7A9E3B6F3940"
|
||||
"383F9C5116D202A20C9229EE969C2519718303B50D0130C3352E06B014D8"
|
||||
"38540F8A0C227C0011E0F5B38E4E298ED2CB301EB4564965F55C5D79757A"
|
||||
"250A4EB9C84AB3E6539F6B6FDF56899EA29914";
|
||||
const std::string kCpClientAuth = "";
|
||||
const std::string kCpKeyId =
|
||||
"00000042" // blob size
|
||||
"70737368" // "pssh"
|
||||
"00000000" // flags
|
||||
"edef8ba979d64acea3c827dcd51d21ed" // Widevine system id
|
||||
"00000022" // pssh data size
|
||||
// pssh data:
|
||||
"08011a0d7769646576696e655f746573" // "streaming_clip1"
|
||||
"74220f73747265616d696e675f636c69"
|
||||
"7031";
|
||||
const std::string kCpOfflineKeyId =
|
||||
"00000040" // blob size
|
||||
"70737368" // "pssh"
|
||||
"00000000" // flags
|
||||
"edef8ba979d64acea3c827dcd51d21ed" // Widevine system id
|
||||
"00000020" // pssh data size
|
||||
// pssh data:
|
||||
"08011a0d7769646576696e655f746573" // "offline_clip2"
|
||||
"74220d6f66666c696e655f636c697032";
|
||||
|
||||
// Content Protection license server (staging) data.
|
||||
// The staging server should be used only when testing against
|
||||
// a new server (e.g., the client has a change that requires a
|
||||
// corresponding change to the server, but the server change has
|
||||
// not yet propagated to UAT). Normal testing should always be
|
||||
// directed to UAT.
|
||||
const std::string kCpStagingLicenseServer =
|
||||
"https://proxy.staging.widevine.com/proxy";
|
||||
const std::string kCpStagingProvisioningServerUrl =
|
||||
"https://staging-www.sandbox.googleapis.com/"
|
||||
"certificateprovisioning/v1/devicecertificates/create"
|
||||
"?key=AIzaSyB-5OLKTx2iU5mko18DfdwK5611JIjbUhE";
|
||||
// NOTE: Provider ID = license.widevine.com
|
||||
const std::string kStagingServiceCertificate =
|
||||
const std::string kCpStagingServiceCertificate =
|
||||
"0ac102080312101705b917cc1204868b06333a2f772a8c1882b482920522"
|
||||
"8e023082010a028201010099ed5b3b327dab5e24efc3b62a95b598520ad5"
|
||||
"bccb37503e0645b814d876b8df40510441ad8ce3adb11bb88c4e725a5e4a"
|
||||
@@ -44,95 +142,25 @@ const std::string kStagingServiceCertificate =
|
||||
"f9b4342cc8df543cb1a1182f7c5fff33f10490faca5b25360b76015e9c5a"
|
||||
"06ab8ee02f00d2e8d5986104aacc4dd475fd96ee9ce4e326f21b83c70585"
|
||||
"77b38732cddabc6a6bed13fb0d49d38a45eb87a5f4";
|
||||
|
||||
// NOTE: Provider ID = staging.google.com
|
||||
const std::string kProdServiceCertificate =
|
||||
"0ABF020803121028703454C008F63618ADE7443DB6C4C8188BE7F9900522"
|
||||
"8E023082010A0282010100B52112B8D05D023FCC5D95E2C251C1C649B417"
|
||||
"7CD8D2BEEF355BB06743DE661E3D2ABC3182B79946D55FDC08DFE9540781"
|
||||
"5E9A6274B322A2C7F5E067BB5F0AC07A89D45AEA94B2516F075B66EF811D"
|
||||
"0D26E1B9A6B894F2B9857962AA171C4F66630D3E4C602718897F5E1EF9B6"
|
||||
"AAF5AD4DBA2A7E14176DF134A1D3185B5A218AC05A4C41F081EFFF80A3A0"
|
||||
"40C50B09BBC740EEDCD8F14D675A91980F92CA7DDC646A06ADAD5101F74A"
|
||||
"0E498CC01F00532BAC217850BD905E90923656B7DFEFEF42486767F33EF6"
|
||||
"283D4F4254AB72589390BEE55808F1D668080D45D893C2BCA2F74D60A0C0"
|
||||
"D0A0993CEF01604703334C3638139486BC9DAF24FD67A07F9AD943020301"
|
||||
"00013A1273746167696E672E676F6F676C652E636F6D128003983E303526"
|
||||
"75F40BA715FC249BDAE5D4AC7249A2666521E43655739529721FF880E0AA"
|
||||
"EFC5E27BC980DAEADABF3FC386D084A02C82537848CC753FF497B011A7DA"
|
||||
"97788A00E2AA6B84CD7D71C07A48EBF61602CCA5A3F32030A7295C30DA91"
|
||||
"5B91DC18B9BC9593B8DE8BB50F0DEDC12938B8E9E039CDDE18FA82E81BB0"
|
||||
"32630FE955D85A566CE154300BF6D4C1BD126966356B287D657B18CE63D0"
|
||||
"EFD45FC5269E97EAB11CB563E55643B26FF49F109C2101AFCAF35B832F28"
|
||||
"8F0D9D45960E259E85FB5D24DBD2CF82764C5DD9BF727EFBE9C861F86932"
|
||||
"1F6ADE18905F4D92F9A6DA6536DB8475871D168E870BB2303CF70C6E9784"
|
||||
"C93D2DE845AD8262BE7E0D4E2E4A0759CEF82D109D2592C72429F8C01742"
|
||||
"BAE2B3DECADBC33C3E5F4BAF5E16ECB74EADBAFCB7C6705F7A9E3B6F3940"
|
||||
"383F9C5116D202A20C9229EE969C2519718303B50D0130C3352E06B014D8"
|
||||
"38540F8A0C227C0011E0F5B38E4E298ED2CB301EB4564965F55C5D79757A"
|
||||
"250A4EB9C84AB3E6539F6B6FDF56899EA29914";
|
||||
|
||||
// For UAT License servers
|
||||
// NOTE: This matches the service cert returned by the UAT server.
|
||||
// NOTE: Provider ID = staging.google.com
|
||||
const std::string kUatServiceCertificate =
|
||||
"0ABF020803121028703454C008F63618ADE7443DB6C4C8188BE7F9900522"
|
||||
"8E023082010A0282010100B52112B8D05D023FCC5D95E2C251C1C649B417"
|
||||
"7CD8D2BEEF355BB06743DE661E3D2ABC3182B79946D55FDC08DFE9540781"
|
||||
"5E9A6274B322A2C7F5E067BB5F0AC07A89D45AEA94B2516F075B66EF811D"
|
||||
"0D26E1B9A6B894F2B9857962AA171C4F66630D3E4C602718897F5E1EF9B6"
|
||||
"AAF5AD4DBA2A7E14176DF134A1D3185B5A218AC05A4C41F081EFFF80A3A0"
|
||||
"40C50B09BBC740EEDCD8F14D675A91980F92CA7DDC646A06ADAD5101F74A"
|
||||
"0E498CC01F00532BAC217850BD905E90923656B7DFEFEF42486767F33EF6"
|
||||
"283D4F4254AB72589390BEE55808F1D668080D45D893C2BCA2F74D60A0C0"
|
||||
"D0A0993CEF01604703334C3638139486BC9DAF24FD67A07F9AD943020301"
|
||||
"00013A1273746167696E672E676F6F676C652E636F6D128003983E303526"
|
||||
"75F40BA715FC249BDAE5D4AC7249A2666521E43655739529721FF880E0AA"
|
||||
"EFC5E27BC980DAEADABF3FC386D084A02C82537848CC753FF497B011A7DA"
|
||||
"97788A00E2AA6B84CD7D71C07A48EBF61602CCA5A3F32030A7295C30DA91"
|
||||
"5B91DC18B9BC9593B8DE8BB50F0DEDC12938B8E9E039CDDE18FA82E81BB0"
|
||||
"32630FE955D85A566CE154300BF6D4C1BD126966356B287D657B18CE63D0"
|
||||
"EFD45FC5269E97EAB11CB563E55643B26FF49F109C2101AFCAF35B832F28"
|
||||
"8F0D9D45960E259E85FB5D24DBD2CF82764C5DD9BF727EFBE9C861F86932"
|
||||
"1F6ADE18905F4D92F9A6DA6536DB8475871D168E870BB2303CF70C6E9784"
|
||||
"C93D2DE845AD8262BE7E0D4E2E4A0759CEF82D109D2592C72429F8C01742"
|
||||
"BAE2B3DECADBC33C3E5F4BAF5E16ECB74EADBAFCB7C6705F7A9E3B6F3940"
|
||||
"383F9C5116D202A20C9229EE969C2519718303B50D0130C3352E06B014D8"
|
||||
"38540F8A0C227C0011E0F5B38E4E298ED2CB301EB4564965F55C5D79757A"
|
||||
"250A4EB9C84AB3E6539F6B6FDF56899EA29914";
|
||||
|
||||
// Content Protection license server (Production) data
|
||||
const std::string kCpProdLicenseServer =
|
||||
"https://widevine-proxy.appspot.com/proxy";
|
||||
|
||||
// Content Protection license server (UAT) data
|
||||
const std::string kCpUatLicenseServer =
|
||||
"https://proxy.uat.widevine.com/proxy";
|
||||
|
||||
const std::string kCpClientAuth = "";
|
||||
const std::string kCpKeyId =
|
||||
"00000042" // blob size
|
||||
const CdmInitData kCpStagingSrmOuputProtectionRequired =
|
||||
"0000003d" // blob size
|
||||
"70737368" // "pssh"
|
||||
"00000000" // flags
|
||||
"edef8ba979d64acea3c827dcd51d21ed" // Widevine system id
|
||||
"00000022" // pssh data size
|
||||
"0000001d" // pssh data size
|
||||
// pssh data:
|
||||
"08011a0d7769646576696e655f746573"
|
||||
"74220f73747265616d696e675f636c69"
|
||||
"7031";
|
||||
const std::string kCpOfflineKeyId =
|
||||
"00000040" // blob size
|
||||
"74220a74656172735f73726d32"; // "tears_srm2"
|
||||
const CdmInitData kCpStagingSrmOuputProtectionRequested =
|
||||
"0000003d" // blob size
|
||||
"70737368" // "pssh"
|
||||
"00000000" // flags
|
||||
"edef8ba979d64acea3c827dcd51d21ed" // Widevine system id
|
||||
"00000020" // pssh data size
|
||||
"0000001d" // pssh data size
|
||||
// pssh data:
|
||||
"08011a0d7769646576696e655f746573"
|
||||
"74220d6f66666c696e655f636c697032";
|
||||
|
||||
// Content Protection license server (staging) data
|
||||
const std::string kCpStagingLicenseServer =
|
||||
"https://proxy.staging.widevine.com/proxy";
|
||||
"74220a74656172735f73726d32"; // "tears_srm1"
|
||||
const CdmInitData kEmptyData;
|
||||
|
||||
// Google Play license server data
|
||||
const std::string kGpLicenseServer =
|
||||
@@ -172,44 +200,25 @@ const std::string kWrongKeyId =
|
||||
"0901121094889920e8d6520098577df8"
|
||||
"f2dd5546";
|
||||
|
||||
// URL of provisioning server (overrides value from GetProvisioningRequest())
|
||||
const std::string kProductionProvisioningServerUrl =
|
||||
// Production provisioning server data
|
||||
const std::string kCpProductionProvisioningServerUrl =
|
||||
"https://www.googleapis.com/"
|
||||
"certificateprovisioning/v1/devicecertificates/create"
|
||||
"?key=AIzaSyB-5OLKTx2iU5mko18DfdwK5611JIjbUhE";
|
||||
|
||||
const std::string kStagingProvisioningServerUrl =
|
||||
"https://staging-www.sandbox.googleapis.com/"
|
||||
"certificateprovisioning/v1/devicecertificates/create"
|
||||
"?key=AIzaSyB-5OLKTx2iU5mko18DfdwK5611JIjbUhE";
|
||||
|
||||
const ConfigTestEnv::LicenseServerConfiguration license_servers[] = {
|
||||
{kGooglePlayServer, kGpLicenseServer, "", kGpClientAuth, kGpKeyId,
|
||||
kGpOfflineKeyId, kStagingProvisioningServerUrl, ""},
|
||||
|
||||
{kContentProtectionProdLicense, kCpProdLicenseServer,
|
||||
kProdServiceCertificate, kCpClientAuth, kCpKeyId, kCpOfflineKeyId,
|
||||
kProductionProvisioningServerUrl, kProdServiceCertificate},
|
||||
|
||||
{kContentProtectionUatLicense, kCpUatLicenseServer,
|
||||
kProdServiceCertificate, kCpClientAuth, kCpKeyId, kCpOfflineKeyId,
|
||||
kProductionProvisioningServerUrl, kProdServiceCertificate},
|
||||
|
||||
{kContentProtectionStagingLicense, kCpStagingLicenseServer,
|
||||
kProdServiceCertificate, kCpClientAuth, kCpKeyId, kCpOfflineKeyId,
|
||||
kStagingProvisioningServerUrl, kStagingServiceCertificate},
|
||||
|
||||
{kContentProtectionProdPlusProv30, kCpProdLicenseServer,
|
||||
kProdServiceCertificate, kCpClientAuth, kCpKeyId, kCpOfflineKeyId,
|
||||
kStagingProvisioningServerUrl, kStagingServiceCertificate},
|
||||
|
||||
{kContentProtectionUatPlusProv30, kCpUatLicenseServer,
|
||||
kProdServiceCertificate, kCpClientAuth, kCpKeyId, kCpOfflineKeyId,
|
||||
kStagingProvisioningServerUrl, kStagingServiceCertificate},
|
||||
|
||||
{kContentProtectionStagingPlusProv30, kCpStagingLicenseServer,
|
||||
kStagingServiceCertificate, kCpClientAuth, kCpKeyId, kCpOfflineKeyId,
|
||||
kStagingProvisioningServerUrl, kStagingServiceCertificate},
|
||||
{kGooglePlayServer, kGpLicenseServer, "", kGpClientAuth, kGpKeyId,
|
||||
kGpOfflineKeyId, kCpProductionProvisioningServerUrl, ""},
|
||||
{kContentProtectionUatServer, kCpUatLicenseServer, kCpUatServiceCertificate,
|
||||
kCpClientAuth, kCpKeyId, kCpOfflineKeyId, kCpUatProvisioningServerUrl,
|
||||
kCpUatServiceCertificate},
|
||||
{kContentProtectionStagingServer, kCpStagingLicenseServer,
|
||||
kCpStagingServiceCertificate, kCpClientAuth, kCpKeyId, kCpOfflineKeyId,
|
||||
kCpStagingProvisioningServerUrl, kCpStagingServiceCertificate},
|
||||
{kContentProtectionProductionServer, kCpProductionLicenseServer,
|
||||
kCpProductionServiceCertificate, kCpClientAuth, kCpKeyId,
|
||||
kCpOfflineKeyId, kCpProductionProvisioningServerUrl,
|
||||
kCpProductionServiceCertificate},
|
||||
};
|
||||
|
||||
} // namespace
|
||||
@@ -254,4 +263,35 @@ void ConfigTestEnv::Init(ServerConfigurationId server_id) {
|
||||
wrong_key_id_ = kWrongKeyId;
|
||||
}
|
||||
|
||||
const CdmInitData ConfigTestEnv::GetInitData(ContentId content_id) {
|
||||
switch (content_id) {
|
||||
case kContentIdStreaming:
|
||||
return wvcdm::a2bs_hex(kCpKeyId);
|
||||
case kContentIdOffline:
|
||||
return wvcdm::a2bs_hex(kCpOfflineKeyId);
|
||||
case kContentIdStagingSrmOuputProtectionRequested:
|
||||
return wvcdm::a2bs_hex(kCpStagingSrmOuputProtectionRequested);
|
||||
case kContentIdStagingSrmOuputProtectionRequired:
|
||||
return wvcdm::a2bs_hex(kCpStagingSrmOuputProtectionRequired);
|
||||
default:
|
||||
return kEmptyData;
|
||||
}
|
||||
}
|
||||
|
||||
const std::string& ConfigTestEnv::GetLicenseServerUrl(
|
||||
ServerConfigurationId server_configuration_id) {
|
||||
switch (server_configuration_id) {
|
||||
case kGooglePlayServer:
|
||||
return kGpLicenseServer;
|
||||
case kContentProtectionUatServer:
|
||||
return kCpUatLicenseServer;
|
||||
case kContentProtectionStagingServer:
|
||||
return kCpStagingLicenseServer;
|
||||
case kContentProtectionProductionServer:
|
||||
return kCpProductionLicenseServer;
|
||||
default:
|
||||
return kEmptyData;
|
||||
}
|
||||
}
|
||||
|
||||
} // namespace wvcdm
|
||||
|
||||
@@ -24,18 +24,25 @@
|
||||
// Useful configurations
|
||||
namespace wvcdm {
|
||||
typedef enum {
|
||||
kGooglePlayServer, // not tested recently
|
||||
kContentProtectionProdLicense,
|
||||
kContentProtectionUatLicense,
|
||||
kContentProtectionStagingLicense,
|
||||
kContentProtectionProdPlusProv30,
|
||||
kContentProtectionUatPlusProv30,
|
||||
kContentProtectionStagingPlusProv30,
|
||||
kGooglePlayServer,
|
||||
kContentProtectionUatServer,
|
||||
kContentProtectionStagingServer,
|
||||
kContentProtectionProductionServer,
|
||||
} ServerConfigurationId;
|
||||
|
||||
// Identifies content used in tests. Specify Prod/Uat/Staging if content
|
||||
// has been registered across license services.
|
||||
enum ContentId {
|
||||
kContentIdStreaming,
|
||||
kContentIdOffline,
|
||||
kContentIdStagingSrmOuputProtectionRequested,
|
||||
kContentIdStagingSrmOuputProtectionRequired,
|
||||
};
|
||||
|
||||
// Configures default test environment.
|
||||
class ConfigTestEnv {
|
||||
public:
|
||||
|
||||
typedef struct {
|
||||
ServerConfigurationId id;
|
||||
std::string license_server_url;
|
||||
@@ -68,6 +75,10 @@ class ConfigTestEnv {
|
||||
}
|
||||
const KeyId& wrong_key_id() const { return wrong_key_id_; }
|
||||
|
||||
static const CdmInitData GetInitData(ContentId content_id);
|
||||
static const std::string& GetLicenseServerUrl(
|
||||
ServerConfigurationId server_configuration_id);
|
||||
|
||||
void set_key_id(KeyId& key_id) { key_id_.assign(key_id); }
|
||||
void set_key_system(CdmKeySystem& key_system) {
|
||||
key_system_.assign(key_system);
|
||||
@@ -75,6 +86,9 @@ class ConfigTestEnv {
|
||||
void set_license_server(std::string& license_server) {
|
||||
license_server_.assign(license_server);
|
||||
}
|
||||
void set_provisioning_server(std::string& provisioning_server) {
|
||||
provisioning_server_.assign(provisioning_server);
|
||||
}
|
||||
|
||||
private:
|
||||
void Init(ServerConfigurationId server_id);
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -7,6 +7,7 @@
|
||||
|
||||
#include <arpa/inet.h>
|
||||
#include <gtest/gtest.h>
|
||||
#include <memory>
|
||||
#include <string>
|
||||
|
||||
#include "cdm_engine.h"
|
||||
@@ -15,6 +16,7 @@
|
||||
#include "log.h"
|
||||
#include "oec_session_util.h"
|
||||
#include "../../oemcrypto/mock/src/oemcrypto_key_mock.h"
|
||||
#include "properties.h"
|
||||
#include "string_conversions.h"
|
||||
#include "url_request.h"
|
||||
#include "wv_cdm_constants.h"
|
||||
@@ -28,73 +30,32 @@ std::string g_provisioning_server;
|
||||
std::string g_license_service_certificate;
|
||||
std::string g_provisioning_service_certificate;
|
||||
|
||||
/*
|
||||
* Locate the portion of the server's response message that is between
|
||||
* the strings jason_start_substr and json_end_substr. Returns the string
|
||||
* through *result. If the start substring match fails, assume the entire
|
||||
* string represents a serialized protobuf mesaage and return true with
|
||||
* the entire string. If the end_substring match fails, return false with
|
||||
* an empty *result.
|
||||
*/
|
||||
bool ExtractSignedMessage(const std::string& response,
|
||||
const std::string& json_start_substr,
|
||||
const std::string& json_end_substr,
|
||||
std::string* result) {
|
||||
std::string b64_string;
|
||||
size_t start = response.find(json_start_substr);
|
||||
|
||||
if (start == response.npos) {
|
||||
// Assume web safe protobuf
|
||||
b64_string.assign(response);
|
||||
} else {
|
||||
// Assume JSON-wrapped protobuf
|
||||
size_t end = response.find(json_end_substr,
|
||||
start + json_start_substr.length());
|
||||
if (end == response.npos) {
|
||||
LOGE("ExtractSignedMessage cannot locate end substring");
|
||||
result->clear();
|
||||
return false;
|
||||
}
|
||||
size_t b64_string_size = end - start - json_start_substr.length();
|
||||
b64_string.assign(response, start + json_start_substr.length(),
|
||||
b64_string_size);
|
||||
}
|
||||
|
||||
if (b64_string.empty()) {
|
||||
LOGE("Response message is empty");
|
||||
result->clear();
|
||||
return false;
|
||||
}
|
||||
|
||||
result->swap(b64_string);
|
||||
return true;
|
||||
}
|
||||
|
||||
} // namespace
|
||||
|
||||
namespace wvcdm {
|
||||
|
||||
class WvGenericOperationsTest : public testing::Test {
|
||||
public:
|
||||
WvGenericOperationsTest() : crypto_session_(NULL) {}
|
||||
|
||||
virtual void SetUp() {
|
||||
::testing::Test::SetUp();
|
||||
|
||||
ConfigTestEnv config(kContentProtectionStagingPlusProv30);
|
||||
ConfigTestEnv config(kContentProtectionStagingLicense);
|
||||
Properties::set_provisioning_messages_are_binary(false);
|
||||
|
||||
g_provisioning_service_certificate.assign(
|
||||
config.provisioning_service_certificate());
|
||||
g_license_service_certificate.assign(config.license_service_certificate());
|
||||
g_provisioning_server.assign(config.provisioning_server());
|
||||
|
||||
cdm_engine_ = NULL;
|
||||
|
||||
// TODO(fredgc or gmorgan): This should be updated for provisioning 3.0
|
||||
// Load test keybox. This keybox will be used by any CryptoSession
|
||||
// created by the CDM under test.
|
||||
ASSERT_EQ(OEMCrypto_SUCCESS, OEMCrypto_LoadTestKeybox());
|
||||
|
||||
// Perform CdmEngine setup
|
||||
cdm_engine_ = new CdmEngine(&file_system_);
|
||||
cdm_engine_.reset(new CdmEngine(&file_system_));
|
||||
|
||||
Provision();
|
||||
|
||||
@@ -122,7 +83,7 @@ class WvGenericOperationsTest : public testing::Test {
|
||||
|
||||
virtual void TearDown() {
|
||||
oec_util_session_.close();
|
||||
if (cdm_engine_ != NULL) {
|
||||
if (cdm_engine_.get() != NULL) {
|
||||
cdm_engine_->CloseSession(session_id_);
|
||||
}
|
||||
// OEMCrypto_Terminate() will be performed during the test class's
|
||||
@@ -216,7 +177,7 @@ class WvGenericOperationsTest : public testing::Test {
|
||||
protected:
|
||||
|
||||
virtual void Provision() {
|
||||
LOGE("WvCdmEnginePreProvTest::Provision: url=%s",
|
||||
LOGE("WvGenericOperationsTest::Provision: url=%s",
|
||||
g_provisioning_server.c_str());
|
||||
CdmProvisioningRequest prov_request;
|
||||
std::string provisioning_server_url;
|
||||
@@ -229,7 +190,7 @@ class WvGenericOperationsTest : public testing::Test {
|
||||
cert_type, cert_authority, &prov_request,
|
||||
&provisioning_server_url));
|
||||
|
||||
LOGV("WvCdmEnginePreProvTest::Provision: req=%s", prov_request.c_str());
|
||||
LOGV("WvGenericOperationsTest::Provision: req=%s", prov_request.c_str());
|
||||
|
||||
// Ignore URL provided by CdmEngine. Use ours, as configured
|
||||
// for test vs. production server.
|
||||
@@ -241,28 +202,14 @@ class WvGenericOperationsTest : public testing::Test {
|
||||
bool ok = url_request.GetResponse(&http_message);
|
||||
EXPECT_TRUE(ok);
|
||||
|
||||
LOGV("WvCdmEnginePreProvTest::Provision: http_message: \n%s\n",
|
||||
LOGV("WvGenericOperationsTest::Provision: http_message: \n%s\n",
|
||||
http_message.c_str());
|
||||
|
||||
// extract provisioning response from received message
|
||||
// Extracts signed response from JSON string, decodes base64 signed response
|
||||
const std::string kMessageStart = "\"signedResponse\": \"";
|
||||
const std::string kMessageEnd = "\"";
|
||||
std::string base64_response;
|
||||
EXPECT_TRUE (ExtractSignedMessage(http_message, kMessageStart, kMessageEnd,
|
||||
&base64_response)) <<
|
||||
"Failed to extract signed serialized response from JSON response";
|
||||
|
||||
LOGV("WvCdmEnginePreProvTest::Provision: extracted response "
|
||||
"message: \n%s\n", base64_response.c_str());
|
||||
|
||||
ASSERT_EQ(NO_ERROR,
|
||||
cdm_engine_->HandleProvisioningResponse(base64_response,
|
||||
cdm_engine_->HandleProvisioningResponse(http_message,
|
||||
&cert, &wrapped_key));
|
||||
|
||||
ASSERT_EQ(NO_ERROR,
|
||||
cdm_engine_->SetServiceCertificate(
|
||||
g_license_service_certificate));
|
||||
cdm_engine_->SetServiceCertificate(g_license_service_certificate));
|
||||
}
|
||||
|
||||
// This CryptoSession object handles Initialization and Termination
|
||||
@@ -272,7 +219,7 @@ class WvGenericOperationsTest : public testing::Test {
|
||||
CryptoSession crypto_session_;
|
||||
|
||||
FileSystem file_system_;
|
||||
CdmEngine* cdm_engine_;
|
||||
std::unique_ptr<CdmEngine> cdm_engine_;
|
||||
std::string key_msg_;
|
||||
std::string session_id_;
|
||||
std::string server_url_;
|
||||
@@ -309,7 +256,7 @@ TEST_F(WvGenericOperationsTest, GenericEncryptNoKey) {
|
||||
cdm_sts = cdm_engine_->GenericEncrypt(session_id_, in_buffer, key_id, iv,
|
||||
wvcdm::kEncryptionAlgorithmAesCbc128,
|
||||
&out_buffer);
|
||||
EXPECT_EQ(KEY_ERROR_1, cdm_sts);
|
||||
EXPECT_EQ(NO_CONTENT_KEY_2, cdm_sts);
|
||||
}
|
||||
|
||||
TEST_F(WvGenericOperationsTest, GenericEncryptKeyNotAllowed) {
|
||||
|
||||
@@ -2,6 +2,7 @@
|
||||
|
||||
#include "http_socket.h"
|
||||
|
||||
#include <cstring>
|
||||
#include <errno.h>
|
||||
#include <fcntl.h>
|
||||
#include <netdb.h>
|
||||
@@ -36,13 +37,14 @@ bool Tokenize(const std::string& source, const std::string& delim,
|
||||
}
|
||||
|
||||
SSL_CTX* InitSslContext() {
|
||||
const SSL_METHOD* method;
|
||||
SSL_CTX* ctx;
|
||||
|
||||
OpenSSL_add_all_algorithms();
|
||||
SSL_load_error_strings();
|
||||
method = TLSv1_2_client_method();
|
||||
ctx = SSL_CTX_new(method);
|
||||
#if (OPENSSL_VERSION_NUMBER < 0x10100000L)
|
||||
const SSL_METHOD* method = TLSv1_2_client_method();
|
||||
#else
|
||||
const SSL_METHOD* method = TLS_client_method();
|
||||
#endif
|
||||
SSL_CTX* ctx = SSL_CTX_new(method);
|
||||
if (!ctx) LOGE("failed to create SSL context");
|
||||
int ret = SSL_CTX_set_cipher_list(
|
||||
ctx, "ALL:!RC4-MD5:!RC4-SHA:!ECDHE-ECDSA-RC4-SHA:!ECDHE-RSA-RC4-SHA");
|
||||
|
||||
@@ -420,6 +420,11 @@ class HlsParseTest : public ::testing::TestWithParam<HlsAttributeVariant> {};
|
||||
class HlsTest : public ::testing::Test {};
|
||||
} // namespace
|
||||
|
||||
TEST_F(InitializationDataTest, BadType) {
|
||||
InitializationData init_data("bad", kSubLicensePsshBox);
|
||||
EXPECT_TRUE(init_data.IsEmpty());
|
||||
}
|
||||
|
||||
TEST_P(InitializationDataTest, Parse) {
|
||||
InitializationData init_data(ISO_BMFF_VIDEO_MIME_TYPE, GetParam());
|
||||
EXPECT_FALSE(init_data.IsEmpty());
|
||||
@@ -431,21 +436,22 @@ INSTANTIATE_TEST_CASE_P(
|
||||
kWidevinePsshAfterV0Pssh, kWidevinePsshAfterNonZeroFlags,
|
||||
kWidevinePsshAfterV1Pssh, kWidevineV1Pssh, kOtherBoxFirst,
|
||||
kZeroSizedPsshBox, kSubLicensePsshBox));
|
||||
|
||||
TEST_F(InitializationDataTest, ExtractSubLicense) {
|
||||
InitializationData init_data(ISO_BMFF_VIDEO_MIME_TYPE, kSubLicensePsshBox);
|
||||
EXPECT_FALSE(init_data.IsEmpty());
|
||||
ASSERT_FALSE(init_data.IsEmpty());
|
||||
std::vector<video_widevine::SubLicense> keys =
|
||||
init_data.ExtractEmbeddedKeys();
|
||||
ASSERT_EQ(keys.size(), 2UL);
|
||||
ASSERT_EQ(keys[0].sub_session_key_id(), "sub_session_key_id_0");
|
||||
ASSERT_EQ(keys[1].sub_session_key_id(), "sub_session_key_id_1");
|
||||
ASSERT_EQ(keys[0].key_msg(), "sub_license_0");
|
||||
ASSERT_EQ(keys[1].key_msg(), "sub_license_1");
|
||||
EXPECT_EQ(keys[0].sub_session_key_id(), "sub_session_key_id_0");
|
||||
EXPECT_EQ(keys[1].sub_session_key_id(), "sub_session_key_id_1");
|
||||
EXPECT_EQ(keys[0].key_msg(), "sub_license_0");
|
||||
EXPECT_EQ(keys[1].key_msg(), "sub_license_1");
|
||||
}
|
||||
|
||||
TEST_F(InitializationDataTest, ExtractEmptySubLicense) {
|
||||
InitializationData init_data(ISO_BMFF_VIDEO_MIME_TYPE, kWidevinePssh);
|
||||
EXPECT_FALSE(init_data.IsEmpty());
|
||||
ASSERT_FALSE(init_data.IsEmpty());
|
||||
std::vector<video_widevine::SubLicense> keys =
|
||||
init_data.ExtractEmbeddedKeys();
|
||||
ASSERT_TRUE(keys.empty());
|
||||
|
||||
@@ -3,6 +3,8 @@
|
||||
#include <gmock/gmock.h>
|
||||
#include <gtest/gtest.h>
|
||||
|
||||
#include <memory>
|
||||
|
||||
#include "clock.h"
|
||||
#include "crypto_session.h"
|
||||
#include "initialization_data.h"
|
||||
@@ -34,6 +36,33 @@ const std::string kCryptoRequestId = a2bs_hex(
|
||||
"4341444542353737444337393044394330313030303030303030303030303030");
|
||||
const uint32_t kNonce = 0x49e81305;
|
||||
const int64_t kLicenseStartTime = 1413517500; // ~ 01/01/2013
|
||||
const std::string kEmptyServiceCertificate;
|
||||
const std::string kInvalidServiceCertificate = "0b";
|
||||
const std::string kDefaultServiceCertificate = a2bs_hex(
|
||||
"0ABF020803121028703454C008F63618ADE7443DB6C4C8188BE7F9900522"
|
||||
"8E023082010A0282010100B52112B8D05D023FCC5D95E2C251C1C649B417"
|
||||
"7CD8D2BEEF355BB06743DE661E3D2ABC3182B79946D55FDC08DFE9540781"
|
||||
"5E9A6274B322A2C7F5E067BB5F0AC07A89D45AEA94B2516F075B66EF811D"
|
||||
"0D26E1B9A6B894F2B9857962AA171C4F66630D3E4C602718897F5E1EF9B6"
|
||||
"AAF5AD4DBA2A7E14176DF134A1D3185B5A218AC05A4C41F081EFFF80A3A0"
|
||||
"40C50B09BBC740EEDCD8F14D675A91980F92CA7DDC646A06ADAD5101F74A"
|
||||
"0E498CC01F00532BAC217850BD905E90923656B7DFEFEF42486767F33EF6"
|
||||
"283D4F4254AB72589390BEE55808F1D668080D45D893C2BCA2F74D60A0C0"
|
||||
"D0A0993CEF01604703334C3638139486BC9DAF24FD67A07F9AD943020301"
|
||||
"00013A1273746167696E672E676F6F676C652E636F6D128003983E303526"
|
||||
"75F40BA715FC249BDAE5D4AC7249A2666521E43655739529721FF880E0AA"
|
||||
"EFC5E27BC980DAEADABF3FC386D084A02C82537848CC753FF497B011A7DA"
|
||||
"97788A00E2AA6B84CD7D71C07A48EBF61602CCA5A3F32030A7295C30DA91"
|
||||
"5B91DC18B9BC9593B8DE8BB50F0DEDC12938B8E9E039CDDE18FA82E81BB0"
|
||||
"32630FE955D85A566CE154300BF6D4C1BD126966356B287D657B18CE63D0"
|
||||
"EFD45FC5269E97EAB11CB563E55643B26FF49F109C2101AFCAF35B832F28"
|
||||
"8F0D9D45960E259E85FB5D24DBD2CF82764C5DD9BF727EFBE9C861F86932"
|
||||
"1F6ADE18905F4D92F9A6DA6536DB8475871D168E870BB2303CF70C6E9784"
|
||||
"C93D2DE845AD8262BE7E0D4E2E4A0759CEF82D109D2592C72429F8C01742"
|
||||
"BAE2B3DECADBC33C3E5F4BAF5E16ECB74EADBAFCB7C6705F7A9E3B6F3940"
|
||||
"383F9C5116D202A20C9229EE969C2519718303B50D0130C3352E06B014D8"
|
||||
"38540F8A0C227C0011E0F5B38E4E298ED2CB301EB4564965F55C5D79757A"
|
||||
"250A4EB9C84AB3E6539F6B6FDF56899EA29914");
|
||||
const std::string kToken = a2bs_hex(
|
||||
"0AAE02080212107E0A892DEEB021E7AF696B938BB1D5B1188B85AD9D05228E023082010A02"
|
||||
"82010100DBEDF2BFB0EC98213766E65049B9AB176FA4B1FBFBB2A0C96C87D9F2B895E0ED77"
|
||||
@@ -105,12 +134,21 @@ const std::string kSubSessionKeyID2 =
|
||||
const std::string kSubSessionKeyID3 =
|
||||
a2bs_hex("21cdec9b2105c6b643e71f68e5302c85");
|
||||
|
||||
const CryptoSession::SupportedCertificateTypes kDefaultSupportedCertTypes = {
|
||||
true,
|
||||
true,
|
||||
true
|
||||
};
|
||||
|
||||
class MockCryptoSession : public CryptoSession {
|
||||
public:
|
||||
MockCryptoSession(metrics::CryptoMetrics* crypto_metrics)
|
||||
: CryptoSession(crypto_metrics) { }
|
||||
MOCK_METHOD0(IsOpen, bool());
|
||||
MOCK_METHOD1(GenerateRequestId, bool(std::string*));
|
||||
MOCK_METHOD1(UsageInformationSupport, bool(bool*));
|
||||
MOCK_METHOD2(GetHdcpCapabilities, bool(HdcpCapability*, HdcpCapability*));
|
||||
MOCK_METHOD1(GetSupportedCertificateTypes, bool(SupportedCertificateTypes*));
|
||||
MOCK_METHOD1(GetApiVersion, bool(uint32_t*));
|
||||
MOCK_METHOD1(GenerateNonce, bool(uint32_t*));
|
||||
MOCK_METHOD3(PrepareRequest, bool(const std::string&, bool, std::string*));
|
||||
@@ -152,6 +190,7 @@ using ::testing::Eq;
|
||||
using ::testing::NotNull;
|
||||
using ::testing::Return;
|
||||
using ::testing::SetArgPointee;
|
||||
using ::testing::UnorderedElementsAre;
|
||||
|
||||
class CdmLicenseTest : public ::testing::Test {
|
||||
protected:
|
||||
@@ -159,9 +198,13 @@ class CdmLicenseTest : public ::testing::Test {
|
||||
: pssh_(pssh) {}
|
||||
virtual void SetUp() {
|
||||
clock_ = new MockClock();
|
||||
crypto_session_ = new testing::StrictMock<MockCryptoSession>();
|
||||
crypto_session_ = new MockCryptoSession(&crypto_metrics_);
|
||||
init_data_ = new MockInitializationData(CENC_INIT_DATA_FORMAT, pssh_);
|
||||
policy_engine_ = new MockPolicyEngine(crypto_session_);
|
||||
|
||||
ON_CALL(*crypto_session_, GetSupportedCertificateTypes(NotNull()))
|
||||
.WillByDefault(
|
||||
DoAll(SetArgPointee<0>(kDefaultSupportedCertTypes), Return(true)));
|
||||
}
|
||||
|
||||
virtual void TearDown() {
|
||||
@@ -179,10 +222,10 @@ class CdmLicenseTest : public ::testing::Test {
|
||||
|
||||
CdmLicense* cdm_license_;
|
||||
MockClock* clock_;
|
||||
metrics::CryptoMetrics crypto_metrics_;
|
||||
MockCryptoSession* crypto_session_;
|
||||
MockInitializationData* init_data_;
|
||||
MockPolicyEngine* policy_engine_;
|
||||
ServiceCertificate service_cert_;
|
||||
std::string pssh_;
|
||||
};
|
||||
|
||||
@@ -195,37 +238,60 @@ TEST_F(CdmLicenseTest, InitSuccess) {
|
||||
EXPECT_CALL(*crypto_session_, IsOpen()).WillOnce(Return(true));
|
||||
|
||||
CreateCdmLicense();
|
||||
EXPECT_TRUE(cdm_license_->Init(
|
||||
&service_cert_, kToken, kClientTokenDrmCert, kEmptyString,
|
||||
crypto_session_, policy_engine_));
|
||||
EXPECT_TRUE(cdm_license_->Init(kToken, kClientTokenDrmCert, kEmptyString,
|
||||
false, kEmptyServiceCertificate,
|
||||
crypto_session_, policy_engine_));
|
||||
}
|
||||
|
||||
TEST_F(CdmLicenseTest, InitFail_EmptyToken) {
|
||||
CreateCdmLicense();
|
||||
EXPECT_FALSE(cdm_license_->Init(&service_cert_, "", kClientTokenDrmCert,
|
||||
"", crypto_session_, policy_engine_));
|
||||
EXPECT_FALSE(cdm_license_->Init("", kClientTokenDrmCert, "", false,
|
||||
kEmptyServiceCertificate, crypto_session_,
|
||||
policy_engine_));
|
||||
}
|
||||
|
||||
TEST_F(CdmLicenseTest, InitFail_CryptoSessionNull) {
|
||||
CreateCdmLicense();
|
||||
EXPECT_FALSE(cdm_license_->Init(&service_cert_, kToken, kClientTokenDrmCert,
|
||||
"", NULL, policy_engine_));
|
||||
EXPECT_FALSE(cdm_license_->Init(kToken, kClientTokenDrmCert, "", false,
|
||||
kEmptyServiceCertificate, NULL,
|
||||
policy_engine_));
|
||||
}
|
||||
|
||||
TEST_F(CdmLicenseTest, InitFail_PolicyEngineNull) {
|
||||
EXPECT_CALL(*crypto_session_, IsOpen()).WillOnce(Return(true));
|
||||
|
||||
CreateCdmLicense();
|
||||
EXPECT_FALSE(cdm_license_->Init(&service_cert_, kToken, kClientTokenDrmCert,
|
||||
"", crypto_session_, NULL));
|
||||
EXPECT_FALSE(cdm_license_->Init(kToken, kClientTokenDrmCert, "", false,
|
||||
kEmptyServiceCertificate, crypto_session_,
|
||||
NULL));
|
||||
}
|
||||
|
||||
TEST_F(CdmLicenseTest, InitWithNullServiceCert) {
|
||||
TEST_F(CdmLicenseTest, InitWithEmptyServiceCert) {
|
||||
EXPECT_CALL(*crypto_session_, IsOpen()).WillOnce(Return(true));
|
||||
|
||||
CreateCdmLicense();
|
||||
EXPECT_TRUE(cdm_license_->Init(NULL, kToken, kClientTokenDrmCert,
|
||||
"", crypto_session_, policy_engine_));
|
||||
EXPECT_EQ(cdm_license_->Init(kToken, kClientTokenDrmCert, "", true,
|
||||
kEmptyServiceCertificate, crypto_session_,
|
||||
policy_engine_),
|
||||
Properties::allow_service_certificate_requests());
|
||||
}
|
||||
|
||||
TEST_F(CdmLicenseTest, InitWithInvalidServiceCert) {
|
||||
EXPECT_CALL(*crypto_session_, IsOpen()).WillOnce(Return(true));
|
||||
|
||||
CreateCdmLicense();
|
||||
EXPECT_FALSE(cdm_license_->Init(kToken, kClientTokenDrmCert, "", true,
|
||||
kInvalidServiceCertificate, crypto_session_,
|
||||
policy_engine_));
|
||||
}
|
||||
|
||||
TEST_F(CdmLicenseTest, InitWithServiceCert) {
|
||||
EXPECT_CALL(*crypto_session_, IsOpen()).WillOnce(Return(true));
|
||||
|
||||
CreateCdmLicense();
|
||||
EXPECT_TRUE(cdm_license_->Init(kToken, kClientTokenDrmCert, "", true,
|
||||
kDefaultServiceCertificate, crypto_session_,
|
||||
policy_engine_));
|
||||
}
|
||||
|
||||
TEST_F(CdmLicenseTest, PrepareKeyRequestValidation) {
|
||||
@@ -244,6 +310,7 @@ TEST_F(CdmLicenseTest, PrepareKeyRequestValidation) {
|
||||
EXPECT_CALL(*crypto_session_, GetHdcpCapabilities(NotNull(), NotNull()))
|
||||
.WillOnce(DoAll(SetArgPointee<0>(current_hdcp_version),
|
||||
SetArgPointee<1>(max_hdcp_version), Return(true)));
|
||||
EXPECT_CALL(*crypto_session_, GetSupportedCertificateTypes(NotNull()));
|
||||
EXPECT_CALL(*crypto_session_, GetApiVersion(NotNull()))
|
||||
.WillOnce(
|
||||
DoAll(SetArgPointee<0>(crypto_session_api_version), Return(true)));
|
||||
@@ -255,15 +322,12 @@ TEST_F(CdmLicenseTest, PrepareKeyRequestValidation) {
|
||||
DoAll(SetArgPointee<2>(kLicenseRequestSignature), Return(true)));
|
||||
|
||||
CreateCdmLicense();
|
||||
// TODO(gmorgan) fix below - no default service certificate
|
||||
//service_cert_.Init(kDefaultServiceCertificate);
|
||||
EXPECT_TRUE(cdm_license_->Init(
|
||||
&service_cert_, kToken, kClientTokenDrmCert, kEmptyString,
|
||||
crypto_session_, policy_engine_));
|
||||
kToken, kClientTokenDrmCert, kEmptyString, true,
|
||||
kDefaultServiceCertificate, crypto_session_, policy_engine_));
|
||||
|
||||
CdmAppParameterMap app_parameters;
|
||||
CdmKeyMessage signed_request;
|
||||
Properties::set_use_certificates_as_identification(true);
|
||||
std::string server_url;
|
||||
EXPECT_EQ(cdm_license_->PrepareKeyRequest(
|
||||
*init_data_, kLicenseTypeStreaming, app_parameters,
|
||||
@@ -315,6 +379,14 @@ TEST_F(CdmLicenseTest, PrepareKeyRequestValidation) {
|
||||
EXPECT_EQ(crypto_session_api_version,
|
||||
client_capabilities.oem_crypto_api_version());
|
||||
|
||||
EXPECT_THAT(
|
||||
client_capabilities.supported_certificate_key_type(),
|
||||
UnorderedElementsAre(
|
||||
video_widevine::
|
||||
ClientIdentification_ClientCapabilities_CertificateKeyType_RSA_2048,
|
||||
video_widevine::
|
||||
ClientIdentification_ClientCapabilities_CertificateKeyType_RSA_3072));
|
||||
|
||||
// Verify Content Identification
|
||||
const LicenseRequest_ContentIdentification& content_id =
|
||||
license_request.content_id();
|
||||
@@ -363,6 +435,7 @@ TEST_F(SubLicenseTest, VerifySubSessionData) {
|
||||
EXPECT_CALL(*crypto_session_, PrepareRequest(_, Eq(false), NotNull()))
|
||||
.WillOnce(
|
||||
DoAll(SetArgPointee<2>(kLicenseRequestSignature), Return(true)));
|
||||
EXPECT_CALL(*crypto_session_, GetSupportedCertificateTypes(NotNull()));
|
||||
|
||||
// SubLicense session data calls.
|
||||
// TODO(jfore): These calls are being invoked twice each. This should not
|
||||
@@ -381,14 +454,11 @@ TEST_F(SubLicenseTest, VerifySubSessionData) {
|
||||
DoAll(SetArgPointee<1>(true), SetArgPointee<2>(2), Return(true)));
|
||||
|
||||
CreateCdmLicense();
|
||||
// TODO(gmorgan) fix below - no default service certificate
|
||||
//service_cert_.Init(kDefaultServiceCertificate);
|
||||
EXPECT_TRUE(cdm_license_->Init(
|
||||
&service_cert_, kToken, kClientTokenDrmCert, kEmptyString,
|
||||
crypto_session_, policy_engine_));
|
||||
kToken, kClientTokenDrmCert, kEmptyString, true,
|
||||
kDefaultServiceCertificate, crypto_session_, policy_engine_));
|
||||
CdmAppParameterMap app_parameters;
|
||||
CdmKeyMessage signed_request;
|
||||
Properties::set_use_certificates_as_identification(true);
|
||||
std::string server_url;
|
||||
EXPECT_EQ(cdm_license_->PrepareKeyRequest(*init_data_, kLicenseTypeStreaming,
|
||||
app_parameters, &signed_request,
|
||||
@@ -405,7 +475,7 @@ TEST_F(SubLicenseTest, VerifySubSessionData) {
|
||||
for (int i = 0; i < license_request.sub_session_data().size(); ++i) {
|
||||
const video_widevine::LicenseRequest_SubSessionData& sl =
|
||||
license_request.sub_session_data(i);
|
||||
EXPECT_EQ(static_cast<uint32_t>(i), sl.nonce());
|
||||
EXPECT_EQ(static_cast<unsigned>(i), sl.nonce());
|
||||
switch (i) {
|
||||
case 0:
|
||||
EXPECT_EQ(kSubSessionKeyID1, sl.sub_session_key_id());
|
||||
|
||||
@@ -5,6 +5,7 @@
|
||||
|
||||
#include "crypto_session.h"
|
||||
#include "license.h"
|
||||
#include "metrics_collections.h"
|
||||
#include "policy_engine.h"
|
||||
#include "mock_clock.h"
|
||||
#include "scoped_ptr.h"
|
||||
@@ -61,6 +62,9 @@ const int64_t kHdcpInterval = 10;
|
||||
|
||||
class HdcpOnlyMockCryptoSession : public CryptoSession {
|
||||
public:
|
||||
HdcpOnlyMockCryptoSession(metrics::CryptoMetrics* crypto_metrics)
|
||||
: CryptoSession(crypto_metrics) { }
|
||||
|
||||
MOCK_METHOD2(GetHdcpCapabilities, bool(HdcpCapability*, HdcpCapability*));
|
||||
};
|
||||
|
||||
@@ -77,9 +81,13 @@ class MockCdmEventListener : public WvCdmEventListener {
|
||||
} // namespace
|
||||
|
||||
class PolicyEngineConstraintsTest : public Test {
|
||||
public:
|
||||
PolicyEngineConstraintsTest() :
|
||||
crypto_session_(&dummy_metrics_) {
|
||||
}
|
||||
|
||||
protected:
|
||||
virtual void SetUp() {
|
||||
mock_clock_ = new NiceMock<MockClock>();
|
||||
current_time_ = 0;
|
||||
|
||||
policy_engine_.reset(new PolicyEngine(kSessionId, &mock_event_listener_,
|
||||
@@ -205,6 +213,7 @@ class PolicyEngineConstraintsTest : public Test {
|
||||
scoped_ptr<PolicyEngine> policy_engine_;
|
||||
MockClock* mock_clock_;
|
||||
int64_t current_time_;
|
||||
metrics::CryptoMetrics dummy_metrics_;
|
||||
StrictMock<HdcpOnlyMockCryptoSession> crypto_session_;
|
||||
StrictMock<MockCdmEventListener> mock_event_listener_;
|
||||
License license_;
|
||||
|
||||
@@ -56,7 +56,14 @@ int64_t ParseInt(const std::string& str) {
|
||||
|
||||
class HdcpOnlyMockCryptoSession : public CryptoSession {
|
||||
public:
|
||||
HdcpOnlyMockCryptoSession(metrics::CryptoMetrics* metrics) :
|
||||
CryptoSession(metrics) {}
|
||||
|
||||
MOCK_METHOD2(GetHdcpCapabilities, bool(HdcpCapability*, HdcpCapability*));
|
||||
bool DoRealGetHdcpCapabilities(HdcpCapability* current,
|
||||
HdcpCapability* max) {
|
||||
return CryptoSession::GetHdcpCapabilities(current, max);
|
||||
}
|
||||
};
|
||||
|
||||
class MockCdmEventListener : public WvCdmEventListener {
|
||||
@@ -82,6 +89,7 @@ using video_widevine::OFFLINE;
|
||||
using ::testing::_;
|
||||
using ::testing::AtLeast;
|
||||
using ::testing::InSequence;
|
||||
using ::testing::Invoke;
|
||||
using ::testing::MockFunction;
|
||||
using ::testing::Pair;
|
||||
using ::testing::Return;
|
||||
@@ -89,6 +97,9 @@ using ::testing::StrictMock;
|
||||
using ::testing::UnorderedElementsAre;
|
||||
|
||||
class PolicyEngineTest : public ::testing::Test {
|
||||
public:
|
||||
PolicyEngineTest() : crypto_session_(&dummy_metrics_) {
|
||||
}
|
||||
protected:
|
||||
virtual void SetUp() {
|
||||
policy_engine_.reset(
|
||||
@@ -122,6 +133,12 @@ class PolicyEngineTest : public ::testing::Test {
|
||||
policy->set_renewal_delay_seconds(0);
|
||||
policy->set_renewal_retry_interval_seconds(kLicenseRenewalRetryInterval);
|
||||
policy->set_renew_with_usage(false);
|
||||
|
||||
ON_CALL(crypto_session_, GetHdcpCapabilities(_, _))
|
||||
.WillByDefault(
|
||||
Invoke(
|
||||
&crypto_session_,
|
||||
&HdcpOnlyMockCryptoSession::DoRealGetHdcpCapabilities));
|
||||
}
|
||||
|
||||
void InjectMockClock() {
|
||||
@@ -149,7 +166,8 @@ class PolicyEngineTest : public ::testing::Test {
|
||||
expected_has_new_usable_key));
|
||||
}
|
||||
|
||||
StrictMock<HdcpOnlyMockCryptoSession> crypto_session_;
|
||||
metrics::CryptoMetrics dummy_metrics_;
|
||||
NiceMock<HdcpOnlyMockCryptoSession> crypto_session_;
|
||||
StrictMock<MockCdmEventListener> mock_event_listener_;
|
||||
MockClock* mock_clock_;
|
||||
scoped_ptr<PolicyEngine> policy_engine_;
|
||||
@@ -596,6 +614,128 @@ TEST_F(PolicyEngineTest, PlaybackOk_PlaybackAndRental0) {
|
||||
EXPECT_FALSE(policy_engine_->CanDecryptContent(kSomeRandomKeyId));
|
||||
}
|
||||
|
||||
TEST_F(PolicyEngineTest, PlaybackOk_PlaybackAndLicense0_WithoutPlayback) {
|
||||
License_Policy* policy = license_.mutable_policy();
|
||||
policy->clear_license_duration_seconds();
|
||||
policy->clear_playback_duration_seconds();
|
||||
// Only |rental_duration_seconds| set.
|
||||
|
||||
EXPECT_CALL(*mock_clock_, GetCurrentTime())
|
||||
.WillOnce(Return(kLicenseStartTime + 1))
|
||||
.WillOnce(Return(kLicenseStartTime + 10))
|
||||
.WillOnce(Return(kLicenseStartTime + kRentalDuration - 10))
|
||||
.WillOnce(Return(kLicenseStartTime + kRentalDuration + 10));
|
||||
|
||||
ExpectSessionKeysChange(kKeyStatusExpired, false);
|
||||
ExpectSessionKeysChange(kKeyStatusUsable, true);
|
||||
EXPECT_CALL(mock_event_listener_,
|
||||
OnExpirationUpdate(_, kLicenseStartTime + kRentalDuration));
|
||||
|
||||
policy_engine_->SetLicense(license_);
|
||||
policy_engine_->OnTimerEvent();
|
||||
|
||||
EXPECT_TRUE(policy_engine_->CanDecryptContent(kKeyId));
|
||||
EXPECT_FALSE(policy_engine_->CanDecryptContent(kSomeRandomKeyId));
|
||||
|
||||
policy_engine_->OnTimerEvent();
|
||||
|
||||
EXPECT_TRUE(policy_engine_->CanDecryptContent(kKeyId));
|
||||
EXPECT_FALSE(policy_engine_->CanDecryptContent(kSomeRandomKeyId));
|
||||
|
||||
policy_engine_->OnTimerEvent();
|
||||
|
||||
EXPECT_FALSE(policy_engine_->CanDecryptContent(kKeyId));
|
||||
EXPECT_FALSE(policy_engine_->CanDecryptContent(kSomeRandomKeyId));
|
||||
}
|
||||
|
||||
TEST_F(PolicyEngineTest, PlaybackOk_PlaybackAndLicense0_WithPlayback) {
|
||||
License_Policy* policy = license_.mutable_policy();
|
||||
policy->clear_license_duration_seconds();
|
||||
policy->clear_playback_duration_seconds();
|
||||
// Only |rental_duration_seconds| set.
|
||||
|
||||
EXPECT_CALL(*mock_clock_, GetCurrentTime())
|
||||
.WillOnce(Return(kLicenseStartTime + 1))
|
||||
.WillOnce(Return(kPlaybackStartTime))
|
||||
.WillOnce(Return(kLicenseStartTime + 10))
|
||||
.WillOnce(Return(kLicenseStartTime + kRentalDuration + 10));
|
||||
|
||||
ExpectSessionKeysChange(kKeyStatusUsable, true);
|
||||
EXPECT_CALL(mock_event_listener_,
|
||||
OnExpirationUpdate(_, 0));
|
||||
EXPECT_CALL(mock_event_listener_,
|
||||
OnExpirationUpdate(_, kLicenseStartTime + kRentalDuration));
|
||||
|
||||
policy_engine_->SetLicense(license_);
|
||||
policy_engine_->BeginDecryption();
|
||||
policy_engine_->OnTimerEvent();
|
||||
|
||||
EXPECT_TRUE(policy_engine_->CanDecryptContent(kKeyId));
|
||||
EXPECT_FALSE(policy_engine_->CanDecryptContent(kSomeRandomKeyId));
|
||||
|
||||
policy_engine_->OnTimerEvent();
|
||||
|
||||
EXPECT_TRUE(policy_engine_->CanDecryptContent(kKeyId));
|
||||
EXPECT_FALSE(policy_engine_->CanDecryptContent(kSomeRandomKeyId));
|
||||
}
|
||||
|
||||
TEST_F(PolicyEngineTest, PlaybackOk_RentalAndLicense0_WithoutPlayback) {
|
||||
License_Policy* policy = license_.mutable_policy();
|
||||
policy->clear_license_duration_seconds();
|
||||
policy->clear_rental_duration_seconds();
|
||||
// Only |playback_duration_seconds| set.
|
||||
|
||||
EXPECT_CALL(*mock_clock_, GetCurrentTime())
|
||||
.WillOnce(Return(kLicenseStartTime + 1))
|
||||
.WillOnce(Return(kLicenseStartTime + 10))
|
||||
.WillOnce(Return(kLicenseStartTime + kPlaybackDuration + 10));
|
||||
|
||||
ExpectSessionKeysChange(kKeyStatusUsable, true);
|
||||
EXPECT_CALL(mock_event_listener_, OnExpirationUpdate(_, 0));
|
||||
|
||||
policy_engine_->SetLicense(license_);
|
||||
policy_engine_->OnTimerEvent();
|
||||
|
||||
EXPECT_TRUE(policy_engine_->CanDecryptContent(kKeyId));
|
||||
EXPECT_FALSE(policy_engine_->CanDecryptContent(kSomeRandomKeyId));
|
||||
|
||||
policy_engine_->OnTimerEvent();
|
||||
|
||||
EXPECT_TRUE(policy_engine_->CanDecryptContent(kKeyId));
|
||||
EXPECT_FALSE(policy_engine_->CanDecryptContent(kSomeRandomKeyId));
|
||||
}
|
||||
|
||||
TEST_F(PolicyEngineTest, PlaybackOk_RentalAndLicense0_WithPlayback) {
|
||||
License_Policy* policy = license_.mutable_policy();
|
||||
policy->clear_license_duration_seconds();
|
||||
policy->clear_rental_duration_seconds();
|
||||
// Only |playback_duration_seconds| set.
|
||||
|
||||
EXPECT_CALL(*mock_clock_, GetCurrentTime())
|
||||
.WillOnce(Return(kLicenseStartTime + 1))
|
||||
.WillOnce(Return(kPlaybackStartTime))
|
||||
.WillOnce(Return(kPlaybackStartTime + kPlaybackDuration - 10))
|
||||
.WillOnce(Return(kPlaybackStartTime + kPlaybackDuration + 10));
|
||||
|
||||
ExpectSessionKeysChange(kKeyStatusExpired, false);
|
||||
ExpectSessionKeysChange(kKeyStatusUsable, true);
|
||||
EXPECT_CALL(mock_event_listener_, OnExpirationUpdate(_, 0));
|
||||
EXPECT_CALL(mock_event_listener_,
|
||||
OnExpirationUpdate(_, kPlaybackStartTime + kPlaybackDuration));
|
||||
|
||||
policy_engine_->SetLicense(license_);
|
||||
policy_engine_->BeginDecryption();
|
||||
policy_engine_->OnTimerEvent();
|
||||
|
||||
EXPECT_TRUE(policy_engine_->CanDecryptContent(kKeyId));
|
||||
EXPECT_FALSE(policy_engine_->CanDecryptContent(kSomeRandomKeyId));
|
||||
|
||||
policy_engine_->OnTimerEvent();
|
||||
|
||||
EXPECT_FALSE(policy_engine_->CanDecryptContent(kKeyId));
|
||||
EXPECT_FALSE(policy_engine_->CanDecryptContent(kSomeRandomKeyId));
|
||||
}
|
||||
|
||||
TEST_F(PolicyEngineTest, PlaybackOk_Durations0) {
|
||||
License_Policy* policy = license_.mutable_policy();
|
||||
policy->set_rental_duration_seconds(kDurationUnlimited);
|
||||
@@ -2185,6 +2325,303 @@ TEST_F(PolicyEngineQueryTest, QuerySuccess_LicenseDuration0) {
|
||||
EXPECT_EQ(kRenewalServerUrl, query_info[QUERY_KEY_RENEWAL_SERVER_URL]);
|
||||
}
|
||||
|
||||
TEST_F(PolicyEngineQueryTest, QuerySuccess_PlaybackAndRental0) {
|
||||
License_Policy* policy = license_.mutable_policy();
|
||||
policy->set_rental_duration_seconds(kDurationUnlimited);
|
||||
policy->set_playback_duration_seconds(kDurationUnlimited);
|
||||
policy->set_license_duration_seconds(kLowDuration);
|
||||
// Only |license_duration_seconds| set.
|
||||
|
||||
EXPECT_CALL(*mock_clock_, GetCurrentTime())
|
||||
.WillOnce(Return(kLicenseStartTime + 1))
|
||||
.WillOnce(Return(kPlaybackStartTime))
|
||||
.WillOnce(Return(kLicenseStartTime + 10))
|
||||
.WillOnce(Return(kLicenseStartTime + kLowDuration - 10))
|
||||
.WillOnce(Return(kLicenseStartTime + kLowDuration + 10))
|
||||
.WillOnce(Return(kLicenseStartTime + kLowDuration + 10));
|
||||
|
||||
policy_engine_->SetLicense(license_);
|
||||
policy_engine_->BeginDecryption();
|
||||
policy_engine_->OnTimerEvent();
|
||||
|
||||
EXPECT_TRUE(policy_engine_->CanDecryptContent(kKeyId));
|
||||
EXPECT_FALSE(policy_engine_->CanDecryptContent(kSomeRandomKeyId));
|
||||
|
||||
CdmQueryMap query_info;
|
||||
EXPECT_EQ(NO_ERROR, policy_engine_->Query(&query_info));
|
||||
EXPECT_EQ(QUERY_VALUE_STREAMING, query_info[QUERY_KEY_LICENSE_TYPE]);
|
||||
EXPECT_EQ(QUERY_VALUE_TRUE, query_info[QUERY_KEY_PLAY_ALLOWED]);
|
||||
EXPECT_EQ(QUERY_VALUE_FALSE, query_info[QUERY_KEY_PERSIST_ALLOWED]);
|
||||
EXPECT_EQ(QUERY_VALUE_TRUE, query_info[QUERY_KEY_RENEW_ALLOWED]);
|
||||
|
||||
EXPECT_EQ(10, ParseInt(query_info[QUERY_KEY_LICENSE_DURATION_REMAINING]));
|
||||
EXPECT_EQ(LLONG_MAX,
|
||||
ParseInt(query_info[QUERY_KEY_PLAYBACK_DURATION_REMAINING]));
|
||||
EXPECT_EQ(kRenewalServerUrl, query_info[QUERY_KEY_RENEWAL_SERVER_URL]);
|
||||
|
||||
policy_engine_->OnTimerEvent();
|
||||
|
||||
EXPECT_EQ(NO_ERROR, policy_engine_->Query(&query_info));
|
||||
EXPECT_EQ(QUERY_VALUE_STREAMING, query_info[QUERY_KEY_LICENSE_TYPE]);
|
||||
EXPECT_EQ(QUERY_VALUE_TRUE, query_info[QUERY_KEY_PLAY_ALLOWED]);
|
||||
EXPECT_EQ(QUERY_VALUE_FALSE, query_info[QUERY_KEY_PERSIST_ALLOWED]);
|
||||
EXPECT_EQ(QUERY_VALUE_TRUE, query_info[QUERY_KEY_RENEW_ALLOWED]);
|
||||
|
||||
EXPECT_EQ(0, ParseInt(query_info[QUERY_KEY_LICENSE_DURATION_REMAINING]));
|
||||
EXPECT_EQ(LLONG_MAX,
|
||||
ParseInt(query_info[QUERY_KEY_PLAYBACK_DURATION_REMAINING]));
|
||||
EXPECT_EQ(kRenewalServerUrl, query_info[QUERY_KEY_RENEWAL_SERVER_URL]);
|
||||
}
|
||||
|
||||
TEST_F(PolicyEngineQueryTest, QuerySuccess_PlaybackAndLicense0_WithoutPlayback) {
|
||||
License_Policy* policy = license_.mutable_policy();
|
||||
policy->set_rental_duration_seconds(kRentalDuration);
|
||||
policy->set_playback_duration_seconds(kDurationUnlimited);
|
||||
policy->set_license_duration_seconds(kDurationUnlimited);
|
||||
// Only |rental_duration_seconds| set.
|
||||
|
||||
EXPECT_CALL(*mock_clock_, GetCurrentTime())
|
||||
.WillOnce(Return(kLicenseStartTime + 1))
|
||||
.WillOnce(Return(kLicenseStartTime + 10))
|
||||
.WillOnce(Return(kLicenseStartTime + kRentalDuration - 10))
|
||||
.WillOnce(Return(kLicenseStartTime + kRentalDuration - 10))
|
||||
.WillOnce(Return(kLicenseStartTime + kRentalDuration + 10))
|
||||
.WillOnce(Return(kLicenseStartTime + kRentalDuration + 10));
|
||||
|
||||
policy_engine_->SetLicense(license_);
|
||||
policy_engine_->OnTimerEvent();
|
||||
|
||||
EXPECT_TRUE(policy_engine_->CanDecryptContent(kKeyId));
|
||||
EXPECT_FALSE(policy_engine_->CanDecryptContent(kSomeRandomKeyId));
|
||||
|
||||
policy_engine_->OnTimerEvent();
|
||||
|
||||
EXPECT_TRUE(policy_engine_->CanDecryptContent(kKeyId));
|
||||
EXPECT_FALSE(policy_engine_->CanDecryptContent(kSomeRandomKeyId));
|
||||
|
||||
CdmQueryMap query_info;
|
||||
EXPECT_EQ(NO_ERROR, policy_engine_->Query(&query_info));
|
||||
EXPECT_EQ(QUERY_VALUE_STREAMING, query_info[QUERY_KEY_LICENSE_TYPE]);
|
||||
EXPECT_EQ(QUERY_VALUE_TRUE, query_info[QUERY_KEY_PLAY_ALLOWED]);
|
||||
EXPECT_EQ(QUERY_VALUE_FALSE, query_info[QUERY_KEY_PERSIST_ALLOWED]);
|
||||
EXPECT_EQ(QUERY_VALUE_TRUE, query_info[QUERY_KEY_RENEW_ALLOWED]);
|
||||
|
||||
EXPECT_EQ(10, ParseInt(query_info[QUERY_KEY_LICENSE_DURATION_REMAINING]));
|
||||
EXPECT_EQ(LLONG_MAX,
|
||||
ParseInt(query_info[QUERY_KEY_PLAYBACK_DURATION_REMAINING]));
|
||||
EXPECT_EQ(kRenewalServerUrl, query_info[QUERY_KEY_RENEWAL_SERVER_URL]);
|
||||
|
||||
policy_engine_->OnTimerEvent();
|
||||
|
||||
EXPECT_FALSE(policy_engine_->CanDecryptContent(kKeyId));
|
||||
EXPECT_FALSE(policy_engine_->CanDecryptContent(kSomeRandomKeyId));
|
||||
|
||||
EXPECT_EQ(NO_ERROR, policy_engine_->Query(&query_info));
|
||||
EXPECT_EQ(QUERY_VALUE_STREAMING, query_info[QUERY_KEY_LICENSE_TYPE]);
|
||||
EXPECT_EQ(QUERY_VALUE_TRUE, query_info[QUERY_KEY_PLAY_ALLOWED]);
|
||||
EXPECT_EQ(QUERY_VALUE_FALSE, query_info[QUERY_KEY_PERSIST_ALLOWED]);
|
||||
EXPECT_EQ(QUERY_VALUE_TRUE, query_info[QUERY_KEY_RENEW_ALLOWED]);
|
||||
|
||||
EXPECT_EQ(0, ParseInt(query_info[QUERY_KEY_LICENSE_DURATION_REMAINING]));
|
||||
EXPECT_EQ(LLONG_MAX,
|
||||
ParseInt(query_info[QUERY_KEY_PLAYBACK_DURATION_REMAINING]));
|
||||
EXPECT_EQ(kRenewalServerUrl, query_info[QUERY_KEY_RENEWAL_SERVER_URL]);
|
||||
}
|
||||
|
||||
TEST_F(PolicyEngineQueryTest, QuerySuccess_PlaybackAndLicense0_WithPlayback) {
|
||||
License_Policy* policy = license_.mutable_policy();
|
||||
policy->set_rental_duration_seconds(kRentalDuration);
|
||||
policy->set_playback_duration_seconds(kDurationUnlimited);
|
||||
policy->set_license_duration_seconds(kDurationUnlimited);
|
||||
// Only |rental_duration_seconds| set.
|
||||
|
||||
EXPECT_CALL(*mock_clock_, GetCurrentTime())
|
||||
.WillOnce(Return(kLicenseStartTime + 1))
|
||||
.WillOnce(Return(kPlaybackStartTime))
|
||||
.WillOnce(Return(kLicenseStartTime + kPlaybackDuration - 10))
|
||||
.WillOnce(Return(kLicenseStartTime + kPlaybackDuration - 10))
|
||||
.WillOnce(Return(kLicenseStartTime + kPlaybackDuration + 10))
|
||||
.WillOnce(Return(kLicenseStartTime + kPlaybackDuration + 10))
|
||||
.WillOnce(Return(kLicenseStartTime + kRentalDuration + 10))
|
||||
.WillOnce(Return(kLicenseStartTime + kRentalDuration + 10));
|
||||
|
||||
policy_engine_->SetLicense(license_);
|
||||
policy_engine_->BeginDecryption();
|
||||
policy_engine_->OnTimerEvent();
|
||||
|
||||
EXPECT_TRUE(policy_engine_->CanDecryptContent(kKeyId));
|
||||
EXPECT_FALSE(policy_engine_->CanDecryptContent(kSomeRandomKeyId));
|
||||
|
||||
CdmQueryMap query_info;
|
||||
EXPECT_EQ(NO_ERROR, policy_engine_->Query(&query_info));
|
||||
EXPECT_EQ(QUERY_VALUE_STREAMING, query_info[QUERY_KEY_LICENSE_TYPE]);
|
||||
EXPECT_EQ(QUERY_VALUE_TRUE, query_info[QUERY_KEY_PLAY_ALLOWED]);
|
||||
EXPECT_EQ(QUERY_VALUE_FALSE, query_info[QUERY_KEY_PERSIST_ALLOWED]);
|
||||
EXPECT_EQ(QUERY_VALUE_TRUE, query_info[QUERY_KEY_RENEW_ALLOWED]);
|
||||
|
||||
EXPECT_EQ(kRentalDuration - kPlaybackDuration + 10,
|
||||
ParseInt(query_info[QUERY_KEY_LICENSE_DURATION_REMAINING]));
|
||||
EXPECT_EQ(LLONG_MAX,
|
||||
ParseInt(query_info[QUERY_KEY_PLAYBACK_DURATION_REMAINING]));
|
||||
EXPECT_EQ(kRenewalServerUrl, query_info[QUERY_KEY_RENEWAL_SERVER_URL]);
|
||||
|
||||
policy_engine_->OnTimerEvent();
|
||||
|
||||
EXPECT_TRUE(policy_engine_->CanDecryptContent(kKeyId));
|
||||
EXPECT_FALSE(policy_engine_->CanDecryptContent(kSomeRandomKeyId));
|
||||
|
||||
EXPECT_EQ(NO_ERROR, policy_engine_->Query(&query_info));
|
||||
EXPECT_EQ(QUERY_VALUE_STREAMING, query_info[QUERY_KEY_LICENSE_TYPE]);
|
||||
EXPECT_EQ(QUERY_VALUE_TRUE, query_info[QUERY_KEY_PLAY_ALLOWED]);
|
||||
EXPECT_EQ(QUERY_VALUE_FALSE, query_info[QUERY_KEY_PERSIST_ALLOWED]);
|
||||
EXPECT_EQ(QUERY_VALUE_TRUE, query_info[QUERY_KEY_RENEW_ALLOWED]);
|
||||
|
||||
EXPECT_EQ(kRentalDuration - kPlaybackDuration - 10,
|
||||
ParseInt(query_info[QUERY_KEY_LICENSE_DURATION_REMAINING]));
|
||||
EXPECT_EQ(LLONG_MAX,
|
||||
ParseInt(query_info[QUERY_KEY_PLAYBACK_DURATION_REMAINING]));
|
||||
EXPECT_EQ(kRenewalServerUrl, query_info[QUERY_KEY_RENEWAL_SERVER_URL]);
|
||||
|
||||
policy_engine_->OnTimerEvent();
|
||||
|
||||
EXPECT_TRUE(policy_engine_->CanDecryptContent(kKeyId));
|
||||
EXPECT_FALSE(policy_engine_->CanDecryptContent(kSomeRandomKeyId));
|
||||
|
||||
EXPECT_EQ(NO_ERROR, policy_engine_->Query(&query_info));
|
||||
EXPECT_EQ(QUERY_VALUE_STREAMING, query_info[QUERY_KEY_LICENSE_TYPE]);
|
||||
EXPECT_EQ(QUERY_VALUE_TRUE, query_info[QUERY_KEY_PLAY_ALLOWED]);
|
||||
EXPECT_EQ(QUERY_VALUE_FALSE, query_info[QUERY_KEY_PERSIST_ALLOWED]);
|
||||
EXPECT_EQ(QUERY_VALUE_TRUE, query_info[QUERY_KEY_RENEW_ALLOWED]);
|
||||
|
||||
EXPECT_EQ(0, ParseInt(query_info[QUERY_KEY_LICENSE_DURATION_REMAINING]));
|
||||
EXPECT_EQ(LLONG_MAX,
|
||||
ParseInt(query_info[QUERY_KEY_PLAYBACK_DURATION_REMAINING]));
|
||||
EXPECT_EQ(kRenewalServerUrl, query_info[QUERY_KEY_RENEWAL_SERVER_URL]);
|
||||
}
|
||||
|
||||
TEST_F(PolicyEngineQueryTest, QuerySuccess_RentalAndLicense0_WithoutPlayback) {
|
||||
License_Policy* policy = license_.mutable_policy();
|
||||
policy->set_rental_duration_seconds(kDurationUnlimited);
|
||||
policy->set_playback_duration_seconds(kPlaybackDuration);
|
||||
policy->set_license_duration_seconds(kDurationUnlimited);
|
||||
// Only |playback_duration_seconds| set.
|
||||
|
||||
EXPECT_CALL(*mock_clock_, GetCurrentTime())
|
||||
.WillOnce(Return(kLicenseStartTime + 1))
|
||||
.WillOnce(Return(kLicenseStartTime + 10))
|
||||
.WillOnce(Return(kLicenseStartTime + 10))
|
||||
.WillOnce(Return(kLicenseStartTime + kPlaybackDuration + 10))
|
||||
.WillOnce(Return(kLicenseStartTime + kPlaybackDuration + 10));
|
||||
|
||||
policy_engine_->SetLicense(license_);
|
||||
policy_engine_->OnTimerEvent();
|
||||
|
||||
EXPECT_TRUE(policy_engine_->CanDecryptContent(kKeyId));
|
||||
EXPECT_FALSE(policy_engine_->CanDecryptContent(kSomeRandomKeyId));
|
||||
|
||||
CdmQueryMap query_info;
|
||||
EXPECT_EQ(NO_ERROR, policy_engine_->Query(&query_info));
|
||||
EXPECT_EQ(QUERY_VALUE_STREAMING, query_info[QUERY_KEY_LICENSE_TYPE]);
|
||||
EXPECT_EQ(QUERY_VALUE_TRUE, query_info[QUERY_KEY_PLAY_ALLOWED]);
|
||||
EXPECT_EQ(QUERY_VALUE_FALSE, query_info[QUERY_KEY_PERSIST_ALLOWED]);
|
||||
EXPECT_EQ(QUERY_VALUE_TRUE, query_info[QUERY_KEY_RENEW_ALLOWED]);
|
||||
|
||||
EXPECT_EQ(LLONG_MAX,
|
||||
ParseInt(query_info[QUERY_KEY_LICENSE_DURATION_REMAINING]));
|
||||
EXPECT_EQ(kPlaybackDuration,
|
||||
ParseInt(query_info[QUERY_KEY_PLAYBACK_DURATION_REMAINING]));
|
||||
EXPECT_EQ(kRenewalServerUrl, query_info[QUERY_KEY_RENEWAL_SERVER_URL]);
|
||||
|
||||
policy_engine_->OnTimerEvent();
|
||||
|
||||
EXPECT_TRUE(policy_engine_->CanDecryptContent(kKeyId));
|
||||
EXPECT_FALSE(policy_engine_->CanDecryptContent(kSomeRandomKeyId));
|
||||
|
||||
EXPECT_EQ(NO_ERROR, policy_engine_->Query(&query_info));
|
||||
EXPECT_EQ(QUERY_VALUE_STREAMING, query_info[QUERY_KEY_LICENSE_TYPE]);
|
||||
EXPECT_EQ(QUERY_VALUE_TRUE, query_info[QUERY_KEY_PLAY_ALLOWED]);
|
||||
EXPECT_EQ(QUERY_VALUE_FALSE, query_info[QUERY_KEY_PERSIST_ALLOWED]);
|
||||
EXPECT_EQ(QUERY_VALUE_TRUE, query_info[QUERY_KEY_RENEW_ALLOWED]);
|
||||
|
||||
EXPECT_EQ(LLONG_MAX,
|
||||
ParseInt(query_info[QUERY_KEY_LICENSE_DURATION_REMAINING]));
|
||||
EXPECT_EQ(kPlaybackDuration,
|
||||
ParseInt(query_info[QUERY_KEY_PLAYBACK_DURATION_REMAINING]));
|
||||
EXPECT_EQ(kRenewalServerUrl, query_info[QUERY_KEY_RENEWAL_SERVER_URL]);
|
||||
}
|
||||
|
||||
TEST_F(PolicyEngineQueryTest, QuerySuccess_RentalAndLicense0_WithPlayback) {
|
||||
License_Policy* policy = license_.mutable_policy();
|
||||
policy->set_rental_duration_seconds(kDurationUnlimited);
|
||||
policy->set_playback_duration_seconds(kPlaybackDuration);
|
||||
policy->set_license_duration_seconds(kDurationUnlimited);
|
||||
// Only |playback_duration_seconds| set.
|
||||
|
||||
EXPECT_CALL(*mock_clock_, GetCurrentTime())
|
||||
.WillOnce(Return(kLicenseStartTime + 1))
|
||||
.WillOnce(Return(kPlaybackStartTime))
|
||||
.WillOnce(Return(kPlaybackStartTime + 10))
|
||||
.WillOnce(Return(kPlaybackStartTime + 10))
|
||||
.WillOnce(Return(kPlaybackStartTime + kPlaybackDuration - 10))
|
||||
.WillOnce(Return(kPlaybackStartTime + kPlaybackDuration - 10))
|
||||
.WillOnce(Return(kPlaybackStartTime + kPlaybackDuration + 10))
|
||||
.WillOnce(Return(kPlaybackStartTime + kPlaybackDuration + 10));
|
||||
|
||||
policy_engine_->SetLicense(license_);
|
||||
policy_engine_->BeginDecryption();
|
||||
policy_engine_->OnTimerEvent();
|
||||
|
||||
EXPECT_TRUE(policy_engine_->CanDecryptContent(kKeyId));
|
||||
EXPECT_FALSE(policy_engine_->CanDecryptContent(kSomeRandomKeyId));
|
||||
|
||||
CdmQueryMap query_info;
|
||||
EXPECT_EQ(NO_ERROR, policy_engine_->Query(&query_info));
|
||||
EXPECT_EQ(QUERY_VALUE_STREAMING, query_info[QUERY_KEY_LICENSE_TYPE]);
|
||||
EXPECT_EQ(QUERY_VALUE_TRUE, query_info[QUERY_KEY_PLAY_ALLOWED]);
|
||||
EXPECT_EQ(QUERY_VALUE_FALSE, query_info[QUERY_KEY_PERSIST_ALLOWED]);
|
||||
EXPECT_EQ(QUERY_VALUE_TRUE, query_info[QUERY_KEY_RENEW_ALLOWED]);
|
||||
|
||||
EXPECT_EQ(LLONG_MAX,
|
||||
ParseInt(query_info[QUERY_KEY_LICENSE_DURATION_REMAINING]));
|
||||
EXPECT_EQ(kPlaybackDuration - 10,
|
||||
ParseInt(query_info[QUERY_KEY_PLAYBACK_DURATION_REMAINING]));
|
||||
EXPECT_EQ(kRenewalServerUrl, query_info[QUERY_KEY_RENEWAL_SERVER_URL]);
|
||||
|
||||
policy_engine_->OnTimerEvent();
|
||||
|
||||
EXPECT_TRUE(policy_engine_->CanDecryptContent(kKeyId));
|
||||
EXPECT_FALSE(policy_engine_->CanDecryptContent(kSomeRandomKeyId));
|
||||
|
||||
EXPECT_EQ(NO_ERROR, policy_engine_->Query(&query_info));
|
||||
EXPECT_EQ(QUERY_VALUE_STREAMING, query_info[QUERY_KEY_LICENSE_TYPE]);
|
||||
EXPECT_EQ(QUERY_VALUE_TRUE, query_info[QUERY_KEY_PLAY_ALLOWED]);
|
||||
EXPECT_EQ(QUERY_VALUE_FALSE, query_info[QUERY_KEY_PERSIST_ALLOWED]);
|
||||
EXPECT_EQ(QUERY_VALUE_TRUE, query_info[QUERY_KEY_RENEW_ALLOWED]);
|
||||
|
||||
EXPECT_EQ(LLONG_MAX,
|
||||
ParseInt(query_info[QUERY_KEY_LICENSE_DURATION_REMAINING]));
|
||||
EXPECT_EQ(10,
|
||||
ParseInt(query_info[QUERY_KEY_PLAYBACK_DURATION_REMAINING]));
|
||||
EXPECT_EQ(kRenewalServerUrl, query_info[QUERY_KEY_RENEWAL_SERVER_URL]);
|
||||
|
||||
policy_engine_->OnTimerEvent();
|
||||
|
||||
EXPECT_FALSE(policy_engine_->CanDecryptContent(kKeyId));
|
||||
EXPECT_FALSE(policy_engine_->CanDecryptContent(kSomeRandomKeyId));
|
||||
|
||||
EXPECT_EQ(NO_ERROR, policy_engine_->Query(&query_info));
|
||||
EXPECT_EQ(QUERY_VALUE_STREAMING, query_info[QUERY_KEY_LICENSE_TYPE]);
|
||||
EXPECT_EQ(QUERY_VALUE_TRUE, query_info[QUERY_KEY_PLAY_ALLOWED]);
|
||||
EXPECT_EQ(QUERY_VALUE_FALSE, query_info[QUERY_KEY_PERSIST_ALLOWED]);
|
||||
EXPECT_EQ(QUERY_VALUE_TRUE, query_info[QUERY_KEY_RENEW_ALLOWED]);
|
||||
|
||||
EXPECT_EQ(0,
|
||||
ParseInt(query_info[QUERY_KEY_LICENSE_DURATION_REMAINING]));
|
||||
EXPECT_EQ(0,
|
||||
ParseInt(query_info[QUERY_KEY_PLAYBACK_DURATION_REMAINING]));
|
||||
EXPECT_EQ(kRenewalServerUrl, query_info[QUERY_KEY_RENEWAL_SERVER_URL]);
|
||||
}
|
||||
|
||||
TEST_F(PolicyEngineQueryTest, QuerySuccess_Durations0) {
|
||||
License_Policy* policy = license_.mutable_policy();
|
||||
policy->set_rental_duration_seconds(kDurationUnlimited);
|
||||
|
||||
@@ -4,7 +4,6 @@
|
||||
#include <gmock/gmock.h>
|
||||
#include <gtest/gtest.h>
|
||||
#include <string>
|
||||
#include "crypto_session.h"
|
||||
#include "properties.h"
|
||||
#include "string_conversions.h"
|
||||
#include "wv_cdm_constants.h"
|
||||
@@ -42,25 +41,9 @@ const std::string kTestSignedCertificate = a2bs_hex(
|
||||
|
||||
} // unnamed namespace
|
||||
|
||||
class MockCryptoSession : public CryptoSession {
|
||||
public:
|
||||
MOCK_METHOD2(GetRandom, bool(size_t, uint8_t*));
|
||||
};
|
||||
|
||||
class ServiceCertificateTest : public ::testing::Test {
|
||||
protected:
|
||||
virtual void SetUp() { crypto_session_ = new MockCryptoSession(); }
|
||||
|
||||
virtual void TearDown() {
|
||||
if (crypto_session_) delete crypto_session_;
|
||||
}
|
||||
|
||||
void CreateServiceCertificate() {
|
||||
service_certificate_ = new ServiceCertificate();
|
||||
}
|
||||
|
||||
ServiceCertificate* service_certificate_;
|
||||
MockCryptoSession* crypto_session_;
|
||||
ServiceCertificate service_certificate_;
|
||||
};
|
||||
|
||||
class StubCdmClientPropertySet : public CdmClientPropertySet {
|
||||
@@ -77,11 +60,11 @@ class StubCdmClientPropertySet : public CdmClientPropertySet {
|
||||
virtual bool use_privacy_mode() const { return use_privacy_mode_; }
|
||||
|
||||
virtual const std::string& service_certificate() const {
|
||||
return service_certificate_;
|
||||
return raw_service_certificate_;
|
||||
}
|
||||
|
||||
virtual void set_service_certificate(const std::string& cert) {
|
||||
service_certificate_ = cert;
|
||||
raw_service_certificate_ = cert;
|
||||
}
|
||||
|
||||
virtual bool is_session_sharing_enabled() const {
|
||||
@@ -98,7 +81,7 @@ class StubCdmClientPropertySet : public CdmClientPropertySet {
|
||||
|
||||
private:
|
||||
std::string security_level_;
|
||||
std::string service_certificate_;
|
||||
std::string raw_service_certificate_;
|
||||
bool use_privacy_mode_;
|
||||
bool is_session_sharing_enabled_;
|
||||
uint32_t session_sharing_id_;
|
||||
@@ -106,11 +89,8 @@ class StubCdmClientPropertySet : public CdmClientPropertySet {
|
||||
};
|
||||
|
||||
TEST_F(ServiceCertificateTest, InitSuccess) {
|
||||
MockCryptoSession crypto_session;
|
||||
|
||||
CreateServiceCertificate();
|
||||
service_certificate_->Init(kTestSessionId1);
|
||||
EXPECT_FALSE(service_certificate_->HasCertificate());
|
||||
service_certificate_.Init(kTestSessionId1);
|
||||
EXPECT_FALSE(service_certificate_.has_certificate());
|
||||
}
|
||||
|
||||
TEST_F(ServiceCertificateTest, InitPrivacyModeRequired) {
|
||||
@@ -121,9 +101,8 @@ TEST_F(ServiceCertificateTest, InitPrivacyModeRequired) {
|
||||
Properties::Init();
|
||||
Properties::AddSessionPropertySet(kTestSessionId1, &property_set);
|
||||
|
||||
CreateServiceCertificate();
|
||||
service_certificate_->Init(kTestSessionId1);
|
||||
EXPECT_FALSE(service_certificate_->HasCertificate());
|
||||
service_certificate_.Init(kTestSessionId1);
|
||||
EXPECT_FALSE(service_certificate_.has_certificate());
|
||||
}
|
||||
|
||||
TEST_F(ServiceCertificateTest, InitServiceCertificatePresent) {
|
||||
@@ -135,13 +114,12 @@ TEST_F(ServiceCertificateTest, InitServiceCertificatePresent) {
|
||||
Properties::Init();
|
||||
Properties::AddSessionPropertySet(kTestSessionId1, &property_set);
|
||||
|
||||
CreateServiceCertificate();
|
||||
std::string service_certificate;
|
||||
std::string raw_service_certificate;
|
||||
EXPECT_TRUE(Properties::GetServiceCertificate(kTestSessionId1,
|
||||
&service_certificate));
|
||||
&raw_service_certificate));
|
||||
EXPECT_EQ(NO_ERROR,
|
||||
service_certificate_->Init(service_certificate));
|
||||
EXPECT_TRUE(service_certificate_->HasCertificate());
|
||||
service_certificate_.Init(raw_service_certificate));
|
||||
EXPECT_TRUE(service_certificate_.has_certificate());
|
||||
}
|
||||
|
||||
TEST_F(ServiceCertificateTest, SetServiceCertificate) {
|
||||
@@ -152,9 +130,8 @@ TEST_F(ServiceCertificateTest, SetServiceCertificate) {
|
||||
Properties::Init();
|
||||
Properties::AddSessionPropertySet(kTestSessionId1, &property_set);
|
||||
|
||||
CreateServiceCertificate();
|
||||
EXPECT_EQ(NO_ERROR, service_certificate_->Init(kTestSignedCertificate));
|
||||
EXPECT_TRUE(service_certificate_->HasCertificate());
|
||||
EXPECT_EQ(NO_ERROR, service_certificate_.Init(kTestSignedCertificate));
|
||||
EXPECT_TRUE(service_certificate_.has_certificate());
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
128
core/test/shared_ptr_test.cpp
Normal file
128
core/test/shared_ptr_test.cpp
Normal file
@@ -0,0 +1,128 @@
|
||||
// Copyright 2017 Google Inc. All Rights Reserved.
|
||||
|
||||
#include <string>
|
||||
#include <errno.h>
|
||||
#include <getopt.h>
|
||||
#include <gtest/gtest.h>
|
||||
|
||||
#include "shared_ptr.h"
|
||||
|
||||
#include "log.h"
|
||||
|
||||
namespace wvcdm {
|
||||
|
||||
class SharedPtrTest : public testing::Test {
|
||||
public:
|
||||
|
||||
static void NoteDeletion() {
|
||||
deletions++;
|
||||
}
|
||||
|
||||
class Dummy {
|
||||
public:
|
||||
explicit Dummy(int v) : value_(v) { exists_ = true; }
|
||||
~Dummy() {
|
||||
NoteDeletion();
|
||||
exists_ = false;
|
||||
}
|
||||
bool exists() { return exists_; }
|
||||
int getValue() { return value_; }
|
||||
void setValue(int v) { value_ = v; }
|
||||
private:
|
||||
bool exists_;
|
||||
int value_;
|
||||
};
|
||||
|
||||
static void ExpectedDeletions(int count) {
|
||||
ASSERT_TRUE(deletions == count);
|
||||
deletions = 0;
|
||||
}
|
||||
|
||||
virtual void SetUpTest() {
|
||||
deletions = 0;
|
||||
}
|
||||
virtual void TearDownTest() {
|
||||
deletions = 0;
|
||||
}
|
||||
private:
|
||||
static int deletions;
|
||||
};
|
||||
|
||||
int SharedPtrTest::deletions = 0;
|
||||
|
||||
TEST_F(SharedPtrTest, NullSingletonCreate) {
|
||||
shared_ptr<Dummy> sd1;
|
||||
ASSERT_TRUE(sd1.unique());
|
||||
ASSERT_TRUE(sd1.get() == NULL);
|
||||
ExpectedDeletions(0);
|
||||
}
|
||||
|
||||
TEST_F(SharedPtrTest, SingletonCreate) {
|
||||
{
|
||||
Dummy* d1 = new Dummy(42);
|
||||
shared_ptr<Dummy> sd1(d1);
|
||||
ASSERT_TRUE(sd1.unique());
|
||||
ASSERT_TRUE(sd1.get() == d1);
|
||||
ASSERT_TRUE(sd1->getValue() == 42);
|
||||
}
|
||||
ExpectedDeletions(1);
|
||||
}
|
||||
|
||||
TEST_F(SharedPtrTest, ResetToNull) {
|
||||
Dummy* d1 = new Dummy(42);
|
||||
shared_ptr<Dummy> sd1(d1);
|
||||
ASSERT_TRUE(sd1->getValue() == 42);
|
||||
sd1.reset();
|
||||
ExpectedDeletions(1);
|
||||
ASSERT_TRUE(sd1.get() == NULL);
|
||||
}
|
||||
|
||||
TEST_F(SharedPtrTest, SharedCreate) {
|
||||
{
|
||||
Dummy* d1 = new Dummy(42);
|
||||
shared_ptr<Dummy> sd1(d1);
|
||||
{
|
||||
shared_ptr<Dummy> sd2(sd1);
|
||||
ASSERT_FALSE(sd1.unique());
|
||||
ASSERT_TRUE(sd1.get() == d1);
|
||||
ASSERT_TRUE(sd2.get() == d1);
|
||||
ASSERT_TRUE(sd1.use_count() == 2);
|
||||
}
|
||||
ExpectedDeletions(0);
|
||||
ASSERT_TRUE(sd1.use_count() == 1);
|
||||
}
|
||||
ExpectedDeletions(1);
|
||||
}
|
||||
|
||||
TEST_F(SharedPtrTest, SharedInstance) {
|
||||
Dummy* d1 = new Dummy(42);
|
||||
{
|
||||
shared_ptr<Dummy> sd1(d1);
|
||||
{
|
||||
shared_ptr<Dummy> sd2(sd1);
|
||||
ASSERT_FALSE(sd1.unique());
|
||||
ASSERT_TRUE(sd1.get() == d1);
|
||||
ASSERT_TRUE(sd2.get() == d1);
|
||||
sd2->setValue(55);
|
||||
ASSERT_TRUE(sd1.use_count() == 2);
|
||||
}
|
||||
ExpectedDeletions(0);
|
||||
ASSERT_TRUE(sd1.use_count() == 1);
|
||||
ASSERT_TRUE(sd1->getValue() == 55);
|
||||
}
|
||||
ExpectedDeletions(1);
|
||||
}
|
||||
|
||||
TEST_F(SharedPtrTest, Reset) {
|
||||
{
|
||||
Dummy* d1 = new Dummy(42);
|
||||
Dummy* d2 = new Dummy(96);
|
||||
shared_ptr<Dummy> sd1(d1);
|
||||
sd1.reset(d2);
|
||||
ExpectedDeletions(1);
|
||||
ASSERT_TRUE(sd1->getValue() == 96);
|
||||
}
|
||||
ExpectedDeletions(1);
|
||||
}
|
||||
|
||||
} // namespace wvcdm
|
||||
@@ -42,8 +42,8 @@ void PrintTo(const enum CdmResponseType& value, ::std::ostream* os) {
|
||||
case CERT_PROVISIONING_REQUEST_ERROR_1:
|
||||
*os << "CERT_PROVISIONING_REQUEST_ERROR_1";
|
||||
break;
|
||||
case CERT_PROVISIONING_REQUEST_ERROR_2:
|
||||
*os << "CERT_PROVISIONING_REQUEST_ERROR_2";
|
||||
case CERT_PROVISIONING_NONCE_GENERATION_ERROR:
|
||||
*os << "CERT_PROVISIONING_NONCE_GENERATION_ERROR";
|
||||
break;
|
||||
case CERT_PROVISIONING_REQUEST_ERROR_3:
|
||||
*os << "CERT_PROVISIONING_REQUEST_ERROR_3";
|
||||
@@ -249,12 +249,18 @@ void PrintTo(const enum CdmResponseType& value, ::std::ostream* os) {
|
||||
case RELEASE_ALL_USAGE_INFO_ERROR_2:
|
||||
*os << "RELEASE_ALL_USAGE_INFO_ERROR_2";
|
||||
break;
|
||||
case RELEASE_ALL_USAGE_INFO_ERROR_3:
|
||||
*os << "RELEASE_ALL_USAGE_INFO_ERROR_3";
|
||||
break;
|
||||
case RELEASE_ALL_USAGE_INFO_ERROR_4:
|
||||
*os << "RELEASE_ALL_USAGE_INFO_ERROR_4";
|
||||
break;
|
||||
case RELEASE_ALL_USAGE_INFO_ERROR_5:
|
||||
*os << "RELEASE_ALL_USAGE_INFO_ERROR_5";
|
||||
break;
|
||||
case RELEASE_ALL_USAGE_INFO_ERROR_6:
|
||||
*os << "RELEASE_ALL_USAGE_INFO_ERROR_6";
|
||||
break;
|
||||
case RELEASE_ALL_USAGE_INFO_ERROR_7:
|
||||
*os << "RELEASE_ALL_USAGE_INFO_ERROR_7";
|
||||
break;
|
||||
case RELEASE_KEY_ERROR: *os << "RELEASE_KEY_ERROR";
|
||||
break;
|
||||
case RELEASE_KEY_REQUEST_ERROR: *os << "RELEASE_KEY_REQUEST_ERROR";
|
||||
@@ -426,13 +432,14 @@ void PrintTo(const enum CdmResponseType& value, ::std::ostream* os) {
|
||||
break;
|
||||
case KEY_NOT_FOUND_6: *os << "KEY_NOT_FOUND_6";
|
||||
break;
|
||||
case KEY_ERROR_1: *os << "KEY_ERROR_1";
|
||||
case INVALID_SESSION_1: *os << "INVALID_SESSION_1";
|
||||
break;
|
||||
case KEY_ERROR_2: *os << "KEY_ERROR_2";
|
||||
case NO_DEVICE_KEY_1: *os << "NO_DEVICE_KEY_1";
|
||||
break;
|
||||
case KEY_ERROR_3: *os << "KEY_ERROR_3";
|
||||
case NO_CONTENT_KEY_2: *os << "NO_CONTENT_KEY_2";
|
||||
break;
|
||||
case KEY_ERROR_4: *os << "KEY_ERROR_4";
|
||||
case INSUFFICIENT_CRYPTO_RESOURCES_2:
|
||||
*os << "INSUFFICIENT_CRYPTO_RESOURCES_2";
|
||||
break;
|
||||
case INVALID_PARAMETERS_ENG_13: *os << "INVALID_PARAMETERS_ENG_13";
|
||||
break;
|
||||
@@ -457,6 +464,111 @@ void PrintTo(const enum CdmResponseType& value, ::std::ostream* os) {
|
||||
case LICENSING_CLIENT_TOKEN_ERROR_1:
|
||||
*os << "LICENSING_CLIENT_TOKEN_ERROR_1";
|
||||
break;
|
||||
case ANALOG_OUTPUT_ERROR: *os << "ANALOG_OUTPUT_ERROR";
|
||||
break;
|
||||
case UNKNOWN_SELECT_KEY_ERROR_1: *os << "UNKNOWN_SELECT_KEY_ERROR_1";
|
||||
break;
|
||||
case UNKNOWN_SELECT_KEY_ERROR_2: *os << "UNKNOWN_SELECT_KEY_ERROR_2";
|
||||
break;
|
||||
case CREATE_USAGE_TABLE_ERROR: *os << "CREATE_USAGE_TABLE_ERROR";
|
||||
break;
|
||||
case LOAD_USAGE_HEADER_GENERATION_SKEW:
|
||||
*os << "LOAD_USAGE_HEADER_GENERATION_SKEW";
|
||||
break;
|
||||
case LOAD_USAGE_HEADER_SIGNATURE_FAILURE:
|
||||
*os << "LOAD_USAGE_HEADER_SIGNATURE_FAILURE";
|
||||
break;
|
||||
case LOAD_USAGE_HEADER_BAD_MAGIC: *os << "LOAD_USAGE_HEADER_BAD_MAGIC";
|
||||
break;
|
||||
case LOAD_USAGE_HEADER_UNKNOWN_ERROR:
|
||||
*os << "LOAD_USAGE_HEADER_UNKNOWN_ERROR";
|
||||
break;
|
||||
case INSUFFICIENT_CRYPTO_RESOURCES_3:
|
||||
*os << "INSUFFICIENT_CRYPTO_RESOURCES_3";
|
||||
break;
|
||||
case CREATE_USAGE_ENTRY_UNKNOWN_ERROR:
|
||||
*os << "CREATE_USAGE_ENTRY_UNKNOWN_ERROR";
|
||||
break;
|
||||
case LOAD_USAGE_ENTRY_GENERATION_SKEW:
|
||||
*os << "LOAD_USAGE_ENTRY_GENERATION_SKEW";
|
||||
break;
|
||||
case LOAD_USAGE_ENTRY_SIGNATURE_FAILURE:
|
||||
*os << "LOAD_USAGE_ENTRY_SIGNATURE_FAILURE";
|
||||
break;
|
||||
case LOAD_USAGE_ENTRY_UNKNOWN_ERROR:
|
||||
*os << "LOAD_USAGE_ENTRY_UNKNOWN_ERROR";
|
||||
break;
|
||||
case INVALID_PARAMETERS_ENG_20: *os << "INVALID_PARAMETERS_ENG_20";
|
||||
break;
|
||||
case UPDATE_USAGE_ENTRY_UNKNOWN_ERROR:
|
||||
*os << "UPDATE_USAGE_ENTRY_UNKNOWN_ERROR";
|
||||
break;
|
||||
case INVALID_PARAMETERS_ENG_21: *os << "INVALID_PARAMETERS_ENG_21";
|
||||
break;
|
||||
case INVALID_PARAMETERS_ENG_22: *os << "INVALID_PARAMETERS_ENG_22";
|
||||
break;
|
||||
case SHRINK_USAGE_TABLER_HEADER_UNKNOWN_ERROR:
|
||||
*os << "SHRINK_USAGE_TABLER_HEADER_UNKNOWN_ERROR";
|
||||
break;
|
||||
case MOVE_USAGE_ENTRY_UNKNOWN_ERROR:
|
||||
*os << "MOVE_USAGE_ENTRY_UNKNOWN_ERROR";
|
||||
break;
|
||||
case COPY_OLD_USAGE_ENTRY_UNKNOWN_ERROR:
|
||||
*os << "COPY_OLD_USAGE_ENTRY_UNKNOWN_ERROR";
|
||||
break;
|
||||
case INVALID_PARAMETERS_ENG_23: *os << "INVALID_PARAMETERS_ENG_23";
|
||||
break;
|
||||
case INVALID_PARAMETERS_ENG_24: *os << "INVALID_PARAMETERS_ENG_24";
|
||||
break;
|
||||
case USAGE_INFORMATION_SUPPORT_FAILED:
|
||||
*os << "USAGE_INFORMATION_SUPPORT_FAILED";
|
||||
break;
|
||||
case USAGE_SUPPORT_GET_API_FAILED:
|
||||
*os << "USAGE_SUPPORT_GET_API_FAILED";
|
||||
break;
|
||||
case UNEXPECTED_EMPTY_USAGE_ENTRY:
|
||||
*os << "UNEXPECTED_EMPTY_USAGE_ENTRY";
|
||||
break;
|
||||
case INVALID_USAGE_ENTRY_NUMBER_MODIFICATION:
|
||||
*os << "INVALID_USAGE_ENTRY_NUMBER_MODIFICATION";
|
||||
break;
|
||||
case USAGE_INVALID_NEW_ENTRY: *os << "USAGE_INVALID_NEW_ENTRY";
|
||||
break;
|
||||
case USAGE_INVALID_PARAMETERS_1: *os << "USAGE_INVALID_PARAMETERS_1";
|
||||
break;
|
||||
case USAGE_GET_ENTRY_RETRIEVE_LICENSE_FAILED:
|
||||
*os << "USAGE_GET_ENTRY_RETRIEVE_LICENSE_FAILED";
|
||||
break;
|
||||
case USAGE_GET_ENTRY_RETRIEVE_USAGE_INFO_FAILED:
|
||||
*os << "USAGE_GET_ENTRY_RETRIEVE_USAGE_INFO_FAILED";
|
||||
break;
|
||||
case USAGE_GET_ENTRY_RETRIEVE_INVALID_STORAGE_TYPE:
|
||||
*os << "USAGE_GET_ENTRY_RETRIEVE_INVALID_STORAGE_TYPE";
|
||||
break;
|
||||
case USAGE_ENTRY_NUMBER_MISMATCH: *os << "USAGE_ENTRY_NUMBER_MISMATCH";
|
||||
break;
|
||||
case USAGE_STORE_LICENSE_FAILED: *os << "USAGE_STORE_LICENSE_FAILED";
|
||||
break;
|
||||
case USAGE_STORE_USAGE_INFO_FAILED: *os << "USAGE_STORE_USAGE_INFO_FAILED";
|
||||
break;
|
||||
case USAGE_INVALID_LOAD_ENTRY: *os << "USAGE_INVALID_LOAD_ENTRY";
|
||||
break;
|
||||
case RELEASE_USAGE_INFO_FAILED: *os << "RELEASE_USAGE_INFO_FAILED";
|
||||
break;
|
||||
case INCORRECT_USAGE_SUPPORT_TYPE_1:
|
||||
*os << "INCORRECT_USAGE_SUPPORT_TYPE_1";
|
||||
break;
|
||||
case INCORRECT_USAGE_SUPPORT_TYPE_2:
|
||||
*os << "INCORRECT_USAGE_SUPPORT_TYPE_2";
|
||||
break;
|
||||
case KEY_PROHIBITED_FOR_SECURITY_LEVEL:
|
||||
*os << "KEY_PROHIBITED_FOR_SECURITY_LEVEL";
|
||||
break;
|
||||
case KEY_NOT_FOUND_IN_SESSION:
|
||||
*os << "KEY_NOT_FOUND_IN_SESSION";
|
||||
break;
|
||||
case NO_USAGE_ENTRIES: *os << "NO_USAGE_ENTRIES";
|
||||
break;
|
||||
case LIST_LICENSE_ERROR_1: *os << "LIST_LICENSE_ERROR_1";
|
||||
break;
|
||||
case LIST_LICENSE_ERROR_2: *os << "LIST_LICENSE_ERROR_2";
|
||||
@@ -487,27 +599,18 @@ void PrintTo(const enum CdmResponseType& value, ::std::ostream* os) {
|
||||
break;
|
||||
case PARSE_RESPONSE_ERROR_4: *os << "PARSE_RESPONSE_ERROR_4";
|
||||
break;
|
||||
case USAGE_STORE_ENTRY_RETRIEVE_LICENSE_FAILED:
|
||||
*os << "USAGE_STORE_ENTRY_RETRIEVE_LICENSE_FAILED";
|
||||
break;
|
||||
case USAGE_STORE_ENTRY_RETRIEVE_USAGE_INFO_FAILED:
|
||||
*os << "USAGE_STORE_ENTRY_RETRIEVE_USAGE_INFO_FAILED";
|
||||
break;
|
||||
case USAGE_STORE_ENTRY_RETRIEVE_INVALID_STORAGE_TYPE:
|
||||
*os << "USAGE_STORE_ENTRY_RETRIEVE_INVALID_STORAGE_TYPE";
|
||||
break;
|
||||
case LICENSE_REQUEST_INVALID_SUBLICENSE:
|
||||
*os << "LICENSE_REQUEST_INVALID_SUBLICENSE";
|
||||
break;
|
||||
case INVALID_SESSION_1:
|
||||
*os << "INVALID_SESSION_1";
|
||||
break;
|
||||
case NO_DEVICE_KEY_1:
|
||||
*os << "NO_DEVICE_KEY_1";
|
||||
break;
|
||||
case NO_CONTENT_KEY_2:
|
||||
*os << "NO_CONTENT_KEY_2";
|
||||
break;
|
||||
case INSUFFICIENT_CRYPTO_RESOURCES_2:
|
||||
*os << "INSUFFICIENT_CRYPTO_RESOURCES_2";
|
||||
break;
|
||||
case UNKNOWN_SELECT_KEY_ERROR_1:
|
||||
*os << "UNKNOWN_SELECT_KEY_ERROR_1";
|
||||
break;
|
||||
case UNKNOWN_SELECT_KEY_ERROR_2:
|
||||
*os << "UNKNOWN_SELECT_KEY_ERROR_2";
|
||||
break;
|
||||
default:
|
||||
*os << "Unknown CdmResponseType";
|
||||
break;
|
||||
|
||||
@@ -171,7 +171,6 @@ bool UrlRequest::PostCertRequestInQueryString(const std::string& data) {
|
||||
path.append("signedRequest=");
|
||||
path.append(data);
|
||||
return PostRequestWithPath(path, "");
|
||||
return true;
|
||||
}
|
||||
|
||||
} // namespace wvcdm
|
||||
|
||||
1791
core/test/usage_table_header_unittest.cpp
Normal file
1791
core/test/usage_table_header_unittest.cpp
Normal file
File diff suppressed because it is too large
Load Diff
Reference in New Issue
Block a user