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

Commit 63a897f5 authored by Michal Brzezinski's avatar Michal Brzezinski Committed by Michał Brzeziński
Browse files

Using fakes instead of mocks in DisplaySwitchLatencyTrackerTest

In preparation to add more tests and logic to the class

Bug: 390649568
Test: DisplaySwitchLatencyTrackerTest still passing
Flag: TEST_ONLY
Change-Id: I1ae78aa40a09d4ae306e39cb4078aef85eaf1cf7
parent d811d8cb
Loading
Loading
Loading
Loading
+62 −77
Original line number Original line Diff line number Diff line
@@ -19,6 +19,7 @@ package com.android.systemui.unfold
import android.content.Context
import android.content.Context
import android.content.res.Resources
import android.content.res.Resources
import android.hardware.devicestate.DeviceStateManager
import android.hardware.devicestate.DeviceStateManager
import android.os.PowerManager.GO_TO_SLEEP_REASON_DEVICE_FOLD
import androidx.test.ext.junit.runners.AndroidJUnit4
import androidx.test.ext.junit.runners.AndroidJUnit4
import androidx.test.filters.SmallTest
import androidx.test.filters.SmallTest
import com.android.internal.R
import com.android.internal.R
@@ -27,16 +28,20 @@ import com.android.systemui.common.ui.data.repository.ConfigurationRepositoryImp
import com.android.systemui.common.ui.domain.interactor.ConfigurationInteractorImpl
import com.android.systemui.common.ui.domain.interactor.ConfigurationInteractorImpl
import com.android.systemui.defaultDeviceState
import com.android.systemui.defaultDeviceState
import com.android.systemui.deviceStateManager
import com.android.systemui.deviceStateManager
import com.android.systemui.display.data.repository.DeviceStateRepository
import com.android.systemui.display.data.repository.DeviceStateRepository.DeviceState
import com.android.systemui.display.data.repository.DeviceStateRepository.DeviceState
import com.android.systemui.display.data.repository.DeviceStateRepository.DeviceState.FOLDED
import com.android.systemui.display.data.repository.DeviceStateRepository.DeviceState.HALF_FOLDED
import com.android.systemui.display.data.repository.DeviceStateRepository.DeviceState.UNFOLDED
import com.android.systemui.display.data.repository.fakeDeviceStateRepository
import com.android.systemui.foldedDeviceStateList
import com.android.systemui.foldedDeviceStateList
import com.android.systemui.keyguard.domain.interactor.KeyguardInteractor
import com.android.systemui.keyguard.domain.interactor.KeyguardInteractor
import com.android.systemui.kosmos.Kosmos
import com.android.systemui.kosmos.Kosmos
import com.android.systemui.power.domain.interactor.PowerInteractor
import com.android.systemui.power.domain.interactor.PowerInteractor.Companion.setAsleepForTest
import com.android.systemui.power.shared.model.ScreenPowerState
import com.android.systemui.power.domain.interactor.PowerInteractor.Companion.setAwakeForTest
import com.android.systemui.power.shared.model.WakeSleepReason
import com.android.systemui.power.domain.interactor.PowerInteractor.Companion.setScreenPowerState
import com.android.systemui.power.shared.model.WakefulnessModel
import com.android.systemui.power.domain.interactor.PowerInteractorFactory
import com.android.systemui.power.shared.model.WakefulnessState
import com.android.systemui.power.shared.model.ScreenPowerState.SCREEN_OFF
import com.android.systemui.power.shared.model.ScreenPowerState.SCREEN_ON
import com.android.systemui.shared.system.SysUiStatsLog
import com.android.systemui.shared.system.SysUiStatsLog
import com.android.systemui.statusbar.policy.FakeConfigurationController
import com.android.systemui.statusbar.policy.FakeConfigurationController
import com.android.systemui.unfold.DisplaySwitchLatencyTracker.Companion.FOLDABLE_DEVICE_STATE_CLOSED
import com.android.systemui.unfold.DisplaySwitchLatencyTracker.Companion.FOLDABLE_DEVICE_STATE_CLOSED
@@ -45,7 +50,7 @@ import com.android.systemui.unfold.DisplaySwitchLatencyTracker.DisplaySwitchLate
import com.android.systemui.unfold.data.repository.UnfoldTransitionRepositoryImpl
import com.android.systemui.unfold.data.repository.UnfoldTransitionRepositoryImpl
import com.android.systemui.unfold.domain.interactor.UnfoldTransitionInteractor
import com.android.systemui.unfold.domain.interactor.UnfoldTransitionInteractor
import com.android.systemui.unfoldedDeviceState
import com.android.systemui.unfoldedDeviceState
import com.android.systemui.util.animation.data.repository.AnimationStatusRepository
import com.android.systemui.util.animation.data.repository.fakeAnimationStatusRepository
import com.android.systemui.util.mockito.any
import com.android.systemui.util.mockito.any
import com.android.systemui.util.mockito.capture
import com.android.systemui.util.mockito.capture
import com.android.systemui.util.time.FakeSystemClock
import com.android.systemui.util.time.FakeSystemClock
@@ -77,14 +82,15 @@ class DisplaySwitchLatencyTrackerTest : SysuiTestCase() {
    private lateinit var displaySwitchLatencyTracker: DisplaySwitchLatencyTracker
    private lateinit var displaySwitchLatencyTracker: DisplaySwitchLatencyTracker
    @Captor private lateinit var loggerArgumentCaptor: ArgumentCaptor<DisplaySwitchLatencyEvent>
    @Captor private lateinit var loggerArgumentCaptor: ArgumentCaptor<DisplaySwitchLatencyEvent>


    private val kosmos = Kosmos()
    private val mockContext = mock<Context>()
    private val mockContext = mock<Context>()
    private val resources = mock<Resources>()
    private val resources = mock<Resources>()
    private val foldStateRepository = mock<DeviceStateRepository>()
    private val foldStateRepository = kosmos.fakeDeviceStateRepository
    private val powerInteractor = mock<PowerInteractor>()
    private val powerInteractor = PowerInteractorFactory.create().powerInteractor
    private val animationStatusRepository = mock<AnimationStatusRepository>()
    private val animationStatusRepository = kosmos.fakeAnimationStatusRepository
    private val keyguardInteractor = mock<KeyguardInteractor>()
    private val keyguardInteractor = mock<KeyguardInteractor>()
    private val displaySwitchLatencyLogger = mock<DisplaySwitchLatencyLogger>()
    private val displaySwitchLatencyLogger = mock<DisplaySwitchLatencyLogger>()
    private val kosmos = Kosmos()

    private val deviceStateManager = kosmos.deviceStateManager
    private val deviceStateManager = kosmos.deviceStateManager
    private val closedDeviceState = kosmos.foldedDeviceStateList.first()
    private val closedDeviceState = kosmos.foldedDeviceStateList.first()
    private val openDeviceState = kosmos.unfoldedDeviceState
    private val openDeviceState = kosmos.unfoldedDeviceState
@@ -94,12 +100,7 @@ class DisplaySwitchLatencyTrackerTest : SysuiTestCase() {


    private val testDispatcher: TestDispatcher = StandardTestDispatcher()
    private val testDispatcher: TestDispatcher = StandardTestDispatcher()
    private val testScope: TestScope = TestScope(testDispatcher)
    private val testScope: TestScope = TestScope(testDispatcher)
    private val isAsleep = MutableStateFlow(false)
    private val isAodAvailable = MutableStateFlow(false)
    private val isAodAvailable = MutableStateFlow(false)
    private val deviceState = MutableStateFlow(DeviceState.UNFOLDED)
    private val screenPowerState = MutableStateFlow(ScreenPowerState.SCREEN_ON)
    private val areAnimationEnabled = MutableStateFlow(true)
    private val lastWakefulnessEvent = MutableStateFlow(WakefulnessModel())
    private val systemClock = FakeSystemClock()
    private val systemClock = FakeSystemClock()
    private val configurationController = FakeConfigurationController()
    private val configurationController = FakeConfigurationController()
    private val configurationRepository =
    private val configurationRepository =
@@ -126,13 +127,10 @@ class DisplaySwitchLatencyTrackerTest : SysuiTestCase() {
            .thenReturn(listOf(closedDeviceState, openDeviceState))
            .thenReturn(listOf(closedDeviceState, openDeviceState))
        whenever(resources.getIntArray(R.array.config_foldedDeviceStates))
        whenever(resources.getIntArray(R.array.config_foldedDeviceStates))
            .thenReturn(nonEmptyClosedDeviceStatesArray)
            .thenReturn(nonEmptyClosedDeviceStatesArray)
        whenever(foldStateRepository.state).thenReturn(deviceState)
        whenever(powerInteractor.isAsleep).thenReturn(isAsleep)
        whenever(animationStatusRepository.areAnimationsEnabled()).thenReturn(areAnimationEnabled)
        whenever(powerInteractor.screenPowerState).thenReturn(screenPowerState)
        whenever(keyguardInteractor.isAodAvailable).thenReturn(isAodAvailable)
        whenever(keyguardInteractor.isAodAvailable).thenReturn(isAodAvailable)
        whenever(powerInteractor.detailedWakefulness).thenReturn(lastWakefulnessEvent)
        animationStatusRepository.onAnimationStatusChanged(true)

        powerInteractor.setAwakeForTest()
        powerInteractor.setScreenPowerState(SCREEN_ON)
        displaySwitchLatencyTracker =
        displaySwitchLatencyTracker =
            DisplaySwitchLatencyTracker(
            DisplaySwitchLatencyTracker(
                mockContext,
                mockContext,
@@ -152,21 +150,19 @@ class DisplaySwitchLatencyTrackerTest : SysuiTestCase() {
    @Test
    @Test
    fun unfold_logsLatencyTillTransitionStarted() {
    fun unfold_logsLatencyTillTransitionStarted() {
        testScope.runTest {
        testScope.runTest {
            areAnimationEnabled.emit(true)

            displaySwitchLatencyTracker.start()
            displaySwitchLatencyTracker.start()
            deviceState.emit(DeviceState.FOLDED)
            setDeviceState(FOLDED)
            screenPowerState.emit(ScreenPowerState.SCREEN_OFF)
            powerInteractor.setScreenPowerState(SCREEN_OFF)
            systemClock.advanceTime(50)
            systemClock.advanceTime(50)
            runCurrent()
            runCurrent()
            deviceState.emit(DeviceState.HALF_FOLDED)
            setDeviceState(HALF_FOLDED)
            runCurrent()
            runCurrent()
            systemClock.advanceTime(50)
            systemClock.advanceTime(50)
            screenPowerState.emit(ScreenPowerState.SCREEN_ON)
            powerInteractor.setScreenPowerState(SCREEN_ON)
            systemClock.advanceTime(200)
            systemClock.advanceTime(200)
            unfoldTransitionProgressProvider.onTransitionStarted()
            unfoldTransitionProgressProvider.onTransitionStarted()
            runCurrent()
            runCurrent()
            deviceState.emit(DeviceState.UNFOLDED)
            setDeviceState(UNFOLDED)


            verify(displaySwitchLatencyLogger).log(capture(loggerArgumentCaptor))
            verify(displaySwitchLatencyLogger).log(capture(loggerArgumentCaptor))
            val loggedEvent = loggerArgumentCaptor.value
            val loggedEvent = loggerArgumentCaptor.value
@@ -202,23 +198,22 @@ class DisplaySwitchLatencyTrackerTest : SysuiTestCase() {
                    systemClock,
                    systemClock,
                    deviceStateManager,
                    deviceStateManager,
                )
                )
            areAnimationEnabled.emit(true)


            displaySwitchLatencyTracker.start()
            displaySwitchLatencyTracker.start()
            deviceState.emit(DeviceState.FOLDED)
            setDeviceState(FOLDED)
            screenPowerState.emit(ScreenPowerState.SCREEN_OFF)
            powerInteractor.setScreenPowerState(SCREEN_OFF)
            systemClock.advanceTime(50)
            systemClock.advanceTime(50)
            runCurrent()
            runCurrent()
            deviceState.emit(DeviceState.HALF_FOLDED)
            setDeviceState(HALF_FOLDED)
            systemClock.advanceTime(50)
            systemClock.advanceTime(50)
            runCurrent()
            runCurrent()
            screenPowerState.emit(ScreenPowerState.SCREEN_ON)
            powerInteractor.setScreenPowerState(SCREEN_ON)
            systemClock.advanceTime(50)
            systemClock.advanceTime(50)
            runCurrent()
            runCurrent()
            systemClock.advanceTime(200)
            systemClock.advanceTime(200)
            unfoldTransitionProgressProvider.onTransitionStarted()
            unfoldTransitionProgressProvider.onTransitionStarted()
            runCurrent()
            runCurrent()
            deviceState.emit(DeviceState.UNFOLDED)
            setDeviceState(UNFOLDED)


            verify(displaySwitchLatencyLogger).log(capture(loggerArgumentCaptor))
            verify(displaySwitchLatencyLogger).log(capture(loggerArgumentCaptor))
            val loggedEvent = loggerArgumentCaptor.value
            val loggedEvent = loggerArgumentCaptor.value
@@ -235,23 +230,23 @@ class DisplaySwitchLatencyTrackerTest : SysuiTestCase() {
    @Test
    @Test
    fun unfold_animationDisabled_logsLatencyTillScreenTurnedOn() {
    fun unfold_animationDisabled_logsLatencyTillScreenTurnedOn() {
        testScope.runTest {
        testScope.runTest {
            areAnimationEnabled.emit(false)
            animationStatusRepository.onAnimationStatusChanged(false)


            displaySwitchLatencyTracker.start()
            displaySwitchLatencyTracker.start()
            deviceState.emit(DeviceState.FOLDED)
            setDeviceState(FOLDED)
            screenPowerState.emit(ScreenPowerState.SCREEN_OFF)
            powerInteractor.setScreenPowerState(SCREEN_OFF)
            systemClock.advanceTime(50)
            systemClock.advanceTime(50)
            runCurrent()
            runCurrent()
            deviceState.emit(DeviceState.HALF_FOLDED)
            setDeviceState(HALF_FOLDED)
            systemClock.advanceTime(50)
            systemClock.advanceTime(50)
            runCurrent()
            runCurrent()
            screenPowerState.emit(ScreenPowerState.SCREEN_ON)
            powerInteractor.setScreenPowerState(SCREEN_ON)
            systemClock.advanceTime(50)
            systemClock.advanceTime(50)
            runCurrent()
            runCurrent()
            unfoldTransitionProgressProvider.onTransitionStarted()
            unfoldTransitionProgressProvider.onTransitionStarted()
            systemClock.advanceTime(200)
            systemClock.advanceTime(200)
            runCurrent()
            runCurrent()
            deviceState.emit(DeviceState.UNFOLDED)
            setDeviceState(UNFOLDED)


            verify(displaySwitchLatencyLogger).log(capture(loggerArgumentCaptor))
            verify(displaySwitchLatencyLogger).log(capture(loggerArgumentCaptor))
            val loggedEvent = loggerArgumentCaptor.value
            val loggedEvent = loggerArgumentCaptor.value
@@ -268,19 +263,18 @@ class DisplaySwitchLatencyTrackerTest : SysuiTestCase() {
    @Test
    @Test
    fun foldWhileStayingAwake_logsLatency() {
    fun foldWhileStayingAwake_logsLatency() {
        testScope.runTest {
        testScope.runTest {
            areAnimationEnabled.emit(true)
            setDeviceState(UNFOLDED)
            deviceState.emit(DeviceState.UNFOLDED)
            powerInteractor.setScreenPowerState(SCREEN_ON)
            screenPowerState.emit(ScreenPowerState.SCREEN_ON)


            displaySwitchLatencyTracker.start()
            displaySwitchLatencyTracker.start()
            deviceState.emit(DeviceState.HALF_FOLDED)
            setDeviceState(HALF_FOLDED)
            systemClock.advanceTime(50)
            systemClock.advanceTime(50)
            runCurrent()
            runCurrent()
            deviceState.emit(DeviceState.FOLDED)
            setDeviceState(FOLDED)
            screenPowerState.emit(ScreenPowerState.SCREEN_OFF)
            powerInteractor.setScreenPowerState(SCREEN_OFF)
            runCurrent()
            runCurrent()
            systemClock.advanceTime(200)
            systemClock.advanceTime(200)
            screenPowerState.emit(ScreenPowerState.SCREEN_ON)
            powerInteractor.setScreenPowerState(SCREEN_ON)
            runCurrent()
            runCurrent()


            verify(displaySwitchLatencyLogger).log(capture(loggerArgumentCaptor))
            verify(displaySwitchLatencyLogger).log(capture(loggerArgumentCaptor))
@@ -298,25 +292,19 @@ class DisplaySwitchLatencyTrackerTest : SysuiTestCase() {
    @Test
    @Test
    fun foldToAod_capturesToStateAsAod() {
    fun foldToAod_capturesToStateAsAod() {
        testScope.runTest {
        testScope.runTest {
            areAnimationEnabled.emit(true)
            setDeviceState(UNFOLDED)
            deviceState.emit(DeviceState.UNFOLDED)
            isAodAvailable.emit(true)
            isAodAvailable.emit(true)


            displaySwitchLatencyTracker.start()
            displaySwitchLatencyTracker.start()
            deviceState.emit(DeviceState.HALF_FOLDED)
            setDeviceState(HALF_FOLDED)
            systemClock.advanceTime(50)
            systemClock.advanceTime(50)
            runCurrent()
            runCurrent()
            deviceState.emit(DeviceState.FOLDED)
            setDeviceState(FOLDED)
            lastWakefulnessEvent.emit(
            powerInteractor.setAsleepForTest(sleepReason = GO_TO_SLEEP_REASON_DEVICE_FOLD)
                WakefulnessModel(
            powerInteractor.setScreenPowerState(SCREEN_OFF)
                    internalWakefulnessState = WakefulnessState.ASLEEP,
                    lastSleepReason = WakeSleepReason.FOLD,
                )
            )
            screenPowerState.emit(ScreenPowerState.SCREEN_OFF)
            runCurrent()
            runCurrent()
            systemClock.advanceTime(200)
            systemClock.advanceTime(200)
            screenPowerState.emit(ScreenPowerState.SCREEN_ON)
            powerInteractor.setScreenPowerState(SCREEN_ON)
            runCurrent()
            runCurrent()


            verify(displaySwitchLatencyLogger).log(capture(loggerArgumentCaptor))
            verify(displaySwitchLatencyLogger).log(capture(loggerArgumentCaptor))
@@ -335,22 +323,21 @@ class DisplaySwitchLatencyTrackerTest : SysuiTestCase() {
    @Test
    @Test
    fun fold_notAFoldable_shouldNotLogLatency() {
    fun fold_notAFoldable_shouldNotLogLatency() {
        testScope.runTest {
        testScope.runTest {
            areAnimationEnabled.emit(true)
            setDeviceState(UNFOLDED)
            deviceState.emit(DeviceState.UNFOLDED)
            whenever(resources.getIntArray(R.array.config_foldedDeviceStates))
            whenever(resources.getIntArray(R.array.config_foldedDeviceStates))
                .thenReturn(IntArray(0))
                .thenReturn(IntArray(0))
            whenever(deviceStateManager.supportedDeviceStates)
            whenever(deviceStateManager.supportedDeviceStates)
                .thenReturn(listOf(defaultDeviceState))
                .thenReturn(listOf(defaultDeviceState))


            displaySwitchLatencyTracker.start()
            displaySwitchLatencyTracker.start()
            deviceState.emit(DeviceState.HALF_FOLDED)
            setDeviceState(HALF_FOLDED)
            systemClock.advanceTime(50)
            systemClock.advanceTime(50)
            runCurrent()
            runCurrent()
            deviceState.emit(DeviceState.FOLDED)
            setDeviceState(FOLDED)
            screenPowerState.emit(ScreenPowerState.SCREEN_OFF)
            powerInteractor.setScreenPowerState(SCREEN_OFF)
            runCurrent()
            runCurrent()
            systemClock.advanceTime(200)
            systemClock.advanceTime(200)
            screenPowerState.emit(ScreenPowerState.SCREEN_ON)
            powerInteractor.setScreenPowerState(SCREEN_ON)
            runCurrent()
            runCurrent()


            verify(displaySwitchLatencyLogger, never()).log(any())
            verify(displaySwitchLatencyLogger, never()).log(any())
@@ -360,22 +347,16 @@ class DisplaySwitchLatencyTrackerTest : SysuiTestCase() {
    @Test
    @Test
    fun foldToScreenOff_capturesToStateAsScreenOff() {
    fun foldToScreenOff_capturesToStateAsScreenOff() {
        testScope.runTest {
        testScope.runTest {
            areAnimationEnabled.emit(true)
            setDeviceState(UNFOLDED)
            deviceState.emit(DeviceState.UNFOLDED)
            isAodAvailable.emit(false)
            isAodAvailable.emit(false)


            displaySwitchLatencyTracker.start()
            displaySwitchLatencyTracker.start()
            deviceState.emit(DeviceState.HALF_FOLDED)
            setDeviceState(HALF_FOLDED)
            systemClock.advanceTime(50)
            systemClock.advanceTime(50)
            runCurrent()
            runCurrent()
            deviceState.emit(DeviceState.FOLDED)
            setDeviceState(FOLDED)
            lastWakefulnessEvent.emit(
            powerInteractor.setAsleepForTest(sleepReason = GO_TO_SLEEP_REASON_DEVICE_FOLD)
                WakefulnessModel(
            powerInteractor.setScreenPowerState(SCREEN_OFF)
                    internalWakefulnessState = WakefulnessState.ASLEEP,
                    lastSleepReason = WakeSleepReason.FOLD,
                )
            )
            screenPowerState.emit(ScreenPowerState.SCREEN_OFF)
            runCurrent()
            runCurrent()


            verify(displaySwitchLatencyLogger).log(capture(loggerArgumentCaptor))
            verify(displaySwitchLatencyLogger).log(capture(loggerArgumentCaptor))
@@ -390,4 +371,8 @@ class DisplaySwitchLatencyTrackerTest : SysuiTestCase() {
            assertThat(loggedEvent).isEqualTo(expectedLoggedEvent)
            assertThat(loggedEvent).isEqualTo(expectedLoggedEvent)
        }
        }
    }
    }

    private suspend fun setDeviceState(state: DeviceState) {
        foldStateRepository.emit(state)
    }
}
}