/* * 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}. *

* Run the test like this: * * adb shell am instrument -e class com.android.providers.contacts.ContactMetadataProviderTest -w \ * com.android.providers.contacts.tests/android.test.InstrumentationTestRunner * */ @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 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 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; } }