blob: 3d8b8eb3f7315803d4bacc53668530aed16ff263 [file] [log] [blame]
/*
* Copyright (C) 2015 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.ContentProviderOperation;
import android.content.ContentUris;
import android.content.ContentValues;
import android.database.Cursor;
import android.net.Uri;
import android.provider.ContactsContract.MetadataSync;
import android.provider.ContactsContract.MetadataSyncState;
import android.provider.ContactsContract.RawContacts;
import android.test.MoreAsserts;
import android.test.suitebuilder.annotation.MediumTest;
import com.android.providers.contacts.ContactsDatabaseHelper.MetadataSyncColumns;
import com.android.providers.contacts.testutil.RawContactUtil;
import com.google.android.collect.Lists;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashSet;
import java.util.Set;
/**
* Unit tests for {@link com.android.providers.contacts.ContactMetadataProvider}.
* <p/>
* Run the test like this:
* <code>
* adb shell am instrument -e class com.android.providers.contacts.ContactMetadataProviderTest -w \
* com.android.providers.contacts.tests/android.test.InstrumentationTestRunner
* </code>
*/
@MediumTest
public class ContactMetadataProviderTest extends BaseContactsProvider2Test {
private static String TEST_ACCOUNT_TYPE1 = "test_account_type1";
private static String TEST_ACCOUNT_NAME1 = "test_account_name1";
private static String TEST_DATA_SET1 = "plus";
private static String TEST_BACKUP_ID1 = "1001";
private static String TEST_DATA1 = "{\n" +
" \"unique_contact_id\": {\n" +
" \"account_type\": \"CUSTOM_ACCOUNT\",\n" +
" \"custom_account_type\": " + TEST_ACCOUNT_TYPE1 + ",\n" +
" \"account_name\": " + TEST_ACCOUNT_NAME1 + ",\n" +
" \"contact_id\": " + TEST_BACKUP_ID1 + ",\n" +
" \"data_set\": \"GOOGLE_PLUS\"\n" +
" },\n" +
" \"contact_prefs\": {\n" +
" \"send_to_voicemail\": true,\n" +
" \"starred\": true,\n" +
" \"pinned\": 2\n" +
" }\n" +
" }";
private static byte[] TEST_SYNC_STATE1 = "sync state1".getBytes();
private static String TEST_ACCOUNT_TYPE2 = "test_account_type2";
private static String TEST_ACCOUNT_NAME2 = "test_account_name2";
private static String TEST_DATA_SET2 = null;
private static String TEST_BACKUP_ID2 = "1002";
private static String TEST_DATA2 = "{\n" +
" \"unique_contact_id\": {\n" +
" \"account_type\": \"CUSTOM_ACCOUNT\",\n" +
" \"custom_account_type\": " + TEST_ACCOUNT_TYPE2 + ",\n" +
" \"account_name\": " + TEST_ACCOUNT_NAME2 + ",\n" +
" \"contact_id\": " + TEST_BACKUP_ID2 + ",\n" +
" \"data_set\": \"GOOGLE_PLUS\"\n" +
" },\n" +
" \"contact_prefs\": {\n" +
" \"send_to_voicemail\": true,\n" +
" \"starred\": true,\n" +
" \"pinned\": 2\n" +
" }\n" +
" }";
private static byte[] TEST_SYNC_STATE2 = "sync state2".getBytes();
private static String SELECTION_BY_TEST_ACCOUNT1 = MetadataSync.ACCOUNT_NAME + "='" +
TEST_ACCOUNT_NAME1 + "' AND " + MetadataSync.ACCOUNT_TYPE + "='" + TEST_ACCOUNT_TYPE1 +
"' AND " + MetadataSync.DATA_SET + "='" + TEST_DATA_SET1 + "'";
private static String SELECTION_BY_TEST_ACCOUNT2 = MetadataSync.ACCOUNT_NAME + "='" +
TEST_ACCOUNT_NAME2 + "' AND " + MetadataSync.ACCOUNT_TYPE + "='" + TEST_ACCOUNT_TYPE2 +
"' AND " + MetadataSync.DATA_SET + "='" + TEST_DATA_SET2 + "'";
private ContactMetadataProvider mContactMetadataProvider;
private ContentValues defaultValues;
@Override
protected void setUp() throws Exception {
super.setUp();
mContactMetadataProvider = addProvider(
ContactMetadataProviderTestable.class, MetadataSync.METADATA_AUTHORITY);
// Reset the dbHelper to be the one ContactsProvider2 is using. Before this, two providers
// are using different dbHelpers.
mContactMetadataProvider.setDatabaseHelper(((SynchronousContactsProvider2)
mActor.provider).getDatabaseHelper());
setupData();
}
public void testInsertWithInvalidUri() {
try {
mResolver.insert(Uri.withAppendedPath(MetadataSync.METADATA_AUTHORITY_URI,
"metadata"), getDefaultValues());
fail("the insert was expected to fail, but it succeeded");
} catch (IllegalArgumentException e) {
// this was expected
}
}
public void testUpdateWithInvalidUri() {
try {
mResolver.update(Uri.withAppendedPath(MetadataSync.METADATA_AUTHORITY_URI,
"metadata"), getDefaultValues(), null, null);
fail("the update was expected to fail, but it succeeded");
} catch (IllegalArgumentException e) {
// this was expected
}
}
public void testGetMetadataByAccount() {
Cursor c = mResolver.query(MetadataSync.CONTENT_URI, null, SELECTION_BY_TEST_ACCOUNT1,
null, null);
assertEquals(1, c.getCount());
ContentValues expectedValues = defaultValues;
expectedValues.remove(MetadataSyncColumns.ACCOUNT_ID);
c.moveToFirst();
assertCursorValues(c, expectedValues);
c.close();
}
public void testFailOnInsertMetadataForSameAccountIdAndBackupId() {
// Insert a new metadata with same account and backupId as defaultValues should fail.
String newData = "{\n" +
" \"unique_contact_id\": {\n" +
" \"account_type\": \"CUSTOM_ACCOUNT\",\n" +
" \"custom_account_type\": " + TEST_ACCOUNT_TYPE1 + ",\n" +
" \"account_name\": " + TEST_ACCOUNT_NAME1 + ",\n" +
" \"contact_id\": " + TEST_BACKUP_ID1 + ",\n" +
" \"data_set\": \"GOOGLE_PLUS\"\n" +
" },\n" +
" \"contact_prefs\": {\n" +
" \"send_to_voicemail\": false,\n" +
" \"starred\": false,\n" +
" \"pinned\": 1\n" +
" }\n" +
" }";
ContentValues newValues = new ContentValues();
newValues.put(MetadataSync.ACCOUNT_NAME, TEST_ACCOUNT_NAME1);
newValues.put(MetadataSync.ACCOUNT_TYPE, TEST_ACCOUNT_TYPE1);
newValues.put(MetadataSync.DATA_SET, TEST_DATA_SET1);
newValues.put(MetadataSync.RAW_CONTACT_BACKUP_ID, TEST_BACKUP_ID1);
newValues.put(MetadataSync.DATA, newData);
newValues.put(MetadataSync.DELETED, 0);
try {
mResolver.insert(MetadataSync.CONTENT_URI, newValues);
} catch (Exception e) {
// Expected.
}
}
public void testInsertAndUpdateMetadataSync() {
// Create a raw contact with backupId.
String backupId = "backupId10001";
long rawContactId = RawContactUtil.createRawContactWithAccountDataSet(
mResolver, TEST_ACCOUNT_NAME1, TEST_ACCOUNT_TYPE1, TEST_DATA_SET1);
Uri rawContactUri = ContentUris.withAppendedId(RawContacts.CONTENT_URI, rawContactId);
ContentValues values = new ContentValues();
values.put(RawContacts.BACKUP_ID, backupId);
assertEquals(1, mResolver.update(rawContactUri, values, null, null));
assertStoredValue(rawContactUri, RawContacts._ID, rawContactId);
assertStoredValue(rawContactUri, RawContacts.ACCOUNT_TYPE, TEST_ACCOUNT_TYPE1);
assertStoredValue(rawContactUri, RawContacts.ACCOUNT_NAME, TEST_ACCOUNT_NAME1);
assertStoredValue(rawContactUri, RawContacts.BACKUP_ID, backupId);
assertStoredValue(rawContactUri, RawContacts.DATA_SET, TEST_DATA_SET1);
String deleted = "0";
String insertJson = "{\n" +
" \"unique_contact_id\": {\n" +
" \"account_type\": \"CUSTOM_ACCOUNT\",\n" +
" \"custom_account_type\": " + TEST_ACCOUNT_TYPE1 + ",\n" +
" \"account_name\": " + TEST_ACCOUNT_NAME1 + ",\n" +
" \"contact_id\": " + backupId + ",\n" +
" \"data_set\": \"GOOGLE_PLUS\"\n" +
" },\n" +
" \"contact_prefs\": {\n" +
" \"send_to_voicemail\": true,\n" +
" \"starred\": true,\n" +
" \"pinned\": 2\n" +
" }\n" +
" }";
// Insert to MetadataSync table.
ContentValues insertedValues = new ContentValues();
insertedValues.put(MetadataSync.RAW_CONTACT_BACKUP_ID, backupId);
insertedValues.put(MetadataSync.ACCOUNT_TYPE, TEST_ACCOUNT_TYPE1);
insertedValues.put(MetadataSync.ACCOUNT_NAME, TEST_ACCOUNT_NAME1);
insertedValues.put(MetadataSync.DATA_SET, TEST_DATA_SET1);
insertedValues.put(MetadataSync.DATA, insertJson);
insertedValues.put(MetadataSync.DELETED, deleted);
Uri metadataUri = mResolver.insert(MetadataSync.CONTENT_URI, insertedValues);
long metadataId = ContentUris.parseId(metadataUri);
assertEquals(true, metadataId > 0);
// Check if RawContact table is updated after inserting metadata.
assertStoredValue(rawContactUri, RawContacts.ACCOUNT_TYPE, TEST_ACCOUNT_TYPE1);
assertStoredValue(rawContactUri, RawContacts.ACCOUNT_NAME, TEST_ACCOUNT_NAME1);
assertStoredValue(rawContactUri, RawContacts.BACKUP_ID, backupId);
assertStoredValue(rawContactUri, RawContacts.DATA_SET, TEST_DATA_SET1);
assertStoredValue(rawContactUri, RawContacts.SEND_TO_VOICEMAIL, "1");
assertStoredValue(rawContactUri, RawContacts.STARRED, "1");
assertStoredValue(rawContactUri, RawContacts.PINNED, "2");
// Update the MetadataSync table.
String updatedJson = "{\n" +
" \"unique_contact_id\": {\n" +
" \"account_type\": \"CUSTOM_ACCOUNT\",\n" +
" \"custom_account_type\": " + TEST_ACCOUNT_TYPE1 + ",\n" +
" \"account_name\": " + TEST_ACCOUNT_NAME1 + ",\n" +
" \"contact_id\": " + backupId + ",\n" +
" \"data_set\": \"GOOGLE_PLUS\"\n" +
" },\n" +
" \"contact_prefs\": {\n" +
" \"send_to_voicemail\": false,\n" +
" \"starred\": false,\n" +
" \"pinned\": 1\n" +
" }\n" +
" }";
ContentValues updatedValues = new ContentValues();
updatedValues.put(MetadataSync.RAW_CONTACT_BACKUP_ID, backupId);
updatedValues.put(MetadataSync.ACCOUNT_TYPE, TEST_ACCOUNT_TYPE1);
updatedValues.put(MetadataSync.ACCOUNT_NAME, TEST_ACCOUNT_NAME1);
updatedValues.put(MetadataSync.DATA_SET, TEST_DATA_SET1);
updatedValues.put(MetadataSync.DATA, updatedJson);
updatedValues.put(MetadataSync.DELETED, deleted);
mResolver.insert(MetadataSync.CONTENT_URI, updatedValues);
// Check if the insert (actually update) is correct.
assertStoredValue(rawContactUri, RawContacts.ACCOUNT_TYPE, TEST_ACCOUNT_TYPE1);
assertStoredValue(rawContactUri, RawContacts.ACCOUNT_NAME, TEST_ACCOUNT_NAME1);
assertStoredValue(rawContactUri, RawContacts.DATA_SET, TEST_DATA_SET1);
assertStoredValue(rawContactUri, RawContacts.SEND_TO_VOICEMAIL, "0");
assertStoredValue(rawContactUri, RawContacts.STARRED, "0");
assertStoredValue(rawContactUri, RawContacts.PINNED, "1");
}
public void testInsertMetadata() {
String backupId = "newBackupId";
String deleted = "0";
String insertJson = "{\n" +
" \"unique_contact_id\": {\n" +
" \"account_type\": \"CUSTOM_ACCOUNT\",\n" +
" \"custom_account_type\": " + TEST_ACCOUNT_TYPE1 + ",\n" +
" \"account_name\": " + TEST_ACCOUNT_NAME1 + ",\n" +
" \"contact_id\": " + backupId + ",\n" +
" \"data_set\": \"GOOGLE_PLUS\"\n" +
" },\n" +
" \"contact_prefs\": {\n" +
" \"send_to_voicemail\": true,\n" +
" \"starred\": true,\n" +
" \"pinned\": 2\n" +
" }\n" +
" }";
// Insert to MetadataSync table.
ContentValues insertedValues = new ContentValues();
insertedValues.put(MetadataSync.RAW_CONTACT_BACKUP_ID, backupId);
insertedValues.put(MetadataSync.ACCOUNT_TYPE, TEST_ACCOUNT_TYPE1);
insertedValues.put(MetadataSync.ACCOUNT_NAME, TEST_ACCOUNT_NAME1);
insertedValues.put(MetadataSync.DATA_SET, TEST_DATA_SET1);
insertedValues.put(MetadataSync.DATA, insertJson);
insertedValues.put(MetadataSync.DELETED, deleted);
Uri metadataUri = mResolver.insert(MetadataSync.CONTENT_URI, insertedValues);
long metadataId = ContentUris.parseId(metadataUri);
assertEquals(true, metadataId > 0);
}
public void testFailUpdateDeletedMetadata() {
String backupId = "backupId001";
String newData = "{\n" +
" \"unique_contact_id\": {\n" +
" \"account_type\": \"CUSTOM_ACCOUNT\",\n" +
" \"custom_account_type\": " + TEST_ACCOUNT_TYPE1 + ",\n" +
" \"account_name\": " + TEST_ACCOUNT_NAME1 + ",\n" +
" \"contact_id\": " + backupId + ",\n" +
" \"data_set\": \"GOOGLE_PLUS\"\n" +
" },\n" +
" \"contact_prefs\": {\n" +
" \"send_to_voicemail\": false,\n" +
" \"starred\": false,\n" +
" \"pinned\": 1\n" +
" }\n" +
" }";
ContentValues newValues = new ContentValues();
newValues.put(MetadataSync.ACCOUNT_NAME, TEST_ACCOUNT_NAME1);
newValues.put(MetadataSync.ACCOUNT_TYPE, TEST_ACCOUNT_TYPE1);
newValues.put(MetadataSync.DATA_SET, TEST_DATA_SET1);
newValues.put(MetadataSync.RAW_CONTACT_BACKUP_ID, backupId);
newValues.put(MetadataSync.DATA, newData);
newValues.put(MetadataSync.DELETED, 1);
try {
mResolver.insert(MetadataSync.CONTENT_URI, newValues);
fail("the update was expected to fail, but it succeeded");
} catch (IllegalArgumentException e) {
// Expected
}
}
public void testInsertWithNullData() {
ContentValues newValues = new ContentValues();
String data = null;
String backupId = "backupId002";
newValues.put(MetadataSync.ACCOUNT_NAME, TEST_ACCOUNT_NAME1);
newValues.put(MetadataSync.ACCOUNT_TYPE, TEST_ACCOUNT_TYPE1);
newValues.put(MetadataSync.DATA_SET, TEST_DATA_SET1);
newValues.put(MetadataSync.RAW_CONTACT_BACKUP_ID, backupId);
newValues.put(MetadataSync.DATA, data);
newValues.put(MetadataSync.DELETED, 0);
try {
mResolver.insert(MetadataSync.CONTENT_URI, newValues);
} catch (IllegalArgumentException e) {
// Expected.
}
}
public void testDeleteMetadata() {
//insert another metadata for TEST_ACCOUNT
insertMetadata(TEST_ACCOUNT_NAME1, TEST_ACCOUNT_TYPE1, TEST_DATA_SET1, "2", TEST_DATA1, 0);
Cursor c = mResolver.query(MetadataSync.CONTENT_URI, null, SELECTION_BY_TEST_ACCOUNT1,
null, null);
assertEquals(2, c.getCount());
int numOfDeletion = mResolver.delete(MetadataSync.CONTENT_URI, SELECTION_BY_TEST_ACCOUNT1,
null);
assertEquals(2, numOfDeletion);
c = mResolver.query(MetadataSync.CONTENT_URI, null, SELECTION_BY_TEST_ACCOUNT1,
null, null);
assertEquals(0, c.getCount());
}
public void testBulkInsert() {
Cursor c = mResolver.query(MetadataSync.CONTENT_URI, new String[]{MetadataSync._ID},
SELECTION_BY_TEST_ACCOUNT1, null, null);
assertEquals(1, c.getCount());
ContentValues values1 = getMetadataContentValues(
TEST_ACCOUNT_NAME1, TEST_ACCOUNT_TYPE1, TEST_DATA_SET1, "123", TEST_DATA1, 0);
ContentValues values2 = getMetadataContentValues(
TEST_ACCOUNT_NAME1, TEST_ACCOUNT_TYPE1, TEST_DATA_SET1, "456", TEST_DATA1, 0);
ContentValues[] values = new ContentValues[] {values1, values2};
mResolver.bulkInsert(MetadataSync.CONTENT_URI, values);
c = mResolver.query(MetadataSync.CONTENT_URI, new String[] {MetadataSync._ID},
SELECTION_BY_TEST_ACCOUNT1, null, null);
assertEquals(3, c.getCount());
}
public void testBatchOperations() throws Exception {
// Two mentadata_sync entries in the beginning, one for TEST_ACCOUNT1 and another for
// TEST_ACCOUNT2
Cursor c = mResolver.query(MetadataSync.CONTENT_URI, new String[] {MetadataSync._ID},
null, null, null);
assertEquals(2, c.getCount());
String updatedData = "{\n" +
" \"unique_contact_id\": {\n" +
" \"account_type\": \"CUSTOM_ACCOUNT\",\n" +
" \"custom_account_type\": " + TEST_ACCOUNT_TYPE1 + ",\n" +
" \"account_name\": " + TEST_ACCOUNT_NAME1 + ",\n" +
" \"contact_id\": " + TEST_BACKUP_ID1 + ",\n" +
" \"data_set\": \"GOOGLE_PLUS\"\n" +
" },\n" +
" \"contact_prefs\": {\n" +
" \"send_to_voicemail\": true,\n" +
" \"starred\": false,\n" +
" \"pinned\": 5\n" +
" }\n" +
" }";
String newBackupId = "2222";
String newData = "{\n" +
" \"unique_contact_id\": {\n" +
" \"account_type\": \"CUSTOM_ACCOUNT\",\n" +
" \"custom_account_type\": " + TEST_ACCOUNT_TYPE1 + ",\n" +
" \"account_name\": " + TEST_ACCOUNT_NAME1 + ",\n" +
" \"contact_id\": " + newBackupId + ",\n" +
" \"data_set\": \"GOOGLE_PLUS\"\n" +
" },\n" +
" \"contact_prefs\": {\n" +
" \"send_to_voicemail\": true,\n" +
" \"starred\": false,\n" +
" \"pinned\": 5\n" +
" }\n" +
" }";
ArrayList<ContentProviderOperation> ops = Lists.newArrayList();
ops.add(ContentProviderOperation.newInsert(MetadataSync.CONTENT_URI)
.withValue(MetadataSync.ACCOUNT_NAME, TEST_ACCOUNT_NAME1)
.withValue(MetadataSync.ACCOUNT_TYPE, TEST_ACCOUNT_TYPE1)
.withValue(MetadataSync.DATA_SET, TEST_DATA_SET1)
.withValue(MetadataSync.RAW_CONTACT_BACKUP_ID, TEST_BACKUP_ID1)
.withValue(MetadataSync.DATA, updatedData)
.withValue(MetadataSync.DELETED, 0)
.build());
ops.add(ContentProviderOperation.newInsert(MetadataSync.CONTENT_URI)
.withValue(MetadataSync.ACCOUNT_NAME, TEST_ACCOUNT_NAME1)
.withValue(MetadataSync.ACCOUNT_TYPE, TEST_ACCOUNT_TYPE1)
.withValue(MetadataSync.DATA_SET, TEST_DATA_SET1)
.withValue(MetadataSync.RAW_CONTACT_BACKUP_ID, newBackupId)
.withValue(MetadataSync.DATA, newData)
.withValue(MetadataSync.DELETED, 0)
.build());
ops.add(ContentProviderOperation.newDelete(MetadataSync.CONTENT_URI)
.withSelection(SELECTION_BY_TEST_ACCOUNT2, null)
.build());
// Batch three operations: update the metadata_entry of TEST_ACCOUNT1; insert one new
// metadata_entry for TEST_ACCOUNT1; delete metadata_entry of TEST_ACCOUNT2
mResolver.applyBatch(MetadataSync.METADATA_AUTHORITY, ops);
// After the batch operations, there should be two metadata_entry for TEST_ACCOUNT1 with
// new data value and no metadata_entry for TEST_ACCOUNT2.
c = mResolver.query(MetadataSync.CONTENT_URI, new String[] {MetadataSync.DATA},
SELECTION_BY_TEST_ACCOUNT1, null, null);
assertEquals(2, c.getCount());
Set<String> actualData = new HashSet<>();
while (c.moveToNext()) {
actualData.add(c.getString(0));
}
c.close();
MoreAsserts.assertContentsInAnyOrder(actualData, updatedData, newData);
c = mResolver.query(MetadataSync.CONTENT_URI, new String[] {MetadataSync._ID},
SELECTION_BY_TEST_ACCOUNT2, null, null);
assertEquals(0, c.getCount());
}
public void testQueryMetadataSyncState() {
String selection = MetadataSyncState.ACCOUNT_NAME + "=?1 AND " +
MetadataSyncState.ACCOUNT_TYPE + "=?2 AND " + MetadataSyncState.DATA_SET + "=?3";
final String[] args = new String[]{TEST_ACCOUNT_NAME1, TEST_ACCOUNT_TYPE1, TEST_DATA_SET1};
final String[] projection = new String[]{MetadataSyncState.STATE};
Cursor c = mResolver.query(MetadataSyncState.CONTENT_URI, projection, selection, args,
null);
assertEquals(1, c.getCount());
c.moveToFirst();
assertTrue(Arrays.equals(TEST_SYNC_STATE1, c.getBlob(0)));
c.close();
}
public void testUpdateMetadataSyncState() {
mResolver.update(MetadataSyncState.CONTENT_URI, getSyncStateValues(TEST_ACCOUNT_NAME1,
TEST_ACCOUNT_TYPE1, TEST_DATA_SET1, TEST_SYNC_STATE2), null, null);
String selection = MetadataSyncState.ACCOUNT_NAME + "=?1 AND " +
MetadataSyncState.ACCOUNT_TYPE + "=?2 AND " + MetadataSyncState.DATA_SET + "=?3";
final String[] args = new String[]{TEST_ACCOUNT_NAME1, TEST_ACCOUNT_TYPE1, TEST_DATA_SET1};
final String[] projection = new String[] {MetadataSyncState.STATE};
Cursor c = mResolver.query(MetadataSyncState.CONTENT_URI, projection, selection, args,
null);
assertEquals(1, c.getCount());
c.moveToFirst();
assertTrue(Arrays.equals(TEST_SYNC_STATE2, c.getBlob(0)));
c.close();
}
public void testUpdateMetadataSyncState_NonExisting() {
// Delete the existing one first.
String selection = MetadataSyncState.ACCOUNT_NAME + "=?1 AND " +
MetadataSyncState.ACCOUNT_TYPE + "=?2 AND " + MetadataSyncState.DATA_SET + "=?3";
final String[] args = new String[]{TEST_ACCOUNT_NAME1, TEST_ACCOUNT_TYPE1, TEST_DATA_SET1};
mResolver.delete(MetadataSyncState.CONTENT_URI, selection, args);
mResolver.update(MetadataSyncState.CONTENT_URI, getSyncStateValues(TEST_ACCOUNT_NAME1,
TEST_ACCOUNT_TYPE1, TEST_DATA_SET1, TEST_SYNC_STATE2), null, null);
final String[] projection = new String[] {MetadataSyncState.STATE};
Cursor c = mResolver.query(MetadataSyncState.CONTENT_URI, projection, selection, args,
null);
assertEquals(1, c.getCount());
c.moveToFirst();
assertTrue(Arrays.equals(TEST_SYNC_STATE2, c.getBlob(0)));
c.close();
}
public void testDeleteMetadataSyncState() {
String selection = MetadataSyncState.ACCOUNT_NAME + "=?1 AND " +
MetadataSyncState.ACCOUNT_TYPE + "=?2 AND " + MetadataSyncState.DATA_SET + "=?3";
final String[] args = new String[]{TEST_ACCOUNT_NAME1, TEST_ACCOUNT_TYPE1, TEST_DATA_SET1};
final String[] projection = new String[]{MetadataSyncState.STATE};
Cursor c = mResolver.query(MetadataSyncState.CONTENT_URI, projection, selection, args,
null);
assertEquals(1, c.getCount());
c.close();
mResolver.delete(MetadataSyncState.CONTENT_URI, selection, args);
c = mResolver.query(MetadataSyncState.CONTENT_URI, projection, selection, args,
null);
assertEquals(0, c.getCount());
c.close();
}
private void setupData() {
long rawContactId1 = RawContactUtil.createRawContactWithAccountDataSet(
mResolver, TEST_ACCOUNT_NAME1, TEST_ACCOUNT_TYPE1, TEST_DATA_SET1);
createAccount(TEST_ACCOUNT_NAME1, TEST_ACCOUNT_TYPE1, TEST_DATA_SET1);
insertMetadata(getDefaultValues());
insertMetadataSyncState(TEST_ACCOUNT_NAME1, TEST_ACCOUNT_TYPE1, TEST_DATA_SET1,
TEST_SYNC_STATE1);
// Insert another entry for another account
createAccount(TEST_ACCOUNT_NAME2, TEST_ACCOUNT_TYPE2, TEST_DATA_SET2);
insertMetadata(TEST_ACCOUNT_NAME2, TEST_ACCOUNT_TYPE2, TEST_DATA_SET2, TEST_BACKUP_ID2,
TEST_DATA2, 0);
insertMetadataSyncState(TEST_ACCOUNT_NAME2, TEST_ACCOUNT_TYPE2, TEST_DATA_SET2,
TEST_SYNC_STATE2);
}
private ContentValues getDefaultValues() {
defaultValues = new ContentValues();
defaultValues.put(MetadataSync.ACCOUNT_NAME, TEST_ACCOUNT_NAME1);
defaultValues.put(MetadataSync.ACCOUNT_TYPE, TEST_ACCOUNT_TYPE1);
defaultValues.put(MetadataSync.DATA_SET, TEST_DATA_SET1);
defaultValues.put(MetadataSync.RAW_CONTACT_BACKUP_ID, TEST_BACKUP_ID1);
defaultValues.put(MetadataSync.DATA, TEST_DATA1);
defaultValues.put(MetadataSync.DELETED, 0);
return defaultValues;
}
private long insertMetadata(String accountName, String accountType, String dataSet,
String backupId, String data, int deleted) {
return insertMetadata(getMetadataContentValues(
accountName, accountType, dataSet, backupId, data, deleted));
}
private ContentValues getMetadataContentValues(String accountName, String accountType,
String dataSet, String backupId, String data, int deleted) {
ContentValues values = new ContentValues();
values.put(MetadataSync.ACCOUNT_NAME, accountName);
values.put(MetadataSync.ACCOUNT_TYPE, accountType);
values.put(MetadataSync.DATA_SET, dataSet);
values.put(MetadataSync.RAW_CONTACT_BACKUP_ID, backupId);
values.put(MetadataSync.DATA, data);
values.put(MetadataSync.DELETED, deleted);
return values;
}
private long insertMetadata(ContentValues values) {
return ContentUris.parseId(mResolver.insert(MetadataSync.CONTENT_URI, values));
}
private long insertMetadataSyncState(String accountName, String accountType,
String dataSet, byte[] state) {
return ContentUris.parseId(mResolver.insert(MetadataSyncState.CONTENT_URI,
getSyncStateValues(accountName, accountType, dataSet, state)));
}
private ContentValues getSyncStateValues(String accountName, String accountType,
String dataSet, byte[] state) {
ContentValues values = new ContentValues();
values.put(MetadataSyncState.ACCOUNT_NAME, accountName);
values.put(MetadataSyncState.ACCOUNT_TYPE, accountType);
values.put(MetadataSyncState.DATA_SET, dataSet);
values.put(MetadataSyncState.STATE, state);
return values;
}
}