summaryrefslogtreecommitdiff
path: root/tests/src/com/android/launcher3/model/LoaderTaskTest.kt
diff options
context:
space:
mode:
Diffstat (limited to 'tests/src/com/android/launcher3/model/LoaderTaskTest.kt')
-rw-r--r--tests/src/com/android/launcher3/model/LoaderTaskTest.kt162
1 files changed, 162 insertions, 0 deletions
diff --git a/tests/src/com/android/launcher3/model/LoaderTaskTest.kt b/tests/src/com/android/launcher3/model/LoaderTaskTest.kt
new file mode 100644
index 0000000000..def27b8897
--- /dev/null
+++ b/tests/src/com/android/launcher3/model/LoaderTaskTest.kt
@@ -0,0 +1,162 @@
+package com.android.launcher3.model
+
+import android.content.Context
+import android.os.UserHandle
+import android.platform.test.flag.junit.SetFlagsRule
+import androidx.test.ext.junit.runners.AndroidJUnit4
+import androidx.test.filters.SmallTest
+import androidx.test.platform.app.InstrumentationRegistry
+import com.android.launcher3.Flags
+import com.android.launcher3.InvariantDeviceProfile
+import com.android.launcher3.LauncherAppState
+import com.android.launcher3.LauncherModel
+import com.android.launcher3.LauncherModel.LoaderTransaction
+import com.android.launcher3.icons.IconCache
+import com.android.launcher3.icons.cache.CachingLogic
+import com.android.launcher3.icons.cache.IconCacheUpdateHandler
+import com.android.launcher3.pm.UserCache
+import com.android.launcher3.util.Executors.MODEL_EXECUTOR
+import com.android.launcher3.util.LooperIdleLock
+import com.android.launcher3.util.UserIconInfo
+import com.android.launcher3.util.rule.StaticMockitoRule
+import com.google.common.truth.Truth
+import java.util.concurrent.CountDownLatch
+import org.junit.Before
+import org.junit.Rule
+import org.junit.Test
+import org.junit.runner.RunWith
+import org.mockito.ArgumentMatchers.any
+import org.mockito.Mock
+import org.mockito.Mockito
+import org.mockito.Mockito.times
+import org.mockito.Mockito.verify
+import org.mockito.Mockito.`when`
+import org.mockito.MockitoAnnotations
+import org.mockito.Spy
+
+private const val INSERTION_STATEMENT_FILE = "databases/workspace_items.sql"
+
+@SmallTest
+@RunWith(AndroidJUnit4::class)
+class LoaderTaskTest {
+ @Mock private lateinit var app: LauncherAppState
+ @Mock private lateinit var bgAllAppsList: AllAppsList
+ @Mock private lateinit var modelDelegate: ModelDelegate
+ @Mock private lateinit var launcherBinder: LauncherBinder
+ @Mock private lateinit var launcherModel: LauncherModel
+ @Mock private lateinit var transaction: LoaderTransaction
+ @Mock private lateinit var iconCache: IconCache
+ @Mock private lateinit var idleLock: LooperIdleLock
+ @Mock private lateinit var iconCacheUpdateHandler: IconCacheUpdateHandler
+ @Mock private lateinit var userCache: UserCache
+
+ @Spy private var userManagerState: UserManagerState? = UserManagerState()
+
+ @get:Rule(order = 0) val staticMockitoRule = StaticMockitoRule(UserCache::class.java)
+ @get:Rule(order = 1)
+ val setFlagsRule = SetFlagsRule().apply { initAllFlagsToReleaseConfigDefault() }
+
+ @Before
+ fun setup() {
+ val context = InstrumentationRegistry.getInstrumentation().targetContext
+ val idp =
+ InvariantDeviceProfile.INSTANCE[context].apply {
+ numRows = 5
+ numColumns = 6
+ numDatabaseHotseatIcons = 5
+ }
+
+ MockitoAnnotations.initMocks(this)
+ `when`(app.context).thenReturn(context)
+ `when`(app.model).thenReturn(launcherModel)
+ `when`(launcherModel.beginLoader(any(LoaderTask::class.java))).thenReturn(transaction)
+ `when`(app.iconCache).thenReturn(iconCache)
+ `when`(launcherModel.modelDbController)
+ .thenReturn(FactitiousDbController(context, INSERTION_STATEMENT_FILE))
+ `when`(app.invariantDeviceProfile).thenReturn(idp)
+ `when`(launcherBinder.newIdleLock(any(LoaderTask::class.java))).thenReturn(idleLock)
+ `when`(idleLock.awaitLocked(1000)).thenReturn(false)
+ `when`(iconCache.updateHandler).thenReturn(iconCacheUpdateHandler)
+ `when`(UserCache.getInstance(any(Context::class.java))).thenReturn(userCache)
+ }
+
+ @Test
+ fun loadsDataProperly() =
+ with(BgDataModel()) {
+ LoaderTask(app, bgAllAppsList, this, modelDelegate, launcherBinder)
+ .runSyncOnBackgroundThread()
+ Truth.assertThat(workspaceItems.size).isAtLeast(25)
+ Truth.assertThat(appWidgets.size).isAtLeast(7)
+ Truth.assertThat(folders.size()).isAtLeast(8)
+ Truth.assertThat(itemsIdMap.size()).isAtLeast(40)
+ }
+
+ @Test
+ fun bindsLoadedDataCorrectly() {
+ LoaderTask(app, bgAllAppsList, BgDataModel(), modelDelegate, launcherBinder)
+ .runSyncOnBackgroundThread()
+
+ verify(launcherBinder).bindWorkspace(true, false)
+ verify(modelDelegate).workspaceLoadComplete()
+ verify(modelDelegate).loadAndBindAllAppsItems(any(), any(), any())
+ verify(launcherBinder).bindAllApps()
+ verify(iconCacheUpdateHandler, times(4)).updateIcons(any(), any<CachingLogic<Any>>(), any())
+ verify(launcherBinder).bindDeepShortcuts()
+ verify(launcherBinder).bindWidgets()
+ verify(modelDelegate).loadAndBindOtherItems(any())
+ verify(iconCacheUpdateHandler).finish()
+ verify(modelDelegate).modelLoadComplete()
+ verify(transaction).commit()
+ }
+
+ @Test
+ fun setsQuietModeFlagCorrectlyForWorkProfile() =
+ with(BgDataModel()) {
+ setFlagsRule.enableFlags(Flags.FLAG_ENABLE_PRIVATE_SPACE)
+ val MAIN_HANDLE = UserHandle.of(0)
+ val mockUserHandles = arrayListOf<UserHandle>(MAIN_HANDLE)
+ `when`(userCache.userProfiles).thenReturn(mockUserHandles)
+ `when`(userManagerState?.isUserQuiet(MAIN_HANDLE)).thenReturn(true)
+ `when`(userCache.getUserInfo(MAIN_HANDLE)).thenReturn(UserIconInfo(MAIN_HANDLE, 1))
+
+ LoaderTask(app, bgAllAppsList, this, modelDelegate, launcherBinder, userManagerState)
+ .runSyncOnBackgroundThread()
+
+ verify(bgAllAppsList)
+ .setFlags(BgDataModel.Callbacks.FLAG_WORK_PROFILE_QUIET_MODE_ENABLED, true)
+ verify(bgAllAppsList)
+ .setFlags(BgDataModel.Callbacks.FLAG_PRIVATE_PROFILE_QUIET_MODE_ENABLED, false)
+ verify(bgAllAppsList, Mockito.never())
+ .setFlags(BgDataModel.Callbacks.FLAG_QUIET_MODE_ENABLED, true)
+ }
+
+ @Test
+ fun setsQuietModeFlagCorrectlyForPrivateProfile() =
+ with(BgDataModel()) {
+ setFlagsRule.enableFlags(Flags.FLAG_ENABLE_PRIVATE_SPACE)
+ val MAIN_HANDLE = UserHandle.of(0)
+ val mockUserHandles = arrayListOf<UserHandle>(MAIN_HANDLE)
+ `when`(userCache.userProfiles).thenReturn(mockUserHandles)
+ `when`(userManagerState?.isUserQuiet(MAIN_HANDLE)).thenReturn(true)
+ `when`(userCache.getUserInfo(MAIN_HANDLE)).thenReturn(UserIconInfo(MAIN_HANDLE, 3))
+
+ LoaderTask(app, bgAllAppsList, this, modelDelegate, launcherBinder, userManagerState)
+ .runSyncOnBackgroundThread()
+
+ verify(bgAllAppsList)
+ .setFlags(BgDataModel.Callbacks.FLAG_WORK_PROFILE_QUIET_MODE_ENABLED, false)
+ verify(bgAllAppsList)
+ .setFlags(BgDataModel.Callbacks.FLAG_PRIVATE_PROFILE_QUIET_MODE_ENABLED, true)
+ verify(bgAllAppsList, Mockito.never())
+ .setFlags(BgDataModel.Callbacks.FLAG_QUIET_MODE_ENABLED, true)
+ }
+}
+
+private fun LoaderTask.runSyncOnBackgroundThread() {
+ val latch = CountDownLatch(1)
+ MODEL_EXECUTOR.execute {
+ run()
+ latch.countDown()
+ }
+ latch.await()
+}