Loading tests/src/com/android/launcher3/model/WorkspaceItemProcessorTest.kt +44 −240 Original line number Diff line number Diff line Loading @@ -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 Loading Loading @@ -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("") } Loading @@ -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 Loading @@ -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() } /** Loading @@ -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, Loading Loading @@ -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() Loading @@ -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) } Loading @@ -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() Loading @@ -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) } Loading @@ -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() Loading Loading @@ -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() Loading @@ -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()) } Loading @@ -373,6 +360,8 @@ class WorkspaceItemProcessorTest { // Given mockCursor.itemType = ITEM_TYPE_DEEP_SHORTCUT iconRequestInfos = mutableListOf() keyToPinnedShortcutsMap = hashMapOf() itemProcessorUnderTest = createWorkspaceItemProcessorUnderTest() // When Loading @@ -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( Loading Loading @@ -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()) } } Loading
tests/src/com/android/launcher3/model/WorkspaceItemProcessorTest.kt +44 −240 Original line number Diff line number Diff line Loading @@ -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 Loading Loading @@ -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("") } Loading @@ -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 Loading @@ -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() } /** Loading @@ -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, Loading Loading @@ -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() Loading @@ -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) } Loading @@ -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() Loading @@ -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) } Loading @@ -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() Loading Loading @@ -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() Loading @@ -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()) } Loading @@ -373,6 +360,8 @@ class WorkspaceItemProcessorTest { // Given mockCursor.itemType = ITEM_TYPE_DEEP_SHORTCUT iconRequestInfos = mutableListOf() keyToPinnedShortcutsMap = hashMapOf() itemProcessorUnderTest = createWorkspaceItemProcessorUnderTest() // When Loading @@ -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( Loading Loading @@ -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()) } }