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 import com.android.settings.testutils.SettingsRobolectricTestRunner; 33 34 import org.junit.After; 35 import org.junit.Before; 36 import org.junit.Test; 37 import org.junit.runner.RunWith; 38 import org.robolectric.RuntimeEnvironment; 39 40 import java.util.ArrayList; 41 import java.util.List; 42 43 @RunWith(SettingsRobolectricTestRunner.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 58 private Context mContext; 59 60 private SlicesIndexer mManager; 61 62 private SQLiteDatabase mDb; 63 64 @Before setUp()65 public void setUp() { 66 mContext = RuntimeEnvironment.application; 67 mManager = spy(new SlicesIndexer(mContext)); 68 mDb = SlicesDatabaseHelper.getInstance(mContext).getWritableDatabase(); 69 } 70 71 @After cleanUp()72 public void cleanUp() { 73 DatabaseTestUtils.clearDb(mContext); 74 } 75 76 @Test testAlreadyIndexed_doesNotIndexAgain()77 public void testAlreadyIndexed_doesNotIndexAgain() { 78 String newKey = "newKey"; 79 String newTitle = "newTitle"; 80 SlicesDatabaseHelper.getInstance(mContext).setIndexedState(); 81 insertSpecialCase(newKey, newTitle); 82 83 // Attempt indexing - should not do anything. 84 mManager.run(); 85 86 Cursor cursor = mDb.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))).isEqualTo(newTitle); 91 } 92 93 @Test testInsertSliceData_indexedStateSet()94 public void testInsertSliceData_indexedStateSet() { 95 final SlicesDatabaseHelper helper = SlicesDatabaseHelper.getInstance(mContext); 96 helper.setIndexedState(); 97 doReturn(new ArrayList<SliceData>()).when(mManager).getSliceData(); 98 99 mManager.run(); 100 101 assertThat(helper.isSliceDataIndexed()).isTrue(); 102 } 103 104 @Test testInsertSliceData_mockDataInserted()105 public void testInsertSliceData_mockDataInserted() { 106 final List<SliceData> sliceData = getDummyIndexableData(); 107 doReturn(sliceData).when(mManager).getSliceData(); 108 109 mManager.run(); 110 111 final Cursor cursor = mDb.rawQuery("SELECT * FROM slices_index", null); 112 assertThat(cursor.getCount()).isEqualTo(sliceData.size()); 113 114 cursor.moveToFirst(); 115 for (int i = 0; i < sliceData.size(); i++) { 116 assertThat(cursor.getString(cursor.getColumnIndex(IndexColumns.KEY))).isEqualTo( 117 KEYS[i]); 118 assertThat(cursor.getString(cursor.getColumnIndex(IndexColumns.TITLE))).isEqualTo( 119 TITLES[i]); 120 assertThat(cursor.getString(cursor.getColumnIndex(IndexColumns.FRAGMENT))).isEqualTo( 121 FRAGMENT_NAME); 122 assertThat(cursor.getString(cursor.getColumnIndex(IndexColumns.SCREENTITLE))).isEqualTo( 123 SCREEN_TITLE); 124 assertThat(cursor.getString(cursor.getColumnIndex(IndexColumns.KEYWORDS))).isEqualTo( 125 KEYWORDS); 126 assertThat(cursor.getInt(cursor.getColumnIndex(IndexColumns.ICON_RESOURCE))).isEqualTo( 127 ICON); 128 assertThat(cursor.getString(cursor.getColumnIndex(IndexColumns.CONTROLLER))).isEqualTo( 129 PREF_CONTROLLER); 130 assertThat(cursor.getInt(cursor.getColumnIndex(IndexColumns.PLATFORM_SLICE))).isEqualTo( 131 1 /* true */); 132 assertThat(cursor.getInt(cursor.getColumnIndex(IndexColumns.SLICE_TYPE))).isEqualTo( 133 SLICE_TYPE); 134 cursor.moveToNext(); 135 } 136 } 137 insertSpecialCase(String key, String title)138 private void insertSpecialCase(String key, String title) { 139 final ContentValues values = new ContentValues(); 140 values.put(IndexColumns.KEY, key); 141 values.put(IndexColumns.TITLE, title); 142 143 mDb.replaceOrThrow(SlicesDatabaseHelper.Tables.TABLE_SLICES_INDEX, null, values); 144 } 145 getDummyIndexableData()146 private List<SliceData> getDummyIndexableData() { 147 final List<SliceData> sliceData = new ArrayList<>(); 148 final SliceData.Builder builder = new SliceData.Builder() 149 .setSummary(SUMMARY) 150 .setScreenTitle(SCREEN_TITLE) 151 .setKeywords(KEYWORDS) 152 .setFragmentName(FRAGMENT_NAME) 153 .setIcon(ICON) 154 .setUri(URI) 155 .setPreferenceControllerClassName(PREF_CONTROLLER) 156 .setPlatformDefined(PLATFORM_DEFINED) 157 .setSliceType(SLICE_TYPE); 158 159 for (int i = 0; i < KEYS.length; i++) { 160 builder.setKey(KEYS[i]).setTitle(TITLES[i]); 161 sliceData.add(builder.build()); 162 } 163 164 return sliceData; 165 } 166 }