Merge "Revert "add more unit tests for WorkspaceItemProcessor"" into main

This commit is contained in:
Priyanka Advani
2024-03-22 20:05:32 +00:00
committed by Android (Google) Code Review
@@ -25,30 +25,22 @@ import android.content.pm.PackageInstaller
import android.content.pm.ShortcutInfo
import android.os.UserHandle
import android.util.LongSparseArray
import com.android.dx.mockito.inline.extended.ExtendedMockito
import com.android.launcher3.LauncherAppState
import com.android.launcher3.LauncherSettings.Favorites
import com.android.launcher3.LauncherSettings.Favorites.CONTAINER_DESKTOP
import com.android.launcher3.LauncherSettings.Favorites.ITEM_TYPE_APPLICATION
import com.android.launcher3.LauncherSettings.Favorites.ITEM_TYPE_APPWIDGET
import com.android.launcher3.LauncherSettings.Favorites.ITEM_TYPE_DEEP_SHORTCUT
import com.android.launcher3.LauncherSettings.Favorites.ITEM_TYPE_FOLDER
import com.android.launcher3.Utilities
import com.android.launcher3.Utilities.EMPTY_PERSON_ARRAY
import com.android.launcher3.backuprestore.LauncherRestoreEventLogger
import com.android.launcher3.backuprestore.LauncherRestoreEventLogger.RestoreError.Companion.MISSING_INFO
import com.android.launcher3.backuprestore.LauncherRestoreEventLogger.RestoreError.Companion.PROFILE_DELETED
import com.android.launcher3.model.data.FolderInfo
import com.android.launcher3.model.data.IconRequestInfo
import com.android.launcher3.model.data.ItemInfo
import com.android.launcher3.model.data.LauncherAppWidgetInfo.FLAG_DIRECT_CONFIG
import com.android.launcher3.model.data.LauncherAppWidgetInfo.FLAG_UI_NOT_READY
import com.android.launcher3.model.data.WorkspaceItemInfo
import com.android.launcher3.shortcuts.ShortcutKey
import com.android.launcher3.util.ComponentKey
import com.android.launcher3.util.PackageManagerHelper
import com.android.launcher3.util.PackageUserKey
import com.android.launcher3.widget.LauncherAppWidgetProviderInfo
import com.android.launcher3.widget.WidgetInflater
import com.google.common.truth.Truth.assertThat
import com.google.common.truth.Truth.assertWithMessage
@@ -79,30 +71,28 @@ class WorkspaceItemProcessorTest {
@Mock private lateinit var mockUserManagerState: UserManagerState
@Mock private lateinit var mockWidgetInflater: WidgetInflater
private var mUserHandle: UserHandle = UserHandle(0)
private var mIconRequestInfos: MutableList<IconRequestInfo<WorkspaceItemInfo>> = mutableListOf()
private var mComponentName: ComponentName = ComponentName("package", "class")
private var mUnlockedUsersArray: LongSparseArray<Boolean> = LongSparseArray()
private var mKeyToPinnedShortcutsMap: MutableMap<ShortcutKey, ShortcutInfo> = mutableMapOf()
private var mInstallingPkgs: HashMap<PackageUserKey, PackageInstaller.SessionInfo> = hashMapOf()
private var mAllDeepShortcuts: MutableList<ShortcutInfo> = mutableListOf()
private var mWidgetProvidersMap: MutableMap<ComponentKey, AppWidgetProviderInfo?> =
mutableMapOf()
private var mPendingPackages: MutableSet<PackageUserKey> = mutableSetOf()
private lateinit var userHandle: UserHandle
private lateinit var iconRequestInfos: MutableList<IconRequestInfo<WorkspaceItemInfo>>
private lateinit var componentName: ComponentName
private lateinit var unlockedUsersArray: LongSparseArray<Boolean>
private lateinit var keyToPinnedShortcutsMap: MutableMap<ShortcutKey, ShortcutInfo>
private lateinit var installingPkgs: HashMap<PackageUserKey, PackageInstaller.SessionInfo>
private lateinit var allDeepShortcuts: MutableList<ShortcutInfo>
private lateinit var itemProcessorUnderTest: WorkspaceItemProcessor
@Before
fun setup() {
mUserHandle = UserHandle(0)
userHandle = UserHandle(0)
mockIconRequestInfo = mock<IconRequestInfo<WorkspaceItemInfo>>()
iconRequestInfos = mutableListOf(mockIconRequestInfo)
mockWorkspaceInfo = mock<WorkspaceItemInfo>()
mockBgDataModel = mock<BgDataModel>()
mComponentName = ComponentName("package", "class")
mUnlockedUsersArray = LongSparseArray<Boolean>(1).apply { put(101, true) }
componentName = ComponentName("package", "class")
unlockedUsersArray = LongSparseArray<Boolean>(1).apply { put(101, true) }
mockIntent =
mock<Intent>().apply {
whenever(component).thenReturn(mComponentName)
whenever(component).thenReturn(componentName)
whenever(`package`).thenReturn("pkg")
whenever(getStringExtra(ShortcutKey.EXTRA_SHORTCUT_ID)).thenReturn("")
}
@@ -119,17 +109,17 @@ class WorkspaceItemProcessorTest {
}
mockPmHelper =
mock<PackageManagerHelper>().apply {
whenever(getAppLaunchIntent(mComponentName.packageName, mUserHandle))
whenever(getAppLaunchIntent(componentName.packageName, userHandle))
.thenReturn(mockIntent)
}
mockLauncherApps =
mock<LauncherApps>().apply {
whenever(isPackageEnabled("package", mUserHandle)).thenReturn(true)
whenever(isActivityEnabled(mComponentName, mUserHandle)).thenReturn(true)
whenever(isPackageEnabled("package", userHandle)).thenReturn(true)
whenever(isActivityEnabled(componentName, userHandle)).thenReturn(true)
}
mockCursor =
mock(LoaderCursor::class.java, RETURNS_DEEP_STUBS).apply {
user = mUserHandle
user = userHandle
itemType = ITEM_TYPE_APPLICATION
id = 1
restoreFlag = 1
@@ -144,12 +134,9 @@ class WorkspaceItemProcessorTest {
}
mockUserManagerState = mock<UserManagerState>()
mockWidgetInflater = mock<WidgetInflater>()
mKeyToPinnedShortcutsMap = mutableMapOf()
mInstallingPkgs = hashMapOf()
mAllDeepShortcuts = mutableListOf()
mWidgetProvidersMap = mutableMapOf()
mIconRequestInfos = mutableListOf()
mPendingPackages = mutableSetOf()
keyToPinnedShortcutsMap = mutableMapOf()
installingPkgs = hashMapOf()
allDeepShortcuts = mutableListOf()
}
/**
@@ -162,18 +149,18 @@ class WorkspaceItemProcessorTest {
memoryLogger: LoaderMemoryLogger? = null,
userManagerState: UserManagerState = mockUserManagerState,
launcherApps: LauncherApps = mockLauncherApps,
shortcutKeyToPinnedShortcuts: Map<ShortcutKey, ShortcutInfo> = mKeyToPinnedShortcutsMap,
shortcutKeyToPinnedShortcuts: Map<ShortcutKey, ShortcutInfo> = keyToPinnedShortcutsMap,
app: LauncherAppState = mockAppState,
bgDataModel: BgDataModel = mockBgDataModel,
widgetProvidersMap: MutableMap<ComponentKey, AppWidgetProviderInfo?> = mWidgetProvidersMap,
widgetProvidersMap: MutableMap<ComponentKey, AppWidgetProviderInfo?> = mutableMapOf(),
widgetInflater: WidgetInflater = mockWidgetInflater,
pmHelper: PackageManagerHelper = mockPmHelper,
iconRequestInfos: MutableList<IconRequestInfo<WorkspaceItemInfo>> = mIconRequestInfos,
iconRequestInfos: MutableList<IconRequestInfo<WorkspaceItemInfo>> = mutableListOf(),
isSdCardReady: Boolean = false,
pendingPackages: MutableSet<PackageUserKey> = mPendingPackages,
unlockedUsers: LongSparseArray<Boolean> = mUnlockedUsersArray,
installingPkgs: HashMap<PackageUserKey, PackageInstaller.SessionInfo> = mInstallingPkgs,
allDeepShortcuts: MutableList<ShortcutInfo> = mAllDeepShortcuts
pendingPackages: MutableSet<PackageUserKey> = mutableSetOf(),
unlockedUsers: LongSparseArray<Boolean> = unlockedUsersArray,
installingPkgs: HashMap<PackageUserKey, PackageInstaller.SessionInfo> = hashMapOf(),
allDeepShortcuts: MutableList<ShortcutInfo> = mutableListOf()
) =
WorkspaceItemProcessor(
c = cursor,
@@ -240,8 +227,8 @@ class WorkspaceItemProcessorTest {
fun `When app has empty String target package then mark deleted`() {
// Given
mComponentName = ComponentName("", "")
whenever(mockIntent.component).thenReturn(mComponentName)
componentName = ComponentName("", "")
whenever(mockIntent.component).thenReturn(componentName)
whenever(mockCursor.parseIntent()).thenReturn(mockIntent)
itemProcessorUnderTest = createWorkspaceItemProcessorUnderTest()
@@ -268,7 +255,7 @@ class WorkspaceItemProcessorTest {
.isEqualTo(0)
// currently gets marked restored twice, although markRestore() has check for restoreFlag
verify(mockCursor, times(2)).markRestored()
assertThat(mIconRequestInfos).containsExactly(mockIconRequestInfo)
assertThat(iconRequestInfos).containsExactly(mockIconRequestInfo)
verify(mockCursor).checkAndAddItem(mockWorkspaceInfo, mockBgDataModel, null)
}
@@ -278,12 +265,12 @@ class WorkspaceItemProcessorTest {
// Given
mockLauncherApps =
mock<LauncherApps>().apply {
whenever(isPackageEnabled("package", mUserHandle)).thenReturn(true)
whenever(isActivityEnabled(mComponentName, mUserHandle)).thenReturn(false)
whenever(isPackageEnabled("package", userHandle)).thenReturn(true)
whenever(isActivityEnabled(componentName, userHandle)).thenReturn(false)
}
mockPmHelper =
mock<PackageManagerHelper>().apply {
whenever(getAppLaunchIntent(mComponentName.packageName, mUserHandle))
whenever(getAppLaunchIntent(componentName.packageName, userHandle))
.thenReturn(mockIntent)
}
itemProcessorUnderTest = createWorkspaceItemProcessorUnderTest()
@@ -296,7 +283,7 @@ class WorkspaceItemProcessorTest {
.that(mockCursor.restoreFlag)
.isEqualTo(0)
verify(mockCursor.updater().put(Favorites.INTENT, mockIntent.toUri(0))).commit()
assertThat(mIconRequestInfos).containsExactly(mockIconRequestInfo)
assertThat(iconRequestInfos).containsExactly(mockIconRequestInfo)
verify(mockCursor).checkAndAddItem(mockWorkspaceInfo, mockBgDataModel, null)
}
@@ -306,13 +293,12 @@ class WorkspaceItemProcessorTest {
// Given
mockLauncherApps =
mock<LauncherApps>().apply {
whenever(isPackageEnabled("package", mUserHandle)).thenReturn(true)
whenever(isActivityEnabled(mComponentName, mUserHandle)).thenReturn(false)
whenever(isPackageEnabled("package", userHandle)).thenReturn(true)
whenever(isActivityEnabled(componentName, userHandle)).thenReturn(false)
}
mockPmHelper =
mock<PackageManagerHelper>().apply {
whenever(getAppLaunchIntent(mComponentName.packageName, mUserHandle))
.thenReturn(null)
whenever(getAppLaunchIntent(componentName.packageName, userHandle)).thenReturn(null)
}
itemProcessorUnderTest = createWorkspaceItemProcessorUnderTest()
@@ -351,9 +337,10 @@ class WorkspaceItemProcessorTest {
whenever(persons).thenReturn(EMPTY_PERSON_ARRAY)
}
val shortcutKey = ShortcutKey.fromIntent(mockIntent, mockCursor.user)
mKeyToPinnedShortcutsMap[shortcutKey] = expectedShortcutInfo
keyToPinnedShortcutsMap[shortcutKey] = expectedShortcutInfo
iconRequestInfos = mutableListOf()
itemProcessorUnderTest =
createWorkspaceItemProcessorUnderTest(allDeepShortcuts = mAllDeepShortcuts)
createWorkspaceItemProcessorUnderTest(allDeepShortcuts = allDeepShortcuts)
// When
itemProcessorUnderTest.processItem()
@@ -362,8 +349,8 @@ class WorkspaceItemProcessorTest {
assertWithMessage("item restoreFlag should be set to 0")
.that(mockCursor.restoreFlag)
.isEqualTo(0)
assertThat(mIconRequestInfos).isEmpty()
assertThat(mAllDeepShortcuts).containsExactly(expectedShortcutInfo)
assertThat(iconRequestInfos).isEmpty()
assertThat(allDeepShortcuts).containsExactly(expectedShortcutInfo)
verify(mockCursor).markRestored()
verify(mockCursor).checkAndAddItem(any(), any(), anyOrNull())
}
@@ -373,6 +360,8 @@ class WorkspaceItemProcessorTest {
// Given
mockCursor.itemType = ITEM_TYPE_DEEP_SHORTCUT
iconRequestInfos = mutableListOf()
keyToPinnedShortcutsMap = hashMapOf()
itemProcessorUnderTest = createWorkspaceItemProcessorUnderTest()
// When
@@ -382,7 +371,7 @@ class WorkspaceItemProcessorTest {
assertWithMessage("item restoreFlag should be set to 0")
.that(mockCursor.restoreFlag)
.isEqualTo(0)
assertThat(mIconRequestInfos).isEmpty()
assertThat(iconRequestInfos).isEmpty()
verify(mockCursor, times(0)).checkAndAddItem(any(), any(), anyOrNull())
verify(mockCursor)
.markDeleted(
@@ -438,189 +427,4 @@ class WorkspaceItemProcessorTest {
assertThat(actualFolderInfo.options).isEqualTo(expectedFolderInfo.options)
verify(mockCursor).checkAndAddItem(actualFolderInfo, mockBgDataModel, null)
}
@Test
fun `When valid Widget then checkAndAddItem`() {
// Given
mockCursor =
mock<LoaderCursor>().apply {
itemType = ITEM_TYPE_APPWIDGET
id = 1
user = UserHandle(1)
restoreFlag = FLAG_DIRECT_CONFIG
container = CONTAINER_DESKTOP
whenever(isOnWorkspaceOrHotseat).thenCallRealMethod()
whenever(appWidgetProvider)
.thenReturn("com.google.android.testApp/com.android.testApp.testAppProvider")
whenever(appWidgetId).thenReturn(0)
whenever(spanX).thenReturn(2)
whenever(spanY).thenReturn(1)
whenever(options).thenReturn(0)
whenever(appWidgetSource).thenReturn(20)
whenever(applyCommonProperties(any())).thenCallRealMethod()
}
val mockProviderInfo =
mock<LauncherAppWidgetProviderInfo>().apply {
provider = mock()
whenever(user).thenReturn(UserHandle(1))
}
val inflationResult =
WidgetInflater.InflationResult(
type = WidgetInflater.TYPE_REAL,
widgetInfo = mockProviderInfo
)
mockWidgetInflater =
mock<WidgetInflater>().apply {
whenever(inflateAppWidget(any())).thenReturn(inflationResult)
}
itemProcessorUnderTest =
createWorkspaceItemProcessorUnderTest(widgetProvidersMap = mWidgetProvidersMap)
// When
itemProcessorUnderTest.processItem()
// Then
assertThat(
mWidgetProvidersMap[ComponentKey(mockProviderInfo.provider, mockProviderInfo.user)]
)
.isEqualTo(inflationResult.widgetInfo)
verify(mockCursor).checkAndAddItem(any(), any())
}
@Test
fun `When valid Pending Widget then checkAndAddItem`() {
// Given
mockCursor =
mock<LoaderCursor>().apply {
itemType = ITEM_TYPE_APPWIDGET
id = 1
user = UserHandle(1)
restoreFlag = FLAG_UI_NOT_READY
container = CONTAINER_DESKTOP
whenever(isOnWorkspaceOrHotseat).thenCallRealMethod()
whenever(appWidgetProvider)
.thenReturn("com.google.android.testApp/com.android.testApp.testAppProvider")
whenever(appWidgetId).thenReturn(0)
whenever(spanX).thenReturn(2)
whenever(spanY).thenReturn(1)
whenever(options).thenReturn(0)
whenever(appWidgetSource).thenReturn(20)
whenever(applyCommonProperties(any())).thenCallRealMethod()
}
val mockProviderInfo =
mock<LauncherAppWidgetProviderInfo>().apply {
provider = mock()
whenever(user).thenReturn(UserHandle(1))
}
val inflationResult =
WidgetInflater.InflationResult(
type = WidgetInflater.TYPE_PENDING,
widgetInfo = mockProviderInfo
)
mockWidgetInflater =
mock<WidgetInflater>().apply {
whenever(inflateAppWidget(any())).thenReturn(inflationResult)
}
itemProcessorUnderTest =
createWorkspaceItemProcessorUnderTest(widgetProvidersMap = mWidgetProvidersMap)
// When
itemProcessorUnderTest.processItem()
// Then
verify(mockCursor).checkAndAddItem(any(), any())
}
@Test
fun `When Unrestored Pending App Widget then mark deleted`() {
// Given
val expectedProvider = "com.google.android.testApp/com.android.testApp.testAppProvider"
mockCursor =
mock<LoaderCursor>().apply {
itemType = ITEM_TYPE_APPWIDGET
id = 1
user = UserHandle(1)
restoreFlag = FLAG_UI_NOT_READY
container = CONTAINER_DESKTOP
whenever(isOnWorkspaceOrHotseat).thenCallRealMethod()
whenever(appWidgetProvider).thenReturn(expectedProvider)
whenever(appWidgetId).thenReturn(0)
whenever(spanX).thenReturn(2)
whenever(spanY).thenReturn(1)
whenever(options).thenReturn(0)
whenever(appWidgetSource).thenReturn(20)
whenever(applyCommonProperties(any())).thenCallRealMethod()
}
mInstallingPkgs = hashMapOf()
val inflationResult =
WidgetInflater.InflationResult(type = WidgetInflater.TYPE_PENDING, widgetInfo = null)
mockWidgetInflater =
mock<WidgetInflater>().apply {
whenever(inflateAppWidget(any())).thenReturn(inflationResult)
}
itemProcessorUnderTest =
createWorkspaceItemProcessorUnderTest(widgetProvidersMap = mWidgetProvidersMap)
val expectedComponentName = ComponentName.unflattenFromString(expectedProvider)
// When
itemProcessorUnderTest.processItem()
// Then
verify(mockCursor)
.markDeleted(
"Unrestored widget removed: $expectedComponentName",
LauncherRestoreEventLogger.RestoreError.APP_NOT_INSTALLED
)
}
@Test
fun `When Archived Pending App Widget then checkAndAddItem`() {
// Given
val expectedProvider = "com.google.android.testApp/com.android.testApp.testAppProvider"
val expectedComponentName = ComponentName.unflattenFromString(expectedProvider)
val expectedPackage = expectedComponentName!!.packageName
val mockitoSession =
ExtendedMockito.mockitoSession().mockStatic(Utilities::class.java).startMocking()
whenever(Utilities.enableSupportForArchiving()).thenReturn(true)
mockPmHelper =
mock<PackageManagerHelper>().apply {
whenever(isAppArchived(expectedPackage)).thenReturn(true)
}
mockCursor =
mock<LoaderCursor>().apply {
itemType = ITEM_TYPE_APPWIDGET
id = 1
user = UserHandle(1)
restoreFlag = FLAG_UI_NOT_READY
container = CONTAINER_DESKTOP
whenever(isOnWorkspaceOrHotseat).thenCallRealMethod()
whenever(appWidgetProvider).thenReturn(expectedProvider)
whenever(appWidgetId).thenReturn(0)
whenever(spanX).thenReturn(2)
whenever(spanY).thenReturn(1)
whenever(options).thenReturn(0)
whenever(appWidgetSource).thenReturn(20)
whenever(applyCommonProperties(any())).thenCallRealMethod()
}
mInstallingPkgs = hashMapOf()
val inflationResult =
WidgetInflater.InflationResult(type = WidgetInflater.TYPE_PENDING, widgetInfo = null)
mockWidgetInflater =
mock<WidgetInflater>().apply {
whenever(inflateAppWidget(any())).thenReturn(inflationResult)
}
itemProcessorUnderTest =
createWorkspaceItemProcessorUnderTest(widgetProvidersMap = mWidgetProvidersMap)
// When
itemProcessorUnderTest.processItem()
// Then
mockitoSession.finishMocking()
verify(mockCursor).checkAndAddItem(any(), any())
}
}