1 /* 2 * Copyright (C) 2014 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 package android.provider.cts.contacts; 18 19 import android.content.ContentProviderClient; 20 import android.content.ContentResolver; 21 import android.content.ContentValues; 22 import android.net.Uri; 23 import android.provider.ContactsContract; 24 import android.provider.ContactsContract.CommonDataKinds.Email; 25 import android.provider.ContactsContract.CommonDataKinds.Phone; 26 import android.provider.ContactsContract.CommonDataKinds.SipAddress; 27 import android.provider.ContactsContract.CommonDataKinds.StructuredName; 28 import android.provider.ContactsContract.Contacts; 29 import android.provider.ContactsContract.PhoneLookup; 30 import android.provider.ContactsContract.RawContacts; 31 import android.provider.cts.contacts.ContactsContract_TestDataBuilder.TestContact; 32 import android.provider.cts.contacts.ContactsContract_TestDataBuilder.TestRawContact; 33 import android.test.AndroidTestCase; 34 35 /** 36 * Test for {@link android.provider.ContactsContract.PhoneLookup}. 37 * <p> 38 * This covers {@link PhoneLookup#CONTENT_FILTER_URI} and 39 * {@link PhoneLookup#ENTERPRISE_CONTENT_FILTER_URI}. 40 * 41 * TODO We don't yet have tests to cover cross-user provider access for the later, since multi-user 42 * cases aren't well supported in CTS yet. Tracking in internal bug/16462089 . 43 */ 44 public class ContactsContract_PhoneLookup extends AndroidTestCase { 45 private ContentResolver mResolver; 46 private ContactsContract_TestDataBuilder mBuilder; 47 48 @Override 49 protected void setUp() throws Exception { 50 super.setUp(); 51 mResolver = getContext().getContentResolver(); 52 ContentProviderClient provider = 53 mResolver.acquireContentProviderClient(ContactsContract.AUTHORITY); 54 mBuilder = new ContactsContract_TestDataBuilder(provider); 55 } 56 57 @Override 58 protected void tearDown() throws Exception { 59 super.tearDown(); 60 mBuilder.cleanup(); 61 } 62 63 static class Id { 64 public long contactId; 65 public long dataId; 66 67 public Id (long contactId, long dataId) { 68 this.contactId = contactId; 69 this.dataId = dataId; 70 } 71 } 72 73 private Id[] setupTestData() throws Exception { 74 TestRawContact rawContact = mBuilder.newRawContact() 75 .with(RawContacts.ACCOUNT_TYPE, "test_account") 76 .with(RawContacts.ACCOUNT_NAME, "test_name") 77 .insert(); 78 rawContact.newDataRow(StructuredName.CONTENT_ITEM_TYPE) 79 .with(StructuredName.DISPLAY_NAME, "Hot Tamale") 80 .insert(); 81 long dataId = rawContact.newDataRow(Phone.CONTENT_ITEM_TYPE) 82 .with(Phone.DATA, "1111222333444") 83 .with(Email.TYPE, Phone.TYPE_HOME) 84 .insert().load().getId(); 85 rawContact.load(); 86 TestContact contact = rawContact.getContact().load(); 87 88 TestRawContact rawContact2 = mBuilder.newRawContact() 89 .with(RawContacts.ACCOUNT_TYPE, "test_account") 90 .with(RawContacts.ACCOUNT_NAME, "test_name") 91 .insert(); 92 rawContact2.newDataRow(StructuredName.CONTENT_ITEM_TYPE) 93 .with(StructuredName.DISPLAY_NAME, "Cold Tamago") 94 .insert(); 95 long dataId2 = rawContact2.newDataRow(Phone.CONTENT_ITEM_TYPE) 96 .with(Phone.DATA, "2111222333444") 97 .with(Phone.TYPE, Phone.TYPE_OTHER) 98 .insert().load().getId(); 99 rawContact2.load(); 100 TestContact contact2 = rawContact2.getContact().load(); 101 102 // Contact with SIP address 103 TestRawContact rawContact3 = mBuilder.newRawContact() 104 .with(RawContacts.ACCOUNT_TYPE, "test_account") 105 .with(RawContacts.ACCOUNT_NAME, "test_name") 106 .insert(); 107 rawContact3.newDataRow(StructuredName.CONTENT_ITEM_TYPE) 108 .with(StructuredName.DISPLAY_NAME, "Warm Tempura") 109 .insert(); 110 long dataId3 = rawContact2.newDataRow(SipAddress.CONTENT_ITEM_TYPE) 111 .with(SipAddress.SIP_ADDRESS, "777 (at) sip.org") 112 .with(SipAddress.TYPE, SipAddress.TYPE_WORK) 113 .insert().load().getId(); 114 rawContact3.load(); 115 TestContact contact3 = rawContact2.getContact().load(); 116 117 return new Id[] { 118 new Id(contact.getId(), dataId), 119 new Id(contact2.getId(), dataId2), 120 new Id(contact3.getId(), dataId3) 121 }; 122 123 } 124 125 /** 126 * Test for {@link android.provider.ContactsContract.PhoneLookup#CONTENT_FILTER_URI}. 127 */ 128 public void testPhoneLookup_nomatch() throws Exception { 129 Id[] ids = setupTestData(); 130 final Uri uri = PhoneLookup.CONTENT_FILTER_URI.buildUpon() 131 .appendPath("no-such-phone-number").build(); 132 133 assertCursorStoredValuesWithContactsFilter(uri, ids /*, empty */); 134 } 135 136 /** 137 * Test for {@link android.provider.ContactsContract.PhoneLookup#CONTENT_FILTER_URI}. 138 */ 139 public void testPhoneLookup_found1() throws Exception { 140 Id[] ids = setupTestData(); 141 final Uri uri = PhoneLookup.CONTENT_FILTER_URI.buildUpon() 142 .appendPath("1111222333444").build(); 143 144 final ContentValues expected = new ContentValues(); 145 expected.put(PhoneLookup._ID, ids[0].contactId); 146 expected.put(PhoneLookup.CONTACT_ID, ids[0].contactId); 147 expected.put(PhoneLookup.DATA_ID, ids[0].dataId); 148 expected.put(PhoneLookup.NUMBER, "1111222333444"); 149 150 assertCursorStoredValuesWithContactsFilter(uri, ids, expected); 151 } 152 153 /** 154 * Test for {@link android.provider.ContactsContract.PhoneLookup#CONTENT_FILTER_URI}. 155 */ 156 public void testPhoneLookup_found2() throws Exception { 157 Id[] ids = setupTestData(); 158 final Uri uri = PhoneLookup.CONTENT_FILTER_URI.buildUpon() 159 .appendPath("2111222333444").build(); 160 161 final ContentValues expected = new ContentValues(); 162 expected.put(PhoneLookup._ID, ids[1].contactId); 163 expected.put(PhoneLookup.CONTACT_ID, ids[1].contactId); 164 expected.put(PhoneLookup.DATA_ID, ids[1].dataId); 165 expected.put(PhoneLookup.NUMBER, "2111222333444"); 166 167 assertCursorStoredValuesWithContactsFilter(uri, ids, expected); 168 } 169 170 public void testPhoneLookup_sip_found() throws Exception { 171 Id[] ids = setupTestData(); 172 final Uri uri = PhoneLookup.CONTENT_FILTER_URI.buildUpon() 173 .appendPath("777 (at) sip.org") 174 .appendQueryParameter(PhoneLookup.QUERY_PARAMETER_SIP_ADDRESS, "1") 175 .build(); 176 177 final ContentValues expected = new ContentValues(); 178 expected.put(PhoneLookup.CONTACT_ID, ids[2].contactId); 179 expected.put(PhoneLookup.DATA_ID, ids[2].dataId); 180 expected.put(SipAddress.SIP_ADDRESS, "777 (at) sip.org"); 181 182 assertCursorStoredValuesWithContactsFilter(uri, ids, expected); 183 } 184 185 /** 186 * Test for {@link android.provider.ContactsContract.PhoneLookup#ENTERPRISE_CONTENT_FILTER_URI}. 187 */ 188 public void testPhoneLookupEnterprise_nomatch() throws Exception { 189 Id[] ids = setupTestData(); 190 final Uri uri = PhoneLookup.ENTERPRISE_CONTENT_FILTER_URI.buildUpon() 191 .appendPath("no-such-phone-number").build(); 192 193 assertCursorStoredValuesWithContactsFilter(uri, ids /*, empty */); 194 } 195 196 /** 197 * Test for {@link android.provider.ContactsContract.PhoneLookup#ENTERPRISE_CONTENT_FILTER_URI}. 198 */ 199 public void testPhoneLookupEnterprise_found1() throws Exception { 200 Id[] ids = setupTestData(); 201 final Uri uri = PhoneLookup.ENTERPRISE_CONTENT_FILTER_URI.buildUpon() 202 .appendPath("1111222333444").build(); 203 204 final ContentValues expected = new ContentValues(); 205 expected.put(PhoneLookup._ID, ids[0].contactId); 206 expected.put(PhoneLookup.CONTACT_ID, ids[0].contactId); 207 expected.put(PhoneLookup.DATA_ID, ids[0].dataId); 208 expected.put(PhoneLookup.NUMBER, "1111222333444"); 209 210 assertCursorStoredValuesWithContactsFilter(uri, ids, expected); 211 } 212 213 /** 214 * Test for {@link android.provider.ContactsContract.PhoneLookup#ENTERPRISE_CONTENT_FILTER_URI}. 215 */ 216 public void testPhoneLookupEnterprise_found2() throws Exception { 217 Id[] ids = setupTestData(); 218 final Uri uri = PhoneLookup.ENTERPRISE_CONTENT_FILTER_URI.buildUpon() 219 .appendPath("2111222333444").build(); 220 221 final ContentValues expected = new ContentValues(); 222 expected.put(PhoneLookup._ID, ids[1].contactId); 223 expected.put(PhoneLookup.CONTACT_ID, ids[1].contactId); 224 expected.put(PhoneLookup.DATA_ID, ids[1].dataId); 225 expected.put(PhoneLookup.NUMBER, "2111222333444"); 226 227 assertCursorStoredValuesWithContactsFilter(uri, ids, expected); 228 } 229 230 public void testPhoneLookupEnterprise_sip_found() throws Exception { 231 Id[] ids = setupTestData(); 232 final Uri uri = PhoneLookup.ENTERPRISE_CONTENT_FILTER_URI.buildUpon() 233 .appendPath("777 (at) sip.org") 234 .appendQueryParameter(PhoneLookup.QUERY_PARAMETER_SIP_ADDRESS, "1") 235 .build(); 236 237 final ContentValues expected = new ContentValues(); 238 expected.put(PhoneLookup._ID, ids[2].dataId); 239 expected.put(PhoneLookup.CONTACT_ID, ids[2].contactId); 240 expected.put(PhoneLookup.DATA_ID, ids[2].dataId); 241 expected.put(SipAddress.SIP_ADDRESS, "777 (at) sip.org"); 242 243 assertCursorStoredValuesWithContactsFilter(uri, ids, expected); 244 } 245 246 private void assertCursorStoredValuesWithContactsFilter(Uri uri, Id[] ids, 247 ContentValues... expected) { 248 // We need this helper function to add a filter for specific contacts because 249 // otherwise tests will fail if performed on a device with existing contacts data 250 StringBuilder sb = new StringBuilder(); 251 sb.append(Contacts._ID + " in "); 252 sb.append("("); 253 for (int i = 0; i < ids.length; i++) { 254 if (i != 0) sb.append(","); 255 sb.append(ids[i].contactId); 256 } 257 sb.append(")"); 258 DatabaseAsserts.assertStoredValuesInUriMatchExactly(mResolver, uri, null, 259 sb.toString(), null, null, false, expected); 260 } 261 } 262