Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 0993041f authored by Dave Mankoff's avatar Dave Mankoff Committed by Android (Google) Code Review
Browse files

Merge "Change coroutine testing for kotlinx.coroutines 1.9" into main

parents ab06e12c de414412
Loading
Loading
Loading
Loading
+4 −6
Original line number Diff line number Diff line
@@ -32,7 +32,8 @@ import java.util.Optional
import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.launchIn
import kotlinx.coroutines.flow.onEach
import kotlinx.coroutines.test.runBlockingTest
import kotlinx.coroutines.test.UnconfinedTestDispatcher
import kotlinx.coroutines.test.runTest
import org.junit.Before
import org.junit.Test
import org.junit.runner.RunWith
@@ -125,14 +126,11 @@ class HomeControlsKeyguardQuickAffordanceConfigParameterizedStateTest : SysuiTes
            )

        underTest =
            HomeControlsKeyguardQuickAffordanceConfig(
                context = context,
                component = component,
            )
            HomeControlsKeyguardQuickAffordanceConfig(context = context, component = component)
    }

    @Test
    fun state() = runBlockingTest {
    fun state() = runTest(UnconfinedTestDispatcher()) {
        whenever(component.isEnabled()).thenReturn(isFeatureEnabled)
        whenever(controlsController.getFavorites())
            .thenReturn(
+22 −21
Original line number Diff line number Diff line
@@ -19,19 +19,20 @@ package com.android.systemui.keyguard.data.quickaffordance

import androidx.test.ext.junit.runners.AndroidJUnit4
import androidx.test.filters.SmallTest
import com.android.systemui.res.R
import com.android.systemui.SysuiTestCase
import com.android.systemui.animation.Expandable
import com.android.systemui.controls.controller.ControlsController
import com.android.systemui.controls.dagger.ControlsComponent
import com.android.systemui.keyguard.data.quickaffordance.KeyguardQuickAffordanceConfig.OnTriggeredResult
import com.android.systemui.res.R
import com.android.systemui.util.mockito.mock
import com.google.common.truth.Truth.assertThat
import java.util.Optional
import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.launchIn
import kotlinx.coroutines.flow.onEach
import kotlinx.coroutines.test.runBlockingTest
import kotlinx.coroutines.test.UnconfinedTestDispatcher
import kotlinx.coroutines.test.runTest
import org.junit.Before
import org.junit.Test
import org.junit.runner.RunWith
@@ -54,14 +55,11 @@ class HomeControlsKeyguardQuickAffordanceConfigTest : SysuiTestCase() {
        whenever(component.canShowWhileLockedSetting).thenReturn(MutableStateFlow(true))

        underTest =
            HomeControlsKeyguardQuickAffordanceConfig(
                context = context,
                component = component,
            )
            HomeControlsKeyguardQuickAffordanceConfig(context = context, component = component)
    }

    @Test
    fun state_whenCannotShowWhileLocked_returnsHidden() = runBlockingTest {
    fun state_whenCannotShowWhileLocked_returnsHidden() = runTest(UnconfinedTestDispatcher()) {
        whenever(component.canShowWhileLockedSetting).thenReturn(MutableStateFlow(false))
        whenever(component.isEnabled()).thenReturn(true)
        whenever(component.getTileImageId()).thenReturn(R.drawable.controls_icon)
@@ -81,7 +79,7 @@ class HomeControlsKeyguardQuickAffordanceConfigTest : SysuiTestCase() {
    }

    @Test
    fun state_whenListingControllerIsMissing_returnsHidden() = runBlockingTest {
    fun state_whenListingControllerIsMissing_returnsHidden() = runTest(UnconfinedTestDispatcher()) {
        whenever(component.isEnabled()).thenReturn(true)
        whenever(component.getTileImageId()).thenReturn(R.drawable.controls_icon)
        whenever(component.getTileTitleId()).thenReturn(R.string.quick_controls_title)
@@ -100,17 +98,20 @@ class HomeControlsKeyguardQuickAffordanceConfigTest : SysuiTestCase() {
    }

    @Test
    fun onQuickAffordanceTriggered_canShowWhileLockedSettingIsTrue() = runBlockingTest {
    fun onQuickAffordanceTriggered_canShowWhileLockedSettingIsTrue() =
        runTest(UnconfinedTestDispatcher()) {
            whenever(component.canShowWhileLockedSetting).thenReturn(MutableStateFlow(true))

            val onClickedResult = underTest.onTriggered(expandable)

            assertThat(onClickedResult).isInstanceOf(OnTriggeredResult.StartActivity::class.java)
        assertThat((onClickedResult as OnTriggeredResult.StartActivity).canShowWhileLocked).isTrue()
            assertThat((onClickedResult as OnTriggeredResult.StartActivity).canShowWhileLocked)
                .isTrue()
        }

    @Test
    fun onQuickAffordanceTriggered_canShowWhileLockedSettingIsFalse() = runBlockingTest {
    fun onQuickAffordanceTriggered_canShowWhileLockedSettingIsFalse() =
        runTest(UnconfinedTestDispatcher()) {
            whenever(component.canShowWhileLockedSetting).thenReturn(MutableStateFlow(false))

            val onClickedResult = underTest.onTriggered(expandable)
+61 −59
Original line number Diff line number Diff line
@@ -29,7 +29,7 @@ import com.android.systemui.util.mockito.whenever
import com.google.common.truth.Truth.assertThat
import kotlinx.coroutines.flow.launchIn
import kotlinx.coroutines.flow.onEach
import kotlinx.coroutines.test.runBlockingTest
import kotlinx.coroutines.test.UnconfinedTestDispatcher
import kotlinx.coroutines.test.runTest
import org.junit.Before
import org.junit.Test
@@ -56,7 +56,8 @@ class QrCodeScannerKeyguardQuickAffordanceConfigTest : SysuiTestCase() {
    }

    @Test
    fun affordance_setsUpRegistrationAndDeliversInitialModel() = runBlockingTest {
    fun affordance_setsUpRegistrationAndDeliversInitialModel() =
        runTest(UnconfinedTestDispatcher()) {
            whenever(controller.isEnabledForLockScreenButton).thenReturn(true)
            var latest: KeyguardQuickAffordanceConfig.LockScreenState? = null

@@ -67,7 +68,7 @@ class QrCodeScannerKeyguardQuickAffordanceConfigTest : SysuiTestCase() {
            verify(controller)
                .registerQRCodeScannerChangeObservers(
                    QRCodeScannerController.DEFAULT_QR_CODE_SCANNER_CHANGE,
                QRCodeScannerController.QR_CODE_SCANNER_PREFERENCE_CHANGE
                    QRCodeScannerController.QR_CODE_SCANNER_PREFERENCE_CHANGE,
                )
            assertVisibleState(latest)

@@ -76,7 +77,8 @@ class QrCodeScannerKeyguardQuickAffordanceConfigTest : SysuiTestCase() {
        }

    @Test
    fun affordance_scannerActivityChanged_deliversModelWithUpdatedIntent() = runBlockingTest {
    fun affordance_scannerActivityChanged_deliversModelWithUpdatedIntent() =
        runTest(UnconfinedTestDispatcher()) {
            whenever(controller.isEnabledForLockScreenButton).thenReturn(true)
            var latest: KeyguardQuickAffordanceConfig.LockScreenState? = null
            val job = underTest.lockScreenState.onEach { latest = it }.launchIn(this)
@@ -93,7 +95,8 @@ class QrCodeScannerKeyguardQuickAffordanceConfigTest : SysuiTestCase() {
        }

    @Test
    fun affordance_scannerPreferenceChanged_deliversVisibleModel() = runBlockingTest {
    fun affordance_scannerPreferenceChanged_deliversVisibleModel() =
        runTest(UnconfinedTestDispatcher()) {
            var latest: KeyguardQuickAffordanceConfig.LockScreenState? = null
            val job = underTest.lockScreenState.onEach { latest = it }.launchIn(this)
            val callbackCaptor = argumentCaptor<QRCodeScannerController.Callback>()
@@ -109,7 +112,7 @@ class QrCodeScannerKeyguardQuickAffordanceConfigTest : SysuiTestCase() {
        }

    @Test
    fun affordance_scannerPreferenceChanged_deliversNone() = runBlockingTest {
    fun affordance_scannerPreferenceChanged_deliversNone() = runTest(UnconfinedTestDispatcher()) {
        var latest: KeyguardQuickAffordanceConfig.LockScreenState? = null
        val job = underTest.lockScreenState.onEach { latest = it }.launchIn(this)
        val callbackCaptor = argumentCaptor<QRCodeScannerController.Callback>()
@@ -128,15 +131,13 @@ class QrCodeScannerKeyguardQuickAffordanceConfigTest : SysuiTestCase() {
    fun onQuickAffordanceTriggered() {
        assertThat(underTest.onTriggered(mock()))
            .isEqualTo(
                OnTriggeredResult.StartActivity(
                    intent = INTENT_1,
                    canShowWhileLocked = true,
                )
                OnTriggeredResult.StartActivity(intent = INTENT_1, canShowWhileLocked = true)
            )
    }

    @Test
    fun getPickerScreenState_enabledIfConfiguredOnDevice_isEnabledForPickerState() = runTest {
    fun getPickerScreenState_enabledIfConfiguredOnDevice_isEnabledForPickerState() =
        runTest(UnconfinedTestDispatcher()) {
            whenever(controller.isAllowedOnLockScreen).thenReturn(true)
            whenever(controller.isAbleToLaunchScannerActivity).thenReturn(true)

@@ -145,7 +146,8 @@ class QrCodeScannerKeyguardQuickAffordanceConfigTest : SysuiTestCase() {
        }

    @Test
    fun getPickerScreenState_disabledIfConfiguredOnDevice_isDisabledForPickerState() = runTest {
    fun getPickerScreenState_disabledIfConfiguredOnDevice_isDisabledForPickerState() =
        runTest(UnconfinedTestDispatcher()) {
            whenever(controller.isAllowedOnLockScreen).thenReturn(true)
            whenever(controller.isAbleToLaunchScannerActivity).thenReturn(false)

+29 −33
Original line number Diff line number Diff line
@@ -22,21 +22,25 @@ import android.content.Context
import android.content.pm.UserInfo
import android.os.UserHandle
import android.os.UserManager
import android.testing.TestableLooper
import androidx.test.ext.junit.runners.AndroidJUnit4
import androidx.test.filters.SmallTest
import com.android.internal.logging.UiEventLogger
import com.android.systemui.GuestResetOrExitSessionReceiver
import com.android.systemui.GuestResumeSessionReceiver
import com.android.systemui.SysuiTestCase
import com.android.systemui.kosmos.runTest
import com.android.systemui.kosmos.testDispatcher
import com.android.systemui.kosmos.testScope
import com.android.systemui.kosmos.useUnconfinedTestDispatcher
import com.android.systemui.statusbar.policy.DeviceProvisionedController
import com.android.systemui.testKosmos
import com.android.systemui.user.data.repository.FakeUserRepository
import com.android.systemui.user.domain.model.ShowDialogRequestModel
import com.android.systemui.util.mockito.any
import com.android.systemui.util.mockito.kotlinArgumentCaptor
import com.android.systemui.util.mockito.whenever
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.runBlocking
import kotlinx.coroutines.test.TestCoroutineScope
import org.junit.Before
import org.junit.Test
import org.junit.runner.RunWith
@@ -48,6 +52,7 @@ import org.mockito.MockitoAnnotations

@SmallTest
@RunWith(AndroidJUnit4::class)
@TestableLooper.RunWithLooper
class GuestUserInteractorTest : SysuiTestCase() {

    @Mock private lateinit var manager: UserManager
@@ -64,16 +69,15 @@ class GuestUserInteractorTest : SysuiTestCase() {

    private lateinit var underTest: GuestUserInteractor

    private lateinit var scope: TestCoroutineScope
    private lateinit var repository: FakeUserRepository
    private val kosmos = testKosmos().useUnconfinedTestDispatcher()
    private val scope = kosmos.testScope
    private val repository = FakeUserRepository()

    @Before
    fun setUp() {
        MockitoAnnotations.initMocks(this)
        whenever(manager.createGuest(any())).thenReturn(GUEST_USER_INFO)

        scope = TestCoroutineScope()
        repository = FakeUserRepository()
        repository.setUserInfos(ALL_USERS)

        underTest = initGuestUserInteractor(context)
@@ -83,8 +87,8 @@ class GuestUserInteractorTest : SysuiTestCase() {
        GuestUserInteractor(
            applicationContext = context,
            applicationScope = scope,
            mainDispatcher = IMMEDIATE,
            backgroundDispatcher = IMMEDIATE,
            mainDispatcher = kosmos.testDispatcher,
            backgroundDispatcher = kosmos.testDispatcher,
            manager = manager,
            repository = repository,
            deviceProvisionedController = deviceProvisionedController,
@@ -92,7 +96,7 @@ class GuestUserInteractorTest : SysuiTestCase() {
            refreshUsersScheduler =
                RefreshUsersScheduler(
                    applicationScope = scope,
                    mainDispatcher = IMMEDIATE,
                    mainDispatcher = kosmos.testDispatcher,
                    repository = repository,
                ),
            uiEventLogger = uiEventLogger,
@@ -118,7 +122,7 @@ class GuestUserInteractorTest : SysuiTestCase() {

    @Test
    fun onDeviceBootCompleted_allowedToAdd_createGuest() =
        runBlocking(IMMEDIATE) {
        kosmos.runTest {
            setAllowedToAdd()

            underTest.onDeviceBootCompleted()
@@ -129,7 +133,7 @@ class GuestUserInteractorTest : SysuiTestCase() {

    @Test
    fun onDeviceBootCompleted_awaitProvisioning_andCreateGuest() =
        runBlocking(IMMEDIATE) {
        kosmos.runTest {
            setAllowedToAdd(isAllowed = false)
            underTest.onDeviceBootCompleted()
            val captor =
@@ -145,7 +149,7 @@ class GuestUserInteractorTest : SysuiTestCase() {

    @Test
    fun createAndSwitchTo() =
        runBlocking(IMMEDIATE) {
        kosmos.runTest {
            underTest.createAndSwitchTo(
                showDialog = showDialog,
                dismissDialog = dismissDialog,
@@ -160,7 +164,7 @@ class GuestUserInteractorTest : SysuiTestCase() {

    @Test
    fun createAndSwitchTo_failsToCreate_doesNotSwitchTo() =
        runBlocking(IMMEDIATE) {
        kosmos.runTest {
            whenever(manager.createGuest(any())).thenReturn(null)

            underTest.createAndSwitchTo(
@@ -177,7 +181,7 @@ class GuestUserInteractorTest : SysuiTestCase() {

    @Test
    fun exit_returnsToTargetUser() =
        runBlocking(IMMEDIATE) {
        kosmos.runTest {
            repository.setSelectedUserInfo(GUEST_USER_INFO)

            val targetUserId = NON_GUEST_USER_INFO.id
@@ -197,7 +201,7 @@ class GuestUserInteractorTest : SysuiTestCase() {

    @Test
    fun exit_returnsToLastNonGuest() =
        runBlocking(IMMEDIATE) {
        kosmos.runTest {
            val expectedUserId = NON_GUEST_USER_INFO.id
            whenever(manager.getUserInfo(expectedUserId)).thenReturn(NON_GUEST_USER_INFO)
            repository.lastSelectedNonGuestUserId = expectedUserId
@@ -219,7 +223,7 @@ class GuestUserInteractorTest : SysuiTestCase() {

    @Test
    fun exit_lastNonGuestWasRemoved_returnsToMainUser() =
        runBlocking(IMMEDIATE) {
        kosmos.runTest {
            val removedUserId = 310
            val mainUserId = 10
            repository.lastSelectedNonGuestUserId = removedUserId
@@ -242,7 +246,7 @@ class GuestUserInteractorTest : SysuiTestCase() {

    @Test
    fun exit_guestWasEphemeral_itIsRemoved() =
        runBlocking(IMMEDIATE) {
        kosmos.runTest {
            whenever(manager.markGuestForDeletion(anyInt())).thenReturn(true)
            repository.setUserInfos(listOf(NON_GUEST_USER_INFO, EPHEMERAL_GUEST_USER_INFO))
            repository.setSelectedUserInfo(EPHEMERAL_GUEST_USER_INFO)
@@ -265,7 +269,7 @@ class GuestUserInteractorTest : SysuiTestCase() {

    @Test
    fun exit_forceRemoveGuest_itIsRemoved() =
        runBlocking(IMMEDIATE) {
        kosmos.runTest {
            whenever(manager.markGuestForDeletion(anyInt())).thenReturn(true)
            repository.setSelectedUserInfo(GUEST_USER_INFO)
            val targetUserId = NON_GUEST_USER_INFO.id
@@ -287,7 +291,7 @@ class GuestUserInteractorTest : SysuiTestCase() {

    @Test
    fun exit_selectedDifferentFromGuestUser_doNothing() =
        runBlocking(IMMEDIATE) {
        kosmos.runTest {
            repository.setSelectedUserInfo(NON_GUEST_USER_INFO)

            underTest.exit(
@@ -304,7 +308,7 @@ class GuestUserInteractorTest : SysuiTestCase() {

    @Test
    fun exit_selectedIsActuallyNotAguestUser_doNothing() =
        runBlocking(IMMEDIATE) {
        kosmos.runTest {
            repository.setSelectedUserInfo(NON_GUEST_USER_INFO)

            underTest.exit(
@@ -321,7 +325,7 @@ class GuestUserInteractorTest : SysuiTestCase() {

    @Test
    fun remove_returnsToTargetUser() =
        runBlocking(IMMEDIATE) {
        kosmos.runTest {
            whenever(manager.markGuestForDeletion(anyInt())).thenReturn(true)
            repository.setSelectedUserInfo(GUEST_USER_INFO)

@@ -342,7 +346,7 @@ class GuestUserInteractorTest : SysuiTestCase() {

    @Test
    fun remove_selectedDifferentFromGuestUser_doNothing() =
        runBlocking(IMMEDIATE) {
        kosmos.runTest {
            whenever(manager.markGuestForDeletion(anyInt())).thenReturn(true)
            repository.setSelectedUserInfo(NON_GUEST_USER_INFO)

@@ -359,7 +363,7 @@ class GuestUserInteractorTest : SysuiTestCase() {

    @Test
    fun remove_selectedIsActuallyNotAguestUser_doNothing() =
        runBlocking(IMMEDIATE) {
        kosmos.runTest {
            whenever(manager.markGuestForDeletion(anyInt())).thenReturn(true)
            repository.setSelectedUserInfo(NON_GUEST_USER_INFO)

@@ -395,11 +399,7 @@ class GuestUserInteractorTest : SysuiTestCase() {
    companion object {
        private val IMMEDIATE = Dispatchers.Main.immediate
        private val NON_GUEST_USER_INFO =
            UserInfo(
                /* id= */ 818,
                /* name= */ "non_guest",
                /* flags= */ UserInfo.FLAG_FULL,
            )
            UserInfo(/* id= */ 818, /* name= */ "non_guest", /* flags= */ UserInfo.FLAG_FULL)
        private val GUEST_USER_INFO =
            UserInfo(
                /* id= */ 669,
@@ -416,10 +416,6 @@ class GuestUserInteractorTest : SysuiTestCase() {
                /* flags= */ UserInfo.FLAG_EPHEMERAL or UserInfo.FLAG_FULL,
                UserManager.USER_TYPE_FULL_GUEST,
            )
        private val ALL_USERS =
            listOf(
                NON_GUEST_USER_INFO,
                GUEST_USER_INFO,
            )
        private val ALL_USERS = listOf(NON_GUEST_USER_INFO, GUEST_USER_INFO)
    }
}
+114 −83

File changed.

Preview size limit exceeded, changes collapsed.