diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/datadonation/analytics/modules/clientmetadata/ClientMetadataDonor.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/datadonation/analytics/modules/clientmetadata/ClientMetadataDonor.kt index a20b1f8ed8c1e28d18361e34119bb0c63c77241e..691d3aa1365005cafe1942d1ca872e0c02339c8b 100644 --- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/datadonation/analytics/modules/clientmetadata/ClientMetadataDonor.kt +++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/datadonation/analytics/modules/clientmetadata/ClientMetadataDonor.kt @@ -5,14 +5,13 @@ import de.rki.coronawarnapp.datadonation.analytics.modules.DonorModule import de.rki.coronawarnapp.environment.BuildConfigWrap import de.rki.coronawarnapp.nearby.ENFClient import de.rki.coronawarnapp.server.protocols.internal.ppdd.PpaData -import de.rki.coronawarnapp.util.ApiLevel +import de.rki.coronawarnapp.util.BuildVersionWrap import kotlinx.coroutines.flow.first import javax.inject.Inject import javax.inject.Singleton @Singleton class ClientMetadataDonor @Inject constructor( - private val apiLevel: ApiLevel, private val appConfigProvider: AppConfigProvider, private val enfClient: ENFClient ) : DonorModule { @@ -24,7 +23,7 @@ class ClientMetadataDonor @Inject constructor( val clientMetadataBuilder = PpaData.PPAClientMetadataAndroid.newBuilder() .setCwaVersion(version.toPPASemanticVersion()) - .setAndroidApiLevel(apiLevel.currentLevel.toLong()) + .setAndroidApiLevel(BuildVersionWrap.SDK_INT.toLong()) .setAppConfigETag(config.identifier) enfClient.getENFClientVersion()?.let { diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/environment/EnvironmentSetup.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/environment/EnvironmentSetup.kt index 4c72ad4158a2f32c908c91a610a66bbf612978c9..d44e8e88ef378eaae6e78f7c4e73591be7c08e93 100644 --- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/environment/EnvironmentSetup.kt +++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/environment/EnvironmentSetup.kt @@ -78,6 +78,7 @@ class EnvironmentSetup @Inject constructor( } set(value) { if (CWADebug.buildFlavor == CWADebug.BuildFlavor.DEVICE_FOR_TESTERS) { + Timber.i("Changing currentEnvironment to $value") prefs.edit { putString(PKEY_CURRENT_ENVINROMENT, value.rawKey) } diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/presencetracing/common/PresenceTracingNotifications.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/presencetracing/common/PresenceTracingNotifications.kt index 7fd3c1f255bdec1cec5d065dfe584bae79f4521f..02168291fba66cac033257b02fd37433e3107210 100644 --- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/presencetracing/common/PresenceTracingNotifications.kt +++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/presencetracing/common/PresenceTracingNotifications.kt @@ -12,8 +12,9 @@ import androidx.navigation.NavDeepLinkBuilder import dagger.Reusable import de.rki.coronawarnapp.R import de.rki.coronawarnapp.ui.main.MainActivity -import de.rki.coronawarnapp.util.ApiLevel +import de.rki.coronawarnapp.util.BuildVersionWrap import de.rki.coronawarnapp.util.di.AppContext +import de.rki.coronawarnapp.util.hasAPILevel import de.rki.coronawarnapp.util.notifications.setContentTextExpandable import timber.log.Timber import javax.inject.Inject @@ -26,7 +27,6 @@ import javax.inject.Inject @Reusable class PresenceTracingNotifications @Inject constructor( @AppContext private val context: Context, - private val apiLevel: ApiLevel, private val notificationManagerCompat: NotificationManagerCompat, ) { @@ -77,7 +77,7 @@ class PresenceTracingNotifications @Inject constructor( } fun sendNotification(notificationId: Int, notification: Notification) { - if (apiLevel.hasAPILevel(Build.VERSION_CODES.O) && !isNotificationChannelSetup) { + if (BuildVersionWrap.hasAPILevel(Build.VERSION_CODES.O) && !isNotificationChannelSetup) { isNotificationChannelSetup = true setupChannel() } diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/storage/DeviceStorage.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/storage/DeviceStorage.kt index fb09e91080cd101c2a948bba48d92a4f18c2a963..1110aa183101c3727098a6d0dee183590e556165 100644 --- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/storage/DeviceStorage.kt +++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/storage/DeviceStorage.kt @@ -7,8 +7,9 @@ import android.os.Build import android.os.storage.StorageManager import android.text.format.Formatter import dagger.Reusable -import de.rki.coronawarnapp.util.ApiLevel +import de.rki.coronawarnapp.util.BuildVersionWrap import de.rki.coronawarnapp.util.di.AppContext +import de.rki.coronawarnapp.util.hasAPILevel import de.rki.coronawarnapp.util.storage.StatsFsProvider import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.withContext @@ -21,7 +22,6 @@ import javax.inject.Inject @Reusable class DeviceStorage @Inject constructor( @AppContext private val context: Context, - private val apiLevel: ApiLevel, private val statsFsProvider: StatsFsProvider ) { @@ -91,7 +91,7 @@ class DeviceStorage @Inject constructor( ): CheckResult = withContext(Dispatchers.IO) { try { Timber.tag(TAG).v("checkSpace(path=%s, requiredBytes=%d)", path, requiredBytes) - val result: CheckResult = if (apiLevel.hasAPILevel(Build.VERSION_CODES.O)) { + val result: CheckResult = if (BuildVersionWrap.hasAPILevel(Build.VERSION_CODES.O)) { try { requestStorageAPI26Plus(path, requiredBytes) } catch (e: Exception) { diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/util/ApiLevel.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/util/ApiLevel.kt deleted file mode 100644 index 0d7a8afd327eabd799769ebb9a7d97734c37e388..0000000000000000000000000000000000000000 --- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/util/ApiLevel.kt +++ /dev/null @@ -1,14 +0,0 @@ -package de.rki.coronawarnapp.util - -import android.os.Build -import javax.inject.Inject -import javax.inject.Singleton - -@Singleton -class ApiLevel constructor(val currentLevel: Int = Build.VERSION.SDK_INT) { - - @Inject - constructor() : this(Build.VERSION.SDK_INT) - - fun hasAPILevel(level: Int): Boolean = currentLevel >= level -} diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/util/BuildVersionWrap.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/util/BuildVersionWrap.kt new file mode 100644 index 0000000000000000000000000000000000000000..c3b8ebca2f23f4fea7cf7bfc6b1fdde2425c3812 --- /dev/null +++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/util/BuildVersionWrap.kt @@ -0,0 +1,11 @@ +package de.rki.coronawarnapp.util + +import android.os.Build + +// Can't be const because that prevents them from being mocked in tests +@Suppress("MayBeConstant") +object BuildVersionWrap { + val SDK_INT = Build.VERSION.SDK_INT +} + +fun BuildVersionWrap.hasAPILevel(level: Int): Boolean = SDK_INT >= level diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/util/device/BackgroundModeStatus.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/util/device/BackgroundModeStatus.kt index c62ac5c9000d95cc91568c395271f6c45ca01c10..7476720ad7d2a703a4d12473c80418a3a3116fa2 100644 --- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/util/device/BackgroundModeStatus.kt +++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/util/device/BackgroundModeStatus.kt @@ -3,9 +3,10 @@ package de.rki.coronawarnapp.util.device import android.annotation.TargetApi import android.app.ActivityManager import android.os.Build -import de.rki.coronawarnapp.util.ApiLevel +import de.rki.coronawarnapp.util.BuildVersionWrap import de.rki.coronawarnapp.util.coroutine.AppScope import de.rki.coronawarnapp.util.flow.shareLatest +import de.rki.coronawarnapp.util.hasAPILevel import kotlinx.coroutines.CancellationException import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.delay @@ -24,7 +25,6 @@ class BackgroundModeStatus @Inject constructor( foregroundState: ForegroundState, private val powerManagement: PowerManagement, private val activityManager: ActivityManager, - private val apiLevel: ApiLevel, @AppScope private val appScope: CoroutineScope ) { @@ -53,7 +53,7 @@ class BackgroundModeStatus @Inject constructor( * Else always return false */ @TargetApi(Build.VERSION_CODES.P) - private fun pollIsBackgroundRestricted(): Boolean = if (apiLevel.hasAPILevel(Build.VERSION_CODES.P)) { + private fun pollIsBackgroundRestricted(): Boolean = if (BuildVersionWrap.hasAPILevel(Build.VERSION_CODES.P)) { activityManager.isBackgroundRestricted } else false diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/util/network/NetworkStateProvider.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/util/network/NetworkStateProvider.kt index 347550766db74f6bae81fe41801c911accedeb57..7f06ba7a369d8cbc9150673110c5004f552c504b 100644 --- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/util/network/NetworkStateProvider.kt +++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/util/network/NetworkStateProvider.kt @@ -7,10 +7,13 @@ import android.net.Network import android.net.NetworkCapabilities import android.net.NetworkCapabilities.NET_CAPABILITY_INTERNET import android.net.NetworkCapabilities.NET_CAPABILITY_NOT_METERED +import android.os.Build import de.rki.coronawarnapp.storage.TestSettings +import de.rki.coronawarnapp.util.BuildVersionWrap import de.rki.coronawarnapp.util.coroutine.AppScope import de.rki.coronawarnapp.util.di.AppContext import de.rki.coronawarnapp.util.flow.shareLatest +import de.rki.coronawarnapp.util.hasAPILevel import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.channels.awaitClose import kotlinx.coroutines.flow.Flow @@ -117,7 +120,14 @@ class NetworkStateProvider @Inject constructor( private val isFakeMeteredConnection: Boolean = false ) { val isMeteredConnection: Boolean - get() = isFakeMeteredConnection || !(capabilities?.hasCapability(NET_CAPABILITY_NOT_METERED) ?: false) + get() { + val unMetered = if (BuildVersionWrap.hasAPILevel(Build.VERSION_CODES.N)) { + capabilities?.hasCapability(NET_CAPABILITY_NOT_METERED) ?: false + } else { + capabilities?.hasTransport(NetworkCapabilities.TRANSPORT_WIFI) ?: false + } + return isFakeMeteredConnection || !unMetered + } } companion object { diff --git a/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/datadonation/analytics/modules/clientmetadata/ClientMetadataDonorTest.kt b/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/datadonation/analytics/modules/clientmetadata/ClientMetadataDonorTest.kt index d138fd418f6b82c28667e3cde3b2ba9a09871817..22cfd54bed095a93c03bb004ebe335115f2b6848 100644 --- a/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/datadonation/analytics/modules/clientmetadata/ClientMetadataDonorTest.kt +++ b/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/datadonation/analytics/modules/clientmetadata/ClientMetadataDonorTest.kt @@ -6,7 +6,7 @@ import de.rki.coronawarnapp.datadonation.analytics.modules.DonorModule import de.rki.coronawarnapp.environment.BuildConfigWrap import de.rki.coronawarnapp.nearby.ENFClient import de.rki.coronawarnapp.server.protocols.internal.ppdd.PpaData -import de.rki.coronawarnapp.util.ApiLevel +import de.rki.coronawarnapp.util.BuildVersionWrap import io.kotest.matchers.shouldBe import io.mockk.MockKAnnotations import io.mockk.coEvery @@ -21,7 +21,6 @@ import testhelpers.BaseTest import testhelpers.coroutines.runBlockingTest2 class ClientMetadataDonorTest : BaseTest() { - @MockK lateinit var apiLevel: ApiLevel @MockK lateinit var appConfigProvider: AppConfigProvider @MockK lateinit var configData: ConfigData @MockK lateinit var enfClient: ENFClient @@ -43,14 +42,14 @@ class ClientMetadataDonorTest : BaseTest() { every { BuildConfigWrap.VERSION_MINOR } returns versionMinor every { BuildConfigWrap.VERSION_PATCH } returns versionPatch - every { apiLevel.currentLevel } returns androidVersionCode.toInt() + mockkObject(BuildVersionWrap) + every { BuildVersionWrap.SDK_INT } returns androidVersionCode.toInt() every { configData.identifier } returns eTag coEvery { appConfigProvider.currentConfig } returns flowOf(configData) coEvery { enfClient.getENFClientVersion() } returns enfVersion } private fun createInstance() = ClientMetadataDonor( - apiLevel = apiLevel, appConfigProvider = appConfigProvider, enfClient = enfClient ) diff --git a/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/presencetracing/common/TraceLocationNotificationsTest.kt b/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/presencetracing/common/TraceLocationNotificationsTest.kt index f87f49945884faad710d647b00742aa3b4dfcd6c..d74619fb9cfc86297f076d9edd8d19e59556c038 100644 --- a/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/presencetracing/common/TraceLocationNotificationsTest.kt +++ b/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/presencetracing/common/TraceLocationNotificationsTest.kt @@ -2,13 +2,14 @@ package de.rki.coronawarnapp.presencetracing.common import android.content.Context import androidx.core.app.NotificationManagerCompat -import de.rki.coronawarnapp.util.ApiLevel +import de.rki.coronawarnapp.util.BuildVersionWrap import io.mockk.MockKAnnotations import io.mockk.Runs import io.mockk.every import io.mockk.impl.annotations.MockK import io.mockk.just import io.mockk.mockk +import io.mockk.mockkObject import io.mockk.verify import org.junit.jupiter.api.BeforeEach import org.junit.jupiter.api.Test @@ -17,7 +18,6 @@ import testhelpers.BaseTest class TraceLocationNotificationsTest : BaseTest() { @MockK lateinit var context: Context - @MockK lateinit var apiLevel: ApiLevel @MockK lateinit var notificationManager: NotificationManagerCompat @BeforeEach @@ -29,7 +29,8 @@ class TraceLocationNotificationsTest : BaseTest() { every { getString(any()) } returns "" } - every { apiLevel.hasAPILevel(any()) } returns true + mockkObject(BuildVersionWrap) + every { BuildVersionWrap.SDK_INT } returns 42 notificationManager.apply { every { createNotificationChannel(any()) } just Runs @@ -39,7 +40,6 @@ class TraceLocationNotificationsTest : BaseTest() { fun createInstance() = PresenceTracingNotifications( context = context, - apiLevel = apiLevel, notificationManagerCompat = notificationManager ) @@ -55,14 +55,12 @@ class TraceLocationNotificationsTest : BaseTest() { } @Test - fun `sending does not setup a notification channel on API levels`() { - every { apiLevel.hasAPILevel(any()) } returns true + fun `sending does not setup a notification channel on sub API26`() { + every { BuildVersionWrap.SDK_INT } returns 21 val instance = createInstance() instance.sendNotification(1, mockk()) - verify { - notificationManager.createNotificationChannel(any()) - notificationManager.notify(1, any()) - } + verify(exactly = 0) { notificationManager.createNotificationChannel(any()) } + verify { notificationManager.notify(1, any()) } } } diff --git a/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/storage/DeviceStorageTest.kt b/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/storage/DeviceStorageTest.kt index b1735e823828caa3b082f5b8337ae232f55faa17..8f8a02058820fbebd2a859484fd8b42e0231200d 100644 --- a/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/storage/DeviceStorageTest.kt +++ b/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/storage/DeviceStorageTest.kt @@ -5,7 +5,7 @@ import android.content.Context import android.os.Build import android.os.StatFs import android.os.storage.StorageManager -import de.rki.coronawarnapp.util.ApiLevel +import de.rki.coronawarnapp.util.BuildVersionWrap import de.rki.coronawarnapp.util.storage.StatsFsProvider import io.kotest.assertions.throwables.shouldThrow import io.kotest.matchers.shouldBe @@ -13,6 +13,7 @@ import io.mockk.MockKAnnotations import io.mockk.every import io.mockk.impl.annotations.MockK import io.mockk.mockk +import io.mockk.mockkObject import io.mockk.verify import kotlinx.coroutines.runBlocking import org.junit.jupiter.api.AfterEach @@ -28,8 +29,8 @@ class DeviceStorageTest : BaseIOTest() { @MockK lateinit var context: Context - private val defaultApiLevel = ApiLevel(Build.VERSION_CODES.O) - private val legacyApiLevel = ApiLevel(Build.VERSION_CODES.M) + private val defaultApiLevel = Build.VERSION_CODES.O + private val legacyApiLevel = Build.VERSION_CODES.M @MockK lateinit var storageManager: StorageManager @@ -51,6 +52,9 @@ class DeviceStorageTest : BaseIOTest() { fun setup() { MockKAnnotations.init(this) + mockkObject(BuildVersionWrap) + every { BuildVersionWrap.SDK_INT } returns defaultApiLevel + every { context.filesDir } returns privateDataDir every { context.getSystemService(Context.STORAGE_SERVICE) } returns storageManager every { context.getSystemService(Context.STORAGE_STATS_SERVICE) } returns storageStatsManager @@ -73,9 +77,8 @@ class DeviceStorageTest : BaseIOTest() { privateDataDir.deleteRecursively() } - private fun buildInstance(level: ApiLevel = defaultApiLevel): DeviceStorage = DeviceStorage( + private fun buildInstance(): DeviceStorage = DeviceStorage( context = context, - apiLevel = level, statsFsProvider = statsFsProvider ) @@ -98,7 +101,8 @@ class DeviceStorageTest : BaseIOTest() { @Test fun `check private storage space, sub API26`() { - val deviceStorage = buildInstance(level = legacyApiLevel) + every { BuildVersionWrap.SDK_INT } returns legacyApiLevel + val deviceStorage = buildInstance() runBlocking { deviceStorage.checkSpacePrivateStorage() shouldBe DeviceStorage.CheckResult( path = privateDataDir, @@ -128,7 +132,8 @@ class DeviceStorageTest : BaseIOTest() { @Test fun `request space from private storage successfully, sub API26`() { - val deviceStorage = buildInstance(level = legacyApiLevel) + every { BuildVersionWrap.SDK_INT } returns legacyApiLevel + val deviceStorage = buildInstance() runBlocking { deviceStorage.checkSpacePrivateStorage(requiredBytes = defaultFreeSpace) shouldBe DeviceStorage.CheckResult( path = privateDataDir, @@ -176,7 +181,9 @@ class DeviceStorageTest : BaseIOTest() { @Test fun `request space from private storage unsuccessfully, sub API26`() { - val deviceStorage = buildInstance(level = legacyApiLevel) + every { BuildVersionWrap.SDK_INT } returns legacyApiLevel + + val deviceStorage = buildInstance() runBlocking { deviceStorage.checkSpacePrivateStorage(requiredBytes = Long.MAX_VALUE) shouldBe DeviceStorage.CheckResult( path = privateDataDir, @@ -207,9 +214,10 @@ class DeviceStorageTest : BaseIOTest() { @Test fun `check private storage space, sub API26, error case has no fallback`() { + every { BuildVersionWrap.SDK_INT } returns legacyApiLevel every { statsFsProvider.createStats(privateDataDir) } throws IOException("uh oh") - val deviceStorage = buildInstance(level = legacyApiLevel) + val deviceStorage = buildInstance() runBlocking { shouldThrow<IOException> { deviceStorage.checkSpacePrivateStorage() } } diff --git a/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/util/BackgroundModeStatusTest.kt b/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/util/BackgroundModeStatusTest.kt index a0d64f4a7483c71ac648fafef76ef664e7fd2eb6..359c7cda55b7b1a767429bce6cd0efed9b04d7ff 100644 --- a/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/util/BackgroundModeStatusTest.kt +++ b/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/util/BackgroundModeStatusTest.kt @@ -27,7 +27,6 @@ class BackgroundModeStatusTest : BaseTest() { @MockK lateinit var activityManager: ActivityManager @MockK lateinit var foregroundState: ForegroundState @MockK lateinit var powerManagement: PowerManagement - @MockK lateinit var apiLevel: ApiLevel @BeforeEach fun setup() { @@ -35,7 +34,8 @@ class BackgroundModeStatusTest : BaseTest() { mockkObject(BuildConfigWrap) - every { apiLevel.hasAPILevel(any()) } returns true + mockkObject(BuildVersionWrap) + every { BuildVersionWrap.SDK_INT } returns 42 every { foregroundState.isInForeground } returns flowOf(true) } @@ -44,8 +44,7 @@ class BackgroundModeStatusTest : BaseTest() { activityManager = activityManager, appScope = scope, foregroundState = foregroundState, - powerManagement = powerManagement, - apiLevel = apiLevel + powerManagement = powerManagement ) @Test @@ -153,7 +152,7 @@ class BackgroundModeStatusTest : BaseTest() { createInstance(scope = this).isBackgroundRestricted.first() shouldBe true - every { apiLevel.hasAPILevel(any()) } returns false + every { BuildVersionWrap.SDK_INT } returns 16 createInstance(scope = this).isBackgroundRestricted.first() shouldBe false } diff --git a/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/util/network/NetworkStateProviderTest.kt b/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/util/network/NetworkStateProviderTest.kt index 1da581b212d1f112f481e722d4fb442a0caa30bb..6c48eeb1e36f26ec1d433f14793a454ad5382cae 100644 --- a/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/util/network/NetworkStateProviderTest.kt +++ b/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/util/network/NetworkStateProviderTest.kt @@ -7,6 +7,7 @@ import android.net.Network import android.net.NetworkCapabilities import android.net.NetworkRequest import de.rki.coronawarnapp.storage.TestSettings +import de.rki.coronawarnapp.util.BuildVersionWrap import io.kotest.assertions.throwables.shouldNotThrowAny import io.kotest.matchers.shouldBe import io.mockk.Called @@ -16,6 +17,7 @@ import io.mockk.every import io.mockk.impl.annotations.MockK import io.mockk.just import io.mockk.mockk +import io.mockk.mockkObject import io.mockk.verify import io.mockk.verifySequence import kotlinx.coroutines.CoroutineScope @@ -48,6 +50,9 @@ class NetworkStateProviderTest : BaseTest() { fun setup() { MockKAnnotations.init(this) + mockkObject(BuildVersionWrap) + every { BuildVersionWrap.SDK_INT } returns 24 + every { conMan.registerNetworkCallback( any<NetworkRequest>(), @@ -205,4 +210,31 @@ class NetworkStateProviderTest : BaseTest() { linkProperties = null ).isMeteredConnection shouldBe true } + + @Test + fun `Android 6 not metered on wifi`() = runBlockingTest2(ignoreActive = true) { + every { BuildVersionWrap.SDK_INT } returns 23 + + every { capabilities.hasTransport(NetworkCapabilities.TRANSPORT_WIFI) } returns true + + NetworkStateProvider.State( + activeNetwork = null, + capabilities = capabilities, + linkProperties = null + ).isMeteredConnection shouldBe false + + every { capabilities.hasTransport(NetworkCapabilities.TRANSPORT_WIFI) } returns false + + NetworkStateProvider.State( + activeNetwork = null, + capabilities = capabilities, + linkProperties = null + ).isMeteredConnection shouldBe true + + NetworkStateProvider.State( + activeNetwork = null, + capabilities = null, + linkProperties = null + ).isMeteredConnection shouldBe true + } }