Deflaking ShortcutsChangedTaskTest by not using an active model

When using an active model, the data can change on the model thread while
the test is running on a different thread.
Instead using the model data directly without an active model running

Bug: 399155567
Flag: EXEMPT testfix
Test: Presubmit
Change-Id: I332cd7ec0f5a2fb4760ce080f016c725b2233c45
This commit is contained in:
Sunny Goyal
2025-03-25 12:10:14 -07:00
parent 1735205986
commit e8d901fbdb
@@ -39,11 +39,9 @@ import com.android.launcher3.model.data.WorkspaceItemInfo
import com.android.launcher3.shortcuts.ShortcutKey
import com.android.launcher3.util.ComponentKey
import com.android.launcher3.util.IntSparseArrayMap
import com.android.launcher3.util.LauncherModelHelper
import com.android.launcher3.util.LauncherModelHelper.SandboxModelContext
import com.android.launcher3.util.SandboxApplication
import com.google.common.truth.Truth.assertThat
import java.util.function.Predicate
import org.junit.After
import org.junit.Before
import org.junit.Rule
import org.junit.Test
@@ -60,19 +58,20 @@ import org.mockito.kotlin.whenever
@RunWith(AndroidJUnit4::class)
class ShortcutsChangedTaskTest {
@get:Rule val setFlagsRule: SetFlagsRule = SetFlagsRule()
@get:Rule val context = SandboxApplication()
private lateinit var shortcutsChangedTask: ShortcutsChangedTask
private lateinit var modelHelper: LauncherModelHelper
private lateinit var context: SandboxModelContext
private lateinit var launcherApps: LauncherApps
private var shortcuts: List<ShortcutInfo> = emptyList()
private val expectedPackage: String = "expected"
private val expectedShortcutId: String = "shortcut_id"
private val user: UserHandle = myUserHandle()
private val mockTaskController: ModelTaskController = mock()
private val mockAllApps: AllAppsList = mock()
private val mockIconCache: IconCache = mock()
private val bgDataModel = BgDataModel(mock())
private val expectedWai =
WorkspaceItemInfo().apply {
@@ -87,9 +86,6 @@ class ShortcutsChangedTaskTest {
@Before
fun setup() {
modelHelper = LauncherModelHelper()
modelHelper.loadModelSync()
context = modelHelper.sandboxContext
launcherApps = context.spyService(LauncherApps::class.java)
whenever(mockTaskController.context).thenReturn(context)
whenever(mockTaskController.iconCache).thenReturn(mockIconCache)
@@ -99,11 +95,6 @@ class ShortcutsChangedTaskTest {
shortcutsChangedTask = ShortcutsChangedTask(expectedPackage, shortcuts, user, false)
}
@After
fun teardown() {
modelHelper.destroy()
}
@Test
fun `When installed pinned shortcut is found then keep in workspace`() {
// Given
@@ -114,7 +105,7 @@ class ShortcutsChangedTaskTest {
whenever(id).thenReturn(expectedShortcutId)
}
)
val items: IntSparseArrayMap<ItemInfo> = modelHelper.bgDataModel.itemsIdMap
val items: IntSparseArrayMap<ItemInfo> = bgDataModel.itemsIdMap
items.put(expectedWai.id, expectedWai)
doReturn(
ApplicationInfo().apply {
@@ -127,7 +118,7 @@ class ShortcutsChangedTaskTest {
.getApplicationInfo(eq(expectedPackage), any(), eq(user))
doReturn(shortcuts).whenever(launcherApps).getShortcuts(any(), eq(user))
// When
shortcutsChangedTask.execute(mockTaskController, modelHelper.bgDataModel, mockAllApps)
shortcutsChangedTask.execute(mockTaskController, bgDataModel, mockAllApps)
// Then
verify(mockIconCache).getShortcutIcon(eq(expectedWai), any<CacheableShortcutInfo>())
verify(mockTaskController).bindUpdatedWorkspaceItems(listOf(expectedWai))
@@ -144,7 +135,7 @@ class ShortcutsChangedTaskTest {
whenever(id).thenReturn(expectedShortcutId)
}
)
val items: IntSparseArrayMap<ItemInfo> = modelHelper.bgDataModel.itemsIdMap
val items: IntSparseArrayMap<ItemInfo> = bgDataModel.itemsIdMap
items.put(expectedWai.id, expectedWai)
doReturn(
ApplicationInfo().apply {
@@ -157,7 +148,7 @@ class ShortcutsChangedTaskTest {
.getApplicationInfo(eq(expectedPackage), any(), eq(user))
doReturn(shortcuts).whenever(launcherApps).getShortcuts(any(), eq(user))
// When
shortcutsChangedTask.execute(mockTaskController, modelHelper.bgDataModel, mockAllApps)
shortcutsChangedTask.execute(mockTaskController, bgDataModel, mockAllApps)
// Then
verify(mockTaskController)
.deleteAndBindComponentsRemoved(
@@ -177,7 +168,7 @@ class ShortcutsChangedTaskTest {
whenever(id).thenReturn(expectedShortcutId)
}
)
val items: IntSparseArrayMap<ItemInfo> = modelHelper.bgDataModel.itemsIdMap
val items: IntSparseArrayMap<ItemInfo> = bgDataModel.itemsIdMap
items.put(expectedWai.id, expectedWai)
doReturn(
ApplicationInfo().apply {
@@ -190,7 +181,7 @@ class ShortcutsChangedTaskTest {
.getApplicationInfo(eq(expectedPackage), any(), eq(user))
doReturn(shortcuts).whenever(launcherApps).getShortcuts(any(), eq(user))
// When
shortcutsChangedTask.execute(mockTaskController, modelHelper.bgDataModel, mockAllApps)
shortcutsChangedTask.execute(mockTaskController, bgDataModel, mockAllApps)
// Then
verify(mockIconCache).getShortcutIcon(eq(expectedWai), any<CacheableShortcutInfo>())
verify(mockTaskController).bindUpdatedWorkspaceItems(listOf(expectedWai))
@@ -206,7 +197,7 @@ class ShortcutsChangedTaskTest {
whenever(id).thenReturn(expectedShortcutId)
}
)
val items: IntSparseArrayMap<ItemInfo> = modelHelper.bgDataModel.itemsIdMap
val items: IntSparseArrayMap<ItemInfo> = bgDataModel.itemsIdMap
items.put(expectedWai.id, expectedWai)
doReturn(
ApplicationInfo().apply {
@@ -219,7 +210,7 @@ class ShortcutsChangedTaskTest {
.getApplicationInfo(eq(expectedPackage), any(), eq(user))
doReturn(shortcuts).whenever(launcherApps).getShortcuts(any(), eq(user))
// When
shortcutsChangedTask.execute(mockTaskController, modelHelper.bgDataModel, mockAllApps)
shortcutsChangedTask.execute(mockTaskController, bgDataModel, mockAllApps)
// Then
verify(mockTaskController, times(0)).deleteAndBindComponentsRemoved(any(), any())
verify(mockTaskController, times(0)).bindUpdatedWorkspaceItems(any())
@@ -236,7 +227,7 @@ class ShortcutsChangedTaskTest {
whenever(id).thenReturn(expectedShortcutId)
}
)
val items: IntSparseArrayMap<ItemInfo> = modelHelper.bgDataModel.itemsIdMap
val items: IntSparseArrayMap<ItemInfo> = bgDataModel.itemsIdMap
items.put(expectedWai.id, expectedWai)
doReturn(
ApplicationInfo().apply {
@@ -249,7 +240,7 @@ class ShortcutsChangedTaskTest {
.getApplicationInfo(eq(expectedPackage), any(), eq(user))
doReturn(shortcuts).whenever(launcherApps).getShortcuts(any(), eq(user))
// When
shortcutsChangedTask.execute(mockTaskController, modelHelper.bgDataModel, mockAllApps)
shortcutsChangedTask.execute(mockTaskController, bgDataModel, mockAllApps)
// Then
verify(mockIconCache).getShortcutIcon(eq(expectedWai), any<CacheableShortcutInfo>())
verify(mockTaskController).bindUpdatedWorkspaceItems(listOf(expectedWai))
@@ -266,7 +257,7 @@ class ShortcutsChangedTaskTest {
whenever(id).thenReturn(expectedShortcutId)
}
)
val items: IntSparseArrayMap<ItemInfo> = modelHelper.bgDataModel.itemsIdMap
val items: IntSparseArrayMap<ItemInfo> = bgDataModel.itemsIdMap
items.put(expectedWai.id, expectedWai)
doReturn(
ApplicationInfo().apply {
@@ -279,7 +270,7 @@ class ShortcutsChangedTaskTest {
.getApplicationInfo(eq(expectedPackage), any(), eq(user))
doReturn(shortcuts).whenever(launcherApps).getShortcuts(any(), eq(user))
// When
shortcutsChangedTask.execute(mockTaskController, modelHelper.bgDataModel, mockAllApps)
shortcutsChangedTask.execute(mockTaskController, bgDataModel, mockAllApps)
// Then
verify(mockIconCache).getShortcutIcon(eq(expectedWai), any<CacheableShortcutInfo>())
verify(mockTaskController).bindUpdatedWorkspaceItems(listOf(expectedWai))
@@ -309,10 +300,10 @@ class ShortcutsChangedTaskTest {
shouldUpdateIdMap = true,
)
// When
shortcutsChangedTask.execute(mockTaskController, modelHelper.bgDataModel, mockAllApps)
shortcutsChangedTask.execute(mockTaskController, bgDataModel, mockAllApps)
// Then
assertThat(modelHelper.bgDataModel.deepShortcutMap).containsEntry(expectedKey, 1)
verify(mockTaskController).bindDeepShortcuts(eq(modelHelper.bgDataModel))
assertThat(bgDataModel.deepShortcutMap).containsEntry(expectedKey, 1)
verify(mockTaskController).bindDeepShortcuts(eq(bgDataModel))
}
@Test
@@ -339,10 +330,10 @@ class ShortcutsChangedTaskTest {
shouldUpdateIdMap = false,
)
// When
shortcutsChangedTask.execute(mockTaskController, modelHelper.bgDataModel, mockAllApps)
shortcutsChangedTask.execute(mockTaskController, bgDataModel, mockAllApps)
// Then
assertThat(modelHelper.bgDataModel.deepShortcutMap).doesNotContainKey(expectedKey)
verify(mockTaskController, times(0)).bindDeepShortcuts(eq(modelHelper.bgDataModel))
assertThat(bgDataModel.deepShortcutMap).doesNotContainKey(expectedKey)
verify(mockTaskController, times(0)).bindDeepShortcuts(eq(bgDataModel))
}
@Test
@@ -356,7 +347,7 @@ class ShortcutsChangedTaskTest {
whenever(id).thenReturn(expectedShortcutId)
}
)
val items: IntSparseArrayMap<ItemInfo> = modelHelper.bgDataModel.itemsIdMap
val items: IntSparseArrayMap<ItemInfo> = bgDataModel.itemsIdMap
items.put(expectedWai.id, expectedWai)
doReturn(
ApplicationInfo().apply {
@@ -369,7 +360,7 @@ class ShortcutsChangedTaskTest {
.getApplicationInfo(eq(expectedPackage), any(), eq(user))
doReturn(shortcuts).whenever(launcherApps).getShortcuts(any(), eq(user))
// When
shortcutsChangedTask.execute(mockTaskController, modelHelper.bgDataModel, mockAllApps)
shortcutsChangedTask.execute(mockTaskController, bgDataModel, mockAllApps)
// Then
verify(mockTaskController, times(0)).deleteAndBindComponentsRemoved(any(), any())
verify(mockTaskController, times(0)).bindUpdatedWorkspaceItems(any())