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

Commit 828bad5e authored by Treehugger Robot's avatar Treehugger Robot Committed by Android (Google) Code Review
Browse files

Merge changes Ife4fa8f5,I00baac31 into main

* changes:
  Fix DeviceEntryFaceAuthRepositoryTest tests that don't apply when scene container is enabled.
  Disable tests that rely on PrimaryBouncerInteractor state which is not valid when flexiglass is enabled
parents e2f2b5ae 3958663f
Loading
Loading
Loading
Loading
+79 −4
Original line number Diff line number Diff line
@@ -50,12 +50,15 @@ import com.android.systemui.deviceentry.shared.FaceAuthUiEvent
import com.android.systemui.deviceentry.shared.FaceAuthUiEvent.FACE_AUTH_TRIGGERED_ALTERNATE_BIOMETRIC_BOUNCER_SHOWN
import com.android.systemui.deviceentry.shared.FaceAuthUiEvent.FACE_AUTH_TRIGGERED_NOTIFICATION_PANEL_CLICKED
import com.android.systemui.deviceentry.shared.FaceAuthUiEvent.FACE_AUTH_TRIGGERED_SWIPE_UP_ON_BOUNCER
import com.android.systemui.deviceentry.shared.model.DeviceUnlockSource
import com.android.systemui.deviceentry.shared.model.DeviceUnlockStatus
import com.android.systemui.deviceentry.shared.model.ErrorFaceAuthenticationStatus
import com.android.systemui.deviceentry.shared.model.FaceAuthenticationStatus
import com.android.systemui.deviceentry.shared.model.FaceDetectionStatus
import com.android.systemui.deviceentry.shared.model.SuccessFaceAuthenticationStatus
import com.android.systemui.display.data.repository.displayRepository
import com.android.systemui.dump.DumpManager
import com.android.systemui.flags.DisableSceneContainer
import com.android.systemui.flags.EnableSceneContainer
import com.android.systemui.flags.FakeFeatureFlags
import com.android.systemui.keyguard.data.repository.BiometricType
@@ -76,6 +79,7 @@ import com.android.systemui.log.FaceAuthenticationLogger
import com.android.systemui.log.SessionTracker
import com.android.systemui.log.logcatLogBuffer
import com.android.systemui.log.table.logcatTableLogBuffer
import com.android.systemui.plugins.statusbar.statusBarStateController
import com.android.systemui.power.domain.interactor.PowerInteractor.Companion.setAsleepForTest
import com.android.systemui.power.domain.interactor.PowerInteractor.Companion.setAwakeForTest
import com.android.systemui.power.domain.interactor.powerInteractor
@@ -89,11 +93,11 @@ import com.android.systemui.user.data.model.SelectionStatus
import com.android.systemui.user.data.repository.fakeUserRepository
import com.android.systemui.util.mockito.KotlinArgumentCaptor
import com.android.systemui.util.mockito.captureMany
import com.android.systemui.util.mockito.mock
import com.android.systemui.util.mockito.whenever
import com.google.common.truth.Truth.assertThat
import java.io.PrintWriter
import java.io.StringWriter
import kotlinx.coroutines.ExperimentalCoroutinesApi
import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.flowOf
import kotlinx.coroutines.test.TestScope
@@ -116,6 +120,7 @@ import org.mockito.Mockito.verify
import org.mockito.Mockito.verifyNoMoreInteractions
import org.mockito.MockitoAnnotations

@OptIn(ExperimentalCoroutinesApi::class)
@SmallTest
@RunWith(AndroidJUnit4::class)
class DeviceEntryFaceAuthRepositoryTest : SysuiTestCase() {
@@ -531,6 +536,7 @@ class DeviceEntryFaceAuthRepositoryTest : SysuiTestCase() {
        testScope.runTest { testGatingCheckForFaceAuth { underTest.setLockedOut(true) } }

    @Test
    @DisableSceneContainer
    fun authenticateDoesNotRunWhenKeyguardIsGoingAway() =
        testScope.runTest {
            testGatingCheckForFaceAuth { keyguardRepository.setKeyguardGoingAway(true) }
@@ -851,6 +857,7 @@ class DeviceEntryFaceAuthRepositoryTest : SysuiTestCase() {
        }

    @Test
    @DisableSceneContainer
    fun isAuthenticatedIsResetToFalseWhenFinishedTransitioningToGoneAndStatusBarStateShade() =
        testScope.runTest {
            initCollectors()
@@ -882,6 +889,44 @@ class DeviceEntryFaceAuthRepositoryTest : SysuiTestCase() {
            assertThat(authenticated()).isTrue()

            keyguardRepository.setStatusBarState(StatusBarState.SHADE)
            runCurrent()

            assertThat(authenticated()).isFalse()
        }

    @Test
    @EnableSceneContainer
    fun withSceneContainer_isAuthenticatedIsResetToFalseWhenFinishedTransitioningToGoneAndStatusBarStateShade() =
        testScope.runTest {
            kosmos.statusBarStateController.start()
            runCurrent()

            initCollectors()
            allPreconditionsToRunFaceAuthAreTrue()

            triggerFaceAuth(false)

            keyguardRepository.setStatusBarState(StatusBarState.KEYGUARD)
            authenticationCallback.value.onAuthenticationSucceeded(
                mock(FaceManager.AuthenticationResult::class.java)
            )
            assertThat(authenticated()).isTrue()
            kosmos.fakeDeviceEntryRepository.deviceUnlockStatus.value =
                DeviceUnlockStatus(
                    isUnlocked = true,
                    deviceUnlockSource = DeviceUnlockSource.FaceWithBypass,
                )
            runCurrent()

            kosmos.sceneInteractor.changeScene(
                toScene = Scenes.Gone,
                loggingReason = "transition for test",
            )
            assertThat(authenticated()).isTrue()

            keyguardRepository.setStatusBarState(StatusBarState.SHADE)
            runCurrent()

            assertThat(authenticated()).isFalse()
        }

@@ -894,6 +939,7 @@ class DeviceEntryFaceAuthRepositoryTest : SysuiTestCase() {
        }

    @Test
    @DisableSceneContainer
    fun detectDoesNotRunWhenKeyguardGoingAway() =
        testScope.runTest {
            testGatingCheckForDetect { keyguardRepository.setKeyguardGoingAway(true) }
@@ -1040,6 +1086,7 @@ class DeviceEntryFaceAuthRepositoryTest : SysuiTestCase() {
        }

    @Test
    @DisableSceneContainer
    fun schedulesFaceManagerWatchdogWhenKeyguardIsGoneFromDozing() =
        testScope.runTest {
            keyguardTransitionRepository.sendTransitionSteps(
@@ -1052,6 +1099,7 @@ class DeviceEntryFaceAuthRepositoryTest : SysuiTestCase() {
        }

    @Test
    @DisableSceneContainer
    fun schedulesFaceManagerWatchdogWhenKeyguardIsGoneFromAod() =
        testScope.runTest {
            keyguardTransitionRepository.sendTransitionSteps(
@@ -1059,11 +1107,37 @@ class DeviceEntryFaceAuthRepositoryTest : SysuiTestCase() {
                to = KeyguardState.GONE,
                testScope,
            )

            runCurrent()
            verify(faceManager).scheduleWatchdog()
        }

    @Test
    @EnableSceneContainer
    fun schedulesFaceManagerWatchdogWhenKeyguardIsGone_withSceneContainer() =
        testScope.runTest {
            kosmos.sceneInteractor.setTransitionState(
                MutableStateFlow(
                    ObservableTransitionState.Transition.ChangeScene(
                        fromScene = Scenes.Lockscreen,
                        toScene = Scenes.Gone,
                        currentScene = flowOf(Scenes.Lockscreen),
                        currentOverlays = emptySet(),
                        progress = flowOf(.2f),
                        isInitiatedByUserInput = false,
                        isUserInputOngoing = flowOf(false),
                        isInPreviewStage = flowOf(false),
                        previewProgress = flowOf(0.0f),
                    )
                )
            )

            runCurrent()
            verify(faceManager).scheduleWatchdog()
        }

    @Test
    @DisableSceneContainer
    fun schedulesFaceManagerWatchdogWhenKeyguardIsGoneFromLockscreen() =
        testScope.runTest {
            keyguardTransitionRepository.sendTransitionSteps(
@@ -1076,6 +1150,7 @@ class DeviceEntryFaceAuthRepositoryTest : SysuiTestCase() {
        }

    @Test
    @DisableSceneContainer
    fun schedulesFaceManagerWatchdogWhenKeyguardIsGoneFromBouncer() =
        testScope.runTest {
            keyguardTransitionRepository.sendTransitionSteps(
@@ -1149,7 +1224,7 @@ class DeviceEntryFaceAuthRepositoryTest : SysuiTestCase() {
        }

    private suspend fun TestScope.testGatingCheckForFaceAuth(
        sceneContainerEnabled: Boolean = false,
        sceneContainerEnabled: Boolean = SceneContainerFlag.isEnabled,
        gatingCheckModifier: suspend () -> Unit,
    ) {
        initCollectors()
@@ -1192,7 +1267,7 @@ class DeviceEntryFaceAuthRepositoryTest : SysuiTestCase() {
    }

    private suspend fun TestScope.testGatingCheckForDetect(
        sceneContainerEnabled: Boolean = false,
        sceneContainerEnabled: Boolean = SceneContainerFlag.isEnabled,
        gatingCheckModifier: suspend () -> Unit,
    ) {
        initCollectors()
@@ -1245,7 +1320,7 @@ class DeviceEntryFaceAuthRepositoryTest : SysuiTestCase() {
    }

    private suspend fun TestScope.allPreconditionsToRunFaceAuthAreTrue(
        sceneContainerEnabled: Boolean = false
        sceneContainerEnabled: Boolean = SceneContainerFlag.isEnabled
    ) {
        fakeExecutor.runAllReady()
        verify(faceManager, atLeastOnce())
+64 −0
Original line number Diff line number Diff line
@@ -40,6 +40,7 @@ import com.android.systemui.coroutines.collectLastValue
import com.android.systemui.deviceentry.data.repository.fakeFaceWakeUpTriggersConfig
import com.android.systemui.deviceentry.shared.FaceAuthUiEvent
import com.android.systemui.deviceentry.shared.model.ErrorFaceAuthenticationStatus
import com.android.systemui.flags.DisableSceneContainer
import com.android.systemui.flags.EnableSceneContainer
import com.android.systemui.keyguard.data.repository.fakeBiometricSettingsRepository
import com.android.systemui.keyguard.data.repository.fakeDeviceEntryFaceAuthRepository
@@ -276,6 +277,7 @@ class DeviceEntryFaceAuthInteractorTest : SysuiTestCase() {
        }

    @Test
    @DisableSceneContainer
    fun faceAuthLockedOutStateIsUpdatedAfterUserSwitch() =
        testScope.runTest {
            underTest.start()
@@ -308,6 +310,49 @@ class DeviceEntryFaceAuthInteractorTest : SysuiTestCase() {
        }

    @Test
    @EnableSceneContainer
    fun faceAuthLockedOutStateIsUpdatedAfterUserSwitch_withSceneContainerEnabled() =
        testScope.runTest {
            underTest.start()
            runCurrent()
            fakeBiometricSettingsRepository.setIsFaceAuthEnrolledAndEnabled(true)
            faceAuthRepository.setLockedOut(true)

            // User switching has started
            fakeUserRepository.setSelectedUserInfo(primaryUser, SelectionStatus.SELECTION_COMPLETE)
            fakeUserRepository.setSelectedUserInfo(
                primaryUser,
                SelectionStatus.SELECTION_IN_PROGRESS,
            )
            runCurrent()

            kosmos.sceneInteractor.snapToScene(Scenes.Lockscreen, "for-test")
            kosmos.sceneInteractor.showOverlay(Overlays.Bouncer, "for-test")
            kosmos.sceneInteractor.setTransitionState(
                MutableStateFlow(
                    ObservableTransitionState.Idle(Scenes.Lockscreen, setOf(Overlays.Bouncer))
                )
            )
            runCurrent()

            // New user is not locked out.
            facePropertyRepository.setLockoutMode(secondaryUser.id, LockoutMode.NONE)
            fakeUserRepository.setSelectedUserInfo(
                secondaryUser,
                SelectionStatus.SELECTION_COMPLETE,
            )
            runCurrent()

            assertThat(faceAuthRepository.isLockedOut.value).isFalse()

            runCurrent()
            assertThat(faceAuthRepository.runningAuthRequest.value!!.first)
                .isEqualTo(FaceAuthUiEvent.FACE_AUTH_UPDATED_USER_SWITCHING)
            assertThat(faceAuthRepository.runningAuthRequest.value!!.second).isEqualTo(false)
        }

    @Test
    @DisableSceneContainer
    fun faceAuthIsRequestedWhenPrimaryBouncerIsVisible() =
        testScope.runTest {
            underTest.start()
@@ -316,8 +361,27 @@ class DeviceEntryFaceAuthInteractorTest : SysuiTestCase() {
            runCurrent()

            bouncerRepository.setPrimaryShow(true)
            runCurrent()

            assertThat(faceAuthRepository.runningAuthRequest.value)
                .isEqualTo(Pair(FaceAuthUiEvent.FACE_AUTH_UPDATED_PRIMARY_BOUNCER_SHOWN, false))
        }

    @Test
    @EnableSceneContainer
    fun faceAuthIsRequestedWhenPrimaryBouncerIsVisible_withSceneContainerEnabled() =
        testScope.runTest {
            underTest.start()

            kosmos.sceneInteractor.snapToScene(Scenes.Lockscreen, "for-test")
            kosmos.sceneInteractor.showOverlay(Overlays.Bouncer, "for-test")
            kosmos.sceneInteractor.setTransitionState(
                MutableStateFlow(
                    ObservableTransitionState.Idle(Scenes.Lockscreen, setOf(Overlays.Bouncer))
                )
            )
            runCurrent()

            assertThat(faceAuthRepository.runningAuthRequest.value)
                .isEqualTo(Pair(FaceAuthUiEvent.FACE_AUTH_UPDATED_PRIMARY_BOUNCER_SHOWN, false))
        }