Delete usage information on insufficient resources
[ Merge of http://go/wvgerrit/58460 ]
If OEMCrypto runs out of space in the usage table header+entries adding
a new license or loading/using an existing one might fail. This CL makes
two modifications to handle this scenario.
* OEMCrypto_ERROR_INSUFFICIENT_RESOURCES will be returned from
OEMCrypto_CreateNewUsageEntry or OEMCrypto_LoadUsageEntry. An attempt
will be made to release a LRU entry from the usage table and retry
the operation. This may be retried 3 times unless success
occurs earlier.
* On initialization, the usage table header is loaded. If there are more than
the minimum number of usage entries (200), an attempt is made to
add a usage entry. If this fails, we are likely in an unrecoverable
state. We then delete all offline licenses, usage information and
recreate the usage table header. This will allow future playback
attempts to succeed and offline licenses to be able to be downloaded
but will lose all current offline licenses and secure stops.
Bug: 112486006
Test: WV unit/integration tests, GtsMediaDrmTest
Playback tests using Netflix and Play movies.
Change-Id: I41a18d69a329f8a96c7b607d299ce73af3d56177
(cherry picked from commit 299b100fc8)
This commit is contained in:
committed by
android-build-team Robot
parent
7023db592c
commit
7b129a2d44
@@ -268,16 +268,26 @@ class WvCdmExtendedDurationTest : public WvCdmTestBase {
|
||||
|
||||
void GenerateKeyRequest(const std::string& init_data,
|
||||
CdmLicenseType license_type) {
|
||||
CdmResponseType response;
|
||||
GenerateKeyRequest(init_data, license_type, &response);
|
||||
EXPECT_EQ(KEY_MESSAGE, response);
|
||||
}
|
||||
|
||||
void GenerateKeyRequest(const std::string& init_data,
|
||||
CdmLicenseType license_type,
|
||||
CdmResponseType *response) {
|
||||
CdmAppParameterMap app_parameters;
|
||||
CdmKeyRequest key_request;
|
||||
|
||||
EXPECT_EQ(KEY_MESSAGE, decryptor_.GenerateKeyRequest(
|
||||
session_id_, key_set_id_, "video/mp4", init_data,
|
||||
license_type, app_parameters, NULL,
|
||||
kDefaultCdmIdentifier, &key_request));
|
||||
EXPECT_EQ(kKeyRequestTypeInitial, key_request.type);
|
||||
key_msg_ = key_request.message;
|
||||
EXPECT_EQ(0u, key_request.url.size());
|
||||
*response = decryptor_.GenerateKeyRequest(
|
||||
session_id_, key_set_id_, "video/mp4", init_data,
|
||||
license_type, app_parameters, NULL,
|
||||
kDefaultCdmIdentifier, &key_request);
|
||||
if (*response == KEY_MESSAGE) {
|
||||
EXPECT_EQ(kKeyRequestTypeInitial, key_request.type);
|
||||
key_msg_ = key_request.message;
|
||||
EXPECT_EQ(0u, key_request.url.size());
|
||||
}
|
||||
}
|
||||
|
||||
void GenerateRenewalRequest(CdmLicenseType license_type,
|
||||
@@ -406,14 +416,21 @@ class WvCdmExtendedDurationTest : public WvCdmTestBase {
|
||||
void VerifyKeyRequestResponse(const std::string& server_url,
|
||||
const std::string& client_auth,
|
||||
bool is_renewal) {
|
||||
std::string resp = GetKeyRequestResponse(server_url, client_auth);
|
||||
VerifyKeyRequestResponse(server_url, client_auth, is_renewal, NULL);
|
||||
}
|
||||
|
||||
if (is_renewal) {
|
||||
// TODO application makes a license request, CDM will renew the license
|
||||
// when appropriate
|
||||
EXPECT_EQ(KEY_ADDED, decryptor_.AddKey(session_id_, resp, &key_set_id_));
|
||||
void VerifyKeyRequestResponse(const std::string& server_url,
|
||||
const std::string& client_auth,
|
||||
bool /* is_renewal */,
|
||||
CdmResponseType* status) {
|
||||
std::string resp = GetKeyRequestResponse(server_url, client_auth);
|
||||
CdmResponseType sts =
|
||||
decryptor_.AddKey(session_id_, resp, &key_set_id_);
|
||||
|
||||
if (status == NULL) {
|
||||
EXPECT_EQ(KEY_ADDED, sts);
|
||||
} else {
|
||||
EXPECT_EQ(KEY_ADDED, decryptor_.AddKey(session_id_, resp, &key_set_id_));
|
||||
*status = sts;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1574,6 +1591,55 @@ TEST_P(WvCdmOfflineUsageReportTest, UsageTest) {
|
||||
|
||||
INSTANTIATE_TEST_CASE_P(Cdm, WvCdmOfflineUsageReportTest,
|
||||
::testing::Values(0, 1, 2));
|
||||
|
||||
// This test verifies that a device can still work if the maximum capacity
|
||||
// of the usage entry table is reached. New usage entries, for offline
|
||||
// licenses, can still be added and existing licenses can still be played back.
|
||||
TEST_F(WvCdmExtendedDurationTest, MaxUsageEntryOfflineRecoveryTest) {
|
||||
Unprovision();
|
||||
Provision();
|
||||
|
||||
// override default settings unless configured through the command line
|
||||
std::string key_id;
|
||||
std::string client_auth;
|
||||
GetOfflineConfiguration(&key_id, &client_auth);
|
||||
|
||||
// Download large number of offline licenses. If OEMCrypto returns
|
||||
// OEMCrypto_ERROR_INSUFFICIENT_RESOURCES when usage table is at capacity,
|
||||
// licenses will be deleted internally to make space and we might
|
||||
// not encounter an error.
|
||||
CdmResponseType response = NO_ERROR;
|
||||
for (size_t i = 0; i < 2000; ++i) {
|
||||
decryptor_.OpenSession(g_key_system, NULL, kDefaultCdmIdentifier, NULL,
|
||||
&session_id_);
|
||||
GenerateKeyRequest(key_id, kLicenseTypeOffline, &response);
|
||||
if (response != KEY_MESSAGE) {
|
||||
decryptor_.CloseSession(session_id_);
|
||||
break;
|
||||
}
|
||||
VerifyKeyRequestResponse(kUatLicenseServer, client_auth, false, &response);
|
||||
if (response != KEY_ADDED) {
|
||||
decryptor_.CloseSession(session_id_);
|
||||
break;
|
||||
}
|
||||
EXPECT_EQ(KEY_ADDED, response);
|
||||
decryptor_.CloseSession(session_id_);
|
||||
}
|
||||
|
||||
// If we encountered an error, verify that on UsageTableHeader creation
|
||||
// the usage entries will be deleted and that we can add new ones.
|
||||
if (response != KEY_ADDED && response != KEY_MESSAGE) {
|
||||
Provision();
|
||||
for (size_t i = 0; i < 10; ++i) {
|
||||
decryptor_.OpenSession(g_key_system, NULL, kDefaultCdmIdentifier, NULL,
|
||||
&session_id_);
|
||||
GenerateKeyRequest(key_id, kLicenseTypeOffline);
|
||||
VerifyKeyRequestResponse(kUatLicenseServer, client_auth, false);
|
||||
decryptor_.CloseSession(session_id_);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
} // namespace wvcdm
|
||||
|
||||
void show_menu(char* prog_name) {
|
||||
|
||||
Reference in New Issue
Block a user