Migrate AppPermissionSummaryTest to AndroidJUnit4

Bug: 260441791
Test: Unit test
Change-Id: I72a63f9247ae370dbfcb0ff2babbfdfc95bd60a2
This commit is contained in:
Chaohui Wang
2022-12-06 13:28:39 +08:00
parent b9d4e85418
commit 681b519b80
2 changed files with 66 additions and 86 deletions

View File

@@ -37,19 +37,19 @@ class AppPermissionSummaryLiveData(
private val app: ApplicationInfo, private val app: ApplicationInfo,
) : LiveData<AppPermissionSummaryState>() { ) : LiveData<AppPermissionSummaryState>() {
private val userContext = context.asUser(app.userHandle) private val userContext = context.asUser(app.userHandle)
private val packageManager = userContext.packageManager private val userPackageManager = userContext.packageManager
private val onPermissionsChangedListener = OnPermissionsChangedListener { uid -> private val onPermissionsChangedListener = OnPermissionsChangedListener { uid ->
if (uid == app.uid) update() if (uid == app.uid) update()
} }
override fun onActive() { override fun onActive() {
packageManager.addOnPermissionsChangeListener(onPermissionsChangedListener) userPackageManager.addOnPermissionsChangeListener(onPermissionsChangedListener)
update() update()
} }
override fun onInactive() { override fun onInactive() {
packageManager.removeOnPermissionsChangeListener(onPermissionsChangedListener) userPackageManager.removeOnPermissionsChangeListener(onPermissionsChangedListener)
} }
private fun update() { private fun update() {
@@ -69,12 +69,10 @@ class AppPermissionSummaryLiveData(
return return
} }
val labels = getDisplayLabels(additionalGrantedPermissionCount, grantedGroupLabels) val labels = getDisplayLabels(additionalGrantedPermissionCount, grantedGroupLabels)
val summary = when { val summary = if (labels.isNotEmpty()) {
labels.isEmpty() -> { ListFormatter.getInstance().format(labels)
context.getString(R.string.runtime_permissions_summary_no_permissions_granted) } else {
} context.getString(R.string.runtime_permissions_summary_no_permissions_granted)
else -> ListFormatter.getInstance().format(labels)
} }
postValue(AppPermissionSummaryState(summary = summary, enabled = true)) postValue(AppPermissionSummaryState(summary = summary, enabled = true))
} }

View File

@@ -19,16 +19,17 @@ package com.android.settings.spa.app.appinfo
import android.content.Context import android.content.Context
import android.content.pm.ApplicationInfo import android.content.pm.ApplicationInfo
import android.content.pm.PackageManager import android.content.pm.PackageManager
import androidx.lifecycle.LiveData import androidx.arch.core.executor.testing.InstantTaskExecutorRule
import androidx.lifecycle.Observer
import androidx.test.core.app.ApplicationProvider import androidx.test.core.app.ApplicationProvider
import androidx.test.ext.junit.runners.AndroidJUnit4
import com.android.dx.mockito.inline.extended.ExtendedMockito.mockitoSession
import com.android.settings.R import com.android.settings.R
import com.android.settings.testutils.mockAsUser
import com.android.settingslib.applications.PermissionsSummaryHelper import com.android.settingslib.applications.PermissionsSummaryHelper
import com.android.settingslib.applications.PermissionsSummaryHelper.PermissionsResultCallback import com.android.settingslib.applications.PermissionsSummaryHelper.PermissionsResultCallback
import com.android.settingslib.spa.testutils.getOrAwaitValue
import com.google.common.truth.Truth.assertThat import com.google.common.truth.Truth.assertThat
import java.util.concurrent.CountDownLatch import org.junit.After
import java.util.concurrent.TimeUnit
import java.util.concurrent.TimeoutException
import org.junit.Before import org.junit.Before
import org.junit.Rule import org.junit.Rule
import org.junit.Test import org.junit.Test
@@ -39,22 +40,17 @@ import org.mockito.Mockito.doReturn
import org.mockito.Mockito.eq import org.mockito.Mockito.eq
import org.mockito.Mockito.never import org.mockito.Mockito.never
import org.mockito.Mockito.verify import org.mockito.Mockito.verify
import org.mockito.MockitoSession
import org.mockito.Spy import org.mockito.Spy
import org.mockito.junit.MockitoJUnit import org.mockito.quality.Strictness
import org.mockito.junit.MockitoRule
import org.robolectric.RobolectricTestRunner
import org.robolectric.annotation.Config
import org.robolectric.annotation.Implementation
import org.robolectric.annotation.Implements
import org.mockito.Mockito.`when` as whenever import org.mockito.Mockito.`when` as whenever
@RunWith(RobolectricTestRunner::class) @RunWith(AndroidJUnit4::class)
@Config(shadows = [ShadowPermissionsSummaryHelper::class])
class AppPermissionSummaryTest { class AppPermissionSummaryTest {
@get:Rule
val instantTaskExecutorRule = InstantTaskExecutorRule()
@JvmField private lateinit var mockSession: MockitoSession
@Rule
val mockito: MockitoRule = MockitoJUnit.rule()
@Spy @Spy
private var context: Context = ApplicationProvider.getApplicationContext() private var context: Context = ApplicationProvider.getApplicationContext()
@@ -66,27 +62,53 @@ class AppPermissionSummaryTest {
@Before @Before
fun setUp() { fun setUp() {
doReturn(context).`when`(context).createContextAsUser(any(), eq(0)) mockSession = mockitoSession()
.initMocks(this)
.mockStatic(PermissionsSummaryHelper::class.java)
.strictness(Strictness.LENIENT)
.startMocking()
context.mockAsUser()
whenever(context.packageManager).thenReturn(packageManager) whenever(context.packageManager).thenReturn(packageManager)
val app = ApplicationInfo().apply { summaryLiveData = AppPermissionSummaryLiveData(context, APP)
packageName = PACKAGE_NAME }
}
summaryLiveData = AppPermissionSummaryLiveData(context, app) private fun mockGetPermissionSummary(
requestedPermissionCount: Int = 0,
additionalGrantedPermissionCount: Int = 0,
grantedGroupLabels: List<CharSequence> = emptyList(),
) {
whenever(PermissionsSummaryHelper.getPermissionSummary(any(), eq(PACKAGE_NAME), any()))
.thenAnswer {
val callback = it.arguments[2] as PermissionsResultCallback
callback.onPermissionSummaryResult(
requestedPermissionCount,
additionalGrantedPermissionCount,
grantedGroupLabels,
)
}
}
@After
fun tearDown() {
mockSession.finishMocking()
} }
@Test @Test
fun permissionsChangeListener() { fun permissionsChangeListener() {
mockGetPermissionSummary()
summaryLiveData.getOrAwaitValue { summaryLiveData.getOrAwaitValue {
verify(packageManager).addOnPermissionsChangeListener(any()) verify(packageManager).addOnPermissionsChangeListener(any())
verify(packageManager, never()).removeOnPermissionsChangeListener(any()) verify(packageManager, never()).removeOnPermissionsChangeListener(any())
} }
verify(packageManager).removeOnPermissionsChangeListener(any()) verify(packageManager).removeOnPermissionsChangeListener(any())
} }
@Test @Test
fun summary_noPermissionsRequested() { fun summary_noPermissionsRequested() {
ShadowPermissionsSummaryHelper.requestedPermissionCount = 0 mockGetPermissionSummary(requestedPermissionCount = 0)
val (summary, enabled) = summaryLiveData.getOrAwaitValue()!! val (summary, enabled) = summaryLiveData.getOrAwaitValue()!!
@@ -98,8 +120,7 @@ class AppPermissionSummaryTest {
@Test @Test
fun summary_noPermissionsGranted() { fun summary_noPermissionsGranted() {
ShadowPermissionsSummaryHelper.requestedPermissionCount = 1 mockGetPermissionSummary(requestedPermissionCount = 1, grantedGroupLabels = emptyList())
ShadowPermissionsSummaryHelper.grantedGroupLabels = emptyList()
val (summary, enabled) = summaryLiveData.getOrAwaitValue()!! val (summary, enabled) = summaryLiveData.getOrAwaitValue()!!
@@ -111,8 +132,10 @@ class AppPermissionSummaryTest {
@Test @Test
fun onPermissionSummaryResult_hasRuntimePermission_shouldSetPermissionAsSummary() { fun onPermissionSummaryResult_hasRuntimePermission_shouldSetPermissionAsSummary() {
ShadowPermissionsSummaryHelper.requestedPermissionCount = 1 mockGetPermissionSummary(
ShadowPermissionsSummaryHelper.grantedGroupLabels = listOf(PERMISSION) requestedPermissionCount = 1,
grantedGroupLabels = listOf(PERMISSION),
)
val (summary, enabled) = summaryLiveData.getOrAwaitValue()!! val (summary, enabled) = summaryLiveData.getOrAwaitValue()!!
@@ -122,9 +145,11 @@ class AppPermissionSummaryTest {
@Test @Test
fun onPermissionSummaryResult_hasAdditionalPermission_shouldSetAdditionalSummary() { fun onPermissionSummaryResult_hasAdditionalPermission_shouldSetAdditionalSummary() {
ShadowPermissionsSummaryHelper.requestedPermissionCount = 5 mockGetPermissionSummary(
ShadowPermissionsSummaryHelper.additionalGrantedPermissionCount = 2 requestedPermissionCount = 5,
ShadowPermissionsSummaryHelper.grantedGroupLabels = listOf(PERMISSION) additionalGrantedPermissionCount = 2,
grantedGroupLabels = listOf(PERMISSION),
)
val (summary, enabled) = summaryLiveData.getOrAwaitValue()!! val (summary, enabled) = summaryLiveData.getOrAwaitValue()!!
@@ -132,54 +157,11 @@ class AppPermissionSummaryTest {
assertThat(enabled).isTrue() assertThat(enabled).isTrue()
} }
companion object { private companion object {
private const val PACKAGE_NAME = "packageName" const val PACKAGE_NAME = "packageName"
private const val PERMISSION = "Storage" const val PERMISSION = "Storage"
} val APP = ApplicationInfo().apply {
} packageName = PACKAGE_NAME
@Implements(PermissionsSummaryHelper::class)
private object ShadowPermissionsSummaryHelper {
var requestedPermissionCount = 0
var additionalGrantedPermissionCount = 0
var grantedGroupLabels: List<CharSequence> = emptyList()
@Implementation
@JvmStatic
@Suppress("UNUSED_PARAMETER")
fun getPermissionSummary(context: Context, pkg: String, callback: PermissionsResultCallback) {
callback.onPermissionSummaryResult(
requestedPermissionCount,
additionalGrantedPermissionCount,
grantedGroupLabels,
)
}
}
private fun <T> LiveData<T>.getOrAwaitValue(
time: Long = 2,
timeUnit: TimeUnit = TimeUnit.SECONDS,
afterObserve: () -> Unit = {},
): T? {
var data: T? = null
val latch = CountDownLatch(1)
val observer = Observer<T> { o ->
data = o
latch.countDown()
}
this.observeForever(observer)
afterObserve()
try {
// Don't wait indefinitely if the LiveData is not set.
if (!latch.await(time, timeUnit)) {
throw TimeoutException("LiveData value was never set.")
} }
} finally {
this.removeObserver(observer)
} }
return data
} }