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

Commit de414412 authored by Dave Mankoff's avatar Dave Mankoff
Browse files

Change coroutine testing for kotlinx.coroutines 1.9

See
https://github.com/Kotlin/kotlinx.coroutines/blob/master/kotlinx-coroutines-test/MIGRATION.md
for details.

Bug: 369137871
Flag: TEST_ONLY
Test: presubmits
Change-Id: I002033537eb0a5a591dd2b30546a0446c8b99225
parent 97b1de7f
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.