Fix handling of INSUFFICIENT_RESOURCES in LoadEntry
Bug: b/121214641 Merge of http://go/wvgerrit/69703 Test: Android + Linux unit tests LoadEntry attempts to handle INSUFFICIENT_RESOURCES by deleting an entry and retrying, but it's possible that the randomly-generated number of the entry to be deleted might match the entry we want to load. In this case, we have wasted a retry, since the code just continues on to the next iteration. This is changed to generate a number different from the entry to load. Furthermore, if the number of usage entries is 1, we break since there are no more entries to delete besides the one we want to load. The code is also changed to call srand in the creation of the usage_table_header, since without it, rand() would produce the same values, and similarly, our random generation is changed to use a simple mod. Tests are modified to reflect these changes. Change-Id: I95e125b8adbd85d0189f9d40ca15f3fe69e6d6b9
This commit is contained in:
@@ -282,9 +282,12 @@ class MockUsageTableHeader : public UsageTableHeader {
|
||||
|
||||
// gmock methods
|
||||
using ::testing::_;
|
||||
using ::testing::AllOf;
|
||||
using ::testing::AtMost;
|
||||
using ::testing::ElementsAreArray;
|
||||
using ::testing::Ge;
|
||||
using ::testing::Invoke;
|
||||
using ::testing::Lt;
|
||||
using ::testing::NotNull;
|
||||
using ::testing::Return;
|
||||
using ::testing::SaveArg;
|
||||
@@ -977,14 +980,16 @@ TEST_F(UsageTableHeaderTest,
|
||||
MockUsageTableHeader* mock_usage_table_header = SetUpMock();
|
||||
Init(kSecurityLevelL1, kUsageTableHeader, k10UsageEntryInfoVector);
|
||||
|
||||
uint32_t usage_entry_number_to_load = rand() /
|
||||
(RAND_MAX / k10UsageEntryInfoVector.size() + 1);
|
||||
int64_t usage_entry_number_to_load =
|
||||
MockUsageTableHeader::GetRandomInRange(k10UsageEntryInfoVector.size());
|
||||
ASSERT_THAT(usage_entry_number_to_load,
|
||||
AllOf(Ge(0), Lt((int64_t)k10UsageEntryInfoVector.size())));
|
||||
CdmUsageEntry usage_entry_to_load = kUsageEntry;
|
||||
|
||||
// Setup expectations
|
||||
EXPECT_CALL(*mock_usage_table_header,
|
||||
DeleteEntry(_, device_files_, NotNull()))
|
||||
.Times(AtMost(1))
|
||||
.Times(1)
|
||||
.WillRepeatedly(
|
||||
DoAll(Invoke(this, &UsageTableHeaderTest::DeleteEntry),
|
||||
Return(NO_ERROR)));
|
||||
@@ -1008,14 +1013,16 @@ TEST_F(UsageTableHeaderTest,
|
||||
MockUsageTableHeader* mock_usage_table_header = SetUpMock();
|
||||
Init(kSecurityLevelL1, kUsageTableHeader, k10UsageEntryInfoVector);
|
||||
|
||||
uint32_t usage_entry_number_to_load = rand() /
|
||||
(RAND_MAX / k10UsageEntryInfoVector.size() + 1);
|
||||
int64_t usage_entry_number_to_load =
|
||||
MockUsageTableHeader::GetRandomInRange(k10UsageEntryInfoVector.size());
|
||||
ASSERT_THAT(usage_entry_number_to_load,
|
||||
AllOf(Ge(0), Lt((int64_t)k10UsageEntryInfoVector.size())));
|
||||
CdmUsageEntry usage_entry_to_load = kUsageEntry;
|
||||
|
||||
// Setup expectations
|
||||
EXPECT_CALL(*mock_usage_table_header,
|
||||
DeleteEntry(_, device_files_, NotNull()))
|
||||
.Times(AtMost(2))
|
||||
.Times(2)
|
||||
.WillRepeatedly(
|
||||
DoAll(Invoke(this, &UsageTableHeaderTest::DeleteEntry),
|
||||
Return(NO_ERROR)));
|
||||
@@ -1039,21 +1046,23 @@ TEST_F(UsageTableHeaderTest, LoadEntry_LoadUsageEntryFailsThrice) {
|
||||
MockUsageTableHeader* mock_usage_table_header = SetUpMock();
|
||||
Init(kSecurityLevelL1, kUsageTableHeader, k10UsageEntryInfoVector);
|
||||
|
||||
uint32_t usage_entry_number_to_load = rand() /
|
||||
(RAND_MAX / k10UsageEntryInfoVector.size() + 1);
|
||||
int64_t usage_entry_number_to_load =
|
||||
MockUsageTableHeader::GetRandomInRange(k10UsageEntryInfoVector.size());
|
||||
ASSERT_THAT(usage_entry_number_to_load,
|
||||
AllOf(Ge(0), Lt((int64_t)k10UsageEntryInfoVector.size())));
|
||||
CdmUsageEntry usage_entry_to_load = kUsageEntry;
|
||||
|
||||
// Setup expectations
|
||||
EXPECT_CALL(*mock_usage_table_header,
|
||||
DeleteEntry(_, device_files_, NotNull()))
|
||||
.Times(AtMost(3))
|
||||
.Times(3)
|
||||
.WillRepeatedly(
|
||||
DoAll(Invoke(this, &UsageTableHeaderTest::DeleteEntry),
|
||||
Return(NO_ERROR)));
|
||||
|
||||
EXPECT_CALL(*crypto_session_,
|
||||
LoadUsageEntry(usage_entry_number_to_load, usage_entry_to_load))
|
||||
.Times(AtMost(4))
|
||||
.Times(4)
|
||||
.WillRepeatedly(Return(INSUFFICIENT_CRYPTO_RESOURCES_3));
|
||||
|
||||
// Now invoke the method under test
|
||||
|
||||
Reference in New Issue
Block a user