DatabaseIndexingManagerTest.java revision 98a9e42c93deaf5bb5f3028971065cc910e8d51f
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
182078bc2358031ef3a191900d9036daf4251911c1Matthew Fritzepackage com.android.settings.search;
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;
36012028e3a320dd3eeca3c39f0e47c1c40697bdf6Fan Zhang
371dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritzeimport com.android.settings.R;
3898a9e42c93deaf5bb5f3028971065cc910e8d51fMatthew Fritzeimport com.android.settings.testutils.FakeFeatureFactory;
399f1e911759dc6fedaac9fa65afb79f6a93022bf4Andrew Sappersteinimport com.android.settings.testutils.SettingsRobolectricTestRunner;
401dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritzeimport com.android.settings.TestConfig;
41a8b089db8a6d495a18dc3ad91d3bd84b042fb004Fan Zhangimport com.android.settings.testutils.DatabaseTestUtils;
42ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritzeimport com.android.settings.testutils.shadow.ShadowDatabaseIndexingUtils;
43ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritzeimport com.android.settings.testutils.shadow.ShadowRunnableAsyncTask;
44012028e3a320dd3eeca3c39f0e47c1c40697bdf6Fan Zhang
451dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritzeimport org.junit.After;
461dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritzeimport org.junit.Before;
471dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritzeimport org.junit.Test;
481dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritzeimport org.junit.runner.RunWith;
49ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritzeimport org.mockito.Mock;
50ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritzeimport org.mockito.MockitoAnnotations;
51be0989cc615724f07f5717c9bf17e12560872bb4Matthew Fritzeimport org.robolectric.Robolectric;
52ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritzeimport org.robolectric.RuntimeEnvironment;
531dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritzeimport org.robolectric.annotation.Config;
54ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritzeimport org.robolectric.shadows.ShadowContentResolver;
551dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze
561dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritzeimport java.util.ArrayList;
571dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritzeimport java.util.Arrays;
581dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritzeimport java.util.HashMap;
59ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritzeimport java.util.HashSet;
601dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritzeimport java.util.List;
611dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritzeimport java.util.Locale;
623f3b547e4a2eeeb362d9b7c98b05f9a244cd754eMatthew Fritzeimport java.util.Map;
63ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritzeimport java.util.Set;
641dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze
654f198813ed0d513ddb1461315bae1c881904ebf0Matthew Fritzeimport static android.provider.SearchIndexablesContract.INDEXABLES_RAW_COLUMNS;
661dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritzeimport static com.google.common.truth.Truth.assertThat;
67ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritzeimport static org.mockito.Matchers.any;
68ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritzeimport static org.mockito.Matchers.anyInt;
69ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritzeimport static org.mockito.Matchers.anyList;
70ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritzeimport static org.mockito.Matchers.anyMap;
71ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritzeimport static org.mockito.Matchers.anyString;
72be0989cc615724f07f5717c9bf17e12560872bb4Matthew Fritzeimport static org.mockito.Mockito.doNothing;
73ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritzeimport static org.mockito.Mockito.doReturn;
744f198813ed0d513ddb1461315bae1c881904ebf0Matthew Fritzeimport static org.mockito.Mockito.mock;
751dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritzeimport static org.mockito.Mockito.spy;
76ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritzeimport static org.mockito.Mockito.times;
77ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritzeimport static org.mockito.Mockito.verify;
78ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritzeimport static org.mockito.Mockito.when;
791dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze
801dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze@RunWith(SettingsRobolectricTestRunner.class)
81ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze@Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION,
82a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze        shadows = {ShadowRunnableAsyncTask.class})
831dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritzepublic class DatabaseIndexingManagerTest {
841dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze    private final String localeStr = "en_US";
851dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze
863f3b547e4a2eeeb362d9b7c98b05f9a244cd754eMatthew Fritze    private final int rank = 8;
871dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze    private final String title = "title\u2011title";
881dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze    private final String updatedTitle = "title-title";
891dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze    private final String normalizedTitle = "titletitle";
901dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze    private final String summaryOn = "summary\u2011on";
911dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze    private final String updatedSummaryOn = "summary-on";
921dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze    private final String normalizedSummaryOn = "summaryon";
931dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze    private final String summaryOff = "summary\u2011off";
94a96b11f65d9f29dd4037da85e12f5cf9dcfa0176Fan Zhang    private final String updatedSummaryOff = "summary-off";
951dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze    private final String normalizedSummaryOff = "summaryoff";
961dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze    private final String entries = "entries";
971dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze    private final String keywords = "keywords, keywordss, keywordsss";
981dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze    private final String spaceDelimittedKeywords = "keywords keywordss keywordsss";
991dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze    private final String screenTitle = "screen title";
1001dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze    private final String className = "class name";
1011dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze    private final int iconResId = 0xff;
1025416a5992bceb91bd3eda63629ba5420a714747bMatthew Fritze    private final int noIcon = 0;
1031dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze    private final String action = "action";
1041dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze    private final String targetPackage = "target package";
1051dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze    private final String targetClass = "target class";
1061dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze    private final String packageName = "package name";
1071dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze    private final String key = "key";
1081dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze    private final int userId = -1;
1091dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze    private final boolean enabled = true;
1101dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze
111ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze    private final String AUTHORITY_ONE = "authority";
112ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze    private final String PACKAGE_ONE = "com.android.settings";
113ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze
114ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze    private final String TITLE_ONE = "title one";
115ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze    private final String TITLE_TWO = "title two";
116ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze    private final String KEY_ONE = "key one";
117ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze    private final String KEY_TWO = "key two";
118ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze
1191dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze    private Context mContext;
120ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze
1211dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze    private DatabaseIndexingManager mManager;
1221dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze    private SQLiteDatabase mDb;
1231dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze
124ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze    @Mock
125ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze    private PackageManager mPackageManager;
126ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze
1271dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze    @Before
1281dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze    public void setUp() {
129ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        MockitoAnnotations.initMocks(this);
130ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        mContext = spy(RuntimeEnvironment.application);
131a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze        mManager = spy(new DatabaseIndexingManager(mContext, PACKAGE_ONE));
1321dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        mDb = IndexDatabaseHelper.getInstance(mContext).getWritableDatabase();
133ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze
134ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        doReturn(mPackageManager).when(mContext).getPackageManager();
13598a9e42c93deaf5bb5f3028971065cc910e8d51fMatthew Fritze        FakeFeatureFactory.setupForTest(mContext);
1361dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze    }
1371dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze
1381dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze    @After
1391dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze    public void cleanUp() {
140012028e3a320dd3eeca3c39f0e47c1c40697bdf6Fan Zhang        DatabaseTestUtils.clearDb(mContext);
1411dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze    }
1421dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze
1431dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze    @Test
1441dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze    public void testDatabaseSchema() {
1451dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        Cursor dbCursor = mDb.query("prefs_index", null, null, null, null, null, null);
1461dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        List<String> columnNames = new ArrayList<>(Arrays.asList(dbCursor.getColumnNames()));
1471dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Note that docid is not included.
148a96b11f65d9f29dd4037da85e12f5cf9dcfa0176Fan Zhang        List<String> expColumnNames = new ArrayList<>(Arrays.asList(new String[]{
1491dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze                "locale",
1501dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze                "data_rank",
1511dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze                "data_title",
1521dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze                "data_title_normalized",
1531dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze                "data_summary_on",
1541dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze                "data_summary_on_normalized",
1551dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze                "data_summary_off",
1561dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze                "data_summary_off_normalized",
1571dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze                "data_entries",
1581dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze                "data_keywords",
1591dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze                "class_name",
1601dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze                "screen_title",
1611dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze                "intent_action",
1621dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze                "intent_target_package",
1631dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze                "intent_target_class",
1641dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze                "icon",
1651dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze                "enabled",
1661dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze                "data_key_reference",
1671dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze                "user_id",
1681dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze                "payload_type",
1691dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze                "payload"
1701dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        }));
1711dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Prevent database schema regressions
1721dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(columnNames).containsAllIn(expColumnNames);
1731dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze    }
1741dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze
1751dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze    // Tests for the flow: IndexOneRaw -> UpdateOneRowWithFilteredData -> UpdateOneRow
1761dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze
1771dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze    @Test
178ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze    public void testInsertRawColumn_rowInserted() {
1791dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        SearchIndexableRaw raw = getFakeRaw();
1801dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        mManager.indexOneSearchIndexableData(mDb, localeStr, raw, null /* Non-indexable keys */);
1811dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        Cursor cursor = mDb.rawQuery("SELECT * FROM prefs_index", null);
1821dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getCount()).isEqualTo(1);
1831dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze    }
1841dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze
1851dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze    @Test
186ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze    public void testInsertRawColumn_rowMatches() {
1871dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        SearchIndexableRaw raw = getFakeRaw();
1881dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        mManager.indexOneSearchIndexableData(mDb, localeStr, raw, null /* Non-indexable keys */);
1891dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        Cursor cursor = mDb.rawQuery("SELECT * FROM prefs_index", null);
1901dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        cursor.moveToPosition(0);
1911dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze
1921dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Locale
1931dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getString(0)).isEqualTo(localeStr);
1941dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Data Rank
1951dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getInt(1)).isEqualTo(raw.rank);
1961dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Data Title
1971dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getString(2)).isEqualTo(updatedTitle);
1981dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Normalized Title
1991dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getString(3)).isEqualTo(normalizedTitle);
2001dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Summary On
2011dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getString(4)).isEqualTo(updatedSummaryOn);
2021dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Summary On Normalized
2031dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getString(5)).isEqualTo(normalizedSummaryOn);
2041dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Summary Off
2051dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getString(6)).isEqualTo(updatedSummaryOff);
2061dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Summary off normalized
2071dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getString(7)).isEqualTo(normalizedSummaryOff);
2081dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Entries
2091dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getString(8)).isEqualTo(raw.entries);
2101dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Keywords
2111dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getString(9)).isEqualTo(spaceDelimittedKeywords);
2121dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Screen Title
2131dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getString(10)).isEqualTo(raw.screenTitle);
2141dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Class Name
2151dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getString(11)).isEqualTo(raw.className);
2161dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Icon
2171dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getInt(12)).isEqualTo(raw.iconResId);
2181dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Intent Action
2191dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getString(13)).isEqualTo(raw.intentAction);
2201dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Target Package
2211dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getString(14)).isEqualTo(raw.intentTargetPackage);
2221dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Target Class
2231dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getString(15)).isEqualTo(raw.intentTargetClass);
2241dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Enabled
2251dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getInt(16) == 1).isEqualTo(raw.enabled);
2261dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Data ref key
2271dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getString(17)).isNotNull();
2281dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // User Id
2291dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getInt(18)).isEqualTo(raw.userId);
2301dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Payload Type - default is 0
2311dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getInt(19)).isEqualTo(0);
2321dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Payload
2333746d9e25f2805b16b69eb7420a629fc66f6a788Matthew Fritze        byte[] payload = cursor.getBlob(20);
2343746d9e25f2805b16b69eb7420a629fc66f6a788Matthew Fritze        ResultPayload unmarshalledPayload = ResultPayloadUtils.unmarshall(payload,
2353746d9e25f2805b16b69eb7420a629fc66f6a788Matthew Fritze                ResultPayload.CREATOR);
2363746d9e25f2805b16b69eb7420a629fc66f6a788Matthew Fritze        assertThat(unmarshalledPayload).isInstanceOf(ResultPayload.class);
2371dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze    }
2381dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze
2391dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze    @Test
240ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze    public void testInsertRawColumn_mismatchedLocale_noRowInserted() {
2411dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        SearchIndexableRaw raw = getFakeRaw("ca-fr");
2421dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        mManager.indexOneSearchIndexableData(mDb, localeStr, raw, null /* Non-indexable keys */);
2431dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        Cursor cursor = mDb.rawQuery("SELECT * FROM prefs_index", null);
2441dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getCount()).isEqualTo(0);
2451dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze    }
2461dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze
2471dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze    // Tests for the flow: IndexOneResource -> IndexFromResource ->
2481dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze    //                     UpdateOneRowWithFilteredData -> UpdateOneRow
2491dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze
2501dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze    @Test
2511dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze    public void testNullResource_NothingInserted() {
2521dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        mManager.indexOneSearchIndexableData(mDb, localeStr, null /* searchIndexableResource */,
253248d95c61809b253eb16fb1d597ed5e2f83ada78Fan Zhang                new HashMap<>());
2541dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        Cursor cursor = mDb.rawQuery("SELECT * FROM prefs_index", null);
2551dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getCount()).isEqualTo(0);
2561dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze    }
2571dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze
2581dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze    @Test
2591dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze    public void testAddResource_RowsInserted() {
260dc9a82f5b017f430aa7d50f12450082f1bdc871eFan Zhang        SearchIndexableResource resource = getFakeResource(R.xml.display_settings);
261ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        mManager.indexOneSearchIndexableData(mDb, localeStr, resource, new HashMap<>());
2621dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        Cursor cursor = mDb.rawQuery("SELECT * FROM prefs_index", null);
263305f900bfa42a4ecc3a7b8d1454331d8ad8d76a9Romain Guy        assertThat(cursor.getCount()).isEqualTo(17);
2641dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze    }
2651dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze
2661dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze    @Test
267ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze    public void testAddResource_withNIKs_rowsInsertedDisabled() {
268dc9a82f5b017f430aa7d50f12450082f1bdc871eFan Zhang        SearchIndexableResource resource = getFakeResource(R.xml.display_settings);
269d299b03f28fd23973b32931c3ae9a254a37d474dDoris Ling        // Only add 2 of 16 items to be disabled.
270d299b03f28fd23973b32931c3ae9a254a37d474dDoris Ling        String[] keys = {"brightness", "wallpaper"};
271ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        Map<String, Set<String>> niks = getNonIndexableKeys(keys);
272ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze
2733f3b547e4a2eeeb362d9b7c98b05f9a244cd754eMatthew Fritze        mManager.indexOneSearchIndexableData(mDb, localeStr, resource, niks);
2743f3b547e4a2eeeb362d9b7c98b05f9a244cd754eMatthew Fritze
2753f3b547e4a2eeeb362d9b7c98b05f9a244cd754eMatthew Fritze        Cursor cursor = mDb.rawQuery("SELECT * FROM prefs_index WHERE enabled = 0", null);
2763f3b547e4a2eeeb362d9b7c98b05f9a244cd754eMatthew Fritze        assertThat(cursor.getCount()).isEqualTo(2);
2773f3b547e4a2eeeb362d9b7c98b05f9a244cd754eMatthew Fritze        cursor = mDb.rawQuery("SELECT * FROM prefs_index WHERE enabled = 1", null);
278305f900bfa42a4ecc3a7b8d1454331d8ad8d76a9Romain Guy        assertThat(cursor.getCount()).isEqualTo(15);
2793f3b547e4a2eeeb362d9b7c98b05f9a244cd754eMatthew Fritze    }
2803f3b547e4a2eeeb362d9b7c98b05f9a244cd754eMatthew Fritze
2813f3b547e4a2eeeb362d9b7c98b05f9a244cd754eMatthew Fritze    @Test
282ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze    public void testAddResourceHeader_rowsMatch() {
2831dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        SearchIndexableResource resource = getFakeResource(R.xml.application_settings);
284ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        mManager.indexOneSearchIndexableData(mDb, localeStr, resource, new HashMap<>());
2851dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze
2861dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        Cursor cursor = mDb.rawQuery("SELECT * FROM prefs_index ORDER BY data_title", null);
2871dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        cursor.moveToPosition(1);
2881dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze
2891dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Locale
2901dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getString(0)).isEqualTo(localeStr);
2911dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Data Rank
2921dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getInt(1)).isEqualTo(rank);
2931dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Data Title
294015a50bef99a23a8c795486b99021a5784d65d64Doris Ling        assertThat(cursor.getString(2)).isEqualTo("App info");
2951dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Normalized Title
296015a50bef99a23a8c795486b99021a5784d65d64Doris Ling        assertThat(cursor.getString(3)).isEqualTo("app info");
2971dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Summary On
2981dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getString(4)).isEqualTo("Manage apps, set up quick launch shortcuts");
2991dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Summary On Normalized
3001dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getString(5)).isEqualTo("manage apps, set up quick launch shortcuts");
3011dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Summary Off - only on for checkbox preferences
3021dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getString(6)).isEmpty();
3031dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Summary off normalized - only on for checkbox preferences
3041dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getString(7)).isEmpty();
3051dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Entries - only on for list preferences
3061dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getString(8)).isNull();
3071dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Keywords
3081dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getString(9)).isEmpty();
3091dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Screen Title
310015a50bef99a23a8c795486b99021a5784d65d64Doris Ling        assertThat(cursor.getString(10)).isEqualTo("App info");
3111dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Class Name
3121dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getString(11)).isEqualTo(className);
3131dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Icon
314d0b42b03229225571ed060a377a0f72264058db6Matthew Fritze        assertThat(cursor.getInt(12)).isEqualTo(0);
3151dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Intent Action
3161dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getString(13)).isEqualTo(action);
3171dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Target Package
3181dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getString(14)).isEqualTo(targetPackage);
3191dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Target Class
3201dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getString(15)).isEqualTo(targetClass);
3211dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Enabled
3221dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getInt(16) == 1).isEqualTo(enabled);
3231dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Data ref key
3241dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getString(17)).isEqualTo("applications_settings");
3251dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // User Id
3261dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getInt(18)).isEqualTo(userId);
3271dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Payload Type - default is 0
3281dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getInt(19)).isEqualTo(0);
3291dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Payload - should be updated to real payloads as controllers are added
3303746d9e25f2805b16b69eb7420a629fc66f6a788Matthew Fritze        byte[] payload = cursor.getBlob(20);
3313746d9e25f2805b16b69eb7420a629fc66f6a788Matthew Fritze        ResultPayload unmarshalledPayload = ResultPayloadUtils.unmarshall(payload,
3323746d9e25f2805b16b69eb7420a629fc66f6a788Matthew Fritze                ResultPayload.CREATOR);
3333746d9e25f2805b16b69eb7420a629fc66f6a788Matthew Fritze        assertThat(unmarshalledPayload).isInstanceOf(ResultPayload.class);
3341dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze    }
3351dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze
3361dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze    @Test
337ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze    public void testAddResource_withChildFragment_shouldUpdateSiteMapDb() {
338f04ff76af05823619f1c522f22d8193edbb56bfaMaurice Lam        // FIXME: This test was failing. (count = 6 at the end)
339f04ff76af05823619f1c522f22d8193edbb56bfaMaurice Lam
340f04ff76af05823619f1c522f22d8193edbb56bfaMaurice Lam//        SearchIndexableResource resource = getFakeResource(R.xml.network_and_internet);
341f04ff76af05823619f1c522f22d8193edbb56bfaMaurice Lam//        mManager.indexOneSearchIndexableData(mDb, localeStr, resource,
342f04ff76af05823619f1c522f22d8193edbb56bfaMaurice Lam//                new HashMap<>());
343f04ff76af05823619f1c522f22d8193edbb56bfaMaurice Lam//        Cursor query = mDb.query(IndexDatabaseHelper.Tables.TABLE_SITE_MAP, SITE_MAP_COLUMNS,
344f04ff76af05823619f1c522f22d8193edbb56bfaMaurice Lam//                null, null, null, null, null);
345f04ff76af05823619f1c522f22d8193edbb56bfaMaurice Lam//        query.moveToPosition(-1);
346f04ff76af05823619f1c522f22d8193edbb56bfaMaurice Lam//        int count = 0;
347f04ff76af05823619f1c522f22d8193edbb56bfaMaurice Lam//        while (query.moveToNext()) {
348f04ff76af05823619f1c522f22d8193edbb56bfaMaurice Lam//            count++;
349f04ff76af05823619f1c522f22d8193edbb56bfaMaurice Lam//            assertThat(query.getString(query.getColumnIndex(SiteMapColumns.PARENT_CLASS)))
350f04ff76af05823619f1c522f22d8193edbb56bfaMaurice Lam//                    .isEqualTo(className);
351f04ff76af05823619f1c522f22d8193edbb56bfaMaurice Lam//            assertThat(query.getString(query.getColumnIndex(SiteMapColumns.PARENT_TITLE)))
352f04ff76af05823619f1c522f22d8193edbb56bfaMaurice Lam//                    .isEqualTo(mContext.getString(R.string.network_dashboard_title));
353f04ff76af05823619f1c522f22d8193edbb56bfaMaurice Lam//            assertThat(query.getString(query.getColumnIndex(SiteMapColumns.CHILD_CLASS)))
354f04ff76af05823619f1c522f22d8193edbb56bfaMaurice Lam//                    .isNotEmpty();
355f04ff76af05823619f1c522f22d8193edbb56bfaMaurice Lam//            assertThat(query.getString(query.getColumnIndex(SiteMapColumns.CHILD_TITLE)))
356f04ff76af05823619f1c522f22d8193edbb56bfaMaurice Lam//                    .isNotEmpty();
357f04ff76af05823619f1c522f22d8193edbb56bfaMaurice Lam//        }
358f04ff76af05823619f1c522f22d8193edbb56bfaMaurice Lam//        assertThat(count).isEqualTo(5);
359a96b11f65d9f29dd4037da85e12f5cf9dcfa0176Fan Zhang    }
360a96b11f65d9f29dd4037da85e12f5cf9dcfa0176Fan Zhang
361a96b11f65d9f29dd4037da85e12f5cf9dcfa0176Fan Zhang    @Test
362ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze    public void testAddResource_customSetting_rowsMatch() {
363d299b03f28fd23973b32931c3ae9a254a37d474dDoris Ling        SearchIndexableResource resource = getFakeResource(R.xml.swipe_to_notification_settings);
364ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        mManager.indexOneSearchIndexableData(mDb, localeStr, resource, new HashMap<>());
365248d95c61809b253eb16fb1d597ed5e2f83ada78Fan Zhang        final String prefTitle =
366248d95c61809b253eb16fb1d597ed5e2f83ada78Fan Zhang                mContext.getString(R.string.fingerprint_swipe_for_notifications_title);
367248d95c61809b253eb16fb1d597ed5e2f83ada78Fan Zhang        final String prefSummary =
368248d95c61809b253eb16fb1d597ed5e2f83ada78Fan Zhang                mContext.getString(R.string.fingerprint_swipe_for_notifications_summary);
36982be5f0c3fa4b9511e1e7e4c4e9c20cf31a8294fFan Zhang        final String keywords = mContext.getString(R.string.keywords_gesture);
370248d95c61809b253eb16fb1d597ed5e2f83ada78Fan Zhang        Cursor cursor = mDb.rawQuery(
371248d95c61809b253eb16fb1d597ed5e2f83ada78Fan Zhang                "SELECT * FROM prefs_index where data_title='" + prefTitle + "'", null);
372248d95c61809b253eb16fb1d597ed5e2f83ada78Fan Zhang        cursor.moveToFirst();
3731dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze
3741dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Locale
3751dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getString(0)).isEqualTo(localeStr);
3761dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Data Rank
3771dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getInt(1)).isEqualTo(rank);
3781dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Data Title
379248d95c61809b253eb16fb1d597ed5e2f83ada78Fan Zhang        assertThat(cursor.getString(2)).isEqualTo(prefTitle);
3801dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Normalized Title
381248d95c61809b253eb16fb1d597ed5e2f83ada78Fan Zhang        assertThat(cursor.getString(3)).isEqualTo(prefTitle.toLowerCase());
3821dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Summary On
383248d95c61809b253eb16fb1d597ed5e2f83ada78Fan Zhang        assertThat(cursor.getString(4)).isEqualTo(prefSummary);
3841dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Summary On Normalized
385248d95c61809b253eb16fb1d597ed5e2f83ada78Fan Zhang        assertThat(cursor.getString(5)).isEqualTo(prefSummary.toLowerCase());
3861dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Summary Off - only on for checkbox preferences
3871dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getString(6)).isEmpty();
3881dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Summary off normalized - only on for checkbox preferences
3891dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getString(7)).isEmpty();
3901dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Entries - only on for list preferences
3911dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getString(8)).isNull();
3921dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Keywords
39382be5f0c3fa4b9511e1e7e4c4e9c20cf31a8294fFan Zhang        assertThat(cursor.getString(9)).isEqualTo(keywords);
3941dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Screen Title
395248d95c61809b253eb16fb1d597ed5e2f83ada78Fan Zhang        assertThat(cursor.getString(10)).isEqualTo(
396d299b03f28fd23973b32931c3ae9a254a37d474dDoris Ling                mContext.getString(R.string.fingerprint_swipe_for_notifications_title));
3971dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Class Name
3981dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getString(11)).isEqualTo(className);
3991dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Icon
4005416a5992bceb91bd3eda63629ba5420a714747bMatthew Fritze        assertThat(cursor.getInt(12)).isEqualTo(noIcon);
4011dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Intent Action
4021dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getString(13)).isEqualTo(action);
4031dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Target Package
4041dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getString(14)).isEqualTo(targetPackage);
4051dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Target Class
4061dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getString(15)).isEqualTo(targetClass);
4071dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Enabled
4081dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getInt(16) == 1).isEqualTo(enabled);
4091dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Data ref key
4101dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getString(17)).isEqualTo("gesture_swipe_down_fingerprint");
4111dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // User Id
4121dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getInt(18)).isEqualTo(userId);
4131dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Payload Type - default is 0
4141dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getInt(19)).isEqualTo(0);
4151dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Payload - should be updated to real payloads as controllers are added
4163746d9e25f2805b16b69eb7420a629fc66f6a788Matthew Fritze        byte[] payload = cursor.getBlob(20);
4173746d9e25f2805b16b69eb7420a629fc66f6a788Matthew Fritze        ResultPayload unmarshalledPayload = ResultPayloadUtils.unmarshall(payload,
4183746d9e25f2805b16b69eb7420a629fc66f6a788Matthew Fritze                ResultPayload.CREATOR);
4193746d9e25f2805b16b69eb7420a629fc66f6a788Matthew Fritze        assertThat(unmarshalledPayload).isInstanceOf(ResultPayload.class);
4201dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze    }
4211dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze
4221dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze    @Test
423ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze    public void testAddResource_checkboxPreference_rowsMatch() {
4241dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        SearchIndexableResource resource = getFakeResource(R.xml.application_settings);
425ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        mManager.indexOneSearchIndexableData(mDb, localeStr, resource, new HashMap<>());
4261dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze
4271dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        /* Should return 6 results, with the following titles:
4281dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze         * Advanced Settings, Apps, Manage Apps, Preferred install location, Running Services
4291dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze         */
4301dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        Cursor cursor = mDb.rawQuery("SELECT * FROM prefs_index ORDER BY data_title", null);
4311dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        cursor.moveToPosition(0);
4321dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Locale
4331dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getString(0)).isEqualTo(localeStr);
4341dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Data Rank
4351dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getInt(1)).isEqualTo(rank);
4361dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Data Title
4371dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getString(2)).isEqualTo("Advanced settings");
4381dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Normalized Title
4391dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getString(3)).isEqualTo("advanced settings");
4401dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Summary On
4411dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getString(4)).isEqualTo("Enable more settings options");
4421dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Summary On Normalized
4431dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getString(5)).isEqualTo("enable more settings options");
4441dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Summary Off
4451dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getString(6)).isEqualTo("Enable more settings options");
4461dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Summary Off
4471dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getString(7)).isEqualTo("enable more settings options");
4481dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Entries - only on for list preferences
4491dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getString(8)).isNull();
4501dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Keywords
4511dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getString(9)).isEmpty();
4521dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Screen Title
453015a50bef99a23a8c795486b99021a5784d65d64Doris Ling        assertThat(cursor.getString(10)).isEqualTo("App info");
4541dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Class Name
4551dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getString(11)).isEqualTo(className);
4561dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Icon
4575416a5992bceb91bd3eda63629ba5420a714747bMatthew Fritze        assertThat(cursor.getInt(12)).isEqualTo(noIcon);
4581dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Intent Action
4591dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getString(13)).isEqualTo(action);
4601dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Target Package
4611dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getString(14)).isEqualTo(targetPackage);
4621dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Target Class
4631dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getString(15)).isEqualTo(targetClass);
4641dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Enabled
4651dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getInt(16) == 1).isEqualTo(enabled);
4661dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Data ref key
4671dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getString(17)).isEqualTo("toggle_advanced_settings");
4681dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // User Id
4691dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getInt(18)).isEqualTo(userId);
4701dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Payload Type - default is 0
4711dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getInt(19)).isEqualTo(0);
4721dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Payload - should be updated to real payloads as controllers are added
4733746d9e25f2805b16b69eb7420a629fc66f6a788Matthew Fritze        byte[] payload = cursor.getBlob(20);
4743746d9e25f2805b16b69eb7420a629fc66f6a788Matthew Fritze        ResultPayload unmarshalledPayload = ResultPayloadUtils.unmarshall(payload,
4753746d9e25f2805b16b69eb7420a629fc66f6a788Matthew Fritze                ResultPayload.CREATOR);
4763746d9e25f2805b16b69eb7420a629fc66f6a788Matthew Fritze        assertThat(unmarshalledPayload).isInstanceOf(ResultPayload.class);
4771dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze    }
4781dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze
4791dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze    @Test
480ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze    public void testAddResource_listPreference_rowsMatch() {
4811dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        SearchIndexableResource resource = getFakeResource(R.xml.application_settings);
482ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        mManager.indexOneSearchIndexableData(mDb, localeStr, resource, new HashMap<>());
4831dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze
4841dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        Cursor cursor = mDb.rawQuery("SELECT * FROM prefs_index ORDER BY data_title", null);
4851dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        cursor.moveToPosition(3);
4861dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Locale
4871dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getString(0)).isEqualTo(localeStr);
4881dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Data Rank
4891dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getInt(1)).isEqualTo(rank);
4901dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Data Title
4911dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getString(2)).isEqualTo("Preferred install location");
4921dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Normalized Title
4931dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getString(3)).isEqualTo("preferred install location");
4941dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Summary On
495a96b11f65d9f29dd4037da85e12f5cf9dcfa0176Fan Zhang        assertThat(cursor.getString(4)).isEqualTo(
496a96b11f65d9f29dd4037da85e12f5cf9dcfa0176Fan Zhang                "Change the preferred installation location for new apps");
4971dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Summary On Normalized
498a96b11f65d9f29dd4037da85e12f5cf9dcfa0176Fan Zhang        assertThat(cursor.getString(5)).isEqualTo(
499a96b11f65d9f29dd4037da85e12f5cf9dcfa0176Fan Zhang                "change the preferred installation location for new apps");
5001dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Summary Off - only on for checkbox preferences
5011dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getString(6)).isEmpty();
5021dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Summary off normalized - only on for checkbox preferences
5031dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getString(7)).isEmpty();
5041dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Entries - only on for list preferences
5051dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getString(8)).isEqualTo("Internal device storage|Removable SD card|" +
506a96b11f65d9f29dd4037da85e12f5cf9dcfa0176Fan Zhang                "Let the system decide|");
5071dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Keywords
5081dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getString(9)).isEmpty();
5091dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Screen Title
510015a50bef99a23a8c795486b99021a5784d65d64Doris Ling        assertThat(cursor.getString(10)).isEqualTo("App info");
5111dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Class Name
5121dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getString(11)).isEqualTo(className);
5131dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Icon
5145416a5992bceb91bd3eda63629ba5420a714747bMatthew Fritze        assertThat(cursor.getInt(12)).isEqualTo(noIcon);
5151dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Intent Action
5161dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getString(13)).isEqualTo(action);
5171dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Target Package
5181dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getString(14)).isEqualTo(targetPackage);
5191dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Target Class
5201dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getString(15)).isEqualTo(targetClass);
5211dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Enabled
5221dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getInt(16) == 1).isEqualTo(enabled);
5231dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Data ref key
5241dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getString(17)).isEqualTo("app_install_location");
5251dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // User Id
5261dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getInt(18)).isEqualTo(userId);
5271dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Payload Type - default is 0
5281dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getInt(19)).isEqualTo(0);
5291dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Payload - should be updated to real payloads as controllers are added
5303746d9e25f2805b16b69eb7420a629fc66f6a788Matthew Fritze        byte[] payload = cursor.getBlob(20);
5313746d9e25f2805b16b69eb7420a629fc66f6a788Matthew Fritze        ResultPayload unmarshalledPayload = ResultPayloadUtils.unmarshall(payload,
5323746d9e25f2805b16b69eb7420a629fc66f6a788Matthew Fritze                ResultPayload.CREATOR);
5333746d9e25f2805b16b69eb7420a629fc66f6a788Matthew Fritze        assertThat(unmarshalledPayload).isInstanceOf(ResultPayload.class);
5341dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze    }
5351dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze
5365416a5992bceb91bd3eda63629ba5420a714747bMatthew Fritze    @Test
5375416a5992bceb91bd3eda63629ba5420a714747bMatthew Fritze    public void testAddResource_iconAddedFromXml() {
5385416a5992bceb91bd3eda63629ba5420a714747bMatthew Fritze        SearchIndexableResource resource = getFakeResource(R.xml.connected_devices);
5395416a5992bceb91bd3eda63629ba5420a714747bMatthew Fritze        mManager.indexOneSearchIndexableData(mDb, localeStr, resource, new HashMap<>());
5405416a5992bceb91bd3eda63629ba5420a714747bMatthew Fritze
5415416a5992bceb91bd3eda63629ba5420a714747bMatthew Fritze        Cursor cursor = mDb.rawQuery("SELECT * FROM prefs_index ORDER BY data_title", null);
5425416a5992bceb91bd3eda63629ba5420a714747bMatthew Fritze        cursor.moveToPosition(0);
5435416a5992bceb91bd3eda63629ba5420a714747bMatthew Fritze
5445416a5992bceb91bd3eda63629ba5420a714747bMatthew Fritze        // Icon
5455416a5992bceb91bd3eda63629ba5420a714747bMatthew Fritze        assertThat(cursor.getInt(12)).isNotEqualTo(noIcon);
5465416a5992bceb91bd3eda63629ba5420a714747bMatthew Fritze    }
5475416a5992bceb91bd3eda63629ba5420a714747bMatthew Fritze
5481dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze    // Tests for the flow: IndexOneResource -> IndexFromProvider -> IndexFromResource ->
5491dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze    //                     UpdateOneRowWithFilteredData -> UpdateOneRow
5501dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze
5511dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze    @Test
552ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze    public void testResourceProvider_rowInserted() {
553d299b03f28fd23973b32931c3ae9a254a37d474dDoris Ling        SearchIndexableResource resource = getFakeResource(R.xml.swipe_to_notification_settings);
5541dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        resource.xmlResId = 0;
5551dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        resource.className = "com.android.settings.display.ScreenZoomSettings";
5561dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze
557ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        mManager.indexOneSearchIndexableData(mDb, localeStr, resource, new HashMap<>());
5581dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        Cursor cursor = mDb.rawQuery("SELECT * FROM prefs_index", null);
5591dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getCount()).isEqualTo(1);
5601dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze    }
5611dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze
5621dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze    @Test
563ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze    public void testResourceProvider_rowMatches() {
564d299b03f28fd23973b32931c3ae9a254a37d474dDoris Ling        SearchIndexableResource resource = getFakeResource(R.xml.swipe_to_notification_settings);
5651dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        resource.xmlResId = 0;
5661dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        resource.className = "com.android.settings.display.ScreenZoomSettings";
5671dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze
568ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        mManager.indexOneSearchIndexableData(mDb, localeStr, resource, new HashMap<>());
5691dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        Cursor cursor = mDb.rawQuery("SELECT * FROM prefs_index", null);
5701dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        cursor.moveToPosition(0);
5711dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze
5721dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Locale
5731dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getString(0)).isEqualTo(localeStr);
5741dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Data Rank
5751dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getInt(1)).isEqualTo(rank);
5761dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Data Title
5771dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getString(2)).isEqualTo("Display size");
5781dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Normalized Title
5791dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getString(3)).isEqualTo("display size");
5801dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Summary On
5811dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getString(4)).isEmpty();
5821dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Summary On Normalized
5831dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getString(5)).isEmpty();
5841dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Summary Off - only on for checkbox preferences
5851dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getString(6)).isEmpty();
5861dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Summary off normalized - only on for checkbox preferences
5871dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getString(7)).isEmpty();
5881dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Entries - only on for list preferences
5891dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getString(8)).isNull();
5901dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Keywords
5911dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getString(9)).isEqualTo("display density screen zoom scale scaling");
5921dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Screen Title
5931dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getString(10)).isEqualTo("Display size");
5941dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Class Name
5951dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getString(11))
5961dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze                .isEqualTo("com.android.settings.display.ScreenZoomSettings");
5971dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Icon
5985416a5992bceb91bd3eda63629ba5420a714747bMatthew Fritze        assertThat(cursor.getInt(12)).isEqualTo(noIcon);
5991dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Intent Action
6001dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getString(13)).isNull();
6011dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Target Package
6021dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getString(14)).isNull();
6031dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Target Class
6041dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getString(15)).isNull();
6051dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Enabled
6061dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getInt(16) == 1).isEqualTo(enabled);
6071dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Data ref key
6081dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getString(17)).isNull();
6091dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // User Id
6101dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getInt(18)).isEqualTo(userId);
6111dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Payload Type - default is 0
6121dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getInt(19)).isEqualTo(0);
6131dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Payload - should be updated to real payloads as controllers are added
6143746d9e25f2805b16b69eb7420a629fc66f6a788Matthew Fritze        byte[] payload = cursor.getBlob(20);
6153746d9e25f2805b16b69eb7420a629fc66f6a788Matthew Fritze        ResultPayload unmarshalledPayload = ResultPayloadUtils.unmarshall(payload,
6163746d9e25f2805b16b69eb7420a629fc66f6a788Matthew Fritze                ResultPayload.CREATOR);
6173746d9e25f2805b16b69eb7420a629fc66f6a788Matthew Fritze        assertThat(unmarshalledPayload).isInstanceOf(ResultPayload.class);
6181dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze    }
6191dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze
6201dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze    @Test
621ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze    public void testResourceProvider_resourceRowInserted() {
6223f3b547e4a2eeeb362d9b7c98b05f9a244cd754eMatthew Fritze        SearchIndexableResource resource = getFakeResource(0);
6231dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        resource.className = "com.android.settings.LegalSettings";
6241dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze
625ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        mManager.indexOneSearchIndexableData(mDb, localeStr, resource, new HashMap<>());
6261dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        Cursor cursor = mDb.rawQuery("SELECT * FROM prefs_index", null);
6273f3b547e4a2eeeb362d9b7c98b05f9a244cd754eMatthew Fritze        assertThat(cursor.getCount()).isEqualTo(6);
6281dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze    }
6291dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze
6301dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze    @Test
631ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze    public void testResourceProvider_resourceRowMatches() {
6323f3b547e4a2eeeb362d9b7c98b05f9a244cd754eMatthew Fritze        SearchIndexableResource resource = getFakeResource(0);
6333f3b547e4a2eeeb362d9b7c98b05f9a244cd754eMatthew Fritze        resource.className = "com.android.settings.display.ScreenZoomSettings";
6341dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze
635ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        mManager.indexOneSearchIndexableData(mDb, localeStr, resource, new HashMap<>());
6361dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        Cursor cursor = mDb.rawQuery("SELECT * FROM prefs_index ORDER BY data_title", null);
6371dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        cursor.moveToPosition(0);
6381dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze
6391dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Locale
6401dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getString(0)).isEqualTo(localeStr);
6411dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Data Rank
6421dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getInt(1)).isEqualTo(rank);
6431dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Data Title
6443f3b547e4a2eeeb362d9b7c98b05f9a244cd754eMatthew Fritze        assertThat(cursor.getString(2)).isEqualTo("Display size");
6451dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Normalized Title
6463f3b547e4a2eeeb362d9b7c98b05f9a244cd754eMatthew Fritze        assertThat(cursor.getString(3)).isEqualTo("display size");
6471dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Summary On
6481dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getString(4)).isEmpty();
6491dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Summary On Normalized
6501dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getString(5)).isEmpty();
6511dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Summary Off - only on for checkbox preferences
6521dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getString(6)).isEmpty();
6531dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Summary off normalized - only on for checkbox preferences
6541dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getString(7)).isEmpty();
6551dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Entries - only on for list preferences
6561dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getString(8)).isNull();
6571dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Keywords
6583f3b547e4a2eeeb362d9b7c98b05f9a244cd754eMatthew Fritze        assertThat(cursor.getString(9)).isEqualTo(
6593f3b547e4a2eeeb362d9b7c98b05f9a244cd754eMatthew Fritze                "display density screen zoom scale scaling");
6601dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Screen Title
6613f3b547e4a2eeeb362d9b7c98b05f9a244cd754eMatthew Fritze        assertThat(cursor.getString(10)).isEqualTo("Display size");
6621dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Class Name
6631dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getString(11))
6643f3b547e4a2eeeb362d9b7c98b05f9a244cd754eMatthew Fritze                .isEqualTo("com.android.settings.display.ScreenZoomSettings");
6651dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Icon
6665416a5992bceb91bd3eda63629ba5420a714747bMatthew Fritze        assertThat(cursor.getInt(12)).isEqualTo(noIcon);
6671dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Intent Action
6681dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getString(13)).isNull();
6691dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Target Package
6701dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getString(14)).isNull();
6711dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Target Class
6721dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getString(15)).isNull();
6731dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Enabled
6741dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getInt(16) == 1).isEqualTo(enabled);
6751dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Data ref key
6761dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getString(17)).isNull();
6771dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // User Id
6781dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getInt(18)).isEqualTo(userId);
6791dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Payload Type - default is 0
6801dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getInt(19)).isEqualTo(0);
6811dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Payload - should be updated to real payloads as controllers are added
6823746d9e25f2805b16b69eb7420a629fc66f6a788Matthew Fritze        byte[] payload = cursor.getBlob(20);
6833746d9e25f2805b16b69eb7420a629fc66f6a788Matthew Fritze        ResultPayload unmarshalledPayload = ResultPayloadUtils.unmarshall(payload,
6843746d9e25f2805b16b69eb7420a629fc66f6a788Matthew Fritze                ResultPayload.CREATOR);
6853746d9e25f2805b16b69eb7420a629fc66f6a788Matthew Fritze        assertThat(unmarshalledPayload).isInstanceOf(ResultPayload.class);
6861dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze    }
6871dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze
6883f3b547e4a2eeeb362d9b7c98b05f9a244cd754eMatthew Fritze    @Test
689ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze    public void testResourceProvider_disabledResource_rowsInserted() {
6903f3b547e4a2eeeb362d9b7c98b05f9a244cd754eMatthew Fritze        SearchIndexableResource resource = getFakeResource(0);
6913f3b547e4a2eeeb362d9b7c98b05f9a244cd754eMatthew Fritze        resource.className = "com.android.settings.LegalSettings";
6923f3b547e4a2eeeb362d9b7c98b05f9a244cd754eMatthew Fritze
6933f3b547e4a2eeeb362d9b7c98b05f9a244cd754eMatthew Fritze        mManager.indexOneSearchIndexableData(mDb, localeStr, resource,
694ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze                new HashMap<String, Set<String>>());
6953f3b547e4a2eeeb362d9b7c98b05f9a244cd754eMatthew Fritze
6963f3b547e4a2eeeb362d9b7c98b05f9a244cd754eMatthew Fritze        Cursor cursor = mDb.rawQuery("SELECT * FROM prefs_index WHERE enabled = 1", null);
697031af9f287de17384bd7b7498cda44a804ef8091Matthew Fritze        assertThat(cursor.getCount()).isEqualTo(1);
6983f3b547e4a2eeeb362d9b7c98b05f9a244cd754eMatthew Fritze        cursor = mDb.rawQuery("SELECT * FROM prefs_index WHERE enabled = 0", null);
699031af9f287de17384bd7b7498cda44a804ef8091Matthew Fritze        assertThat(cursor.getCount()).isEqualTo(5);
7003f3b547e4a2eeeb362d9b7c98b05f9a244cd754eMatthew Fritze    }
7013f3b547e4a2eeeb362d9b7c98b05f9a244cd754eMatthew Fritze
70204615bc1b6a10edad13754c9e6be1197ad150901Matthew Fritze    @Test
703ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze    public void testResource_withTitleAndSettingName_titleNotInserted() {
70404615bc1b6a10edad13754c9e6be1197ad150901Matthew Fritze        SearchIndexableResource resource = getFakeResource(R.xml.swipe_to_notification_settings);
70504615bc1b6a10edad13754c9e6be1197ad150901Matthew Fritze        mManager.indexFromResource(mDb, localeStr, resource, new ArrayList<String>());
70604615bc1b6a10edad13754c9e6be1197ad150901Matthew Fritze
70704615bc1b6a10edad13754c9e6be1197ad150901Matthew Fritze        Cursor cursor = mDb.rawQuery("SELECT * FROM prefs_index WHERE" +
70804615bc1b6a10edad13754c9e6be1197ad150901Matthew Fritze                " enabled = 1", null);
70904615bc1b6a10edad13754c9e6be1197ad150901Matthew Fritze        assertThat(cursor.getCount()).isEqualTo(1);
71004615bc1b6a10edad13754c9e6be1197ad150901Matthew Fritze    }
71104615bc1b6a10edad13754c9e6be1197ad150901Matthew Fritze
712ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze    // Test new public indexing flow
713ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze
714ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze    @Test
715a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze    @Config(shadows = {ShadowDatabaseIndexingUtils.class,})
716ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze    public void testPerformIndexing_fullIndex_getsDataFromProviders() {
717ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        DummyProvider provider = new DummyProvider();
718ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        provider.onCreate();
719a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze        ShadowContentResolver.registerProvider(AUTHORITY_ONE, provider);
720ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze
721ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        // Test that Indexables are added for Full indexing
722ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        when(mPackageManager.queryIntentContentProviders(any(Intent.class), anyInt()))
723ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze                .thenReturn(getDummyResolveInfo());
724ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze
725ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        DatabaseIndexingManager manager =
726a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze                spy(new DatabaseIndexingManager(mContext, PACKAGE_ONE));
727a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze        doReturn(true).when(manager).isFullIndex(anyString(), anyString());
728ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze
729ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        manager.performIndexing();
730ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze
731a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze        verify(manager).addIndexablesFromRemoteProvider(PACKAGE_ONE, AUTHORITY_ONE);
732a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze        verify(manager).updateDatabase(true /* isFullIndex */, Locale.getDefault().toString());
733a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze    }
734ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze
735a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze    @Test
736a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze    @Config(shadows = {ShadowDatabaseIndexingUtils.class,})
737a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze    public void testPerformIndexing_incrementalIndex_noDataAdded() {
738a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze        DummyProvider provider = new DummyProvider();
739a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze        provider.onCreate();
740a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze        ShadowContentResolver.registerProvider(AUTHORITY_ONE, provider);
741ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze
742a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze        // Test that Indexables are added for Full indexing
743a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze        when(mPackageManager.queryIntentContentProviders(any(Intent.class), anyInt()))
744a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze                .thenReturn(getDummyResolveInfo());
745a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze
746a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze        DatabaseIndexingManager manager =
747a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze                spy(new DatabaseIndexingManager(mContext, PACKAGE_ONE));
748a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze        doReturn(false).when(manager).isFullIndex(anyString(), anyString());
749a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze
750a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze        manager.mDataToProcess.dataToUpdate.clear();
751a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze
752a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze        manager.performIndexing();
753a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze
754a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze        verify(manager, times(0)).addDataToDatabase(any(SQLiteDatabase.class), anyString(),
755a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze                anyList(), anyMap());
756a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze        verify(manager, times(0)).addIndexablesFromRemoteProvider(PACKAGE_ONE, AUTHORITY_ONE);
757a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze        verify(manager).updateDataInDatabase(any(SQLiteDatabase.class), anyMap());
758ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze    }
759ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze
760ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze    @Test
761a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze    @Config(shadows = {ShadowDatabaseIndexingUtils.class,})
762a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze    public void testPerformIndexing_localeChanged_databaseDropped() {
763a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze        DummyProvider provider = new DummyProvider();
764a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze        provider.onCreate();
765a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze        ShadowContentResolver.registerProvider(AUTHORITY_ONE, provider);
766a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze
767a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze        // Test that Indexables are added for Full indexing
768a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze        when(mPackageManager.queryIntentContentProviders(any(Intent.class), anyInt()))
769a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze                .thenReturn(getDummyResolveInfo());
770a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze
771a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze        // Initialize the Manager
772a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze        DatabaseIndexingManager manager =
773a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze                spy(new DatabaseIndexingManager(mContext, PACKAGE_ONE));
774a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze        doReturn(true).when(manager).isFullIndex(anyString(), anyString());
775a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze
776a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze        // Insert data point which will be dropped
777a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze        final String oldTitle = "This is French";
778a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze        insertSpecialCase(oldTitle, true, "key");
779a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze
780a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze        // Add a data point to be added by the indexing
781a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze        SearchIndexableRaw raw = new SearchIndexableRaw(mContext);
782a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze        final String newTitle = "This is English";
783a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze        raw.title = newTitle;
784a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze        manager.mDataToProcess.dataToUpdate.add(raw);
785a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze
786a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze        manager.performIndexing();
787a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze
788a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze        // Assert that the New Title is inserted
789a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze        final Cursor newCursor = mDb.rawQuery("SELECT * FROM prefs_index WHERE data_title = '" +
790a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze                newTitle + "'", null);
791a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze        assertThat(newCursor.getCount()).isEqualTo(1);
792a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze
793a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze        // Assert that the Old Title is no longer in the database, since it was dropped
794a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze        final Cursor oldCursor = mDb.rawQuery("SELECT * FROM prefs_index WHERE data_title = '" +
795a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze                oldTitle + "'", null);
796a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze        assertThat(oldCursor.getCount()).isEqualTo(0);
797a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze    }
798a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze
799a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze    @Test
800a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze    @Config(shadows = {ShadowDatabaseIndexingUtils.class,})
801a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze    public void testPerformIndexing_onOta_FullIndex() {
802ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        DummyProvider provider = new DummyProvider();
803ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        provider.onCreate();
804ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        ShadowContentResolver.registerProvider(
805ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze                AUTHORITY_ONE, provider
806ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        );
807ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze
808ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        // Test that Indexables are added for Full indexing
809ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        when(mPackageManager.queryIntentContentProviders(any(Intent.class), anyInt()))
810ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze                .thenReturn(getDummyResolveInfo());
811ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze
812ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        DatabaseIndexingManager manager =
813a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze                spy(new DatabaseIndexingManager(mContext, PACKAGE_ONE));
814a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze        doReturn(true).when(manager).isFullIndex(anyString(), anyString());
815ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze
816ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        manager.performIndexing();
817ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze
818a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze        verify(manager).updateDatabase(true /* isFullIndex */, Locale.getDefault().toString());
819a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze    }
820ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze
821a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze    @Test
822a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze    @Config(shadows = {ShadowDatabaseIndexingUtils.class,})
823a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze    public void testPerformIndexing_onOta_buildNumberIsCached() {
824a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze        DummyProvider provider = new DummyProvider();
825a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze        provider.onCreate();
826a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze        ShadowContentResolver.registerProvider(
827a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze                AUTHORITY_ONE, provider
828a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze        );
829a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze
830a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze        // Test that Indexables are added for Full indexing
831a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze        when(mPackageManager.queryIntentContentProviders(any(Intent.class), anyInt()))
832a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze                .thenReturn(getDummyResolveInfo());
833a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze
834a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze        DatabaseIndexingManager manager =
835a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze                spy(new DatabaseIndexingManager(mContext, PACKAGE_ONE));
836a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze        doReturn(true).when(manager).isFullIndex(anyString(), anyString());
837a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze
838a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze        manager.performIndexing();
839a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze
840a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze        assertThat(IndexDatabaseHelper.getInstance(mContext).isBuildIndexed(mContext,
841a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze                Build.FINGERPRINT)).isTrue();
842ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze    }
843ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze
844ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze    @Test
845ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze    public void testFullUpdatedDatabase_noData_addDataToDatabaseNotCalled() {
846a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze        mManager.updateDatabase(true /* isFullIndex */, localeStr);
847ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        mManager.mDataToProcess.dataToUpdate.clear();
848ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        verify(mManager, times(0)).addDataToDatabase(any(SQLiteDatabase.class), anyString(),
849ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze                anyList(), anyMap());
850ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze    }
851ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze
852ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze    @Test
853ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze    public void testFullUpdatedDatabase_updatedDataInDatabaseNotCalled() {
854a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze        mManager.updateDatabase(true /* isFullIndex */, localeStr);
855ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        verify(mManager, times(0)).updateDataInDatabase(any(SQLiteDatabase.class), anyMap());
856ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze    }
857ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze
858ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze    @Test
8598a42b074a7ccaf8325b571d261fda5b9a494a059Matthew Fritze    public void testLocaleUpdated_afterIndexing_localeNotAdded() {
860a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze        mManager.updateDatabase(true /* isFullIndex */, localeStr);
861ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        assertThat(IndexDatabaseHelper.getInstance(mContext)
8628a42b074a7ccaf8325b571d261fda5b9a494a059Matthew Fritze                .isLocaleAlreadyIndexed(mContext, localeStr)).isFalse();
8638a42b074a7ccaf8325b571d261fda5b9a494a059Matthew Fritze    }
8648a42b074a7ccaf8325b571d261fda5b9a494a059Matthew Fritze
8658a42b074a7ccaf8325b571d261fda5b9a494a059Matthew Fritze    @Test
8668a42b074a7ccaf8325b571d261fda5b9a494a059Matthew Fritze    public void testLocaleUpdated_afterFullIndexing_localeAdded() {
8678a42b074a7ccaf8325b571d261fda5b9a494a059Matthew Fritze        mManager.performIndexing();
8688a42b074a7ccaf8325b571d261fda5b9a494a059Matthew Fritze        assertThat(IndexDatabaseHelper.getInstance(mContext)
869ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze                .isLocaleAlreadyIndexed(mContext, localeStr)).isTrue();
870ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze    }
871ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze
872ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze    @Test
873ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze    public void testUpdateDatabase_newEligibleData_addedToDatabase() {
874ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        // Test that addDataToDatabase is called when dataToUpdate is non-empty
875ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        mManager.mDataToProcess.dataToUpdate.add(getFakeRaw());
876a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze        mManager.updateDatabase(true /* isFullIndex */, localeStr);
877ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze
878ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        Cursor cursor = mDb.rawQuery("SELECT * FROM prefs_index", null);
879ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        cursor.moveToPosition(0);
880ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze
881ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        // Locale
882ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        assertThat(cursor.getString(0)).isEqualTo(localeStr);
883ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        // Data Rank
884ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        assertThat(cursor.getInt(1)).isEqualTo(rank);
885ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        // Data Title
886ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        assertThat(cursor.getString(2)).isEqualTo(updatedTitle);
887ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        // Normalized Title
888ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        assertThat(cursor.getString(3)).isEqualTo(normalizedTitle);
889ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        // Summary On
890ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        assertThat(cursor.getString(4)).isEqualTo(updatedSummaryOn);
891ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        // Summary On Normalized
892ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        assertThat(cursor.getString(5)).isEqualTo(normalizedSummaryOn);
893ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        // Summary Off
894ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        assertThat(cursor.getString(6)).isEqualTo(updatedSummaryOff);
895ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        // Summary off normalized
896ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        assertThat(cursor.getString(7)).isEqualTo(normalizedSummaryOff);
897ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        // Entries
898ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        assertThat(cursor.getString(8)).isEqualTo(entries);
899ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        // Keywords
900ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        assertThat(cursor.getString(9)).isEqualTo(spaceDelimittedKeywords);
901ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        // Screen Title
902ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        assertThat(cursor.getString(10)).isEqualTo(screenTitle);
903ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        // Class Name
904ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        assertThat(cursor.getString(11)).isEqualTo(className);
905ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        // Icon
906ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        assertThat(cursor.getInt(12)).isEqualTo(iconResId);
907ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        // Intent Action
908ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        assertThat(cursor.getString(13)).isEqualTo(action);
909ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        // Target Package
910ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        assertThat(cursor.getString(14)).isEqualTo(targetPackage);
911ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        // Target Class
912ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        assertThat(cursor.getString(15)).isEqualTo(targetClass);
913ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        // Enabled
914ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        assertThat(cursor.getInt(16) == 1).isEqualTo(enabled);
915ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        // Data ref key
916ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        assertThat(cursor.getString(17)).isNotNull();
917ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        // User Id
918ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        assertThat(cursor.getInt(18)).isEqualTo(userId);
919ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        // Payload Type - default is 0
920ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        assertThat(cursor.getInt(19)).isEqualTo(0);
921ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        // Payload
9223746d9e25f2805b16b69eb7420a629fc66f6a788Matthew Fritze        byte[] payload = cursor.getBlob(20);
9233746d9e25f2805b16b69eb7420a629fc66f6a788Matthew Fritze        ResultPayload unmarshalledPayload = ResultPayloadUtils.unmarshall(payload,
9243746d9e25f2805b16b69eb7420a629fc66f6a788Matthew Fritze                ResultPayload.CREATOR);
9253746d9e25f2805b16b69eb7420a629fc66f6a788Matthew Fritze        assertThat(unmarshalledPayload).isInstanceOf(ResultPayload.class);
926ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze    }
927ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze
928ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze    @Test
929ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze    public void testUpdateDataInDatabase_enabledResultsAreNonIndexable_becomeDisabled() {
930ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        // Both results are enabled, and then TITLE_ONE gets disabled.
931ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        final boolean enabled = true;
932ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        insertSpecialCase(TITLE_ONE, enabled, KEY_ONE);
933ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        insertSpecialCase(TITLE_TWO, enabled, KEY_TWO);
934ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        Map<String, Set<String>> niks = new ArrayMap<>();
935ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        Set<String> keys = new HashSet<>();
936ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        keys.add(KEY_ONE);
937ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        niks.put(targetPackage, keys);
938ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze
939ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        mManager.updateDataInDatabase(mDb, niks);
940ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze
941ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        Cursor cursor = mDb.rawQuery("SELECT * FROM prefs_index WHERE enabled = 0", null);
942ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        cursor.moveToPosition(0);
943ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze
944ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        assertThat(cursor.getString(2)).isEqualTo(TITLE_ONE);
945ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze    }
946ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze
947ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze    @Test
9484f198813ed0d513ddb1461315bae1c881904ebf0Matthew Fritze    public void testUpdateDataInDatabase_disabledResultsAreIndexable_becomeEnabled() {
949ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        // Both results are initially disabled, and then TITLE_TWO gets enabled.
950ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        final boolean enabled = false;
951ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        insertSpecialCase(TITLE_ONE, enabled, KEY_ONE);
952ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        insertSpecialCase(TITLE_TWO, enabled, KEY_TWO);
953ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        Map<String, Set<String>> niks = new ArrayMap<>();
954ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        Set<String> keys = new HashSet<>();
955ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        keys.add(KEY_ONE);
956ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        niks.put(targetPackage, keys);
957ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze
958ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        mManager.updateDataInDatabase(mDb, niks);
959ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze
960ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        Cursor cursor = mDb.rawQuery("SELECT * FROM prefs_index WHERE enabled = 1", null);
961ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        cursor.moveToPosition(0);
962ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze
963ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        assertThat(cursor.getString(2)).isEqualTo(TITLE_TWO);
964ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze    }
965ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze
9664f198813ed0d513ddb1461315bae1c881904ebf0Matthew Fritze    @Test
9674f198813ed0d513ddb1461315bae1c881904ebf0Matthew Fritze    @Config(shadows = {ShadowContentResolver.class})
9684f198813ed0d513ddb1461315bae1c881904ebf0Matthew Fritze    public void testEmptyNonIndexableKeys_emptyDataKeyResources_addedToDatabase() {
9694f198813ed0d513ddb1461315bae1c881904ebf0Matthew Fritze        insertSpecialCase(TITLE_ONE, true /* enabled */, null /* dataReferenceKey */);
9704f198813ed0d513ddb1461315bae1c881904ebf0Matthew Fritze
9714f198813ed0d513ddb1461315bae1c881904ebf0Matthew Fritze        mManager.updateDatabase(false, localeStr);
9724f198813ed0d513ddb1461315bae1c881904ebf0Matthew Fritze
9734f198813ed0d513ddb1461315bae1c881904ebf0Matthew Fritze        Cursor cursor = mDb.rawQuery("SELECT * FROM prefs_index WHERE enabled = 1", null);
9744f198813ed0d513ddb1461315bae1c881904ebf0Matthew Fritze        cursor.moveToPosition(0);
9754f198813ed0d513ddb1461315bae1c881904ebf0Matthew Fritze        assertThat(cursor.getCount()).isEqualTo(1);
9764f198813ed0d513ddb1461315bae1c881904ebf0Matthew Fritze        assertThat(cursor.getString(2)).isEqualTo(TITLE_ONE);
9774f198813ed0d513ddb1461315bae1c881904ebf0Matthew Fritze    }
978be0989cc615724f07f5717c9bf17e12560872bb4Matthew Fritze
979be0989cc615724f07f5717c9bf17e12560872bb4Matthew Fritze    @Test
980be0989cc615724f07f5717c9bf17e12560872bb4Matthew Fritze    public void testUpdateAsyncTask_onPostExecute_performsCallback() {
981be0989cc615724f07f5717c9bf17e12560872bb4Matthew Fritze        IndexingCallback callback = mock(IndexingCallback.class);
982be0989cc615724f07f5717c9bf17e12560872bb4Matthew Fritze
983be0989cc615724f07f5717c9bf17e12560872bb4Matthew Fritze        DatabaseIndexingManager.IndexingTask task = mManager.new IndexingTask(callback);
984be0989cc615724f07f5717c9bf17e12560872bb4Matthew Fritze        task.execute();
985be0989cc615724f07f5717c9bf17e12560872bb4Matthew Fritze
986be0989cc615724f07f5717c9bf17e12560872bb4Matthew Fritze        Robolectric.flushForegroundThreadScheduler();
987be0989cc615724f07f5717c9bf17e12560872bb4Matthew Fritze
988be0989cc615724f07f5717c9bf17e12560872bb4Matthew Fritze        verify(callback).onIndexingFinished();
989be0989cc615724f07f5717c9bf17e12560872bb4Matthew Fritze    }
990be0989cc615724f07f5717c9bf17e12560872bb4Matthew Fritze
991be0989cc615724f07f5717c9bf17e12560872bb4Matthew Fritze    @Test
992be0989cc615724f07f5717c9bf17e12560872bb4Matthew Fritze    public void testUpdateAsyncTask_onPostExecute_setsIndexingComplete() {
993be0989cc615724f07f5717c9bf17e12560872bb4Matthew Fritze        SearchFeatureProviderImpl provider = new SearchFeatureProviderImpl();
994be0989cc615724f07f5717c9bf17e12560872bb4Matthew Fritze        DatabaseIndexingManager manager = spy(provider.getIndexingManager(mContext));
995be0989cc615724f07f5717c9bf17e12560872bb4Matthew Fritze        DatabaseIndexingManager.IndexingTask task = manager.new IndexingTask(null);
996be0989cc615724f07f5717c9bf17e12560872bb4Matthew Fritze        doNothing().when(manager).performIndexing();
997be0989cc615724f07f5717c9bf17e12560872bb4Matthew Fritze
998be0989cc615724f07f5717c9bf17e12560872bb4Matthew Fritze        task.execute();
999be0989cc615724f07f5717c9bf17e12560872bb4Matthew Fritze        Robolectric.flushForegroundThreadScheduler();
1000be0989cc615724f07f5717c9bf17e12560872bb4Matthew Fritze
1001be0989cc615724f07f5717c9bf17e12560872bb4Matthew Fritze        assertThat(provider.isIndexingComplete(mContext)).isTrue();
1002be0989cc615724f07f5717c9bf17e12560872bb4Matthew Fritze    }
1003be0989cc615724f07f5717c9bf17e12560872bb4Matthew Fritze
10041dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze    // Util functions
10051dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze
10061dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze    private SearchIndexableRaw getFakeRaw() {
10071dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        return getFakeRaw(localeStr);
10081dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze    }
10091dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze
10101dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze    private SearchIndexableRaw getFakeRaw(String localeStr) {
10111dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        SearchIndexableRaw data = new SearchIndexableRaw(mContext);
10121dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        data.locale = new Locale(localeStr);
10131dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        data.rank = rank;
10141dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        data.title = title;
10151dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        data.summaryOn = summaryOn;
10161dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        data.summaryOff = summaryOff;
10171dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        data.entries = entries;
10181dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        data.keywords = keywords;
10191dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        data.screenTitle = screenTitle;
10201dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        data.className = className;
10211dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        data.packageName = packageName;
10221dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        data.iconResId = iconResId;
10231dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        data.intentAction = action;
10241dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        data.intentTargetPackage = targetPackage;
10251dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        data.intentTargetClass = targetClass;
10261dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        data.key = key;
10271dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        data.userId = userId;
10281dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        data.enabled = enabled;
10291dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        return data;
10301dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze    }
10311dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze
10321dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze    private SearchIndexableResource getFakeResource(int xml) {
10331dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        SearchIndexableResource sir = new SearchIndexableResource(mContext);
10341dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        sir.rank = rank;
10351dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        sir.xmlResId = xml;
10361dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        sir.className = className;
10371dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        sir.packageName = packageName;
10381dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        sir.iconResId = iconResId;
10391dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        sir.intentAction = action;
10401dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        sir.intentTargetPackage = targetPackage;
10411dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        sir.intentTargetClass = targetClass;
10421dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        sir.enabled = enabled;
10431dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        return sir;
10441dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze    }
10453f3b547e4a2eeeb362d9b7c98b05f9a244cd754eMatthew Fritze
1046ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze    private Map<String, Set<String>> getNonIndexableKeys(String[] keys) {
1047ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        Map<String, Set<String>> niks = new HashMap<>();
1048ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        Set<String> keysList = new HashSet<>();
1049ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        keysList.addAll(Arrays.asList(keys));
10503f3b547e4a2eeeb362d9b7c98b05f9a244cd754eMatthew Fritze        niks.put(packageName, keysList);
10513f3b547e4a2eeeb362d9b7c98b05f9a244cd754eMatthew Fritze        return niks;
10523f3b547e4a2eeeb362d9b7c98b05f9a244cd754eMatthew Fritze    }
1053ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze
1054ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze    private List<ResolveInfo> getDummyResolveInfo() {
1055ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        List<ResolveInfo> infoList = new ArrayList<>();
1056ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        ResolveInfo info = new ResolveInfo();
1057ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        info.providerInfo = new ProviderInfo();
1058ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        info.providerInfo.exported = true;
1059ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        info.providerInfo.authority = AUTHORITY_ONE;
1060ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        info.providerInfo.packageName = PACKAGE_ONE;
1061ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        infoList.add(info);
1062ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze
1063ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        return infoList;
1064ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze    }
1065ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze
1066ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze    // TODO move this method and its counterpart in CursorToSearchResultConverterTest into
1067ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze    // a util class with public fields to assert values.
1068ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze    private Cursor getDummyCursor() {
10694f198813ed0d513ddb1461315bae1c881904ebf0Matthew Fritze        MatrixCursor cursor = new MatrixCursor(INDEXABLES_RAW_COLUMNS);
1070ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        final String BLANK = "";
1071ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze
1072ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        ArrayList<String> item =
10734f198813ed0d513ddb1461315bae1c881904ebf0Matthew Fritze                new ArrayList<>(INDEXABLES_RAW_COLUMNS.length);
1074ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        item.add("42"); // Rank
1075ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        item.add(TITLE_ONE); // Title
1076ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        item.add(BLANK); // Summary on
1077ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        item.add(BLANK); // summary off
1078ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        item.add(BLANK); // entries
1079ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        item.add(BLANK); // keywords
1080ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        item.add(BLANK); // screen title
1081ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        item.add(BLANK); // classname
1082ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        item.add("123"); // Icon
1083ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        item.add(BLANK); // Intent action
1084ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        item.add(BLANK); // target package
1085ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        item.add(BLANK); // target class
1086ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        item.add(KEY_ONE); // Key
1087ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        item.add("-1"); // userId
1088ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        cursor.addRow(item);
1089ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze
1090ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        return cursor;
1091ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze    }
1092ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze
1093ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze    private void insertSpecialCase(String specialCase, boolean enabled, String key) {
1094ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        ContentValues values = new ContentValues();
1095ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        values.put(IndexDatabaseHelper.IndexColumns.DOCID, specialCase.hashCode());
1096ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        values.put(IndexDatabaseHelper.IndexColumns.LOCALE, localeStr);
1097ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        values.put(IndexDatabaseHelper.IndexColumns.DATA_RANK, 1);
1098ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        values.put(IndexDatabaseHelper.IndexColumns.DATA_TITLE, specialCase);
1099ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        values.put(IndexDatabaseHelper.IndexColumns.DATA_TITLE_NORMALIZED, "");
1100ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        values.put(IndexDatabaseHelper.IndexColumns.DATA_SUMMARY_ON, "");
1101ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        values.put(IndexDatabaseHelper.IndexColumns.DATA_SUMMARY_ON_NORMALIZED, "");
1102ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        values.put(IndexDatabaseHelper.IndexColumns.DATA_SUMMARY_OFF, "");
1103ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        values.put(IndexDatabaseHelper.IndexColumns.DATA_SUMMARY_OFF_NORMALIZED, "");
1104ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        values.put(IndexDatabaseHelper.IndexColumns.DATA_ENTRIES, "");
1105ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        values.put(IndexDatabaseHelper.IndexColumns.DATA_KEYWORDS, "");
1106ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        values.put(IndexDatabaseHelper.IndexColumns.CLASS_NAME, "");
1107ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        values.put(IndexDatabaseHelper.IndexColumns.SCREEN_TITLE, "Moves");
1108ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        values.put(IndexDatabaseHelper.IndexColumns.INTENT_ACTION, "");
1109ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        values.put(IndexDatabaseHelper.IndexColumns.INTENT_TARGET_PACKAGE, targetPackage);
1110ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        values.put(IndexDatabaseHelper.IndexColumns.INTENT_TARGET_CLASS, "");
1111ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        values.put(IndexDatabaseHelper.IndexColumns.ICON, "");
1112ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        values.put(IndexDatabaseHelper.IndexColumns.ENABLED, enabled);
1113ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        values.put(IndexDatabaseHelper.IndexColumns.DATA_KEY_REF, key);
1114ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        values.put(IndexDatabaseHelper.IndexColumns.USER_ID, 0);
1115ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        values.put(IndexDatabaseHelper.IndexColumns.PAYLOAD_TYPE, 0);
1116ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        values.put(IndexDatabaseHelper.IndexColumns.PAYLOAD, (String) null);
1117ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze
1118ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        mDb.replaceOrThrow(IndexDatabaseHelper.Tables.TABLE_PREFS_INDEX, null, values);
1119ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze    }
1120ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze
1121ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze    private class DummyProvider extends ContentProvider {
1122ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze
1123ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        @Override
1124ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        public boolean onCreate() {
1125ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze            return false;
1126ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        }
1127ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze
1128ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        @Override
1129ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        public Cursor query(@NonNull Uri uri, @Nullable String[] projection,
1130ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze                @Nullable String selection, @Nullable String[] selectionArgs,
1131ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze                @Nullable String sortOrder) {
1132ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze            if (uri.toString().contains("xml")) {
1133ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze                return null;
1134ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze            }
1135ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze            return getDummyCursor();
1136ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        }
1137ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze
1138ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        @Override
1139ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        public String getType(@NonNull Uri uri) {
1140ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze            return null;
1141ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        }
1142ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze
1143ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        @Override
1144ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        public Uri insert(@NonNull Uri uri, @Nullable ContentValues values) {
1145ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze            return null;
1146ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        }
1147ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze
1148ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        @Override
1149ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        public int delete(@NonNull Uri uri, @Nullable String selection,
1150ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze                @Nullable String[] selectionArgs) {
1151ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze            return 0;
1152ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        }
1153ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze
1154ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        @Override
1155ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        public int update(@NonNull Uri uri, @Nullable ContentValues values,
1156ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze                @Nullable String selection, @Nullable String[] selectionArgs) {
1157ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze            return 0;
1158ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        }
1159ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze    }
1160a9831d40d081cc8c7ca32891e64c09b5e1d19abbPhilip Quinn}
1161