Home | History | Annotate | Download | only in contacts
      1 /*
      2  * Copyright (C) 2013 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 static android.provider.ContactsContract.DataUsageFeedback;
     20 
     21 import android.content.ContentResolver;
     22 import android.content.ContentValues;
     23 import android.net.Uri;
     24 import android.provider.ContactsContract;
     25 import android.provider.ContactsContract.Data;
     26 import android.provider.cts.contacts.DataUtil;
     27 import android.provider.cts.contacts.DatabaseAsserts;
     28 import android.provider.cts.contacts.RawContactUtil;
     29 import android.test.AndroidTestCase;
     30 import android.text.TextUtils;
     31 
     32 public class ContactsContract_DataUsageTest extends AndroidTestCase {
     33 
     34     private ContentResolver mResolver;
     35 
     36     @Override
     37     protected void setUp() throws Exception {
     38         super.setUp();
     39         mResolver = getContext().getContentResolver();
     40     }
     41 
     42     public void testSingleDataUsageFeedback_incrementsCorrectDataItems() {
     43         DatabaseAsserts.ContactIdPair ids = DatabaseAsserts.assertAndCreateContact(mResolver);
     44 
     45         long[] dataIds = setupRawContactDataItems(ids.mRawContactId);
     46 
     47         // Update just 1 data item at a time.
     48         updateDataUsageAndAssert(dataIds[1], 1);
     49         updateDataUsageAndAssert(dataIds[1], 2);
     50         updateDataUsageAndAssert(dataIds[1], 3);
     51         updateDataUsageAndAssert(dataIds[1], 4);
     52         updateDataUsageAndAssert(dataIds[1], 5);
     53         updateDataUsageAndAssert(dataIds[1], 6);
     54         updateDataUsageAndAssert(dataIds[1], 7);
     55         updateDataUsageAndAssert(dataIds[1], 8);
     56         updateDataUsageAndAssert(dataIds[1], 9);
     57         updateDataUsageAndAssert(dataIds[1], 10);
     58         updateDataUsageAndAssert(dataIds[1], 10);
     59         updateDataUsageAndAssert(dataIds[1], 10);
     60         updateDataUsageAndAssert(dataIds[1], 10);
     61         updateDataUsageAndAssert(dataIds[1], 10);
     62         updateDataUsageAndAssert(dataIds[1], 10);
     63         updateDataUsageAndAssert(dataIds[1], 10);
     64         updateDataUsageAndAssert(dataIds[1], 10);
     65         updateDataUsageAndAssert(dataIds[1], 10);
     66 
     67         updateDataUsageAndAssert(dataIds[2], 1);
     68         updateDataUsageAndAssert(dataIds[2], 2);
     69         updateDataUsageAndAssert(dataIds[2], 3);
     70 
     71         // Go back and update the previous data item again.
     72         updateDataUsageAndAssert(dataIds[1], 10);
     73         updateDataUsageAndAssert(dataIds[1], 20);
     74 
     75         updateDataUsageAndAssert(dataIds[2], 4);
     76         updateDataUsageAndAssert(dataIds[2], 5);
     77         updateDataUsageAndAssert(dataIds[2], 6);
     78         updateDataUsageAndAssert(dataIds[2], 7);
     79         updateDataUsageAndAssert(dataIds[2], 8);
     80         updateDataUsageAndAssert(dataIds[2], 9);
     81         updateDataUsageAndAssert(dataIds[2], 10);
     82 
     83         updateDataUsageAndAssert(dataIds[1], 20);
     84         updateDataUsageAndAssert(dataIds[1], 20);
     85         updateDataUsageAndAssert(dataIds[1], 20);
     86 
     87         deleteDataUsage();
     88         RawContactUtil.delete(mResolver, ids.mRawContactId, true);
     89     }
     90 
     91     public void testMultiIdDataUsageFeedback_incrementsCorrectDataItems() {
     92         DatabaseAsserts.ContactIdPair ids = DatabaseAsserts.assertAndCreateContact(mResolver);
     93 
     94         long[] dataIds = setupRawContactDataItems(ids.mRawContactId);
     95 
     96         assertDataUsageEquals(dataIds, 0, 0, 0, 0);
     97 
     98         updateMultipleAndAssertUpdateSuccess(new long[] {dataIds[1], dataIds[2]});
     99         assertDataUsageEquals(dataIds, 0, 1, 1, 0);
    100 
    101         updateMultipleAndAssertUpdateSuccess(new long[]{dataIds[1], dataIds[2]});
    102         assertDataUsageEquals(dataIds, 0, 2, 2, 0);
    103 
    104         for (int i = 3; i <= 10; i++) {
    105             updateMultipleAndAssertUpdateSuccess(new long[]{dataIds[1]});
    106         }
    107         assertDataUsageEquals(dataIds, 0, 10, 2, 0);
    108 
    109         updateMultipleAndAssertUpdateSuccess(new long[]{dataIds[0], dataIds[1]});
    110         assertDataUsageEquals(dataIds, 1, 10, 2, 0);
    111 
    112         for (int i = 12; i <= 19; i++) {
    113             updateMultipleAndAssertUpdateSuccess(new long[]{dataIds[1]});
    114             assertDataUsageEquals(dataIds, 1, 10, 2, 0);
    115         }
    116         updateMultipleAndAssertUpdateSuccess(new long[]{dataIds[1]});
    117         assertDataUsageEquals(dataIds, 1, 20, 2, 0);
    118 
    119         deleteDataUsage();
    120         RawContactUtil.delete(mResolver, ids.mRawContactId, true);
    121     }
    122 
    123     private long[] setupRawContactDataItems(long rawContactId) {
    124         // Create 4 data items.
    125         long[] dataIds = new long[4];
    126         dataIds[0] = DataUtil.insertPhoneNumber(mResolver, rawContactId, "555-5555");
    127         dataIds[1] = DataUtil.insertPhoneNumber(mResolver, rawContactId, "555-5554");
    128         dataIds[2] = DataUtil.insertEmail(mResolver, rawContactId, "test (at) thisisfake.com");
    129         dataIds[3] = DataUtil.insertPhoneNumber(mResolver, rawContactId, "555-5556");
    130         return dataIds;
    131     }
    132 
    133     /**
    134      * Updates multiple data ids at once.  And asserts the update returned success.
    135      */
    136     private void updateMultipleAndAssertUpdateSuccess(long[] dataIds) {
    137         String[] ids = new String[dataIds.length];
    138         for (int i = 0; i < dataIds.length; i++) {
    139             ids[i] = String.valueOf(dataIds[i]);
    140         }
    141         Uri uri = DataUsageFeedback.FEEDBACK_URI.buildUpon().appendPath(TextUtils.join(",", ids))
    142                 .appendQueryParameter(DataUsageFeedback.USAGE_TYPE,
    143                         DataUsageFeedback.USAGE_TYPE_CALL).build();
    144         int result = mResolver.update(uri, new ContentValues(), null, null);
    145         assertTrue(result > 0);
    146     }
    147 
    148     /**
    149      * Updates a single data item usage.  Asserts the update was successful.  Asserts the usage
    150      * number is equal to expected value.
    151      */
    152     private void updateDataUsageAndAssert(long dataId, int assertValue) {
    153         Uri uri = DataUsageFeedback.FEEDBACK_URI.buildUpon().appendPath(String.valueOf(dataId))
    154                 .appendQueryParameter(DataUsageFeedback.USAGE_TYPE,
    155                         DataUsageFeedback.USAGE_TYPE_CALL).build();
    156         int result = mResolver.update(uri, new ContentValues(), null, null);
    157         assertTrue(result > 0);
    158 
    159         assertDataUsageEquals(dataId, assertValue);
    160     }
    161 
    162     /**
    163      * Assert that the given data ids have usage values in the respective order.
    164      */
    165     private void assertDataUsageEquals(long[] dataIds, int... expectedValues) {
    166         if (dataIds.length != expectedValues.length) {
    167             throw new IllegalArgumentException("dataIds and expectedValues must be the same size");
    168         }
    169 
    170         for (int i = 0; i < dataIds.length; i++) {
    171             assertDataUsageEquals(dataIds[i], expectedValues[i]);
    172         }
    173     }
    174 
    175     /**
    176      * Assert a single data item has a specific usage value.
    177      */
    178     private void assertDataUsageEquals(long dataId, int expectedValue) {
    179         // Query and assert value is expected.
    180         String[] projection = new String[]{ContactsContract.Data.TIMES_USED};
    181         String[] record = DataUtil.queryById(mResolver, dataId, projection);
    182         assertNotNull(record);
    183         long actual = 0;
    184         // Tread null as 0
    185         if (record[0] != null) {
    186             actual = Long.parseLong(record[0]);
    187         }
    188         assertEquals(expectedValue, actual);
    189 
    190         // Also make sure the rounded value is used in 'where' too.
    191         assertEquals("Query should match", 1, DataUtil.queryById(mResolver, dataId, projection,
    192                 "ifnull(" + Data.TIMES_USED + ",0)=" + expectedValue, null).length);
    193     }
    194 
    195     private void deleteDataUsage() {
    196         mResolver.delete(DataUsageFeedback.DELETE_USAGE_URI, null, null);
    197     }
    198 }
    199