blob: 047e8ea524edb4c12de022d77f4562d11c621535 [file] [log] [blame]
/*
* Copyright (C) 2009 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.ContentUris;
import android.net.Uri;
import android.provider.ContactsContract.AggregationExceptions;
import android.provider.ContactsContract.Contacts;
import android.provider.ContactsContract.RawContacts;
import android.test.suitebuilder.annotation.MediumTest;
import com.android.providers.contacts.ContactLookupKey.LookupKeySegment;
import com.android.providers.contacts.testutil.RawContactUtil;
import java.util.ArrayList;
/**
* Unit tests for {@link ContactLookupKey}.
*
* Run the test like this:
* <code>
* adb shell am instrument -e class com.android.providers.contacts.ContactLookupKeyTest -w \
* com.android.providers.contacts.tests/android.test.InstrumentationTestRunner
* </code>
*/
@MediumTest
public class ContactLookupKeyTest extends BaseContactsProvider2Test {
public void testLookupKeyUsingDisplayNameAndNoAccount() {
long rawContactId1 = RawContactUtil.createRawContactWithName(mResolver, "John", "Doe");
long rawContactId2 = RawContactUtil.createRawContactWithName(mResolver, "johndoe", null);
setAggregationException(
AggregationExceptions.TYPE_KEEP_TOGETHER, rawContactId1, rawContactId2);
// Normalized display name
String normalizedName = NameNormalizer.normalize("johndoe");
String expectedLookupKey = "0r" + rawContactId1 + "-" + normalizedName + ".0r"
+ rawContactId2 + "-" + normalizedName;
long contactId = queryContactId(rawContactId1);
assertStoredValue(ContentUris.withAppendedId(Contacts.CONTENT_URI, contactId),
Contacts.LOOKUP_KEY, expectedLookupKey);
// Find the contact using lookup key by itself
Uri lookupUri = Uri.withAppendedPath(Contacts.CONTENT_LOOKUP_URI, expectedLookupKey);
assertStoredValue(lookupUri, Contacts._ID, contactId);
// Find the contact using both the lookup key and the correct contact ID
assertStoredValue(ContentUris.withAppendedId(lookupUri, contactId),
Contacts._ID, contactId);
// Find the contact using both the lookup key and an incorrect contact ID
assertStoredValue(ContentUris.withAppendedId(lookupUri, contactId + 1),
Contacts._ID, contactId);
}
public void testLookupKeyUsingSourceIdAndNoAccount() {
long rawContactId1 = RawContactUtil.createRawContactWithName(mResolver, "John", "Doe");
storeValue(RawContacts.CONTENT_URI, rawContactId1, RawContacts.SOURCE_ID, "123");
long rawContactId2 = RawContactUtil.createRawContactWithName(mResolver, "johndoe", null);
storeValue(RawContacts.CONTENT_URI, rawContactId2, RawContacts.SOURCE_ID, "4.5.6");
long rawContactId3 = RawContactUtil.createRawContactWithName(mResolver, "john", "dough");
storeValue(RawContacts.CONTENT_URI, rawContactId3, RawContacts.SOURCE_ID, "http://foo?bar");
setAggregationException(
AggregationExceptions.TYPE_KEEP_TOGETHER, rawContactId1, rawContactId2);
setAggregationException(
AggregationExceptions.TYPE_KEEP_TOGETHER, rawContactId1, rawContactId3);
// Two source ids, of them escaped
String expectedLookupKey = "0i123.0e4..5..6.0ihttp%3A%2F%2Ffoo%3Fbar";
long contactId = queryContactId(rawContactId1);
assertStoredValue(ContentUris.withAppendedId(Contacts.CONTENT_URI, contactId),
Contacts.LOOKUP_KEY, expectedLookupKey);
Uri lookupUri = Uri.withAppendedPath(Contacts.CONTENT_LOOKUP_URI, expectedLookupKey);
assertStoredValue(lookupUri, Contacts._ID, contactId);
}
public void testLookupKeySameSourceIdDifferentAccounts() {
long rawContactId1 = RawContactUtil.createRawContactWithName(mResolver, "Dear", "Doe");
storeValue(RawContacts.CONTENT_URI, rawContactId1, RawContacts.ACCOUNT_TYPE, "foo");
storeValue(RawContacts.CONTENT_URI, rawContactId1, RawContacts.ACCOUNT_NAME, "FOO");
storeValue(RawContacts.CONTENT_URI, rawContactId1, RawContacts.SOURCE_ID, "1");
long rawContactId2 = RawContactUtil.createRawContactWithName(mResolver, "Deer", "Dough");
storeValue(RawContacts.CONTENT_URI, rawContactId2, RawContacts.ACCOUNT_TYPE, "bar");
storeValue(RawContacts.CONTENT_URI, rawContactId2, RawContacts.ACCOUNT_NAME, "BAR");
storeValue(RawContacts.CONTENT_URI, rawContactId2, RawContacts.SOURCE_ID, "1");
assertNotAggregated(rawContactId1, rawContactId2);
int accountHashCode1 = ContactLookupKey.getAccountHashCode("foo", "FOO");
int accountHashCode2 = ContactLookupKey.getAccountHashCode("bar", "BAR");
long contactId1 = queryContactId(rawContactId1);
assertStoredValue(ContentUris.withAppendedId(Contacts.CONTENT_URI, contactId1),
Contacts.LOOKUP_KEY, accountHashCode1 + "i1");
long contactId2 = queryContactId(rawContactId2);
assertStoredValue(ContentUris.withAppendedId(Contacts.CONTENT_URI, contactId2),
Contacts.LOOKUP_KEY, accountHashCode2 + "i1");
Uri lookupUri1 = Uri.withAppendedPath(Contacts.CONTENT_LOOKUP_URI, accountHashCode1 + "i1");
assertStoredValue(lookupUri1, Contacts._ID, contactId1);
Uri lookupUri2 = Uri.withAppendedPath(Contacts.CONTENT_LOOKUP_URI, accountHashCode2 + "i1");
assertStoredValue(lookupUri2, Contacts._ID, contactId2);
}
public void testLookupKeyChoosingLargestContact() {
long rawContactId1 = RawContactUtil.createRawContactWithName(mResolver, "John", "Doe");
storeValue(RawContacts.CONTENT_URI, rawContactId1, RawContacts.SOURCE_ID, "1");
long rawContactId2 = RawContactUtil.createRawContactWithName(mResolver, "John", "Doe");
storeValue(RawContacts.CONTENT_URI, rawContactId2, RawContacts.SOURCE_ID, "2");
long rawContactId3 = RawContactUtil.createRawContactWithName(mResolver, "John", "Doe");
storeValue(RawContacts.CONTENT_URI, rawContactId3, RawContacts.SOURCE_ID, "3");
setAggregationException(
AggregationExceptions.TYPE_KEEP_TOGETHER, rawContactId1, rawContactId2);
setAggregationException(
AggregationExceptions.TYPE_KEEP_TOGETHER, rawContactId1, rawContactId3);
String lookupKey = "0i1.0i2.0i3";
long contactId = queryContactId(rawContactId1);
assertStoredValue(ContentUris.withAppendedId(Contacts.CONTENT_URI, contactId),
Contacts.LOOKUP_KEY, lookupKey);
setAggregationException(AggregationExceptions.TYPE_KEEP_SEPARATE, rawContactId1,
rawContactId3);
setAggregationException(AggregationExceptions.TYPE_KEEP_SEPARATE, rawContactId2,
rawContactId3);
assertAggregated(rawContactId1, rawContactId2);
assertNotAggregated(rawContactId1, rawContactId3);
assertNotAggregated(rawContactId2, rawContactId3);
long largerContactId = queryContactId(rawContactId1);
assertStoredValue(
ContentUris.withAppendedId(Contacts.CONTENT_URI, largerContactId),
Contacts.LOOKUP_KEY, "0i1.0i2");
assertStoredValue(
ContentUris.withAppendedId(Contacts.CONTENT_URI, queryContactId(rawContactId3)),
Contacts.LOOKUP_KEY, "0i3");
Uri lookupUri = Uri.withAppendedPath(Contacts.CONTENT_LOOKUP_URI, lookupKey);
assertStoredValue(lookupUri, Contacts._ID, largerContactId);
}
public void testGetLookupUri() {
long rawContactId1 = RawContactUtil.createRawContactWithName(mResolver, "John", "Doe");
storeValue(RawContacts.CONTENT_URI, rawContactId1, RawContacts.SOURCE_ID, "1");
long contactId = queryContactId(rawContactId1);
String lookupUri = "content://com.android.contacts/contacts/lookup/0i1/" + contactId;
Uri contentUri = ContentUris.withAppendedId(Contacts.CONTENT_URI, contactId);
assertEquals(lookupUri,
Contacts.getLookupUri(mResolver, contentUri).toString());
Uri staleLookupUri = ContentUris.withAppendedId(
Uri.withAppendedPath(Contacts.CONTENT_LOOKUP_URI, "0i1"),
contactId+2);
assertEquals(lookupUri,
Contacts.getLookupUri(mResolver, staleLookupUri).toString());
}
public void testParseLookupKey() {
// Display name
assertLookupKey("123n1248AC",
new int[]{123},
new int[]{ContactLookupKey.LOOKUP_TYPE_DISPLAY_NAME},
new String[]{"1248AC"});
// Raw contact ID + display name
assertLookupKey("123r20-1248AC",
new int[]{123},
new int[]{ContactLookupKey.LOOKUP_TYPE_RAW_CONTACT_ID},
new String[]{"1248AC"});
// Unescaped source ID
assertLookupKey("0i1248AC-X",
new int[]{0},
new int[]{ContactLookupKey.LOOKUP_TYPE_SOURCE_ID},
new String[]{"1248AC-X"});
// Escaped source ID
assertLookupKey("432e12..48AC",
new int[]{432},
new int[]{ContactLookupKey.LOOKUP_TYPE_SOURCE_ID},
new String[]{"12.48AC"});
// Compound lookup key
assertLookupKey("123n1248AC.0i1248AC.432e12..48AC.123n1248AC.123r30-2184CA",
new int[]{123, 0, 432, 123},
new int[] {
ContactLookupKey.LOOKUP_TYPE_DISPLAY_NAME,
ContactLookupKey.LOOKUP_TYPE_SOURCE_ID,
ContactLookupKey.LOOKUP_TYPE_SOURCE_ID,
ContactLookupKey.LOOKUP_TYPE_DISPLAY_NAME,
ContactLookupKey.LOOKUP_TYPE_RAW_CONTACT_ID,
},
new String[]{"1248AC", "1248AC", "12.48AC", "1248AC", "2184CA"});
}
private void assertLookupKey(String lookupKey, int[] accountHashCodes, int[] types,
String[] keys) {
ContactLookupKey key = new ContactLookupKey();
ArrayList<LookupKeySegment> list = key.parse(lookupKey);
assertEquals(types.length, list.size());
for (int i = 0; i < accountHashCodes.length; i++) {
LookupKeySegment segment = list.get(i);
assertEquals(accountHashCodes[i], segment.accountHashCode);
assertEquals(types[i], segment.lookupType);
assertEquals(keys[i], segment.key);
}
}
}