1 /* 2 * Copyright (C) 2018 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 18 package com.android.settings.slices; 19 20 import static com.google.common.truth.Truth.assertThat; 21 22 import static org.mockito.Mockito.spy; 23 24 import android.content.ContentValues; 25 import android.content.Context; 26 import android.database.sqlite.SQLiteDatabase; 27 import android.net.Uri; 28 import android.view.accessibility.AccessibilityManager; 29 30 import com.android.settings.testutils.FakeIndexProvider; 31 import com.android.settings.search.SearchFeatureProvider; 32 import com.android.settings.search.SearchFeatureProviderImpl; 33 import com.android.settings.testutils.DatabaseTestUtils; 34 import com.android.settings.testutils.FakeFeatureFactory; 35 import com.android.settings.testutils.SettingsRobolectricTestRunner; 36 37 import org.junit.After; 38 import org.junit.Before; 39 import org.junit.Test; 40 import org.junit.runner.RunWith; 41 import org.robolectric.RuntimeEnvironment; 42 import org.robolectric.annotation.Config; 43 import org.robolectric.shadows.ShadowAccessibilityManager; 44 45 import java.util.ArrayList; 46 import java.util.List; 47 import java.util.Locale; 48 49 import org.robolectric.shadow.api.Shadow; 50 51 52 @RunWith(SettingsRobolectricTestRunner.class) 53 public class SlicesDatabaseAccessorTest { 54 55 private final String FAKE_TITLE = "title"; 56 private final String FAKE_SUMMARY = "summary"; 57 private final String FAKE_SCREEN_TITLE = "screen_title"; 58 private final String FAKE_KEYWORDS = "a, b, c"; 59 private final int FAKE_ICON = 1234; 60 private final String FAKE_FRAGMENT_NAME = FakeIndexProvider.class.getName(); 61 private final String FAKE_CONTROLLER_NAME = FakePreferenceController.class.getName(); 62 63 private Context mContext; 64 private SQLiteDatabase mDb; 65 private SlicesDatabaseAccessor mAccessor; 66 67 @Before 68 public void setUp() { 69 mContext = RuntimeEnvironment.application; 70 mAccessor = spy(new SlicesDatabaseAccessor(mContext)); 71 mDb = SlicesDatabaseHelper.getInstance(mContext).getWritableDatabase(); 72 SlicesDatabaseHelper.getInstance(mContext).setIndexedState(); 73 74 // Register the fake a11y Service 75 ShadowAccessibilityManager shadowAccessibilityManager = Shadow.extract( 76 RuntimeEnvironment.application.getSystemService(AccessibilityManager.class)); 77 shadowAccessibilityManager.setInstalledAccessibilityServiceList(new ArrayList<>()); 78 } 79 80 @After 81 public void cleanUp() { 82 DatabaseTestUtils.clearDb(mContext); 83 } 84 85 @Test 86 public void testGetSliceDataFromKey_validKey_validSliceReturned() { 87 String key = "key"; 88 insertSpecialCase(key); 89 90 SliceData data = mAccessor.getSliceDataFromKey(key); 91 92 assertThat(data.getKey()).isEqualTo(key); 93 assertThat(data.getTitle()).isEqualTo(FAKE_TITLE); 94 assertThat(data.getSummary()).isEqualTo(FAKE_SUMMARY); 95 assertThat(data.getScreenTitle()).isEqualTo(FAKE_SCREEN_TITLE); 96 assertThat(data.getKeywords()).isEqualTo(FAKE_KEYWORDS); 97 assertThat(data.getIconResource()).isEqualTo(FAKE_ICON); 98 assertThat(data.getFragmentClassName()).isEqualTo(FAKE_FRAGMENT_NAME); 99 assertThat(data.getUri()).isNull(); 100 assertThat(data.getPreferenceController()).isEqualTo(FAKE_CONTROLLER_NAME); 101 } 102 103 @Test(expected = IllegalStateException.class) 104 public void testGetSliceDataFromKey_invalidKey_errorThrown() { 105 String key = "key"; 106 107 mAccessor.getSliceDataFromKey(key); 108 } 109 110 @Test 111 public void testGetSliceFromUri_validUri_validSliceReturned() { 112 String key = "key"; 113 String path = "intent/" + key; 114 insertSpecialCase(key); 115 Uri uri = SliceBuilderUtils.getUri(path, false); 116 117 SliceData data = mAccessor.getSliceDataFromUri(uri); 118 119 assertThat(data.getKey()).isEqualTo(key); 120 assertThat(data.getTitle()).isEqualTo(FAKE_TITLE); 121 assertThat(data.getSummary()).isEqualTo(FAKE_SUMMARY); 122 assertThat(data.getScreenTitle()).isEqualTo(FAKE_SCREEN_TITLE); 123 assertThat(data.getKeywords()).isEqualTo(FAKE_KEYWORDS); 124 assertThat(data.getIconResource()).isEqualTo(FAKE_ICON); 125 assertThat(data.getFragmentClassName()).isEqualTo(FAKE_FRAGMENT_NAME); 126 assertThat(data.getUri()).isEqualTo(uri); 127 assertThat(data.getPreferenceController()).isEqualTo(FAKE_CONTROLLER_NAME); 128 } 129 130 @Test(expected = IllegalStateException.class) 131 public void testGetSliceFromUri_invalidUri_errorThrown() { 132 Uri uri = SliceBuilderUtils.getUri("intent/durr", false); 133 mAccessor.getSliceDataFromUri(uri); 134 } 135 136 @Test 137 public void getDescendantUris_platformSlice_doesNotReturnOEMSlice() { 138 final String key = "oem_key"; 139 final boolean isPlatformSlice = false; 140 insertSpecialCase(key, isPlatformSlice); 141 final List<String> keys = mAccessor.getSliceKeys(!isPlatformSlice); 142 143 assertThat(keys).isEmpty(); 144 } 145 146 @Test 147 public void getDescendantUris_oemSlice_doesNotReturnPlatformSlice() { 148 final String key = "platform_key"; 149 final boolean isPlatformSlice = true; 150 insertSpecialCase(key, isPlatformSlice); 151 final List<String> keys = mAccessor.getSliceKeys(!isPlatformSlice); 152 153 assertThat(keys).isEmpty(); 154 } 155 156 @Test 157 public void getDescendantUris_oemSlice_returnsOEMUriDescendant() { 158 final String key = "oem_key"; 159 final boolean isPlatformSlice = false; 160 insertSpecialCase(key, isPlatformSlice); 161 final List<String> keys = mAccessor.getSliceKeys(isPlatformSlice); 162 163 assertThat(keys).containsExactly(key); 164 } 165 166 @Test 167 public void getDescendantUris_platformSlice_returnsPlatformUriDescendant() { 168 final String key = "platform_key"; 169 final boolean isPlatformSlice = true; 170 insertSpecialCase(key, isPlatformSlice); 171 final List<String> keys = mAccessor.getSliceKeys(isPlatformSlice); 172 173 assertThat(keys).containsExactly(key); 174 } 175 176 @Test 177 @Config(qualifiers = "mcc999") 178 public void getSliceKeys_indexesDatabase() { 179 // Force new indexing 180 Locale.setDefault(new Locale("ca")); 181 final SearchFeatureProvider provider = new SearchFeatureProviderImpl(); 182 final SlicesFeatureProvider sliceProvider = spy(new SlicesFeatureProviderImpl()); 183 final FakeFeatureFactory factory = FakeFeatureFactory.setupForTest(); 184 factory.searchFeatureProvider = provider; 185 factory.slicesFeatureProvider = sliceProvider; 186 // Fake the indexable list. 187 provider.getSearchIndexableResources().getProviderValues().clear(); 188 provider.getSearchIndexableResources().getProviderValues().add( 189 FakeIndexProvider.class); 190 191 final SlicesDatabaseAccessor accessor = new SlicesDatabaseAccessor(mContext); 192 final List<String> keys = accessor.getSliceKeys(true); 193 194 assertThat(keys).isNotEmpty(); 195 } 196 197 private void insertSpecialCase(String key) { 198 insertSpecialCase(key, true); 199 } 200 201 private void insertSpecialCase(String key, boolean isPlatformSlice) { 202 ContentValues values = new ContentValues(); 203 values.put(SlicesDatabaseHelper.IndexColumns.KEY, key); 204 values.put(SlicesDatabaseHelper.IndexColumns.TITLE, FAKE_TITLE); 205 values.put(SlicesDatabaseHelper.IndexColumns.SUMMARY, FAKE_SUMMARY); 206 values.put(SlicesDatabaseHelper.IndexColumns.SCREENTITLE, FAKE_SCREEN_TITLE); 207 values.put(SlicesDatabaseHelper.IndexColumns.KEYWORDS, FAKE_KEYWORDS); 208 values.put(SlicesDatabaseHelper.IndexColumns.ICON_RESOURCE, FAKE_ICON); 209 values.put(SlicesDatabaseHelper.IndexColumns.FRAGMENT, FAKE_FRAGMENT_NAME); 210 values.put(SlicesDatabaseHelper.IndexColumns.CONTROLLER, FAKE_CONTROLLER_NAME); 211 values.put(SlicesDatabaseHelper.IndexColumns.PLATFORM_SLICE, isPlatformSlice); 212 values.put(SlicesDatabaseHelper.IndexColumns.SLICE_TYPE, SliceData.SliceType.INTENT); 213 214 mDb.replaceOrThrow(SlicesDatabaseHelper.Tables.TABLE_SLICES_INDEX, null, values); 215 } 216 } 217