Prevent race conditions after dropping database

Block all loaders from accessing the database
before indexing is complete.

Bug: 37501479
Test: make RunSettingsRoboTests
Change-Id: I2af98dcf6bceacbeffa70bd40879c97bb0cbc828
Merged-In: I02f8423c0ffc27abbb8ceb61a8c47d2f0796d0bb
This commit is contained in:
Matthew Fritze
2017-04-25 09:38:56 -07:00
parent 4f5b13f97a
commit ab0b3f6790
9 changed files with 240 additions and 75 deletions

View File

@@ -37,6 +37,7 @@ import com.android.settings.R;
import com.android.settings.SettingsRobolectricTestRunner;
import com.android.settings.TestConfig;
import com.android.settings.search.IndexDatabaseHelper;
import com.android.settings.search.IndexingCallback;
import com.android.settings.search.SearchIndexableRaw;
import com.android.settings.testutils.DatabaseTestUtils;
import com.android.settings.testutils.shadow.ShadowDatabaseIndexingUtils;
@@ -47,6 +48,7 @@ import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
import org.robolectric.Robolectric;
import org.robolectric.RuntimeEnvironment;
import org.robolectric.annotation.Config;
import org.robolectric.shadows.ShadowContentResolver;
@@ -67,6 +69,7 @@ import static org.mockito.Matchers.anyInt;
import static org.mockito.Matchers.anyList;
import static org.mockito.Matchers.anyMap;
import static org.mockito.Matchers.anyString;
import static org.mockito.Mockito.doNothing;
import static org.mockito.Mockito.doReturn;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.spy;
@@ -933,6 +936,32 @@ public class DatabaseIndexingManagerTest {
assertThat(cursor.getCount()).isEqualTo(1);
assertThat(cursor.getString(2)).isEqualTo(TITLE_ONE);
}
@Test
public void testUpdateAsyncTask_onPostExecute_performsCallback() {
IndexingCallback callback = mock(IndexingCallback.class);
DatabaseIndexingManager.IndexingTask task = mManager.new IndexingTask(callback);
task.execute();
Robolectric.flushForegroundThreadScheduler();
verify(callback).onIndexingFinished();
}
@Test
public void testUpdateAsyncTask_onPostExecute_setsIndexingComplete() {
SearchFeatureProviderImpl provider = new SearchFeatureProviderImpl();
DatabaseIndexingManager manager = spy(provider.getIndexingManager(mContext));
DatabaseIndexingManager.IndexingTask task = manager.new IndexingTask(null);
doNothing().when(manager).performIndexing();
task.execute();
Robolectric.flushForegroundThreadScheduler();
assertThat(provider.isIndexingComplete(mContext)).isTrue();
}
// Util functions
private SearchIndexableRaw getFakeRaw() {