diff options
Diffstat (limited to 'tests/src/com/android/providers')
6 files changed, 389 insertions, 66 deletions
diff --git a/tests/src/com/android/providers/contacts/BaseVoicemailProviderTest.java b/tests/src/com/android/providers/contacts/BaseVoicemailProviderTest.java index 1020da89..665f68ba 100644 --- a/tests/src/com/android/providers/contacts/BaseVoicemailProviderTest.java +++ b/tests/src/com/android/providers/contacts/BaseVoicemailProviderTest.java @@ -70,6 +70,15 @@ public abstract class BaseVoicemailProviderTest extends BaseContactsProvider2Tes mActor.removePermissions(READ_VOICEMAIL_PERMISSION); mActor.removePermissions(WRITE_VOICEMAIL_PERMISSION); mActor.addPermissions(ADD_VOICEMAIL_PERMISSION); + mActor.revokeCarrierPrivileges(); + mUseSourceUri = true; + } + + protected void setUpForOwnPermissionViaCarrierPrivileges() { + mActor.removePermissions(READ_VOICEMAIL_PERMISSION); + mActor.removePermissions(WRITE_VOICEMAIL_PERMISSION); + mActor.removePermissions(ADD_VOICEMAIL_PERMISSION); + mActor.grantCarrierPrivileges(); mUseSourceUri = true; } @@ -77,6 +86,7 @@ public abstract class BaseVoicemailProviderTest extends BaseContactsProvider2Tes mActor.addPermissions(ADD_VOICEMAIL_PERMISSION); mActor.addPermissions(READ_VOICEMAIL_PERMISSION); mActor.addPermissions(WRITE_VOICEMAIL_PERMISSION); + mActor.revokeCarrierPrivileges(); mUseSourceUri = false; } @@ -84,6 +94,7 @@ public abstract class BaseVoicemailProviderTest extends BaseContactsProvider2Tes mActor.removePermissions(ADD_VOICEMAIL_PERMISSION); mActor.removePermissions(READ_VOICEMAIL_PERMISSION); mActor.removePermissions(WRITE_VOICEMAIL_PERMISSION); + mActor.revokeCarrierPrivileges(); mUseSourceUri = true; } diff --git a/tests/src/com/android/providers/contacts/ContactsActor.java b/tests/src/com/android/providers/contacts/ContactsActor.java index 11a13c27..470f64b7 100644 --- a/tests/src/com/android/providers/contacts/ContactsActor.java +++ b/tests/src/com/android/providers/contacts/ContactsActor.java @@ -57,9 +57,11 @@ import android.provider.ContactsContract.Contacts; import android.provider.ContactsContract.Data; import android.provider.ContactsContract.RawContacts; import android.provider.ContactsContract.StatusUpdates; +import android.telephony.TelephonyManager; import android.test.IsolatedContext; import android.test.mock.MockContentResolver; import android.test.mock.MockContext; +import android.text.TextUtils; import com.android.providers.contacts.util.ContactsPermissions; import com.android.providers.contacts.util.MockSharedPreferences; @@ -70,6 +72,7 @@ import java.io.File; import java.io.IOException; import java.util.ArrayList; import java.util.Arrays; +import java.util.Collections; import java.util.List; import java.util.Locale; import java.util.Set; @@ -98,6 +101,7 @@ public class ContactsActor { private Set<String> mGrantedPermissions = Sets.newHashSet(); private final Set<Uri> mGrantedUriPermissions = Sets.newHashSet(); + private boolean mHasCarrierPrivileges; private List<ContentProvider> mAllProviders = new ArrayList<>(); @@ -242,6 +246,31 @@ public class ContactsActor { } } + private MockTelephonyManager mMockTelephonyManager; + + private class MockTelephonyManager extends TelephonyManager { + public MockTelephonyManager(Context context) { + super(context); + } + + @Override + public int checkCarrierPrivilegesForPackageAnyPhone(String packageName) { + if (TextUtils.equals(packageName, ContactsActor.this.packageName) + && mHasCarrierPrivileges) { + return TelephonyManager.CARRIER_PRIVILEGE_STATUS_HAS_ACCESS; + } + return TelephonyManager.CARRIER_PRIVILEGE_STATUS_NO_ACCESS; + } + + @Override + public List<String> getPackagesWithCarrierPrivileges() { + if (!mHasCarrierPrivileges) { + return Collections.emptyList(); + } + return Collections.singletonList(packageName); + } + } + /** * A context wrapper that reports a different user id. * @@ -290,6 +319,9 @@ public class ContactsActor { if (Context.USER_SERVICE.equals(name)) { return mockUserManager; } + if (Context.TELEPHONY_SERVICE.equals(name)) { + return mMockTelephonyManager; + } // Use overallContext here; super.getSystemService() somehow won't return // DevicePolicyManager. return overallContext.getSystemService(name); @@ -334,6 +366,9 @@ public class ContactsActor { if (Context.USER_SERVICE.equals(name)) { return mockUserManager; } + if (Context.TELEPHONY_SERVICE.equals(name)) { + return mMockTelephonyManager; + } // Use overallContext here; super.getSystemService() somehow won't return // DevicePolicyManager. return overallContext.getSystemService(name); @@ -367,6 +402,7 @@ public class ContactsActor { mMockAccountManager = new MockAccountManager(mProviderContext); mockUserManager = new MockUserManager(mProviderContext); + mMockTelephonyManager = new MockTelephonyManager(mProviderContext); provider = addProvider(providerClass, authority); } @@ -427,6 +463,14 @@ public class ContactsActor { mGrantedUriPermissions.removeAll(Arrays.asList(uris)); } + public void grantCarrierPrivileges() { + mHasCarrierPrivileges = true; + } + + public void revokeCarrierPrivileges() { + mHasCarrierPrivileges = false; + } + /** * Mock {@link Context} that reports specific well-known values for testing * data protection. The creator can override the owner package name, and diff --git a/tests/src/com/android/providers/contacts/ContactsDatabaseHelperUpgradeTest.java b/tests/src/com/android/providers/contacts/ContactsDatabaseHelperUpgradeTest.java index 185fa031..1832b4e4 100644 --- a/tests/src/com/android/providers/contacts/ContactsDatabaseHelperUpgradeTest.java +++ b/tests/src/com/android/providers/contacts/ContactsDatabaseHelperUpgradeTest.java @@ -16,7 +16,6 @@ package com.android.providers.contacts; -import static com.android.providers.contacts.TestUtils.createDatabaseSnapshot; import static com.android.providers.contacts.TestUtils.cv; import static com.android.providers.contacts.TestUtils.executeSqlFromAssetFile; @@ -67,14 +66,6 @@ import com.android.providers.contacts.ContactsDatabaseHelper.Tables; import com.android.providers.contacts.testutil.TestUtil; import com.android.providers.contacts.util.PropertyUtils; -import junit.framework.AssertionFailedError; - -import java.io.BufferedReader; -import java.io.IOException; -import java.io.InputStream; -import java.io.InputStreamReader; -import java.util.HashMap; - /** * Unit tests for database create/upgrade operations in {@link ContactsDatabaseHelper}. * @@ -376,6 +367,8 @@ public class ContactsDatabaseHelperUpgradeTest extends BaseDatabaseHelperUpgrade new TableColumn(Data.SYNC3, TEXT, false, null), new TableColumn(Data.SYNC4, TEXT, false, null), new TableColumn(Data.CARRIER_PRESENCE, INTEGER, true, "0"), + new TableColumn(Data.PREFERRED_PHONE_ACCOUNT_COMPONENT_NAME, TEXT, false, null), + new TableColumn(Data.PREFERRED_PHONE_ACCOUNT_ID, TEXT, false, null), }; private static final TableColumn[] PHONE_LOOKUP_COLUMNS = new TableColumn[] { diff --git a/tests/src/com/android/providers/contacts/ContactsProvider2Test.java b/tests/src/com/android/providers/contacts/ContactsProvider2Test.java index 8930338e..6c76709e 100644 --- a/tests/src/com/android/providers/contacts/ContactsProvider2Test.java +++ b/tests/src/com/android/providers/contacts/ContactsProvider2Test.java @@ -16,7 +16,6 @@ package com.android.providers.contacts; -import static com.android.providers.contacts.TestUtils.createDatabaseSnapshot; import static com.android.providers.contacts.TestUtils.cv; import static com.android.providers.contacts.TestUtils.dumpCursor; @@ -420,6 +419,8 @@ public class ContactsProvider2Test extends BaseContactsProvider2Test { Data.DATA14, Data.DATA15, Data.CARRIER_PRESENCE, + Data.PREFERRED_PHONE_ACCOUNT_COMPONENT_NAME, + Data.PREFERRED_PHONE_ACCOUNT_ID, Data.SYNC1, Data.SYNC2, Data.SYNC3, @@ -508,6 +509,8 @@ public class ContactsProvider2Test extends BaseContactsProvider2Test { Data.DATA14, Data.DATA15, Data.CARRIER_PRESENCE, + Data.PREFERRED_PHONE_ACCOUNT_COMPONENT_NAME, + Data.PREFERRED_PHONE_ACCOUNT_ID, Data.SYNC1, Data.SYNC2, Data.SYNC3, @@ -590,6 +593,8 @@ public class ContactsProvider2Test extends BaseContactsProvider2Test { Data.DATA14, Data.DATA15, Data.CARRIER_PRESENCE, + Data.PREFERRED_PHONE_ACCOUNT_COMPONENT_NAME, + Data.PREFERRED_PHONE_ACCOUNT_ID, Data.SYNC1, Data.SYNC2, Data.SYNC3, @@ -698,6 +703,8 @@ public class ContactsProvider2Test extends BaseContactsProvider2Test { Data.DATA14, Data.DATA15, Data.CARRIER_PRESENCE, + Data.PREFERRED_PHONE_ACCOUNT_COMPONENT_NAME, + Data.PREFERRED_PHONE_ACCOUNT_ID, Data.SYNC1, Data.SYNC2, Data.SYNC3, @@ -6485,6 +6492,8 @@ public class ContactsProvider2Test extends BaseContactsProvider2Test { values.put(Data.DATA14, "old14"); values.put(Data.DATA15, "old15"); values.put(Data.CARRIER_PRESENCE, 0); + values.put(Data.PREFERRED_PHONE_ACCOUNT_COMPONENT_NAME, "oldcomponentname"); + values.put(Data.PREFERRED_PHONE_ACCOUNT_ID, "oldid"); Uri uri = mResolver.insert(Data.CONTENT_URI, values); assertStoredValues(uri, values); assertNetworkNotified(true); @@ -6509,6 +6518,8 @@ public class ContactsProvider2Test extends BaseContactsProvider2Test { values.put(Data.DATA14, "new14"); values.put(Data.DATA15, "new15"); values.put(Data.CARRIER_PRESENCE, Data.CARRIER_PRESENCE_VT_CAPABLE); + values.put(Data.PREFERRED_PHONE_ACCOUNT_COMPONENT_NAME, "newcomponentname"); + values.put(Data.PREFERRED_PHONE_ACCOUNT_ID, "newid"); mResolver.update(Data.CONTENT_URI, values, Data.RAW_CONTACT_ID + "=" + rawContactId + " AND " + Data.MIMETYPE + "='testmimetype'", null); assertNetworkNotified(true); @@ -7021,7 +7032,6 @@ public class ContactsProvider2Test extends BaseContactsProvider2Test { values.put(ContactsContract.RawContacts.SEND_TO_VOICEMAIL, 1); values.put(ContactsContract.RawContacts.AGGREGATION_MODE, RawContacts.AGGREGATION_MODE_IMMEDIATE); - values.put(ContactsContract.RawContacts.STARRED, 1); assertEquals(1, mResolver.update(uri, values, null, null)); assertEquals(version, getVersion(uri)); @@ -7872,6 +7882,11 @@ public class ContactsProvider2Test extends BaseContactsProvider2Test { Uri contactUri = ContentUris.withAppendedId(Contacts.CONTENT_URI, contactId); assertStoredValue(contactUri, Contacts.STARRED, "0"); + assertDirty(rawContactUri1, true); + assertDirty(rawContactUri2, true); + clearDirty(rawContactUri1); + clearDirty(rawContactUri2); + ContentValues values = new ContentValues(); values.put(RawContacts.STARRED, "1"); @@ -7880,20 +7895,41 @@ public class ContactsProvider2Test extends BaseContactsProvider2Test { assertStoredValue(rawContactUri1, RawContacts.STARRED, "1"); assertStoredValue(rawContactUri2, RawContacts.STARRED, "0"); assertStoredValue(contactUri, Contacts.STARRED, "1"); + assertDirty(rawContactUri1, true); + assertNetworkNotified(true); + clearDirty(rawContactUri1); values.put(RawContacts.STARRED, "0"); mResolver.update(rawContactUri1, values, null, null); assertStoredValue(rawContactUri1, RawContacts.STARRED, "0"); assertStoredValue(rawContactUri2, RawContacts.STARRED, "0"); assertStoredValue(contactUri, Contacts.STARRED, "0"); + assertDirty(rawContactUri1, true); + assertNetworkNotified(true); + clearDirty(rawContactUri1); values.put(Contacts.STARRED, "1"); mResolver.update(contactUri, values, null, null); assertStoredValue(rawContactUri1, RawContacts.STARRED, "1"); assertStoredValue(rawContactUri2, RawContacts.STARRED, "1"); assertStoredValue(contactUri, Contacts.STARRED, "1"); + assertDirty(rawContactUri1, true); + assertNetworkNotified(true); + } + + public void testUpdateContactOptionsSetStarred() { + long rawContactId = RawContactUtil.createRawContact(mResolver); + long contactId = queryContactId(rawContactId); + String lookupKey = queryLookupKey(contactId); + ContentValues values =new ContentValues(); + values.put(Contacts.STARRED, 1); + + Uri contactLookupUri = ContentUris.withAppendedId( + Uri.withAppendedPath(Contacts.CONTENT_LOOKUP_URI, lookupKey), contactId); + mResolver.update(contactLookupUri, values, null, null); + assertNetworkNotified(true); } public void testSetAndClearSuperPrimaryEmail() { @@ -9884,6 +9920,8 @@ public class ContactsProvider2Test extends BaseContactsProvider2Test { values.put(Data.DATA14, "fourteen"); values.put(Data.DATA15, "fifteen".getBytes()); values.put(Data.CARRIER_PRESENCE, Data.CARRIER_PRESENCE_VT_CAPABLE); + values.put(Data.PREFERRED_PHONE_ACCOUNT_COMPONENT_NAME, "preferredcomponentname"); + values.put(Data.PREFERRED_PHONE_ACCOUNT_ID, "preferredid"); values.put(Data.SYNC1, "sync1"); values.put(Data.SYNC2, "sync2"); values.put(Data.SYNC3, "sync3"); diff --git a/tests/src/com/android/providers/contacts/VoicemailProviderTest.java b/tests/src/com/android/providers/contacts/VoicemailProviderTest.java index 4fa935fa..d20b9b3c 100644 --- a/tests/src/com/android/providers/contacts/VoicemailProviderTest.java +++ b/tests/src/com/android/providers/contacts/VoicemailProviderTest.java @@ -16,11 +16,15 @@ package com.android.providers.contacts; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.verify; + import android.content.ContentUris; import android.content.ContentValues; +import android.database.ContentObserver; import android.database.Cursor; import android.net.Uri; -import android.os.BatteryStats.Uid.Proc; +import android.os.Handler; import android.os.ParcelFileDescriptor; import android.os.Process; import android.provider.CallLog; @@ -33,6 +37,8 @@ import android.test.suitebuilder.annotation.SmallTest; import com.android.common.io.MoreCloseables; +import org.mockito.Mockito; + import java.io.FileNotFoundException; import java.io.IOException; import java.io.InputStream; @@ -51,7 +57,12 @@ import java.util.List; // TODO: Test that calltype and voicemail_uri are auto populated by the provider. @SmallTest public class VoicemailProviderTest extends BaseVoicemailProviderTest { - /** Fields specific to call_log provider that should not be exposed by voicemail provider. */ + + private static final String SYSTEM_PROPERTY_DEXMAKER_DEXCACHE = "dexmaker.dexcache"; + + /** + * Fields specific to call_log provider that should not be exposed by voicemail provider. + */ private static final String[] CALLLOG_PROVIDER_SPECIFIC_COLUMNS = { Calls.CACHED_NAME, Calls.CACHED_NUMBER_LABEL, @@ -60,23 +71,38 @@ public class VoicemailProviderTest extends BaseVoicemailProviderTest { Calls.VOICEMAIL_URI, Calls.COUNTRY_ISO }; - /** Total number of columns exposed by voicemail provider. */ - private static final int NUM_VOICEMAIL_FIELDS = 24; + /** + * Total number of columns exposed by voicemail provider. + */ + private static final int NUM_VOICEMAIL_FIELDS = 25; @Override protected void setUp() throws Exception { super.setUp(); setUpForOwnPermission(); + System.setProperty(SYSTEM_PROPERTY_DEXMAKER_DEXCACHE, getContext().getCacheDir().getPath()); + Thread.currentThread() + .setContextClassLoader(VoicemailContentProvider.class.getClassLoader()); addProvider(CallLogProviderTestable.class, CallLog.AUTHORITY); } - /** Returns the appropriate /voicemail URI. */ + @Override + protected void tearDown() throws Exception { + System.clearProperty(SYSTEM_PROPERTY_DEXMAKER_DEXCACHE); + DbModifierWithNotification.setVoicemailNotifierForTest(null); + } + + /** + * Returns the appropriate /voicemail URI. + */ private Uri voicemailUri() { return mUseSourceUri ? Voicemails.buildSourceUri(mActor.packageName) : Voicemails.CONTENT_URI; } - /** Returns the appropriate /status URI. */ + /** + * Returns the appropriate /status URI. + */ private Uri statusUri() { return mUseSourceUri ? Status.buildSourceUri(mActor.packageName) : Status.CONTENT_URI; @@ -96,14 +122,16 @@ public class VoicemailProviderTest extends BaseVoicemailProviderTest { public void testInsertReadMessageIsNotNew() throws Exception { ContentValues values = getTestReadVoicemailValues(); + values.remove(Voicemails.NEW); Uri uri = mResolver.insert(voicemailUri(), values); String[] projection = {Voicemails.NUMBER, Voicemails.DATE, Voicemails.DURATION, - Voicemails.TRANSCRIPTION, Voicemails.IS_READ, Voicemails.HAS_CONTENT, + Voicemails.TRANSCRIPTION, Voicemails.NEW, Voicemails.IS_READ, + Voicemails.HAS_CONTENT, Voicemails.SOURCE_DATA, Voicemails.STATE, Voicemails.BACKED_UP, Voicemails.RESTORED, Voicemails.ARCHIVED, Voicemails.IS_OMTP_VOICEMAIL }; - Cursor c = mResolver.query(uri, projection, Calls.NEW + "=0", null, + Cursor c = mResolver.query(uri, projection, Voicemails.NEW + "=0", null, null); try { assertEquals("Record count", 1, c.getCount()); @@ -118,6 +146,14 @@ public class VoicemailProviderTest extends BaseVoicemailProviderTest { } } + public void testBulkInsert() { + VoicemailNotifier notifier = mock(VoicemailNotifier.class); + DbModifierWithNotification.setVoicemailNotifierForTest(notifier); + mResolver.bulkInsert(voicemailUri(), + new ContentValues[] {getTestVoicemailValues(), getTestVoicemailValues()}); + verify(notifier, Mockito.times(1)).sendNotification(); + } + // Test to ensure that media content can be written and read back. public void testFileContent() throws Exception { Uri uri = insertVoicemail(); @@ -161,26 +197,97 @@ public class VoicemailProviderTest extends BaseVoicemailProviderTest { public void testUpdateOwnPackageVoicemail_NotDirty() { final Uri uri = mResolver.insert(voicemailUri(), getTestVoicemailValues()); - mResolver.update(uri, new ContentValues(), null, null); + ContentValues updateValues = new ContentValues(); + updateValues.put(Voicemails.TRANSCRIPTION, "foo"); + mResolver.update(uri, updateValues, null, null); // Updating a package's own voicemail should not make the voicemail dirty. - ContentValues values = getTestVoicemailValues(); - values.put(Voicemails.DIRTY, "0"); - assertStoredValues(uri, values); + try (Cursor cursor = mResolver + .query(uri, new String[] {Voicemails.DIRTY}, null, null, null)) { + cursor.moveToFirst(); + assertEquals(cursor.getInt(0), 0); + } + } + + public void testUpdateOtherPackageCallLog_NotDirty() { + setUpForFullPermission(); + final Uri uri = insertVoicemailForSourcePackage("another-package"); + // Clear the mapping for our own UID so that this doesn't look like an internal transaction. + mPackageManager.removePackage(Process.myUid()); + + ContentValues values = new ContentValues(); + values.put(Calls.CACHED_NAME, "foo"); + mResolver.update(ContentUris + .withAppendedId(CallLog.Calls.CONTENT_URI, ContentUris.parseId(uri)), + values, null, null); + + try (Cursor cursor = mResolver + .query(uri, new String[] {Voicemails.DIRTY}, null, null, null)) { + cursor.moveToFirst(); + assertEquals(cursor.getInt(0), 0); + } } public void testUpdateOwnPackageVoicemail_RemovesDirtyStatus() { ContentValues values = getTestVoicemailValues(); values.put(Voicemails.DIRTY, "1"); - final Uri uri = mResolver.insert(voicemailUri(), getTestVoicemailValues()); - - mResolver.update(uri, new ContentValues(), null, null); + final Uri uri = mResolver.insert(voicemailUri(), values); + ContentValues updateValues = new ContentValues(); + updateValues.put(Voicemails.IS_READ, 1); + mResolver.update(uri, updateValues, null, null); // At this point, the voicemail should be set back to not dirty. ContentValues newValues = getTestVoicemailValues(); + newValues.put(Voicemails.IS_READ, 1); newValues.put(Voicemails.DIRTY, "0"); assertStoredValues(uri, newValues); } + public void testUpdateOwnPackageVoicemail_retainDirtyStatus_dirty() { + ContentValues values = getTestVoicemailValues(); + values.put(Voicemails.DIRTY, "1"); + final Uri uri = mResolver.insert(voicemailUri(), values); + + ContentValues retainDirty = new ContentValues(); + retainDirty.put(Voicemails.TRANSCRIPTION, "foo"); + retainDirty.put(Voicemails.DIRTY, Voicemails.DIRTY_RETAIN); + + mResolver.update(uri, retainDirty, null, null); + ContentValues newValues = getTestVoicemailValues(); + newValues.put(Voicemails.DIRTY, "1"); + newValues.put(Voicemails.TRANSCRIPTION, "foo"); + assertStoredValues(uri, newValues); + } + + public void testUpdateOwnPackageVoicemail_retainDirtyStatus_notDirty() { + ContentValues values = getTestVoicemailValues(); + values.put(Voicemails.DIRTY, "0"); + final Uri uri = mResolver.insert(voicemailUri(), values); + + ContentValues retainDirty = new ContentValues(); + retainDirty.put(Voicemails.TRANSCRIPTION, "foo"); + retainDirty.put(Voicemails.DIRTY, Voicemails.DIRTY_RETAIN); + + mResolver.update(uri, retainDirty, null, null); + ContentValues newValues = getTestVoicemailValues(); + newValues.put(Voicemails.DIRTY, "0"); + newValues.put(Voicemails.TRANSCRIPTION, "foo"); + assertStoredValues(uri, newValues); + } + + public void testUpdateOwnPackageVoicemail_retainDirtyStatus_noOtherValues() { + ContentValues values = getTestVoicemailValues(); + values.put(Voicemails.DIRTY, "1"); + final Uri uri = mResolver.insert(voicemailUri(), values); + + ContentValues retainDirty = new ContentValues(); + retainDirty.put(Voicemails.DIRTY, Voicemails.DIRTY_RETAIN); + + mResolver.update(uri, retainDirty, null, null); + ContentValues newValues = getTestVoicemailValues(); + newValues.put(Voicemails.DIRTY, "1"); + assertStoredValues(uri, newValues); + } + public void testDeleteOwnPackageVoicemail_DeletesRow() { setUpForFullPermission(); final Uri ownVoicemail = insertVoicemail(); @@ -261,6 +368,12 @@ public class VoicemailProviderTest extends BaseVoicemailProviderTest { // no package URI specified). public void testMustUsePackageUriWithoutFullPermission() { setUpForOwnPermission(); + assertBaseUriThrowsSecurityExceptions(); + setUpForOwnPermissionViaCarrierPrivileges(); + assertBaseUriThrowsSecurityExceptions(); + } + + private void assertBaseUriThrowsSecurityExceptions() { EvenMoreAsserts.assertThrows(SecurityException.class, new Runnable() { @Override public void run() { @@ -299,24 +412,31 @@ public class VoicemailProviderTest extends BaseVoicemailProviderTest { // Now give away full permission and check that only 1 message is accessible. setUpForOwnPermission(); - assertEquals(1, getCount(voicemailUri(), null, null)); + assertOnlyOwnVoicemailsCanBeQueriedAndInserted(); + // Same as above, but with carrier privileges. + setUpForOwnPermissionViaCarrierPrivileges(); + assertOnlyOwnVoicemailsCanBeQueriedAndInserted(); - // Once again try to insert message for another package. This time - // it should fail. + setUpForNoPermission(); + mUseSourceUri = false; + // With the READ_ALL_VOICEMAIL permission, we should now be able to read all voicemails + mActor.addPermissions(READ_VOICEMAIL_PERMISSION); + assertEquals(2, getCount(voicemailUri(), null, null)); + + // An insert for another package should still fail EvenMoreAsserts.assertThrows(SecurityException.class, new Runnable() { @Override public void run() { insertVoicemailForSourcePackage("another-package"); } }); + } - setUpForNoPermission(); - mUseSourceUri = false; - // With the READ_ALL_VOICEMAIL permission, we should now be able to read all voicemails - mActor.addPermissions(READ_VOICEMAIL_PERMISSION); - assertEquals(2, getCount(voicemailUri(), null, null)); + private void assertOnlyOwnVoicemailsCanBeQueriedAndInserted() { + assertEquals(1, getCount(voicemailUri(), null, null)); - // An insert for another package should still fail + // Once again try to insert message for another package. This time + // it should fail. EvenMoreAsserts.assertThrows(SecurityException.class, new Runnable() { @Override public void run() { @@ -335,23 +455,9 @@ public class VoicemailProviderTest extends BaseVoicemailProviderTest { // Now give away full permission and check that we can update and delete only // the own voicemail. setUpForOwnPermission(); - mResolver.update(withSourcePackageParam(ownVoicemail), - getTestVoicemailValues(), null, null); - mResolver.delete(withSourcePackageParam(ownVoicemail), null, null); - - // However, attempting to update or delete another-package's voicemail should fail. - EvenMoreAsserts.assertThrows(SecurityException.class, new Runnable() { - @Override - public void run() { - mResolver.update(anotherVoicemail, null, null, null); - } - }); - EvenMoreAsserts.assertThrows(SecurityException.class, new Runnable() { - @Override - public void run() { - mResolver.delete(anotherVoicemail, null, null); - } - }); + assertOnlyOwnVoicemailsCanBeUpdatedAndDeleted(ownVoicemail, anotherVoicemail); + setUpForOwnPermissionViaCarrierPrivileges(); + assertOnlyOwnVoicemailsCanBeUpdatedAndDeleted(ownVoicemail, anotherVoicemail); // If we have the manage voicemail permission, we should be able to both update voicemails // from all packages. @@ -374,10 +480,32 @@ public class VoicemailProviderTest extends BaseVoicemailProviderTest { assertEquals(0, getCount(anotherVoicemail, null, null)); } + private void assertOnlyOwnVoicemailsCanBeUpdatedAndDeleted( + Uri ownVoicemail, Uri anotherVoicemail) { + mResolver.update(withSourcePackageParam(ownVoicemail), + getTestVoicemailValues(), null, null); + mResolver.delete(withSourcePackageParam(ownVoicemail), null, null); + + // However, attempting to update or delete another-package's voicemail should fail. + EvenMoreAsserts.assertThrows(SecurityException.class, new Runnable() { + @Override + public void run() { + mResolver.update(anotherVoicemail, null, null, null); + } + }); + EvenMoreAsserts.assertThrows(SecurityException.class, new Runnable() { + @Override + public void run() { + mResolver.delete(anotherVoicemail, null, null); + } + }); + } + private Uri withSourcePackageParam(Uri uri) { return uri.buildUpon() - .appendQueryParameter(VoicemailContract.PARAM_KEY_SOURCE_PACKAGE, mActor.packageName) - .build(); + .appendQueryParameter(VoicemailContract.PARAM_KEY_SOURCE_PACKAGE, + mActor.packageName) + .build(); } public void testUriPermissions() { @@ -440,7 +568,7 @@ public class VoicemailProviderTest extends BaseVoicemailProviderTest { private void checkHasReadAccessToUri(final Uri uri) { Cursor cursor = null; try { - cursor = mResolver.query(uri, null, null ,null, null); + cursor = mResolver.query(uri, null, null, null, null); assertEquals(1, cursor.getCount()); try { ParcelFileDescriptor fd = mResolver.openFileDescriptor(uri, "r"); @@ -552,11 +680,11 @@ public class VoicemailProviderTest extends BaseVoicemailProviderTest { values.put(callLogColumn, "foo"); EvenMoreAsserts.assertThrows("Column: " + callLogColumn, IllegalArgumentException.class, new Runnable() { - @Override - public void run() { - mResolver.insert(voicemailUri(), values); - } - }); + @Override + public void run() { + mResolver.insert(voicemailUri(), values); + } + }); } } @@ -583,11 +711,11 @@ public class VoicemailProviderTest extends BaseVoicemailProviderTest { values.put(callLogColumn, "foo"); EvenMoreAsserts.assertThrows("Column: " + callLogColumn, IllegalArgumentException.class, new Runnable() { - @Override - public void run() { - mResolver.update(insertedUri, values, null, null); - } - }); + @Override + public void run() { + mResolver.update(insertedUri, values, null, null); + } + }); } } @@ -613,6 +741,28 @@ public class VoicemailProviderTest extends BaseVoicemailProviderTest { assertStoredValues(uri, values); } + public void testStatusUpdate_observerNotified() throws Exception { + Uri uri = insertTestStatusEntry(); + ContentValues values = getTestStatusValues(); + values.put(Status.DATA_CHANNEL_STATE, Status.DATA_CHANNEL_STATE_NO_CONNECTION); + values.put(Status.NOTIFICATION_CHANNEL_STATE, + Status.NOTIFICATION_CHANNEL_STATE_MESSAGE_WAITING); + values.put(Status.SOURCE_TYPE, + "vvm_type_test2"); + Boolean[] observerTriggered = new Boolean[]{false}; + mResolver.registerContentObserver(Status.CONTENT_URI, true, + new ContentObserver(new Handler()) { + @Override + public void onChange(boolean selfChange, Uri uri) { + observerTriggered[0] = true; + } + }); + + mResolver.update(uri, values, null, null); + + assertTrue(observerTriggered[0]); + } + public void testStatusUpsert() throws Exception { ContentValues values = getTestStatusValues(); mResolver.insert(statusUri(), values); @@ -751,7 +901,9 @@ public class VoicemailProviderTest extends BaseVoicemailProviderTest { return mResolver.insert(voicemailUri(), getTestVoicemailValues()); } - /** Inserts a voicemail record for the specified source package. */ + /** + * Inserts a voicemail record for the specified source package. + */ private Uri insertVoicemailForSourcePackage(String sourcePackage) { ContentValues values = getTestVoicemailValues(); values.put(Voicemails.SOURCE_PACKAGE, sourcePackage); @@ -763,6 +915,7 @@ public class VoicemailProviderTest extends BaseVoicemailProviderTest { values.put(Voicemails.NUMBER, "1-800-4664-411"); values.put(Voicemails.DATE, 1000); values.put(Voicemails.DURATION, 30); + values.put(Voicemails.NEW, 0); values.put(Voicemails.TRANSCRIPTION, "Testing 123"); values.put(Voicemails.IS_READ, 0); values.put(Voicemails.HAS_CONTENT, 0); diff --git a/tests/src/com/android/providers/contacts/util/CappedStringBuilderTest.java b/tests/src/com/android/providers/contacts/util/CappedStringBuilderTest.java new file mode 100644 index 00000000..d49b2630 --- /dev/null +++ b/tests/src/com/android/providers/contacts/util/CappedStringBuilderTest.java @@ -0,0 +1,84 @@ +/* + * Copyright (C) 2018 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.util; + +import android.test.suitebuilder.annotation.SmallTest; + +import junit.framework.TestCase; + +/** + * Run with: + atest /android/pi-dev/packages/providers/ContactsProvider/tests/src/com/android/providers/contacts/util/CappedStringBuilderTest.java + */ +@SmallTest +public class CappedStringBuilderTest extends TestCase { + public void testCappedChar() { + CappedStringBuilder csb = new CappedStringBuilder(8); + + csb.append("abcd"); + csb.append("efgh"); + + csb.append('x'); + assertEquals("abcdefgh", csb.toString()); + + csb.append("y"); + csb.append("yz"); + + assertEquals("abcdefgh", csb.toString()); + } + + public void testCappedString() { + CappedStringBuilder csb = new CappedStringBuilder(8); + + csb.append("abcd"); + csb.append("efgh"); + + csb.append("x"); + assertEquals("abcdefgh", csb.toString()); + } + + public void testClear() { + CappedStringBuilder csb = new CappedStringBuilder(8); + + csb.append("abcd"); + csb.append("efgh"); + + csb.append("x"); + + assertEquals("abcdefgh", csb.toString()); + + csb.clear(); + + assertEquals("", csb.toString()); + + csb.append("abcd"); + assertEquals("abcd", csb.toString()); + } + + public void testAlreadyCapped() { + CappedStringBuilder csb = new CappedStringBuilder(4); + + csb.append("abc"); + + csb.append("xy"); + + // Once capped, further append() will all be blocked. + csb.append('z'); + csb.append("z"); + + assertEquals("abc", csb.toString()); + } +} |