Make Settings robotest work with tot Robolectric

Bug: 116278591
Test: make -j RunSettingsRoboTests
Change-Id: I32cb2fcf6094675f79d2fc24702ef6298a9691e4
This commit is contained in:
Fan Zhang
2018-10-11 15:37:36 -07:00
parent dd3feeb155
commit cdf284b732
140 changed files with 706 additions and 823 deletions

View File

@@ -25,7 +25,6 @@ import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.anyString;
import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.Mockito.doReturn;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.never;
import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.verify;
@@ -41,6 +40,7 @@ import android.os.StrictMode;
import android.provider.Settings;
import android.provider.SettingsSlicesContract;
import android.util.ArraySet;
import android.view.accessibility.AccessibilityManager;
import androidx.slice.Slice;
import androidx.slice.SliceProvider;
@@ -54,18 +54,26 @@ import com.android.settings.notification.ZenModeSliceBuilder;
import com.android.settings.testutils.DatabaseTestUtils;
import com.android.settings.testutils.FakeToggleController;
import com.android.settings.testutils.SettingsRobolectricTestRunner;
import com.android.settings.testutils.shadow.ShadowBluetoothAdapter;
import com.android.settings.testutils.shadow.ShadowLockPatternUtils;
import com.android.settings.testutils.shadow.ShadowThreadUtils;
import com.android.settings.testutils.shadow.ShadowUserManager;
import com.android.settings.testutils.shadow.ShadowUtils;
import com.android.settings.wifi.WifiSlice;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
import org.robolectric.RuntimeEnvironment;
import org.robolectric.annotation.Config;
import org.robolectric.annotation.Implementation;
import org.robolectric.annotation.Implements;
import org.robolectric.annotation.Resetter;
import org.robolectric.shadow.api.Shadow;
import org.robolectric.shadows.ShadowAccessibilityManager;
import java.io.IOException;
import java.util.ArrayList;
@@ -81,7 +89,9 @@ import java.util.Set;
* TODO Investigate using ShadowContentResolver.registerProviderInternal(String, ContentProvider)
*/
@RunWith(SettingsRobolectricTestRunner.class)
@Config(shadows = ShadowThreadUtils.class)
@Config(shadows = {ShadowUserManager.class, ShadowThreadUtils.class, ShadowUtils.class,
SlicesDatabaseAccessorTest.ShadowApplicationPackageManager.class,
ShadowBluetoothAdapter.class, ShadowLockPatternUtils.class})
public class SettingsSliceProviderTest {
private static final String KEY = "KEY";
@@ -97,7 +107,7 @@ public class SettingsSliceProviderTest {
private Context mContext;
private SettingsSliceProvider mProvider;
private SQLiteDatabase mDb;
@Mock
private SliceManager mManager;
private static final List<Uri> SPECIAL_CASE_PLATFORM_URIS = Arrays.asList(
@@ -113,7 +123,13 @@ public class SettingsSliceProviderTest {
@Before
public void setUp() {
MockitoAnnotations.initMocks(this);
mContext = spy(RuntimeEnvironment.application);
// Register the fake a11y Service
ShadowAccessibilityManager shadowAccessibilityManager = Shadow.extract(
RuntimeEnvironment.application.getSystemService(AccessibilityManager.class));
shadowAccessibilityManager.setInstalledAccessibilityServiceList(new ArrayList<>());
mProvider = spy(new SettingsSliceProvider());
ShadowStrictMode.reset();
mProvider.mSliceWeakDataCache = new HashMap<>();
@@ -122,10 +138,9 @@ public class SettingsSliceProviderTest {
mProvider.mCustomSliceManager = spy(new CustomSliceManager(mContext));
when(mProvider.getContext()).thenReturn(mContext);
mDb = SlicesDatabaseHelper.getInstance(mContext).getWritableDatabase();
SlicesDatabaseHelper.getInstance(mContext).setIndexedState();
mManager = mock(SliceManager.class);
when(mContext.getSystemService(SliceManager.class)).thenReturn(mManager);
doReturn(mManager).when(mContext).getSystemService(SliceManager.class);
when(mManager.getPinnedSlices()).thenReturn(Collections.emptyList());
SliceProvider.setSpecs(SliceLiveData.SUPPORTED_SPECS);
@@ -562,7 +577,7 @@ public class SettingsSliceProviderTest {
}
private void insertSpecialCase(String key, boolean isPlatformSlice) {
ContentValues values = new ContentValues();
final ContentValues values = new ContentValues();
values.put(SlicesDatabaseHelper.IndexColumns.KEY, key);
values.put(SlicesDatabaseHelper.IndexColumns.TITLE, TITLE);
values.put(SlicesDatabaseHelper.IndexColumns.SUMMARY, "s");
@@ -572,8 +587,15 @@ public class SettingsSliceProviderTest {
values.put(SlicesDatabaseHelper.IndexColumns.CONTROLLER, PREF_CONTROLLER);
values.put(SlicesDatabaseHelper.IndexColumns.PLATFORM_SLICE, isPlatformSlice);
values.put(SlicesDatabaseHelper.IndexColumns.SLICE_TYPE, SliceData.SliceType.INTENT);
mDb.replaceOrThrow(SlicesDatabaseHelper.Tables.TABLE_SLICES_INDEX, null, values);
final SQLiteDatabase db = SlicesDatabaseHelper.getInstance(mContext).getWritableDatabase();
db.beginTransaction();
try {
db.replaceOrThrow(SlicesDatabaseHelper.Tables.TABLE_SLICES_INDEX, null, values);
db.setTransactionSuccessful();
} finally {
db.endTransaction();
}
db.close();
}
private static SliceData getDummyData() {
@@ -589,7 +611,7 @@ public class SettingsSliceProviderTest {
.build();
}
@Implements(value = StrictMode.class, inheritImplementationMethods = true)
@Implements(value = StrictMode.class)
public static class ShadowStrictMode {
private static int sSetThreadPolicyCount;

View File

@@ -21,6 +21,8 @@ import static com.google.common.truth.Truth.assertThat;
import static org.mockito.Mockito.spy;
import android.app.ApplicationPackageManager;
import android.content.ComponentName;
import android.content.ContentValues;
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
@@ -33,6 +35,10 @@ import com.android.settings.testutils.DatabaseTestUtils;
import com.android.settings.testutils.FakeFeatureFactory;
import com.android.settings.testutils.FakeIndexProvider;
import com.android.settings.testutils.SettingsRobolectricTestRunner;
import com.android.settings.testutils.shadow.ShadowBluetoothAdapter;
import com.android.settings.testutils.shadow.ShadowLockPatternUtils;
import com.android.settings.testutils.shadow.ShadowUserManager;
import com.android.settings.testutils.shadow.ShadowUtils;
import org.junit.After;
import org.junit.Before;
@@ -40,6 +46,8 @@ import org.junit.Test;
import org.junit.runner.RunWith;
import org.robolectric.RuntimeEnvironment;
import org.robolectric.annotation.Config;
import org.robolectric.annotation.Implementation;
import org.robolectric.annotation.Implements;
import org.robolectric.shadow.api.Shadow;
import org.robolectric.shadows.ShadowAccessibilityManager;
@@ -49,6 +57,9 @@ import java.util.Locale;
@RunWith(SettingsRobolectricTestRunner.class)
@Config(shadows = {ShadowUserManager.class, ShadowUtils.class,
SlicesDatabaseAccessorTest.ShadowApplicationPackageManager.class,
ShadowBluetoothAdapter.class, ShadowLockPatternUtils.class})
public class SlicesDatabaseAccessorTest {
private final String FAKE_TITLE = "title";
@@ -66,6 +77,7 @@ public class SlicesDatabaseAccessorTest {
@Before
public void setUp() {
mContext = RuntimeEnvironment.application;
ShadowUserManager.getShadow().setIsAdminUser(true);
mAccessor = spy(new SlicesDatabaseAccessor(mContext));
mDb = SlicesDatabaseHelper.getInstance(mContext).getWritableDatabase();
SlicesDatabaseHelper.getInstance(mContext).setIndexedState();
@@ -78,6 +90,7 @@ public class SlicesDatabaseAccessorTest {
@After
public void cleanUp() {
ShadowUserManager.getShadow().reset();
DatabaseTestUtils.clearDb(mContext);
}
@@ -258,4 +271,14 @@ public class SlicesDatabaseAccessorTest {
mDb.replaceOrThrow(SlicesDatabaseHelper.Tables.TABLE_SLICES_INDEX, null, values);
}
@Implements(ApplicationPackageManager.class)
public static class ShadowApplicationPackageManager extends
org.robolectric.shadows.ShadowApplicationPackageManager {
@Implementation
protected ComponentName getInstantAppResolverSettingsComponent() {
return null;
}
}
}

View File

@@ -60,13 +60,11 @@ public class SlicesIndexerTest {
private SlicesIndexer mManager;
private SQLiteDatabase mDb;
@Before
public void setUp() {
mContext = RuntimeEnvironment.application;
mManager = spy(new SlicesIndexer(mContext));
mDb = SlicesDatabaseHelper.getInstance(mContext).getWritableDatabase();
}
@After
@@ -84,11 +82,16 @@ public class SlicesIndexerTest {
// Attempt indexing - should not do anything.
mManager.run();
Cursor cursor = mDb.rawQuery("SELECT * FROM slices_index", null);
cursor.moveToFirst();
assertThat(cursor.getCount()).isEqualTo(1);
assertThat(cursor.getString(cursor.getColumnIndex(IndexColumns.KEY))).isEqualTo(newKey);
assertThat(cursor.getString(cursor.getColumnIndex(IndexColumns.TITLE))).isEqualTo(newTitle);
final SQLiteDatabase db = SlicesDatabaseHelper.getInstance(mContext).getWritableDatabase();
try (final Cursor cursor = db.rawQuery("SELECT * FROM slices_index", null)) {
cursor.moveToFirst();
assertThat(cursor.getCount()).isEqualTo(1);
assertThat(cursor.getString(cursor.getColumnIndex(IndexColumns.KEY))).isEqualTo(newKey);
assertThat(cursor.getString(cursor.getColumnIndex(IndexColumns.TITLE)))
.isEqualTo(newTitle);
} finally {
db.close();
}
}
@Test
@@ -109,33 +112,43 @@ public class SlicesIndexerTest {
mManager.run();
final Cursor cursor = mDb.rawQuery("SELECT * FROM slices_index", null);
assertThat(cursor.getCount()).isEqualTo(sliceData.size());
final SQLiteDatabase db = SlicesDatabaseHelper.getInstance(mContext).getWritableDatabase();
try (final Cursor cursor = db.rawQuery("SELECT * FROM slices_index", null)) {
assertThat(cursor.getCount()).isEqualTo(sliceData.size());
cursor.moveToFirst();
for (int i = 0; i < sliceData.size(); i++) {
assertThat(cursor.getString(cursor.getColumnIndex(IndexColumns.KEY))).isEqualTo(
KEYS[i]);
assertThat(cursor.getString(cursor.getColumnIndex(IndexColumns.TITLE))).isEqualTo(
TITLES[i]);
assertThat(cursor.getString(cursor.getColumnIndex(IndexColumns.FRAGMENT))).isEqualTo(
FRAGMENT_NAME);
assertThat(cursor.getString(cursor.getColumnIndex(IndexColumns.SCREENTITLE))).isEqualTo(
SCREEN_TITLE);
assertThat(cursor.getString(cursor.getColumnIndex(IndexColumns.KEYWORDS))).isEqualTo(
KEYWORDS);
assertThat(cursor.getInt(cursor.getColumnIndex(IndexColumns.ICON_RESOURCE))).isEqualTo(
ICON);
assertThat(cursor.getString(cursor.getColumnIndex(IndexColumns.CONTROLLER))).isEqualTo(
PREF_CONTROLLER);
assertThat(cursor.getInt(cursor.getColumnIndex(IndexColumns.PLATFORM_SLICE))).isEqualTo(
1 /* true */);
assertThat(cursor.getInt(cursor.getColumnIndex(IndexColumns.SLICE_TYPE))).isEqualTo(
SLICE_TYPE);
assertThat(cursor.getInt(
cursor.getColumnIndex(IndexColumns.ALLOW_DYNAMIC_SUMMARY_IN_SLICE))).isEqualTo(
1 /* true */);
cursor.moveToNext();
cursor.moveToFirst();
for (int i = 0; i < sliceData.size(); i++) {
assertThat(cursor.getString(cursor.getColumnIndex(IndexColumns.KEY)))
.isEqualTo(KEYS[i]);
assertThat(cursor.getString(cursor.getColumnIndex(IndexColumns.TITLE)))
.isEqualTo(TITLES[i]);
assertThat(
cursor.getString(cursor.getColumnIndex(IndexColumns.FRAGMENT)))
.isEqualTo(FRAGMENT_NAME);
assertThat(cursor.getString(
cursor.getColumnIndex(IndexColumns.SCREENTITLE))).isEqualTo(SCREEN_TITLE);
assertThat(
cursor.getString(cursor.getColumnIndex(IndexColumns.KEYWORDS)))
.isEqualTo(KEYWORDS);
assertThat(
cursor.getInt(cursor.getColumnIndex(IndexColumns.ICON_RESOURCE)))
.isEqualTo(ICON);
assertThat(
cursor.getString(cursor.getColumnIndex(IndexColumns.CONTROLLER)))
.isEqualTo(PREF_CONTROLLER);
assertThat(cursor.getInt(
cursor.getColumnIndex(IndexColumns.PLATFORM_SLICE)))
.isEqualTo(1 /* true */);
assertThat(cursor.getInt(cursor.getColumnIndex(IndexColumns.SLICE_TYPE)))
.isEqualTo(SLICE_TYPE);
assertThat(cursor.getInt(
cursor.getColumnIndex(
IndexColumns.ALLOW_DYNAMIC_SUMMARY_IN_SLICE)))
.isEqualTo(1 /* true */);
cursor.moveToNext();
}
} finally {
db.close();
}
}
@@ -143,8 +156,15 @@ public class SlicesIndexerTest {
final ContentValues values = new ContentValues();
values.put(IndexColumns.KEY, key);
values.put(IndexColumns.TITLE, title);
mDb.replaceOrThrow(SlicesDatabaseHelper.Tables.TABLE_SLICES_INDEX, null, values);
final SQLiteDatabase db = SlicesDatabaseHelper.getInstance(mContext).getWritableDatabase();
db.beginTransaction();
try {
db.replaceOrThrow(SlicesDatabaseHelper.Tables.TABLE_SLICES_INDEX, null, values);
db.setTransactionSuccessful();
} finally {
db.endTransaction();
}
db.close();
}
private List<SliceData> getDummyIndexableData() {