/* * Copyright (C) 2012 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.net.Uri; import android.os.Bundle; import android.provider.ContactsContract.ContactCounts; import android.provider.ContactsContract.Contacts; import android.provider.ContactsContract.RawContacts; import android.test.AndroidTestCase; import android.test.MoreAsserts; import android.test.suitebuilder.annotation.SmallTest; import com.android.providers.contacts.util.MockSharedPreferences; @SmallTest public class FastScrollingIndexCacheTest extends AndroidTestCase { private MockSharedPreferences mPrefs; private FastScrollingIndexCache mCache; private static final String[] TITLES_0 = new String[] {}; private static final String[] TITLES_1 = new String[] {"a"}; private static final String[] TITLES_2 = new String[] {"", "b"}; private static final String[] TITLES_3 = new String[] {"", "b", "aaa"}; private static final int[] COUNTS_0 = new int[] {}; private static final int[] COUNTS_1 = new int[] {1}; private static final int[] COUNTS_2 = new int[] {2, 3}; private static final int[] COUNTS_3 = new int[] {0, -1, 2}; private static final String[] PROJECTION_0 = new String[] {}; private static final String[] PROJECTION_1 = new String[] {"c1"}; private static final String[] PROJECTION_2 = new String[] {"c3", "c4"}; private static final Uri URI_A = Contacts.CONTENT_URI; private static final Uri URI_B = RawContacts.CONTENT_URI; @Override protected void setUp() throws Exception { super.setUp(); mPrefs = new MockSharedPreferences(); mCache = new FastScrollingIndexCache(mPrefs); } private void assertBundle(String[] expectedTitles, int[] expectedCounts, Bundle actual) { assertNotNull(actual); MoreAsserts.assertEquals(expectedTitles, actual.getStringArray(ContactCounts.EXTRA_ADDRESS_BOOK_INDEX_TITLES)); MoreAsserts.assertEquals(expectedCounts, actual.getIntArray(ContactCounts.EXTRA_ADDRESS_BOOK_INDEX_COUNTS)); } /** * Test for {@link FastScrollingIndexCache#buildExtraBundleFromValue} and * {@link FastScrollingIndexCache#buildCacheValue}. */ public void testBuildCacheValue() { assertBundle(TITLES_0, COUNTS_0, FastScrollingIndexCache.buildExtraBundleFromValue( FastScrollingIndexCache.buildCacheValue(TITLES_0, COUNTS_0))); assertBundle(TITLES_1, COUNTS_1, FastScrollingIndexCache.buildExtraBundleFromValue( FastScrollingIndexCache.buildCacheValue(TITLES_1, COUNTS_1))); assertBundle(TITLES_2, COUNTS_2, FastScrollingIndexCache.buildExtraBundleFromValue( FastScrollingIndexCache.buildCacheValue(TITLES_2, COUNTS_2))); } private static final Bundle putAndGetBundle(FastScrollingIndexCache cache, Uri queryUri, String selection, String[] selectionArgs, String sortOrder, String countExpression, String[] titles, int[] counts) { Bundle bundle = FastScrollingIndexCache.buildExtraBundle(titles, counts); cache.put(queryUri, selection, selectionArgs, sortOrder, countExpression, bundle); return bundle; } public void testPutAndGet() { // Initially the cache is empty assertNull(mCache.get(null, null, null, null, null)); assertNull(mCache.get(URI_A, "*s*", PROJECTION_0, "*so*", "*ce*")); assertNull(mCache.get(URI_A, "*s*", PROJECTION_1, "*so*", "*ce*")); assertNull(mCache.get(URI_B, "s", PROJECTION_2, "so", "ce")); // Put... Bundle b; b = putAndGetBundle(mCache, null, null, null, null, null, TITLES_0, COUNTS_0); assertBundle(TITLES_0, COUNTS_0, b); b = putAndGetBundle(mCache, URI_A, "*s*", PROJECTION_0, "*so*", "*ce*", TITLES_1, COUNTS_1); assertBundle(TITLES_1, COUNTS_1, b); b = putAndGetBundle(mCache, URI_A, "*s*", PROJECTION_1, "*so*", "*ce*", TITLES_2, COUNTS_2); assertBundle(TITLES_2, COUNTS_2, b); b = putAndGetBundle(mCache, URI_B, "s", PROJECTION_2, "so", "ce", TITLES_3, COUNTS_3); assertBundle(TITLES_3, COUNTS_3, b); // Get... assertBundle(TITLES_0, COUNTS_0, mCache.get(null, null, null, null, null)); assertBundle(TITLES_1, COUNTS_1, mCache.get(URI_A, "*s*", PROJECTION_0, "*so*", "*ce*")); assertBundle(TITLES_2, COUNTS_2, mCache.get(URI_A, "*s*", PROJECTION_1, "*so*", "*ce*")); assertBundle(TITLES_3, COUNTS_3, mCache.get(URI_B, "s", PROJECTION_2, "so", "ce")); // Invalidate... mCache.invalidate(); // Get again... Nothing shoul be cached... assertNull(mCache.get(null, null, null, null, null)); assertNull(mCache.get(URI_A, "*s*", PROJECTION_0, "*so*", "*ce*")); assertNull(mCache.get(URI_A, "*s*", PROJECTION_1, "*so*", "*ce*")); assertNull(mCache.get(URI_B, "s", PROJECTION_2, "so", "ce")); // Put again... b = putAndGetBundle(mCache, null, null, null, null, null, TITLES_0, COUNTS_0); assertBundle(TITLES_0, COUNTS_0, b); b = putAndGetBundle(mCache, URI_A, "*s*", PROJECTION_0, "*so*", "*ce*", TITLES_1, COUNTS_1); assertBundle(TITLES_1, COUNTS_1, b); b = putAndGetBundle(mCache, URI_A, "*s*", PROJECTION_1, "*so*", "*ce*", TITLES_2, COUNTS_2); assertBundle(TITLES_2, COUNTS_2, b); b = putAndGetBundle(mCache, URI_B, "s", PROJECTION_2, "so", "ce", TITLES_2, COUNTS_2); assertBundle(TITLES_2, COUNTS_2, b); // Now, create a new cache instance (with the same shared preferences) // It should restore the cache content from the preferences... FastScrollingIndexCache cache2 = new FastScrollingIndexCache(mPrefs); assertBundle(TITLES_0, COUNTS_0, cache2.get(null, null, null, null, null)); assertBundle(TITLES_1, COUNTS_1, cache2.get(URI_A, "*s*", PROJECTION_0, "*so*", "*ce*")); assertBundle(TITLES_2, COUNTS_2, cache2.get(URI_A, "*s*", PROJECTION_1, "*so*", "*ce*")); assertBundle(TITLES_2, COUNTS_2, cache2.get(URI_B, "s", PROJECTION_2, "so", "ce")); } public void testMalformedPreferences() { mPrefs.edit().putString(FastScrollingIndexCache.PREFERENCE_KEY, "123"); // get() shouldn't crash assertNull(mCache.get(null, null, null, null, null)); } }