Home | History | Annotate | Download | only in contacts
      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