From 1159c2546f98ee774c3182271c0bb2c597bb6fe5 Mon Sep 17 00:00:00 2001 From: Sihua Ma Date: Tue, 21 May 2024 23:59:38 +0000 Subject: [PATCH] Reapply "Move widget picker tests to Robolectric" This reverts commit 97ee134acc06ee042e4870a699dbf2e863e7529c. Reason for revert: Fixed an issue with UI_HELPER_EXECUTOR that caused the flakiness Test: atest NexusLauncherRoboTests Test: SysUI studio Flag: None Test migration Fix: 325088642 Fix: 325088805 Fix: 325089116 Fix: 325088960 Change-Id: I2f50c30d2c861e3bba8a8fa3ec547ca2ade6153a --- .../widget/DatabaseWidgetPreviewLoader.java | 14 ++++++++++---- .../com/android/launcher3/util/WidgetUtils.java | 15 ++++++--------- .../widget/picker/WidgetImageViewTest.kt | 0 .../WidgetRecommendationCategoryProviderTest.java | 10 +++------- .../WidgetsListHeaderAccessibilityTest.java | 0 .../WidgetsListHeaderViewHolderBinderTest.java | 0 .../WidgetsListTableViewHolderBinderTest.java | 7 +++++-- .../picker/model/WidgetsListContentEntryTest.java | 0 .../search/SimpleWidgetsSearchAlgorithmTest.java | 3 ++- .../util/WidgetPreviewContainerSizesTest.kt | 10 +++++++++- .../widget/picker/util/WidgetsTableUtilsTest.java | 0 11 files changed, 35 insertions(+), 24 deletions(-) rename tests/{ => multivalentTests}/src/com/android/launcher3/widget/picker/WidgetImageViewTest.kt (100%) rename tests/{ => multivalentTests}/src/com/android/launcher3/widget/picker/WidgetRecommendationCategoryProviderTest.java (93%) rename tests/{ => multivalentTests}/src/com/android/launcher3/widget/picker/WidgetsListHeaderAccessibilityTest.java (100%) rename tests/{ => multivalentTests}/src/com/android/launcher3/widget/picker/WidgetsListHeaderViewHolderBinderTest.java (100%) rename tests/{ => multivalentTests}/src/com/android/launcher3/widget/picker/WidgetsListTableViewHolderBinderTest.java (95%) rename tests/{ => multivalentTests}/src/com/android/launcher3/widget/picker/model/WidgetsListContentEntryTest.java (100%) rename tests/{ => multivalentTests}/src/com/android/launcher3/widget/picker/search/SimpleWidgetsSearchAlgorithmTest.java (98%) rename tests/{ => multivalentTests}/src/com/android/launcher3/widget/picker/util/WidgetPreviewContainerSizesTest.kt (93%) rename tests/{ => multivalentTests}/src/com/android/launcher3/widget/picker/util/WidgetsTableUtilsTest.java (100%) diff --git a/src/com/android/launcher3/widget/DatabaseWidgetPreviewLoader.java b/src/com/android/launcher3/widget/DatabaseWidgetPreviewLoader.java index aab78bd8c0..2817299d4a 100644 --- a/src/com/android/launcher3/widget/DatabaseWidgetPreviewLoader.java +++ b/src/com/android/launcher3/widget/DatabaseWidgetPreviewLoader.java @@ -27,12 +27,12 @@ import android.graphics.PorterDuff; import android.graphics.PorterDuffXfermode; import android.graphics.RectF; import android.graphics.drawable.Drawable; -import android.os.AsyncTask; import android.os.Handler; import android.util.Log; import android.util.Size; import androidx.annotation.NonNull; +import androidx.annotation.VisibleForTesting; import com.android.launcher3.DeviceProfile; import com.android.launcher3.LauncherAppState; @@ -45,6 +45,7 @@ import com.android.launcher3.model.WidgetItem; import com.android.launcher3.pm.ShortcutConfigActivityInfo; import com.android.launcher3.util.CancellableTask; import com.android.launcher3.util.Executors; +import com.android.launcher3.util.LooperExecutor; import com.android.launcher3.views.ActivityContext; import com.android.launcher3.widget.util.WidgetSizes; @@ -68,8 +69,7 @@ public class DatabaseWidgetPreviewLoader { } /** - * Generates the widget preview on {@link AsyncTask#THREAD_POOL_EXECUTOR}. Must be - * called on UI thread. + * Generates the widget preview on {@link Executors#UI_HELPER_EXECUTOR}. * * @return a request id which can be used to cancel the request. */ @@ -78,7 +78,7 @@ public class DatabaseWidgetPreviewLoader { @NonNull WidgetItem item, @NonNull Size previewSize, @NonNull Consumer callback) { - Handler handler = Executors.UI_HELPER_EXECUTOR.getHandler(); + Handler handler = getLoaderExecutor().getHandler(); CancellableTask request = new CancellableTask<>( () -> generatePreview(item, previewSize.getWidth(), previewSize.getHeight()), MAIN_EXECUTOR, @@ -87,6 +87,12 @@ public class DatabaseWidgetPreviewLoader { return request; } + @VisibleForTesting + @NonNull + public static LooperExecutor getLoaderExecutor() { + return Executors.UI_HELPER_EXECUTOR; + } + /** * Returns a generated preview for a widget and if the preview should be saved in persistent * storage. diff --git a/tests/multivalentTests/src/com/android/launcher3/util/WidgetUtils.java b/tests/multivalentTests/src/com/android/launcher3/util/WidgetUtils.java index 027a31aeb2..deb0ef39a3 100644 --- a/tests/multivalentTests/src/com/android/launcher3/util/WidgetUtils.java +++ b/tests/multivalentTests/src/com/android/launcher3/util/WidgetUtils.java @@ -15,15 +15,12 @@ */ package com.android.launcher3.util; -import static androidx.test.core.app.ApplicationProvider.getApplicationContext; -import static androidx.test.platform.app.InstrumentationRegistry.getInstrumentation; - -import android.appwidget.AppWidgetManager; import android.appwidget.AppWidgetProviderInfo; import android.content.ComponentName; import android.content.Context; +import android.content.pm.ActivityInfo; +import android.content.pm.ApplicationInfo; import android.os.Bundle; -import android.os.Process; import com.android.launcher3.LauncherSettings; import com.android.launcher3.model.data.LauncherAppWidgetInfo; @@ -87,10 +84,10 @@ public class WidgetUtils { * Creates a {@link AppWidgetProviderInfo} for the provided component name */ public static AppWidgetProviderInfo createAppWidgetProviderInfo(ComponentName cn) { - AppWidgetProviderInfo info = AppWidgetManager.getInstance(getApplicationContext()) - .getInstalledProvidersForPackage( - getInstrumentation().getContext().getPackageName(), Process.myUserHandle()) - .get(0); + ActivityInfo activityInfo = new ActivityInfo(); + activityInfo.applicationInfo = new ApplicationInfo(); + AppWidgetProviderInfo info = new AppWidgetProviderInfo(); + info.providerInfo = activityInfo; info.provider = cn; return info; } diff --git a/tests/src/com/android/launcher3/widget/picker/WidgetImageViewTest.kt b/tests/multivalentTests/src/com/android/launcher3/widget/picker/WidgetImageViewTest.kt similarity index 100% rename from tests/src/com/android/launcher3/widget/picker/WidgetImageViewTest.kt rename to tests/multivalentTests/src/com/android/launcher3/widget/picker/WidgetImageViewTest.kt diff --git a/tests/src/com/android/launcher3/widget/picker/WidgetRecommendationCategoryProviderTest.java b/tests/multivalentTests/src/com/android/launcher3/widget/picker/WidgetRecommendationCategoryProviderTest.java similarity index 93% rename from tests/src/com/android/launcher3/widget/picker/WidgetRecommendationCategoryProviderTest.java rename to tests/multivalentTests/src/com/android/launcher3/widget/picker/WidgetRecommendationCategoryProviderTest.java index 7476454a84..3024d26af7 100644 --- a/tests/src/com/android/launcher3/widget/picker/WidgetRecommendationCategoryProviderTest.java +++ b/tests/multivalentTests/src/com/android/launcher3/widget/picker/WidgetRecommendationCategoryProviderTest.java @@ -25,7 +25,6 @@ import static android.content.pm.ApplicationInfo.CATEGORY_UNDEFINED; import static android.content.pm.ApplicationInfo.CATEGORY_VIDEO; import static android.content.pm.ApplicationInfo.FLAG_INSTALLED; -import static androidx.test.core.app.ApplicationProvider.getApplicationContext; import static androidx.test.platform.app.InstrumentationRegistry.getInstrumentation; import static com.google.common.truth.Truth.assertThat; @@ -35,7 +34,6 @@ import static org.mockito.ArgumentMatchers.eq; import static org.mockito.Mockito.doAnswer; import static org.mockito.Mockito.when; -import android.appwidget.AppWidgetManager; import android.appwidget.AppWidgetProviderInfo; import android.content.ComponentName; import android.content.Context; @@ -53,6 +51,7 @@ import com.android.launcher3.R; import com.android.launcher3.icons.IconCache; import com.android.launcher3.model.WidgetItem; import com.android.launcher3.util.Executors; +import com.android.launcher3.util.WidgetUtils; import com.android.launcher3.widget.LauncherAppWidgetProviderInfo; import com.google.common.collect.ImmutableMap; @@ -152,11 +151,8 @@ public class WidgetRecommendationCategoryProviderTest { doAnswer(invocation -> widgetLabel).when(mIconCache).getTitleNoCache(any()); - AppWidgetProviderInfo providerInfo = AppWidgetManager.getInstance(getApplicationContext()) - .getInstalledProvidersForPackage( - getInstrumentation().getContext().getPackageName(), Process.myUserHandle()) - .get(0); - providerInfo.provider = ComponentName.createRelative(TEST_PACKAGE, widgetClassName); + AppWidgetProviderInfo providerInfo = WidgetUtils.createAppWidgetProviderInfo(ComponentName + .createRelative(TEST_PACKAGE, widgetClassName)); LauncherAppWidgetProviderInfo launcherAppWidgetProviderInfo = LauncherAppWidgetProviderInfo.fromProviderInfo(mContext, providerInfo); diff --git a/tests/src/com/android/launcher3/widget/picker/WidgetsListHeaderAccessibilityTest.java b/tests/multivalentTests/src/com/android/launcher3/widget/picker/WidgetsListHeaderAccessibilityTest.java similarity index 100% rename from tests/src/com/android/launcher3/widget/picker/WidgetsListHeaderAccessibilityTest.java rename to tests/multivalentTests/src/com/android/launcher3/widget/picker/WidgetsListHeaderAccessibilityTest.java diff --git a/tests/src/com/android/launcher3/widget/picker/WidgetsListHeaderViewHolderBinderTest.java b/tests/multivalentTests/src/com/android/launcher3/widget/picker/WidgetsListHeaderViewHolderBinderTest.java similarity index 100% rename from tests/src/com/android/launcher3/widget/picker/WidgetsListHeaderViewHolderBinderTest.java rename to tests/multivalentTests/src/com/android/launcher3/widget/picker/WidgetsListHeaderViewHolderBinderTest.java diff --git a/tests/src/com/android/launcher3/widget/picker/WidgetsListTableViewHolderBinderTest.java b/tests/multivalentTests/src/com/android/launcher3/widget/picker/WidgetsListTableViewHolderBinderTest.java similarity index 95% rename from tests/src/com/android/launcher3/widget/picker/WidgetsListTableViewHolderBinderTest.java rename to tests/multivalentTests/src/com/android/launcher3/widget/picker/WidgetsListTableViewHolderBinderTest.java index 85fb380370..e1cc010e61 100644 --- a/tests/src/com/android/launcher3/widget/picker/WidgetsListTableViewHolderBinderTest.java +++ b/tests/multivalentTests/src/com/android/launcher3/widget/picker/WidgetsListTableViewHolderBinderTest.java @@ -16,6 +16,7 @@ package com.android.launcher3.widget.picker; import static androidx.test.core.app.ApplicationProvider.getApplicationContext; +import static androidx.test.platform.app.InstrumentationRegistry.getInstrumentation; import static com.google.common.truth.Truth.assertThat; @@ -49,8 +50,8 @@ import com.android.launcher3.icons.IconCache; import com.android.launcher3.model.WidgetItem; import com.android.launcher3.model.data.PackageItemInfo; import com.android.launcher3.util.ActivityContextWrapper; -import com.android.launcher3.util.Executors; import com.android.launcher3.util.WidgetUtils; +import com.android.launcher3.widget.DatabaseWidgetPreviewLoader; import com.android.launcher3.widget.LauncherAppWidgetProviderInfo; import com.android.launcher3.widget.WidgetCell; import com.android.launcher3.widget.WidgetManagerHelper; @@ -112,7 +113,9 @@ public final class WidgetsListTableViewHolderBinderTest { TEST_PACKAGE, /* numOfWidgets= */ 3); mViewHolderBinder.bindViewHolder(viewHolder, entry, /* position= */ 0, EMPTY_LIST); - Executors.MAIN_EXECUTOR.submit(() -> { }).get(); + // Wait for the loader to complete the preview loading + DatabaseWidgetPreviewLoader.getLoaderExecutor().submit(() -> { }).get(); + getInstrumentation().waitForIdleSync(); // THEN the table container has one row, which contains 3 widgets. // View: .SampleWidget0 | .SampleWidget1 | .SampleWidget2 diff --git a/tests/src/com/android/launcher3/widget/picker/model/WidgetsListContentEntryTest.java b/tests/multivalentTests/src/com/android/launcher3/widget/picker/model/WidgetsListContentEntryTest.java similarity index 100% rename from tests/src/com/android/launcher3/widget/picker/model/WidgetsListContentEntryTest.java rename to tests/multivalentTests/src/com/android/launcher3/widget/picker/model/WidgetsListContentEntryTest.java diff --git a/tests/src/com/android/launcher3/widget/picker/search/SimpleWidgetsSearchAlgorithmTest.java b/tests/multivalentTests/src/com/android/launcher3/widget/picker/search/SimpleWidgetsSearchAlgorithmTest.java similarity index 98% rename from tests/src/com/android/launcher3/widget/picker/search/SimpleWidgetsSearchAlgorithmTest.java rename to tests/multivalentTests/src/com/android/launcher3/widget/picker/search/SimpleWidgetsSearchAlgorithmTest.java index 9c03ccf13f..0370a6b3fc 100644 --- a/tests/src/com/android/launcher3/widget/picker/search/SimpleWidgetsSearchAlgorithmTest.java +++ b/tests/multivalentTests/src/com/android/launcher3/widget/picker/search/SimpleWidgetsSearchAlgorithmTest.java @@ -17,6 +17,7 @@ package com.android.launcher3.widget.picker.search; import static androidx.test.core.app.ApplicationProvider.getApplicationContext; +import static androidx.test.platform.app.InstrumentationRegistry.getInstrumentation; import static com.android.launcher3.util.Executors.MAIN_EXECUTOR; import static com.android.launcher3.util.WidgetUtils.createAppWidgetProviderInfo; @@ -163,7 +164,7 @@ public class SimpleWidgetsSearchAlgorithmTest { .when(mDataProvider) .getAllWidgets(); mSimpleWidgetsSearchAlgorithm.doSearch("Ca", mSearchCallback); - MAIN_EXECUTOR.submit(() -> { }).get(); + getInstrumentation().waitForIdleSync(); verify(mSearchCallback).onSearchResult( matches("Ca"), argThat(a -> a != null && !a.isEmpty())); } diff --git a/tests/src/com/android/launcher3/widget/picker/util/WidgetPreviewContainerSizesTest.kt b/tests/multivalentTests/src/com/android/launcher3/widget/picker/util/WidgetPreviewContainerSizesTest.kt similarity index 93% rename from tests/src/com/android/launcher3/widget/picker/util/WidgetPreviewContainerSizesTest.kt rename to tests/multivalentTests/src/com/android/launcher3/widget/picker/util/WidgetPreviewContainerSizesTest.kt index 040fbf5739..7b629bfe89 100644 --- a/tests/src/com/android/launcher3/widget/picker/util/WidgetPreviewContainerSizesTest.kt +++ b/tests/multivalentTests/src/com/android/launcher3/widget/picker/util/WidgetPreviewContainerSizesTest.kt @@ -43,6 +43,7 @@ class WidgetPreviewContainerSizesTest { private lateinit var context: Context private lateinit var deviceProfile: DeviceProfile private lateinit var testInvariantProfile: InvariantDeviceProfile + private lateinit var widgetItemInvariantProfile: InvariantDeviceProfile @Mock private lateinit var iconCache: IconCache @@ -51,6 +52,11 @@ class WidgetPreviewContainerSizesTest { MockitoAnnotations.initMocks(this) context = ActivityContextWrapper(ApplicationProvider.getApplicationContext()) testInvariantProfile = LauncherAppState.getIDP(context) + widgetItemInvariantProfile = + InvariantDeviceProfile().apply { + numRows = TEST_GRID_SIZE + numColumns = TEST_GRID_SIZE + } deviceProfile = testInvariantProfile.getDeviceProfile(context).copy(context) } @@ -60,7 +66,8 @@ class WidgetPreviewContainerSizesTest { val expectedPreviewContainers = testSizes.values.toList() for ((index, widgetSize) in testSizes.keys.withIndex()) { - val widgetItem = createWidgetItem(widgetSize, context, testInvariantProfile, iconCache) + val widgetItem = + createWidgetItem(widgetSize, context, widgetItemInvariantProfile, iconCache) assertWithMessage("size for $widgetSize should be: ${expectedPreviewContainers[index]}") .that(WidgetPreviewContainerSize.forItem(widgetItem, deviceProfile)) @@ -70,6 +77,7 @@ class WidgetPreviewContainerSizesTest { companion object { private const val TEST_PACKAGE = "com.google.test" + private const val TEST_GRID_SIZE = 6 private val HANDHELD_TEST_SIZES: Map = mapOf( diff --git a/tests/src/com/android/launcher3/widget/picker/util/WidgetsTableUtilsTest.java b/tests/multivalentTests/src/com/android/launcher3/widget/picker/util/WidgetsTableUtilsTest.java similarity index 100% rename from tests/src/com/android/launcher3/widget/picker/util/WidgetsTableUtilsTest.java rename to tests/multivalentTests/src/com/android/launcher3/widget/picker/util/WidgetsTableUtilsTest.java