blob: 34a546e13af443aa4c8574c620eef856ace127d9 [file] [log] [blame]
/*
* Copyright (C) 2011 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 android.provider.cts;
import android.content.ContentProviderClient;
import android.content.ContentResolver;
import android.content.ContentValues;
import android.database.Cursor;
import android.net.Uri;
import android.os.RemoteException;
import android.provider.VoicemailContract;
import android.provider.VoicemailContract.Status;
import android.provider.VoicemailContract.Voicemails;
import android.test.InstrumentationTestCase;
/**
* CTS tests for voicemail provider accessed through {@link VoicemailContract}.
*/
public class VoicemailContractTest extends InstrumentationTestCase {
private ContentResolver mContentResolver;
private ContentProviderClient mVoicemailProvider;
private ContentProviderClient mStatusProvider;
private Uri mVoicemailContentUri;
private Uri mStatusContentUri;
private String mSourcePackageName;
@Override
protected void setUp() throws Exception {
super.setUp();
mSourcePackageName = getInstrumentation().getTargetContext().getPackageName();
mVoicemailContentUri = Voicemails.buildSourceUri(mSourcePackageName);
mStatusContentUri = Status.buildSourceUri(mSourcePackageName);
mContentResolver = getInstrumentation().getTargetContext().getContentResolver();
mVoicemailProvider = mContentResolver.acquireContentProviderClient(mVoicemailContentUri);
mStatusProvider = mContentResolver.acquireContentProviderClient(mStatusContentUri);
}
@Override
protected void tearDown() throws Exception {
// Clean up, just in case we failed to delete the entry when a test failed.
// The cotentUris are specific to this package, so this will delete only the
// entries inserted by this package.
mStatusProvider.delete(mStatusContentUri, null, null);
mVoicemailProvider.delete(mVoicemailContentUri, null, null);
super.tearDown();
}
public void testVoicemailsTable() throws Exception {
final String[] VOICEMAILS_PROJECTION = new String[] {
Voicemails._ID, Voicemails.NUMBER, Voicemails.DATE, Voicemails.DURATION,
Voicemails.IS_READ, Voicemails.SOURCE_PACKAGE, Voicemails.SOURCE_DATA,
Voicemails.HAS_CONTENT, Voicemails.MIME_TYPE};
final int ID_INDEX = 0;
final int NUMBER_INDEX = 1;
final int DATE_INDEX = 2;
final int DURATION_INDEX = 3;
final int IS_READ_INDEX = 4;
final int SOURCE_PACKAGE_INDEX = 5;
final int SOURCE_DATA_INDEX = 6;
final int HAS_CONTENT_INDEX = 7;
final int MIME_TYPE_INDEX = 8;
String insertCallsNumber = "0123456789";
long insertCallsDuration = 120;
String insertSourceData = "internal_id";
String insertMimeType = "audio/mp3";
long insertDate = 1324478862000L;
String updateCallsNumber = "9876543210";
long updateCallsDuration = 310;
String updateSourceData = "another_id";
long updateDate = 1324565262000L;
// Test: insert
ContentValues value = new ContentValues();
value.put(Voicemails.NUMBER, insertCallsNumber);
value.put(Voicemails.DATE, insertDate);
value.put(Voicemails.DURATION, insertCallsDuration);
// Source package is expected to be inserted by the provider, if not set.
value.put(Voicemails.SOURCE_DATA, insertSourceData);
value.put(Voicemails.MIME_TYPE, insertMimeType);
value.put(Voicemails.IS_READ, false);
value.put(Voicemails.HAS_CONTENT, true);
Uri uri = mVoicemailProvider.insert(mVoicemailContentUri, value);
Cursor cursor = mVoicemailProvider.query(
mVoicemailContentUri, VOICEMAILS_PROJECTION,
Voicemails.NUMBER + " = ?",
new String[] {insertCallsNumber}, null, null);
assertTrue(cursor.moveToNext());
assertEquals(insertCallsNumber, cursor.getString(NUMBER_INDEX));
assertEquals(insertDate, cursor.getLong(DATE_INDEX));
assertEquals(insertCallsDuration, cursor.getLong(DURATION_INDEX));
assertEquals(mSourcePackageName, cursor.getString(SOURCE_PACKAGE_INDEX));
assertEquals(insertSourceData, cursor.getString(SOURCE_DATA_INDEX));
assertEquals(insertMimeType, cursor.getString(MIME_TYPE_INDEX));
assertEquals(0, cursor.getInt(IS_READ_INDEX));
assertEquals(1, cursor.getInt(HAS_CONTENT_INDEX));
int id = cursor.getInt(ID_INDEX);
assertEquals(id, Integer.parseInt(uri.getLastPathSegment()));
cursor.close();
// Test: update
value.clear();
value.put(Voicemails.NUMBER, updateCallsNumber);
value.put(Voicemails.DATE, updateDate);
value.put(Voicemails.DURATION, updateCallsDuration);
value.put(Voicemails.SOURCE_DATA, updateSourceData);
mVoicemailProvider.update(uri, value, null, null);
cursor = mVoicemailProvider.query(mVoicemailContentUri, VOICEMAILS_PROJECTION,
Voicemails._ID + " = " + id, null, null, null);
assertEquals(1, cursor.getCount());
assertTrue(cursor.moveToNext());
assertEquals(mSourcePackageName, cursor.getString(SOURCE_PACKAGE_INDEX));
assertEquals(updateCallsNumber, cursor.getString(NUMBER_INDEX));
assertEquals(updateDate, cursor.getLong(DATE_INDEX));
assertEquals(updateCallsDuration, cursor.getLong(DURATION_INDEX));
assertEquals(updateSourceData, cursor.getString(SOURCE_DATA_INDEX));
cursor.close();
// Test: delete
mVoicemailProvider.delete(mVoicemailContentUri, Voicemails._ID + " = " + id, null);
cursor = mVoicemailProvider.query(mVoicemailContentUri, VOICEMAILS_PROJECTION,
Voicemails._ID + " = " + id, null, null, null);
assertEquals(0, cursor.getCount());
cursor.close();
}
// Data column should be automatically generated during insert.
public void testInsert_doesNotUpdateDataColumn() throws Exception {
final String newFilePath = "my/new/file/path";
final ContentValues value = buildContentValuesForNewVoicemail();
value.put(Voicemails._DATA, newFilePath);
mVoicemailProvider.insert(mVoicemailContentUri, value);
assertDataNotEquals(newFilePath);
}
public void testDataColumnUpdate_throwsIllegalArgumentException() throws Exception {
final ContentValues value = buildContentValuesForNewVoicemail();
final Uri uri = mVoicemailProvider.insert(mVoicemailContentUri, value);
// Test: update
final String newFilePath = "another/file/path";
value.clear();
value.put(Voicemails._DATA, newFilePath);
try {
mVoicemailProvider.update(uri, value, null, null);
fail("IllegalArgumentException expected but not thrown.");
} catch (IllegalArgumentException e) {
// pass
}
assertDataNotEquals(newFilePath);
}
private void assertDataNotEquals(String newFilePath) throws RemoteException {
// Make sure data value is not actually updated.
final Cursor cursor = mVoicemailProvider.query(mVoicemailContentUri,
new String[]{Voicemails._DATA}, null, null, null);
cursor.moveToNext();
final String data = cursor.getString(0);
assertFalse(data.equals(newFilePath));
}
private ContentValues buildContentValuesForNewVoicemail() {
final String insertCallsNumber = "0123456789";
final long insertCallsDuration = 120;
final String insertSourceData = "internal_id";
final String insertMimeType = "audio/mp3";
final long insertDate = 1324478862000L;
ContentValues value = new ContentValues();
value.put(Voicemails.NUMBER, insertCallsNumber);
value.put(Voicemails.DATE, insertDate);
value.put(Voicemails.DURATION, insertCallsDuration);
// Source package is expected to be inserted by the provider, if not set.
value.put(Voicemails.SOURCE_DATA, insertSourceData);
value.put(Voicemails.MIME_TYPE, insertMimeType);
value.put(Voicemails.IS_READ, false);
value.put(Voicemails.HAS_CONTENT, true);
return value;
}
public void testStatusTable() throws Exception {
final String[] STATUS_PROJECTION = new String[] {
Status._ID, Status.SOURCE_PACKAGE, Status.CONFIGURATION_STATE,
Status.DATA_CHANNEL_STATE, Status.NOTIFICATION_CHANNEL_STATE,
Status.SETTINGS_URI, Status.VOICEMAIL_ACCESS_URI};
final int ID_INDEX = 0;
final int SOURCE_PACKAGE_INDEX = 1;
final int CONFIGURATION_STATE_INDEX = 2;
final int DATA_CHANNEL_STATE_INDEX = 3;
final int NOTIFICATION_CHANNEL_STATE_INDEX = 4;
final int SETTINGS_URI_INDEX = 5;
final int VOICEMAIL_ACCESS_URI_INDEX = 6;
int insertConfigurationState = Status.CONFIGURATION_STATE_OK;
int insertDataChannelState = Status.DATA_CHANNEL_STATE_OK;
int insertNotificationChannelState = Status.NOTIFICATION_CHANNEL_STATE_OK;
String insertSettingsUri = "settings_uri";
String insertVoicemailAccessUri = "tel:901";
int updateDataChannelState = Status.DATA_CHANNEL_STATE_NO_CONNECTION;
int updateNotificationChannelState = Status.NOTIFICATION_CHANNEL_STATE_MESSAGE_WAITING;
String updateSettingsUri = "settings_uri_2";
// Test: insert
ContentValues value = new ContentValues();
value.put(Status.CONFIGURATION_STATE, insertConfigurationState);
value.put(Status.DATA_CHANNEL_STATE, insertDataChannelState);
value.put(Status.NOTIFICATION_CHANNEL_STATE, insertNotificationChannelState);
value.put(Status.SETTINGS_URI, insertSettingsUri);
value.put(Status.VOICEMAIL_ACCESS_URI, insertVoicemailAccessUri);
Uri uri = mStatusProvider.insert(mStatusContentUri, value);
Cursor cursor = mStatusProvider.query(
mStatusContentUri, STATUS_PROJECTION, null, null, null, null);
assertTrue(cursor.moveToNext());
assertEquals(mSourcePackageName, cursor.getString(SOURCE_PACKAGE_INDEX));
assertEquals(insertConfigurationState, cursor.getInt(CONFIGURATION_STATE_INDEX));
assertEquals(insertDataChannelState, cursor.getInt(DATA_CHANNEL_STATE_INDEX));
assertEquals(insertNotificationChannelState,
cursor.getInt(NOTIFICATION_CHANNEL_STATE_INDEX));
assertEquals(insertSettingsUri, cursor.getString(SETTINGS_URI_INDEX));
assertEquals(insertVoicemailAccessUri, cursor.getString(VOICEMAIL_ACCESS_URI_INDEX));
int id = cursor.getInt(ID_INDEX);
assertEquals(id, Integer.parseInt(uri.getLastPathSegment()));
cursor.close();
// Test: update
value.clear();
value.put(Status.DATA_CHANNEL_STATE, updateDataChannelState);
value.put(Status.NOTIFICATION_CHANNEL_STATE, updateNotificationChannelState);
value.put(Status.SETTINGS_URI, updateSettingsUri);
mStatusProvider.update(uri, value, null, null);
cursor = mStatusProvider.query(mStatusContentUri, STATUS_PROJECTION,
Voicemails._ID + " = " + id, null, null, null);
assertEquals(1, cursor.getCount());
assertTrue(cursor.moveToNext());
assertEquals(mSourcePackageName, cursor.getString(SOURCE_PACKAGE_INDEX));
assertEquals(updateDataChannelState, cursor.getInt(DATA_CHANNEL_STATE_INDEX));
assertEquals(updateNotificationChannelState,
cursor.getInt(NOTIFICATION_CHANNEL_STATE_INDEX));
assertEquals(updateSettingsUri, cursor.getString(SETTINGS_URI_INDEX));
cursor.close();
// Test: delete
mStatusProvider.delete(mStatusContentUri, Voicemails._ID + " = " + id, null);
cursor = mStatusProvider.query(mStatusContentUri, STATUS_PROJECTION,
Voicemails._ID + " = " + id, null, null, null);
assertEquals(0, cursor.getCount());
cursor.close();
}
public void testVoicemailTablePermissions() throws Exception {
ContentValues value = new ContentValues();
value.put(Voicemails.NUMBER, "0123456789");
value.put(Voicemails.SOURCE_PACKAGE, "some.other.package");
try {
mVoicemailProvider.insert(mVoicemailContentUri, value);
fail("Expected SecurityException. None thrown.");
} catch (SecurityException e) {
// Expected result.
}
}
public void testStatusTablePermissions() throws Exception {
ContentValues value = new ContentValues();
value.put(Status.CONFIGURATION_STATE, Status.CONFIGURATION_STATE_OK);
value.put(Status.SOURCE_PACKAGE, "some.other.package");
try {
mStatusProvider.insert(mStatusContentUri, value);
fail("Expected SecurityException. None thrown.");
} catch (SecurityException e) {
// Expected result.
}
}
}