DatabaseIndexingManagerTest.java revision 5416a5992bceb91bd3eda63629ba5420a714747b
11dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze/*
2ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze * Copyright (C) 2017 The Android Open Source Project
31dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze *
41dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze * Licensed under the Apache License, Version 2.0 (the "License");
51dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze * you may not use this file except in compliance with the License.
61dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze * You may obtain a copy of the License at
71dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze *
81dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze *      http://www.apache.org/licenses/LICENSE-2.0
91dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze *
101dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze * Unless required by applicable law or agreed to in writing, software
111dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze * distributed under the License is distributed on an "AS IS" BASIS,
121dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
131dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze * See the License for the specific language governing permissions and
141dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze * limitations under the License.
151dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze *
161dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze */
171dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze
1804615bc1b6a10edad13754c9e6be1197ad150901Matthew Fritzepackage com.android.settings.search2;
191dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze
20ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritzeimport android.annotation.NonNull;
21ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritzeimport android.annotation.Nullable;
22ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritzeimport android.content.ContentProvider;
23ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritzeimport android.content.ContentValues;
241dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritzeimport android.content.Context;
25ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritzeimport android.content.Intent;
26ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritzeimport android.content.pm.PackageManager;
27ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritzeimport android.content.pm.ProviderInfo;
28ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritzeimport android.content.pm.ResolveInfo;
291dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritzeimport android.database.Cursor;
30ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritzeimport android.database.MatrixCursor;
311dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritzeimport android.database.sqlite.SQLiteDatabase;
32ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritzeimport android.net.Uri;
33a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritzeimport android.os.Build;
341dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritzeimport android.provider.SearchIndexableResource;
35ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritzeimport android.util.ArrayMap;
361dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritzeimport com.android.settings.R;
371dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritzeimport com.android.settings.SettingsRobolectricTestRunner;
381dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritzeimport com.android.settings.TestConfig;
3904615bc1b6a10edad13754c9e6be1197ad150901Matthew Fritzeimport com.android.settings.search.IndexDatabaseHelper;
40ab0b3f6790de6e58258be2c374b59e6056c7bfd2Matthew Fritzeimport com.android.settings.search.IndexingCallback;
4104615bc1b6a10edad13754c9e6be1197ad150901Matthew Fritzeimport com.android.settings.search.SearchIndexableRaw;
42a8b089db8a6d495a18dc3ad91d3bd84b042fb004Fan Zhangimport com.android.settings.testutils.DatabaseTestUtils;
43ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritzeimport com.android.settings.testutils.shadow.ShadowDatabaseIndexingUtils;
44ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritzeimport com.android.settings.testutils.shadow.ShadowRunnableAsyncTask;
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;
51ab0b3f6790de6e58258be2c374b59e6056c7bfd2Matthew 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;
72ab0b3f6790de6e58258be2c374b59e6056c7bfd2Matthew 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();
1351dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze    }
1361dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze
1371dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze    @After
1381dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze    public void cleanUp() {
139a8b089db8a6d495a18dc3ad91d3bd84b042fb004Fan Zhang        DatabaseTestUtils.clearDb();
1401dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze    }
1411dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze
1421dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze    @Test
1431dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze    public void testDatabaseSchema() {
1441dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        Cursor dbCursor = mDb.query("prefs_index", null, null, null, null, null, null);
1451dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        List<String> columnNames = new ArrayList<>(Arrays.asList(dbCursor.getColumnNames()));
1461dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Note that docid is not included.
147a96b11f65d9f29dd4037da85e12f5cf9dcfa0176Fan Zhang        List<String> expColumnNames = new ArrayList<>(Arrays.asList(new String[]{
1481dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze                "locale",
1491dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze                "data_rank",
1501dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze                "data_title",
1511dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze                "data_title_normalized",
1521dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze                "data_summary_on",
1531dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze                "data_summary_on_normalized",
1541dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze                "data_summary_off",
1551dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze                "data_summary_off_normalized",
1561dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze                "data_entries",
1571dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze                "data_keywords",
1581dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze                "class_name",
1591dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze                "screen_title",
1601dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze                "intent_action",
1611dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze                "intent_target_package",
1621dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze                "intent_target_class",
1631dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze                "icon",
1641dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze                "enabled",
1651dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze                "data_key_reference",
1661dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze                "user_id",
1671dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze                "payload_type",
1681dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze                "payload"
1691dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        }));
1701dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Prevent database schema regressions
1711dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(columnNames).containsAllIn(expColumnNames);
1721dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze    }
1731dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze
1741dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze    // Tests for the flow: IndexOneRaw -> UpdateOneRowWithFilteredData -> UpdateOneRow
1751dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze
1761dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze    @Test
177ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze    public void testInsertRawColumn_rowInserted() {
1781dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        SearchIndexableRaw raw = getFakeRaw();
1791dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        mManager.indexOneSearchIndexableData(mDb, localeStr, raw, null /* Non-indexable keys */);
1801dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        Cursor cursor = mDb.rawQuery("SELECT * FROM prefs_index", null);
1811dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getCount()).isEqualTo(1);
1821dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze    }
1831dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze
1841dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze    @Test
185ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze    public void testInsertRawColumn_rowMatches() {
1861dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        SearchIndexableRaw raw = getFakeRaw();
1871dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        mManager.indexOneSearchIndexableData(mDb, localeStr, raw, null /* Non-indexable keys */);
1881dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        Cursor cursor = mDb.rawQuery("SELECT * FROM prefs_index", null);
1891dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        cursor.moveToPosition(0);
1901dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze
1911dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Locale
1921dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getString(0)).isEqualTo(localeStr);
1931dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Data Rank
1941dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getInt(1)).isEqualTo(raw.rank);
1951dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Data Title
1961dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getString(2)).isEqualTo(updatedTitle);
1971dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Normalized Title
1981dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getString(3)).isEqualTo(normalizedTitle);
1991dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Summary On
2001dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getString(4)).isEqualTo(updatedSummaryOn);
2011dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Summary On Normalized
2021dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getString(5)).isEqualTo(normalizedSummaryOn);
2031dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Summary Off
2041dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getString(6)).isEqualTo(updatedSummaryOff);
2051dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Summary off normalized
2061dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getString(7)).isEqualTo(normalizedSummaryOff);
2071dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Entries
2081dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getString(8)).isEqualTo(raw.entries);
2091dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Keywords
2101dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getString(9)).isEqualTo(spaceDelimittedKeywords);
2111dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Screen Title
2121dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getString(10)).isEqualTo(raw.screenTitle);
2131dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Class Name
2141dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getString(11)).isEqualTo(raw.className);
2151dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Icon
2161dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getInt(12)).isEqualTo(raw.iconResId);
2171dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Intent Action
2181dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getString(13)).isEqualTo(raw.intentAction);
2191dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Target Package
2201dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getString(14)).isEqualTo(raw.intentTargetPackage);
2211dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Target Class
2221dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getString(15)).isEqualTo(raw.intentTargetClass);
2231dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Enabled
2241dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getInt(16) == 1).isEqualTo(raw.enabled);
2251dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Data ref key
2261dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getString(17)).isNotNull();
2271dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // User Id
2281dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getInt(18)).isEqualTo(raw.userId);
2291dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Payload Type - default is 0
2301dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getInt(19)).isEqualTo(0);
2311dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Payload
2321dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getBlob(20)).isNull();
2331dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze    }
2341dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze
2351dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze    @Test
236ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze    public void testInsertRawColumn_mismatchedLocale_noRowInserted() {
2371dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        SearchIndexableRaw raw = getFakeRaw("ca-fr");
2381dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        mManager.indexOneSearchIndexableData(mDb, localeStr, raw, null /* Non-indexable keys */);
2391dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        Cursor cursor = mDb.rawQuery("SELECT * FROM prefs_index", null);
2401dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getCount()).isEqualTo(0);
2411dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze    }
2421dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze
2431dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze    // Tests for the flow: IndexOneResource -> IndexFromResource ->
2441dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze    //                     UpdateOneRowWithFilteredData -> UpdateOneRow
2451dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze
2461dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze    @Test
2471dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze    public void testNullResource_NothingInserted() {
2481dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        mManager.indexOneSearchIndexableData(mDb, localeStr, null /* searchIndexableResource */,
249248d95c61809b253eb16fb1d597ed5e2f83ada78Fan Zhang                new HashMap<>());
2501dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        Cursor cursor = mDb.rawQuery("SELECT * FROM prefs_index", null);
2511dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getCount()).isEqualTo(0);
2521dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze    }
2531dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze
2541dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze    @Test
2551dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze    public void testAddResource_RowsInserted() {
256dc9a82f5b017f430aa7d50f12450082f1bdc871eFan Zhang        SearchIndexableResource resource = getFakeResource(R.xml.display_settings);
257ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        mManager.indexOneSearchIndexableData(mDb, localeStr, resource, new HashMap<>());
2581dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        Cursor cursor = mDb.rawQuery("SELECT * FROM prefs_index", null);
2596138f1ab31e90f59c725e4d4738c008c3fa30391Andrew Sapperstein        assertThat(cursor.getCount()).isEqualTo(18);
2601dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze    }
2611dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze
2621dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze    @Test
263ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze    public void testAddResource_withNIKs_rowsInsertedDisabled() {
264dc9a82f5b017f430aa7d50f12450082f1bdc871eFan Zhang        SearchIndexableResource resource = getFakeResource(R.xml.display_settings);
265d299b03f28fd23973b32931c3ae9a254a37d474dDoris Ling        // Only add 2 of 16 items to be disabled.
266d299b03f28fd23973b32931c3ae9a254a37d474dDoris Ling        String[] keys = {"brightness", "wallpaper"};
267ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        Map<String, Set<String>> niks = getNonIndexableKeys(keys);
268ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze
2693f3b547e4a2eeeb362d9b7c98b05f9a244cd754eMatthew Fritze        mManager.indexOneSearchIndexableData(mDb, localeStr, resource, niks);
2703f3b547e4a2eeeb362d9b7c98b05f9a244cd754eMatthew Fritze
2713f3b547e4a2eeeb362d9b7c98b05f9a244cd754eMatthew Fritze        Cursor cursor = mDb.rawQuery("SELECT * FROM prefs_index WHERE enabled = 0", null);
2723f3b547e4a2eeeb362d9b7c98b05f9a244cd754eMatthew Fritze        assertThat(cursor.getCount()).isEqualTo(2);
2733f3b547e4a2eeeb362d9b7c98b05f9a244cd754eMatthew Fritze        cursor = mDb.rawQuery("SELECT * FROM prefs_index WHERE enabled = 1", null);
2746138f1ab31e90f59c725e4d4738c008c3fa30391Andrew Sapperstein        assertThat(cursor.getCount()).isEqualTo(16);
2753f3b547e4a2eeeb362d9b7c98b05f9a244cd754eMatthew Fritze    }
2763f3b547e4a2eeeb362d9b7c98b05f9a244cd754eMatthew Fritze
2773f3b547e4a2eeeb362d9b7c98b05f9a244cd754eMatthew Fritze    @Test
278ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze    public void testAddResourceHeader_rowsMatch() {
2791dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        SearchIndexableResource resource = getFakeResource(R.xml.application_settings);
280ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        mManager.indexOneSearchIndexableData(mDb, localeStr, resource, new HashMap<>());
2811dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze
2821dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        Cursor cursor = mDb.rawQuery("SELECT * FROM prefs_index ORDER BY data_title", null);
2831dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        cursor.moveToPosition(1);
2841dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze
2851dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Locale
2861dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getString(0)).isEqualTo(localeStr);
2871dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Data Rank
2881dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getInt(1)).isEqualTo(rank);
2891dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Data Title
290015a50bef99a23a8c795486b99021a5784d65d64Doris Ling        assertThat(cursor.getString(2)).isEqualTo("App info");
2911dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Normalized Title
292015a50bef99a23a8c795486b99021a5784d65d64Doris Ling        assertThat(cursor.getString(3)).isEqualTo("app info");
2931dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Summary On
2941dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getString(4)).isEqualTo("Manage apps, set up quick launch shortcuts");
2951dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Summary On Normalized
2961dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getString(5)).isEqualTo("manage apps, set up quick launch shortcuts");
2971dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Summary Off - only on for checkbox preferences
2981dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getString(6)).isEmpty();
2991dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Summary off normalized - only on for checkbox preferences
3001dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getString(7)).isEmpty();
3011dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Entries - only on for list preferences
3021dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getString(8)).isNull();
3031dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Keywords
3041dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getString(9)).isEmpty();
3051dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Screen Title
306015a50bef99a23a8c795486b99021a5784d65d64Doris Ling        assertThat(cursor.getString(10)).isEqualTo("App info");
3071dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Class Name
3081dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getString(11)).isEqualTo(className);
3091dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Icon
310d0b42b03229225571ed060a377a0f72264058db6Matthew Fritze        assertThat(cursor.getInt(12)).isEqualTo(0);
3111dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Intent Action
3121dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getString(13)).isEqualTo(action);
3131dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Target Package
3141dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getString(14)).isEqualTo(targetPackage);
3151dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Target Class
3161dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getString(15)).isEqualTo(targetClass);
3171dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Enabled
3181dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getInt(16) == 1).isEqualTo(enabled);
3191dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Data ref key
3201dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getString(17)).isEqualTo("applications_settings");
3211dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // User Id
3221dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getInt(18)).isEqualTo(userId);
3231dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Payload Type - default is 0
3241dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getInt(19)).isEqualTo(0);
3251dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Payload - should be updated to real payloads as controllers are added
3261dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getBlob(20)).isNull();
3271dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze    }
3281dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze
3291dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze    @Test
330ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze    public void testAddResource_withChildFragment_shouldUpdateSiteMapDb() {
331f04ff76af05823619f1c522f22d8193edbb56bfaMaurice Lam        // FIXME: This test was failing. (count = 6 at the end)
332f04ff76af05823619f1c522f22d8193edbb56bfaMaurice Lam
333f04ff76af05823619f1c522f22d8193edbb56bfaMaurice Lam//        SearchIndexableResource resource = getFakeResource(R.xml.network_and_internet);
334f04ff76af05823619f1c522f22d8193edbb56bfaMaurice Lam//        mManager.indexOneSearchIndexableData(mDb, localeStr, resource,
335f04ff76af05823619f1c522f22d8193edbb56bfaMaurice Lam//                new HashMap<>());
336f04ff76af05823619f1c522f22d8193edbb56bfaMaurice Lam//        Cursor query = mDb.query(IndexDatabaseHelper.Tables.TABLE_SITE_MAP, SITE_MAP_COLUMNS,
337f04ff76af05823619f1c522f22d8193edbb56bfaMaurice Lam//                null, null, null, null, null);
338f04ff76af05823619f1c522f22d8193edbb56bfaMaurice Lam//        query.moveToPosition(-1);
339f04ff76af05823619f1c522f22d8193edbb56bfaMaurice Lam//        int count = 0;
340f04ff76af05823619f1c522f22d8193edbb56bfaMaurice Lam//        while (query.moveToNext()) {
341f04ff76af05823619f1c522f22d8193edbb56bfaMaurice Lam//            count++;
342f04ff76af05823619f1c522f22d8193edbb56bfaMaurice Lam//            assertThat(query.getString(query.getColumnIndex(SiteMapColumns.PARENT_CLASS)))
343f04ff76af05823619f1c522f22d8193edbb56bfaMaurice Lam//                    .isEqualTo(className);
344f04ff76af05823619f1c522f22d8193edbb56bfaMaurice Lam//            assertThat(query.getString(query.getColumnIndex(SiteMapColumns.PARENT_TITLE)))
345f04ff76af05823619f1c522f22d8193edbb56bfaMaurice Lam//                    .isEqualTo(mContext.getString(R.string.network_dashboard_title));
346f04ff76af05823619f1c522f22d8193edbb56bfaMaurice Lam//            assertThat(query.getString(query.getColumnIndex(SiteMapColumns.CHILD_CLASS)))
347f04ff76af05823619f1c522f22d8193edbb56bfaMaurice Lam//                    .isNotEmpty();
348f04ff76af05823619f1c522f22d8193edbb56bfaMaurice Lam//            assertThat(query.getString(query.getColumnIndex(SiteMapColumns.CHILD_TITLE)))
349f04ff76af05823619f1c522f22d8193edbb56bfaMaurice Lam//                    .isNotEmpty();
350f04ff76af05823619f1c522f22d8193edbb56bfaMaurice Lam//        }
351f04ff76af05823619f1c522f22d8193edbb56bfaMaurice Lam//        assertThat(count).isEqualTo(5);
352a96b11f65d9f29dd4037da85e12f5cf9dcfa0176Fan Zhang    }
353a96b11f65d9f29dd4037da85e12f5cf9dcfa0176Fan Zhang
354a96b11f65d9f29dd4037da85e12f5cf9dcfa0176Fan Zhang    @Test
355ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze    public void testAddResource_customSetting_rowsMatch() {
356d299b03f28fd23973b32931c3ae9a254a37d474dDoris Ling        SearchIndexableResource resource = getFakeResource(R.xml.swipe_to_notification_settings);
357ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        mManager.indexOneSearchIndexableData(mDb, localeStr, resource, new HashMap<>());
358248d95c61809b253eb16fb1d597ed5e2f83ada78Fan Zhang        final String prefTitle =
359248d95c61809b253eb16fb1d597ed5e2f83ada78Fan Zhang                mContext.getString(R.string.fingerprint_swipe_for_notifications_title);
360248d95c61809b253eb16fb1d597ed5e2f83ada78Fan Zhang        final String prefSummary =
361248d95c61809b253eb16fb1d597ed5e2f83ada78Fan Zhang                mContext.getString(R.string.fingerprint_swipe_for_notifications_summary);
362248d95c61809b253eb16fb1d597ed5e2f83ada78Fan Zhang        Cursor cursor = mDb.rawQuery(
363248d95c61809b253eb16fb1d597ed5e2f83ada78Fan Zhang                "SELECT * FROM prefs_index where data_title='" + prefTitle + "'", null);
364248d95c61809b253eb16fb1d597ed5e2f83ada78Fan Zhang        cursor.moveToFirst();
3651dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze
3661dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Locale
3671dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getString(0)).isEqualTo(localeStr);
3681dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Data Rank
3691dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getInt(1)).isEqualTo(rank);
3701dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Data Title
371248d95c61809b253eb16fb1d597ed5e2f83ada78Fan Zhang        assertThat(cursor.getString(2)).isEqualTo(prefTitle);
3721dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Normalized Title
373248d95c61809b253eb16fb1d597ed5e2f83ada78Fan Zhang        assertThat(cursor.getString(3)).isEqualTo(prefTitle.toLowerCase());
3741dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Summary On
375248d95c61809b253eb16fb1d597ed5e2f83ada78Fan Zhang        assertThat(cursor.getString(4)).isEqualTo(prefSummary);
3761dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Summary On Normalized
377248d95c61809b253eb16fb1d597ed5e2f83ada78Fan Zhang        assertThat(cursor.getString(5)).isEqualTo(prefSummary.toLowerCase());
3781dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Summary Off - only on for checkbox preferences
3791dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getString(6)).isEmpty();
3801dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Summary off normalized - only on for checkbox preferences
3811dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getString(7)).isEmpty();
3821dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Entries - only on for list preferences
3831dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getString(8)).isNull();
3841dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Keywords
3851dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getString(9)).isEmpty();
3861dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Screen Title
387248d95c61809b253eb16fb1d597ed5e2f83ada78Fan Zhang        assertThat(cursor.getString(10)).isEqualTo(
388d299b03f28fd23973b32931c3ae9a254a37d474dDoris Ling                mContext.getString(R.string.fingerprint_swipe_for_notifications_title));
3891dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Class Name
3901dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getString(11)).isEqualTo(className);
3911dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Icon
3925416a5992bceb91bd3eda63629ba5420a714747bMatthew Fritze        assertThat(cursor.getInt(12)).isEqualTo(noIcon);
3931dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Intent Action
3941dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getString(13)).isEqualTo(action);
3951dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Target Package
3961dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getString(14)).isEqualTo(targetPackage);
3971dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Target Class
3981dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getString(15)).isEqualTo(targetClass);
3991dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Enabled
4001dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getInt(16) == 1).isEqualTo(enabled);
4011dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Data ref key
4021dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getString(17)).isEqualTo("gesture_swipe_down_fingerprint");
4031dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // User Id
4041dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getInt(18)).isEqualTo(userId);
4051dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Payload Type - default is 0
4061dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getInt(19)).isEqualTo(0);
4071dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Payload - should be updated to real payloads as controllers are added
4081dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getBlob(20)).isNull();
4091dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze    }
4101dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze
4111dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze    @Test
412ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze    public void testAddResource_checkboxPreference_rowsMatch() {
4131dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        SearchIndexableResource resource = getFakeResource(R.xml.application_settings);
414ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        mManager.indexOneSearchIndexableData(mDb, localeStr, resource, new HashMap<>());
4151dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze
4161dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        /* Should return 6 results, with the following titles:
4171dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze         * Advanced Settings, Apps, Manage Apps, Preferred install location, Running Services
4181dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze         */
4191dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        Cursor cursor = mDb.rawQuery("SELECT * FROM prefs_index ORDER BY data_title", null);
4201dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        cursor.moveToPosition(0);
4211dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Locale
4221dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getString(0)).isEqualTo(localeStr);
4231dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Data Rank
4241dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getInt(1)).isEqualTo(rank);
4251dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Data Title
4261dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getString(2)).isEqualTo("Advanced settings");
4271dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Normalized Title
4281dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getString(3)).isEqualTo("advanced settings");
4291dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Summary On
4301dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getString(4)).isEqualTo("Enable more settings options");
4311dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Summary On Normalized
4321dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getString(5)).isEqualTo("enable more settings options");
4331dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Summary Off
4341dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getString(6)).isEqualTo("Enable more settings options");
4351dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Summary Off
4361dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getString(7)).isEqualTo("enable more settings options");
4371dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Entries - only on for list preferences
4381dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getString(8)).isNull();
4391dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Keywords
4401dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getString(9)).isEmpty();
4411dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Screen Title
442015a50bef99a23a8c795486b99021a5784d65d64Doris Ling        assertThat(cursor.getString(10)).isEqualTo("App info");
4431dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Class Name
4441dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getString(11)).isEqualTo(className);
4451dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Icon
4465416a5992bceb91bd3eda63629ba5420a714747bMatthew Fritze        assertThat(cursor.getInt(12)).isEqualTo(noIcon);
4471dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Intent Action
4481dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getString(13)).isEqualTo(action);
4491dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Target Package
4501dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getString(14)).isEqualTo(targetPackage);
4511dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Target Class
4521dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getString(15)).isEqualTo(targetClass);
4531dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Enabled
4541dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getInt(16) == 1).isEqualTo(enabled);
4551dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Data ref key
4561dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getString(17)).isEqualTo("toggle_advanced_settings");
4571dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // User Id
4581dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getInt(18)).isEqualTo(userId);
4591dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Payload Type - default is 0
4601dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getInt(19)).isEqualTo(0);
4611dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Payload - should be updated to real payloads as controllers are added
4621dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getBlob(20)).isNull();
4631dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze    }
4641dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze
4651dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze    @Test
466ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze    public void testAddResource_listPreference_rowsMatch() {
4671dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        SearchIndexableResource resource = getFakeResource(R.xml.application_settings);
468ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        mManager.indexOneSearchIndexableData(mDb, localeStr, resource, new HashMap<>());
4691dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze
4701dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        Cursor cursor = mDb.rawQuery("SELECT * FROM prefs_index ORDER BY data_title", null);
4711dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        cursor.moveToPosition(3);
4721dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Locale
4731dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getString(0)).isEqualTo(localeStr);
4741dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Data Rank
4751dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getInt(1)).isEqualTo(rank);
4761dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Data Title
4771dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getString(2)).isEqualTo("Preferred install location");
4781dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Normalized Title
4791dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getString(3)).isEqualTo("preferred install location");
4801dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Summary On
481a96b11f65d9f29dd4037da85e12f5cf9dcfa0176Fan Zhang        assertThat(cursor.getString(4)).isEqualTo(
482a96b11f65d9f29dd4037da85e12f5cf9dcfa0176Fan Zhang                "Change the preferred installation location for new apps");
4831dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Summary On Normalized
484a96b11f65d9f29dd4037da85e12f5cf9dcfa0176Fan Zhang        assertThat(cursor.getString(5)).isEqualTo(
485a96b11f65d9f29dd4037da85e12f5cf9dcfa0176Fan Zhang                "change the preferred installation location for new apps");
4861dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Summary Off - only on for checkbox preferences
4871dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getString(6)).isEmpty();
4881dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Summary off normalized - only on for checkbox preferences
4891dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getString(7)).isEmpty();
4901dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Entries - only on for list preferences
4911dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getString(8)).isEqualTo("Internal device storage|Removable SD card|" +
492a96b11f65d9f29dd4037da85e12f5cf9dcfa0176Fan Zhang                "Let the system decide|");
4931dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Keywords
4941dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getString(9)).isEmpty();
4951dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Screen Title
496015a50bef99a23a8c795486b99021a5784d65d64Doris Ling        assertThat(cursor.getString(10)).isEqualTo("App info");
4971dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Class Name
4981dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getString(11)).isEqualTo(className);
4991dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Icon
5005416a5992bceb91bd3eda63629ba5420a714747bMatthew Fritze        assertThat(cursor.getInt(12)).isEqualTo(noIcon);
5011dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Intent Action
5021dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getString(13)).isEqualTo(action);
5031dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Target Package
5041dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getString(14)).isEqualTo(targetPackage);
5051dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Target Class
5061dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getString(15)).isEqualTo(targetClass);
5071dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Enabled
5081dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getInt(16) == 1).isEqualTo(enabled);
5091dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Data ref key
5101dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getString(17)).isEqualTo("app_install_location");
5111dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // User Id
5121dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getInt(18)).isEqualTo(userId);
5131dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Payload Type - default is 0
5141dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getInt(19)).isEqualTo(0);
5151dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Payload - should be updated to real payloads as controllers are added
5161dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getBlob(20)).isNull();
5171dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze    }
5181dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze
5195416a5992bceb91bd3eda63629ba5420a714747bMatthew Fritze    @Test
5205416a5992bceb91bd3eda63629ba5420a714747bMatthew Fritze    public void testAddResource_iconAddedFromXml() {
5215416a5992bceb91bd3eda63629ba5420a714747bMatthew Fritze        SearchIndexableResource resource = getFakeResource(R.xml.connected_devices);
5225416a5992bceb91bd3eda63629ba5420a714747bMatthew Fritze        mManager.indexOneSearchIndexableData(mDb, localeStr, resource, new HashMap<>());
5235416a5992bceb91bd3eda63629ba5420a714747bMatthew Fritze
5245416a5992bceb91bd3eda63629ba5420a714747bMatthew Fritze        Cursor cursor = mDb.rawQuery("SELECT * FROM prefs_index ORDER BY data_title", null);
5255416a5992bceb91bd3eda63629ba5420a714747bMatthew Fritze        cursor.moveToPosition(0);
5265416a5992bceb91bd3eda63629ba5420a714747bMatthew Fritze
5275416a5992bceb91bd3eda63629ba5420a714747bMatthew Fritze        // Icon
5285416a5992bceb91bd3eda63629ba5420a714747bMatthew Fritze        assertThat(cursor.getInt(12)).isNotEqualTo(noIcon);
5295416a5992bceb91bd3eda63629ba5420a714747bMatthew Fritze    }
5305416a5992bceb91bd3eda63629ba5420a714747bMatthew Fritze
5311dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze    // Tests for the flow: IndexOneResource -> IndexFromProvider -> IndexFromResource ->
5321dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze    //                     UpdateOneRowWithFilteredData -> UpdateOneRow
5331dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze
5341dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze    @Test
535ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze    public void testResourceProvider_rowInserted() {
536d299b03f28fd23973b32931c3ae9a254a37d474dDoris Ling        SearchIndexableResource resource = getFakeResource(R.xml.swipe_to_notification_settings);
5371dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        resource.xmlResId = 0;
5381dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        resource.className = "com.android.settings.display.ScreenZoomSettings";
5391dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze
540ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        mManager.indexOneSearchIndexableData(mDb, localeStr, resource, new HashMap<>());
5411dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        Cursor cursor = mDb.rawQuery("SELECT * FROM prefs_index", null);
5421dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getCount()).isEqualTo(1);
5431dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze    }
5441dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze
5451dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze    @Test
546ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze    public void testResourceProvider_rowMatches() {
547d299b03f28fd23973b32931c3ae9a254a37d474dDoris Ling        SearchIndexableResource resource = getFakeResource(R.xml.swipe_to_notification_settings);
5481dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        resource.xmlResId = 0;
5491dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        resource.className = "com.android.settings.display.ScreenZoomSettings";
5501dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze
551ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        mManager.indexOneSearchIndexableData(mDb, localeStr, resource, new HashMap<>());
5521dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        Cursor cursor = mDb.rawQuery("SELECT * FROM prefs_index", null);
5531dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        cursor.moveToPosition(0);
5541dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze
5551dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Locale
5561dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getString(0)).isEqualTo(localeStr);
5571dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Data Rank
5581dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getInt(1)).isEqualTo(rank);
5591dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Data Title
5601dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getString(2)).isEqualTo("Display size");
5611dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Normalized Title
5621dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getString(3)).isEqualTo("display size");
5631dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Summary On
5641dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getString(4)).isEmpty();
5651dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Summary On Normalized
5661dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getString(5)).isEmpty();
5671dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Summary Off - only on for checkbox preferences
5681dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getString(6)).isEmpty();
5691dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Summary off normalized - only on for checkbox preferences
5701dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getString(7)).isEmpty();
5711dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Entries - only on for list preferences
5721dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getString(8)).isNull();
5731dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Keywords
5741dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getString(9)).isEqualTo("display density screen zoom scale scaling");
5751dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Screen Title
5761dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getString(10)).isEqualTo("Display size");
5771dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Class Name
5781dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getString(11))
5791dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze                .isEqualTo("com.android.settings.display.ScreenZoomSettings");
5801dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Icon
5815416a5992bceb91bd3eda63629ba5420a714747bMatthew Fritze        assertThat(cursor.getInt(12)).isEqualTo(noIcon);
5821dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Intent Action
5831dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getString(13)).isNull();
5841dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Target Package
5851dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getString(14)).isNull();
5861dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Target Class
5871dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getString(15)).isNull();
5881dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Enabled
5891dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getInt(16) == 1).isEqualTo(enabled);
5901dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Data ref key
5911dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getString(17)).isNull();
5921dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // User Id
5931dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getInt(18)).isEqualTo(userId);
5941dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Payload Type - default is 0
5951dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getInt(19)).isEqualTo(0);
5961dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Payload - should be updated to real payloads as controllers are added
5971dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getBlob(20)).isNull();
5981dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze    }
5991dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze
6001dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze    @Test
601ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze    public void testResourceProvider_resourceRowInserted() {
6023f3b547e4a2eeeb362d9b7c98b05f9a244cd754eMatthew Fritze        SearchIndexableResource resource = getFakeResource(0);
6031dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        resource.className = "com.android.settings.LegalSettings";
6041dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze
605ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        mManager.indexOneSearchIndexableData(mDb, localeStr, resource, new HashMap<>());
6061dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        Cursor cursor = mDb.rawQuery("SELECT * FROM prefs_index", null);
6073f3b547e4a2eeeb362d9b7c98b05f9a244cd754eMatthew Fritze        assertThat(cursor.getCount()).isEqualTo(6);
6081dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze    }
6091dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze
6101dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze    @Test
611ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze    public void testResourceProvider_resourceRowMatches() {
6123f3b547e4a2eeeb362d9b7c98b05f9a244cd754eMatthew Fritze        SearchIndexableResource resource = getFakeResource(0);
6133f3b547e4a2eeeb362d9b7c98b05f9a244cd754eMatthew Fritze        resource.className = "com.android.settings.display.ScreenZoomSettings";
6141dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze
615ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        mManager.indexOneSearchIndexableData(mDb, localeStr, resource, new HashMap<>());
6161dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        Cursor cursor = mDb.rawQuery("SELECT * FROM prefs_index ORDER BY data_title", null);
6171dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        cursor.moveToPosition(0);
6181dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze
6191dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Locale
6201dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getString(0)).isEqualTo(localeStr);
6211dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Data Rank
6221dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getInt(1)).isEqualTo(rank);
6231dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Data Title
6243f3b547e4a2eeeb362d9b7c98b05f9a244cd754eMatthew Fritze        assertThat(cursor.getString(2)).isEqualTo("Display size");
6251dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Normalized Title
6263f3b547e4a2eeeb362d9b7c98b05f9a244cd754eMatthew Fritze        assertThat(cursor.getString(3)).isEqualTo("display size");
6271dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Summary On
6281dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getString(4)).isEmpty();
6291dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Summary On Normalized
6301dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getString(5)).isEmpty();
6311dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Summary Off - only on for checkbox preferences
6321dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getString(6)).isEmpty();
6331dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Summary off normalized - only on for checkbox preferences
6341dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getString(7)).isEmpty();
6351dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Entries - only on for list preferences
6361dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getString(8)).isNull();
6371dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Keywords
6383f3b547e4a2eeeb362d9b7c98b05f9a244cd754eMatthew Fritze        assertThat(cursor.getString(9)).isEqualTo(
6393f3b547e4a2eeeb362d9b7c98b05f9a244cd754eMatthew Fritze                "display density screen zoom scale scaling");
6401dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Screen Title
6413f3b547e4a2eeeb362d9b7c98b05f9a244cd754eMatthew Fritze        assertThat(cursor.getString(10)).isEqualTo("Display size");
6421dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Class Name
6431dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getString(11))
6443f3b547e4a2eeeb362d9b7c98b05f9a244cd754eMatthew Fritze                .isEqualTo("com.android.settings.display.ScreenZoomSettings");
6451dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Icon
6465416a5992bceb91bd3eda63629ba5420a714747bMatthew Fritze        assertThat(cursor.getInt(12)).isEqualTo(noIcon);
6471dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Intent Action
6481dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getString(13)).isNull();
6491dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Target Package
6501dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getString(14)).isNull();
6511dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Target Class
6521dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getString(15)).isNull();
6531dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Enabled
6541dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getInt(16) == 1).isEqualTo(enabled);
6551dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Data ref key
6561dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getString(17)).isNull();
6571dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // User Id
6581dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getInt(18)).isEqualTo(userId);
6591dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Payload Type - default is 0
6601dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getInt(19)).isEqualTo(0);
6611dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Payload - should be updated to real payloads as controllers are added
6621dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getBlob(20)).isNull();
6631dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze    }
6641dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze
6653f3b547e4a2eeeb362d9b7c98b05f9a244cd754eMatthew Fritze    @Test
666ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze    public void testResourceProvider_disabledResource_rowsInserted() {
6673f3b547e4a2eeeb362d9b7c98b05f9a244cd754eMatthew Fritze        SearchIndexableResource resource = getFakeResource(0);
6683f3b547e4a2eeeb362d9b7c98b05f9a244cd754eMatthew Fritze        resource.className = "com.android.settings.LegalSettings";
6693f3b547e4a2eeeb362d9b7c98b05f9a244cd754eMatthew Fritze
6703f3b547e4a2eeeb362d9b7c98b05f9a244cd754eMatthew Fritze        mManager.indexOneSearchIndexableData(mDb, localeStr, resource,
671ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze                new HashMap<String, Set<String>>());
6723f3b547e4a2eeeb362d9b7c98b05f9a244cd754eMatthew Fritze
6733f3b547e4a2eeeb362d9b7c98b05f9a244cd754eMatthew Fritze        Cursor cursor = mDb.rawQuery("SELECT * FROM prefs_index WHERE enabled = 1", null);
6743f3b547e4a2eeeb362d9b7c98b05f9a244cd754eMatthew Fritze        assertThat(cursor.getCount()).isEqualTo(2);
6753f3b547e4a2eeeb362d9b7c98b05f9a244cd754eMatthew Fritze        cursor = mDb.rawQuery("SELECT * FROM prefs_index WHERE enabled = 0", null);
6763f3b547e4a2eeeb362d9b7c98b05f9a244cd754eMatthew Fritze        assertThat(cursor.getCount()).isEqualTo(4);
6773f3b547e4a2eeeb362d9b7c98b05f9a244cd754eMatthew Fritze    }
6783f3b547e4a2eeeb362d9b7c98b05f9a244cd754eMatthew Fritze
67904615bc1b6a10edad13754c9e6be1197ad150901Matthew Fritze    @Test
680ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze    public void testResource_withTitleAndSettingName_titleNotInserted() {
68104615bc1b6a10edad13754c9e6be1197ad150901Matthew Fritze        SearchIndexableResource resource = getFakeResource(R.xml.swipe_to_notification_settings);
68204615bc1b6a10edad13754c9e6be1197ad150901Matthew Fritze        mManager.indexFromResource(mDb, localeStr, resource, new ArrayList<String>());
68304615bc1b6a10edad13754c9e6be1197ad150901Matthew Fritze
68404615bc1b6a10edad13754c9e6be1197ad150901Matthew Fritze        Cursor cursor = mDb.rawQuery("SELECT * FROM prefs_index WHERE" +
68504615bc1b6a10edad13754c9e6be1197ad150901Matthew Fritze                " enabled = 1", null);
68604615bc1b6a10edad13754c9e6be1197ad150901Matthew Fritze        assertThat(cursor.getCount()).isEqualTo(1);
68704615bc1b6a10edad13754c9e6be1197ad150901Matthew Fritze    }
68804615bc1b6a10edad13754c9e6be1197ad150901Matthew Fritze
689ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze    // Test new public indexing flow
690ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze
691ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze    @Test
692a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze    @Config(shadows = {ShadowDatabaseIndexingUtils.class,})
693ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze    public void testPerformIndexing_fullIndex_getsDataFromProviders() {
694ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        DummyProvider provider = new DummyProvider();
695ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        provider.onCreate();
696a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze        ShadowContentResolver.registerProvider(AUTHORITY_ONE, provider);
697ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze
698ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        // Test that Indexables are added for Full indexing
699ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        when(mPackageManager.queryIntentContentProviders(any(Intent.class), anyInt()))
700ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze                .thenReturn(getDummyResolveInfo());
701ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze
702ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        DatabaseIndexingManager manager =
703a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze                spy(new DatabaseIndexingManager(mContext, PACKAGE_ONE));
704a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze        doReturn(true).when(manager).isFullIndex(anyString(), anyString());
705ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze
706ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        manager.performIndexing();
707ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze
708a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze        verify(manager).addIndexablesFromRemoteProvider(PACKAGE_ONE, AUTHORITY_ONE);
709a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze        verify(manager).updateDatabase(true /* isFullIndex */, Locale.getDefault().toString());
710a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze    }
711ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze
712a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze    @Test
713a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze    @Config(shadows = {ShadowDatabaseIndexingUtils.class,})
714a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze    public void testPerformIndexing_incrementalIndex_noDataAdded() {
715a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze        DummyProvider provider = new DummyProvider();
716a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze        provider.onCreate();
717a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze        ShadowContentResolver.registerProvider(AUTHORITY_ONE, provider);
718ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze
719a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze        // Test that Indexables are added for Full indexing
720a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze        when(mPackageManager.queryIntentContentProviders(any(Intent.class), anyInt()))
721a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze                .thenReturn(getDummyResolveInfo());
722a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze
723a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze        DatabaseIndexingManager manager =
724a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze                spy(new DatabaseIndexingManager(mContext, PACKAGE_ONE));
725a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze        doReturn(false).when(manager).isFullIndex(anyString(), anyString());
726a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze
727a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze        manager.mDataToProcess.dataToUpdate.clear();
728a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze
729a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze        manager.performIndexing();
730a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze
731a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze        verify(manager, times(0)).addDataToDatabase(any(SQLiteDatabase.class), anyString(),
732a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze                anyList(), anyMap());
733a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze        verify(manager, times(0)).addIndexablesFromRemoteProvider(PACKAGE_ONE, AUTHORITY_ONE);
734a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze        verify(manager).updateDataInDatabase(any(SQLiteDatabase.class), anyMap());
735ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze    }
736ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze
737ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze    @Test
738a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze    @Config(shadows = {ShadowDatabaseIndexingUtils.class,})
739a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze    public void testPerformIndexing_localeChanged_databaseDropped() {
740a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze        DummyProvider provider = new DummyProvider();
741a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze        provider.onCreate();
742a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze        ShadowContentResolver.registerProvider(AUTHORITY_ONE, provider);
743a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze
744a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze        // Test that Indexables are added for Full indexing
745a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze        when(mPackageManager.queryIntentContentProviders(any(Intent.class), anyInt()))
746a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze                .thenReturn(getDummyResolveInfo());
747a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze
748a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze        // Initialize the Manager
749a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze        DatabaseIndexingManager manager =
750a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze                spy(new DatabaseIndexingManager(mContext, PACKAGE_ONE));
751a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze        doReturn(true).when(manager).isFullIndex(anyString(), anyString());
752a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze
753a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze        // Insert data point which will be dropped
754a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze        final String oldTitle = "This is French";
755a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze        insertSpecialCase(oldTitle, true, "key");
756a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze
757a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze        // Add a data point to be added by the indexing
758a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze        SearchIndexableRaw raw = new SearchIndexableRaw(mContext);
759a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze        final String newTitle = "This is English";
760a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze        raw.title = newTitle;
761a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze        manager.mDataToProcess.dataToUpdate.add(raw);
762a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze
763a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze        manager.performIndexing();
764a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze
765a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze        // Assert that the New Title is inserted
766a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze        final Cursor newCursor = mDb.rawQuery("SELECT * FROM prefs_index WHERE data_title = '" +
767a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze                newTitle + "'", null);
768a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze        assertThat(newCursor.getCount()).isEqualTo(1);
769a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze
770a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze        // Assert that the Old Title is no longer in the database, since it was dropped
771a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze        final Cursor oldCursor = mDb.rawQuery("SELECT * FROM prefs_index WHERE data_title = '" +
772a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze                oldTitle + "'", null);
773a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze        assertThat(oldCursor.getCount()).isEqualTo(0);
774a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze    }
775a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze
776a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze    @Test
777a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze    @Config(shadows = {ShadowDatabaseIndexingUtils.class,})
778a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze    public void testPerformIndexing_onOta_FullIndex() {
779ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        DummyProvider provider = new DummyProvider();
780ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        provider.onCreate();
781ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        ShadowContentResolver.registerProvider(
782ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze                AUTHORITY_ONE, provider
783ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        );
784ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze
785ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        // Test that Indexables are added for Full indexing
786ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        when(mPackageManager.queryIntentContentProviders(any(Intent.class), anyInt()))
787ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze                .thenReturn(getDummyResolveInfo());
788ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze
789ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        DatabaseIndexingManager manager =
790a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze                spy(new DatabaseIndexingManager(mContext, PACKAGE_ONE));
791a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze        doReturn(true).when(manager).isFullIndex(anyString(), anyString());
792ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze
793ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        manager.performIndexing();
794ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze
795a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze        verify(manager).updateDatabase(true /* isFullIndex */, Locale.getDefault().toString());
796a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze    }
797ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze
798a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze    @Test
799a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze    @Config(shadows = {ShadowDatabaseIndexingUtils.class,})
800a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze    public void testPerformIndexing_onOta_buildNumberIsCached() {
801a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze        DummyProvider provider = new DummyProvider();
802a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze        provider.onCreate();
803a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze        ShadowContentResolver.registerProvider(
804a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze                AUTHORITY_ONE, provider
805a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze        );
806a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze
807a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze        // Test that Indexables are added for Full indexing
808a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze        when(mPackageManager.queryIntentContentProviders(any(Intent.class), anyInt()))
809a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze                .thenReturn(getDummyResolveInfo());
810a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze
811a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze        DatabaseIndexingManager manager =
812a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze                spy(new DatabaseIndexingManager(mContext, PACKAGE_ONE));
813a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze        doReturn(true).when(manager).isFullIndex(anyString(), anyString());
814a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze
815a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze        manager.performIndexing();
816a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze
817a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze        assertThat(IndexDatabaseHelper.getInstance(mContext).isBuildIndexed(mContext,
818a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze                Build.FINGERPRINT)).isTrue();
819ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze    }
820ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze
821ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze    @Test
822ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze    public void testFullUpdatedDatabase_noData_addDataToDatabaseNotCalled() {
823a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze        mManager.updateDatabase(true /* isFullIndex */, localeStr);
824ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        mManager.mDataToProcess.dataToUpdate.clear();
825ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        verify(mManager, times(0)).addDataToDatabase(any(SQLiteDatabase.class), anyString(),
826ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze                anyList(), anyMap());
827ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze    }
828ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze
829ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze    @Test
830ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze    public void testFullUpdatedDatabase_updatedDataInDatabaseNotCalled() {
831a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze        mManager.updateDatabase(true /* isFullIndex */, localeStr);
832ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        verify(mManager, times(0)).updateDataInDatabase(any(SQLiteDatabase.class), anyMap());
833ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze    }
834ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze
835ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze    @Test
8368a42b074a7ccaf8325b571d261fda5b9a494a059Matthew Fritze    public void testLocaleUpdated_afterIndexing_localeNotAdded() {
837a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze        mManager.updateDatabase(true /* isFullIndex */, localeStr);
838ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        assertThat(IndexDatabaseHelper.getInstance(mContext)
8398a42b074a7ccaf8325b571d261fda5b9a494a059Matthew Fritze                .isLocaleAlreadyIndexed(mContext, localeStr)).isFalse();
8408a42b074a7ccaf8325b571d261fda5b9a494a059Matthew Fritze    }
8418a42b074a7ccaf8325b571d261fda5b9a494a059Matthew Fritze
8428a42b074a7ccaf8325b571d261fda5b9a494a059Matthew Fritze    @Test
8438a42b074a7ccaf8325b571d261fda5b9a494a059Matthew Fritze    public void testLocaleUpdated_afterFullIndexing_localeAdded() {
8448a42b074a7ccaf8325b571d261fda5b9a494a059Matthew Fritze        mManager.performIndexing();
8458a42b074a7ccaf8325b571d261fda5b9a494a059Matthew Fritze        assertThat(IndexDatabaseHelper.getInstance(mContext)
846ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze                .isLocaleAlreadyIndexed(mContext, localeStr)).isTrue();
847ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze    }
848ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze
849ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze    @Test
850ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze    public void testUpdateDatabase_newEligibleData_addedToDatabase() {
851ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        // Test that addDataToDatabase is called when dataToUpdate is non-empty
852ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        mManager.mDataToProcess.dataToUpdate.add(getFakeRaw());
853a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze        mManager.updateDatabase(true /* isFullIndex */, localeStr);
854ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze
855ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        Cursor cursor = mDb.rawQuery("SELECT * FROM prefs_index", null);
856ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        cursor.moveToPosition(0);
857ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze
858ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        // Locale
859ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        assertThat(cursor.getString(0)).isEqualTo(localeStr);
860ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        // Data Rank
861ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        assertThat(cursor.getInt(1)).isEqualTo(rank);
862ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        // Data Title
863ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        assertThat(cursor.getString(2)).isEqualTo(updatedTitle);
864ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        // Normalized Title
865ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        assertThat(cursor.getString(3)).isEqualTo(normalizedTitle);
866ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        // Summary On
867ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        assertThat(cursor.getString(4)).isEqualTo(updatedSummaryOn);
868ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        // Summary On Normalized
869ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        assertThat(cursor.getString(5)).isEqualTo(normalizedSummaryOn);
870ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        // Summary Off
871ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        assertThat(cursor.getString(6)).isEqualTo(updatedSummaryOff);
872ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        // Summary off normalized
873ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        assertThat(cursor.getString(7)).isEqualTo(normalizedSummaryOff);
874ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        // Entries
875ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        assertThat(cursor.getString(8)).isEqualTo(entries);
876ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        // Keywords
877ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        assertThat(cursor.getString(9)).isEqualTo(spaceDelimittedKeywords);
878ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        // Screen Title
879ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        assertThat(cursor.getString(10)).isEqualTo(screenTitle);
880ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        // Class Name
881ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        assertThat(cursor.getString(11)).isEqualTo(className);
882ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        // Icon
883ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        assertThat(cursor.getInt(12)).isEqualTo(iconResId);
884ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        // Intent Action
885ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        assertThat(cursor.getString(13)).isEqualTo(action);
886ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        // Target Package
887ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        assertThat(cursor.getString(14)).isEqualTo(targetPackage);
888ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        // Target Class
889ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        assertThat(cursor.getString(15)).isEqualTo(targetClass);
890ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        // Enabled
891ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        assertThat(cursor.getInt(16) == 1).isEqualTo(enabled);
892ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        // Data ref key
893ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        assertThat(cursor.getString(17)).isNotNull();
894ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        // User Id
895ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        assertThat(cursor.getInt(18)).isEqualTo(userId);
896ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        // Payload Type - default is 0
897ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        assertThat(cursor.getInt(19)).isEqualTo(0);
898ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        // Payload
899ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        assertThat(cursor.getBlob(20)).isNull();
900ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze    }
901ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze
902ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze    @Test
903ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze    public void testUpdateDataInDatabase_enabledResultsAreNonIndexable_becomeDisabled() {
904ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        // Both results are enabled, and then TITLE_ONE gets disabled.
905ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        final boolean enabled = true;
906ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        insertSpecialCase(TITLE_ONE, enabled, KEY_ONE);
907ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        insertSpecialCase(TITLE_TWO, enabled, KEY_TWO);
908ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        Map<String, Set<String>> niks = new ArrayMap<>();
909ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        Set<String> keys = new HashSet<>();
910ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        keys.add(KEY_ONE);
911ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        niks.put(targetPackage, keys);
912ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze
913ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        mManager.updateDataInDatabase(mDb, niks);
914ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze
915ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        Cursor cursor = mDb.rawQuery("SELECT * FROM prefs_index WHERE enabled = 0", null);
916ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        cursor.moveToPosition(0);
917ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze
918ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        assertThat(cursor.getString(2)).isEqualTo(TITLE_ONE);
919ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze    }
920ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze
921ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze    @Test
9224f198813ed0d513ddb1461315bae1c881904ebf0Matthew Fritze    public void testUpdateDataInDatabase_disabledResultsAreIndexable_becomeEnabled() {
923ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        // Both results are initially disabled, and then TITLE_TWO gets enabled.
924ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        final boolean enabled = false;
925ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        insertSpecialCase(TITLE_ONE, enabled, KEY_ONE);
926ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        insertSpecialCase(TITLE_TWO, enabled, KEY_TWO);
927ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        Map<String, Set<String>> niks = new ArrayMap<>();
928ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        Set<String> keys = new HashSet<>();
929ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        keys.add(KEY_ONE);
930ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        niks.put(targetPackage, keys);
931ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze
932ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        mManager.updateDataInDatabase(mDb, niks);
933ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze
934ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        Cursor cursor = mDb.rawQuery("SELECT * FROM prefs_index WHERE enabled = 1", null);
935ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        cursor.moveToPosition(0);
936ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze
937ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        assertThat(cursor.getString(2)).isEqualTo(TITLE_TWO);
938ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze    }
939ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze
9404f198813ed0d513ddb1461315bae1c881904ebf0Matthew Fritze    @Test
9414f198813ed0d513ddb1461315bae1c881904ebf0Matthew Fritze    @Config(shadows = {ShadowContentResolver.class})
9424f198813ed0d513ddb1461315bae1c881904ebf0Matthew Fritze    public void testEmptyNonIndexableKeys_emptyDataKeyResources_addedToDatabase() {
9434f198813ed0d513ddb1461315bae1c881904ebf0Matthew Fritze        insertSpecialCase(TITLE_ONE, true /* enabled */, null /* dataReferenceKey */);
9444f198813ed0d513ddb1461315bae1c881904ebf0Matthew Fritze
9454f198813ed0d513ddb1461315bae1c881904ebf0Matthew Fritze        mManager.updateDatabase(false, localeStr);
9464f198813ed0d513ddb1461315bae1c881904ebf0Matthew Fritze
9474f198813ed0d513ddb1461315bae1c881904ebf0Matthew Fritze        Cursor cursor = mDb.rawQuery("SELECT * FROM prefs_index WHERE enabled = 1", null);
9484f198813ed0d513ddb1461315bae1c881904ebf0Matthew Fritze        cursor.moveToPosition(0);
9494f198813ed0d513ddb1461315bae1c881904ebf0Matthew Fritze        assertThat(cursor.getCount()).isEqualTo(1);
9504f198813ed0d513ddb1461315bae1c881904ebf0Matthew Fritze        assertThat(cursor.getString(2)).isEqualTo(TITLE_ONE);
9514f198813ed0d513ddb1461315bae1c881904ebf0Matthew Fritze    }
952ab0b3f6790de6e58258be2c374b59e6056c7bfd2Matthew Fritze
953ab0b3f6790de6e58258be2c374b59e6056c7bfd2Matthew Fritze    @Test
954ab0b3f6790de6e58258be2c374b59e6056c7bfd2Matthew Fritze    public void testUpdateAsyncTask_onPostExecute_performsCallback() {
955ab0b3f6790de6e58258be2c374b59e6056c7bfd2Matthew Fritze        IndexingCallback callback = mock(IndexingCallback.class);
956ab0b3f6790de6e58258be2c374b59e6056c7bfd2Matthew Fritze
957ab0b3f6790de6e58258be2c374b59e6056c7bfd2Matthew Fritze        DatabaseIndexingManager.IndexingTask task = mManager.new IndexingTask(callback);
958ab0b3f6790de6e58258be2c374b59e6056c7bfd2Matthew Fritze        task.execute();
959ab0b3f6790de6e58258be2c374b59e6056c7bfd2Matthew Fritze
960ab0b3f6790de6e58258be2c374b59e6056c7bfd2Matthew Fritze        Robolectric.flushForegroundThreadScheduler();
961ab0b3f6790de6e58258be2c374b59e6056c7bfd2Matthew Fritze
962ab0b3f6790de6e58258be2c374b59e6056c7bfd2Matthew Fritze        verify(callback).onIndexingFinished();
963ab0b3f6790de6e58258be2c374b59e6056c7bfd2Matthew Fritze    }
964ab0b3f6790de6e58258be2c374b59e6056c7bfd2Matthew Fritze
965ab0b3f6790de6e58258be2c374b59e6056c7bfd2Matthew Fritze    @Test
966ab0b3f6790de6e58258be2c374b59e6056c7bfd2Matthew Fritze    public void testUpdateAsyncTask_onPostExecute_setsIndexingComplete() {
967ab0b3f6790de6e58258be2c374b59e6056c7bfd2Matthew Fritze        SearchFeatureProviderImpl provider = new SearchFeatureProviderImpl();
968ab0b3f6790de6e58258be2c374b59e6056c7bfd2Matthew Fritze        DatabaseIndexingManager manager = spy(provider.getIndexingManager(mContext));
969ab0b3f6790de6e58258be2c374b59e6056c7bfd2Matthew Fritze        DatabaseIndexingManager.IndexingTask task = manager.new IndexingTask(null);
970ab0b3f6790de6e58258be2c374b59e6056c7bfd2Matthew Fritze        doNothing().when(manager).performIndexing();
971ab0b3f6790de6e58258be2c374b59e6056c7bfd2Matthew Fritze
972ab0b3f6790de6e58258be2c374b59e6056c7bfd2Matthew Fritze        task.execute();
973ab0b3f6790de6e58258be2c374b59e6056c7bfd2Matthew Fritze        Robolectric.flushForegroundThreadScheduler();
974ab0b3f6790de6e58258be2c374b59e6056c7bfd2Matthew Fritze
975ab0b3f6790de6e58258be2c374b59e6056c7bfd2Matthew Fritze        assertThat(provider.isIndexingComplete(mContext)).isTrue();
976ab0b3f6790de6e58258be2c374b59e6056c7bfd2Matthew Fritze    }
977ab0b3f6790de6e58258be2c374b59e6056c7bfd2Matthew Fritze
9781dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze    // Util functions
9791dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze
9801dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze    private SearchIndexableRaw getFakeRaw() {
9811dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        return getFakeRaw(localeStr);
9821dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze    }
9831dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze
9841dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze    private SearchIndexableRaw getFakeRaw(String localeStr) {
9851dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        SearchIndexableRaw data = new SearchIndexableRaw(mContext);
9861dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        data.locale = new Locale(localeStr);
9871dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        data.rank = rank;
9881dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        data.title = title;
9891dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        data.summaryOn = summaryOn;
9901dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        data.summaryOff = summaryOff;
9911dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        data.entries = entries;
9921dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        data.keywords = keywords;
9931dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        data.screenTitle = screenTitle;
9941dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        data.className = className;
9951dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        data.packageName = packageName;
9961dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        data.iconResId = iconResId;
9971dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        data.intentAction = action;
9981dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        data.intentTargetPackage = targetPackage;
9991dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        data.intentTargetClass = targetClass;
10001dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        data.key = key;
10011dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        data.userId = userId;
10021dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        data.enabled = enabled;
10031dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        return data;
10041dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze    }
10051dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze
10061dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze    private SearchIndexableResource getFakeResource(int xml) {
10071dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        SearchIndexableResource sir = new SearchIndexableResource(mContext);
10081dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        sir.rank = rank;
10091dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        sir.xmlResId = xml;
10101dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        sir.className = className;
10111dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        sir.packageName = packageName;
10121dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        sir.iconResId = iconResId;
10131dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        sir.intentAction = action;
10141dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        sir.intentTargetPackage = targetPackage;
10151dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        sir.intentTargetClass = targetClass;
10161dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        sir.enabled = enabled;
10171dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        return sir;
10181dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze    }
10193f3b547e4a2eeeb362d9b7c98b05f9a244cd754eMatthew Fritze
1020ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze    private Map<String, Set<String>> getNonIndexableKeys(String[] keys) {
1021ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        Map<String, Set<String>> niks = new HashMap<>();
1022ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        Set<String> keysList = new HashSet<>();
1023ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        keysList.addAll(Arrays.asList(keys));
10243f3b547e4a2eeeb362d9b7c98b05f9a244cd754eMatthew Fritze        niks.put(packageName, keysList);
10253f3b547e4a2eeeb362d9b7c98b05f9a244cd754eMatthew Fritze        return niks;
10263f3b547e4a2eeeb362d9b7c98b05f9a244cd754eMatthew Fritze    }
1027ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze
1028ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze    private List<ResolveInfo> getDummyResolveInfo() {
1029ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        List<ResolveInfo> infoList = new ArrayList<>();
1030ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        ResolveInfo info = new ResolveInfo();
1031ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        info.providerInfo = new ProviderInfo();
1032ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        info.providerInfo.exported = true;
1033ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        info.providerInfo.authority = AUTHORITY_ONE;
1034ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        info.providerInfo.packageName = PACKAGE_ONE;
1035ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        infoList.add(info);
1036ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze
1037ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        return infoList;
1038ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze    }
1039ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze
1040ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze    // TODO move this method and its counterpart in CursorToSearchResultConverterTest into
1041ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze    // a util class with public fields to assert values.
1042ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze    private Cursor getDummyCursor() {
10434f198813ed0d513ddb1461315bae1c881904ebf0Matthew Fritze        MatrixCursor cursor = new MatrixCursor(INDEXABLES_RAW_COLUMNS);
1044ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        final String BLANK = "";
1045ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze
1046ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        ArrayList<String> item =
10474f198813ed0d513ddb1461315bae1c881904ebf0Matthew Fritze                new ArrayList<>(INDEXABLES_RAW_COLUMNS.length);
1048ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        item.add("42"); // Rank
1049ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        item.add(TITLE_ONE); // Title
1050ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        item.add(BLANK); // Summary on
1051ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        item.add(BLANK); // summary off
1052ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        item.add(BLANK); // entries
1053ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        item.add(BLANK); // keywords
1054ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        item.add(BLANK); // screen title
1055ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        item.add(BLANK); // classname
1056ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        item.add("123"); // Icon
1057ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        item.add(BLANK); // Intent action
1058ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        item.add(BLANK); // target package
1059ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        item.add(BLANK); // target class
1060ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        item.add(KEY_ONE); // Key
1061ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        item.add("-1"); // userId
1062ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        cursor.addRow(item);
1063ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze
1064ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        return cursor;
1065ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze    }
1066ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze
1067ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze    private void insertSpecialCase(String specialCase, boolean enabled, String key) {
1068ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze
1069ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        ContentValues values = new ContentValues();
1070ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        values.put(IndexDatabaseHelper.IndexColumns.DOCID, specialCase.hashCode());
1071ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        values.put(IndexDatabaseHelper.IndexColumns.LOCALE, localeStr);
1072ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        values.put(IndexDatabaseHelper.IndexColumns.DATA_RANK, 1);
1073ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        values.put(IndexDatabaseHelper.IndexColumns.DATA_TITLE, specialCase);
1074ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        values.put(IndexDatabaseHelper.IndexColumns.DATA_TITLE_NORMALIZED, "");
1075ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        values.put(IndexDatabaseHelper.IndexColumns.DATA_SUMMARY_ON, "");
1076ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        values.put(IndexDatabaseHelper.IndexColumns.DATA_SUMMARY_ON_NORMALIZED, "");
1077ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        values.put(IndexDatabaseHelper.IndexColumns.DATA_SUMMARY_OFF, "");
1078ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        values.put(IndexDatabaseHelper.IndexColumns.DATA_SUMMARY_OFF_NORMALIZED, "");
1079ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        values.put(IndexDatabaseHelper.IndexColumns.DATA_ENTRIES, "");
1080ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        values.put(IndexDatabaseHelper.IndexColumns.DATA_KEYWORDS, "");
1081ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        values.put(IndexDatabaseHelper.IndexColumns.CLASS_NAME, "");
1082ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        values.put(IndexDatabaseHelper.IndexColumns.SCREEN_TITLE, "Moves");
1083ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        values.put(IndexDatabaseHelper.IndexColumns.INTENT_ACTION, "");
1084ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        values.put(IndexDatabaseHelper.IndexColumns.INTENT_TARGET_PACKAGE, targetPackage);
1085ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        values.put(IndexDatabaseHelper.IndexColumns.INTENT_TARGET_CLASS, "");
1086ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        values.put(IndexDatabaseHelper.IndexColumns.ICON, "");
1087ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        values.put(IndexDatabaseHelper.IndexColumns.ENABLED, enabled);
1088ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        values.put(IndexDatabaseHelper.IndexColumns.DATA_KEY_REF, key);
1089ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        values.put(IndexDatabaseHelper.IndexColumns.USER_ID, 0);
1090ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        values.put(IndexDatabaseHelper.IndexColumns.PAYLOAD_TYPE, 0);
1091ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        values.put(IndexDatabaseHelper.IndexColumns.PAYLOAD, (String) null);
1092ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze
1093ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        mDb.replaceOrThrow(IndexDatabaseHelper.Tables.TABLE_PREFS_INDEX, null, values);
1094ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze    }
1095ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze
1096ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze    private class DummyProvider extends ContentProvider {
1097ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze
1098ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        @Override
1099ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        public boolean onCreate() {
1100ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze            return false;
1101ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        }
1102ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze
1103ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        @Override
1104ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        public Cursor query(@NonNull Uri uri, @Nullable String[] projection,
1105ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze                @Nullable String selection, @Nullable String[] selectionArgs,
1106ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze                @Nullable String sortOrder) {
1107ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze            if (uri.toString().contains("xml")) {
1108ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze                return null;
1109ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze            }
1110ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze            return getDummyCursor();
1111ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        }
1112ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze
1113ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        @Override
1114ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        public String getType(@NonNull Uri uri) {
1115ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze            return null;
1116ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        }
1117ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze
1118ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        @Override
1119ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        public Uri insert(@NonNull Uri uri, @Nullable ContentValues values) {
1120ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze            return null;
1121ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        }
1122ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze
1123ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        @Override
1124ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        public int delete(@NonNull Uri uri, @Nullable String selection,
1125ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze                @Nullable String[] selectionArgs) {
1126ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze            return 0;
1127ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        }
1128ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze
1129ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        @Override
1130ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        public int update(@NonNull Uri uri, @Nullable ContentValues values,
1131ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze                @Nullable String selection, @Nullable String[] selectionArgs) {
1132ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze            return 0;
1133ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        }
1134ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze    }
1135a9831d40d081cc8c7ca32891e64c09b5e1d19abbPhilip Quinn}
1136