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.search2; 18 19 import android.content.ContentValues; 20 import android.content.Context; 21 import android.database.sqlite.SQLiteDatabase; 22 import android.os.Bundle; 23 24 import com.android.settings.SettingsActivity; 25 import com.android.settings.SettingsRobolectricTestRunner; 26 import com.android.settings.TestConfig; 27 import com.android.settings.dashboard.SiteMapManager; 28 import com.android.settings.search.IndexDatabaseHelper; 29 import com.android.settings.search.IndexDatabaseHelper.SiteMapColumns; 30 import com.android.settings.system.SystemDashboardFragment; 31 import com.android.settings.testutils.DatabaseTestUtils; 32 import com.android.settings.testutils.FakeFeatureFactory; 33 import com.android.settingslib.drawer.CategoryKey; 34 import com.android.settingslib.drawer.DashboardCategory; 35 import com.android.settingslib.drawer.Tile; 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.mockito.Answers; 42 import org.mockito.Mock; 43 import org.mockito.MockitoAnnotations; 44 import org.robolectric.RuntimeEnvironment; 45 import org.robolectric.annotation.Config; 46 47 import java.util.Arrays; 48 import java.util.List; 49 50 import static com.google.common.truth.Truth.assertThat; 51 import static org.mockito.Mockito.when; 52 53 @RunWith(SettingsRobolectricTestRunner.class) 54 @Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION) 55 public class SiteMapManagerTest { 56 57 private static final int STATIC_DB_DEPTH = 4; 58 private static final String CLASS_PREFIX = "class_"; 59 private static final String TITLE_PREFIX = "title_"; 60 61 @Mock(answer = Answers.RETURNS_DEEP_STUBS) 62 private Context mMockContext; 63 private Context mContext; 64 private SQLiteDatabase mDb; 65 private SiteMapManager mSiteMapManager; 66 private FakeFeatureFactory mFeatureFactory; 67 68 @Before setUp()69 public void setUp() { 70 MockitoAnnotations.initMocks(this); 71 FakeFeatureFactory.setupForTest(mMockContext); 72 mFeatureFactory = (FakeFeatureFactory) FakeFeatureFactory.getFactory(mMockContext); 73 74 mContext = RuntimeEnvironment.application; 75 mDb = IndexDatabaseHelper.getInstance(mContext).getWritableDatabase(); 76 buildDb(); 77 mSiteMapManager = new SiteMapManager(); 78 } 79 80 @After cleanUp()81 public void cleanUp() { 82 DatabaseTestUtils.clearDb(); 83 } 84 85 @Test buildBreadCrumb_onlyFromSiteMapDb_breadcrumbShouldLinkUp()86 public void buildBreadCrumb_onlyFromSiteMapDb_breadcrumbShouldLinkUp() { 87 List<String> breadcrumb = mSiteMapManager.buildBreadCrumb(mContext, 88 CLASS_PREFIX + 0, TITLE_PREFIX + 0); 89 assertThat(breadcrumb.size()).isEqualTo(STATIC_DB_DEPTH + 1); 90 for (int i = 0; i < STATIC_DB_DEPTH; i++) { 91 assertThat(breadcrumb.get(i)).isEqualTo(TITLE_PREFIX + (STATIC_DB_DEPTH - i)); 92 } 93 } 94 95 @Test buildBreadCrumb_fromSiteMapDbAndDashboardProvider_breadcrumbShouldLinkUp()96 public void buildBreadCrumb_fromSiteMapDbAndDashboardProvider_breadcrumbShouldLinkUp() { 97 final String iaClass = SystemDashboardFragment.class.getName(); 98 final String iaTitle = "ia_title"; 99 100 ContentValues index = new ContentValues(); 101 index.put(IndexDatabaseHelper.IndexColumns.CLASS_NAME, iaClass); 102 index.put(IndexDatabaseHelper.IndexColumns.SCREEN_TITLE, iaTitle); 103 mDb.replaceOrThrow(IndexDatabaseHelper.Tables.TABLE_PREFS_INDEX, null, index); 104 105 final DashboardCategory category = new DashboardCategory(); 106 category.key = CategoryKey.CATEGORY_SYSTEM; 107 category.tiles.add(new Tile()); 108 category.tiles.get(0).title = TITLE_PREFIX + STATIC_DB_DEPTH; 109 category.tiles.get(0).metaData = new Bundle(); 110 category.tiles.get(0).metaData.putString(SettingsActivity.META_DATA_KEY_FRAGMENT_CLASS, 111 CLASS_PREFIX + STATIC_DB_DEPTH); 112 when(mFeatureFactory.dashboardFeatureProvider.getAllCategories()) 113 .thenReturn(Arrays.asList(category)); 114 115 final List<String> breadcrumb = mSiteMapManager.buildBreadCrumb(mContext, 116 CLASS_PREFIX + 0, TITLE_PREFIX + 0); 117 118 assertThat(breadcrumb.size()).isEqualTo(STATIC_DB_DEPTH + 2); 119 assertThat(breadcrumb.get(0)) 120 .isEqualTo(iaTitle); 121 } 122 123 @Test buildBreadCrumb_classNotIndexed_shouldNotHaveBreadCrumb()124 public void buildBreadCrumb_classNotIndexed_shouldNotHaveBreadCrumb() { 125 final String title = "wrong_title"; 126 127 final List<String> breadcrumb = mSiteMapManager.buildBreadCrumb(mContext, 128 "wrong_class", title); 129 130 assertThat(breadcrumb.size()).isEqualTo(1); 131 assertThat(breadcrumb.get(0)).isEqualTo(title); 132 } 133 buildDb()134 private void buildDb() { 135 for (int i = 0; i < STATIC_DB_DEPTH; i++) { 136 final ContentValues siteMapPair = new ContentValues(); 137 siteMapPair.put(SiteMapColumns.DOCID, i); 138 siteMapPair.put(SiteMapColumns.PARENT_CLASS, CLASS_PREFIX + (i + 1)); 139 siteMapPair.put(SiteMapColumns.PARENT_TITLE, TITLE_PREFIX + (i + 1)); 140 siteMapPair.put(SiteMapColumns.CHILD_CLASS, CLASS_PREFIX + i); 141 siteMapPair.put(SiteMapColumns.CHILD_TITLE, TITLE_PREFIX + i); 142 mDb.replaceOrThrow(IndexDatabaseHelper.Tables.TABLE_SITE_MAP, null, siteMapPair); 143 } 144 } 145 } 146