From dda8237ce5fe4236c68f04f3e59393a515a34529 Mon Sep 17 00:00:00 2001 From: Patrick Honkonen <1883101+SaintPatrck@users.noreply.github.com> Date: Fri, 4 Apr 2025 14:33:54 -0400 Subject: [PATCH] [PM-19870] Migrate ServerConfig and ConfigDiskSource to the `data` module (#4992) --- app/build.gradle.kts | 1 + .../auth/repository/AuthRepositoryImpl.kt | 2 +- .../repository/di/AuthRepositoryModule.kt | 2 +- .../datasource/disk/di/PlatformDiskModule.kt | 4 +- .../manager/FeatureFlagManagerImpl.kt | 2 +- .../repository/ServerConfigRepository.kt | 2 +- .../repository/ServerConfigRepositoryImpl.kt | 4 +- .../repository/di/PlatformRepositoryModule.kt | 2 +- .../data/platform/util/ServerVersionUtils.kt | 4 +- .../datasource/disk/AuthDiskSourceTest.kt | 2 +- .../legacy/LegacySecureStorageMigratorTest.kt | 2 +- .../auth/repository/AuthRepositoryTest.kt | 4 +- .../disk/EnvironmentDiskSourceTest.kt | 2 +- .../disk/FeatureFlagOverrideDiskSourceTest.kt | 2 +- .../datasource/disk/PushDiskSourceTest.kt | 2 +- .../datasource/disk/SettingsDiskSourceTest.kt | 2 +- .../legacy/LegacyAppCenterMigratorTest.kt | 2 +- .../manager/FeatureFlagManagerTest.kt | 2 +- .../data/platform/manager/PushManagerTest.kt | 2 +- .../repository/DebugMenuRepositoryTest.kt | 2 +- .../repository/ServerConfigRepositoryTest.kt | 4 +- .../util/FakeServerConfigRepository.kt | 2 +- .../disk/GeneratorDiskSourceTest.kt | 2 +- authenticator/build.gradle.kts | 1 + .../datasource/disk/ConfigDiskSource.kt | 21 ---- .../datasource/disk/ConfigDiskSourceImpl.kt | 37 ------ .../datasource/disk/di/PlatformDiskModule.kt | 4 +- .../datasource/disk/model/ServerConfig.kt | 22 ---- .../manager/FeatureFlagManagerImpl.kt | 2 +- .../repository/ServerConfigRepository.kt | 2 +- .../repository/ServerConfigRepositoryImpl.kt | 4 +- .../repository/di/PlatformRepositoryModule.kt | 2 +- .../datasource/disk/AuthDiskSourceTest.kt | 2 +- .../platform/base/FakeSharedPreferences.kt | 109 ---------------- .../datasource/disk/ConfigDiskSourceTest.kt | 116 ------------------ .../disk/FeatureFlagDiskSourceTest.kt | 2 +- .../disk/FeatureFlagOverrideDiskSourceTest.kt | 2 +- .../datasource/disk/SettingDiskSourceTest.kt | 2 +- .../disk/util/FakeConfigDiskSource.kt | 25 ---- .../manager/FeatureFlagManagerTest.kt | 2 +- .../repository/DebugMenuRepositoryTest.kt | 2 +- .../repository/ServerConfigRepositoryTest.kt | 4 +- .../util/FakeServerConfigRepository.kt | 2 +- data/build.gradle.kts | 28 +++++ .../data}/datasource/disk/ConfigDiskSource.kt | 4 +- .../datasource/disk/ConfigDiskSourceImpl.kt | 5 +- .../datasource/disk/model/ServerConfig.kt | 2 +- .../datasource/disk/ConfigDiskSourceTest.kt | 6 +- .../disk}/base/FakeSharedPreferences.kt | 2 +- .../disk/util/FakeConfigDiskSource.kt | 9 +- detekt-config.yml | 2 +- 51 files changed, 88 insertions(+), 388 deletions(-) delete mode 100644 authenticator/src/main/kotlin/com/bitwarden/authenticator/data/platform/datasource/disk/ConfigDiskSource.kt delete mode 100644 authenticator/src/main/kotlin/com/bitwarden/authenticator/data/platform/datasource/disk/ConfigDiskSourceImpl.kt delete mode 100644 authenticator/src/main/kotlin/com/bitwarden/authenticator/data/platform/datasource/disk/model/ServerConfig.kt delete mode 100644 authenticator/src/test/java/com/bitwarden/authenticator/data/platform/base/FakeSharedPreferences.kt delete mode 100644 authenticator/src/test/java/com/bitwarden/authenticator/data/platform/datasource/disk/ConfigDiskSourceTest.kt delete mode 100644 authenticator/src/test/java/com/bitwarden/authenticator/data/platform/datasource/disk/util/FakeConfigDiskSource.kt rename {app/src/main/java/com/x8bit/bitwarden/data/platform => data/src/main/kotlin/com/bitwarden/data}/datasource/disk/ConfigDiskSource.kt (76%) rename {app/src/main/java/com/x8bit/bitwarden/data/platform => data/src/main/kotlin/com/bitwarden/data}/datasource/disk/ConfigDiskSourceImpl.kt (86%) rename {app/src/main/java/com/x8bit/bitwarden/data/platform => data/src/main/kotlin/com/bitwarden/data}/datasource/disk/model/ServerConfig.kt (92%) rename {app/src/test/java/com/x8bit/bitwarden/data/platform => data/src/test/kotlin/com/bitwarden/data}/datasource/disk/ConfigDiskSourceTest.kt (94%) rename {app/src/test/java/com/x8bit/bitwarden/data/platform => data/src/testFixtures/kotlin/com/bitwarden/data/datasource/disk}/base/FakeSharedPreferences.kt (98%) rename {app/src/test/java/com/x8bit/bitwarden/data/platform => data/src/testFixtures/kotlin/com/bitwarden/data}/datasource/disk/util/FakeConfigDiskSource.kt (75%) diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 6218776435..bc2ddd4e57 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -272,6 +272,7 @@ dependencies { standardImplementation(libs.google.play.review) // Pull in test fixtures from other modules + testImplementation(testFixtures(project(":data"))) testImplementation(testFixtures(project(":network"))) testImplementation(libs.androidx.compose.ui.test) diff --git a/app/src/main/java/com/x8bit/bitwarden/data/auth/repository/AuthRepositoryImpl.kt b/app/src/main/java/com/x8bit/bitwarden/data/auth/repository/AuthRepositoryImpl.kt index a7b365178e..583d230c9c 100644 --- a/app/src/main/java/com/x8bit/bitwarden/data/auth/repository/AuthRepositoryImpl.kt +++ b/app/src/main/java/com/x8bit/bitwarden/data/auth/repository/AuthRepositoryImpl.kt @@ -8,6 +8,7 @@ import com.bitwarden.core.data.util.asSuccess import com.bitwarden.core.data.util.flatMap import com.bitwarden.crypto.HashPurpose import com.bitwarden.crypto.Kdf +import com.bitwarden.data.datasource.disk.ConfigDiskSource import com.bitwarden.network.model.RegisterRequestJson import com.bitwarden.network.model.ResendEmailRequestJson import com.bitwarden.network.model.ResendNewDeviceOtpRequestJson @@ -103,7 +104,6 @@ import com.x8bit.bitwarden.data.auth.repository.util.userSwitchingChangesFlow import com.x8bit.bitwarden.data.auth.util.KdfParamsConstants.DEFAULT_PBKDF2_ITERATIONS import com.x8bit.bitwarden.data.auth.util.YubiKeyResult import com.x8bit.bitwarden.data.auth.util.toSdkParams -import com.x8bit.bitwarden.data.platform.datasource.disk.ConfigDiskSource import com.x8bit.bitwarden.data.platform.error.MissingPropertyException import com.x8bit.bitwarden.data.platform.error.NoActiveUserException import com.x8bit.bitwarden.data.platform.manager.FeatureFlagManager diff --git a/app/src/main/java/com/x8bit/bitwarden/data/auth/repository/di/AuthRepositoryModule.kt b/app/src/main/java/com/x8bit/bitwarden/data/auth/repository/di/AuthRepositoryModule.kt index 99bbe4566b..7b211625e6 100644 --- a/app/src/main/java/com/x8bit/bitwarden/data/auth/repository/di/AuthRepositoryModule.kt +++ b/app/src/main/java/com/x8bit/bitwarden/data/auth/repository/di/AuthRepositoryModule.kt @@ -1,5 +1,6 @@ package com.x8bit.bitwarden.data.auth.repository.di +import com.bitwarden.data.datasource.disk.ConfigDiskSource import com.x8bit.bitwarden.data.auth.datasource.disk.AuthDiskSource import com.x8bit.bitwarden.data.auth.datasource.network.service.AccountsService import com.x8bit.bitwarden.data.auth.datasource.network.service.DevicesService @@ -13,7 +14,6 @@ import com.x8bit.bitwarden.data.auth.manager.TrustedDeviceManager import com.x8bit.bitwarden.data.auth.manager.UserLogoutManager import com.x8bit.bitwarden.data.auth.repository.AuthRepository import com.x8bit.bitwarden.data.auth.repository.AuthRepositoryImpl -import com.x8bit.bitwarden.data.platform.datasource.disk.ConfigDiskSource import com.x8bit.bitwarden.data.platform.manager.FeatureFlagManager import com.x8bit.bitwarden.data.platform.manager.FirstTimeActionManager import com.x8bit.bitwarden.data.platform.manager.LogsManager diff --git a/app/src/main/java/com/x8bit/bitwarden/data/platform/datasource/disk/di/PlatformDiskModule.kt b/app/src/main/java/com/x8bit/bitwarden/data/platform/datasource/disk/di/PlatformDiskModule.kt index 2798ba17aa..78e7b6df48 100644 --- a/app/src/main/java/com/x8bit/bitwarden/data/platform/datasource/disk/di/PlatformDiskModule.kt +++ b/app/src/main/java/com/x8bit/bitwarden/data/platform/datasource/disk/di/PlatformDiskModule.kt @@ -5,9 +5,9 @@ import android.content.Context import android.content.SharedPreferences import androidx.room.Room import com.bitwarden.data.datasource.di.EncryptedPreferences +import com.bitwarden.data.datasource.disk.ConfigDiskSource +import com.bitwarden.data.datasource.disk.ConfigDiskSourceImpl import com.x8bit.bitwarden.data.platform.datasource.di.UnencryptedPreferences -import com.x8bit.bitwarden.data.platform.datasource.disk.ConfigDiskSource -import com.x8bit.bitwarden.data.platform.datasource.disk.ConfigDiskSourceImpl import com.x8bit.bitwarden.data.platform.datasource.disk.EnvironmentDiskSource import com.x8bit.bitwarden.data.platform.datasource.disk.EnvironmentDiskSourceImpl import com.x8bit.bitwarden.data.platform.datasource.disk.EventDiskSource diff --git a/app/src/main/java/com/x8bit/bitwarden/data/platform/manager/FeatureFlagManagerImpl.kt b/app/src/main/java/com/x8bit/bitwarden/data/platform/manager/FeatureFlagManagerImpl.kt index 59d2896746..f1f07ac7e8 100644 --- a/app/src/main/java/com/x8bit/bitwarden/data/platform/manager/FeatureFlagManagerImpl.kt +++ b/app/src/main/java/com/x8bit/bitwarden/data/platform/manager/FeatureFlagManagerImpl.kt @@ -1,6 +1,6 @@ package com.x8bit.bitwarden.data.platform.manager -import com.x8bit.bitwarden.data.platform.datasource.disk.model.ServerConfig +import com.bitwarden.data.datasource.disk.model.ServerConfig import com.x8bit.bitwarden.data.platform.manager.model.FlagKey import com.x8bit.bitwarden.data.platform.repository.ServerConfigRepository import com.x8bit.bitwarden.data.platform.util.isServerVersionAtLeast diff --git a/app/src/main/java/com/x8bit/bitwarden/data/platform/repository/ServerConfigRepository.kt b/app/src/main/java/com/x8bit/bitwarden/data/platform/repository/ServerConfigRepository.kt index 03aaae8259..597af369dd 100644 --- a/app/src/main/java/com/x8bit/bitwarden/data/platform/repository/ServerConfigRepository.kt +++ b/app/src/main/java/com/x8bit/bitwarden/data/platform/repository/ServerConfigRepository.kt @@ -1,6 +1,6 @@ package com.x8bit.bitwarden.data.platform.repository -import com.x8bit.bitwarden.data.platform.datasource.disk.model.ServerConfig +import com.bitwarden.data.datasource.disk.model.ServerConfig import kotlinx.coroutines.flow.StateFlow /** diff --git a/app/src/main/java/com/x8bit/bitwarden/data/platform/repository/ServerConfigRepositoryImpl.kt b/app/src/main/java/com/x8bit/bitwarden/data/platform/repository/ServerConfigRepositoryImpl.kt index c76743b9f6..d87619af08 100644 --- a/app/src/main/java/com/x8bit/bitwarden/data/platform/repository/ServerConfigRepositoryImpl.kt +++ b/app/src/main/java/com/x8bit/bitwarden/data/platform/repository/ServerConfigRepositoryImpl.kt @@ -1,8 +1,8 @@ package com.x8bit.bitwarden.data.platform.repository +import com.bitwarden.data.datasource.disk.ConfigDiskSource +import com.bitwarden.data.datasource.disk.model.ServerConfig import com.bitwarden.network.service.ConfigService -import com.x8bit.bitwarden.data.platform.datasource.disk.ConfigDiskSource -import com.x8bit.bitwarden.data.platform.datasource.disk.model.ServerConfig import com.x8bit.bitwarden.data.platform.manager.dispatcher.DispatcherManager import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.flow.SharingStarted diff --git a/app/src/main/java/com/x8bit/bitwarden/data/platform/repository/di/PlatformRepositoryModule.kt b/app/src/main/java/com/x8bit/bitwarden/data/platform/repository/di/PlatformRepositoryModule.kt index 05ef49f893..a5317f27b0 100644 --- a/app/src/main/java/com/x8bit/bitwarden/data/platform/repository/di/PlatformRepositoryModule.kt +++ b/app/src/main/java/com/x8bit/bitwarden/data/platform/repository/di/PlatformRepositoryModule.kt @@ -1,12 +1,12 @@ package com.x8bit.bitwarden.data.platform.repository.di import android.view.autofill.AutofillManager +import com.bitwarden.data.datasource.disk.ConfigDiskSource import com.bitwarden.network.service.ConfigService import com.x8bit.bitwarden.data.auth.datasource.disk.AuthDiskSource import com.x8bit.bitwarden.data.auth.repository.AuthRepository import com.x8bit.bitwarden.data.autofill.accessibility.manager.AccessibilityEnabledManager import com.x8bit.bitwarden.data.autofill.manager.AutofillEnabledManager -import com.x8bit.bitwarden.data.platform.datasource.disk.ConfigDiskSource import com.x8bit.bitwarden.data.platform.datasource.disk.EnvironmentDiskSource import com.x8bit.bitwarden.data.platform.datasource.disk.FeatureFlagOverrideDiskSource import com.x8bit.bitwarden.data.platform.datasource.disk.SettingsDiskSource diff --git a/app/src/main/java/com/x8bit/bitwarden/data/platform/util/ServerVersionUtils.kt b/app/src/main/java/com/x8bit/bitwarden/data/platform/util/ServerVersionUtils.kt index 6d5ed31e2f..8ebfafcb95 100644 --- a/app/src/main/java/com/x8bit/bitwarden/data/platform/util/ServerVersionUtils.kt +++ b/app/src/main/java/com/x8bit/bitwarden/data/platform/util/ServerVersionUtils.kt @@ -1,8 +1,6 @@ package com.x8bit.bitwarden.data.platform.util -import com.x8bit.bitwarden.data.platform.datasource.disk.model.ServerConfig -import kotlin.text.split -import kotlin.text.toIntOrNull +import com.bitwarden.data.datasource.disk.model.ServerConfig private const val VERSION_SEPARATOR = "." private const val SUFFIX_SEPARATOR = "-" diff --git a/app/src/test/java/com/x8bit/bitwarden/data/auth/datasource/disk/AuthDiskSourceTest.kt b/app/src/test/java/com/x8bit/bitwarden/data/auth/datasource/disk/AuthDiskSourceTest.kt index 799fedd2bd..7445deee47 100644 --- a/app/src/test/java/com/x8bit/bitwarden/data/auth/datasource/disk/AuthDiskSourceTest.kt +++ b/app/src/test/java/com/x8bit/bitwarden/data/auth/datasource/disk/AuthDiskSourceTest.kt @@ -4,6 +4,7 @@ import androidx.core.content.edit import app.cash.turbine.test import com.bitwarden.authenticatorbridge.util.generateSecretKey import com.bitwarden.core.di.CoreModule +import com.bitwarden.data.datasource.disk.base.FakeSharedPreferences import com.bitwarden.network.model.KdfTypeJson import com.x8bit.bitwarden.data.auth.datasource.disk.model.AccountJson import com.x8bit.bitwarden.data.auth.datasource.disk.model.AccountTokensJson @@ -17,7 +18,6 @@ import com.x8bit.bitwarden.data.auth.datasource.disk.model.UserStateJson import com.x8bit.bitwarden.data.auth.datasource.network.model.KeyConnectorUserDecryptionOptionsJson import com.x8bit.bitwarden.data.auth.datasource.network.model.TrustedDeviceUserDecryptionOptionsJson import com.x8bit.bitwarden.data.auth.datasource.network.model.UserDecryptionOptionsJson -import com.x8bit.bitwarden.data.platform.base.FakeSharedPreferences import com.x8bit.bitwarden.data.platform.datasource.disk.legacy.LegacySecureStorageMigrator import com.x8bit.bitwarden.data.vault.datasource.network.model.createMockOrganization import com.x8bit.bitwarden.data.vault.datasource.network.model.createMockPolicy diff --git a/app/src/test/java/com/x8bit/bitwarden/data/auth/datasource/disk/legacy/LegacySecureStorageMigratorTest.kt b/app/src/test/java/com/x8bit/bitwarden/data/auth/datasource/disk/legacy/LegacySecureStorageMigratorTest.kt index 9fc2110cb5..8eb1ef1592 100644 --- a/app/src/test/java/com/x8bit/bitwarden/data/auth/datasource/disk/legacy/LegacySecureStorageMigratorTest.kt +++ b/app/src/test/java/com/x8bit/bitwarden/data/auth/datasource/disk/legacy/LegacySecureStorageMigratorTest.kt @@ -1,6 +1,6 @@ package com.x8bit.bitwarden.data.auth.datasource.disk.legacy -import com.x8bit.bitwarden.data.platform.base.FakeSharedPreferences +import com.bitwarden.data.datasource.disk.base.FakeSharedPreferences import com.x8bit.bitwarden.data.platform.datasource.disk.legacy.LegacySecureStorage import com.x8bit.bitwarden.data.platform.datasource.disk.legacy.LegacySecureStorageMigratorImpl import org.junit.jupiter.api.Assertions.assertEquals diff --git a/app/src/test/java/com/x8bit/bitwarden/data/auth/repository/AuthRepositoryTest.kt b/app/src/test/java/com/x8bit/bitwarden/data/auth/repository/AuthRepositoryTest.kt index 1504ff94d1..765cb45941 100644 --- a/app/src/test/java/com/x8bit/bitwarden/data/auth/repository/AuthRepositoryTest.kt +++ b/app/src/test/java/com/x8bit/bitwarden/data/auth/repository/AuthRepositoryTest.kt @@ -15,6 +15,8 @@ import com.bitwarden.crypto.HashPurpose import com.bitwarden.crypto.Kdf import com.bitwarden.crypto.RsaKeyPair import com.bitwarden.crypto.TrustDeviceResponse +import com.bitwarden.data.datasource.disk.model.ServerConfig +import com.bitwarden.data.datasource.disk.util.FakeConfigDiskSource import com.bitwarden.network.model.ConfigResponseJson import com.bitwarden.network.model.KdfTypeJson import com.bitwarden.network.model.OrganizationAutoEnrollStatusResponseJson @@ -107,8 +109,6 @@ import com.x8bit.bitwarden.data.auth.repository.util.toUserState import com.x8bit.bitwarden.data.auth.util.YubiKeyResult import com.x8bit.bitwarden.data.auth.util.toSdkParams import com.x8bit.bitwarden.data.platform.base.FakeDispatcherManager -import com.x8bit.bitwarden.data.platform.datasource.disk.model.ServerConfig -import com.x8bit.bitwarden.data.platform.datasource.disk.util.FakeConfigDiskSource import com.x8bit.bitwarden.data.platform.error.MissingPropertyException import com.x8bit.bitwarden.data.platform.error.NoActiveUserException import com.x8bit.bitwarden.data.platform.manager.FeatureFlagManager diff --git a/app/src/test/java/com/x8bit/bitwarden/data/platform/datasource/disk/EnvironmentDiskSourceTest.kt b/app/src/test/java/com/x8bit/bitwarden/data/platform/datasource/disk/EnvironmentDiskSourceTest.kt index 4c91d94620..a970ea173c 100644 --- a/app/src/test/java/com/x8bit/bitwarden/data/platform/datasource/disk/EnvironmentDiskSourceTest.kt +++ b/app/src/test/java/com/x8bit/bitwarden/data/platform/datasource/disk/EnvironmentDiskSourceTest.kt @@ -2,8 +2,8 @@ package com.x8bit.bitwarden.data.platform.datasource.disk import androidx.core.content.edit import app.cash.turbine.test +import com.bitwarden.data.datasource.disk.base.FakeSharedPreferences import com.x8bit.bitwarden.data.auth.datasource.disk.model.EnvironmentUrlDataJson -import com.x8bit.bitwarden.data.platform.base.FakeSharedPreferences import com.x8bit.bitwarden.data.platform.repository.model.Environment import kotlinx.coroutines.test.runTest import kotlinx.serialization.json.Json diff --git a/app/src/test/java/com/x8bit/bitwarden/data/platform/datasource/disk/FeatureFlagOverrideDiskSourceTest.kt b/app/src/test/java/com/x8bit/bitwarden/data/platform/datasource/disk/FeatureFlagOverrideDiskSourceTest.kt index 94ae24b634..36e84bf4a5 100644 --- a/app/src/test/java/com/x8bit/bitwarden/data/platform/datasource/disk/FeatureFlagOverrideDiskSourceTest.kt +++ b/app/src/test/java/com/x8bit/bitwarden/data/platform/datasource/disk/FeatureFlagOverrideDiskSourceTest.kt @@ -1,7 +1,7 @@ package com.x8bit.bitwarden.data.platform.datasource.disk import androidx.core.content.edit -import com.x8bit.bitwarden.data.platform.base.FakeSharedPreferences +import com.bitwarden.data.datasource.disk.base.FakeSharedPreferences import com.x8bit.bitwarden.data.platform.manager.model.FlagKey import org.junit.jupiter.api.Assertions.assertEquals import org.junit.jupiter.api.Assertions.assertFalse diff --git a/app/src/test/java/com/x8bit/bitwarden/data/platform/datasource/disk/PushDiskSourceTest.kt b/app/src/test/java/com/x8bit/bitwarden/data/platform/datasource/disk/PushDiskSourceTest.kt index 6aceee9693..7762a48dfc 100644 --- a/app/src/test/java/com/x8bit/bitwarden/data/platform/datasource/disk/PushDiskSourceTest.kt +++ b/app/src/test/java/com/x8bit/bitwarden/data/platform/datasource/disk/PushDiskSourceTest.kt @@ -1,7 +1,7 @@ package com.x8bit.bitwarden.data.platform.datasource.disk import androidx.core.content.edit -import com.x8bit.bitwarden.data.platform.base.FakeSharedPreferences +import com.bitwarden.data.datasource.disk.base.FakeSharedPreferences import com.x8bit.bitwarden.data.platform.util.getBinaryLongFromZoneDateTime import com.x8bit.bitwarden.data.platform.util.getZoneDateTimeFromBinaryLong import org.junit.jupiter.api.Assertions.assertEquals diff --git a/app/src/test/java/com/x8bit/bitwarden/data/platform/datasource/disk/SettingsDiskSourceTest.kt b/app/src/test/java/com/x8bit/bitwarden/data/platform/datasource/disk/SettingsDiskSourceTest.kt index 9278cfc4e8..9dca3cf519 100644 --- a/app/src/test/java/com/x8bit/bitwarden/data/platform/datasource/disk/SettingsDiskSourceTest.kt +++ b/app/src/test/java/com/x8bit/bitwarden/data/platform/datasource/disk/SettingsDiskSourceTest.kt @@ -4,7 +4,7 @@ import androidx.core.content.edit import app.cash.turbine.test import com.bitwarden.core.data.util.decodeFromStringOrNull import com.bitwarden.core.di.CoreModule -import com.x8bit.bitwarden.data.platform.base.FakeSharedPreferences +import com.bitwarden.data.datasource.disk.base.FakeSharedPreferences import com.x8bit.bitwarden.data.platform.manager.model.AppResumeScreenData import com.x8bit.bitwarden.data.platform.repository.model.ClearClipboardFrequency import com.x8bit.bitwarden.data.platform.repository.model.UriMatchType diff --git a/app/src/test/java/com/x8bit/bitwarden/data/platform/datasource/disk/legacy/LegacyAppCenterMigratorTest.kt b/app/src/test/java/com/x8bit/bitwarden/data/platform/datasource/disk/legacy/LegacyAppCenterMigratorTest.kt index 5592cc66e5..b364f68f54 100644 --- a/app/src/test/java/com/x8bit/bitwarden/data/platform/datasource/disk/legacy/LegacyAppCenterMigratorTest.kt +++ b/app/src/test/java/com/x8bit/bitwarden/data/platform/datasource/disk/legacy/LegacyAppCenterMigratorTest.kt @@ -1,7 +1,7 @@ package com.x8bit.bitwarden.data.platform.datasource.disk.legacy import androidx.core.content.edit -import com.x8bit.bitwarden.data.platform.base.FakeSharedPreferences +import com.bitwarden.data.datasource.disk.base.FakeSharedPreferences import com.x8bit.bitwarden.data.platform.repository.SettingsRepository import io.mockk.every import io.mockk.just diff --git a/app/src/test/java/com/x8bit/bitwarden/data/platform/manager/FeatureFlagManagerTest.kt b/app/src/test/java/com/x8bit/bitwarden/data/platform/manager/FeatureFlagManagerTest.kt index e690e65208..b3ddbd638f 100644 --- a/app/src/test/java/com/x8bit/bitwarden/data/platform/manager/FeatureFlagManagerTest.kt +++ b/app/src/test/java/com/x8bit/bitwarden/data/platform/manager/FeatureFlagManagerTest.kt @@ -1,10 +1,10 @@ package com.x8bit.bitwarden.data.platform.manager import app.cash.turbine.test +import com.bitwarden.data.datasource.disk.model.ServerConfig import com.bitwarden.network.model.ConfigResponseJson import com.bitwarden.network.model.ConfigResponseJson.EnvironmentJson import com.bitwarden.network.model.ConfigResponseJson.ServerJson -import com.x8bit.bitwarden.data.platform.datasource.disk.model.ServerConfig import com.x8bit.bitwarden.data.platform.manager.model.FlagKey import com.x8bit.bitwarden.data.platform.repository.util.FakeServerConfigRepository import com.x8bit.bitwarden.data.platform.util.isServerVersionAtLeast diff --git a/app/src/test/java/com/x8bit/bitwarden/data/platform/manager/PushManagerTest.kt b/app/src/test/java/com/x8bit/bitwarden/data/platform/manager/PushManagerTest.kt index 619de73ad7..78047d7ed6 100644 --- a/app/src/test/java/com/x8bit/bitwarden/data/platform/manager/PushManagerTest.kt +++ b/app/src/test/java/com/x8bit/bitwarden/data/platform/manager/PushManagerTest.kt @@ -4,6 +4,7 @@ import app.cash.turbine.test import com.bitwarden.core.data.util.asFailure import com.bitwarden.core.data.util.asSuccess import com.bitwarden.core.di.CoreModule +import com.bitwarden.data.datasource.disk.base.FakeSharedPreferences import com.bitwarden.network.model.PushTokenRequest import com.x8bit.bitwarden.data.auth.datasource.disk.AuthDiskSource import com.x8bit.bitwarden.data.auth.datasource.disk.model.AccountJson @@ -11,7 +12,6 @@ import com.x8bit.bitwarden.data.auth.datasource.disk.model.AccountTokensJson import com.x8bit.bitwarden.data.auth.datasource.disk.model.UserStateJson import com.x8bit.bitwarden.data.auth.datasource.disk.util.FakeAuthDiskSource import com.x8bit.bitwarden.data.platform.base.FakeDispatcherManager -import com.x8bit.bitwarden.data.platform.base.FakeSharedPreferences import com.x8bit.bitwarden.data.platform.datasource.disk.PushDiskSource import com.x8bit.bitwarden.data.platform.datasource.disk.PushDiskSourceImpl import com.x8bit.bitwarden.data.platform.datasource.network.service.PushService diff --git a/app/src/test/java/com/x8bit/bitwarden/data/platform/repository/DebugMenuRepositoryTest.kt b/app/src/test/java/com/x8bit/bitwarden/data/platform/repository/DebugMenuRepositoryTest.kt index 3d4f5e1658..4962a87287 100644 --- a/app/src/test/java/com/x8bit/bitwarden/data/platform/repository/DebugMenuRepositoryTest.kt +++ b/app/src/test/java/com/x8bit/bitwarden/data/platform/repository/DebugMenuRepositoryTest.kt @@ -1,13 +1,13 @@ package com.x8bit.bitwarden.data.platform.repository import app.cash.turbine.test +import com.bitwarden.data.datasource.disk.model.ServerConfig import com.bitwarden.network.model.ConfigResponseJson import com.x8bit.bitwarden.data.auth.datasource.disk.AuthDiskSource import com.x8bit.bitwarden.data.auth.datasource.disk.model.OnboardingStatus import com.x8bit.bitwarden.data.auth.datasource.disk.model.UserStateJson import com.x8bit.bitwarden.data.platform.datasource.disk.FeatureFlagOverrideDiskSource import com.x8bit.bitwarden.data.platform.datasource.disk.SettingsDiskSource -import com.x8bit.bitwarden.data.platform.datasource.disk.model.ServerConfig import com.x8bit.bitwarden.data.platform.manager.model.FlagKey import io.mockk.every import io.mockk.just diff --git a/app/src/test/java/com/x8bit/bitwarden/data/platform/repository/ServerConfigRepositoryTest.kt b/app/src/test/java/com/x8bit/bitwarden/data/platform/repository/ServerConfigRepositoryTest.kt index c47534f0e8..432e83069a 100644 --- a/app/src/test/java/com/x8bit/bitwarden/data/platform/repository/ServerConfigRepositoryTest.kt +++ b/app/src/test/java/com/x8bit/bitwarden/data/platform/repository/ServerConfigRepositoryTest.kt @@ -2,13 +2,13 @@ package com.x8bit.bitwarden.data.platform.repository import app.cash.turbine.test import com.bitwarden.core.data.util.asSuccess +import com.bitwarden.data.datasource.disk.model.ServerConfig +import com.bitwarden.data.datasource.disk.util.FakeConfigDiskSource import com.bitwarden.network.model.ConfigResponseJson import com.bitwarden.network.model.ConfigResponseJson.EnvironmentJson import com.bitwarden.network.model.ConfigResponseJson.ServerJson import com.bitwarden.network.service.ConfigService import com.x8bit.bitwarden.data.platform.base.FakeDispatcherManager -import com.x8bit.bitwarden.data.platform.datasource.disk.model.ServerConfig -import com.x8bit.bitwarden.data.platform.datasource.disk.util.FakeConfigDiskSource import com.x8bit.bitwarden.data.platform.manager.dispatcher.DispatcherManager import io.mockk.coEvery import io.mockk.mockk diff --git a/app/src/test/java/com/x8bit/bitwarden/data/platform/repository/util/FakeServerConfigRepository.kt b/app/src/test/java/com/x8bit/bitwarden/data/platform/repository/util/FakeServerConfigRepository.kt index 2ec7e172a1..b587069455 100644 --- a/app/src/test/java/com/x8bit/bitwarden/data/platform/repository/util/FakeServerConfigRepository.kt +++ b/app/src/test/java/com/x8bit/bitwarden/data/platform/repository/util/FakeServerConfigRepository.kt @@ -1,9 +1,9 @@ package com.x8bit.bitwarden.data.platform.repository.util +import com.bitwarden.data.datasource.disk.model.ServerConfig import com.bitwarden.network.model.ConfigResponseJson import com.bitwarden.network.model.ConfigResponseJson.EnvironmentJson import com.bitwarden.network.model.ConfigResponseJson.ServerJson -import com.x8bit.bitwarden.data.platform.datasource.disk.model.ServerConfig import com.x8bit.bitwarden.data.platform.repository.ServerConfigRepository import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.StateFlow diff --git a/app/src/test/java/com/x8bit/bitwarden/data/tools/generator/datasource/disk/GeneratorDiskSourceTest.kt b/app/src/test/java/com/x8bit/bitwarden/data/tools/generator/datasource/disk/GeneratorDiskSourceTest.kt index 899b9b6412..37373752cd 100644 --- a/app/src/test/java/com/x8bit/bitwarden/data/tools/generator/datasource/disk/GeneratorDiskSourceTest.kt +++ b/app/src/test/java/com/x8bit/bitwarden/data/tools/generator/datasource/disk/GeneratorDiskSourceTest.kt @@ -1,7 +1,7 @@ package com.x8bit.bitwarden.data.tools.generator.datasource.disk import androidx.core.content.edit -import com.x8bit.bitwarden.data.platform.base.FakeSharedPreferences +import com.bitwarden.data.datasource.disk.base.FakeSharedPreferences import com.x8bit.bitwarden.data.tools.generator.repository.model.PasscodeGenerationOptions import com.x8bit.bitwarden.data.tools.generator.repository.model.UsernameGenerationOptions import kotlinx.serialization.json.Json diff --git a/authenticator/build.gradle.kts b/authenticator/build.gradle.kts index b1d4471286..a9fc988556 100644 --- a/authenticator/build.gradle.kts +++ b/authenticator/build.gradle.kts @@ -207,6 +207,7 @@ dependencies { debugImplementation(libs.androidx.compose.ui.tooling) // Pull in test fixtures from other modules. + testImplementation(testFixtures(project(":data"))) testImplementation(testFixtures(project(":network"))) testImplementation(libs.androidx.compose.ui.test) diff --git a/authenticator/src/main/kotlin/com/bitwarden/authenticator/data/platform/datasource/disk/ConfigDiskSource.kt b/authenticator/src/main/kotlin/com/bitwarden/authenticator/data/platform/datasource/disk/ConfigDiskSource.kt deleted file mode 100644 index 04a03173f5..0000000000 --- a/authenticator/src/main/kotlin/com/bitwarden/authenticator/data/platform/datasource/disk/ConfigDiskSource.kt +++ /dev/null @@ -1,21 +0,0 @@ -package com.bitwarden.authenticator.data.platform.datasource.disk - -import com.bitwarden.authenticator.data.platform.datasource.disk.model.ServerConfig -import kotlinx.coroutines.flow.Flow - -/** - * Primary access point for server configuration-related disk information. - */ -interface ConfigDiskSource { - - /** - * The currently persisted [ServerConfig] (or `null` if not set). - */ - var serverConfig: ServerConfig? - - /** - * Emits updates that track [ServerConfig]. This will replay the last known value, - * if any. - */ - val serverConfigFlow: Flow -} diff --git a/authenticator/src/main/kotlin/com/bitwarden/authenticator/data/platform/datasource/disk/ConfigDiskSourceImpl.kt b/authenticator/src/main/kotlin/com/bitwarden/authenticator/data/platform/datasource/disk/ConfigDiskSourceImpl.kt deleted file mode 100644 index e73c348fee..0000000000 --- a/authenticator/src/main/kotlin/com/bitwarden/authenticator/data/platform/datasource/disk/ConfigDiskSourceImpl.kt +++ /dev/null @@ -1,37 +0,0 @@ -package com.bitwarden.authenticator.data.platform.datasource.disk - -import android.content.SharedPreferences -import com.bitwarden.authenticator.data.platform.datasource.disk.model.ServerConfig -import com.bitwarden.core.data.repository.util.bufferedMutableSharedFlow -import com.bitwarden.core.data.util.decodeFromStringOrNull -import com.bitwarden.data.datasource.disk.BaseDiskSource -import kotlinx.coroutines.flow.Flow -import kotlinx.coroutines.flow.onSubscription -import kotlinx.serialization.json.Json - -private const val SERVER_CONFIGURATIONS = "serverConfigurations" - -/** - * Primary implementation of [ConfigDiskSource]. - */ -class ConfigDiskSourceImpl( - sharedPreferences: SharedPreferences, - private val json: Json, -) : BaseDiskSource(sharedPreferences = sharedPreferences), - ConfigDiskSource { - - override var serverConfig: ServerConfig? - get() = getString(key = SERVER_CONFIGURATIONS)?.let { json.decodeFromStringOrNull(it) } - set(value) { - putString( - key = SERVER_CONFIGURATIONS, - value = value?.let { json.encodeToString(it) }, - ) - mutableServerConfigFlow.tryEmit(value) - } - - override val serverConfigFlow: Flow - get() = mutableServerConfigFlow.onSubscription { emit(serverConfig) } - - private val mutableServerConfigFlow = bufferedMutableSharedFlow(replay = 1) -} diff --git a/authenticator/src/main/kotlin/com/bitwarden/authenticator/data/platform/datasource/disk/di/PlatformDiskModule.kt b/authenticator/src/main/kotlin/com/bitwarden/authenticator/data/platform/datasource/disk/di/PlatformDiskModule.kt index 702060b96c..f1975f1af8 100644 --- a/authenticator/src/main/kotlin/com/bitwarden/authenticator/data/platform/datasource/disk/di/PlatformDiskModule.kt +++ b/authenticator/src/main/kotlin/com/bitwarden/authenticator/data/platform/datasource/disk/di/PlatformDiskModule.kt @@ -2,14 +2,14 @@ package com.bitwarden.authenticator.data.platform.datasource.disk.di import android.content.SharedPreferences import com.bitwarden.authenticator.data.platform.datasource.di.UnencryptedPreferences -import com.bitwarden.authenticator.data.platform.datasource.disk.ConfigDiskSource -import com.bitwarden.authenticator.data.platform.datasource.disk.ConfigDiskSourceImpl import com.bitwarden.authenticator.data.platform.datasource.disk.FeatureFlagDiskSource import com.bitwarden.authenticator.data.platform.datasource.disk.FeatureFlagDiskSourceImpl import com.bitwarden.authenticator.data.platform.datasource.disk.FeatureFlagOverrideDiskSource import com.bitwarden.authenticator.data.platform.datasource.disk.FeatureFlagOverrideDiskSourceImpl import com.bitwarden.authenticator.data.platform.datasource.disk.SettingsDiskSource import com.bitwarden.authenticator.data.platform.datasource.disk.SettingsDiskSourceImpl +import com.bitwarden.data.datasource.disk.ConfigDiskSource +import com.bitwarden.data.datasource.disk.ConfigDiskSourceImpl import dagger.Module import dagger.Provides import dagger.hilt.InstallIn diff --git a/authenticator/src/main/kotlin/com/bitwarden/authenticator/data/platform/datasource/disk/model/ServerConfig.kt b/authenticator/src/main/kotlin/com/bitwarden/authenticator/data/platform/datasource/disk/model/ServerConfig.kt deleted file mode 100644 index 5cc0b265d6..0000000000 --- a/authenticator/src/main/kotlin/com/bitwarden/authenticator/data/platform/datasource/disk/model/ServerConfig.kt +++ /dev/null @@ -1,22 +0,0 @@ -package com.bitwarden.authenticator.data.platform.datasource.disk.model - -import com.bitwarden.network.model.ConfigResponseJson -import kotlinx.serialization.SerialName -import kotlinx.serialization.Serializable - -/** - * A higher-level wrapper around [ConfigResponseJson] that provides a timestamp - * to check if a sync is necessary - * - * @property lastSync The [Long] of the last sync. - * @property serverData The raw [ConfigResponseJson] that contains specific data of the - * server configuration - */ -@Serializable -data class ServerConfig( - @SerialName("lastSync") - val lastSync: Long, - - @SerialName("serverData") - val serverData: ConfigResponseJson, -) diff --git a/authenticator/src/main/kotlin/com/bitwarden/authenticator/data/platform/manager/FeatureFlagManagerImpl.kt b/authenticator/src/main/kotlin/com/bitwarden/authenticator/data/platform/manager/FeatureFlagManagerImpl.kt index 6fc865c131..e32cd616ba 100644 --- a/authenticator/src/main/kotlin/com/bitwarden/authenticator/data/platform/manager/FeatureFlagManagerImpl.kt +++ b/authenticator/src/main/kotlin/com/bitwarden/authenticator/data/platform/manager/FeatureFlagManagerImpl.kt @@ -1,8 +1,8 @@ package com.bitwarden.authenticator.data.platform.manager -import com.bitwarden.authenticator.data.platform.datasource.disk.model.ServerConfig import com.bitwarden.authenticator.data.platform.manager.model.FlagKey import com.bitwarden.authenticator.data.platform.repository.ServerConfigRepository +import com.bitwarden.data.datasource.disk.model.ServerConfig import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.map diff --git a/authenticator/src/main/kotlin/com/bitwarden/authenticator/data/platform/repository/ServerConfigRepository.kt b/authenticator/src/main/kotlin/com/bitwarden/authenticator/data/platform/repository/ServerConfigRepository.kt index 4128106386..48e6d77b62 100644 --- a/authenticator/src/main/kotlin/com/bitwarden/authenticator/data/platform/repository/ServerConfigRepository.kt +++ b/authenticator/src/main/kotlin/com/bitwarden/authenticator/data/platform/repository/ServerConfigRepository.kt @@ -1,6 +1,6 @@ package com.bitwarden.authenticator.data.platform.repository -import com.bitwarden.authenticator.data.platform.datasource.disk.model.ServerConfig +import com.bitwarden.data.datasource.disk.model.ServerConfig import kotlinx.coroutines.flow.StateFlow /** diff --git a/authenticator/src/main/kotlin/com/bitwarden/authenticator/data/platform/repository/ServerConfigRepositoryImpl.kt b/authenticator/src/main/kotlin/com/bitwarden/authenticator/data/platform/repository/ServerConfigRepositoryImpl.kt index 10af99ae03..575ea9861e 100644 --- a/authenticator/src/main/kotlin/com/bitwarden/authenticator/data/platform/repository/ServerConfigRepositoryImpl.kt +++ b/authenticator/src/main/kotlin/com/bitwarden/authenticator/data/platform/repository/ServerConfigRepositoryImpl.kt @@ -1,8 +1,8 @@ package com.bitwarden.authenticator.data.platform.repository -import com.bitwarden.authenticator.data.platform.datasource.disk.ConfigDiskSource -import com.bitwarden.authenticator.data.platform.datasource.disk.model.ServerConfig import com.bitwarden.authenticator.data.platform.manager.DispatcherManager +import com.bitwarden.data.datasource.disk.ConfigDiskSource +import com.bitwarden.data.datasource.disk.model.ServerConfig import com.bitwarden.network.service.ConfigService import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.flow.SharingStarted diff --git a/authenticator/src/main/kotlin/com/bitwarden/authenticator/data/platform/repository/di/PlatformRepositoryModule.kt b/authenticator/src/main/kotlin/com/bitwarden/authenticator/data/platform/repository/di/PlatformRepositoryModule.kt index b24d72b61f..44d580ce7e 100644 --- a/authenticator/src/main/kotlin/com/bitwarden/authenticator/data/platform/repository/di/PlatformRepositoryModule.kt +++ b/authenticator/src/main/kotlin/com/bitwarden/authenticator/data/platform/repository/di/PlatformRepositoryModule.kt @@ -2,7 +2,6 @@ package com.bitwarden.authenticator.data.platform.repository.di import com.bitwarden.authenticator.data.auth.datasource.disk.AuthDiskSource import com.bitwarden.authenticator.data.authenticator.datasource.sdk.AuthenticatorSdkSource -import com.bitwarden.authenticator.data.platform.datasource.disk.ConfigDiskSource import com.bitwarden.authenticator.data.platform.datasource.disk.FeatureFlagDiskSource import com.bitwarden.authenticator.data.platform.datasource.disk.FeatureFlagOverrideDiskSource import com.bitwarden.authenticator.data.platform.datasource.disk.SettingsDiskSource @@ -16,6 +15,7 @@ import com.bitwarden.authenticator.data.platform.repository.ServerConfigReposito import com.bitwarden.authenticator.data.platform.repository.ServerConfigRepositoryImpl import com.bitwarden.authenticator.data.platform.repository.SettingsRepository import com.bitwarden.authenticator.data.platform.repository.SettingsRepositoryImpl +import com.bitwarden.data.datasource.disk.ConfigDiskSource import com.bitwarden.network.service.ConfigService import dagger.Module import dagger.Provides diff --git a/authenticator/src/test/java/com/bitwarden/authenticator/data/auth/datasource/disk/AuthDiskSourceTest.kt b/authenticator/src/test/java/com/bitwarden/authenticator/data/auth/datasource/disk/AuthDiskSourceTest.kt index b738d1d97f..df6c201d99 100644 --- a/authenticator/src/test/java/com/bitwarden/authenticator/data/auth/datasource/disk/AuthDiskSourceTest.kt +++ b/authenticator/src/test/java/com/bitwarden/authenticator/data/auth/datasource/disk/AuthDiskSourceTest.kt @@ -1,7 +1,7 @@ package com.bitwarden.authenticator.data.auth.datasource.disk -import com.bitwarden.authenticator.data.platform.base.FakeSharedPreferences import com.bitwarden.authenticatorbridge.util.generateSecretKey +import com.bitwarden.data.datasource.disk.base.FakeSharedPreferences import org.junit.jupiter.api.Assertions.assertEquals import org.junit.jupiter.api.Assertions.assertNull import org.junit.jupiter.api.Assertions.assertTrue diff --git a/authenticator/src/test/java/com/bitwarden/authenticator/data/platform/base/FakeSharedPreferences.kt b/authenticator/src/test/java/com/bitwarden/authenticator/data/platform/base/FakeSharedPreferences.kt deleted file mode 100644 index b1b67882d7..0000000000 --- a/authenticator/src/test/java/com/bitwarden/authenticator/data/platform/base/FakeSharedPreferences.kt +++ /dev/null @@ -1,109 +0,0 @@ -package com.bitwarden.authenticator.data.platform.base - -import android.content.SharedPreferences - -/** - * A faked implementation of [SharedPreferences] that is backed by an internal, memory-based map. - */ -class FakeSharedPreferences : SharedPreferences { - private val sharedPreferences: MutableMap = mutableMapOf() - private val listeners = mutableSetOf() - - override fun contains(key: String): Boolean = - sharedPreferences.containsKey(key) - - override fun edit(): SharedPreferences.Editor = Editor() - - override fun getAll(): Map = sharedPreferences - - override fun getBoolean(key: String, defaultValue: Boolean): Boolean = - getValue(key, defaultValue) - - override fun getFloat(key: String, defaultValue: Float): Float = - getValue(key, defaultValue) - - override fun getInt(key: String, defaultValue: Int): Int = - getValue(key, defaultValue) - - override fun getLong(key: String, defaultValue: Long): Long = - getValue(key, defaultValue) - - override fun getString(key: String, defaultValue: String?): String? = - getValue(key, defaultValue) - - override fun getStringSet(key: String, defaultValue: Set?): Set? = - getValue(key, defaultValue) - - override fun registerOnSharedPreferenceChangeListener( - listener: SharedPreferences.OnSharedPreferenceChangeListener, - ) { - listeners += listener - } - - override fun unregisterOnSharedPreferenceChangeListener( - listener: SharedPreferences.OnSharedPreferenceChangeListener, - ) { - listeners -= listener - } - - private inline fun getValue( - key: String, - defaultValue: T, - ): T = sharedPreferences[key] as? T ?: defaultValue - - inner class Editor : SharedPreferences.Editor { - private val pendingSharedPreferences = sharedPreferences.toMutableMap() - - override fun apply() { - sharedPreferences.apply { - clear() - putAll(pendingSharedPreferences) - - // Notify listeners - listeners.forEach { listener -> - pendingSharedPreferences.keys.forEach { key -> - listener.onSharedPreferenceChanged(this@FakeSharedPreferences, key) - } - } - } - } - - override fun clear(): SharedPreferences.Editor = - apply { pendingSharedPreferences.clear() } - - override fun commit(): Boolean { - apply() - return true - } - - override fun putBoolean(key: String, value: Boolean): SharedPreferences.Editor = - putValue(key, value) - - override fun putFloat(key: String, value: Float): SharedPreferences.Editor = - putValue(key, value) - - override fun putInt(key: String, value: Int): SharedPreferences.Editor = - putValue(key, value) - - override fun putLong(key: String, value: Long): SharedPreferences.Editor = - putValue(key, value) - - override fun putString(key: String, value: String?): SharedPreferences.Editor = - putValue(key, value) - - override fun putStringSet(key: String, value: Set?): SharedPreferences.Editor = - putValue(key, value) - - override fun remove(key: String): SharedPreferences.Editor = - apply { pendingSharedPreferences.remove(key) } - - private inline fun putValue( - key: String, - value: T, - ): SharedPreferences.Editor = apply { - value - ?.let { pendingSharedPreferences[key] = it } - ?: pendingSharedPreferences.remove(key) - } - } -} diff --git a/authenticator/src/test/java/com/bitwarden/authenticator/data/platform/datasource/disk/ConfigDiskSourceTest.kt b/authenticator/src/test/java/com/bitwarden/authenticator/data/platform/datasource/disk/ConfigDiskSourceTest.kt deleted file mode 100644 index 68efd2e364..0000000000 --- a/authenticator/src/test/java/com/bitwarden/authenticator/data/platform/datasource/disk/ConfigDiskSourceTest.kt +++ /dev/null @@ -1,116 +0,0 @@ -package com.bitwarden.authenticator.data.platform.datasource.disk - -import androidx.core.content.edit -import app.cash.turbine.test -import com.bitwarden.authenticator.data.platform.base.FakeSharedPreferences -import com.bitwarden.authenticator.data.platform.datasource.disk.model.ServerConfig -import com.bitwarden.core.di.CoreModule -import com.bitwarden.network.model.ConfigResponseJson -import com.bitwarden.network.model.ConfigResponseJson.EnvironmentJson -import com.bitwarden.network.model.ConfigResponseJson.ServerJson -import kotlinx.coroutines.test.runTest -import kotlinx.serialization.json.JsonPrimitive -import org.junit.jupiter.api.Assertions.assertEquals -import org.junit.jupiter.api.Assertions.assertNull -import org.junit.jupiter.api.Test -import java.time.Instant - -class ConfigDiskSourceTest { - private val json = CoreModule.providesJson() - - private val fakeSharedPreferences = FakeSharedPreferences() - - private val configDiskSource = ConfigDiskSourceImpl( - sharedPreferences = fakeSharedPreferences, - json = json, - ) - - @Test - fun `serverConfig should pull from and update SharedPreferences`() = - runTest { - val serverConfigKey = "bwPreferencesStorage:serverConfigurations" - - // Shared preferences and the repository start with the same value. - assertNull(configDiskSource.serverConfig) - assertNull(fakeSharedPreferences.getString(serverConfigKey, null)) - - // Updating the repository updates shared preferences - configDiskSource.serverConfig = SERVER_CONFIG - assertEquals( - json.parseToJsonElement( - SERVER_CONFIG_JSON, - ), - json.parseToJsonElement( - fakeSharedPreferences.getString(serverConfigKey, null)!!, - ), - ) - - // Update SharedPreferences updates the repository - fakeSharedPreferences.edit { putString(serverConfigKey, null) } - assertNull(configDiskSource.serverConfig) - } - - @Test - fun `serverConfigFlow should react to changes in serverConfig`() = - runTest { - configDiskSource.serverConfigFlow.test { - // The initial values of the Flow and the property are in sync - assertNull(configDiskSource.serverConfig) - assertNull(awaitItem()) - - // Updating the repository updates shared preferences - configDiskSource.serverConfig = SERVER_CONFIG - assertEquals(SERVER_CONFIG, awaitItem()) - } - } -} - -private const val SERVER_CONFIG_JSON = """ -{ - "lastSync": 1698408000000, - "serverData": { - "version": "2024.7.0", - "gitHash": "25cf6119-dirty", - "server": { - "name": "example", - "url": "https://localhost:8080" - }, - "environment": { - "vault": "https://localhost:8080", - "api": "http://localhost:4000", - "identity": "http://localhost:33656", - "notifications": "http://localhost:61840", - "sso": "http://localhost:51822" - }, - "featureStates": { - "duo-redirect": true, - "flexible-collections-v-1": false - } - } -} - -""" -private val SERVER_CONFIG = ServerConfig( - lastSync = Instant.parse("2023-10-27T12:00:00Z").toEpochMilli(), - serverData = ConfigResponseJson( - type = null, - version = "2024.7.0", - gitHash = "25cf6119-dirty", - server = ServerJson( - name = "example", - url = "https://localhost:8080", - ), - environment = EnvironmentJson( - cloudRegion = null, - vaultUrl = "https://localhost:8080", - apiUrl = "http://localhost:4000", - identityUrl = "http://localhost:33656", - notificationsUrl = "http://localhost:61840", - ssoUrl = "http://localhost:51822", - ), - featureStates = mapOf( - "duo-redirect" to JsonPrimitive(true), - "flexible-collections-v-1" to JsonPrimitive(false), - ), - ), -) diff --git a/authenticator/src/test/java/com/bitwarden/authenticator/data/platform/datasource/disk/FeatureFlagDiskSourceTest.kt b/authenticator/src/test/java/com/bitwarden/authenticator/data/platform/datasource/disk/FeatureFlagDiskSourceTest.kt index 4ca1294b34..8d4c58a218 100644 --- a/authenticator/src/test/java/com/bitwarden/authenticator/data/platform/datasource/disk/FeatureFlagDiskSourceTest.kt +++ b/authenticator/src/test/java/com/bitwarden/authenticator/data/platform/datasource/disk/FeatureFlagDiskSourceTest.kt @@ -2,10 +2,10 @@ package com.bitwarden.authenticator.data.platform.datasource.disk import androidx.core.content.edit import app.cash.turbine.test -import com.bitwarden.authenticator.data.platform.base.FakeSharedPreferences import com.bitwarden.authenticator.data.platform.datasource.disk.model.FeatureFlagsConfiguration import com.bitwarden.authenticator.data.platform.manager.model.FlagKey import com.bitwarden.core.di.CoreModule +import com.bitwarden.data.datasource.disk.base.FakeSharedPreferences import kotlinx.coroutines.test.runTest import kotlinx.serialization.json.JsonPrimitive import org.junit.jupiter.api.Assertions.assertEquals diff --git a/authenticator/src/test/java/com/bitwarden/authenticator/data/platform/datasource/disk/FeatureFlagOverrideDiskSourceTest.kt b/authenticator/src/test/java/com/bitwarden/authenticator/data/platform/datasource/disk/FeatureFlagOverrideDiskSourceTest.kt index ff0580d675..1b341bf60d 100644 --- a/authenticator/src/test/java/com/bitwarden/authenticator/data/platform/datasource/disk/FeatureFlagOverrideDiskSourceTest.kt +++ b/authenticator/src/test/java/com/bitwarden/authenticator/data/platform/datasource/disk/FeatureFlagOverrideDiskSourceTest.kt @@ -1,8 +1,8 @@ package com.bitwarden.authenticator.data.platform.datasource.disk import androidx.core.content.edit -import com.bitwarden.authenticator.data.platform.base.FakeSharedPreferences import com.bitwarden.authenticator.data.platform.manager.model.FlagKey +import com.bitwarden.data.datasource.disk.base.FakeSharedPreferences import org.junit.jupiter.api.Assertions.assertEquals import org.junit.jupiter.api.Assertions.assertFalse import org.junit.jupiter.api.Assertions.assertNull diff --git a/authenticator/src/test/java/com/bitwarden/authenticator/data/platform/datasource/disk/SettingDiskSourceTest.kt b/authenticator/src/test/java/com/bitwarden/authenticator/data/platform/datasource/disk/SettingDiskSourceTest.kt index 90ea9d972a..d0816078cc 100644 --- a/authenticator/src/test/java/com/bitwarden/authenticator/data/platform/datasource/disk/SettingDiskSourceTest.kt +++ b/authenticator/src/test/java/com/bitwarden/authenticator/data/platform/datasource/disk/SettingDiskSourceTest.kt @@ -2,8 +2,8 @@ package com.bitwarden.authenticator.data.platform.datasource.disk import androidx.core.content.edit import app.cash.turbine.test -import com.bitwarden.authenticator.data.platform.base.FakeSharedPreferences import com.bitwarden.authenticator.ui.platform.feature.settings.data.model.DefaultSaveOption +import com.bitwarden.data.datasource.disk.base.FakeSharedPreferences import kotlinx.coroutines.test.runTest import org.junit.jupiter.api.Assertions.assertEquals import org.junit.jupiter.api.Assertions.assertFalse diff --git a/authenticator/src/test/java/com/bitwarden/authenticator/data/platform/datasource/disk/util/FakeConfigDiskSource.kt b/authenticator/src/test/java/com/bitwarden/authenticator/data/platform/datasource/disk/util/FakeConfigDiskSource.kt deleted file mode 100644 index da46aae78d..0000000000 --- a/authenticator/src/test/java/com/bitwarden/authenticator/data/platform/datasource/disk/util/FakeConfigDiskSource.kt +++ /dev/null @@ -1,25 +0,0 @@ -package com.bitwarden.authenticator.data.platform.datasource.disk.util - -import com.bitwarden.authenticator.data.platform.datasource.disk.ConfigDiskSource -import com.bitwarden.authenticator.data.platform.datasource.disk.model.ServerConfig -import com.bitwarden.core.data.repository.util.bufferedMutableSharedFlow -import kotlinx.coroutines.flow.Flow -import kotlinx.coroutines.flow.onSubscription - -class FakeConfigDiskSource : ConfigDiskSource { - private var serverConfigValue: ServerConfig? = null - - override var serverConfig: ServerConfig? - get() = serverConfigValue - set(value) { - serverConfigValue = value - mutableServerConfigFlow.tryEmit(value) - } - - override val serverConfigFlow: Flow - get() = mutableServerConfigFlow - .onSubscription { emit(serverConfig) } - - private val mutableServerConfigFlow = - bufferedMutableSharedFlow(replay = 1) -} diff --git a/authenticator/src/test/java/com/bitwarden/authenticator/data/platform/manager/FeatureFlagManagerTest.kt b/authenticator/src/test/java/com/bitwarden/authenticator/data/platform/manager/FeatureFlagManagerTest.kt index 06ac977000..eb4387f81a 100644 --- a/authenticator/src/test/java/com/bitwarden/authenticator/data/platform/manager/FeatureFlagManagerTest.kt +++ b/authenticator/src/test/java/com/bitwarden/authenticator/data/platform/manager/FeatureFlagManagerTest.kt @@ -1,9 +1,9 @@ package com.bitwarden.authenticator.data.platform.manager import app.cash.turbine.test -import com.bitwarden.authenticator.data.platform.datasource.disk.model.ServerConfig import com.bitwarden.authenticator.data.platform.manager.model.FlagKey import com.bitwarden.authenticator.data.platform.repository.util.FakeServerConfigRepository +import com.bitwarden.data.datasource.disk.model.ServerConfig import com.bitwarden.network.model.ConfigResponseJson import com.bitwarden.network.model.ConfigResponseJson.EnvironmentJson import com.bitwarden.network.model.ConfigResponseJson.ServerJson diff --git a/authenticator/src/test/java/com/bitwarden/authenticator/data/platform/repository/DebugMenuRepositoryTest.kt b/authenticator/src/test/java/com/bitwarden/authenticator/data/platform/repository/DebugMenuRepositoryTest.kt index 1474c6c6ee..fb39610c6b 100644 --- a/authenticator/src/test/java/com/bitwarden/authenticator/data/platform/repository/DebugMenuRepositoryTest.kt +++ b/authenticator/src/test/java/com/bitwarden/authenticator/data/platform/repository/DebugMenuRepositoryTest.kt @@ -2,8 +2,8 @@ package com.bitwarden.authenticator.data.platform.repository import app.cash.turbine.test import com.bitwarden.authenticator.data.platform.datasource.disk.FeatureFlagOverrideDiskSource -import com.bitwarden.authenticator.data.platform.datasource.disk.model.ServerConfig import com.bitwarden.authenticator.data.platform.manager.model.FlagKey +import com.bitwarden.data.datasource.disk.model.ServerConfig import com.bitwarden.network.model.ConfigResponseJson import io.mockk.every import io.mockk.just diff --git a/authenticator/src/test/java/com/bitwarden/authenticator/data/platform/repository/ServerConfigRepositoryTest.kt b/authenticator/src/test/java/com/bitwarden/authenticator/data/platform/repository/ServerConfigRepositoryTest.kt index 72ecc426e4..640dd559b4 100644 --- a/authenticator/src/test/java/com/bitwarden/authenticator/data/platform/repository/ServerConfigRepositoryTest.kt +++ b/authenticator/src/test/java/com/bitwarden/authenticator/data/platform/repository/ServerConfigRepositoryTest.kt @@ -2,10 +2,10 @@ package com.bitwarden.authenticator.data.platform.repository import app.cash.turbine.test import com.bitwarden.authenticator.data.platform.base.FakeDispatcherManager -import com.bitwarden.authenticator.data.platform.datasource.disk.model.ServerConfig -import com.bitwarden.authenticator.data.platform.datasource.disk.util.FakeConfigDiskSource import com.bitwarden.authenticator.data.platform.manager.DispatcherManager import com.bitwarden.core.data.util.asSuccess +import com.bitwarden.data.datasource.disk.model.ServerConfig +import com.bitwarden.data.datasource.disk.util.FakeConfigDiskSource import com.bitwarden.network.model.ConfigResponseJson import com.bitwarden.network.model.ConfigResponseJson.EnvironmentJson import com.bitwarden.network.model.ConfigResponseJson.ServerJson diff --git a/authenticator/src/test/java/com/bitwarden/authenticator/data/platform/repository/util/FakeServerConfigRepository.kt b/authenticator/src/test/java/com/bitwarden/authenticator/data/platform/repository/util/FakeServerConfigRepository.kt index 954f941246..6629ec124f 100644 --- a/authenticator/src/test/java/com/bitwarden/authenticator/data/platform/repository/util/FakeServerConfigRepository.kt +++ b/authenticator/src/test/java/com/bitwarden/authenticator/data/platform/repository/util/FakeServerConfigRepository.kt @@ -1,7 +1,7 @@ package com.bitwarden.authenticator.data.platform.repository.util -import com.bitwarden.authenticator.data.platform.datasource.disk.model.ServerConfig import com.bitwarden.authenticator.data.platform.repository.ServerConfigRepository +import com.bitwarden.data.datasource.disk.model.ServerConfig import com.bitwarden.network.model.ConfigResponseJson import com.bitwarden.network.model.ConfigResponseJson.EnvironmentJson import com.bitwarden.network.model.ConfigResponseJson.ServerJson diff --git a/data/build.gradle.kts b/data/build.gradle.kts index 86ae78cc8c..e0ba81d388 100644 --- a/data/build.gradle.kts +++ b/data/build.gradle.kts @@ -4,6 +4,7 @@ plugins { alias(libs.plugins.android.library) alias(libs.plugins.hilt) alias(libs.plugins.kotlin.android) + alias(libs.plugins.kotlin.serialization) alias(libs.plugins.ksp) } @@ -31,6 +32,10 @@ android { sourceCompatibility(libs.versions.jvmTarget.get()) targetCompatibility(libs.versions.jvmTarget.get()) } + @Suppress("UnstableApiUsage") + testFixtures { + enable = true + } } kotlin { @@ -40,8 +45,31 @@ kotlin { } dependencies { + implementation(project(":core")) + implementation(project(":network")) + implementation(libs.androidx.core.ktx) implementation(libs.androidx.security.crypto) implementation(libs.google.hilt.android) ksp(libs.google.hilt.compiler) + implementation(libs.kotlinx.serialization) + + testImplementation(platform(libs.junit.bom)) + testRuntimeOnly(libs.junit.platform.launcher) + testImplementation(libs.junit.junit5) + testImplementation(libs.junit.vintage) + testImplementation(libs.kotlinx.coroutines.test) + testImplementation(libs.square.turbine) + + testFixturesImplementation(project(":core")) + testFixturesImplementation(libs.kotlinx.coroutines.test) +} + +tasks { + withType { + useJUnitPlatform() + maxHeapSize = "2g" + maxParallelForks = Runtime.getRuntime().availableProcessors() + jvmArgs = jvmArgs.orEmpty() + "-XX:+UseParallelGC" + } } diff --git a/app/src/main/java/com/x8bit/bitwarden/data/platform/datasource/disk/ConfigDiskSource.kt b/data/src/main/kotlin/com/bitwarden/data/datasource/disk/ConfigDiskSource.kt similarity index 76% rename from app/src/main/java/com/x8bit/bitwarden/data/platform/datasource/disk/ConfigDiskSource.kt rename to data/src/main/kotlin/com/bitwarden/data/datasource/disk/ConfigDiskSource.kt index 25a8a92193..4c027cc704 100644 --- a/app/src/main/java/com/x8bit/bitwarden/data/platform/datasource/disk/ConfigDiskSource.kt +++ b/data/src/main/kotlin/com/bitwarden/data/datasource/disk/ConfigDiskSource.kt @@ -1,6 +1,6 @@ -package com.x8bit.bitwarden.data.platform.datasource.disk +package com.bitwarden.data.datasource.disk -import com.x8bit.bitwarden.data.platform.datasource.disk.model.ServerConfig +import com.bitwarden.data.datasource.disk.model.ServerConfig import kotlinx.coroutines.flow.Flow /** diff --git a/app/src/main/java/com/x8bit/bitwarden/data/platform/datasource/disk/ConfigDiskSourceImpl.kt b/data/src/main/kotlin/com/bitwarden/data/datasource/disk/ConfigDiskSourceImpl.kt similarity index 86% rename from app/src/main/java/com/x8bit/bitwarden/data/platform/datasource/disk/ConfigDiskSourceImpl.kt rename to data/src/main/kotlin/com/bitwarden/data/datasource/disk/ConfigDiskSourceImpl.kt index 9495d5d39d..2d88d19f6b 100644 --- a/app/src/main/java/com/x8bit/bitwarden/data/platform/datasource/disk/ConfigDiskSourceImpl.kt +++ b/data/src/main/kotlin/com/bitwarden/data/datasource/disk/ConfigDiskSourceImpl.kt @@ -1,10 +1,9 @@ -package com.x8bit.bitwarden.data.platform.datasource.disk +package com.bitwarden.data.datasource.disk import android.content.SharedPreferences import com.bitwarden.core.data.repository.util.bufferedMutableSharedFlow import com.bitwarden.core.data.util.decodeFromStringOrNull -import com.bitwarden.data.datasource.disk.BaseDiskSource -import com.x8bit.bitwarden.data.platform.datasource.disk.model.ServerConfig +import com.bitwarden.data.datasource.disk.model.ServerConfig import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.onSubscription import kotlinx.serialization.json.Json diff --git a/app/src/main/java/com/x8bit/bitwarden/data/platform/datasource/disk/model/ServerConfig.kt b/data/src/main/kotlin/com/bitwarden/data/datasource/disk/model/ServerConfig.kt similarity index 92% rename from app/src/main/java/com/x8bit/bitwarden/data/platform/datasource/disk/model/ServerConfig.kt rename to data/src/main/kotlin/com/bitwarden/data/datasource/disk/model/ServerConfig.kt index ee82b4bf09..3f12d144fb 100644 --- a/app/src/main/java/com/x8bit/bitwarden/data/platform/datasource/disk/model/ServerConfig.kt +++ b/data/src/main/kotlin/com/bitwarden/data/datasource/disk/model/ServerConfig.kt @@ -1,4 +1,4 @@ -package com.x8bit.bitwarden.data.platform.datasource.disk.model +package com.bitwarden.data.datasource.disk.model import com.bitwarden.network.model.ConfigResponseJson import kotlinx.serialization.SerialName diff --git a/app/src/test/java/com/x8bit/bitwarden/data/platform/datasource/disk/ConfigDiskSourceTest.kt b/data/src/test/kotlin/com/bitwarden/data/datasource/disk/ConfigDiskSourceTest.kt similarity index 94% rename from app/src/test/java/com/x8bit/bitwarden/data/platform/datasource/disk/ConfigDiskSourceTest.kt rename to data/src/test/kotlin/com/bitwarden/data/datasource/disk/ConfigDiskSourceTest.kt index f0ecab06f4..7cda4c5339 100644 --- a/app/src/test/java/com/x8bit/bitwarden/data/platform/datasource/disk/ConfigDiskSourceTest.kt +++ b/data/src/test/kotlin/com/bitwarden/data/datasource/disk/ConfigDiskSourceTest.kt @@ -1,13 +1,13 @@ -package com.x8bit.bitwarden.data.platform.datasource.disk +package com.bitwarden.data.datasource.disk import androidx.core.content.edit import app.cash.turbine.test import com.bitwarden.core.di.CoreModule +import com.bitwarden.data.datasource.disk.base.FakeSharedPreferences +import com.bitwarden.data.datasource.disk.model.ServerConfig import com.bitwarden.network.model.ConfigResponseJson import com.bitwarden.network.model.ConfigResponseJson.EnvironmentJson import com.bitwarden.network.model.ConfigResponseJson.ServerJson -import com.x8bit.bitwarden.data.platform.base.FakeSharedPreferences -import com.x8bit.bitwarden.data.platform.datasource.disk.model.ServerConfig import kotlinx.coroutines.test.runTest import kotlinx.serialization.json.JsonPrimitive import org.junit.jupiter.api.Assertions.assertEquals diff --git a/app/src/test/java/com/x8bit/bitwarden/data/platform/base/FakeSharedPreferences.kt b/data/src/testFixtures/kotlin/com/bitwarden/data/datasource/disk/base/FakeSharedPreferences.kt similarity index 98% rename from app/src/test/java/com/x8bit/bitwarden/data/platform/base/FakeSharedPreferences.kt rename to data/src/testFixtures/kotlin/com/bitwarden/data/datasource/disk/base/FakeSharedPreferences.kt index 458bdc43fe..8c9854eeb4 100644 --- a/app/src/test/java/com/x8bit/bitwarden/data/platform/base/FakeSharedPreferences.kt +++ b/data/src/testFixtures/kotlin/com/bitwarden/data/datasource/disk/base/FakeSharedPreferences.kt @@ -1,4 +1,4 @@ -package com.x8bit.bitwarden.data.platform.base +package com.bitwarden.data.datasource.disk.base import android.content.SharedPreferences diff --git a/app/src/test/java/com/x8bit/bitwarden/data/platform/datasource/disk/util/FakeConfigDiskSource.kt b/data/src/testFixtures/kotlin/com/bitwarden/data/datasource/disk/util/FakeConfigDiskSource.kt similarity index 75% rename from app/src/test/java/com/x8bit/bitwarden/data/platform/datasource/disk/util/FakeConfigDiskSource.kt rename to data/src/testFixtures/kotlin/com/bitwarden/data/datasource/disk/util/FakeConfigDiskSource.kt index ea0e3085ef..ea596ca111 100644 --- a/app/src/test/java/com/x8bit/bitwarden/data/platform/datasource/disk/util/FakeConfigDiskSource.kt +++ b/data/src/testFixtures/kotlin/com/bitwarden/data/datasource/disk/util/FakeConfigDiskSource.kt @@ -1,11 +1,14 @@ -package com.x8bit.bitwarden.data.platform.datasource.disk.util +package com.bitwarden.data.datasource.disk.util import com.bitwarden.core.data.repository.util.bufferedMutableSharedFlow -import com.x8bit.bitwarden.data.platform.datasource.disk.ConfigDiskSource -import com.x8bit.bitwarden.data.platform.datasource.disk.model.ServerConfig +import com.bitwarden.data.datasource.disk.ConfigDiskSource +import com.bitwarden.data.datasource.disk.model.ServerConfig import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.onSubscription +/** + * A faked [ConfigDiskSource] that holds data in memory. + */ class FakeConfigDiskSource : ConfigDiskSource { private var serverConfigValue: ServerConfig? = null diff --git a/detekt-config.yml b/detekt-config.yml index c26d95384d..5f0b70a520 100644 --- a/detekt-config.yml +++ b/detekt-config.yml @@ -101,7 +101,7 @@ complexity: ignoreStringsRegex: '$^' TooManyFunctions: active: true - excludes: [ '**/test/**', '**/androidTest/**', '**/commonTest/**', '**/jvmTest/**', '**/jsTest/**', '**/iosTest/**' ] + excludes: [ '**/test/**', '**/androidTest/**', '**/commonTest/**', '**/jvmTest/**', '**/jsTest/**', '**/iosTest/**', '**/testFixtures/**' ] thresholdInFiles: 11 thresholdInClasses: 11 thresholdInInterfaces: 11