KeyChain: Small Grants DB refactoring
Refactor the removeOldGrants method to use Java 7's try-with-resource.
Add tests to show the method isn't broken and is working as intended.
No functional changes.
Bug: 65624467
Change-Id: Iec67c5299b3be38918c4b7a79c000c35855995bf
Test: New Robolectric tests.
diff --git a/robotests/src/com/android/keychain/internal/GrantsDatabaseTest.java b/robotests/src/com/android/keychain/internal/GrantsDatabaseTest.java
index 9dd5946..ecb0889 100644
--- a/robotests/src/com/android/keychain/internal/GrantsDatabaseTest.java
+++ b/robotests/src/com/android/keychain/internal/GrantsDatabaseTest.java
@@ -16,6 +16,10 @@
package com.android.keychain.internal;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.when;
+
+import android.content.pm.PackageManager;
import com.android.keychain.TestConfig;
import org.junit.Assert;
import org.junit.Before;
@@ -96,6 +100,33 @@
}
@Test
+ public void testPurgeOldGrantsDoesNotDeleteGrantsForExistingPackages() {
+ mGrantsDB.setGrant(DUMMY_UID, DUMMY_ALIAS, true);
+ PackageManager pm = mock(PackageManager.class);
+ when(pm.getPackagesForUid(DUMMY_UID)).thenReturn(new String[]{"p"});
+ mGrantsDB.purgeOldGrants(pm);
+ Assert.assertTrue(mGrantsDB.hasGrant(DUMMY_UID, DUMMY_ALIAS));
+ }
+
+ @Test
+ public void testPurgeOldGrantsPurgesAllNonExistingPackages() {
+ mGrantsDB.setGrant(DUMMY_UID, DUMMY_ALIAS, true);
+ mGrantsDB.setGrant(DUMMY_UID2, DUMMY_ALIAS, true);
+ PackageManager pm = mock(PackageManager.class);
+ when(pm.getPackagesForUid(DUMMY_UID)).thenReturn(null);
+ when(pm.getPackagesForUid(DUMMY_UID2)).thenReturn(null);
+ mGrantsDB.purgeOldGrants(pm);
+ Assert.assertFalse(mGrantsDB.hasGrant(DUMMY_UID, DUMMY_ALIAS));
+ Assert.assertFalse(mGrantsDB.hasGrant(DUMMY_UID2, DUMMY_ALIAS));
+ }
+
+ @Test
+ public void testPurgeOldGrantsWorksOnEmptyDatabase() {
+ // Check that NPE is not thrown.
+ mGrantsDB.purgeOldGrants(null);
+ }
+
+ @Test
public void testIsUserSelectable() {
Assert.assertFalse(mGrantsDB.isUserSelectable(DUMMY_ALIAS));
mGrantsDB.setIsUserSelectable(DUMMY_ALIAS, true);
diff --git a/src/com/android/keychain/internal/GrantsDatabase.java b/src/com/android/keychain/internal/GrantsDatabase.java
index 4783378..28605b5 100644
--- a/src/com/android/keychain/internal/GrantsDatabase.java
+++ b/src/com/android/keychain/internal/GrantsDatabase.java
@@ -154,19 +154,11 @@
public void purgeOldGrants(PackageManager pm) {
final SQLiteDatabase db = mDatabaseHelper.getWritableDatabase();
- Cursor cursor = null;
db.beginTransaction();
- try {
- cursor =
- db.query(
- TABLE_GRANTS,
- new String[] {GRANTS_GRANTEE_UID},
- null,
- null,
- GRANTS_GRANTEE_UID,
- null,
- null);
- while (cursor.moveToNext()) {
+ try (Cursor cursor = db.query(
+ TABLE_GRANTS,
+ new String[] {GRANTS_GRANTEE_UID}, null, null, GRANTS_GRANTEE_UID, null, null)) {
+ while ((cursor != null) && (cursor.moveToNext())) {
final int uid = cursor.getInt(0);
final boolean packageExists = pm.getPackagesForUid(uid) != null;
if (packageExists) {
@@ -181,12 +173,9 @@
new String[] {Integer.toString(uid)});
}
db.setTransactionSuccessful();
- } finally {
- if (cursor != null) {
- cursor.close();
- }
- db.endTransaction();
}
+
+ db.endTransaction();
}
public void setIsUserSelectable(final String alias, final boolean userSelectable) {