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