DatabaseIndexingManagerTest.java revision 4f198813ed0d513ddb1461315bae1c881904ebf0
11dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze/*
2ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze * Copyright (C) 2017 The Android Open Source Project
31dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze *
41dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze * Licensed under the Apache License, Version 2.0 (the "License");
51dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze * you may not use this file except in compliance with the License.
61dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze * You may obtain a copy of the License at
71dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze *
81dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze *      http://www.apache.org/licenses/LICENSE-2.0
91dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze *
101dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze * Unless required by applicable law or agreed to in writing, software
111dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze * distributed under the License is distributed on an "AS IS" BASIS,
121dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
131dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze * See the License for the specific language governing permissions and
141dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze * limitations under the License.
151dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze *
161dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze */
171dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze
1804615bc1b6a10edad13754c9e6be1197ad150901Matthew Fritzepackage com.android.settings.search2;
191dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze
20ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritzeimport android.annotation.NonNull;
21ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritzeimport android.annotation.Nullable;
22ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritzeimport android.content.ContentProvider;
23ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritzeimport android.content.ContentValues;
241dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritzeimport android.content.Context;
25ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritzeimport android.content.Intent;
26ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritzeimport android.content.pm.PackageManager;
27ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritzeimport android.content.pm.ProviderInfo;
28ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritzeimport android.content.pm.ResolveInfo;
291dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritzeimport android.database.Cursor;
30ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritzeimport android.database.MatrixCursor;
311dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritzeimport android.database.sqlite.SQLiteDatabase;
32ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritzeimport android.net.Uri;
33a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritzeimport android.os.Build;
341dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritzeimport android.provider.SearchIndexableResource;
35ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritzeimport android.util.ArrayMap;
361dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritzeimport com.android.settings.R;
371dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritzeimport com.android.settings.SettingsRobolectricTestRunner;
381dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritzeimport com.android.settings.TestConfig;
3904615bc1b6a10edad13754c9e6be1197ad150901Matthew Fritzeimport com.android.settings.search.IndexDatabaseHelper;
4004615bc1b6a10edad13754c9e6be1197ad150901Matthew Fritzeimport com.android.settings.search.SearchIndexableRaw;
41a8b089db8a6d495a18dc3ad91d3bd84b042fb004Fan Zhangimport com.android.settings.testutils.DatabaseTestUtils;
42ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritzeimport com.android.settings.testutils.shadow.ShadowDatabaseIndexingUtils;
43ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritzeimport com.android.settings.testutils.shadow.ShadowRunnableAsyncTask;
441dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritzeimport org.junit.After;
451dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritzeimport org.junit.Before;
461dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritzeimport org.junit.Test;
471dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritzeimport org.junit.runner.RunWith;
48ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritzeimport org.mockito.Mock;
49ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritzeimport org.mockito.MockitoAnnotations;
50ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritzeimport org.robolectric.RuntimeEnvironment;
511dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritzeimport org.robolectric.annotation.Config;
52ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritzeimport org.robolectric.shadows.ShadowContentResolver;
531dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze
541dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritzeimport java.util.ArrayList;
551dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritzeimport java.util.Arrays;
561dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritzeimport java.util.HashMap;
57ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritzeimport java.util.HashSet;
581dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritzeimport java.util.List;
591dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritzeimport java.util.Locale;
603f3b547e4a2eeeb362d9b7c98b05f9a244cd754eMatthew Fritzeimport java.util.Map;
61ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritzeimport java.util.Set;
621dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze
634f198813ed0d513ddb1461315bae1c881904ebf0Matthew Fritzeimport static android.provider.SearchIndexablesContract.INDEXABLES_RAW_COLUMNS;
641dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritzeimport static com.google.common.truth.Truth.assertThat;
65ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritzeimport static org.mockito.Matchers.any;
66ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritzeimport static org.mockito.Matchers.anyInt;
67ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritzeimport static org.mockito.Matchers.anyList;
68ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritzeimport static org.mockito.Matchers.anyMap;
69ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritzeimport static org.mockito.Matchers.anyString;
70ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritzeimport static org.mockito.Mockito.doReturn;
714f198813ed0d513ddb1461315bae1c881904ebf0Matthew Fritzeimport static org.mockito.Mockito.mock;
721dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritzeimport static org.mockito.Mockito.spy;
73ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritzeimport static org.mockito.Mockito.times;
74ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritzeimport static org.mockito.Mockito.verify;
75ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritzeimport static org.mockito.Mockito.when;
761dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze
771dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze@RunWith(SettingsRobolectricTestRunner.class)
78ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze@Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION,
79a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze        shadows = {ShadowRunnableAsyncTask.class})
801dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritzepublic class DatabaseIndexingManagerTest {
811dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze    private final String localeStr = "en_US";
821dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze
833f3b547e4a2eeeb362d9b7c98b05f9a244cd754eMatthew Fritze    private final int rank = 8;
841dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze    private final String title = "title\u2011title";
851dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze    private final String updatedTitle = "title-title";
861dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze    private final String normalizedTitle = "titletitle";
871dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze    private final String summaryOn = "summary\u2011on";
881dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze    private final String updatedSummaryOn = "summary-on";
891dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze    private final String normalizedSummaryOn = "summaryon";
901dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze    private final String summaryOff = "summary\u2011off";
91a96b11f65d9f29dd4037da85e12f5cf9dcfa0176Fan Zhang    private final String updatedSummaryOff = "summary-off";
921dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze    private final String normalizedSummaryOff = "summaryoff";
931dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze    private final String entries = "entries";
941dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze    private final String keywords = "keywords, keywordss, keywordsss";
951dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze    private final String spaceDelimittedKeywords = "keywords keywordss keywordsss";
961dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze    private final String screenTitle = "screen title";
971dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze    private final String className = "class name";
981dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze    private final int iconResId = 0xff;
991dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze    private final String action = "action";
1001dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze    private final String targetPackage = "target package";
1011dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze    private final String targetClass = "target class";
1021dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze    private final String packageName = "package name";
1031dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze    private final String key = "key";
1041dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze    private final int userId = -1;
1051dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze    private final boolean enabled = true;
1061dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze
107ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze    private final String AUTHORITY_ONE = "authority";
108ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze    private final String PACKAGE_ONE = "com.android.settings";
109ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze
110ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze    private final String TITLE_ONE = "title one";
111ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze    private final String TITLE_TWO = "title two";
112ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze    private final String KEY_ONE = "key one";
113ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze    private final String KEY_TWO = "key two";
114ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze
1151dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze    private Context mContext;
116ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze
1171dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze    private DatabaseIndexingManager mManager;
1181dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze    private SQLiteDatabase mDb;
1191dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze
120ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze    @Mock
121ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze    private PackageManager mPackageManager;
122ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze
1231dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze    @Before
1241dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze    public void setUp() {
125ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        MockitoAnnotations.initMocks(this);
126ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        mContext = spy(RuntimeEnvironment.application);
127a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze        mManager = spy(new DatabaseIndexingManager(mContext, PACKAGE_ONE));
1281dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        mDb = IndexDatabaseHelper.getInstance(mContext).getWritableDatabase();
129ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze
130ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        doReturn(mPackageManager).when(mContext).getPackageManager();
1311dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze    }
1321dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze
1331dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze    @After
1341dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze    public void cleanUp() {
135a8b089db8a6d495a18dc3ad91d3bd84b042fb004Fan Zhang        DatabaseTestUtils.clearDb();
1361dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze    }
1371dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze
1381dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze    @Test
1391dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze    public void testDatabaseSchema() {
1401dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        Cursor dbCursor = mDb.query("prefs_index", null, null, null, null, null, null);
1411dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        List<String> columnNames = new ArrayList<>(Arrays.asList(dbCursor.getColumnNames()));
1421dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Note that docid is not included.
143a96b11f65d9f29dd4037da85e12f5cf9dcfa0176Fan Zhang        List<String> expColumnNames = new ArrayList<>(Arrays.asList(new String[]{
1441dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze                "locale",
1451dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze                "data_rank",
1461dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze                "data_title",
1471dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze                "data_title_normalized",
1481dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze                "data_summary_on",
1491dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze                "data_summary_on_normalized",
1501dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze                "data_summary_off",
1511dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze                "data_summary_off_normalized",
1521dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze                "data_entries",
1531dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze                "data_keywords",
1541dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze                "class_name",
1551dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze                "screen_title",
1561dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze                "intent_action",
1571dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze                "intent_target_package",
1581dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze                "intent_target_class",
1591dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze                "icon",
1601dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze                "enabled",
1611dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze                "data_key_reference",
1621dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze                "user_id",
1631dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze                "payload_type",
1641dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze                "payload"
1651dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        }));
1661dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Prevent database schema regressions
1671dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(columnNames).containsAllIn(expColumnNames);
1681dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze    }
1691dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze
1701dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze    // Tests for the flow: IndexOneRaw -> UpdateOneRowWithFilteredData -> UpdateOneRow
1711dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze
1721dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze    @Test
173ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze    public void testInsertRawColumn_rowInserted() {
1741dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        SearchIndexableRaw raw = getFakeRaw();
1751dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        mManager.indexOneSearchIndexableData(mDb, localeStr, raw, null /* Non-indexable keys */);
1761dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        Cursor cursor = mDb.rawQuery("SELECT * FROM prefs_index", null);
1771dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getCount()).isEqualTo(1);
1781dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze    }
1791dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze
1801dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze    @Test
181ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze    public void testInsertRawColumn_rowMatches() {
1821dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        SearchIndexableRaw raw = getFakeRaw();
1831dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        mManager.indexOneSearchIndexableData(mDb, localeStr, raw, null /* Non-indexable keys */);
1841dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        Cursor cursor = mDb.rawQuery("SELECT * FROM prefs_index", null);
1851dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        cursor.moveToPosition(0);
1861dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze
1871dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Locale
1881dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getString(0)).isEqualTo(localeStr);
1891dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Data Rank
1901dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getInt(1)).isEqualTo(raw.rank);
1911dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Data Title
1921dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getString(2)).isEqualTo(updatedTitle);
1931dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Normalized Title
1941dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getString(3)).isEqualTo(normalizedTitle);
1951dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Summary On
1961dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getString(4)).isEqualTo(updatedSummaryOn);
1971dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Summary On Normalized
1981dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getString(5)).isEqualTo(normalizedSummaryOn);
1991dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Summary Off
2001dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getString(6)).isEqualTo(updatedSummaryOff);
2011dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Summary off normalized
2021dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getString(7)).isEqualTo(normalizedSummaryOff);
2031dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Entries
2041dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getString(8)).isEqualTo(raw.entries);
2051dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Keywords
2061dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getString(9)).isEqualTo(spaceDelimittedKeywords);
2071dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Screen Title
2081dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getString(10)).isEqualTo(raw.screenTitle);
2091dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Class Name
2101dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getString(11)).isEqualTo(raw.className);
2111dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Icon
2121dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getInt(12)).isEqualTo(raw.iconResId);
2131dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Intent Action
2141dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getString(13)).isEqualTo(raw.intentAction);
2151dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Target Package
2161dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getString(14)).isEqualTo(raw.intentTargetPackage);
2171dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Target Class
2181dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getString(15)).isEqualTo(raw.intentTargetClass);
2191dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Enabled
2201dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getInt(16) == 1).isEqualTo(raw.enabled);
2211dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Data ref key
2221dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getString(17)).isNotNull();
2231dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // User Id
2241dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getInt(18)).isEqualTo(raw.userId);
2251dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Payload Type - default is 0
2261dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getInt(19)).isEqualTo(0);
2271dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Payload
2281dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getBlob(20)).isNull();
2291dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze    }
2301dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze
2311dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze    @Test
232ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze    public void testInsertRawColumn_mismatchedLocale_noRowInserted() {
2331dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        SearchIndexableRaw raw = getFakeRaw("ca-fr");
2341dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        mManager.indexOneSearchIndexableData(mDb, localeStr, raw, null /* Non-indexable keys */);
2351dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        Cursor cursor = mDb.rawQuery("SELECT * FROM prefs_index", null);
2361dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getCount()).isEqualTo(0);
2371dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze    }
2381dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze
2391dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze    // Tests for the flow: IndexOneResource -> IndexFromResource ->
2401dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze    //                     UpdateOneRowWithFilteredData -> UpdateOneRow
2411dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze
2421dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze    @Test
2431dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze    public void testNullResource_NothingInserted() {
2441dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        mManager.indexOneSearchIndexableData(mDb, localeStr, null /* searchIndexableResource */,
245248d95c61809b253eb16fb1d597ed5e2f83ada78Fan Zhang                new HashMap<>());
2461dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        Cursor cursor = mDb.rawQuery("SELECT * FROM prefs_index", null);
2471dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getCount()).isEqualTo(0);
2481dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze    }
2491dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze
2501dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze    @Test
2511dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze    public void testAddResource_RowsInserted() {
252dc9a82f5b017f430aa7d50f12450082f1bdc871eFan Zhang        SearchIndexableResource resource = getFakeResource(R.xml.display_settings);
253ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        mManager.indexOneSearchIndexableData(mDb, localeStr, resource, new HashMap<>());
2541dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        Cursor cursor = mDb.rawQuery("SELECT * FROM prefs_index", null);
2556138f1ab31e90f59c725e4d4738c008c3fa30391Andrew Sapperstein        assertThat(cursor.getCount()).isEqualTo(18);
2561dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze    }
2571dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze
2581dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze    @Test
259ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze    public void testAddResource_withNIKs_rowsInsertedDisabled() {
260dc9a82f5b017f430aa7d50f12450082f1bdc871eFan Zhang        SearchIndexableResource resource = getFakeResource(R.xml.display_settings);
261d299b03f28fd23973b32931c3ae9a254a37d474dDoris Ling        // Only add 2 of 16 items to be disabled.
262d299b03f28fd23973b32931c3ae9a254a37d474dDoris Ling        String[] keys = {"brightness", "wallpaper"};
263ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        Map<String, Set<String>> niks = getNonIndexableKeys(keys);
264ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze
2653f3b547e4a2eeeb362d9b7c98b05f9a244cd754eMatthew Fritze        mManager.indexOneSearchIndexableData(mDb, localeStr, resource, niks);
2663f3b547e4a2eeeb362d9b7c98b05f9a244cd754eMatthew Fritze
2673f3b547e4a2eeeb362d9b7c98b05f9a244cd754eMatthew Fritze        Cursor cursor = mDb.rawQuery("SELECT * FROM prefs_index WHERE enabled = 0", null);
2683f3b547e4a2eeeb362d9b7c98b05f9a244cd754eMatthew Fritze        assertThat(cursor.getCount()).isEqualTo(2);
2693f3b547e4a2eeeb362d9b7c98b05f9a244cd754eMatthew Fritze        cursor = mDb.rawQuery("SELECT * FROM prefs_index WHERE enabled = 1", null);
2706138f1ab31e90f59c725e4d4738c008c3fa30391Andrew Sapperstein        assertThat(cursor.getCount()).isEqualTo(16);
2713f3b547e4a2eeeb362d9b7c98b05f9a244cd754eMatthew Fritze    }
2723f3b547e4a2eeeb362d9b7c98b05f9a244cd754eMatthew Fritze
2733f3b547e4a2eeeb362d9b7c98b05f9a244cd754eMatthew Fritze    @Test
274ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze    public void testAddResourceHeader_rowsMatch() {
2751dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        SearchIndexableResource resource = getFakeResource(R.xml.application_settings);
276ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        mManager.indexOneSearchIndexableData(mDb, localeStr, resource, new HashMap<>());
2771dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze
2781dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        Cursor cursor = mDb.rawQuery("SELECT * FROM prefs_index ORDER BY data_title", null);
2791dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        cursor.moveToPosition(1);
2801dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze
2811dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Locale
2821dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getString(0)).isEqualTo(localeStr);
2831dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Data Rank
2841dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getInt(1)).isEqualTo(rank);
2851dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Data Title
286015a50bef99a23a8c795486b99021a5784d65d64Doris Ling        assertThat(cursor.getString(2)).isEqualTo("App info");
2871dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Normalized Title
288015a50bef99a23a8c795486b99021a5784d65d64Doris Ling        assertThat(cursor.getString(3)).isEqualTo("app info");
2891dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Summary On
2901dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getString(4)).isEqualTo("Manage apps, set up quick launch shortcuts");
2911dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Summary On Normalized
2921dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getString(5)).isEqualTo("manage apps, set up quick launch shortcuts");
2931dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Summary Off - only on for checkbox preferences
2941dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getString(6)).isEmpty();
2951dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Summary off normalized - only on for checkbox preferences
2961dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getString(7)).isEmpty();
2971dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Entries - only on for list preferences
2981dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getString(8)).isNull();
2991dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Keywords
3001dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getString(9)).isEmpty();
3011dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Screen Title
302015a50bef99a23a8c795486b99021a5784d65d64Doris Ling        assertThat(cursor.getString(10)).isEqualTo("App info");
3031dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Class Name
3041dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getString(11)).isEqualTo(className);
3051dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Icon
306d0b42b03229225571ed060a377a0f72264058db6Matthew Fritze        assertThat(cursor.getInt(12)).isEqualTo(0);
3071dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Intent Action
3081dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getString(13)).isEqualTo(action);
3091dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Target Package
3101dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getString(14)).isEqualTo(targetPackage);
3111dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Target Class
3121dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getString(15)).isEqualTo(targetClass);
3131dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Enabled
3141dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getInt(16) == 1).isEqualTo(enabled);
3151dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Data ref key
3161dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getString(17)).isEqualTo("applications_settings");
3171dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // User Id
3181dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getInt(18)).isEqualTo(userId);
3191dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Payload Type - default is 0
3201dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getInt(19)).isEqualTo(0);
3211dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Payload - should be updated to real payloads as controllers are added
3221dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getBlob(20)).isNull();
3231dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze    }
3241dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze
3251dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze    @Test
326ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze    public void testAddResource_withChildFragment_shouldUpdateSiteMapDb() {
327f04ff76af05823619f1c522f22d8193edbb56bfaMaurice Lam        // FIXME: This test was failing. (count = 6 at the end)
328f04ff76af05823619f1c522f22d8193edbb56bfaMaurice Lam
329f04ff76af05823619f1c522f22d8193edbb56bfaMaurice Lam//        SearchIndexableResource resource = getFakeResource(R.xml.network_and_internet);
330f04ff76af05823619f1c522f22d8193edbb56bfaMaurice Lam//        mManager.indexOneSearchIndexableData(mDb, localeStr, resource,
331f04ff76af05823619f1c522f22d8193edbb56bfaMaurice Lam//                new HashMap<>());
332f04ff76af05823619f1c522f22d8193edbb56bfaMaurice Lam//        Cursor query = mDb.query(IndexDatabaseHelper.Tables.TABLE_SITE_MAP, SITE_MAP_COLUMNS,
333f04ff76af05823619f1c522f22d8193edbb56bfaMaurice Lam//                null, null, null, null, null);
334f04ff76af05823619f1c522f22d8193edbb56bfaMaurice Lam//        query.moveToPosition(-1);
335f04ff76af05823619f1c522f22d8193edbb56bfaMaurice Lam//        int count = 0;
336f04ff76af05823619f1c522f22d8193edbb56bfaMaurice Lam//        while (query.moveToNext()) {
337f04ff76af05823619f1c522f22d8193edbb56bfaMaurice Lam//            count++;
338f04ff76af05823619f1c522f22d8193edbb56bfaMaurice Lam//            assertThat(query.getString(query.getColumnIndex(SiteMapColumns.PARENT_CLASS)))
339f04ff76af05823619f1c522f22d8193edbb56bfaMaurice Lam//                    .isEqualTo(className);
340f04ff76af05823619f1c522f22d8193edbb56bfaMaurice Lam//            assertThat(query.getString(query.getColumnIndex(SiteMapColumns.PARENT_TITLE)))
341f04ff76af05823619f1c522f22d8193edbb56bfaMaurice Lam//                    .isEqualTo(mContext.getString(R.string.network_dashboard_title));
342f04ff76af05823619f1c522f22d8193edbb56bfaMaurice Lam//            assertThat(query.getString(query.getColumnIndex(SiteMapColumns.CHILD_CLASS)))
343f04ff76af05823619f1c522f22d8193edbb56bfaMaurice Lam//                    .isNotEmpty();
344f04ff76af05823619f1c522f22d8193edbb56bfaMaurice Lam//            assertThat(query.getString(query.getColumnIndex(SiteMapColumns.CHILD_TITLE)))
345f04ff76af05823619f1c522f22d8193edbb56bfaMaurice Lam//                    .isNotEmpty();
346f04ff76af05823619f1c522f22d8193edbb56bfaMaurice Lam//        }
347f04ff76af05823619f1c522f22d8193edbb56bfaMaurice Lam//        assertThat(count).isEqualTo(5);
348a96b11f65d9f29dd4037da85e12f5cf9dcfa0176Fan Zhang    }
349a96b11f65d9f29dd4037da85e12f5cf9dcfa0176Fan Zhang
350a96b11f65d9f29dd4037da85e12f5cf9dcfa0176Fan Zhang    @Test
351ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze    public void testAddResource_customSetting_rowsMatch() {
352d299b03f28fd23973b32931c3ae9a254a37d474dDoris Ling        SearchIndexableResource resource = getFakeResource(R.xml.swipe_to_notification_settings);
353ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        mManager.indexOneSearchIndexableData(mDb, localeStr, resource, new HashMap<>());
354248d95c61809b253eb16fb1d597ed5e2f83ada78Fan Zhang        final String prefTitle =
355248d95c61809b253eb16fb1d597ed5e2f83ada78Fan Zhang                mContext.getString(R.string.fingerprint_swipe_for_notifications_title);
356248d95c61809b253eb16fb1d597ed5e2f83ada78Fan Zhang        final String prefSummary =
357248d95c61809b253eb16fb1d597ed5e2f83ada78Fan Zhang                mContext.getString(R.string.fingerprint_swipe_for_notifications_summary);
358248d95c61809b253eb16fb1d597ed5e2f83ada78Fan Zhang        Cursor cursor = mDb.rawQuery(
359248d95c61809b253eb16fb1d597ed5e2f83ada78Fan Zhang                "SELECT * FROM prefs_index where data_title='" + prefTitle + "'", null);
360248d95c61809b253eb16fb1d597ed5e2f83ada78Fan Zhang        cursor.moveToFirst();
3611dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze
3621dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Locale
3631dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getString(0)).isEqualTo(localeStr);
3641dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Data Rank
3651dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getInt(1)).isEqualTo(rank);
3661dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Data Title
367248d95c61809b253eb16fb1d597ed5e2f83ada78Fan Zhang        assertThat(cursor.getString(2)).isEqualTo(prefTitle);
3681dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Normalized Title
369248d95c61809b253eb16fb1d597ed5e2f83ada78Fan Zhang        assertThat(cursor.getString(3)).isEqualTo(prefTitle.toLowerCase());
3701dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Summary On
371248d95c61809b253eb16fb1d597ed5e2f83ada78Fan Zhang        assertThat(cursor.getString(4)).isEqualTo(prefSummary);
3721dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Summary On Normalized
373248d95c61809b253eb16fb1d597ed5e2f83ada78Fan Zhang        assertThat(cursor.getString(5)).isEqualTo(prefSummary.toLowerCase());
3741dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Summary Off - only on for checkbox preferences
3751dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getString(6)).isEmpty();
3761dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Summary off normalized - only on for checkbox preferences
3771dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getString(7)).isEmpty();
3781dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Entries - only on for list preferences
3791dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getString(8)).isNull();
3801dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Keywords
3811dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getString(9)).isEmpty();
3821dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Screen Title
383248d95c61809b253eb16fb1d597ed5e2f83ada78Fan Zhang        assertThat(cursor.getString(10)).isEqualTo(
384d299b03f28fd23973b32931c3ae9a254a37d474dDoris Ling                mContext.getString(R.string.fingerprint_swipe_for_notifications_title));
3851dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Class Name
3861dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getString(11)).isEqualTo(className);
3871dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Icon
3881dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getInt(12)).isEqualTo(iconResId);
3891dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Intent Action
3901dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getString(13)).isEqualTo(action);
3911dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Target Package
3921dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getString(14)).isEqualTo(targetPackage);
3931dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Target Class
3941dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getString(15)).isEqualTo(targetClass);
3951dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Enabled
3961dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getInt(16) == 1).isEqualTo(enabled);
3971dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Data ref key
3981dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getString(17)).isEqualTo("gesture_swipe_down_fingerprint");
3991dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // User Id
4001dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getInt(18)).isEqualTo(userId);
4011dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Payload Type - default is 0
4021dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getInt(19)).isEqualTo(0);
4031dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Payload - should be updated to real payloads as controllers are added
4041dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getBlob(20)).isNull();
4051dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze    }
4061dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze
4071dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze    @Test
408ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze    public void testAddResource_checkboxPreference_rowsMatch() {
4091dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        SearchIndexableResource resource = getFakeResource(R.xml.application_settings);
410ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        mManager.indexOneSearchIndexableData(mDb, localeStr, resource, new HashMap<>());
4111dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze
4121dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        /* Should return 6 results, with the following titles:
4131dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze         * Advanced Settings, Apps, Manage Apps, Preferred install location, Running Services
4141dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze         */
4151dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        Cursor cursor = mDb.rawQuery("SELECT * FROM prefs_index ORDER BY data_title", null);
4161dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        cursor.moveToPosition(0);
4171dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Locale
4181dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getString(0)).isEqualTo(localeStr);
4191dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Data Rank
4201dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getInt(1)).isEqualTo(rank);
4211dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Data Title
4221dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getString(2)).isEqualTo("Advanced settings");
4231dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Normalized Title
4241dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getString(3)).isEqualTo("advanced settings");
4251dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Summary On
4261dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getString(4)).isEqualTo("Enable more settings options");
4271dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Summary On Normalized
4281dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getString(5)).isEqualTo("enable more settings options");
4291dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Summary Off
4301dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getString(6)).isEqualTo("Enable more settings options");
4311dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Summary Off
4321dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getString(7)).isEqualTo("enable more settings options");
4331dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Entries - only on for list preferences
4341dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getString(8)).isNull();
4351dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Keywords
4361dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getString(9)).isEmpty();
4371dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Screen Title
438015a50bef99a23a8c795486b99021a5784d65d64Doris Ling        assertThat(cursor.getString(10)).isEqualTo("App info");
4391dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Class Name
4401dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getString(11)).isEqualTo(className);
4411dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Icon
4421dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getInt(12)).isEqualTo(iconResId);
4431dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Intent Action
4441dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getString(13)).isEqualTo(action);
4451dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Target Package
4461dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getString(14)).isEqualTo(targetPackage);
4471dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Target Class
4481dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getString(15)).isEqualTo(targetClass);
4491dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Enabled
4501dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getInt(16) == 1).isEqualTo(enabled);
4511dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Data ref key
4521dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getString(17)).isEqualTo("toggle_advanced_settings");
4531dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // User Id
4541dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getInt(18)).isEqualTo(userId);
4551dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Payload Type - default is 0
4561dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getInt(19)).isEqualTo(0);
4571dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Payload - should be updated to real payloads as controllers are added
4581dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getBlob(20)).isNull();
4591dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze    }
4601dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze
4611dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze    @Test
462ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze    public void testAddResource_listPreference_rowsMatch() {
4631dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        SearchIndexableResource resource = getFakeResource(R.xml.application_settings);
464ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        mManager.indexOneSearchIndexableData(mDb, localeStr, resource, new HashMap<>());
4651dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze
4661dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        Cursor cursor = mDb.rawQuery("SELECT * FROM prefs_index ORDER BY data_title", null);
4671dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        cursor.moveToPosition(3);
4681dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Locale
4691dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getString(0)).isEqualTo(localeStr);
4701dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Data Rank
4711dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getInt(1)).isEqualTo(rank);
4721dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Data Title
4731dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getString(2)).isEqualTo("Preferred install location");
4741dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Normalized Title
4751dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getString(3)).isEqualTo("preferred install location");
4761dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Summary On
477a96b11f65d9f29dd4037da85e12f5cf9dcfa0176Fan Zhang        assertThat(cursor.getString(4)).isEqualTo(
478a96b11f65d9f29dd4037da85e12f5cf9dcfa0176Fan Zhang                "Change the preferred installation location for new apps");
4791dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Summary On Normalized
480a96b11f65d9f29dd4037da85e12f5cf9dcfa0176Fan Zhang        assertThat(cursor.getString(5)).isEqualTo(
481a96b11f65d9f29dd4037da85e12f5cf9dcfa0176Fan Zhang                "change the preferred installation location for new apps");
4821dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Summary Off - only on for checkbox preferences
4831dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getString(6)).isEmpty();
4841dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Summary off normalized - only on for checkbox preferences
4851dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getString(7)).isEmpty();
4861dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Entries - only on for list preferences
4871dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getString(8)).isEqualTo("Internal device storage|Removable SD card|" +
488a96b11f65d9f29dd4037da85e12f5cf9dcfa0176Fan Zhang                "Let the system decide|");
4891dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Keywords
4901dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getString(9)).isEmpty();
4911dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Screen Title
492015a50bef99a23a8c795486b99021a5784d65d64Doris Ling        assertThat(cursor.getString(10)).isEqualTo("App info");
4931dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Class Name
4941dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getString(11)).isEqualTo(className);
4951dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Icon
4961dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getInt(12)).isEqualTo(iconResId);
4971dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Intent Action
4981dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getString(13)).isEqualTo(action);
4991dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Target Package
5001dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getString(14)).isEqualTo(targetPackage);
5011dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Target Class
5021dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getString(15)).isEqualTo(targetClass);
5031dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Enabled
5041dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getInt(16) == 1).isEqualTo(enabled);
5051dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Data ref key
5061dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getString(17)).isEqualTo("app_install_location");
5071dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // User Id
5081dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getInt(18)).isEqualTo(userId);
5091dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Payload Type - default is 0
5101dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getInt(19)).isEqualTo(0);
5111dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Payload - should be updated to real payloads as controllers are added
5121dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getBlob(20)).isNull();
5131dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze    }
5141dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze
5151dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze    // Tests for the flow: IndexOneResource -> IndexFromProvider -> IndexFromResource ->
5161dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze    //                     UpdateOneRowWithFilteredData -> UpdateOneRow
5171dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze
5181dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze    @Test
519ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze    public void testResourceProvider_rowInserted() {
520d299b03f28fd23973b32931c3ae9a254a37d474dDoris Ling        SearchIndexableResource resource = getFakeResource(R.xml.swipe_to_notification_settings);
5211dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        resource.xmlResId = 0;
5221dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        resource.className = "com.android.settings.display.ScreenZoomSettings";
5231dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze
524ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        mManager.indexOneSearchIndexableData(mDb, localeStr, resource, new HashMap<>());
5251dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        Cursor cursor = mDb.rawQuery("SELECT * FROM prefs_index", null);
5261dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getCount()).isEqualTo(1);
5271dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze    }
5281dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze
5291dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze    @Test
530ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze    public void testResourceProvider_rowMatches() {
531d299b03f28fd23973b32931c3ae9a254a37d474dDoris Ling        SearchIndexableResource resource = getFakeResource(R.xml.swipe_to_notification_settings);
5321dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        resource.xmlResId = 0;
5331dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        resource.className = "com.android.settings.display.ScreenZoomSettings";
5341dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze
535ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        mManager.indexOneSearchIndexableData(mDb, localeStr, resource, new HashMap<>());
5361dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        Cursor cursor = mDb.rawQuery("SELECT * FROM prefs_index", null);
5371dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        cursor.moveToPosition(0);
5381dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze
5391dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Locale
5401dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getString(0)).isEqualTo(localeStr);
5411dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Data Rank
5421dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getInt(1)).isEqualTo(rank);
5431dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Data Title
5441dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getString(2)).isEqualTo("Display size");
5451dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Normalized Title
5461dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getString(3)).isEqualTo("display size");
5471dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Summary On
5481dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getString(4)).isEmpty();
5491dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Summary On Normalized
5501dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getString(5)).isEmpty();
5511dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Summary Off - only on for checkbox preferences
5521dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getString(6)).isEmpty();
5531dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Summary off normalized - only on for checkbox preferences
5541dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getString(7)).isEmpty();
5551dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Entries - only on for list preferences
5561dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getString(8)).isNull();
5571dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Keywords
5581dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getString(9)).isEqualTo("display density screen zoom scale scaling");
5591dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Screen Title
5601dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getString(10)).isEqualTo("Display size");
5611dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Class Name
5621dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getString(11))
5631dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze                .isEqualTo("com.android.settings.display.ScreenZoomSettings");
5641dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Icon
5651dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getInt(12)).isEqualTo(iconResId);
5661dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Intent Action
5671dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getString(13)).isNull();
5681dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Target Package
5691dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getString(14)).isNull();
5701dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Target Class
5711dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getString(15)).isNull();
5721dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Enabled
5731dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getInt(16) == 1).isEqualTo(enabled);
5741dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Data ref key
5751dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getString(17)).isNull();
5761dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // User Id
5771dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getInt(18)).isEqualTo(userId);
5781dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Payload Type - default is 0
5791dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getInt(19)).isEqualTo(0);
5801dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Payload - should be updated to real payloads as controllers are added
5811dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getBlob(20)).isNull();
5821dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze    }
5831dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze
5841dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze    @Test
585ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze    public void testResourceProvider_resourceRowInserted() {
5863f3b547e4a2eeeb362d9b7c98b05f9a244cd754eMatthew Fritze        SearchIndexableResource resource = getFakeResource(0);
5871dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        resource.className = "com.android.settings.LegalSettings";
5881dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze
589ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        mManager.indexOneSearchIndexableData(mDb, localeStr, resource, new HashMap<>());
5901dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        Cursor cursor = mDb.rawQuery("SELECT * FROM prefs_index", null);
5913f3b547e4a2eeeb362d9b7c98b05f9a244cd754eMatthew Fritze        assertThat(cursor.getCount()).isEqualTo(6);
5921dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze    }
5931dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze
5941dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze    @Test
595ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze    public void testResourceProvider_resourceRowMatches() {
5963f3b547e4a2eeeb362d9b7c98b05f9a244cd754eMatthew Fritze        SearchIndexableResource resource = getFakeResource(0);
5973f3b547e4a2eeeb362d9b7c98b05f9a244cd754eMatthew Fritze        resource.className = "com.android.settings.display.ScreenZoomSettings";
5981dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze
599ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        mManager.indexOneSearchIndexableData(mDb, localeStr, resource, new HashMap<>());
6001dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        Cursor cursor = mDb.rawQuery("SELECT * FROM prefs_index ORDER BY data_title", null);
6011dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        cursor.moveToPosition(0);
6021dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze
6031dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Locale
6041dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getString(0)).isEqualTo(localeStr);
6051dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Data Rank
6061dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getInt(1)).isEqualTo(rank);
6071dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Data Title
6083f3b547e4a2eeeb362d9b7c98b05f9a244cd754eMatthew Fritze        assertThat(cursor.getString(2)).isEqualTo("Display size");
6091dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Normalized Title
6103f3b547e4a2eeeb362d9b7c98b05f9a244cd754eMatthew Fritze        assertThat(cursor.getString(3)).isEqualTo("display size");
6111dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Summary On
6121dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getString(4)).isEmpty();
6131dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Summary On Normalized
6141dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getString(5)).isEmpty();
6151dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Summary Off - only on for checkbox preferences
6161dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getString(6)).isEmpty();
6171dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Summary off normalized - only on for checkbox preferences
6181dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getString(7)).isEmpty();
6191dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Entries - only on for list preferences
6201dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getString(8)).isNull();
6211dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Keywords
6223f3b547e4a2eeeb362d9b7c98b05f9a244cd754eMatthew Fritze        assertThat(cursor.getString(9)).isEqualTo(
6233f3b547e4a2eeeb362d9b7c98b05f9a244cd754eMatthew Fritze                "display density screen zoom scale scaling");
6241dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Screen Title
6253f3b547e4a2eeeb362d9b7c98b05f9a244cd754eMatthew Fritze        assertThat(cursor.getString(10)).isEqualTo("Display size");
6261dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Class Name
6271dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getString(11))
6283f3b547e4a2eeeb362d9b7c98b05f9a244cd754eMatthew Fritze                .isEqualTo("com.android.settings.display.ScreenZoomSettings");
6291dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Icon
6301dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getInt(12)).isEqualTo(iconResId);
6311dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Intent Action
6321dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getString(13)).isNull();
6331dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Target Package
6341dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getString(14)).isNull();
6351dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Target Class
6361dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getString(15)).isNull();
6371dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Enabled
6381dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getInt(16) == 1).isEqualTo(enabled);
6391dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Data ref key
6401dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getString(17)).isNull();
6411dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // User Id
6421dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getInt(18)).isEqualTo(userId);
6431dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Payload Type - default is 0
6441dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getInt(19)).isEqualTo(0);
6451dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Payload - should be updated to real payloads as controllers are added
6461dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getBlob(20)).isNull();
6471dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze    }
6481dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze
6493f3b547e4a2eeeb362d9b7c98b05f9a244cd754eMatthew Fritze    @Test
650ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze    public void testResourceProvider_disabledResource_rowsInserted() {
6513f3b547e4a2eeeb362d9b7c98b05f9a244cd754eMatthew Fritze        SearchIndexableResource resource = getFakeResource(0);
6523f3b547e4a2eeeb362d9b7c98b05f9a244cd754eMatthew Fritze        resource.className = "com.android.settings.LegalSettings";
6533f3b547e4a2eeeb362d9b7c98b05f9a244cd754eMatthew Fritze
6543f3b547e4a2eeeb362d9b7c98b05f9a244cd754eMatthew Fritze        mManager.indexOneSearchIndexableData(mDb, localeStr, resource,
655ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze                new HashMap<String, Set<String>>());
6563f3b547e4a2eeeb362d9b7c98b05f9a244cd754eMatthew Fritze
6573f3b547e4a2eeeb362d9b7c98b05f9a244cd754eMatthew Fritze        Cursor cursor = mDb.rawQuery("SELECT * FROM prefs_index WHERE enabled = 1", null);
6583f3b547e4a2eeeb362d9b7c98b05f9a244cd754eMatthew Fritze        assertThat(cursor.getCount()).isEqualTo(2);
6593f3b547e4a2eeeb362d9b7c98b05f9a244cd754eMatthew Fritze        cursor = mDb.rawQuery("SELECT * FROM prefs_index WHERE enabled = 0", null);
6603f3b547e4a2eeeb362d9b7c98b05f9a244cd754eMatthew Fritze        assertThat(cursor.getCount()).isEqualTo(4);
6613f3b547e4a2eeeb362d9b7c98b05f9a244cd754eMatthew Fritze    }
6623f3b547e4a2eeeb362d9b7c98b05f9a244cd754eMatthew Fritze
66304615bc1b6a10edad13754c9e6be1197ad150901Matthew Fritze    @Test
664ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze    public void testResource_withTitleAndSettingName_titleNotInserted() {
66504615bc1b6a10edad13754c9e6be1197ad150901Matthew Fritze        SearchIndexableResource resource = getFakeResource(R.xml.swipe_to_notification_settings);
66604615bc1b6a10edad13754c9e6be1197ad150901Matthew Fritze        mManager.indexFromResource(mDb, localeStr, resource, new ArrayList<String>());
66704615bc1b6a10edad13754c9e6be1197ad150901Matthew Fritze
66804615bc1b6a10edad13754c9e6be1197ad150901Matthew Fritze        Cursor cursor = mDb.rawQuery("SELECT * FROM prefs_index WHERE" +
66904615bc1b6a10edad13754c9e6be1197ad150901Matthew Fritze                " enabled = 1", null);
67004615bc1b6a10edad13754c9e6be1197ad150901Matthew Fritze        assertThat(cursor.getCount()).isEqualTo(1);
67104615bc1b6a10edad13754c9e6be1197ad150901Matthew Fritze    }
67204615bc1b6a10edad13754c9e6be1197ad150901Matthew Fritze
673ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze    // Test new public indexing flow
674ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze
675ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze    @Test
676a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze    @Config(shadows = {ShadowDatabaseIndexingUtils.class,})
677ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze    public void testPerformIndexing_fullIndex_getsDataFromProviders() {
678ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        DummyProvider provider = new DummyProvider();
679ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        provider.onCreate();
680a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze        ShadowContentResolver.registerProvider(AUTHORITY_ONE, provider);
681ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze
682ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        // Test that Indexables are added for Full indexing
683ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        when(mPackageManager.queryIntentContentProviders(any(Intent.class), anyInt()))
684ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze                .thenReturn(getDummyResolveInfo());
685ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze
686ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        DatabaseIndexingManager manager =
687a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze                spy(new DatabaseIndexingManager(mContext, PACKAGE_ONE));
688a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze        doReturn(true).when(manager).isFullIndex(anyString(), anyString());
689ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze
690ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        manager.performIndexing();
691ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze
692a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze        verify(manager).addIndexablesFromRemoteProvider(PACKAGE_ONE, AUTHORITY_ONE);
693a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze        verify(manager).updateDatabase(true /* isFullIndex */, Locale.getDefault().toString());
694a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze    }
695ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze
696a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze    @Test
697a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze    @Config(shadows = {ShadowDatabaseIndexingUtils.class,})
698a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze    public void testPerformIndexing_incrementalIndex_noDataAdded() {
699a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze        DummyProvider provider = new DummyProvider();
700a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze        provider.onCreate();
701a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze        ShadowContentResolver.registerProvider(AUTHORITY_ONE, provider);
702ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze
703a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze        // Test that Indexables are added for Full indexing
704a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze        when(mPackageManager.queryIntentContentProviders(any(Intent.class), anyInt()))
705a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze                .thenReturn(getDummyResolveInfo());
706a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze
707a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze        DatabaseIndexingManager manager =
708a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze                spy(new DatabaseIndexingManager(mContext, PACKAGE_ONE));
709a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze        doReturn(false).when(manager).isFullIndex(anyString(), anyString());
710a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze
711a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze        manager.mDataToProcess.dataToUpdate.clear();
712a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze
713a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze        manager.performIndexing();
714a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze
715a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze        verify(manager, times(0)).addDataToDatabase(any(SQLiteDatabase.class), anyString(),
716a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze                anyList(), anyMap());
717a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze        verify(manager, times(0)).addIndexablesFromRemoteProvider(PACKAGE_ONE, AUTHORITY_ONE);
718a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze        verify(manager).updateDataInDatabase(any(SQLiteDatabase.class), anyMap());
719ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze    }
720ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze
721ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze    @Test
722a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze    @Config(shadows = {ShadowDatabaseIndexingUtils.class,})
723a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze    public void testPerformIndexing_localeChanged_databaseDropped() {
724a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze        DummyProvider provider = new DummyProvider();
725a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze        provider.onCreate();
726a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze        ShadowContentResolver.registerProvider(AUTHORITY_ONE, provider);
727a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze
728a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze        // Test that Indexables are added for Full indexing
729a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze        when(mPackageManager.queryIntentContentProviders(any(Intent.class), anyInt()))
730a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze                .thenReturn(getDummyResolveInfo());
731a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze
732a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze        // Initialize the Manager
733a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze        DatabaseIndexingManager manager =
734a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze                spy(new DatabaseIndexingManager(mContext, PACKAGE_ONE));
735a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze        doReturn(true).when(manager).isFullIndex(anyString(), anyString());
736a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze
737a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze        // Insert data point which will be dropped
738a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze        final String oldTitle = "This is French";
739a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze        insertSpecialCase(oldTitle, true, "key");
740a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze
741a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze        // Add a data point to be added by the indexing
742a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze        SearchIndexableRaw raw = new SearchIndexableRaw(mContext);
743a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze        final String newTitle = "This is English";
744a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze        raw.title = newTitle;
745a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze        manager.mDataToProcess.dataToUpdate.add(raw);
746a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze
747a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze        manager.performIndexing();
748a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze
749a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze        // Assert that the New Title is inserted
750a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze        final Cursor newCursor = mDb.rawQuery("SELECT * FROM prefs_index WHERE data_title = '" +
751a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze                newTitle + "'", null);
752a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze        assertThat(newCursor.getCount()).isEqualTo(1);
753a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze
754a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze        // Assert that the Old Title is no longer in the database, since it was dropped
755a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze        final Cursor oldCursor = mDb.rawQuery("SELECT * FROM prefs_index WHERE data_title = '" +
756a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze                oldTitle + "'", null);
757a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze        assertThat(oldCursor.getCount()).isEqualTo(0);
758a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze    }
759a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze
760a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze    @Test
761a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze    @Config(shadows = {ShadowDatabaseIndexingUtils.class,})
762a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze    public void testPerformIndexing_onOta_FullIndex() {
763ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        DummyProvider provider = new DummyProvider();
764ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        provider.onCreate();
765ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        ShadowContentResolver.registerProvider(
766ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze                AUTHORITY_ONE, provider
767ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        );
768ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze
769ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        // Test that Indexables are added for Full indexing
770ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        when(mPackageManager.queryIntentContentProviders(any(Intent.class), anyInt()))
771ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze                .thenReturn(getDummyResolveInfo());
772ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze
773ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        DatabaseIndexingManager manager =
774a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze                spy(new DatabaseIndexingManager(mContext, PACKAGE_ONE));
775a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze        doReturn(true).when(manager).isFullIndex(anyString(), anyString());
776ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze
777ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        manager.performIndexing();
778ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze
779a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze        verify(manager).updateDatabase(true /* isFullIndex */, Locale.getDefault().toString());
780a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze    }
781ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze
782a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze    @Test
783a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze    @Config(shadows = {ShadowDatabaseIndexingUtils.class,})
784a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze    public void testPerformIndexing_onOta_buildNumberIsCached() {
785a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze        DummyProvider provider = new DummyProvider();
786a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze        provider.onCreate();
787a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze        ShadowContentResolver.registerProvider(
788a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze                AUTHORITY_ONE, provider
789a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze        );
790a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze
791a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze        // Test that Indexables are added for Full indexing
792a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze        when(mPackageManager.queryIntentContentProviders(any(Intent.class), anyInt()))
793a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze                .thenReturn(getDummyResolveInfo());
794a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze
795a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze        DatabaseIndexingManager manager =
796a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze                spy(new DatabaseIndexingManager(mContext, PACKAGE_ONE));
797a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze        doReturn(true).when(manager).isFullIndex(anyString(), anyString());
798a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze
799a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze        manager.performIndexing();
800a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze
801a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze        assertThat(IndexDatabaseHelper.getInstance(mContext).isBuildIndexed(mContext,
802a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze                Build.FINGERPRINT)).isTrue();
803ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze    }
804ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze
805ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze    @Test
806ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze    public void testFullUpdatedDatabase_noData_addDataToDatabaseNotCalled() {
807a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze        mManager.updateDatabase(true /* isFullIndex */, localeStr);
808ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        mManager.mDataToProcess.dataToUpdate.clear();
809ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        verify(mManager, times(0)).addDataToDatabase(any(SQLiteDatabase.class), anyString(),
810ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze                anyList(), anyMap());
811ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze    }
812ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze
813ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze    @Test
814ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze    public void testFullUpdatedDatabase_updatedDataInDatabaseNotCalled() {
815a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze        mManager.updateDatabase(true /* isFullIndex */, localeStr);
816ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        verify(mManager, times(0)).updateDataInDatabase(any(SQLiteDatabase.class), anyMap());
817ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze    }
818ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze
819ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze    @Test
8208a42b074a7ccaf8325b571d261fda5b9a494a059Matthew Fritze    public void testLocaleUpdated_afterIndexing_localeNotAdded() {
821a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze        mManager.updateDatabase(true /* isFullIndex */, localeStr);
822ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        assertThat(IndexDatabaseHelper.getInstance(mContext)
8238a42b074a7ccaf8325b571d261fda5b9a494a059Matthew Fritze                .isLocaleAlreadyIndexed(mContext, localeStr)).isFalse();
8248a42b074a7ccaf8325b571d261fda5b9a494a059Matthew Fritze    }
8258a42b074a7ccaf8325b571d261fda5b9a494a059Matthew Fritze
8268a42b074a7ccaf8325b571d261fda5b9a494a059Matthew Fritze    @Test
8278a42b074a7ccaf8325b571d261fda5b9a494a059Matthew Fritze    public void testLocaleUpdated_afterFullIndexing_localeAdded() {
8288a42b074a7ccaf8325b571d261fda5b9a494a059Matthew Fritze        mManager.performIndexing();
8298a42b074a7ccaf8325b571d261fda5b9a494a059Matthew Fritze        assertThat(IndexDatabaseHelper.getInstance(mContext)
830ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze                .isLocaleAlreadyIndexed(mContext, localeStr)).isTrue();
831ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze    }
832ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze
833ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze    @Test
834ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze    public void testUpdateDatabase_newEligibleData_addedToDatabase() {
835ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        // Test that addDataToDatabase is called when dataToUpdate is non-empty
836ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        mManager.mDataToProcess.dataToUpdate.add(getFakeRaw());
837a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze        mManager.updateDatabase(true /* isFullIndex */, localeStr);
838ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze
839ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        Cursor cursor = mDb.rawQuery("SELECT * FROM prefs_index", null);
840ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        cursor.moveToPosition(0);
841ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze
842ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        // Locale
843ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        assertThat(cursor.getString(0)).isEqualTo(localeStr);
844ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        // Data Rank
845ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        assertThat(cursor.getInt(1)).isEqualTo(rank);
846ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        // Data Title
847ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        assertThat(cursor.getString(2)).isEqualTo(updatedTitle);
848ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        // Normalized Title
849ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        assertThat(cursor.getString(3)).isEqualTo(normalizedTitle);
850ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        // Summary On
851ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        assertThat(cursor.getString(4)).isEqualTo(updatedSummaryOn);
852ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        // Summary On Normalized
853ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        assertThat(cursor.getString(5)).isEqualTo(normalizedSummaryOn);
854ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        // Summary Off
855ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        assertThat(cursor.getString(6)).isEqualTo(updatedSummaryOff);
856ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        // Summary off normalized
857ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        assertThat(cursor.getString(7)).isEqualTo(normalizedSummaryOff);
858ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        // Entries
859ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        assertThat(cursor.getString(8)).isEqualTo(entries);
860ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        // Keywords
861ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        assertThat(cursor.getString(9)).isEqualTo(spaceDelimittedKeywords);
862ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        // Screen Title
863ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        assertThat(cursor.getString(10)).isEqualTo(screenTitle);
864ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        // Class Name
865ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        assertThat(cursor.getString(11)).isEqualTo(className);
866ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        // Icon
867ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        assertThat(cursor.getInt(12)).isEqualTo(iconResId);
868ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        // Intent Action
869ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        assertThat(cursor.getString(13)).isEqualTo(action);
870ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        // Target Package
871ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        assertThat(cursor.getString(14)).isEqualTo(targetPackage);
872ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        // Target Class
873ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        assertThat(cursor.getString(15)).isEqualTo(targetClass);
874ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        // Enabled
875ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        assertThat(cursor.getInt(16) == 1).isEqualTo(enabled);
876ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        // Data ref key
877ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        assertThat(cursor.getString(17)).isNotNull();
878ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        // User Id
879ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        assertThat(cursor.getInt(18)).isEqualTo(userId);
880ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        // Payload Type - default is 0
881ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        assertThat(cursor.getInt(19)).isEqualTo(0);
882ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        // Payload
883ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        assertThat(cursor.getBlob(20)).isNull();
884ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze    }
885ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze
886ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze    @Test
887ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze    public void testUpdateDataInDatabase_enabledResultsAreNonIndexable_becomeDisabled() {
888ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        // Both results are enabled, and then TITLE_ONE gets disabled.
889ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        final boolean enabled = true;
890ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        insertSpecialCase(TITLE_ONE, enabled, KEY_ONE);
891ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        insertSpecialCase(TITLE_TWO, enabled, KEY_TWO);
892ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        Map<String, Set<String>> niks = new ArrayMap<>();
893ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        Set<String> keys = new HashSet<>();
894ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        keys.add(KEY_ONE);
895ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        niks.put(targetPackage, keys);
896ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze
897ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        mManager.updateDataInDatabase(mDb, niks);
898ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze
899ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        Cursor cursor = mDb.rawQuery("SELECT * FROM prefs_index WHERE enabled = 0", null);
900ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        cursor.moveToPosition(0);
901ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze
902ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        assertThat(cursor.getString(2)).isEqualTo(TITLE_ONE);
903ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze    }
904ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze
905ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze    @Test
9064f198813ed0d513ddb1461315bae1c881904ebf0Matthew Fritze    public void testUpdateDataInDatabase_disabledResultsAreIndexable_becomeEnabled() {
907ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        // Both results are initially disabled, and then TITLE_TWO gets enabled.
908ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        final boolean enabled = false;
909ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        insertSpecialCase(TITLE_ONE, enabled, KEY_ONE);
910ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        insertSpecialCase(TITLE_TWO, enabled, KEY_TWO);
911ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        Map<String, Set<String>> niks = new ArrayMap<>();
912ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        Set<String> keys = new HashSet<>();
913ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        keys.add(KEY_ONE);
914ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        niks.put(targetPackage, keys);
915ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze
916ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        mManager.updateDataInDatabase(mDb, niks);
917ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze
918ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        Cursor cursor = mDb.rawQuery("SELECT * FROM prefs_index WHERE enabled = 1", null);
919ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        cursor.moveToPosition(0);
920ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze
921ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        assertThat(cursor.getString(2)).isEqualTo(TITLE_TWO);
922ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze    }
923ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze
9244f198813ed0d513ddb1461315bae1c881904ebf0Matthew Fritze    @Test
9254f198813ed0d513ddb1461315bae1c881904ebf0Matthew Fritze    @Config(shadows = {ShadowContentResolver.class})
9264f198813ed0d513ddb1461315bae1c881904ebf0Matthew Fritze    public void testEmptyNonIndexableKeys_emptyDataKeyResources_addedToDatabase() {
9274f198813ed0d513ddb1461315bae1c881904ebf0Matthew Fritze        insertSpecialCase(TITLE_ONE, true /* enabled */, null /* dataReferenceKey */);
9284f198813ed0d513ddb1461315bae1c881904ebf0Matthew Fritze
9294f198813ed0d513ddb1461315bae1c881904ebf0Matthew Fritze        mManager.updateDatabase(false, localeStr);
9304f198813ed0d513ddb1461315bae1c881904ebf0Matthew Fritze
9314f198813ed0d513ddb1461315bae1c881904ebf0Matthew Fritze        Cursor cursor = mDb.rawQuery("SELECT * FROM prefs_index WHERE enabled = 1", null);
9324f198813ed0d513ddb1461315bae1c881904ebf0Matthew Fritze        cursor.moveToPosition(0);
9334f198813ed0d513ddb1461315bae1c881904ebf0Matthew Fritze        assertThat(cursor.getCount()).isEqualTo(1);
9344f198813ed0d513ddb1461315bae1c881904ebf0Matthew Fritze        assertThat(cursor.getString(2)).isEqualTo(TITLE_ONE);
9354f198813ed0d513ddb1461315bae1c881904ebf0Matthew Fritze    }
9361dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze    // Util functions
9371dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze
9381dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze    private SearchIndexableRaw getFakeRaw() {
9391dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        return getFakeRaw(localeStr);
9401dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze    }
9411dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze
9421dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze    private SearchIndexableRaw getFakeRaw(String localeStr) {
9431dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        SearchIndexableRaw data = new SearchIndexableRaw(mContext);
9441dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        data.locale = new Locale(localeStr);
9451dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        data.rank = rank;
9461dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        data.title = title;
9471dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        data.summaryOn = summaryOn;
9481dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        data.summaryOff = summaryOff;
9491dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        data.entries = entries;
9501dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        data.keywords = keywords;
9511dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        data.screenTitle = screenTitle;
9521dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        data.className = className;
9531dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        data.packageName = packageName;
9541dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        data.iconResId = iconResId;
9551dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        data.intentAction = action;
9561dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        data.intentTargetPackage = targetPackage;
9571dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        data.intentTargetClass = targetClass;
9581dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        data.key = key;
9591dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        data.userId = userId;
9601dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        data.enabled = enabled;
9611dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        return data;
9621dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze    }
9631dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze
9641dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze    private SearchIndexableResource getFakeResource(int xml) {
9651dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        SearchIndexableResource sir = new SearchIndexableResource(mContext);
9661dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        sir.rank = rank;
9671dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        sir.xmlResId = xml;
9681dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        sir.className = className;
9691dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        sir.packageName = packageName;
9701dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        sir.iconResId = iconResId;
9711dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        sir.intentAction = action;
9721dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        sir.intentTargetPackage = targetPackage;
9731dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        sir.intentTargetClass = targetClass;
9741dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        sir.enabled = enabled;
9751dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        return sir;
9761dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze    }
9773f3b547e4a2eeeb362d9b7c98b05f9a244cd754eMatthew Fritze
978ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze    private Map<String, Set<String>> getNonIndexableKeys(String[] keys) {
979ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        Map<String, Set<String>> niks = new HashMap<>();
980ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        Set<String> keysList = new HashSet<>();
981ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        keysList.addAll(Arrays.asList(keys));
9823f3b547e4a2eeeb362d9b7c98b05f9a244cd754eMatthew Fritze        niks.put(packageName, keysList);
9833f3b547e4a2eeeb362d9b7c98b05f9a244cd754eMatthew Fritze        return niks;
9843f3b547e4a2eeeb362d9b7c98b05f9a244cd754eMatthew Fritze    }
985ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze
986ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze    private List<ResolveInfo> getDummyResolveInfo() {
987ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        List<ResolveInfo> infoList = new ArrayList<>();
988ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        ResolveInfo info = new ResolveInfo();
989ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        info.providerInfo = new ProviderInfo();
990ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        info.providerInfo.exported = true;
991ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        info.providerInfo.authority = AUTHORITY_ONE;
992ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        info.providerInfo.packageName = PACKAGE_ONE;
993ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        infoList.add(info);
994ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze
995ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        return infoList;
996ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze    }
997ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze
998ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze    // TODO move this method and its counterpart in CursorToSearchResultConverterTest into
999ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze    // a util class with public fields to assert values.
1000ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze    private Cursor getDummyCursor() {
10014f198813ed0d513ddb1461315bae1c881904ebf0Matthew Fritze        MatrixCursor cursor = new MatrixCursor(INDEXABLES_RAW_COLUMNS);
1002ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        final String BLANK = "";
1003ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze
1004ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        ArrayList<String> item =
10054f198813ed0d513ddb1461315bae1c881904ebf0Matthew Fritze                new ArrayList<>(INDEXABLES_RAW_COLUMNS.length);
1006ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        item.add("42"); // Rank
1007ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        item.add(TITLE_ONE); // Title
1008ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        item.add(BLANK); // Summary on
1009ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        item.add(BLANK); // summary off
1010ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        item.add(BLANK); // entries
1011ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        item.add(BLANK); // keywords
1012ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        item.add(BLANK); // screen title
1013ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        item.add(BLANK); // classname
1014ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        item.add("123"); // Icon
1015ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        item.add(BLANK); // Intent action
1016ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        item.add(BLANK); // target package
1017ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        item.add(BLANK); // target class
1018ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        item.add(KEY_ONE); // Key
1019ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        item.add("-1"); // userId
1020ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        cursor.addRow(item);
1021ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze
1022ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        return cursor;
1023ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze    }
1024ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze
1025ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze    private void insertSpecialCase(String specialCase, boolean enabled, String key) {
1026ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze
1027ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        ContentValues values = new ContentValues();
1028ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        values.put(IndexDatabaseHelper.IndexColumns.DOCID, specialCase.hashCode());
1029ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        values.put(IndexDatabaseHelper.IndexColumns.LOCALE, localeStr);
1030ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        values.put(IndexDatabaseHelper.IndexColumns.DATA_RANK, 1);
1031ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        values.put(IndexDatabaseHelper.IndexColumns.DATA_TITLE, specialCase);
1032ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        values.put(IndexDatabaseHelper.IndexColumns.DATA_TITLE_NORMALIZED, "");
1033ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        values.put(IndexDatabaseHelper.IndexColumns.DATA_SUMMARY_ON, "");
1034ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        values.put(IndexDatabaseHelper.IndexColumns.DATA_SUMMARY_ON_NORMALIZED, "");
1035ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        values.put(IndexDatabaseHelper.IndexColumns.DATA_SUMMARY_OFF, "");
1036ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        values.put(IndexDatabaseHelper.IndexColumns.DATA_SUMMARY_OFF_NORMALIZED, "");
1037ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        values.put(IndexDatabaseHelper.IndexColumns.DATA_ENTRIES, "");
1038ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        values.put(IndexDatabaseHelper.IndexColumns.DATA_KEYWORDS, "");
1039ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        values.put(IndexDatabaseHelper.IndexColumns.CLASS_NAME, "");
1040ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        values.put(IndexDatabaseHelper.IndexColumns.SCREEN_TITLE, "Moves");
1041ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        values.put(IndexDatabaseHelper.IndexColumns.INTENT_ACTION, "");
1042ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        values.put(IndexDatabaseHelper.IndexColumns.INTENT_TARGET_PACKAGE, targetPackage);
1043ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        values.put(IndexDatabaseHelper.IndexColumns.INTENT_TARGET_CLASS, "");
1044ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        values.put(IndexDatabaseHelper.IndexColumns.ICON, "");
1045ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        values.put(IndexDatabaseHelper.IndexColumns.ENABLED, enabled);
1046ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        values.put(IndexDatabaseHelper.IndexColumns.DATA_KEY_REF, key);
1047ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        values.put(IndexDatabaseHelper.IndexColumns.USER_ID, 0);
1048ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        values.put(IndexDatabaseHelper.IndexColumns.PAYLOAD_TYPE, 0);
1049ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        values.put(IndexDatabaseHelper.IndexColumns.PAYLOAD, (String) null);
1050ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze
1051ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        mDb.replaceOrThrow(IndexDatabaseHelper.Tables.TABLE_PREFS_INDEX, null, values);
1052ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze    }
1053ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze
1054ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze    private class DummyProvider extends ContentProvider {
1055ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze
1056ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        @Override
1057ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        public boolean onCreate() {
1058ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze            return false;
1059ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        }
1060ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze
1061ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        @Override
1062ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        public Cursor query(@NonNull Uri uri, @Nullable String[] projection,
1063ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze                @Nullable String selection, @Nullable String[] selectionArgs,
1064ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze                @Nullable String sortOrder) {
1065ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze            if (uri.toString().contains("xml")) {
1066ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze                return null;
1067ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze            }
1068ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze            return getDummyCursor();
1069ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        }
1070ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze
1071ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        @Override
1072ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        public String getType(@NonNull Uri uri) {
1073ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze            return null;
1074ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        }
1075ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze
1076ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        @Override
1077ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        public Uri insert(@NonNull Uri uri, @Nullable ContentValues values) {
1078ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze            return null;
1079ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        }
1080ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze
1081ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        @Override
1082ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        public int delete(@NonNull Uri uri, @Nullable String selection,
1083ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze                @Nullable String[] selectionArgs) {
1084ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze            return 0;
1085ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        }
1086ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze
1087ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        @Override
1088ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        public int update(@NonNull Uri uri, @Nullable ContentValues values,
1089ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze                @Nullable String selection, @Nullable String[] selectionArgs) {
1090ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze            return 0;
1091ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        }
1092ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze    }
1093a9831d40d081cc8c7ca32891e64c09b5e1d19abbPhilip Quinn}
1094