Add tests for PackageInfoPresenter
Bug: 236346018 Test: Unit test Change-Id: Id5e52b6be551044b4b026fb171292decb9ef946f
This commit is contained in:
@@ -16,7 +16,6 @@
|
||||
|
||||
package com.android.settings.spa.app.appinfo
|
||||
|
||||
import android.app.ActivityManager
|
||||
import android.app.settings.SettingsEnums
|
||||
import android.content.Context
|
||||
import android.content.Intent
|
||||
@@ -29,8 +28,10 @@ import android.util.Log
|
||||
import androidx.compose.runtime.Composable
|
||||
import com.android.settings.overlay.FeatureFactory
|
||||
import com.android.settingslib.spa.framework.compose.LocalNavController
|
||||
import com.android.settingslib.spaprivileged.framework.common.activityManager
|
||||
import com.android.settingslib.spaprivileged.framework.common.asUser
|
||||
import com.android.settingslib.spaprivileged.framework.compose.DisposableBroadcastReceiverAsUser
|
||||
import com.android.settingslib.spaprivileged.model.app.IPackageManagers
|
||||
import com.android.settingslib.spaprivileged.model.app.PackageManagers
|
||||
import kotlinx.coroutines.CoroutineScope
|
||||
import kotlinx.coroutines.Dispatchers
|
||||
@@ -48,6 +49,7 @@ class PackageInfoPresenter(
|
||||
val packageName: String,
|
||||
val userId: Int,
|
||||
private val coroutineScope: CoroutineScope,
|
||||
private val packageManagers: IPackageManagers = PackageManagers,
|
||||
) {
|
||||
private val metricsFeatureProvider = FeatureFactory.getFactory(context).metricsFeatureProvider
|
||||
private val userHandle = UserHandle.of(userId)
|
||||
@@ -134,9 +136,8 @@ class PackageInfoPresenter(
|
||||
fun forceStop() {
|
||||
logAction(SettingsEnums.ACTION_APP_FORCE_STOP)
|
||||
coroutineScope.launch(Dispatchers.Default) {
|
||||
val activityManager = context.getSystemService(ActivityManager::class.java)!!
|
||||
Log.d(TAG, "Stopping package $packageName")
|
||||
activityManager.forceStopPackageAsUser(packageName, userId)
|
||||
context.activityManager.forceStopPackageAsUser(packageName, userId)
|
||||
notifyChange()
|
||||
}
|
||||
}
|
||||
@@ -146,7 +147,7 @@ class PackageInfoPresenter(
|
||||
}
|
||||
|
||||
private fun getPackageInfo() =
|
||||
PackageManagers.getPackageInfoAsUser(
|
||||
packageManagers.getPackageInfoAsUser(
|
||||
packageName = packageName,
|
||||
flags = PackageManager.MATCH_DISABLED_COMPONENTS or PackageManager.GET_PERMISSIONS,
|
||||
userId = userId,
|
||||
|
@@ -63,8 +63,7 @@ import org.mockito.Mockito.`when` as whenever
|
||||
|
||||
@RunWith(AndroidJUnit4::class)
|
||||
class AppAllServicesPreferenceTest {
|
||||
@JvmField
|
||||
@Rule
|
||||
@get:Rule
|
||||
val mockito: MockitoRule = MockitoJUnit.rule()
|
||||
|
||||
@get:Rule
|
||||
|
@@ -40,8 +40,7 @@ import org.mockito.Mockito.`when` as whenever
|
||||
@RunWith(AndroidJUnit4::class)
|
||||
class AppButtonRepositoryTest {
|
||||
|
||||
@JvmField
|
||||
@Rule
|
||||
@get:Rule
|
||||
val mockito: MockitoRule = MockitoJUnit.rule()
|
||||
|
||||
@Spy
|
||||
|
@@ -35,6 +35,7 @@ import androidx.compose.ui.test.onRoot
|
||||
import androidx.test.core.app.ApplicationProvider
|
||||
import androidx.test.ext.junit.runners.AndroidJUnit4
|
||||
import com.android.settings.R
|
||||
import com.android.settings.testutils.mockAsUser
|
||||
import com.android.settingslib.spaprivileged.framework.common.domainVerificationManager
|
||||
import org.junit.Before
|
||||
import org.junit.Rule
|
||||
@@ -51,8 +52,7 @@ import org.mockito.Mockito.`when` as whenever
|
||||
|
||||
@RunWith(AndroidJUnit4::class)
|
||||
class AppOpenByDefaultPreferenceTest {
|
||||
@JvmField
|
||||
@Rule
|
||||
@get:Rule
|
||||
val mockito: MockitoRule = MockitoJUnit.rule()
|
||||
|
||||
@get:Rule
|
||||
@@ -76,7 +76,7 @@ class AppOpenByDefaultPreferenceTest {
|
||||
@Before
|
||||
fun setUp() {
|
||||
whenever(context.packageManager).thenReturn(packageManager)
|
||||
doReturn(context).`when`(context).createContextAsUser(any(), anyInt())
|
||||
context.mockAsUser()
|
||||
whenever(context.domainVerificationManager).thenReturn(domainVerificationManager)
|
||||
whenever(allowedUserState.isLinkHandlingAllowed).thenReturn(true)
|
||||
whenever(notAllowedUserState.isLinkHandlingAllowed).thenReturn(false)
|
||||
|
@@ -56,8 +56,7 @@ import org.mockito.Mockito.`when` as whenever
|
||||
|
||||
@RunWith(AndroidJUnit4::class)
|
||||
class AppSettingsPreferenceTest {
|
||||
@JvmField
|
||||
@Rule
|
||||
@get:Rule
|
||||
val mockito: MockitoRule = MockitoJUnit.rule()
|
||||
|
||||
@get:Rule
|
||||
|
@@ -46,8 +46,7 @@ import org.mockito.Mockito.`when` as whenever
|
||||
|
||||
@RunWith(AndroidJUnit4::class)
|
||||
class AppStoragePreferenceTest {
|
||||
@JvmField
|
||||
@Rule
|
||||
@get:Rule
|
||||
val mockito: MockitoRule = MockitoJUnit.rule()
|
||||
|
||||
@get:Rule
|
||||
|
@@ -49,8 +49,7 @@ import org.mockito.Mockito.`when` as whenever
|
||||
|
||||
@RunWith(AndroidJUnit4::class)
|
||||
class AppTimeSpentPreferenceTest {
|
||||
@JvmField
|
||||
@Rule
|
||||
@get:Rule
|
||||
val mockito: MockitoRule = MockitoJUnit.rule()
|
||||
|
||||
@get:Rule
|
||||
|
@@ -55,8 +55,7 @@ import org.mockito.Mockito.`when` as whenever
|
||||
|
||||
@RunWith(AndroidJUnit4::class)
|
||||
class DefaultAppShortcutPreferenceTest {
|
||||
@JvmField
|
||||
@Rule
|
||||
@get:Rule
|
||||
val mockito: MockitoRule = MockitoJUnit.rule()
|
||||
|
||||
@get:Rule
|
||||
|
@@ -49,6 +49,7 @@ import com.android.settings.R
|
||||
import com.android.settings.Utils.PROPERTY_APP_HIBERNATION_ENABLED
|
||||
import com.android.settings.Utils.PROPERTY_HIBERNATION_TARGETS_PRE_S_APPS
|
||||
import com.android.settings.testutils.TestDeviceConfig
|
||||
import com.android.settings.testutils.mockAsUser
|
||||
import com.android.settingslib.spaprivileged.framework.common.appHibernationManager
|
||||
import com.android.settingslib.spaprivileged.framework.common.appOpsManager
|
||||
import com.android.settingslib.spaprivileged.framework.common.permissionControllerManager
|
||||
@@ -75,8 +76,7 @@ import org.mockito.Mockito.`when` as whenever
|
||||
@RunWith(AndroidJUnit4::class)
|
||||
class HibernationSwitchPreferenceTest {
|
||||
|
||||
@JvmField
|
||||
@Rule
|
||||
@get:Rule
|
||||
val mockito: MockitoRule = MockitoJUnit.rule()
|
||||
|
||||
@get:Rule
|
||||
@@ -104,8 +104,7 @@ class HibernationSwitchPreferenceTest {
|
||||
fun setUp() {
|
||||
hibernationEnabledConfig.override(true)
|
||||
hibernationTargetsPreSConfig.override(false)
|
||||
doReturn(context)
|
||||
.`when`(context).createContextAsUser(UserHandle.getUserHandleForUid(UID), 0)
|
||||
context.mockAsUser()
|
||||
whenever(context.permissionControllerManager).thenReturn(permissionControllerManager)
|
||||
whenever(context.appOpsManager).thenReturn(appOpsManager)
|
||||
whenever(context.appHibernationManager).thenReturn(appHibernationManager)
|
||||
|
@@ -0,0 +1,168 @@
|
||||
/*
|
||||
* Copyright (C) 2022 The Android Open Source Project
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
package com.android.settings.spa.app.appinfo
|
||||
|
||||
import android.app.ActivityManager
|
||||
import android.app.settings.SettingsEnums
|
||||
import android.content.Context
|
||||
import android.content.Intent
|
||||
import android.content.pm.PackageManager
|
||||
import androidx.test.core.app.ApplicationProvider
|
||||
import androidx.test.ext.junit.runners.AndroidJUnit4
|
||||
import com.android.settings.testutils.FakeFeatureFactory
|
||||
import com.android.settings.testutils.mockAsUser
|
||||
import com.android.settingslib.spaprivileged.framework.common.activityManager
|
||||
import com.android.settingslib.spaprivileged.model.app.IPackageManagers
|
||||
import com.google.common.truth.Truth.assertThat
|
||||
import kotlinx.coroutines.ExperimentalCoroutinesApi
|
||||
import kotlinx.coroutines.coroutineScope
|
||||
import kotlinx.coroutines.test.runTest
|
||||
import org.junit.Before
|
||||
import org.junit.Rule
|
||||
import org.junit.Test
|
||||
import org.junit.runner.RunWith
|
||||
import org.mockito.ArgumentCaptor
|
||||
import org.mockito.Mock
|
||||
import org.mockito.Mockito.any
|
||||
import org.mockito.Mockito.doNothing
|
||||
import org.mockito.Mockito.verify
|
||||
import org.mockito.Spy
|
||||
import org.mockito.junit.MockitoJUnit
|
||||
import org.mockito.junit.MockitoRule
|
||||
import org.mockito.Mockito.`when` as whenever
|
||||
|
||||
@OptIn(ExperimentalCoroutinesApi::class)
|
||||
@RunWith(AndroidJUnit4::class)
|
||||
class PackageInfoPresenterTest {
|
||||
@get:Rule
|
||||
val mockito: MockitoRule = MockitoJUnit.rule()
|
||||
|
||||
@Spy
|
||||
private val context: Context = ApplicationProvider.getApplicationContext()
|
||||
|
||||
@Mock
|
||||
private lateinit var packageManager: PackageManager
|
||||
|
||||
@Mock
|
||||
private lateinit var activityManager: ActivityManager
|
||||
|
||||
@Mock
|
||||
private lateinit var packageManagers: IPackageManagers
|
||||
|
||||
private val fakeFeatureFactory = FakeFeatureFactory()
|
||||
private val metricsFeatureProvider = fakeFeatureFactory.metricsFeatureProvider
|
||||
|
||||
@Before
|
||||
fun setUp() {
|
||||
context.mockAsUser()
|
||||
whenever(context.packageManager).thenReturn(packageManager)
|
||||
whenever(context.activityManager).thenReturn(activityManager)
|
||||
}
|
||||
|
||||
@Test
|
||||
fun enable() = runTest {
|
||||
coroutineScope {
|
||||
val packageInfoPresenter =
|
||||
PackageInfoPresenter(context, PACKAGE_NAME, USER_ID, this, packageManagers)
|
||||
|
||||
packageInfoPresenter.enable()
|
||||
}
|
||||
|
||||
verifyAction(SettingsEnums.ACTION_SETTINGS_ENABLE_APP)
|
||||
verify(packageManager).setApplicationEnabledSetting(
|
||||
PACKAGE_NAME, PackageManager.COMPONENT_ENABLED_STATE_DEFAULT, 0
|
||||
)
|
||||
}
|
||||
|
||||
@Test
|
||||
fun disable() = runTest {
|
||||
coroutineScope {
|
||||
val packageInfoPresenter =
|
||||
PackageInfoPresenter(context, PACKAGE_NAME, USER_ID, this, packageManagers)
|
||||
|
||||
packageInfoPresenter.disable()
|
||||
}
|
||||
|
||||
verifyAction(SettingsEnums.ACTION_SETTINGS_DISABLE_APP)
|
||||
verify(packageManager).setApplicationEnabledSetting(
|
||||
PACKAGE_NAME, PackageManager.COMPONENT_ENABLED_STATE_DISABLED_USER, 0
|
||||
)
|
||||
}
|
||||
|
||||
@Test
|
||||
fun startUninstallActivity() = runTest {
|
||||
doNothing().`when`(context).startActivityAsUser(any(), any())
|
||||
val packageInfoPresenter =
|
||||
PackageInfoPresenter(context, PACKAGE_NAME, USER_ID, this, packageManagers)
|
||||
|
||||
packageInfoPresenter.startUninstallActivity()
|
||||
|
||||
verifyAction(SettingsEnums.ACTION_SETTINGS_UNINSTALL_APP)
|
||||
val intentCaptor = ArgumentCaptor.forClass(Intent::class.java)
|
||||
verify(context).startActivityAsUser(intentCaptor.capture(), any())
|
||||
with(intentCaptor.value) {
|
||||
assertThat(action).isEqualTo(Intent.ACTION_UNINSTALL_PACKAGE)
|
||||
assertThat(data?.schemeSpecificPart).isEqualTo(PACKAGE_NAME)
|
||||
assertThat(getBooleanExtra(Intent.EXTRA_UNINSTALL_ALL_USERS, true)).isEqualTo(false)
|
||||
}
|
||||
}
|
||||
|
||||
@Test
|
||||
fun clearInstantApp() = runTest {
|
||||
coroutineScope {
|
||||
val packageInfoPresenter =
|
||||
PackageInfoPresenter(context, PACKAGE_NAME, USER_ID, this, packageManagers)
|
||||
|
||||
packageInfoPresenter.clearInstantApp()
|
||||
}
|
||||
|
||||
verifyAction(SettingsEnums.ACTION_SETTINGS_CLEAR_INSTANT_APP)
|
||||
verify(packageManager).deletePackageAsUser(PACKAGE_NAME, null, 0, USER_ID)
|
||||
}
|
||||
|
||||
@Test
|
||||
fun forceStop() = runTest {
|
||||
coroutineScope {
|
||||
val packageInfoPresenter =
|
||||
PackageInfoPresenter(context, PACKAGE_NAME, USER_ID, this, packageManagers)
|
||||
|
||||
packageInfoPresenter.forceStop()
|
||||
}
|
||||
|
||||
verifyAction(SettingsEnums.ACTION_APP_FORCE_STOP)
|
||||
verify(activityManager).forceStopPackageAsUser(PACKAGE_NAME, USER_ID)
|
||||
}
|
||||
|
||||
@Test
|
||||
fun logAction() = runTest {
|
||||
val packageInfoPresenter =
|
||||
PackageInfoPresenter(context, PACKAGE_NAME, USER_ID, this, packageManagers)
|
||||
|
||||
packageInfoPresenter.logAction(123)
|
||||
|
||||
verifyAction(123)
|
||||
}
|
||||
|
||||
private fun verifyAction(category: Int) {
|
||||
verify(metricsFeatureProvider).action(context, category, PACKAGE_NAME)
|
||||
}
|
||||
|
||||
private companion object {
|
||||
const val PACKAGE_NAME = "package.name"
|
||||
const val USER_ID = 0
|
||||
}
|
||||
}
|
@@ -0,0 +1,26 @@
|
||||
/*
|
||||
* Copyright (C) 2022 The Android Open Source Project
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
package com.android.settings.testutils
|
||||
|
||||
import android.content.Context
|
||||
import org.mockito.Mockito.any
|
||||
import org.mockito.Mockito.doReturn
|
||||
import org.mockito.Mockito.eq
|
||||
|
||||
fun Context.mockAsUser() {
|
||||
doReturn(this).`when`(this).createContextAsUser(any(), eq(0))
|
||||
}
|
Reference in New Issue
Block a user