Merge "Android CDM: Removed secure stop tests."
This commit is contained in:
@@ -984,68 +984,6 @@ TEST_F(WvCdmExtendedDurationTest, DecryptionCloseSessionConcurrencyTest) {
|
||||
decryptor_->CloseSession(session_id);
|
||||
}
|
||||
|
||||
// TODO(rfrias): Rewite this test when OEMCrypto v13 is the minimum version
|
||||
// supported. The limitation of 50 usage entries are no longer present
|
||||
// when using usage table header+entries.
|
||||
TEST_F(WvCdmExtendedDurationTest, DISABLED_UsageOverflowTest) {
|
||||
Provision();
|
||||
TestWvCdmClientPropertySet client_property_set;
|
||||
TestWvCdmClientPropertySet* property_set = nullptr;
|
||||
|
||||
CdmSecurityLevel security_level = GetDefaultSecurityLevel();
|
||||
FileSystem file_system;
|
||||
DeviceFiles handle(&file_system);
|
||||
EXPECT_TRUE(handle.Init(security_level));
|
||||
std::vector<std::string> provider_session_tokens;
|
||||
EXPECT_TRUE(handle.DeleteAllUsageInfoForApp(
|
||||
DeviceFiles::GetUsageInfoFileName(""), &provider_session_tokens));
|
||||
|
||||
for (size_t i = 0; i < kMaxUsageTableSize + 100; ++i) {
|
||||
decryptor_->OpenSession(config_.key_system(), property_set,
|
||||
kDefaultCdmIdentifier, nullptr, &session_id_);
|
||||
std::string key_id = wvutil::a2bs_hex(
|
||||
"000000427073736800000000" // blob size and pssh
|
||||
"EDEF8BA979D64ACEA3C827DCD51D21ED00000022" // Widevine system id
|
||||
"08011a0d7769646576696e655f74657374220f73" // pssh data
|
||||
"747265616d696e675f636c697035");
|
||||
|
||||
GenerateKeyRequest(key_id, kLicenseTypeStreaming);
|
||||
VerifyKeyRequestResponse(config_.license_server(), config_.client_auth(),
|
||||
false);
|
||||
decryptor_->CloseSession(session_id_);
|
||||
}
|
||||
|
||||
CdmUsageInfo usage_info;
|
||||
CdmUsageInfoReleaseMessage release_msg;
|
||||
CdmResponseType status =
|
||||
decryptor_->GetUsageInfo("", kDefaultCdmIdentifier, &usage_info);
|
||||
EXPECT_EQ(usage_info.empty() ? NO_ERROR : KEY_MESSAGE, status);
|
||||
int error_count = 0;
|
||||
while (usage_info.size() > 0) {
|
||||
for (size_t i = 0; i < usage_info.size(); ++i) {
|
||||
release_msg = GetUsageInfoResponse(config_.license_server(),
|
||||
config_.client_auth(), usage_info[i]);
|
||||
EXPECT_EQ(NO_ERROR,
|
||||
decryptor_->ReleaseUsageInfo(release_msg, kDefaultCdmIdentifier))
|
||||
<< i << "/" << usage_info.size() << " (err " << (error_count++) << ")"
|
||||
<< release_msg;
|
||||
}
|
||||
ASSERT_LE(error_count, 100); // Give up after 100 failures.
|
||||
status = decryptor_->GetUsageInfo("", kDefaultCdmIdentifier, &usage_info);
|
||||
switch (status) {
|
||||
case KEY_MESSAGE:
|
||||
EXPECT_FALSE(usage_info.empty());
|
||||
break;
|
||||
case NO_ERROR:
|
||||
EXPECT_TRUE(usage_info.empty());
|
||||
break;
|
||||
default:
|
||||
FAIL() << "GetUsageInfo failed with error " << static_cast<int>(status);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// This test verifies that sessions allocated internally during key release
|
||||
// message generation are deallocated after their time to live period expires
|
||||
// by timer events (if other sessions are open).
|
||||
@@ -1342,215 +1280,6 @@ TEST_P(WvCdmStreamingNoPstTest, UsageTest) {
|
||||
INSTANTIATE_TEST_CASE_P(Cdm, WvCdmStreamingNoPstTest,
|
||||
::testing::Values(0, 1, 2));
|
||||
|
||||
class WvCdmStreamingPstTest : public WvCdmExtendedDurationTest,
|
||||
public ::testing::WithParamInterface<size_t> {};
|
||||
|
||||
TEST_P(WvCdmStreamingPstTest, UsageTest) {
|
||||
Unprovision();
|
||||
Provision();
|
||||
|
||||
decryptor_->OpenSession(config_.key_system(), nullptr, kDefaultCdmIdentifier,
|
||||
nullptr, &session_id_);
|
||||
GenerateKeyRequest(kStreamingClip8PstInitData, kLicenseTypeStreaming);
|
||||
VerifyKeyRequestResponse(config_.license_server(), config_.client_auth(),
|
||||
false);
|
||||
|
||||
ValidateResponse(video_widevine::STREAMING, true);
|
||||
|
||||
int64_t initial_license_duration_remaining = 0;
|
||||
int64_t initial_playback_duration_remaining = 0;
|
||||
QueryKeyStatus(true, false, &initial_license_duration_remaining,
|
||||
&initial_playback_duration_remaining);
|
||||
|
||||
sleep(kMinute);
|
||||
int64_t expected_seconds_since_license_received = kMinute;
|
||||
int64_t expected_seconds_since_initial_playback = 0;
|
||||
int64_t expected_seconds_since_last_playback = 0;
|
||||
|
||||
for (size_t i = 0; i < GetParam(); ++i) {
|
||||
// Decrypt data
|
||||
SubSampleInfo* data = &kEncryptedStreamingClip8SubSample;
|
||||
for (size_t i = 0; i < data->num_of_subsamples; i++) {
|
||||
std::vector<uint8_t> decrypt_buffer((data + i)->encrypt_data.size());
|
||||
CdmDecryptionParameters decryption_parameters(
|
||||
&(data + i)->key_id, &(data + i)->encrypt_data.front(),
|
||||
(data + i)->encrypt_data.size(), &(data + i)->iv,
|
||||
(data + i)->block_offset, &decrypt_buffer[0]);
|
||||
decryption_parameters.is_encrypted = (data + i)->is_encrypted;
|
||||
decryption_parameters.is_secure = (data + i)->is_secure;
|
||||
decryption_parameters.subsample_flags = (data + i)->subsample_flags;
|
||||
EXPECT_EQ(NO_ERROR,
|
||||
decryptor_->Decrypt(session_id_, (data + i)->validate_key_id,
|
||||
decryption_parameters));
|
||||
|
||||
EXPECT_EQ((data + i)->decrypt_data, decrypt_buffer);
|
||||
}
|
||||
|
||||
sleep(kMinute);
|
||||
expected_seconds_since_license_received += kMinute;
|
||||
expected_seconds_since_initial_playback += kMinute;
|
||||
expected_seconds_since_last_playback = kMinute;
|
||||
}
|
||||
|
||||
// Query and validate usage information
|
||||
int64_t license_duration_remaining = 0;
|
||||
int64_t playback_duration_remaining = 0;
|
||||
QueryKeyStatus(true, false, &license_duration_remaining,
|
||||
&playback_duration_remaining);
|
||||
|
||||
if (initial_license_duration_remaining == kUnlimitedDurationValue) {
|
||||
EXPECT_EQ(license_duration_remaining, kUnlimitedDurationValue);
|
||||
} else {
|
||||
EXPECT_NEAR(initial_license_duration_remaining - license_duration_remaining,
|
||||
expected_seconds_since_license_received, kClockTolerance)
|
||||
<< "initial_license_duration_remaining = "
|
||||
<< initial_license_duration_remaining
|
||||
<< ", license_duration_remaining = " << license_duration_remaining;
|
||||
}
|
||||
|
||||
if (initial_playback_duration_remaining == kUnlimitedDurationValue) {
|
||||
EXPECT_EQ(playback_duration_remaining, kUnlimitedDurationValue);
|
||||
} else {
|
||||
EXPECT_NEAR(initial_playback_duration_remaining - playback_duration_remaining,
|
||||
expected_seconds_since_initial_playback, kClockTolerance)
|
||||
<< "initial_playback_duration_remaining = "
|
||||
<< initial_playback_duration_remaining
|
||||
<< ", playback_duration_remaining = " << playback_duration_remaining;
|
||||
}
|
||||
|
||||
decryptor_->CloseSession(session_id_);
|
||||
}
|
||||
|
||||
INSTANTIATE_TEST_CASE_P(Cdm, WvCdmStreamingPstTest, ::testing::Values(0, 1, 2));
|
||||
|
||||
class WvCdmStreamingUsageReportTest
|
||||
: public WvCdmExtendedDurationTest,
|
||||
public ::testing::WithParamInterface<size_t> {};
|
||||
|
||||
TEST_P(WvCdmStreamingUsageReportTest, UsageTest) {
|
||||
Unprovision();
|
||||
Provision();
|
||||
|
||||
decryptor_->OpenSession(config_.key_system(), nullptr, kDefaultCdmIdentifier,
|
||||
nullptr, &session_id_);
|
||||
GenerateKeyRequest(kStreamingClip8PstInitData, kLicenseTypeStreaming);
|
||||
VerifyKeyRequestResponse(config_.license_server(), config_.client_auth(),
|
||||
false);
|
||||
|
||||
ValidateResponse(video_widevine::STREAMING, true);
|
||||
|
||||
int64_t initial_license_duration_remaining = 0;
|
||||
int64_t initial_playback_duration_remaining = 0;
|
||||
QueryKeyStatus(true, false, &initial_license_duration_remaining,
|
||||
&initial_playback_duration_remaining);
|
||||
|
||||
sleep(kMinute);
|
||||
int64_t expected_seconds_since_license_received = kMinute;
|
||||
int64_t expected_seconds_since_initial_playback = 0;
|
||||
int64_t expected_seconds_since_last_playback = 0;
|
||||
|
||||
for (size_t i = 0; i < GetParam(); ++i) {
|
||||
// Decrypt data
|
||||
SubSampleInfo* data = &kEncryptedStreamingClip8SubSample;
|
||||
for (size_t i = 0; i < data->num_of_subsamples; i++) {
|
||||
std::vector<uint8_t> decrypt_buffer((data + i)->encrypt_data.size());
|
||||
CdmDecryptionParameters decryption_parameters(
|
||||
&(data + i)->key_id, &(data + i)->encrypt_data.front(),
|
||||
(data + i)->encrypt_data.size(), &(data + i)->iv,
|
||||
(data + i)->block_offset, &decrypt_buffer[0]);
|
||||
decryption_parameters.is_encrypted = (data + i)->is_encrypted;
|
||||
decryption_parameters.is_secure = (data + i)->is_secure;
|
||||
decryption_parameters.subsample_flags = (data + i)->subsample_flags;
|
||||
EXPECT_EQ(NO_ERROR,
|
||||
decryptor_->Decrypt(session_id_, (data + i)->validate_key_id,
|
||||
decryption_parameters));
|
||||
|
||||
EXPECT_EQ((data + i)->decrypt_data, decrypt_buffer);
|
||||
}
|
||||
|
||||
sleep(kMinute);
|
||||
expected_seconds_since_license_received += kMinute;
|
||||
expected_seconds_since_initial_playback += kMinute;
|
||||
expected_seconds_since_last_playback = kMinute;
|
||||
}
|
||||
|
||||
// Query and validate usage information
|
||||
int64_t license_duration_remaining = 0;
|
||||
int64_t playback_duration_remaining = 0;
|
||||
QueryKeyStatus(true, false, &license_duration_remaining,
|
||||
&playback_duration_remaining);
|
||||
|
||||
// For unlimited "rental durations", the "license duration" will
|
||||
// effectively be unlimited. Remaining license duration in this
|
||||
// case is represented by |kUnlimitedDurationValue| and will not
|
||||
// change over time.
|
||||
if (initial_license_duration_remaining == kUnlimitedDurationValue) {
|
||||
EXPECT_EQ(license_duration_remaining, kUnlimitedDurationValue);
|
||||
} else {
|
||||
EXPECT_NEAR(initial_license_duration_remaining - license_duration_remaining,
|
||||
expected_seconds_since_license_received, kClockTolerance)
|
||||
<< "initial_license_duration_remaining = "
|
||||
<< initial_license_duration_remaining
|
||||
<< ", license_duration_remaining = " << license_duration_remaining;
|
||||
}
|
||||
|
||||
if (initial_playback_duration_remaining == kUnlimitedDurationValue) {
|
||||
EXPECT_EQ(playback_duration_remaining, kUnlimitedDurationValue);
|
||||
} else {
|
||||
EXPECT_NEAR(initial_playback_duration_remaining - playback_duration_remaining,
|
||||
expected_seconds_since_initial_playback, kClockTolerance)
|
||||
<< "initial_playback_duration_remaining = "
|
||||
<< initial_playback_duration_remaining
|
||||
<< ", playback_duration_remaining = " << playback_duration_remaining;
|
||||
}
|
||||
|
||||
decryptor_->CloseSession(session_id_);
|
||||
|
||||
// Create usage report and validate
|
||||
CdmUsageInfo usage_info;
|
||||
CdmUsageInfoReleaseMessage release_msg;
|
||||
CdmResponseType status =
|
||||
decryptor_->GetUsageInfo("", kDefaultCdmIdentifier, &usage_info);
|
||||
EXPECT_EQ(usage_info.empty() ? NO_ERROR : KEY_MESSAGE, status);
|
||||
int error_count = 0;
|
||||
while (usage_info.size() > 0) {
|
||||
for (size_t i = 0; i < usage_info.size(); ++i) {
|
||||
ValidateReleaseRequest(usage_info[i],
|
||||
expected_seconds_since_initial_playback != 0,
|
||||
expected_seconds_since_license_received,
|
||||
expected_seconds_since_initial_playback,
|
||||
expected_seconds_since_last_playback);
|
||||
release_msg = GetUsageInfoResponse(config_.license_server(),
|
||||
config_.client_auth(), usage_info[i]);
|
||||
EXPECT_EQ(NO_ERROR,
|
||||
decryptor_->ReleaseUsageInfo(release_msg, kDefaultCdmIdentifier))
|
||||
<< i << "/" << usage_info.size() << " (err " << (error_count++) << ")"
|
||||
<< release_msg;
|
||||
}
|
||||
ASSERT_LE(error_count, 100); // Give up after 100 failures.
|
||||
status = decryptor_->GetUsageInfo("", kDefaultCdmIdentifier, &usage_info);
|
||||
switch (status) {
|
||||
case KEY_MESSAGE:
|
||||
EXPECT_FALSE(usage_info.empty());
|
||||
break;
|
||||
case NO_ERROR:
|
||||
EXPECT_TRUE(usage_info.empty());
|
||||
break;
|
||||
default:
|
||||
FAIL() << "GetUsageInfo failed with error " << static_cast<int>(status);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
// Validate that update usage table entry is exercised.
|
||||
drm_metrics::WvCdmMetrics metrics;
|
||||
ASSERT_EQ(NO_ERROR, decryptor_->GetMetrics(kDefaultCdmIdentifier, &metrics));
|
||||
ValidateHasUpdateUsageEntry(metrics);
|
||||
}
|
||||
|
||||
INSTANTIATE_TEST_CASE_P(Cdm, WvCdmStreamingUsageReportTest,
|
||||
::testing::Values(0, 1, 2));
|
||||
|
||||
class WvCdmOfflineUsageReportTest
|
||||
: public WvCdmExtendedDurationTest,
|
||||
public ::testing::WithParamInterface<size_t> {};
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
Reference in New Issue
Block a user