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

Commit 2de83d4d authored by Caitlin Shkuratov's avatar Caitlin Shkuratov
Browse files

[SB] Update CarrierMergedConnectionRepositoryTest to best practices.

Use `collectLastValue`, `Kosmos`, org.mockito.kotlin.

Bug: 423686800
Flag: TEST_ONLY
Test: atest CarrierMergedConnectionRepositoryTest
CarrierMergedConnectionRepositoryKairosTest

Change-Id: I5d6494bea22f8fdfec58b172213f0f0831277916
parent 3a4b075a
Loading
Loading
Loading
Loading
+7 −7
Original line number Diff line number Diff line
@@ -22,16 +22,17 @@ import com.android.systemui.activated
import com.android.systemui.kairos.ExperimentalKairosApi
import com.android.systemui.kairos.launchKairosNetwork
import com.android.systemui.kairos.stateOf
import com.android.systemui.kosmos.testScope
import com.android.systemui.statusbar.pipeline.mobile.data.model.SystemUiCarrierConfig
import com.android.systemui.statusbar.pipeline.mobile.data.model.testCarrierConfig
import kotlinx.coroutines.ExperimentalCoroutinesApi
import com.android.systemui.statusbar.pipeline.wifi.data.repository.fake
import com.android.systemui.statusbar.pipeline.wifi.data.repository.wifiRepository
import kotlinx.coroutines.Job
import kotlinx.coroutines.launch
import kotlinx.coroutines.test.runCurrent
import org.junit.runner.RunWith
import org.mockito.Mockito

@OptIn(ExperimentalKairosApi::class, ExperimentalCoroutinesApi::class)
@OptIn(ExperimentalKairosApi::class)
@SmallTest
@RunWith(AndroidJUnit4::class)
@android.platform.test.annotations.EnabledOnRavenwood
@@ -39,21 +40,21 @@ class CarrierMergedConnectionRepositoryKairosAdapterTest :
    CarrierMergedConnectionRepositoryTestBase() {

    var job: Job? = null
    val kairosNetwork = testScope.backgroundScope.launchKairosNetwork()
    val kairosNetwork = kosmos.testScope.backgroundScope.launchKairosNetwork()

    override fun recreateRepo(): MobileConnectionRepositoryKairosAdapter {
        lateinit var adapter: MobileConnectionRepositoryKairosAdapter
        job?.cancel()
        Mockito.clearInvocations(telephonyManager)
        job =
            testScope.backgroundScope.launch {
            kosmos.testScope.backgroundScope.launch {
                kairosNetwork.activateSpec {
                    val repo = activated {
                        CarrierMergedConnectionRepositoryKairos(
                            SUB_ID,
                            logger,
                            telephonyManager,
                            wifiRepository,
                            kosmos.wifiRepository.fake,
                            isInEcmMode = stateOf(false),
                        )
                    }
@@ -65,7 +66,6 @@ class CarrierMergedConnectionRepositoryKairosAdapterTest :
                    Unit
                }
            }
        testScope.runCurrent() // ensure the lateinit is set
        return adapter
    }
}
+67 −117
Original line number Diff line number Diff line
@@ -21,26 +21,27 @@ import androidx.test.ext.junit.runners.AndroidJUnit4
import androidx.test.filters.SmallTest
import com.android.systemui.SysuiTestCase
import com.android.systemui.coroutines.collectLastValue
import com.android.systemui.log.table.TableLogBuffer
import com.android.systemui.kosmos.backgroundCoroutineContext
import com.android.systemui.kosmos.collectLastValue
import com.android.systemui.kosmos.runTest
import com.android.systemui.kosmos.testScope
import com.android.systemui.kosmos.useUnconfinedTestDispatcher
import com.android.systemui.log.table.logcatTableLogBuffer
import com.android.systemui.statusbar.pipeline.mobile.data.model.DataConnectionState
import com.android.systemui.statusbar.pipeline.mobile.data.model.NetworkNameModel
import com.android.systemui.statusbar.pipeline.mobile.data.model.ResolvedNetworkType
import com.android.systemui.statusbar.pipeline.mobile.data.repository.MobileConnectionRepository
import com.android.systemui.statusbar.pipeline.shared.data.model.DataActivityModel
import com.android.systemui.statusbar.pipeline.wifi.data.repository.FakeWifiRepository
import com.android.systemui.statusbar.pipeline.wifi.data.repository.fake
import com.android.systemui.statusbar.pipeline.wifi.data.repository.wifiRepository
import com.android.systemui.statusbar.pipeline.wifi.shared.model.WifiNetworkModel
import com.android.systemui.util.mockito.whenever
import com.android.systemui.testKosmos
import com.google.common.truth.Truth.assertThat
import kotlinx.coroutines.flow.launchIn
import kotlinx.coroutines.flow.onEach
import kotlinx.coroutines.test.TestScope
import kotlinx.coroutines.test.UnconfinedTestDispatcher
import kotlinx.coroutines.test.runTest
import org.junit.Before
import org.junit.Test
import org.junit.runner.RunWith
import org.mockito.Mock
import org.mockito.MockitoAnnotations
import org.mockito.kotlin.mock
import org.mockito.kotlin.whenever

@SmallTest
@RunWith(AndroidJUnit4::class)
@@ -51,180 +52,143 @@ class CarrierMergedConnectionRepositoryTest : CarrierMergedConnectionRepositoryT
            SUB_ID,
            logger,
            telephonyManager,
            testScope.backgroundScope.coroutineContext,
            testScope.backgroundScope,
            wifiRepository,
            bgContext = kosmos.backgroundCoroutineContext,
            scope = kosmos.testScope.backgroundScope,
            kosmos.wifiRepository.fake,
        )
}

abstract class CarrierMergedConnectionRepositoryTestBase : SysuiTestCase() {

    protected lateinit var underTest: MobileConnectionRepository
    protected val kosmos = testKosmos().useUnconfinedTestDispatcher()

    protected lateinit var wifiRepository: FakeWifiRepository
    @Mock protected lateinit var logger: TableLogBuffer
    @Mock protected lateinit var telephonyManager: TelephonyManager
    protected lateinit var underTest: MobileConnectionRepository

    protected val testDispatcher = UnconfinedTestDispatcher()
    protected val testScope = TestScope(testDispatcher)
    protected val logger = logcatTableLogBuffer(kosmos, "CarrierMergedConnectionRepositoryTest")
    protected val telephonyManager = mock<TelephonyManager>()

    abstract fun recreateRepo(): MobileConnectionRepository

    @Before
    fun setUp() {
        MockitoAnnotations.initMocks(this)
        whenever(telephonyManager.subscriptionId).thenReturn(SUB_ID)
        whenever(telephonyManager.simOperatorName).thenReturn("")

        wifiRepository = FakeWifiRepository()

        underTest = recreateRepo()
    }

    @Test
    fun inactiveWifi_isDefault() =
        testScope.runTest {
            var latestConnState: DataConnectionState? = null
            var latestNetType: ResolvedNetworkType? = null
        kosmos.runTest {
            val latestConnState by collectLastValue(underTest.dataConnectionState)
            val latestNetType by collectLastValue(underTest.resolvedNetworkType)

            val dataJob =
                underTest.dataConnectionState.onEach { latestConnState = it }.launchIn(this)
            val netJob = underTest.resolvedNetworkType.onEach { latestNetType = it }.launchIn(this)

            wifiRepository.setWifiNetwork(WifiNetworkModel.Inactive())
            wifiRepository.fake.setWifiNetwork(WifiNetworkModel.Inactive())

            assertThat(latestConnState).isEqualTo(DataConnectionState.Disconnected)
            assertThat(latestNetType).isNotEqualTo(ResolvedNetworkType.CarrierMergedNetworkType)

            dataJob.cancel()
            netJob.cancel()
        }

    @Test
    fun activeWifi_isDefault() =
        testScope.runTest {
            var latestConnState: DataConnectionState? = null
            var latestNetType: ResolvedNetworkType? = null
        kosmos.runTest {
            val latestConnState by collectLastValue(underTest.dataConnectionState)
            val latestNetType by collectLastValue(underTest.resolvedNetworkType)

            val dataJob =
                underTest.dataConnectionState.onEach { latestConnState = it }.launchIn(this)
            val netJob = underTest.resolvedNetworkType.onEach { latestNetType = it }.launchIn(this)

            wifiRepository.setWifiNetwork(WifiNetworkModel.Active.of(level = 1))
            wifiRepository.fake.setWifiNetwork(WifiNetworkModel.Active.of(level = 1))

            assertThat(latestConnState).isEqualTo(DataConnectionState.Disconnected)
            assertThat(latestNetType).isNotEqualTo(ResolvedNetworkType.CarrierMergedNetworkType)

            dataJob.cancel()
            netJob.cancel()
        }

    @Test
    fun carrierMergedWifi_isValidAndFieldsComeFromWifiNetwork() =
        testScope.runTest {
            var latest: Int? = null
            val job = underTest.primaryLevel.onEach { latest = it }.launchIn(this)
        kosmos.runTest {
            val latest by collectLastValue(underTest.primaryLevel)

            wifiRepository.setIsWifiEnabled(true)
            wifiRepository.setIsWifiDefault(true)
            wifiRepository.fake.setIsWifiEnabled(true)
            wifiRepository.fake.setIsWifiDefault(true)

            wifiRepository.setWifiNetwork(
            wifiRepository.fake.setWifiNetwork(
                WifiNetworkModel.CarrierMerged.of(subscriptionId = SUB_ID, level = 3)
            )

            assertThat(latest).isEqualTo(3)

            job.cancel()
        }

    @Test
    fun activity_comesFromWifiActivity() =
        testScope.runTest {
            var latest: DataActivityModel? = null
            val job = underTest.dataActivityDirection.onEach { latest = it }.launchIn(this)
        kosmos.runTest {
            val latest by collectLastValue(underTest.dataActivityDirection)

            wifiRepository.setIsWifiEnabled(true)
            wifiRepository.setIsWifiDefault(true)
            wifiRepository.setWifiNetwork(
            wifiRepository.fake.setIsWifiEnabled(true)
            wifiRepository.fake.setIsWifiDefault(true)
            wifiRepository.fake.setWifiNetwork(
                WifiNetworkModel.CarrierMerged.of(subscriptionId = SUB_ID, level = 3)
            )
            wifiRepository.setWifiActivity(
            wifiRepository.fake.setWifiActivity(
                DataActivityModel(hasActivityIn = true, hasActivityOut = false)
            )

            assertThat(latest!!.hasActivityIn).isTrue()
            assertThat(latest!!.hasActivityOut).isFalse()

            wifiRepository.setWifiActivity(
            wifiRepository.fake.setWifiActivity(
                DataActivityModel(hasActivityIn = false, hasActivityOut = true)
            )

            assertThat(latest!!.hasActivityIn).isFalse()
            assertThat(latest!!.hasActivityOut).isTrue()

            job.cancel()
        }

    @Test
    fun carrierMergedWifi_wrongSubId_isDefault() =
        testScope.runTest {
            var latestLevel: Int? = null
            var latestType: ResolvedNetworkType? = null
            val levelJob = underTest.primaryLevel.onEach { latestLevel = it }.launchIn(this)
            val typeJob = underTest.resolvedNetworkType.onEach { latestType = it }.launchIn(this)
        kosmos.runTest {
            val latestLevel by collectLastValue(underTest.primaryLevel)
            val latestType by collectLastValue(underTest.resolvedNetworkType)

            wifiRepository.setWifiNetwork(
            wifiRepository.fake.setWifiNetwork(
                WifiNetworkModel.CarrierMerged.of(subscriptionId = SUB_ID + 10, level = 3)
            )

            assertThat(latestLevel).isNotEqualTo(3)
            assertThat(latestType).isNotEqualTo(ResolvedNetworkType.CarrierMergedNetworkType)

            levelJob.cancel()
            typeJob.cancel()
        }

    // This scenario likely isn't possible, but write a test for it anyway
    @Test
    fun carrierMergedButNotEnabled_isDefault() =
        testScope.runTest {
            var latest: Int? = null
            val job = underTest.primaryLevel.onEach { latest = it }.launchIn(this)
        kosmos.runTest {
            val latest by collectLastValue(underTest.primaryLevel)

            wifiRepository.setWifiNetwork(
            wifiRepository.fake.setWifiNetwork(
                WifiNetworkModel.CarrierMerged.of(subscriptionId = SUB_ID, level = 3)
            )
            wifiRepository.setIsWifiEnabled(false)
            wifiRepository.fake.setIsWifiEnabled(false)

            assertThat(latest).isNotEqualTo(3)

            job.cancel()
        }

    // This scenario likely isn't possible, but write a test for it anyway
    @Test
    fun carrierMergedButWifiNotDefault_isDefault() =
        testScope.runTest {
            var latest: Int? = null
            val job = underTest.primaryLevel.onEach { latest = it }.launchIn(this)
        kosmos.runTest {
            val latest by collectLastValue(underTest.primaryLevel)

            wifiRepository.setWifiNetwork(
            wifiRepository.fake.setWifiNetwork(
                WifiNetworkModel.CarrierMerged.of(subscriptionId = SUB_ID, level = 3)
            )
            wifiRepository.setIsWifiDefault(false)
            wifiRepository.fake.setIsWifiDefault(false)

            assertThat(latest).isNotEqualTo(3)

            job.cancel()
        }

    @Test
    fun numberOfLevels_comesFromCarrierMerged() =
        testScope.runTest {
            var latest: Int? = null
            val job = underTest.numberOfLevels.onEach { latest = it }.launchIn(this)
        kosmos.runTest {
            val latest by collectLastValue(underTest.numberOfLevels)

            wifiRepository.setWifiNetwork(
            wifiRepository.fake.setWifiNetwork(
                WifiNetworkModel.CarrierMerged.of(
                    subscriptionId = SUB_ID,
                    level = 1,
@@ -233,77 +197,63 @@ abstract class CarrierMergedConnectionRepositoryTestBase : SysuiTestCase() {
            )

            assertThat(latest).isEqualTo(6)

            job.cancel()
        }

    @Test
    fun dataEnabled_matchesWifiEnabled() =
        testScope.runTest {
            var latest: Boolean? = null
            val job = underTest.dataEnabled.onEach { latest = it }.launchIn(this)
        kosmos.runTest {
            val latest by collectLastValue(underTest.dataEnabled)

            wifiRepository.setIsWifiEnabled(true)
            wifiRepository.fake.setIsWifiEnabled(true)
            assertThat(latest).isTrue()

            wifiRepository.setIsWifiEnabled(false)
            wifiRepository.fake.setIsWifiEnabled(false)
            assertThat(latest).isFalse()

            job.cancel()
        }

    @Test
    fun cdmaRoaming_alwaysFalse() =
        testScope.runTest {
            var latest: Boolean? = null
            val job = underTest.cdmaRoaming.onEach { latest = it }.launchIn(this)
        kosmos.runTest {
            val latest by collectLastValue(underTest.cdmaRoaming)

            assertThat(latest).isFalse()

            job.cancel()
        }

    @Test
    fun networkName_usesSimOperatorNameAsInitial() =
        testScope.runTest {
        kosmos.runTest {
            whenever(telephonyManager.simOperatorName).thenReturn("Test SIM name")
            underTest = recreateRepo()

            var latest: NetworkNameModel? = null
            val job = underTest.networkName.onEach { latest = it }.launchIn(this)
            val latest by collectLastValue(underTest.networkName)

            assertThat(latest).isEqualTo(NetworkNameModel.SimDerived("Test SIM name"))

            job.cancel()
        }

    @Test
    fun networkName_updatesOnNetworkUpdate() =
        testScope.runTest {
        kosmos.runTest {
            whenever(telephonyManager.simOperatorName).thenReturn("Test SIM name")
            underTest = recreateRepo()

            wifiRepository.setIsWifiEnabled(true)
            wifiRepository.setIsWifiDefault(true)
            wifiRepository.fake.setIsWifiEnabled(true)
            wifiRepository.fake.setIsWifiDefault(true)

            var latest: NetworkNameModel? = null
            val job = underTest.networkName.onEach { latest = it }.launchIn(this)
            val latest by collectLastValue(underTest.networkName)

            assertThat(latest).isEqualTo(NetworkNameModel.SimDerived("Test SIM name"))

            whenever(telephonyManager.simOperatorName).thenReturn("New SIM name")
            wifiRepository.setWifiNetwork(
            wifiRepository.fake.setWifiNetwork(
                WifiNetworkModel.CarrierMerged.of(subscriptionId = SUB_ID, level = 3)
            )

            assertThat(latest).isEqualTo(NetworkNameModel.SimDerived("New SIM name"))

            job.cancel()
        }

    @Test
    fun isAllowedDuringAirplaneMode_alwaysTrue() =
        testScope.runTest {
        kosmos.runTest {
            val latest by collectLastValue(underTest.isAllowedDuringAirplaneMode)

            assertThat(latest).isTrue()
+3 −0
Original line number Diff line number Diff line
@@ -20,3 +20,6 @@ import com.android.systemui.kosmos.Kosmos

val Kosmos.fakeWifiRepository: FakeWifiRepository by Kosmos.Fixture { FakeWifiRepository() }
var Kosmos.wifiRepository: WifiRepository by Kosmos.Fixture { fakeWifiRepository }

val WifiRepository.fake
    get() = this as FakeWifiRepository