diff options
author | Marcus Hagerott <mhagerott@google.com> | 2016-08-18 23:23:22 +0000 |
---|---|---|
committer | android-build-merger <android-build-merger@google.com> | 2016-08-18 23:23:22 +0000 |
commit | e5456863086df1752ba1d0b145145fc2bc6f4707 (patch) | |
tree | fc6f87e6e06eaefad97eb979c949e6017d360f5f | |
parent | b30e04b5bd29c31f6bb7300f35647a00d974e182 (diff) | |
parent | 0d1de54e4a5b9404228434b32dfadd4425748c15 (diff) | |
download | packages_apps_Contacts-e5456863086df1752ba1d0b145145fc2bc6f4707.tar.gz packages_apps_Contacts-e5456863086df1752ba1d0b145145fc2bc6f4707.tar.bz2 packages_apps_Contacts-e5456863086df1752ba1d0b145145fc2bc6f4707.zip |
Fix GroupsDaoIntegrationTests on API 21
am: 0d1de54e4a
Change-Id: Ic597a56c9ec8cdec45da84369b6c964f469199db
-rw-r--r-- | tests/src/com/android/contacts/GroupsDaoIntegrationTests.java | 195 |
1 files changed, 108 insertions, 87 deletions
diff --git a/tests/src/com/android/contacts/GroupsDaoIntegrationTests.java b/tests/src/com/android/contacts/GroupsDaoIntegrationTests.java index d2e42837d..f6925ad3e 100644 --- a/tests/src/com/android/contacts/GroupsDaoIntegrationTests.java +++ b/tests/src/com/android/contacts/GroupsDaoIntegrationTests.java @@ -16,15 +16,16 @@ package com.android.contacts; -import android.accounts.Account; -import android.accounts.AccountManager; +import android.content.ContentProviderOperation; import android.content.ContentResolver; import android.content.ContentUris; import android.content.ContentValues; import android.content.Context; +import android.content.OperationApplicationException; import android.database.Cursor; import android.net.Uri; import android.os.Bundle; +import android.os.RemoteException; import android.provider.ContactsContract; import android.provider.ContactsContract.CommonDataKinds.GroupMembership; import android.provider.ContactsContract.Data; @@ -32,24 +33,23 @@ import android.test.InstrumentationTestCase; import com.android.contacts.common.model.account.AccountWithDataSet; +import java.util.ArrayList; +import java.util.List; + /** * Tests of GroupsDaoImpl that perform DB operations directly against CP2 */ public class GroupsDaoIntegrationTests extends InstrumentationTestCase { - private Account mAccount; - private ContentResolver cr; + private ContentResolver mResolver; + private List<Uri> mTestRecords; @Override protected void setUp() throws Exception { super.setUp(); - mAccount = new Account(getClass().getSimpleName() + "_t" + - System.currentTimeMillis(), "com.android.contacts.tests.authtest.basic"); - AccountManager accountManager = (AccountManager) getContext() - .getSystemService(Context.ACCOUNT_SERVICE); - accountManager.addAccountExplicitly(mAccount, null, null); - cr = getContext().getContentResolver(); + mTestRecords = new ArrayList<>(); + mResolver = getContext().getContentResolver(); } @Override @@ -57,63 +57,50 @@ public class GroupsDaoIntegrationTests extends InstrumentationTestCase { super.tearDown(); // Cleanup anything leftover by the tests. - // the ACCOUNT_NAME should be unique because it contains a timestamp - final Uri groupsUri = ContactsContract.Groups.CONTENT_URI.buildUpon() - .appendQueryParameter(ContactsContract.CALLER_IS_SYNCADAPTER, "true").build(); - final Uri rawContactsUri = ContactsContract.RawContacts.CONTENT_URI.buildUpon() - .appendQueryParameter(ContactsContract.CALLER_IS_SYNCADAPTER, "true").build(); - getContext().getContentResolver().delete(groupsUri, - ContactsContract.Groups.ACCOUNT_NAME + "=?", new String[] { mAccount.name }); - getContext().getContentResolver().delete(rawContactsUri, - ContactsContract.RawContacts.ACCOUNT_NAME + "=?", new String[] { mAccount.name }); - - if (mAccount != null) { - AccountManager accountManager = (AccountManager) getContext() - .getSystemService(Context.ACCOUNT_SERVICE); - accountManager.removeAccountExplicitly(mAccount); - mAccount = null; - } + cleanupTestRecords(); + mTestRecords.clear(); } public void test_createGroup_createsGroupWithCorrectTitle() throws Exception { - ContactSaveService.GroupsDaoImpl sut = createDao(); - Uri uri = sut.create("Test Create Group", getTestAccount()); + final ContactSaveService.GroupsDao sut = createDao(); + final Uri uri = sut.create("Test Create Group", getLocalAccount()); assertNotNull(uri); assertGroupHasTitle(uri, "Test Create Group"); } public void test_deleteEmptyGroup_marksRowDeleted() throws Exception { - ContactSaveService.GroupsDaoImpl sut = createDao(); - Uri uri = sut.create("Test Delete Group", getTestAccount()); + final ContactSaveService.GroupsDao sut = createDao(); + final Uri uri = sut.create("Test Delete Group", getLocalAccount()); assertEquals(1, sut.delete(uri)); - Cursor cursor = cr.query(uri, null, null, null, null, null); + final Cursor cursor = mResolver.query(uri, null, null, null, null, null); try { cursor.moveToFirst(); - assertEquals(1, cursor.getInt(cursor.getColumnIndexOrThrow(ContactsContract.Groups.DELETED))); + assertEquals(1, cursor.getInt(cursor.getColumnIndexOrThrow( + ContactsContract.Groups.DELETED))); } finally { cursor.close(); } } public void test_undoDeleteEmptyGroup_createsGroupWithMatchingTitle() throws Exception { - ContactSaveService.GroupsDaoImpl sut = createDao(); - Uri uri = sut.create("Test Undo Delete Empty Group", getTestAccount()); + final ContactSaveService.GroupsDao sut = createDao(); + final Uri uri = sut.create("Test Undo Delete Empty Group", getLocalAccount()); - Bundle undoData = sut.captureDeletionUndoData(uri); + final Bundle undoData = sut.captureDeletionUndoData(uri); assertEquals(1, sut.delete(uri)); - Uri groupUri = sut.undoDeletion(undoData); + final Uri groupUri = sut.undoDeletion(undoData); assertGroupHasTitle(groupUri, "Test Undo Delete Empty Group"); } public void test_deleteNonEmptyGroup_removesGroupAndMembers() throws Exception { - final ContactSaveService.GroupsDaoImpl sut = createDao(); - final Uri groupUri = sut.create("Test delete non-empty group", getTestAccount()); + final ContactSaveService.GroupsDao sut = createDao(); + final Uri groupUri = sut.create("Test delete non-empty group", getLocalAccount()); final long groupId = ContentUris.parseId(groupUri); addMemberToGroup(ContentUris.parseId(createRawContact()), groupId); @@ -121,7 +108,7 @@ public class GroupsDaoIntegrationTests extends InstrumentationTestCase { assertEquals(1, sut.delete(groupUri)); - final Cursor cursor = cr.query(Data.CONTENT_URI, null, + final Cursor cursor = mResolver.query(Data.CONTENT_URI, null, Data.MIMETYPE + "=? AND " + GroupMembership.GROUP_ROW_ID + "=?", new String[] { GroupMembership.CONTENT_ITEM_TYPE, String.valueOf(groupId) }, null, null); @@ -138,14 +125,14 @@ public class GroupsDaoIntegrationTests extends InstrumentationTestCase { } public void test_undoDeleteNonEmptyGroup_restoresGroupAndMembers() throws Exception { - final ContactSaveService.GroupsDaoImpl sut = createDao(); - final Uri groupUri = sut.create("Test undo delete non-empty group", getTestAccount()); + final ContactSaveService.GroupsDao sut = createDao(); + final Uri groupUri = sut.create("Test undo delete non-empty group", getLocalAccount()); final long groupId = ContentUris.parseId(groupUri); addMemberToGroup(ContentUris.parseId(createRawContact()), groupId); addMemberToGroup(ContentUris.parseId(createRawContact()), groupId); - Bundle undoData = sut.captureDeletionUndoData(groupUri); + final Bundle undoData = sut.captureDeletionUndoData(groupUri); sut.delete(groupUri); @@ -153,7 +140,7 @@ public class GroupsDaoIntegrationTests extends InstrumentationTestCase { final long newGroupId = ContentUris.parseId(recreatedGroup); - final Cursor cursor = cr.query(Data.CONTENT_URI, null, + final Cursor cursor = mResolver.query(Data.CONTENT_URI, null, Data.MIMETYPE + "=? AND " + GroupMembership.GROUP_ROW_ID + "=?", new String[] { GroupMembership.CONTENT_ITEM_TYPE, String.valueOf(newGroupId) }, null, null); @@ -166,56 +153,45 @@ public class GroupsDaoIntegrationTests extends InstrumentationTestCase { } public void test_captureUndoDataForDeletedGroup_returnsEmptyBundle() { - final ContactSaveService.GroupsDaoImpl sut = createDao(); + final ContactSaveService.GroupsDao sut = createDao(); - Uri uri = sut.create("a deleted group", getTestAccount()); + final Uri uri = sut.create("a deleted group", getLocalAccount()); sut.delete(uri); - Bundle undoData = sut.captureDeletionUndoData(uri); + final Bundle undoData = sut.captureDeletionUndoData(uri); assertTrue(undoData.isEmpty()); } public void test_captureUndoDataForNonExistentGroup_returnsEmptyBundle() { - final ContactSaveService.GroupsDaoImpl sut = createDao(); + final ContactSaveService.GroupsDao sut = createDao(); // This test could potentially be flaky if this ID exists for some reason. 10 is subtracted // to reduce the likelihood of this happening; some other test may use Integer.MAX_VALUE // or nearby values to cover some special case or boundary condition. final long nonExistentId = Integer.MAX_VALUE - 10; - Bundle undoData = sut.captureDeletionUndoData(ContentUris + final Bundle undoData = sut.captureDeletionUndoData(ContentUris .withAppendedId(ContactsContract.Groups.CONTENT_URI, nonExistentId)); assertTrue(undoData.isEmpty()); } public void test_undoWithEmptyBundle_doesNothing() { - final ContactSaveService.GroupsDaoImpl sut = createDao(); + final ContactSaveService.GroupsDao sut = createDao(); - Cursor cursor = queryGroupsForTestAccount(); - try { - assertEquals(0, cursor.getCount()); - } finally { - cursor.close(); - } + final Uri uri = sut.undoDeletion(new Bundle()); - sut.undoDeletion(new Bundle()); - - cursor = queryGroupsForTestAccount(); - try { - assertEquals(0, cursor.getCount()); - } finally { - cursor.close(); - } + assertNull(uri); } public void test_undoDeleteEmptyGroupWithMissingMembersKey_shouldRecreateGroup() { - final ContactSaveService.GroupsDaoImpl sut = createDao(); - final Uri groupUri = sut.create("Test undo delete null memberIds", getTestAccount()); + final ContactSaveService.GroupsDao sut = createDao(); + final Uri groupUri = sut.create("Test undo delete null memberIds", getLocalAccount()); - Bundle undoData = sut.captureDeletionUndoData(groupUri); + final Bundle undoData = sut.captureDeletionUndoData(groupUri); undoData.remove(ContactSaveService.GroupsDaoImpl.KEY_GROUP_MEMBERS); + sut.delete(groupUri); sut.undoDeletion(undoData); @@ -223,7 +199,8 @@ public class GroupsDaoIntegrationTests extends InstrumentationTestCase { } private void assertGroupHasTitle(Uri groupUri, String title) { - final Cursor cursor = cr.query(groupUri, new String[] { ContactsContract.Groups.TITLE }, + final Cursor cursor = mResolver.query(groupUri, + new String[] { ContactsContract.Groups.TITLE }, ContactsContract.Groups.DELETED + "=?", new String[] { "0" }, null, null); try { @@ -236,11 +213,10 @@ public class GroupsDaoIntegrationTests extends InstrumentationTestCase { } private void assertGroupWithTitleExists(String title) { - final Cursor cursor = cr.query(ContactsContract.Groups.CONTENT_URI, null, + final Cursor cursor = mResolver.query(ContactsContract.Groups.CONTENT_URI, null, ContactsContract.Groups.TITLE + "=? AND " + - ContactsContract.Groups.DELETED + "=? AND " + - ContactsContract.Groups.ACCOUNT_NAME + "=?", - new String[] { title, "0", mAccount.name }, null, null); + ContactsContract.Groups.DELETED + "=?", + new String[] { title, "0" }, null, null); try { assertTrue("No group exists with title \"" + title + "\"", cursor.getCount() > 0); } finally { @@ -248,36 +224,81 @@ public class GroupsDaoIntegrationTests extends InstrumentationTestCase { } } - private Cursor queryGroupsForTestAccount() { - return cr.query(ContactsContract.Groups.CONTENT_URI, null, - ContactsContract.Groups.ACCOUNT_NAME + "=?", new String[] { mAccount.name }, null); - } - - public ContactSaveService.GroupsDaoImpl createDao() { - return new ContactSaveService.GroupsDaoImpl(getContext()); + public ContactSaveService.GroupsDao createDao() { + return new GroupsDaoWrapper(new ContactSaveService.GroupsDaoImpl(getContext())); } private Uri createRawContact() { - ContentValues values = new ContentValues(); - values.put(ContactsContract.RawContacts.ACCOUNT_NAME, mAccount.name); - values.put(ContactsContract.RawContacts.ACCOUNT_TYPE, mAccount.type); - return cr.insert(ContactsContract.RawContacts.CONTENT_URI, values); + final ContentValues values = new ContentValues(); + values.putNull(ContactsContract.RawContacts.ACCOUNT_NAME); + values.putNull(ContactsContract.RawContacts.ACCOUNT_TYPE); + final Uri result = mResolver.insert(ContactsContract.RawContacts.CONTENT_URI, values); + mTestRecords.add(result); + return result; } private Uri addMemberToGroup(long rawContactId, long groupId) { - ContentValues values = new ContentValues(); + final ContentValues values = new ContentValues(); values.put(Data.RAW_CONTACT_ID, rawContactId); values.put(Data.MIMETYPE, GroupMembership.CONTENT_ITEM_TYPE); values.put(GroupMembership.GROUP_ROW_ID, groupId); - return cr.insert(Data.CONTENT_URI, values); - } - private AccountWithDataSet getTestAccount() { - return new AccountWithDataSet(mAccount.name, mAccount.type, null); + // Dont' need to add to testRecords because it will be cleaned up when parent raw_contact + // is deleted. + return mResolver.insert(Data.CONTENT_URI, values); } private Context getContext() { return getInstrumentation().getTargetContext(); } + + private AccountWithDataSet getLocalAccount() { + return new AccountWithDataSet(null, null, null); + } + + private void cleanupTestRecords() throws RemoteException, OperationApplicationException { + final ArrayList<ContentProviderOperation> ops = new ArrayList<>(); + for (Uri uri : mTestRecords) { + if (uri == null) continue; + ops.add(ContentProviderOperation + .newDelete(uri.buildUpon() + .appendQueryParameter(ContactsContract.CALLER_IS_SYNCADAPTER, "true") + .build()) + .build()); + } + mResolver.applyBatch(ContactsContract.AUTHORITY, ops); + } + + private class GroupsDaoWrapper implements ContactSaveService.GroupsDao { + private final ContactSaveService.GroupsDao mDelegate; + + public GroupsDaoWrapper(ContactSaveService.GroupsDao delegate) { + mDelegate = delegate; + } + + @Override + public Uri create(String title, AccountWithDataSet account) { + final Uri result = mDelegate.create(title, account); + mTestRecords.add(result); + return result; + } + + @Override + public int delete(Uri groupUri) { + return mDelegate.delete(groupUri); + } + + @Override + public Bundle captureDeletionUndoData(Uri groupUri) { + return mDelegate.captureDeletionUndoData(groupUri); + } + + @Override + public Uri undoDeletion(Bundle undoData) { + final Uri result = mDelegate.undoDeletion(undoData); + mTestRecords.add(result); + return result; + } + } } |