Build a sitemap manager to keep track of breadcrumbs
- Have a new db to track parent-child page relation at index time. - Make a registry class to track (in IA) which page host what type of sub pages. - Make a manager class that queries the db as well as IA to compute breadcrumbs Fix: 32936784 Test: RunSettingsRoboTest Change-Id: I5f1583fae772c3d477d2ad186e111b79cc3e41aa
This commit is contained in:
@@ -25,6 +25,7 @@ import android.provider.SearchIndexableResource;
|
||||
import com.android.settings.R;
|
||||
import com.android.settings.SettingsRobolectricTestRunner;
|
||||
import com.android.settings.TestConfig;
|
||||
import com.android.settings.search.IndexDatabaseHelper.SiteMapColumns;
|
||||
import com.android.settings.search2.DatabaseIndexingManager;
|
||||
import com.android.settings.testutils.DatabaseTestUtils;
|
||||
|
||||
@@ -41,6 +42,7 @@ import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Locale;
|
||||
|
||||
import static com.android.settings.dashboard.SiteMapManager.SITE_MAP_COLUMNS;
|
||||
import static com.google.common.truth.Truth.assertThat;
|
||||
import static org.mockito.Mockito.spy;
|
||||
|
||||
@@ -57,7 +59,7 @@ public class DatabaseIndexingManagerTest {
|
||||
private final String updatedSummaryOn = "summary-on";
|
||||
private final String normalizedSummaryOn = "summaryon";
|
||||
private final String summaryOff = "summary\u2011off";
|
||||
private final String updatedSummaryOff ="summary-off";
|
||||
private final String updatedSummaryOff = "summary-off";
|
||||
private final String normalizedSummaryOff = "summaryoff";
|
||||
private final String entries = "entries";
|
||||
private final String keywords = "keywords, keywordss, keywordsss";
|
||||
@@ -94,7 +96,7 @@ public class DatabaseIndexingManagerTest {
|
||||
Cursor dbCursor = mDb.query("prefs_index", null, null, null, null, null, null);
|
||||
List<String> columnNames = new ArrayList<>(Arrays.asList(dbCursor.getColumnNames()));
|
||||
// Note that docid is not included.
|
||||
List<String> expColumnNames = new ArrayList<>(Arrays.asList(new String[ ]{
|
||||
List<String> expColumnNames = new ArrayList<>(Arrays.asList(new String[]{
|
||||
"locale",
|
||||
"data_rank",
|
||||
"data_title",
|
||||
@@ -263,6 +265,29 @@ public class DatabaseIndexingManagerTest {
|
||||
assertThat(cursor.getBlob(20)).isNull();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testAddResourceWithChildFragment_shouldUpdateSiteMapDb() {
|
||||
SearchIndexableResource resource = getFakeResource(R.xml.network_and_internet);
|
||||
mManager.indexOneSearchIndexableData(mDb, localeStr, resource,
|
||||
new HashMap<>());
|
||||
Cursor query = mDb.query(IndexDatabaseHelper.Tables.TABLE_SITE_MAP, SITE_MAP_COLUMNS,
|
||||
null, null, null, null, null);
|
||||
query.moveToPosition(-1);
|
||||
int count = 0;
|
||||
while (query.moveToNext()) {
|
||||
count++;
|
||||
assertThat(query.getString(query.getColumnIndex(SiteMapColumns.PARENT_CLASS)))
|
||||
.isEqualTo(className);
|
||||
assertThat(query.getString(query.getColumnIndex(SiteMapColumns.PARENT_TITLE)))
|
||||
.isEqualTo(mContext.getString(R.string.network_dashboard_title));
|
||||
assertThat(query.getString(query.getColumnIndex(SiteMapColumns.CHILD_CLASS)))
|
||||
.isNotEmpty();
|
||||
assertThat(query.getString(query.getColumnIndex(SiteMapColumns.CHILD_TITLE)))
|
||||
.isNotEmpty();
|
||||
}
|
||||
assertThat(count).isEqualTo(5);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testAddResourceCustomSetting_RowsMatch() {
|
||||
SearchIndexableResource resource = getFakeResource(R.xml.gesture_settings);
|
||||
@@ -393,16 +418,18 @@ public class DatabaseIndexingManagerTest {
|
||||
// Normalized Title
|
||||
assertThat(cursor.getString(3)).isEqualTo("preferred install location");
|
||||
// Summary On
|
||||
assertThat(cursor.getString(4)).isEqualTo("Change the preferred installation location for new apps");
|
||||
assertThat(cursor.getString(4)).isEqualTo(
|
||||
"Change the preferred installation location for new apps");
|
||||
// Summary On Normalized
|
||||
assertThat(cursor.getString(5)).isEqualTo("change the preferred installation location for new apps");
|
||||
assertThat(cursor.getString(5)).isEqualTo(
|
||||
"change the preferred installation location for new apps");
|
||||
// Summary Off - only on for checkbox preferences
|
||||
assertThat(cursor.getString(6)).isEmpty();
|
||||
// Summary off normalized - only on for checkbox preferences
|
||||
assertThat(cursor.getString(7)).isEmpty();
|
||||
// Entries - only on for list preferences
|
||||
assertThat(cursor.getString(8)).isEqualTo("Internal device storage|Removable SD card|" +
|
||||
"Let the system decide|");
|
||||
"Let the system decide|");
|
||||
// Keywords
|
||||
assertThat(cursor.getString(9)).isEmpty();
|
||||
// Screen Title
|
||||
|
@@ -23,31 +23,51 @@ import android.database.sqlite.SQLiteDatabase;
|
||||
|
||||
import com.android.settings.SettingsRobolectricTestRunner;
|
||||
import com.android.settings.TestConfig;
|
||||
import com.android.settings.dashboard.SiteMapManager;
|
||||
import com.android.settings.search2.DatabaseIndexingUtils;
|
||||
import com.android.settings.search2.DatabaseResultLoader;
|
||||
import com.android.settings.testutils.DatabaseTestUtils;
|
||||
import com.android.settings.testutils.FakeFeatureFactory;
|
||||
|
||||
import org.junit.After;
|
||||
import org.junit.Before;
|
||||
import org.junit.Test;
|
||||
import org.junit.runner.RunWith;
|
||||
import org.mockito.Answers;
|
||||
import org.mockito.Mock;
|
||||
import org.mockito.MockitoAnnotations;
|
||||
import org.robolectric.RuntimeEnvironment;
|
||||
import org.robolectric.annotation.Config;
|
||||
|
||||
import static com.google.common.truth.Truth.assertThat;
|
||||
import static org.mockito.Matchers.anyString;
|
||||
import static org.mockito.Matchers.eq;
|
||||
import static org.mockito.Mockito.times;
|
||||
import static org.mockito.Mockito.verify;
|
||||
import static org.mockito.Mockito.when;
|
||||
|
||||
@RunWith(SettingsRobolectricTestRunner.class)
|
||||
@Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION)
|
||||
public class DatabaseResultLoaderTest {
|
||||
private Context mContext;
|
||||
|
||||
@Mock(answer = Answers.RETURNS_DEEP_STUBS)
|
||||
private Context mMockContext;
|
||||
@Mock
|
||||
private SiteMapManager mSiteMapManager;
|
||||
private Context mContext;
|
||||
private DatabaseResultLoader loader;
|
||||
|
||||
SQLiteDatabase mDb;
|
||||
|
||||
@Before
|
||||
public void setUp() {
|
||||
MockitoAnnotations.initMocks(this);
|
||||
mContext = RuntimeEnvironment.application;
|
||||
FakeFeatureFactory.setupForTest(mMockContext);
|
||||
FakeFeatureFactory factory =
|
||||
(FakeFeatureFactory) FakeFeatureFactory.getFactory(mMockContext);
|
||||
when(factory.searchFeatureProvider.getSiteMapManager())
|
||||
.thenReturn(mSiteMapManager);
|
||||
mDb = IndexDatabaseHelper.getInstance(mContext).getWritableDatabase();
|
||||
setUpDb();
|
||||
}
|
||||
@@ -61,6 +81,7 @@ public class DatabaseResultLoaderTest {
|
||||
public void testMatchTitle() {
|
||||
loader = new DatabaseResultLoader(mContext, "title");
|
||||
assertThat(loader.loadInBackground().size()).isEqualTo(3);
|
||||
verify(mSiteMapManager, times(3)).buildBreadCrumb(eq(mContext), anyString(), anyString());
|
||||
}
|
||||
|
||||
@Test
|
||||
|
@@ -19,17 +19,13 @@ package com.android.settings.search;
|
||||
|
||||
import android.app.Activity;
|
||||
import android.content.Context;
|
||||
import android.content.res.Configuration;
|
||||
import android.view.Menu;
|
||||
|
||||
import com.android.settings.SettingsRobolectricTestRunner;
|
||||
import com.android.settings.TestConfig;
|
||||
import com.android.settings.overlay.FeatureFactory;
|
||||
import com.android.settings.search2.DatabaseIndexingManager;
|
||||
import com.android.settings.dashboard.SiteMapManager;
|
||||
import com.android.settings.search2.SearchFeatureProviderImpl;
|
||||
|
||||
import com.android.settings.testutils.FakeFeatureFactory;
|
||||
import com.android.settingslib.drawer.DashboardCategory;
|
||||
import org.junit.Before;
|
||||
import org.junit.Test;
|
||||
import org.junit.runner.RunWith;
|
||||
@@ -76,6 +72,14 @@ public class SearchFeatureProviderImplTest {
|
||||
verify(menu).add(anyInt(), anyInt(), anyInt(), anyString());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void getSiteMapManager_shouldCacheInstanec() {
|
||||
final SiteMapManager manager1 = mProvider.getSiteMapManager();
|
||||
final SiteMapManager manager2 = mProvider.getSiteMapManager();
|
||||
|
||||
assertThat(manager1).isSameAs(manager2);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testUpdateIndexNewSearch_UsesDatabaseIndexingManager() {
|
||||
mProvider = spy(new SearchFeatureProviderImpl());
|
||||
|
@@ -28,12 +28,16 @@ import com.android.settings.R;
|
||||
import com.android.settings.SettingsRobolectricTestRunner;
|
||||
import com.android.settings.SubSettings;
|
||||
import com.android.settings.TestConfig;
|
||||
import com.android.settings.dashboard.SiteMapManager;
|
||||
import com.android.settings.gestures.GestureSettings;
|
||||
import com.android.settings.search2.ResultPayload.PayloadType;
|
||||
|
||||
import org.junit.Before;
|
||||
import org.junit.Test;
|
||||
import org.junit.runner.RunWith;
|
||||
import org.mockito.Answers;
|
||||
import org.mockito.Mock;
|
||||
import org.mockito.MockitoAnnotations;
|
||||
import org.robolectric.Robolectric;
|
||||
import org.robolectric.annotation.Config;
|
||||
|
||||
@@ -57,11 +61,14 @@ public class CursorToSearchResultConverterTest {
|
||||
private static final int BASE_RANK = 1;
|
||||
private static final int EXAMPLES = 3;
|
||||
|
||||
@Mock(answer = Answers.RETURNS_DEEP_STUBS)
|
||||
private SiteMapManager mSiteMapManager;
|
||||
private Drawable mDrawable;
|
||||
private CursorToSearchResultConverter mConverter;
|
||||
|
||||
@Before
|
||||
public void setUp() {
|
||||
MockitoAnnotations.initMocks(this);
|
||||
Context context = Robolectric.buildActivity(Activity.class).get();
|
||||
mDrawable = context.getDrawable(ICON);
|
||||
mConverter = new CursorToSearchResultConverter(context, QUERY);
|
||||
@@ -69,19 +76,21 @@ public class CursorToSearchResultConverterTest {
|
||||
|
||||
@Test
|
||||
public void testParseNullResults_ReturnsNull() {
|
||||
List<SearchResult> results = mConverter.convertCursor(null, BASE_RANK);
|
||||
List<SearchResult> results = mConverter.convertCursor(mSiteMapManager, null, BASE_RANK);
|
||||
assertThat(results).isNull();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testParseCursor_NotNull() {
|
||||
List<SearchResult> results = mConverter.convertCursor(getDummyCursor(), BASE_RANK);
|
||||
List<SearchResult> results = mConverter.convertCursor(
|
||||
mSiteMapManager, getDummyCursor(), BASE_RANK);
|
||||
assertThat(results).isNotNull();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testParseCursor_MatchesRank() {
|
||||
List<SearchResult> results = mConverter.convertCursor(getDummyCursor(), BASE_RANK);
|
||||
List<SearchResult> results = mConverter.convertCursor(
|
||||
mSiteMapManager, getDummyCursor(), BASE_RANK);
|
||||
for (int i = 0; i < EXAMPLES; i++) {
|
||||
assertThat(results.get(i).rank).isEqualTo(BASE_RANK);
|
||||
}
|
||||
@@ -89,7 +98,8 @@ public class CursorToSearchResultConverterTest {
|
||||
|
||||
@Test
|
||||
public void testParseCursor_MatchesTitle() {
|
||||
List<SearchResult> results = mConverter.convertCursor(getDummyCursor(), BASE_RANK);
|
||||
List<SearchResult> results = mConverter.convertCursor(
|
||||
mSiteMapManager, getDummyCursor(), BASE_RANK);
|
||||
for (int i = 0; i < EXAMPLES; i++) {
|
||||
assertThat(results.get(i).title).isEqualTo(TITLES[i]);
|
||||
}
|
||||
@@ -97,7 +107,8 @@ public class CursorToSearchResultConverterTest {
|
||||
|
||||
@Test
|
||||
public void testParseCursor_MatchesSummary() {
|
||||
List<SearchResult> results = mConverter.convertCursor(getDummyCursor(), BASE_RANK);
|
||||
List<SearchResult> results = mConverter.convertCursor(
|
||||
mSiteMapManager, getDummyCursor(), BASE_RANK);
|
||||
for (int i = 0; i < EXAMPLES; i++) {
|
||||
assertThat(results.get(i).summary).isEqualTo(SUMMARY);
|
||||
}
|
||||
@@ -105,7 +116,8 @@ public class CursorToSearchResultConverterTest {
|
||||
|
||||
@Test
|
||||
public void testParseCursor_MatchesIcon() {
|
||||
List<SearchResult> results = mConverter.convertCursor(getDummyCursor(), BASE_RANK);
|
||||
List<SearchResult> results = mConverter.convertCursor(
|
||||
mSiteMapManager, getDummyCursor(), BASE_RANK);
|
||||
for (int i = 0; i < EXAMPLES; i++) {
|
||||
Drawable resultDrawable = results.get(i).icon;
|
||||
assertThat(resultDrawable).isNotNull();
|
||||
@@ -116,7 +128,7 @@ public class CursorToSearchResultConverterTest {
|
||||
@Test
|
||||
public void testParseCursor_NoIcon() {
|
||||
List<SearchResult> results = mConverter.convertCursor(
|
||||
getDummyCursor(false /* hasIcon */), BASE_RANK);
|
||||
mSiteMapManager, getDummyCursor(false /* hasIcon */), BASE_RANK);
|
||||
for (int i = 0; i < EXAMPLES; i++) {
|
||||
Drawable resultDrawable = results.get(i).icon;
|
||||
assertThat(resultDrawable).isNull();
|
||||
@@ -125,7 +137,8 @@ public class CursorToSearchResultConverterTest {
|
||||
|
||||
@Test
|
||||
public void testParseCursor_MatchesPayloadType() {
|
||||
List<SearchResult> results = mConverter.convertCursor(getDummyCursor(), BASE_RANK);
|
||||
List<SearchResult> results = mConverter.convertCursor(
|
||||
mSiteMapManager, getDummyCursor(), BASE_RANK);
|
||||
ResultPayload payload;
|
||||
for (int i = 0; i < EXAMPLES; i++) {
|
||||
payload = results.get(i).payload;
|
||||
@@ -152,7 +165,7 @@ public class CursorToSearchResultConverterTest {
|
||||
0, // Payload Type
|
||||
null // Payload
|
||||
});
|
||||
List<SearchResult> results = mConverter.convertCursor(cursor, BASE_RANK);
|
||||
List<SearchResult> results = mConverter.convertCursor(mSiteMapManager, cursor, BASE_RANK);
|
||||
IntentPayload payload = (IntentPayload) results.get(0).payload;
|
||||
Intent intent = payload.intent;
|
||||
assertThat(intent.getComponent().getClassName()).isEqualTo(SubSettings.class.getName());
|
||||
@@ -160,7 +173,8 @@ public class CursorToSearchResultConverterTest {
|
||||
|
||||
@Test
|
||||
public void testParseCursor_MatchesIntentPayload() {
|
||||
List<SearchResult> results = mConverter.convertCursor(getDummyCursor(), BASE_RANK);
|
||||
List<SearchResult> results = mConverter.convertCursor(
|
||||
mSiteMapManager, getDummyCursor(), BASE_RANK);
|
||||
IntentPayload payload;
|
||||
for (int i = 0; i < EXAMPLES; i++) {
|
||||
payload = (IntentPayload) results.get(i).payload;
|
||||
@@ -187,7 +201,7 @@ public class CursorToSearchResultConverterTest {
|
||||
PayloadType.INTENT, // Payload Type
|
||||
null // Payload
|
||||
});
|
||||
List<SearchResult> results = mConverter.convertCursor(cursor, BASE_RANK);
|
||||
List<SearchResult> results = mConverter.convertCursor(mSiteMapManager, cursor, BASE_RANK);
|
||||
IntentPayload payload = (IntentPayload) results.get(0).payload;
|
||||
Intent intent = payload.intent;
|
||||
|
||||
@@ -222,7 +236,7 @@ public class CursorToSearchResultConverterTest {
|
||||
type, // Payload Type
|
||||
ResultPayloadUtils.marshall(payload) // Payload
|
||||
});
|
||||
List<SearchResult> results = mConverter.convertCursor(cursor, BASE_RANK);
|
||||
List<SearchResult> results = mConverter.convertCursor(mSiteMapManager, cursor, BASE_RANK);
|
||||
InlineSwitchPayload newPayload = (InlineSwitchPayload) results.get(0).payload;
|
||||
|
||||
assertThat(newPayload.settingsUri).isEqualTo(uri);
|
||||
|
@@ -22,10 +22,13 @@ import android.content.pm.ResolveInfo;
|
||||
import android.content.pm.UserInfo;
|
||||
import android.os.UserManager;
|
||||
|
||||
import com.android.settings.R;
|
||||
import com.android.settings.SettingsRobolectricTestRunner;
|
||||
import com.android.settings.TestConfig;
|
||||
import com.android.settings.applications.PackageManagerWrapper;
|
||||
import com.android.settings.dashboard.SiteMapManager;
|
||||
import com.android.settings.testutils.ApplicationTestUtils;
|
||||
import com.android.settings.testutils.FakeFeatureFactory;
|
||||
|
||||
import org.junit.Before;
|
||||
import org.junit.Test;
|
||||
@@ -44,7 +47,12 @@ import static android.content.pm.ApplicationInfo.FLAG_UPDATED_SYSTEM_APP;
|
||||
import static com.google.common.truth.Truth.assertThat;
|
||||
import static org.mockito.Matchers.any;
|
||||
import static org.mockito.Matchers.anyInt;
|
||||
import static org.mockito.Matchers.anyString;
|
||||
import static org.mockito.Matchers.eq;
|
||||
import static org.mockito.Mockito.mock;
|
||||
import static org.mockito.Mockito.never;
|
||||
import static org.mockito.Mockito.spy;
|
||||
import static org.mockito.Mockito.verify;
|
||||
import static org.mockito.Mockito.when;
|
||||
|
||||
@RunWith(SettingsRobolectricTestRunner.class)
|
||||
@@ -57,16 +65,24 @@ public class InstalledAppResultLoaderTest {
|
||||
private PackageManagerWrapper mPackageManagerWrapper;
|
||||
@Mock
|
||||
private UserManager mUserManager;
|
||||
@Mock
|
||||
private SiteMapManager mSiteMapManager;
|
||||
|
||||
private InstalledAppResultLoader mLoader;
|
||||
|
||||
@Before
|
||||
public void setUp() {
|
||||
MockitoAnnotations.initMocks(this);
|
||||
FakeFeatureFactory.setupForTest(mContext);
|
||||
FakeFeatureFactory factory = (FakeFeatureFactory) FakeFeatureFactory.getFactory(mContext);
|
||||
when(factory.searchFeatureProvider.getSiteMapManager())
|
||||
.thenReturn(mSiteMapManager);
|
||||
final List<UserInfo> infos = new ArrayList<>();
|
||||
infos.add(new UserInfo(1, "user 1", 0));
|
||||
when(mUserManager.getProfiles(anyInt())).thenReturn(infos);
|
||||
when(mContext.getSystemService(Context.USER_SERVICE)).thenReturn(mUserManager);
|
||||
when(mContext.getString(R.string.applications_settings))
|
||||
.thenReturn("app");
|
||||
when(mPackageManagerWrapper.getInstalledApplicationsAsUser(anyInt(), anyInt()))
|
||||
.thenReturn(Arrays.asList(
|
||||
ApplicationTestUtils.buildInfo(0 /* uid */, "app1", FLAG_SYSTEM,
|
||||
@@ -94,9 +110,14 @@ public class InstalledAppResultLoaderTest {
|
||||
public void query_matchingQuery_shouldReturnNonSystemApps() {
|
||||
final String query = "app";
|
||||
|
||||
mLoader = new InstalledAppResultLoader(mContext, mPackageManagerWrapper, query);
|
||||
mLoader = spy(new InstalledAppResultLoader(mContext, mPackageManagerWrapper, query));
|
||||
when(mLoader.getContext()).thenReturn(mContext);
|
||||
when(mSiteMapManager.buildBreadCrumb(eq(mContext), anyString(), anyString()))
|
||||
.thenReturn(Arrays.asList(new String[]{"123"}));
|
||||
|
||||
assertThat(mLoader.loadInBackground().size()).isEqualTo(2);
|
||||
verify(mSiteMapManager)
|
||||
.buildBreadCrumb(eq(mContext), anyString(), anyString());
|
||||
}
|
||||
|
||||
@Test
|
||||
@@ -107,9 +128,12 @@ public class InstalledAppResultLoaderTest {
|
||||
0 /* targetSdkVersion */)));
|
||||
final String query = "app";
|
||||
|
||||
mLoader = new InstalledAppResultLoader(mContext, mPackageManagerWrapper, query);
|
||||
mLoader = spy(new InstalledAppResultLoader(mContext, mPackageManagerWrapper, query));
|
||||
when(mLoader.getContext()).thenReturn(mContext);
|
||||
|
||||
assertThat(mLoader.loadInBackground().size()).isEqualTo(1);
|
||||
verify(mSiteMapManager)
|
||||
.buildBreadCrumb(eq(mContext), anyString(), anyString());
|
||||
}
|
||||
|
||||
@Test
|
||||
@@ -132,7 +156,7 @@ public class InstalledAppResultLoaderTest {
|
||||
}
|
||||
|
||||
@Test
|
||||
public void query_matchingQuery_shouldNOtReturnSystemAppIfNotLaunchable() {
|
||||
public void query_matchingQuery_shouldNotReturnSystemAppIfNotLaunchable() {
|
||||
when(mPackageManagerWrapper.getInstalledApplicationsAsUser(anyInt(), anyInt()))
|
||||
.thenReturn(Arrays.asList(
|
||||
ApplicationTestUtils.buildInfo(0 /* uid */, "app1", FLAG_SYSTEM,
|
||||
@@ -146,6 +170,8 @@ public class InstalledAppResultLoaderTest {
|
||||
mLoader = new InstalledAppResultLoader(mContext, mPackageManagerWrapper, query);
|
||||
|
||||
assertThat(mLoader.loadInBackground()).isEmpty();
|
||||
verify(mSiteMapManager, never())
|
||||
.buildBreadCrumb(eq(mContext), anyString(), anyString());
|
||||
}
|
||||
|
||||
@Test
|
||||
|
@@ -0,0 +1,145 @@
|
||||
/*
|
||||
* Copyright (C) 2017 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.settings.search2;
|
||||
|
||||
import android.content.ContentValues;
|
||||
import android.content.Context;
|
||||
import android.database.sqlite.SQLiteDatabase;
|
||||
import android.os.Bundle;
|
||||
|
||||
import com.android.settings.SettingsActivity;
|
||||
import com.android.settings.SettingsRobolectricTestRunner;
|
||||
import com.android.settings.TestConfig;
|
||||
import com.android.settings.dashboard.SiteMapManager;
|
||||
import com.android.settings.search.IndexDatabaseHelper;
|
||||
import com.android.settings.search.IndexDatabaseHelper.SiteMapColumns;
|
||||
import com.android.settings.system.SystemDashboardFragment;
|
||||
import com.android.settings.testutils.DatabaseTestUtils;
|
||||
import com.android.settings.testutils.FakeFeatureFactory;
|
||||
import com.android.settingslib.drawer.CategoryKey;
|
||||
import com.android.settingslib.drawer.DashboardCategory;
|
||||
import com.android.settingslib.drawer.Tile;
|
||||
|
||||
import org.junit.After;
|
||||
import org.junit.Before;
|
||||
import org.junit.Test;
|
||||
import org.junit.runner.RunWith;
|
||||
import org.mockito.Answers;
|
||||
import org.mockito.Mock;
|
||||
import org.mockito.MockitoAnnotations;
|
||||
import org.robolectric.RuntimeEnvironment;
|
||||
import org.robolectric.annotation.Config;
|
||||
|
||||
import java.util.Arrays;
|
||||
import java.util.List;
|
||||
|
||||
import static com.google.common.truth.Truth.assertThat;
|
||||
import static org.mockito.Mockito.when;
|
||||
|
||||
@RunWith(SettingsRobolectricTestRunner.class)
|
||||
@Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION)
|
||||
public class SiteMapManagerTest {
|
||||
|
||||
private static final int STATIC_DB_DEPTH = 4;
|
||||
private static final String CLASS_PREFIX = "class_";
|
||||
private static final String TITLE_PREFIX = "title_";
|
||||
|
||||
@Mock(answer = Answers.RETURNS_DEEP_STUBS)
|
||||
private Context mMockContext;
|
||||
private Context mContext;
|
||||
private SQLiteDatabase mDb;
|
||||
private SiteMapManager mSiteMapManager;
|
||||
private FakeFeatureFactory mFeatureFactory;
|
||||
|
||||
@Before
|
||||
public void setUp() {
|
||||
MockitoAnnotations.initMocks(this);
|
||||
FakeFeatureFactory.setupForTest(mMockContext);
|
||||
mFeatureFactory = (FakeFeatureFactory) FakeFeatureFactory.getFactory(mMockContext);
|
||||
|
||||
mContext = RuntimeEnvironment.application;
|
||||
mDb = IndexDatabaseHelper.getInstance(mContext).getWritableDatabase();
|
||||
buildDb();
|
||||
mSiteMapManager = new SiteMapManager();
|
||||
}
|
||||
|
||||
@After
|
||||
public void cleanUp() {
|
||||
DatabaseTestUtils.clearDb();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void buildBreadCrumb_onlyFromSiteMapDb_breadcrumbShouldLinkUp() {
|
||||
List<String> breadcrumb = mSiteMapManager.buildBreadCrumb(mContext,
|
||||
CLASS_PREFIX + 0, TITLE_PREFIX + 0);
|
||||
assertThat(breadcrumb.size()).isEqualTo(STATIC_DB_DEPTH + 1);
|
||||
for (int i = 0; i < STATIC_DB_DEPTH; i++) {
|
||||
assertThat(breadcrumb.get(i)).isEqualTo(TITLE_PREFIX + (STATIC_DB_DEPTH - i));
|
||||
}
|
||||
}
|
||||
|
||||
@Test
|
||||
public void buildBreadCrumb_fromSiteMapDbAndDashboardProvider_breadcrumbShouldLinkUp() {
|
||||
final String iaClass = SystemDashboardFragment.class.getName();
|
||||
final String iaTitle = "ia_title";
|
||||
|
||||
ContentValues index = new ContentValues();
|
||||
index.put(IndexDatabaseHelper.IndexColumns.CLASS_NAME, iaClass);
|
||||
index.put(IndexDatabaseHelper.IndexColumns.SCREEN_TITLE, iaTitle);
|
||||
mDb.replaceOrThrow(IndexDatabaseHelper.Tables.TABLE_PREFS_INDEX, null, index);
|
||||
|
||||
final DashboardCategory category = new DashboardCategory();
|
||||
category.key = CategoryKey.CATEGORY_SYSTEM;
|
||||
category.tiles.add(new Tile());
|
||||
category.tiles.get(0).title = TITLE_PREFIX + STATIC_DB_DEPTH;
|
||||
category.tiles.get(0).metaData = new Bundle();
|
||||
category.tiles.get(0).metaData.putString(SettingsActivity.META_DATA_KEY_FRAGMENT_CLASS,
|
||||
CLASS_PREFIX + STATIC_DB_DEPTH);
|
||||
when(mFeatureFactory.dashboardFeatureProvider.getAllCategories())
|
||||
.thenReturn(Arrays.asList(category));
|
||||
|
||||
final List<String> breadcrumb = mSiteMapManager.buildBreadCrumb(mContext,
|
||||
CLASS_PREFIX + 0, TITLE_PREFIX + 0);
|
||||
|
||||
assertThat(breadcrumb.size()).isEqualTo(STATIC_DB_DEPTH + 2);
|
||||
assertThat(breadcrumb.get(0))
|
||||
.isEqualTo(iaTitle);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void buildBreadCrumb_classNotIndexed_shouldNotHaveBreadCrumb() {
|
||||
final String title = "wrong_title";
|
||||
|
||||
final List<String> breadcrumb = mSiteMapManager.buildBreadCrumb(mContext,
|
||||
"wrong_class", title);
|
||||
|
||||
assertThat(breadcrumb.size()).isEqualTo(1);
|
||||
assertThat(breadcrumb.get(0)).isEqualTo(title);
|
||||
}
|
||||
|
||||
private void buildDb() {
|
||||
for (int i = 0; i < STATIC_DB_DEPTH; i++) {
|
||||
final ContentValues siteMapPair = new ContentValues();
|
||||
siteMapPair.put(SiteMapColumns.DOCID, i);
|
||||
siteMapPair.put(SiteMapColumns.PARENT_CLASS, CLASS_PREFIX + (i + 1));
|
||||
siteMapPair.put(SiteMapColumns.PARENT_TITLE, TITLE_PREFIX + (i + 1));
|
||||
siteMapPair.put(SiteMapColumns.CHILD_CLASS, CLASS_PREFIX + i);
|
||||
siteMapPair.put(SiteMapColumns.CHILD_TITLE, TITLE_PREFIX + i);
|
||||
mDb.replaceOrThrow(IndexDatabaseHelper.Tables.TABLE_SITE_MAP, null, siteMapPair);
|
||||
}
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user