Some of the AmbientDisplay preference controllers were crashing when their isAvailable methods were being called by their fragment's search index providers, which meant that the entire collection of non-indexable keys failed. Thus, all search results were showing up. In the case of a secondary user, they were able to see developer options which crashed settings when clicked. There are two issues addressed in this cl. 1. Fix the crashes so the non-indexable keys collection works 2. Contain each fragment's collection, so that if a fragment does crash, the damage is minimized. Part 1 is checking that the config in isAvailable is not null, and creating one if so. Part 2 is fixed by surrounding the collection of non-indexable keys in a try-catch, with an option in the catch to re-throw the error if a system property is set. Thus, in a new pre-submit instrumentation test, we can and docheck if any of the fragments crash when collecting non-indexable keys. Change-Id: I820bd9cb2649aa6faff7f82fcf575a62e41dc4fc Fixes: 77486668 Test: atest NonIndexableCrashTest, robotests
86 lines
3.0 KiB
Java
86 lines
3.0 KiB
Java
/*
|
|
* Copyright (C) 2017 The Android Open Source Project
|
|
*
|
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
* you may not use this file except in compliance with the License.
|
|
* You may obtain a copy of the License at
|
|
*
|
|
* http://www.apache.org/licenses/LICENSE-2.0
|
|
*
|
|
* Unless required by applicable law or agreed to in writing, software
|
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
* See the License for the specific language governing permissions and
|
|
* limitations under the License.
|
|
*/
|
|
|
|
package com.android.settings.search;
|
|
|
|
import static com.google.common.truth.Truth.assertThat;
|
|
|
|
import android.content.Context;
|
|
import android.database.Cursor;
|
|
import android.net.Uri;
|
|
import android.platform.test.annotations.Presubmit;
|
|
import android.provider.SearchIndexablesContract;
|
|
import android.support.test.InstrumentationRegistry;
|
|
import android.support.test.filters.SmallTest;
|
|
import android.support.test.runner.AndroidJUnit4;
|
|
|
|
import org.junit.After;
|
|
import org.junit.Before;
|
|
import org.junit.Test;
|
|
import org.junit.runner.RunWith;
|
|
|
|
@RunWith(AndroidJUnit4.class)
|
|
@SmallTest
|
|
public class SettingsSearchIndexablesProviderTest {
|
|
|
|
private Context mContext;
|
|
|
|
@Before
|
|
public void setUp() {
|
|
mContext = InstrumentationRegistry.getTargetContext();
|
|
}
|
|
|
|
@After
|
|
public void cleanUp() {
|
|
System.clearProperty(SettingsSearchIndexablesProvider.SYSPROP_CRASH_ON_ERROR);
|
|
}
|
|
|
|
@Test
|
|
public void testSiteMapPairsFetched() {
|
|
final Uri uri = Uri.parse("content://" + mContext.getPackageName() + "/" +
|
|
SearchIndexablesContract.SITE_MAP_PAIRS_PATH);
|
|
final Cursor cursor = mContext.getContentResolver().query(uri, null, null, null, null);
|
|
|
|
final int size = cursor.getCount();
|
|
assertThat(size).isGreaterThan(0);
|
|
while (cursor.moveToNext()) {
|
|
assertThat(cursor.getString(cursor.getColumnIndexOrThrow(
|
|
SearchIndexablesContract.SiteMapColumns.PARENT_CLASS)))
|
|
.isNotEmpty();
|
|
assertThat(cursor.getString(cursor.getColumnIndexOrThrow(
|
|
SearchIndexablesContract.SiteMapColumns.CHILD_CLASS)))
|
|
.isNotEmpty();
|
|
}
|
|
}
|
|
|
|
/**
|
|
* All {@link Indexable.SearchIndexProvider} should collect a list of non-indexable keys
|
|
* without crashing. This test enables crashing of individual providers in the indexing pipeline
|
|
* and checks that there are no crashes.
|
|
*/
|
|
@Test
|
|
@Presubmit
|
|
public void nonIndexableKeys_shouldNotCrash() {
|
|
// Allow crashes in the indexing pipeline.
|
|
System.setProperty(SettingsSearchIndexablesProvider.SYSPROP_CRASH_ON_ERROR,
|
|
"enabled");
|
|
|
|
final Uri uri = Uri.parse("content://" + mContext.getPackageName() + "/" +
|
|
SearchIndexablesContract.NON_INDEXABLES_KEYS_PATH);
|
|
mContext.getContentResolver().query(uri, null, null, null, null);
|
|
}
|
|
}
|