diff options
Diffstat (limited to 'tests/src/com/android/providers')
4 files changed, 376 insertions, 4 deletions
diff --git a/tests/src/com/android/providers/contacts/BaseContactsProvider2Test.java b/tests/src/com/android/providers/contacts/BaseContactsProvider2Test.java index a37c39e..b90e88b 100644 --- a/tests/src/com/android/providers/contacts/BaseContactsProvider2Test.java +++ b/tests/src/com/android/providers/contacts/BaseContactsProvider2Test.java @@ -1175,6 +1175,10 @@ public abstract class BaseContactsProvider2Test extends PhotoLoadingTestCase { return projection; } + protected int getCount(Uri uri) { + return getCount(uri, null, null); + } + protected int getCount(Uri uri, String selection, String[] selectionArgs) { Cursor c = mResolver.query(uri, null, selection, selectionArgs, null); try { diff --git a/tests/src/com/android/providers/contacts/ContactsActor.java b/tests/src/com/android/providers/contacts/ContactsActor.java index 57dd45f..35f279e 100644 --- a/tests/src/com/android/providers/contacts/ContactsActor.java +++ b/tests/src/com/android/providers/contacts/ContactsActor.java @@ -29,6 +29,7 @@ import android.content.ContentResolver; import android.content.ContentUris; import android.content.ContentValues; import android.content.Context; +import android.content.ContextWrapper; import android.content.Intent; import android.content.SharedPreferences; import android.content.pm.ApplicationInfo; @@ -62,6 +63,7 @@ import android.test.IsolatedContext; import android.test.RenamingDelegatingContext; import android.test.mock.MockContentResolver; import android.test.mock.MockContext; +import android.util.Log; import com.android.providers.contacts.util.MockSharedPreferences; import com.google.android.collect.Sets; @@ -220,6 +222,26 @@ public class ContactsActor { } } + /** + * A context wrapper that reports a different user id. + * + * TODO This should override getSystemService() and returns a UserManager that returns the + * same, altered user ID too. + */ + public static class AlteringUserContext extends ContextWrapper { + private final int mUserId; + + public AlteringUserContext(Context base, int userId) { + super(base); + mUserId = userId; + } + + @Override + public int getUserId() { + return mUserId; + } + } + private IsolatedContext mProviderContext; /** @@ -274,6 +296,11 @@ public class ContactsActor { public SharedPreferences getSharedPreferences(String name, int mode) { return mPrefs; } + + @Override + public int getUserId() { + return mockUserManager.getUserHandle(); + } }; mMockAccountManager = new MockAccountManager(mProviderContext); @@ -289,12 +316,17 @@ public class ContactsActor { resolver.addProvider(authority, provider); } - public ContentProvider addProvider(Class<? extends ContentProvider> providerClass, + public <T extends ContentProvider> T addProvider(Class<T> providerClass, String authority) throws Exception { - ContentProvider provider = providerClass.newInstance(); + return addProvider(providerClass, authority, mProviderContext); + } + + public <T extends ContentProvider> T addProvider(Class<T> providerClass, + String authority, Context providerContext) throws Exception { + T provider = providerClass.newInstance(); ProviderInfo info = new ProviderInfo(); info.authority = authority; - provider.attachInfoForTesting(mProviderContext, info); + provider.attachInfoForTesting(providerContext, info); resolver.addProvider(authority, provider); return provider; } diff --git a/tests/src/com/android/providers/contacts/ContactsProvider2Test.java b/tests/src/com/android/providers/contacts/ContactsProvider2Test.java index 7e5a97f..d8e2924 100644 --- a/tests/src/com/android/providers/contacts/ContactsProvider2Test.java +++ b/tests/src/com/android/providers/contacts/ContactsProvider2Test.java @@ -19,6 +19,7 @@ package com.android.providers.contacts; import static com.android.providers.contacts.TestUtils.cv; import android.accounts.Account; +import android.content.ContentProvider; import android.content.ContentProviderOperation; import android.content.ContentProviderResult; import android.content.ContentResolver; @@ -28,6 +29,7 @@ import android.content.Entity; import android.content.EntityIterator; import android.content.res.AssetFileDescriptor; import android.database.Cursor; +import android.database.MatrixCursor; import android.database.sqlite.SQLiteDatabase; import android.net.Uri; import android.os.AsyncTask; @@ -67,9 +69,12 @@ import android.provider.ContactsContract.StreamItems; import android.provider.OpenableColumns; import android.test.MoreAsserts; import android.test.suitebuilder.annotation.LargeTest; +import android.test.suitebuilder.annotation.Suppress; import android.text.TextUtils; import com.android.internal.util.ArrayUtils; +import com.android.providers.contacts.ContactsActor.AlteringUserContext; +import com.android.providers.contacts.ContactsActor.MockUserManager; import com.android.providers.contacts.ContactsDatabaseHelper.AggregationExceptionColumns; import com.android.providers.contacts.ContactsDatabaseHelper.ContactsColumns; import com.android.providers.contacts.ContactsDatabaseHelper.DataUsageStatColumns; @@ -647,6 +652,7 @@ public class ContactsProvider2Test extends BaseContactsProvider2Test { PhoneLookup.STARRED, PhoneLookup.IN_DEFAULT_DIRECTORY, PhoneLookup.IN_VISIBLE_GROUP, + PhoneLookup.PHOTO_FILE_ID, PhoneLookup.PHOTO_ID, PhoneLookup.PHOTO_URI, PhoneLookup.PHOTO_THUMBNAIL_URI, @@ -660,6 +666,32 @@ public class ContactsProvider2Test extends BaseContactsProvider2Test { }); } + public void testPhoneLookupEnterpriseProjection() { + assertProjection(PhoneLookup.ENTERPRISE_CONTENT_FILTER_URI + .buildUpon().appendPath("123").build(), + new String[]{ + PhoneLookup._ID, + PhoneLookup.LOOKUP_KEY, + PhoneLookup.DISPLAY_NAME, + PhoneLookup.LAST_TIME_CONTACTED, + PhoneLookup.TIMES_CONTACTED, + PhoneLookup.STARRED, + PhoneLookup.IN_DEFAULT_DIRECTORY, + PhoneLookup.IN_VISIBLE_GROUP, + PhoneLookup.PHOTO_FILE_ID, + PhoneLookup.PHOTO_ID, + PhoneLookup.PHOTO_URI, + PhoneLookup.PHOTO_THUMBNAIL_URI, + PhoneLookup.CUSTOM_RINGTONE, + PhoneLookup.HAS_PHONE_NUMBER, + PhoneLookup.SEND_TO_VOICEMAIL, + PhoneLookup.NUMBER, + PhoneLookup.TYPE, + PhoneLookup.LABEL, + PhoneLookup.NORMALIZED_NUMBER, + }); + } + public void testGroupsProjection() { assertProjection(Groups.CONTENT_URI, new String[]{ Groups._ID, @@ -1462,7 +1494,7 @@ public class ContactsProvider2Test extends BaseContactsProvider2Test { "+123456789"); final ContentValues values = new ContentValues(); values.put(PhoneLookup.DISPLAY_NAME, "No star"); - assertStoredValues(lookupUri1, null, null, new ContentValues[] {values}); + assertStoredValues(lookupUri1, null, null, new ContentValues[]{values}); } public void testPhoneLookupExplicitProjection() { @@ -1689,6 +1721,266 @@ public class ContactsProvider2Test extends BaseContactsProvider2Test { } } + /** + * Test for enterprise caller-id, but with no corp profile. + */ + public void testPhoneLookupEnterprise_noCorpProfile() throws Exception { + + Uri uri1 = Uri.withAppendedPath(PhoneLookup.ENTERPRISE_CONTENT_FILTER_URI, "408-111-1111"); + + // No contacts profile, no data. + assertEquals(0, getCount(uri1)); + + // Insert a contact into the primary CP2. + long rawContactId = ContentUris.parseId( + mResolver.insert(RawContacts.CONTENT_URI, new ContentValues())); + DataUtil.insertStructuredName(mResolver, rawContactId, "Contact1", "Doe"); + insertPhoneNumber(rawContactId, "408-111-1111"); + + // Do the query again and check the result. + Cursor c = mResolver.query(uri1, null, null, null, null); + try { + assertEquals(1, c.getCount()); + c.moveToPosition(0); + long contactId = c.getLong(c.getColumnIndex(PhoneLookup._ID)); + assertFalse(Contacts.isCorpContactId(contactId)); // Make sure it's not rewritten. + } finally { + c.close(); + } + } + + /** + * Set up the corp user / CP2 and returns the corp CP2 instance. + */ + private SynchronousContactsProvider2 setUpCorpProvider() throws Exception { + mActor.mockUserManager.setUsers(MockUserManager.PRIMARY_USER, MockUserManager.CORP_USER); + + // Note here we use a standalone CP2 so it'll have its own db helper. + // Also use AlteringUserContext here to report the corp user id. + return mActor.addProvider(StandaloneContactsProvider2.class, + "" + MockUserManager.CORP_USER.id + "@com.android.contacts", + new AlteringUserContext(mActor.getProviderContext(), MockUserManager.CORP_USER.id)); + } + + /** + * Test for enterprise caller-id, with the corp profile. + * + * Note: in this test, we add one more provider instance for the authority + * "10@com.android.contacts" and use it as the corp cp2. + */ + public void testPhoneLookupEnterprise_withCorpProfile() throws Exception { + final SynchronousContactsProvider2 corpCp2 = setUpCorpProvider(); + + Uri uri1 = Uri.withAppendedPath(PhoneLookup.ENTERPRISE_CONTENT_FILTER_URI, "408-111-1111"); + Uri uri2 = Uri.withAppendedPath(PhoneLookup.ENTERPRISE_CONTENT_FILTER_URI, "408-222-2222"); + + // First, test with no contacts on either profile. + assertEquals(0, getCount(uri1)); + + // Insert a contact to the primary CP2. + long rawContactId = ContentUris.parseId( + mResolver.insert(RawContacts.CONTENT_URI, new ContentValues())); + DataUtil.insertStructuredName(mResolver, rawContactId, "Contact1", "Doe"); + insertPhoneNumber(rawContactId, "408-111-1111"); + + // Insert a contact to the corp CP2, with the same phone number, but with a different name. + rawContactId = ContentUris.parseId( + corpCp2.insert(RawContacts.CONTENT_URI, new ContentValues())); + // Insert a name + ContentValues cv = cv( + Data.RAW_CONTACT_ID, rawContactId, + Data.MIMETYPE, StructuredName.CONTENT_ITEM_TYPE, + StructuredName.DISPLAY_NAME, "Contact2 Corp", + StructuredName.GIVEN_NAME, "Contact2", + StructuredName.FAMILY_NAME, "Corp"); + corpCp2.insert(ContactsContract.Data.CONTENT_URI, cv); + + // Insert a number + cv = cv( + Data.RAW_CONTACT_ID, rawContactId, + Data.MIMETYPE, Phone.CONTENT_ITEM_TYPE, + Phone.NUMBER, "408-111-1111", + Phone.TYPE, Phone.TYPE_HOME); + corpCp2.insert(ContactsContract.Data.CONTENT_URI, cv); + + // Insert one more contact to the corp CP2, with a different number. + rawContactId = ContentUris.parseId( + corpCp2.insert(RawContacts.CONTENT_URI, new ContentValues())); + // Insert a name + cv = cv( + Data.RAW_CONTACT_ID, rawContactId, + Data.MIMETYPE, StructuredName.CONTENT_ITEM_TYPE, + StructuredName.DISPLAY_NAME, "Contact3 Corp", + StructuredName.GIVEN_NAME, "Contact3", + StructuredName.FAMILY_NAME, "Corp"); + corpCp2.insert(ContactsContract.Data.CONTENT_URI, cv); + + // Insert a number + cv = cv( + Data.RAW_CONTACT_ID, rawContactId, + Data.MIMETYPE, Phone.CONTENT_ITEM_TYPE, + Phone.NUMBER, "408-222-2222", + Phone.TYPE, Phone.TYPE_HOME); + corpCp2.insert(ContactsContract.Data.CONTENT_URI, cv); + + // Okay, now execute queries and check the result. + + // The first URL hits the contact in the primary CP2. + // There's also a contact with this phone number in the corp CP2, but that will be ignored. + Cursor c = mResolver.query(uri1, null, null, null, null); + try { + assertEquals(1, c.getCount()); + c.moveToPosition(0); + assertEquals("Contact1 Doe", c.getString(c.getColumnIndex(PhoneLookup.DISPLAY_NAME))); + + // Make sure it has a personal contact ID. + long contactId = c.getLong(c.getColumnIndex(PhoneLookup._ID)); + assertFalse(Contacts.isCorpContactId(contactId)); + } finally { + c.close(); + } + + // Test for the second phone number, which only exists in the corp cp2. + c = mResolver.query(uri2, null, null, null, null); + try { + // This one actually returns 2 identical rows, probably because of the join + // in phone_lookup. Callers only care the first row, so returning multiple identical + // rows should be fine. + assertTrue(c.getCount() > 0); + c.moveToPosition(0); + assertEquals("Contact3 Corp", c.getString(c.getColumnIndex(PhoneLookup.DISPLAY_NAME))); + + // Make sure it has a corp contact ID. + long contactId = c.getLong(c.getColumnIndex(PhoneLookup._ID)); + assertTrue(Contacts.isCorpContactId(contactId)); + } finally { + c.close(); + } + } + + public void testRewriteCorpPhoneLookup() { + // 19 columns + final MatrixCursor c = new MatrixCursor(new String[] { + PhoneLookup._ID, + PhoneLookup.LOOKUP_KEY, + PhoneLookup.DISPLAY_NAME, + PhoneLookup.LAST_TIME_CONTACTED, + PhoneLookup.TIMES_CONTACTED, + PhoneLookup.STARRED, + PhoneLookup.IN_DEFAULT_DIRECTORY, + PhoneLookup.IN_VISIBLE_GROUP, + PhoneLookup.PHOTO_FILE_ID, + PhoneLookup.PHOTO_ID, + PhoneLookup.PHOTO_URI, + PhoneLookup.PHOTO_THUMBNAIL_URI, + PhoneLookup.CUSTOM_RINGTONE, + PhoneLookup.HAS_PHONE_NUMBER, + PhoneLookup.SEND_TO_VOICEMAIL, + PhoneLookup.NUMBER, + PhoneLookup.TYPE, + PhoneLookup.LABEL, + PhoneLookup.NORMALIZED_NUMBER + }); + + // First, convert and make sure it returns an empty cursor. + Cursor rewritten = ContactsProvider2.rewriteCorpPhoneLookup(c); + assertEquals(0, rewritten.getCount()); + assertEquals(19, rewritten.getColumnCount()); + + c.addRow(new Object[] { + 1L, // PhoneLookup._ID, + null, // PhoneLookup.LOOKUP_KEY, + null, // PhoneLookup.DISPLAY_NAME, + null, // PhoneLookup.LAST_TIME_CONTACTED, + null, // PhoneLookup.TIMES_CONTACTED, + null, // PhoneLookup.STARRED, + null, // PhoneLookup.IN_DEFAULT_DIRECTORY, + null, // PhoneLookup.IN_VISIBLE_GROUP, + null, // PhoneLookup.PHOTO_FILE_ID, + null, // PhoneLookup.PHOTO_ID, + null, // PhoneLookup.PHOTO_URI, + null, // PhoneLookup.PHOTO_THUMBNAIL_URI, + null, // PhoneLookup.CUSTOM_RINGTONE, + null, // PhoneLookup.HAS_PHONE_NUMBER, + null, // PhoneLookup.SEND_TO_VOICEMAIL, + null, // PhoneLookup.NUMBER, + null, // PhoneLookup.TYPE, + null, // PhoneLookup.LABEL, + null, // PhoneLookup.NORMALIZED_NUMBER + }); + + c.addRow(new Object[] { + 10L, // PhoneLookup._ID, + "key", // PhoneLookup.LOOKUP_KEY, + "name", // PhoneLookup.DISPLAY_NAME, + 123, // PhoneLookup.LAST_TIME_CONTACTED, + 456, // PhoneLookup.TIMES_CONTACTED, + 1, // PhoneLookup.STARRED, + 1, // PhoneLookup.IN_DEFAULT_DIRECTORY, + 1, // PhoneLookup.IN_VISIBLE_GROUP, + 1001, // PhoneLookup.PHOTO_FILE_ID, + 1002, // PhoneLookup.PHOTO_ID, + "content://a/a", // PhoneLookup.PHOTO_URI, + "content://a/b", // PhoneLookup.PHOTO_THUMBNAIL_URI, + "content://a/c", // PhoneLookup.CUSTOM_RINGTONE, + 1, // PhoneLookup.HAS_PHONE_NUMBER, + 1, // PhoneLookup.SEND_TO_VOICEMAIL, + "1234", // PhoneLookup.NUMBER, + 1, // PhoneLookup.TYPE, + "label", // PhoneLookup.LABEL, + "+1234", // PhoneLookup.NORMALIZED_NUMBER + }); + rewritten = ContactsProvider2.rewriteCorpPhoneLookup(c); + assertEquals(2, rewritten.getCount()); + + rewritten.moveToPosition(0); + int column = 0; + assertEquals(1000000001L, rewritten.getLong(column++)); // We offset ID for corp contacts. + assertEquals(null, rewritten.getString(column++)); + assertEquals(null, rewritten.getString(column++)); + assertEquals(null, rewritten.getString(column++)); + assertEquals(null, rewritten.getString(column++)); + assertEquals(null, rewritten.getString(column++)); + assertEquals(null, rewritten.getString(column++)); + assertEquals(null, rewritten.getString(column++)); + assertEquals(null, rewritten.getString(column++)); + assertEquals(null, rewritten.getString(column++)); + assertEquals(null, rewritten.getString(column++)); + assertEquals(null, rewritten.getString(column++)); + assertEquals(null, rewritten.getString(column++)); + assertEquals(null, rewritten.getString(column++)); + assertEquals(null, rewritten.getString(column++)); + assertEquals(null, rewritten.getString(column++)); + assertEquals(null, rewritten.getString(column++)); + assertEquals(null, rewritten.getString(column++)); + assertEquals(null, rewritten.getString(column++)); + + + rewritten.moveToNext(); + column = 0; + assertEquals(1000000010L, rewritten.getLong(column++)); // With offset. + assertEquals("key", rewritten.getString(column++)); + assertEquals("name", rewritten.getString(column++)); + assertEquals(123, rewritten.getInt(column++)); + assertEquals(456, rewritten.getInt(column++)); + assertEquals(1, rewritten.getInt(column++)); + assertEquals(1, rewritten.getInt(column++)); + assertEquals(1, rewritten.getInt(column++)); + assertEquals(null, rewritten.getString(column++)); // photo file id + assertEquals(null, rewritten.getString(column++)); // photo id + assertEquals("content://com.android.contacts/contacts_corp/10/display_photo", + rewritten.getString(column++)); + assertEquals("content://com.android.contacts/contacts_corp/10/photo", + rewritten.getString(column++)); + assertEquals(null, rewritten.getString(column++)); // ringtone + assertEquals(1, rewritten.getInt(column++)); + assertEquals(1, rewritten.getInt(column++)); + assertEquals("1234", rewritten.getString(column++)); + assertEquals(1, rewritten.getInt(column++)); + assertEquals("label", rewritten.getString(column++)); + assertEquals("+1234", rewritten.getString(column++)); + } + public void testPhoneUpdate() { ContentValues values = new ContentValues(); Uri rawContactUri = mResolver.insert(RawContacts.CONTENT_URI, values); diff --git a/tests/src/com/android/providers/contacts/StandaloneContactsProvider2.java b/tests/src/com/android/providers/contacts/StandaloneContactsProvider2.java new file mode 100644 index 0000000..a55072c --- /dev/null +++ b/tests/src/com/android/providers/contacts/StandaloneContactsProvider2.java @@ -0,0 +1,44 @@ +/* + * Copyright (C) 2014 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.android.providers.contacts; + +import android.content.Context; + +/** + * A subclass of {@link SynchronousContactsProvider2} that doesn't reuse the database helper. + */ +public class StandaloneContactsProvider2 extends SynchronousContactsProvider2 { + private static ContactsDatabaseHelper mDbHelper; + + public StandaloneContactsProvider2() { + // No need to wipe data for this instance since it doesn't reuse the db helper. + setDataWipeEnabled(false); + } + + @Override + protected ContactsDatabaseHelper getDatabaseHelper(final Context context) { + if (mDbHelper == null) { + mDbHelper = ContactsDatabaseHelper.getNewInstanceForTest(context); + } + return mDbHelper; + } + + @Override + public void setDataWipeEnabled(boolean flag) { + // No need to wipe data for this instance since it doesn't reuse the db helper. + super.setDataWipeEnabled(false); + } +} |