1 /* 2 * Copyright (C) 2017 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 com.android.settings.slices; 18 19 import static com.google.common.truth.Truth.assertThat; 20 21 import static org.mockito.Mockito.doReturn; 22 import static org.mockito.Mockito.spy; 23 24 import android.content.ContentValues; 25 import android.content.Context; 26 import android.database.Cursor; 27 import android.database.sqlite.SQLiteDatabase; 28 import android.net.Uri; 29 30 import com.android.settings.slices.SlicesDatabaseHelper.IndexColumns; 31 import com.android.settings.testutils.DatabaseTestUtils; 32 33 import org.junit.After; 34 import org.junit.Before; 35 import org.junit.Test; 36 import org.junit.runner.RunWith; 37 import org.robolectric.RobolectricTestRunner; 38 import org.robolectric.RuntimeEnvironment; 39 40 import java.util.ArrayList; 41 import java.util.List; 42 43 @RunWith(RobolectricTestRunner.class) 44 public class SlicesIndexerTest { 45 46 private final String[] KEYS = new String[]{"key1", "key2", "key3"}; 47 private final String[] TITLES = new String[]{"title1", "title2", "title3"}; 48 private final String SUMMARY = "subtitle"; 49 private final String SCREEN_TITLE = "screen title"; 50 private final String KEYWORDS = "a, b, c"; 51 private final String FRAGMENT_NAME = "fragment name"; 52 private final int ICON = 1234; // I declare a thumb war 53 private final Uri URI = Uri.parse("content://com.android.settings.slices/test"); 54 private final String PREF_CONTROLLER = "com.android.settings.slices.tester"; 55 private final boolean PLATFORM_DEFINED = true; 56 private final int SLICE_TYPE = SliceData.SliceType.SLIDER; 57 private final String UNAVAILABLE_SLICE_SUBTITLE = "subtitleOfUnavailableSlice"; 58 59 private Context mContext; 60 61 private SlicesIndexer mManager; 62 63 64 @Before setUp()65 public void setUp() { 66 mContext = RuntimeEnvironment.application; 67 mManager = spy(new SlicesIndexer(mContext)); 68 } 69 70 @After cleanUp()71 public void cleanUp() { 72 DatabaseTestUtils.clearDb(mContext); 73 } 74 75 @Test testAlreadyIndexed_doesNotIndexAgain()76 public void testAlreadyIndexed_doesNotIndexAgain() { 77 String newKey = "newKey"; 78 String newTitle = "newTitle"; 79 SlicesDatabaseHelper.getInstance(mContext).setIndexedState(); 80 insertSpecialCase(newKey, newTitle); 81 82 // Attempt indexing - should not do anything. 83 mManager.run(); 84 85 final SQLiteDatabase db = SlicesDatabaseHelper.getInstance(mContext).getWritableDatabase(); 86 try (final Cursor cursor = db.rawQuery("SELECT * FROM slices_index", null)) { 87 cursor.moveToFirst(); 88 assertThat(cursor.getCount()).isEqualTo(1); 89 assertThat(cursor.getString(cursor.getColumnIndex(IndexColumns.KEY))).isEqualTo(newKey); 90 assertThat(cursor.getString(cursor.getColumnIndex(IndexColumns.TITLE))) 91 .isEqualTo(newTitle); 92 } finally { 93 db.close(); 94 } 95 } 96 97 @Test testInsertSliceData_indexedStateSet()98 public void testInsertSliceData_indexedStateSet() { 99 final SlicesDatabaseHelper helper = SlicesDatabaseHelper.getInstance(mContext); 100 helper.setIndexedState(); 101 doReturn(new ArrayList<SliceData>()).when(mManager).getSliceData(); 102 103 mManager.run(); 104 105 assertThat(helper.isSliceDataIndexed()).isTrue(); 106 } 107 108 @Test testInsertSliceData_mockDataInserted()109 public void testInsertSliceData_mockDataInserted() { 110 final List<SliceData> sliceData = getDummyIndexableData(); 111 doReturn(sliceData).when(mManager).getSliceData(); 112 113 mManager.run(); 114 115 final SQLiteDatabase db = SlicesDatabaseHelper.getInstance(mContext).getWritableDatabase(); 116 try (final Cursor cursor = db.rawQuery("SELECT * FROM slices_index", null)) { 117 assertThat(cursor.getCount()).isEqualTo(sliceData.size()); 118 119 cursor.moveToFirst(); 120 for (int i = 0; i < sliceData.size(); i++) { 121 assertThat(cursor.getString(cursor.getColumnIndex(IndexColumns.KEY))) 122 .isEqualTo(KEYS[i]); 123 assertThat(cursor.getString(cursor.getColumnIndex(IndexColumns.TITLE))) 124 .isEqualTo(TITLES[i]); 125 assertThat( 126 cursor.getString(cursor.getColumnIndex(IndexColumns.FRAGMENT))) 127 .isEqualTo(FRAGMENT_NAME); 128 assertThat(cursor.getString( 129 cursor.getColumnIndex(IndexColumns.SCREENTITLE))).isEqualTo(SCREEN_TITLE); 130 assertThat( 131 cursor.getString(cursor.getColumnIndex(IndexColumns.KEYWORDS))) 132 .isEqualTo(KEYWORDS); 133 assertThat( 134 cursor.getInt(cursor.getColumnIndex(IndexColumns.ICON_RESOURCE))) 135 .isEqualTo(ICON); 136 assertThat( 137 cursor.getString(cursor.getColumnIndex(IndexColumns.CONTROLLER))) 138 .isEqualTo(PREF_CONTROLLER); 139 assertThat(cursor.getInt( 140 cursor.getColumnIndex(IndexColumns.PLATFORM_SLICE))) 141 .isEqualTo(1 /* true */); 142 assertThat(cursor.getInt(cursor.getColumnIndex(IndexColumns.SLICE_TYPE))) 143 .isEqualTo(SLICE_TYPE); 144 assertThat(cursor.getString( 145 cursor.getColumnIndex(IndexColumns.UNAVAILABLE_SLICE_SUBTITLE))) 146 .isEqualTo(UNAVAILABLE_SLICE_SUBTITLE); 147 cursor.moveToNext(); 148 } 149 } finally { 150 db.close(); 151 } 152 } 153 insertSpecialCase(String key, String title)154 private void insertSpecialCase(String key, String title) { 155 final ContentValues values = new ContentValues(); 156 values.put(IndexColumns.KEY, key); 157 values.put(IndexColumns.TITLE, title); 158 final SQLiteDatabase db = SlicesDatabaseHelper.getInstance(mContext).getWritableDatabase(); 159 db.beginTransaction(); 160 try { 161 db.replaceOrThrow(SlicesDatabaseHelper.Tables.TABLE_SLICES_INDEX, null, values); 162 db.setTransactionSuccessful(); 163 } finally { 164 db.endTransaction(); 165 } 166 db.close(); 167 } 168 getDummyIndexableData()169 private List<SliceData> getDummyIndexableData() { 170 final List<SliceData> sliceData = new ArrayList<>(); 171 final SliceData.Builder builder = new SliceData.Builder() 172 .setSummary(SUMMARY) 173 .setScreenTitle(SCREEN_TITLE) 174 .setKeywords(KEYWORDS) 175 .setFragmentName(FRAGMENT_NAME) 176 .setIcon(ICON) 177 .setUri(URI) 178 .setPreferenceControllerClassName(PREF_CONTROLLER) 179 .setPlatformDefined(PLATFORM_DEFINED) 180 .setSliceType(SLICE_TYPE) 181 .setUnavailableSliceSubtitle(UNAVAILABLE_SLICE_SUBTITLE); 182 183 for (int i = 0; i < KEYS.length; i++) { 184 builder.setKey(KEYS[i]).setTitle(TITLES[i]); 185 sliceData.add(builder.build()); 186 } 187 188 return sliceData; 189 } 190 }