aboutsummaryrefslogtreecommitdiff
path: root/tests/src/com/android/providers
diff options
context:
space:
mode:
Diffstat (limited to 'tests/src/com/android/providers')
-rw-r--r--tests/src/com/android/providers/contacts/BaseVoicemailProviderTest.java11
-rw-r--r--tests/src/com/android/providers/contacts/ContactsActor.java44
-rw-r--r--tests/src/com/android/providers/contacts/ContactsDatabaseHelperUpgradeTest.java11
-rw-r--r--tests/src/com/android/providers/contacts/ContactsProvider2Test.java42
-rw-r--r--tests/src/com/android/providers/contacts/VoicemailProviderTest.java263
-rw-r--r--tests/src/com/android/providers/contacts/util/CappedStringBuilderTest.java84
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());
+ }
+}