Revamp restore decisions state and flesh out post registration restore options.

This commit is contained in:
Cody Henthorne
2025-02-04 13:26:36 -05:00
committed by Greyson Parrelli
parent b78747fda2
commit fe44789d88
35 changed files with 1071 additions and 411 deletions

View File

@@ -12,10 +12,9 @@ import assertk.assertions.extracting
import assertk.assertions.hasSize
import assertk.assertions.isEmpty
import assertk.assertions.isEqualTo
import io.mockk.Runs
import io.mockk.every
import io.mockk.just
import io.mockk.mockkObject
import io.mockk.mockkStatic
import io.mockk.unmockkAll
import io.mockk.verify
import org.junit.After
@@ -26,7 +25,10 @@ import org.junit.runner.RunWith
import org.robolectric.RobolectricTestRunner
import org.robolectric.annotation.Config
import org.signal.core.util.logging.Log.initialize
import org.thoughtcrime.securesms.database.model.databaseprotos.RestoreDecisionState
import org.thoughtcrime.securesms.keyvalue.PhoneNumberPrivacyValues
import org.thoughtcrime.securesms.keyvalue.Skipped
import org.thoughtcrime.securesms.keyvalue.Start
import org.thoughtcrime.securesms.profiles.ProfileName
import org.thoughtcrime.securesms.recipients.Recipient
import org.thoughtcrime.securesms.testutil.LogRecorder
@@ -48,8 +50,7 @@ class RegistrationUtilTest {
@Before
fun setup() {
mockkObject(Recipient)
mockkObject(RemoteConfig)
every { RemoteConfig.init() } just Runs
mockkStatic(RemoteConfig::class)
logRecorder = LogRecorder()
initialize(logRecorder)
@@ -94,7 +95,7 @@ class RegistrationUtilTest {
every { Recipient.self() } returns Recipient(profileName = ProfileName.fromParts("Dark", "Helmet"))
every { signalStore.svr.hasOptedInWithAccess() } returns true
every { RemoteConfig.restoreAfterRegistration } returns true
every { signalStore.registration.hasSkippedTransferOrRestore() } returns true
every { signalStore.registration.restoreDecisionState } returns RestoreDecisionState.Skipped
RegistrationUtil.maybeMarkRegistrationComplete()
@@ -121,8 +122,7 @@ class RegistrationUtilTest {
every { signalStore.svr.hasOptedInWithAccess() } returns true
every { RemoteConfig.restoreAfterRegistration } returns true
every { signalStore.registration.hasSkippedTransferOrRestore() } returns false
every { signalStore.registration.hasCompletedRestore() } returns false
every { signalStore.registration.restoreDecisionState } returns RestoreDecisionState.Start
RegistrationUtil.maybeMarkRegistrationComplete()

View File

@@ -0,0 +1,58 @@
package org.thoughtcrime.securesms.registrationv3.ui.restore
import assertk.assertThat
import assertk.assertions.isEqualTo
import assertk.assertions.isFalse
import assertk.assertions.isTrue
import org.junit.Test
import org.junit.runner.RunWith
import org.junit.runners.Parameterized
import org.thoughtcrime.securesms.registrationv3.ui.restore.AccountEntropyPoolVerification.AEPValidationError
@RunWith(Parameterized::class)
class AccountEntropyPoolVerificationTest(
private val inputBackupKey: String,
private val inputChanged: Boolean,
private val inputPreviousError: AEPValidationError?,
private val expectedIsValid: Boolean,
private val expectedError: AEPValidationError?
) {
@Test
fun verifyAEPValid() {
val (valid, error) = AccountEntropyPoolVerification.verifyAEP(inputBackupKey, inputChanged, inputPreviousError)
assertThat(valid).apply { if (expectedIsValid) isTrue() else isFalse() }
assertThat(error).isEqualTo(expectedError)
}
companion object {
@JvmStatic
@Parameterized.Parameters(name = "data[{index}]: verify(\"{0}\", {1}, {2}) = ({3}, {4})")
fun data(): Iterable<Array<Any?>> = listOf(
TestData(inputBackupKey = "", inputChanged = false, inputPreviousError = null, expectedIsValid = false, expectedError = null),
TestData(inputBackupKey = "abcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcd", inputChanged = false, inputPreviousError = null, expectedIsValid = true, expectedError = null),
TestData(inputBackupKey = "abcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcda", inputChanged = true, inputPreviousError = null, expectedIsValid = false, expectedError = AEPValidationError.TooLong(65, 64)),
TestData(inputBackupKey = "abcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcd", inputChanged = true, inputPreviousError = AEPValidationError.TooLong(65, 64), expectedIsValid = true, expectedError = null),
TestData(inputBackupKey = "abcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcd", inputChanged = false, inputPreviousError = AEPValidationError.Incorrect, expectedIsValid = true, expectedError = AEPValidationError.Incorrect),
TestData(inputBackupKey = "abcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcd", inputChanged = true, inputPreviousError = AEPValidationError.Incorrect, expectedIsValid = true, expectedError = null),
TestData(inputBackupKey = "!@#$!@#!@#!@#%asdf#$@#$@#asdf++dabcdabcdabcdabcdabcdabcdabcdabcd", inputChanged = true, inputPreviousError = null, expectedIsValid = false, expectedError = AEPValidationError.Invalid),
TestData(inputBackupKey = "abcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcd", inputChanged = true, inputPreviousError = AEPValidationError.Invalid, expectedIsValid = true, expectedError = null),
TestData(inputBackupKey = "!@#$!@#!@#!@#%asdf#$@#$@#asdf++dabcdabcdabcdabcdabcdabcdabcdabcd", inputChanged = true, inputPreviousError = AEPValidationError.Invalid, expectedIsValid = false, expectedError = AEPValidationError.Invalid),
TestData(inputBackupKey = "abcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdab", inputChanged = true, inputPreviousError = AEPValidationError.TooLong(65, 64), expectedIsValid = false, expectedError = AEPValidationError.TooLong(66, 64))
).map { it.toArray() }
}
class TestData(
private val inputBackupKey: String,
private val inputChanged: Boolean,
private val inputPreviousError: AEPValidationError?,
private val expectedIsValid: Boolean,
private val expectedError: AEPValidationError?
) {
fun toArray(): Array<Any?> {
return arrayOf(inputBackupKey, inputChanged, inputPreviousError, expectedIsValid, expectedError)
}
}
}