Rear Fingerprint Enrollment
Bug: 297083009 Test: atest RFPSIconTouchViewModelTest FingerprintEnrollEnrollingViewModelTest FingerprintManagerInteractorTest Change-Id: Icc072e7d7815070087ccb50ea5937c386b06fb11
This commit is contained in:
@@ -26,12 +26,14 @@ import android.os.CancellationSignal
|
||||
import android.os.Handler
|
||||
import androidx.test.core.app.ApplicationProvider
|
||||
import com.android.settings.biometrics.GatekeeperPasswordProvider
|
||||
import com.android.settings.biometrics.fingerprint2.shared.domain.interactor.FingerprintManagerInteractor
|
||||
import com.android.settings.biometrics.fingerprint2.domain.interactor.FingerprintManagerInteractorImpl
|
||||
import com.android.settings.biometrics.fingerprint2.shared.data.repository.PressToAuthProvider
|
||||
import com.android.settings.biometrics.fingerprint2.shared.domain.interactor.FingerprintManagerInteractor
|
||||
import com.android.settings.biometrics.fingerprint2.shared.model.Default
|
||||
import com.android.settings.biometrics.fingerprint2.shared.model.EnrollReason
|
||||
import com.android.settings.biometrics.fingerprint2.shared.model.FingerprintAuthAttemptViewModel
|
||||
import com.android.settings.biometrics.fingerprint2.shared.model.FingerprintViewModel
|
||||
import com.android.settings.biometrics.fingerprint2.shared.model.FingerEnrollStateViewModel
|
||||
import com.android.settings.biometrics.fingerprint2.shared.model.FingerEnrollState
|
||||
import com.android.settings.biometrics.fingerprint2.shared.model.FingerprintAuthAttemptModel
|
||||
import com.android.settings.biometrics.fingerprint2.shared.model.FingerprintData
|
||||
import com.android.settings.password.ChooseLockSettingsHelper
|
||||
import com.google.common.truth.Truth.assertThat
|
||||
import kotlinx.coroutines.cancelAndJoin
|
||||
@@ -69,7 +71,11 @@ class FingerprintManagerInteractorTest {
|
||||
@Mock private lateinit var gateKeeperPasswordProvider: GatekeeperPasswordProvider
|
||||
|
||||
private var testScope = TestScope(backgroundDispatcher)
|
||||
private var pressToAuthProvider = { true }
|
||||
private var pressToAuthProvider =
|
||||
object : PressToAuthProvider {
|
||||
override val isEnabled: Boolean
|
||||
get() = false
|
||||
}
|
||||
|
||||
@Before
|
||||
fun setup() {
|
||||
@@ -80,6 +86,7 @@ class FingerprintManagerInteractorTest {
|
||||
fingerprintManager,
|
||||
gateKeeperPasswordProvider,
|
||||
pressToAuthProvider,
|
||||
Default,
|
||||
)
|
||||
}
|
||||
|
||||
@@ -164,7 +171,7 @@ class FingerprintManagerInteractorTest {
|
||||
@Test
|
||||
fun testRemoveFingerprint_succeeds() =
|
||||
testScope.runTest {
|
||||
val fingerprintViewModelToRemove = FingerprintViewModel("Finger 2", 1, 2L)
|
||||
val fingerprintViewModelToRemove = FingerprintData("Finger 2", 1, 2L)
|
||||
val fingerprintToRemove = Fingerprint("Finger 2", 1, 2L)
|
||||
|
||||
val removalCallback: ArgumentCaptor<FingerprintManager.RemovalCallback> = argumentCaptor()
|
||||
@@ -187,7 +194,7 @@ class FingerprintManagerInteractorTest {
|
||||
@Test
|
||||
fun testRemoveFingerprint_fails() =
|
||||
testScope.runTest {
|
||||
val fingerprintViewModelToRemove = FingerprintViewModel("Finger 2", 1, 2L)
|
||||
val fingerprintViewModelToRemove = FingerprintData("Finger 2", 1, 2L)
|
||||
val fingerprintToRemove = Fingerprint("Finger 2", 1, 2L)
|
||||
|
||||
val removalCallback: ArgumentCaptor<FingerprintManager.RemovalCallback> = argumentCaptor()
|
||||
@@ -214,7 +221,7 @@ class FingerprintManagerInteractorTest {
|
||||
@Test
|
||||
fun testRenameFingerprint_succeeds() =
|
||||
testScope.runTest {
|
||||
val fingerprintToRename = FingerprintViewModel("Finger 2", 1, 2L)
|
||||
val fingerprintToRename = FingerprintData("Finger 2", 1, 2L)
|
||||
|
||||
underTest.renameFingerprint(fingerprintToRename, "Woo")
|
||||
|
||||
@@ -226,7 +233,7 @@ class FingerprintManagerInteractorTest {
|
||||
testScope.runTest {
|
||||
val fingerprint = Fingerprint("Woooo", 100, 101L)
|
||||
|
||||
var result: FingerprintAuthAttemptViewModel? = null
|
||||
var result: FingerprintAuthAttemptModel? = null
|
||||
val job = launch { result = underTest.authenticate() }
|
||||
|
||||
val authCallback: ArgumentCaptor<FingerprintManager.AuthenticationCallback> = argumentCaptor()
|
||||
@@ -247,13 +254,13 @@ class FingerprintManagerInteractorTest {
|
||||
|
||||
runCurrent()
|
||||
job.cancelAndJoin()
|
||||
assertThat(result).isEqualTo(FingerprintAuthAttemptViewModel.Success(fingerprint.biometricId))
|
||||
assertThat(result).isEqualTo(FingerprintAuthAttemptModel.Success(fingerprint.biometricId))
|
||||
}
|
||||
|
||||
@Test
|
||||
fun testAuth_lockout() =
|
||||
testScope.runTest {
|
||||
var result: FingerprintAuthAttemptViewModel? = null
|
||||
var result: FingerprintAuthAttemptModel? = null
|
||||
val job = launch { result = underTest.authenticate() }
|
||||
|
||||
val authCallback: ArgumentCaptor<FingerprintManager.AuthenticationCallback> = argumentCaptor()
|
||||
@@ -274,7 +281,7 @@ class FingerprintManagerInteractorTest {
|
||||
job.cancelAndJoin()
|
||||
assertThat(result)
|
||||
.isEqualTo(
|
||||
FingerprintAuthAttemptViewModel.Error(FINGERPRINT_ERROR_LOCKOUT_PERMANENT, "Lockout!!")
|
||||
FingerprintAuthAttemptModel.Error(FINGERPRINT_ERROR_LOCKOUT_PERMANENT, "Lockout!!")
|
||||
)
|
||||
}
|
||||
|
||||
@@ -282,7 +289,7 @@ class FingerprintManagerInteractorTest {
|
||||
fun testEnroll_progress() =
|
||||
testScope.runTest {
|
||||
val token = byteArrayOf(5, 3, 2)
|
||||
var result: FingerEnrollStateViewModel? = null
|
||||
var result: FingerEnrollState? = null
|
||||
val job = launch { underTest.enroll(token, EnrollReason.FindSensor).collect { result = it } }
|
||||
val enrollCallback: ArgumentCaptor<FingerprintManager.EnrollmentCallback> = argumentCaptor()
|
||||
runCurrent()
|
||||
@@ -299,14 +306,14 @@ class FingerprintManagerInteractorTest {
|
||||
runCurrent()
|
||||
job.cancelAndJoin()
|
||||
|
||||
assertThat(result).isEqualTo(FingerEnrollStateViewModel.EnrollProgress(1))
|
||||
assertThat(result).isEqualTo(FingerEnrollState.EnrollProgress(1, 2))
|
||||
}
|
||||
|
||||
@Test
|
||||
fun testEnroll_help() =
|
||||
testScope.runTest {
|
||||
val token = byteArrayOf(5, 3, 2)
|
||||
var result: FingerEnrollStateViewModel? = null
|
||||
var result: FingerEnrollState? = null
|
||||
val job = launch { underTest.enroll(token, EnrollReason.FindSensor).collect { result = it } }
|
||||
val enrollCallback: ArgumentCaptor<FingerprintManager.EnrollmentCallback> = argumentCaptor()
|
||||
runCurrent()
|
||||
@@ -323,14 +330,14 @@ class FingerprintManagerInteractorTest {
|
||||
runCurrent()
|
||||
job.cancelAndJoin()
|
||||
|
||||
assertThat(result).isEqualTo(FingerEnrollStateViewModel.EnrollHelp(-1, "help"))
|
||||
assertThat(result).isEqualTo(FingerEnrollState.EnrollHelp(-1, "help"))
|
||||
}
|
||||
|
||||
@Test
|
||||
fun testEnroll_error() =
|
||||
testScope.runTest {
|
||||
val token = byteArrayOf(5, 3, 2)
|
||||
var result: FingerEnrollStateViewModel? = null
|
||||
var result: FingerEnrollState? = null
|
||||
val job = launch { underTest.enroll(token, EnrollReason.FindSensor).collect { result = it } }
|
||||
val enrollCallback: ArgumentCaptor<FingerprintManager.EnrollmentCallback> = argumentCaptor()
|
||||
runCurrent()
|
||||
@@ -343,17 +350,20 @@ class FingerprintManagerInteractorTest {
|
||||
capture(enrollCallback),
|
||||
eq(FingerprintManager.ENROLL_FIND_SENSOR)
|
||||
)
|
||||
enrollCallback.value.onEnrollmentError(-2, "error")
|
||||
enrollCallback.value.onEnrollmentError(-1, "error")
|
||||
runCurrent()
|
||||
job.cancelAndJoin()
|
||||
|
||||
assertThat(result).isEqualTo(FingerEnrollStateViewModel.EnrollError(-2, "error"))
|
||||
assertThat(result).isInstanceOf(FingerEnrollState.EnrollError::class.java)
|
||||
}
|
||||
|
||||
private fun <T : Any> safeEq(value: T): T = eq(value) ?: value
|
||||
|
||||
private fun <T> capture(argumentCaptor: ArgumentCaptor<T>): T = argumentCaptor.capture()
|
||||
|
||||
private fun <T> any(type: Class<T>): T = Mockito.any<T>(type)
|
||||
|
||||
private fun <T> whenever(methodCall: T): OngoingStubbing<T> = `when`(methodCall)
|
||||
|
||||
inline fun <reified T : Any> argumentCaptor(): ArgumentCaptor<T> =
|
||||
ArgumentCaptor.forClass(T::class.java)
|
||||
}
|
||||
|
||||
@@ -21,7 +21,9 @@ import android.content.res.Configuration
|
||||
import android.view.accessibility.AccessibilityManager
|
||||
import androidx.arch.core.executor.testing.InstantTaskExecutorRule
|
||||
import androidx.test.core.app.ApplicationProvider
|
||||
import com.android.settings.biometrics.fingerprint2.shared.model.Default
|
||||
import com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel.AccessibilityViewModel
|
||||
import com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel.BackgroundViewModel
|
||||
import com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel.Education
|
||||
import com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel.FingerprintEnrollFindSensorViewModel
|
||||
import com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel.FingerprintEnrollNavigationViewModel
|
||||
@@ -70,6 +72,7 @@ class FingerprintEnrollFindSensorViewModelV2Test {
|
||||
private lateinit var foldStateViewModel: FoldStateViewModel
|
||||
private lateinit var orientationStateViewModel: OrientationStateViewModel
|
||||
private lateinit var underTest: FingerprintEnrollFindSensorViewModel
|
||||
private lateinit var backgroundViewModel: BackgroundViewModel
|
||||
private val context: Context = ApplicationProvider.getApplicationContext()
|
||||
private val accessibilityManager: AccessibilityManager =
|
||||
context.getSystemService(AccessibilityManager::class.java)!!
|
||||
@@ -93,12 +96,18 @@ class FingerprintEnrollFindSensorViewModelV2Test {
|
||||
fakeFingerprintManagerInteractor,
|
||||
gatekeeperViewModel,
|
||||
canSkipConfirm = true,
|
||||
Default,
|
||||
)
|
||||
.create(FingerprintEnrollNavigationViewModel::class.java)
|
||||
|
||||
backgroundViewModel =
|
||||
BackgroundViewModel.BackgroundViewModelFactory().create(BackgroundViewModel::class.java)
|
||||
backgroundViewModel.inForeground()
|
||||
enrollViewModel =
|
||||
FingerprintEnrollViewModel.FingerprintEnrollViewModelFactory(
|
||||
fakeFingerprintManagerInteractor,
|
||||
backgroundDispatcher
|
||||
gatekeeperViewModel,
|
||||
navigationViewModel,
|
||||
)
|
||||
.create(FingerprintEnrollViewModel::class.java)
|
||||
accessibilityViewModel =
|
||||
@@ -114,6 +123,7 @@ class FingerprintEnrollFindSensorViewModelV2Test {
|
||||
navigationViewModel,
|
||||
enrollViewModel,
|
||||
gatekeeperViewModel,
|
||||
backgroundViewModel,
|
||||
accessibilityViewModel,
|
||||
foldStateViewModel,
|
||||
orientationStateViewModel
|
||||
@@ -123,6 +133,7 @@ class FingerprintEnrollFindSensorViewModelV2Test {
|
||||
// Navigate to Education page
|
||||
navigationViewModel.nextStep()
|
||||
}
|
||||
|
||||
@After
|
||||
fun tearDown() {
|
||||
Dispatchers.resetMain()
|
||||
|
||||
@@ -0,0 +1,142 @@
|
||||
/*
|
||||
* Copyright (C) 2023 The Android Open Source Project
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
package com.android.settings.fingerprint2.ui.enrollment.modules.enrolling.rfps.viewmodel
|
||||
|
||||
import androidx.arch.core.executor.testing.InstantTaskExecutorRule
|
||||
import com.android.settings.biometrics.fingerprint2.ui.enrollment.modules.enrolling.rfps.ui.viewmodel.RFPSIconTouchViewModel
|
||||
import com.google.common.truth.Truth.assertThat
|
||||
import kotlinx.coroutines.Dispatchers
|
||||
import kotlinx.coroutines.launch
|
||||
import kotlinx.coroutines.test.StandardTestDispatcher
|
||||
import kotlinx.coroutines.test.TestScope
|
||||
import kotlinx.coroutines.test.resetMain
|
||||
import kotlinx.coroutines.test.runCurrent
|
||||
import kotlinx.coroutines.test.runTest
|
||||
import kotlinx.coroutines.test.setMain
|
||||
import org.junit.After
|
||||
import org.junit.Before
|
||||
import org.junit.Rule
|
||||
import org.junit.Test
|
||||
import org.junit.runner.RunWith
|
||||
import org.mockito.junit.MockitoJUnit
|
||||
import org.mockito.junit.MockitoJUnitRunner
|
||||
|
||||
@RunWith(MockitoJUnitRunner::class)
|
||||
class RFPSIconTouchViewModelTest {
|
||||
@JvmField @Rule var rule = MockitoJUnit.rule()
|
||||
|
||||
@get:Rule val instantTaskRule = InstantTaskExecutorRule()
|
||||
|
||||
private var backgroundDispatcher = StandardTestDispatcher()
|
||||
private var testScope = TestScope(backgroundDispatcher)
|
||||
private lateinit var rfpsIconTouchViewModel: RFPSIconTouchViewModel
|
||||
|
||||
@Before
|
||||
fun setup() {
|
||||
Dispatchers.setMain(backgroundDispatcher)
|
||||
testScope = TestScope(backgroundDispatcher)
|
||||
rfpsIconTouchViewModel =
|
||||
RFPSIconTouchViewModel()
|
||||
}
|
||||
|
||||
@After
|
||||
fun tearDown() {
|
||||
Dispatchers.resetMain()
|
||||
}
|
||||
|
||||
@Test
|
||||
fun initShouldNotShowDialog() =
|
||||
testScope.runTest {
|
||||
var shouldShowDialog = false
|
||||
|
||||
val job = launch { rfpsIconTouchViewModel.shouldShowDialog.collect { shouldShowDialog = it } }
|
||||
|
||||
runCurrent()
|
||||
|
||||
assertThat(shouldShowDialog).isFalse()
|
||||
job.cancel()
|
||||
}
|
||||
|
||||
@Test
|
||||
fun shouldShowDialogTest() =
|
||||
testScope.runTest {
|
||||
var shouldShowDialog = false
|
||||
|
||||
val job = launch { rfpsIconTouchViewModel.shouldShowDialog.collect { shouldShowDialog = it } }
|
||||
|
||||
rfpsIconTouchViewModel.userTouchedFingerprintIcon()
|
||||
rfpsIconTouchViewModel.userTouchedFingerprintIcon()
|
||||
rfpsIconTouchViewModel.userTouchedFingerprintIcon()
|
||||
|
||||
runCurrent()
|
||||
|
||||
assertThat(shouldShowDialog).isTrue()
|
||||
job.cancel()
|
||||
}
|
||||
|
||||
@Test
|
||||
fun stateShouldBeFalseAfterReset() =
|
||||
testScope.runTest {
|
||||
var shouldShowDialog = false
|
||||
|
||||
val job = launch { rfpsIconTouchViewModel.shouldShowDialog.collect { shouldShowDialog = it } }
|
||||
|
||||
rfpsIconTouchViewModel.userTouchedFingerprintIcon()
|
||||
rfpsIconTouchViewModel.userTouchedFingerprintIcon()
|
||||
rfpsIconTouchViewModel.userTouchedFingerprintIcon()
|
||||
|
||||
runCurrent()
|
||||
|
||||
assertThat(shouldShowDialog).isTrue()
|
||||
|
||||
rfpsIconTouchViewModel.userTouchedFingerprintIcon()
|
||||
runCurrent()
|
||||
|
||||
assertThat(shouldShowDialog).isFalse()
|
||||
|
||||
job.cancel()
|
||||
}
|
||||
|
||||
@Test
|
||||
fun toggleMultipleTimes() =
|
||||
testScope.runTest {
|
||||
var shouldShowDialog = false
|
||||
|
||||
val job = launch { rfpsIconTouchViewModel.shouldShowDialog.collect { shouldShowDialog = it } }
|
||||
|
||||
rfpsIconTouchViewModel.userTouchedFingerprintIcon()
|
||||
rfpsIconTouchViewModel.userTouchedFingerprintIcon()
|
||||
rfpsIconTouchViewModel.userTouchedFingerprintIcon()
|
||||
|
||||
runCurrent()
|
||||
|
||||
assertThat(shouldShowDialog).isTrue()
|
||||
|
||||
rfpsIconTouchViewModel.userTouchedFingerprintIcon()
|
||||
runCurrent()
|
||||
|
||||
assertThat(shouldShowDialog).isFalse()
|
||||
|
||||
rfpsIconTouchViewModel.userTouchedFingerprintIcon()
|
||||
rfpsIconTouchViewModel.userTouchedFingerprintIcon()
|
||||
|
||||
runCurrent()
|
||||
assertThat(shouldShowDialog).isTrue()
|
||||
|
||||
job.cancel()
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,153 @@
|
||||
/*
|
||||
* Copyright (C) 2023 The Android Open Source Project
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
package com.android.settings.fingerprint2.ui.enrollment.viewmodel
|
||||
|
||||
import androidx.arch.core.executor.testing.InstantTaskExecutorRule
|
||||
import com.android.settings.biometrics.fingerprint2.shared.model.Default
|
||||
import com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel.BackgroundViewModel
|
||||
import com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel.Enrollment
|
||||
import com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel.FingerprintEnrollEnrollingViewModel
|
||||
import com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel.FingerprintEnrollNavigationViewModel
|
||||
import com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel.FingerprintEnrollViewModel
|
||||
import com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel.FingerprintGatekeeperViewModel
|
||||
import com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel.GatekeeperInfo
|
||||
import com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel.NavState
|
||||
import com.android.settings.testutils2.FakeFingerprintManagerInteractor
|
||||
import com.google.common.truth.Truth.assertThat
|
||||
import kotlinx.coroutines.Dispatchers
|
||||
import kotlinx.coroutines.launch
|
||||
import kotlinx.coroutines.test.StandardTestDispatcher
|
||||
import kotlinx.coroutines.test.TestScope
|
||||
import kotlinx.coroutines.test.resetMain
|
||||
import kotlinx.coroutines.test.runCurrent
|
||||
import kotlinx.coroutines.test.runTest
|
||||
import kotlinx.coroutines.test.setMain
|
||||
import org.junit.After
|
||||
import org.junit.Before
|
||||
import org.junit.Rule
|
||||
import org.junit.Test
|
||||
import org.junit.runner.RunWith
|
||||
import org.mockito.junit.MockitoJUnit
|
||||
import org.mockito.junit.MockitoJUnitRunner
|
||||
|
||||
@RunWith(MockitoJUnitRunner::class)
|
||||
class FingerprintEnrollEnrollingViewModelTest {
|
||||
@JvmField @Rule var rule = MockitoJUnit.rule()
|
||||
|
||||
@get:Rule val instantTaskRule = InstantTaskExecutorRule()
|
||||
|
||||
private var backgroundDispatcher = StandardTestDispatcher()
|
||||
private lateinit var enrollEnrollingViewModel: FingerprintEnrollEnrollingViewModel
|
||||
private lateinit var backgroundViewModel: BackgroundViewModel
|
||||
private lateinit var gateKeeperViewModel: FingerprintGatekeeperViewModel
|
||||
private lateinit var navigationViewModel: FingerprintEnrollNavigationViewModel
|
||||
private val defaultGatekeeperInfo = GatekeeperInfo.GatekeeperPasswordInfo(byteArrayOf(1, 3), 3)
|
||||
private var testScope = TestScope(backgroundDispatcher)
|
||||
|
||||
private lateinit var fakeFingerprintManagerInteractor: FakeFingerprintManagerInteractor
|
||||
|
||||
private fun initialize(gatekeeperInfo: GatekeeperInfo = defaultGatekeeperInfo) {
|
||||
fakeFingerprintManagerInteractor = FakeFingerprintManagerInteractor()
|
||||
gateKeeperViewModel =
|
||||
FingerprintGatekeeperViewModel.FingerprintGatekeeperViewModelFactory(
|
||||
gatekeeperInfo,
|
||||
fakeFingerprintManagerInteractor
|
||||
)
|
||||
.create(FingerprintGatekeeperViewModel::class.java)
|
||||
|
||||
navigationViewModel =
|
||||
FingerprintEnrollNavigationViewModel(
|
||||
backgroundDispatcher,
|
||||
fakeFingerprintManagerInteractor,
|
||||
gateKeeperViewModel,
|
||||
Enrollment,
|
||||
NavState(true),
|
||||
Default,
|
||||
)
|
||||
|
||||
backgroundViewModel =
|
||||
BackgroundViewModel.BackgroundViewModelFactory().create(BackgroundViewModel::class.java)
|
||||
backgroundViewModel.inForeground()
|
||||
val fingerprintEnrollViewModel =
|
||||
FingerprintEnrollViewModel.FingerprintEnrollViewModelFactory(
|
||||
fakeFingerprintManagerInteractor,
|
||||
gateKeeperViewModel,
|
||||
navigationViewModel,
|
||||
)
|
||||
.create(FingerprintEnrollViewModel::class.java)
|
||||
enrollEnrollingViewModel =
|
||||
FingerprintEnrollEnrollingViewModel.FingerprintEnrollEnrollingViewModelFactory(
|
||||
fingerprintEnrollViewModel,
|
||||
backgroundViewModel,
|
||||
)
|
||||
.create(FingerprintEnrollEnrollingViewModel::class.java)
|
||||
}
|
||||
|
||||
@Before
|
||||
fun setup() {
|
||||
Dispatchers.setMain(backgroundDispatcher)
|
||||
initialize()
|
||||
}
|
||||
|
||||
@After
|
||||
fun tearDown() {
|
||||
Dispatchers.resetMain()
|
||||
}
|
||||
|
||||
@Test
|
||||
fun testEnrollShouldBeFalse() =
|
||||
testScope.runTest {
|
||||
var shouldEnroll = false
|
||||
|
||||
val job = launch {
|
||||
enrollEnrollingViewModel.enrollFlowShouldBeRunning.collect { shouldEnroll = it }
|
||||
}
|
||||
|
||||
assertThat(shouldEnroll).isFalse()
|
||||
runCurrent()
|
||||
|
||||
enrollEnrollingViewModel.canEnroll()
|
||||
runCurrent()
|
||||
|
||||
assertThat(shouldEnroll).isTrue()
|
||||
job.cancel()
|
||||
}
|
||||
|
||||
@Test
|
||||
fun testEnrollShouldBeFalseWhenBackground() =
|
||||
testScope.runTest {
|
||||
var shouldEnroll = false
|
||||
|
||||
val job = launch {
|
||||
enrollEnrollingViewModel.enrollFlowShouldBeRunning.collect { shouldEnroll = it }
|
||||
}
|
||||
|
||||
assertThat(shouldEnroll).isFalse()
|
||||
runCurrent()
|
||||
|
||||
enrollEnrollingViewModel.canEnroll()
|
||||
runCurrent()
|
||||
|
||||
assertThat(shouldEnroll).isTrue()
|
||||
|
||||
backgroundViewModel.wentToBackground()
|
||||
runCurrent()
|
||||
assertThat(shouldEnroll).isFalse()
|
||||
|
||||
job.cancel()
|
||||
}
|
||||
}
|
||||
@@ -18,7 +18,7 @@ package com.android.settings.fingerprint2.ui.settings
|
||||
|
||||
import androidx.arch.core.executor.testing.InstantTaskExecutorRule
|
||||
import com.android.settings.biometrics.BiometricEnrollBase
|
||||
import com.android.settings.biometrics.fingerprint2.shared.model.FingerprintViewModel
|
||||
import com.android.settings.biometrics.fingerprint2.shared.model.FingerprintData
|
||||
import com.android.settings.biometrics.fingerprint2.ui.settings.viewmodel.EnrollFirstFingerprint
|
||||
import com.android.settings.biometrics.fingerprint2.ui.settings.viewmodel.FingerprintSettingsNavigationViewModel
|
||||
import com.android.settings.biometrics.fingerprint2.ui.settings.viewmodel.FinishSettings
|
||||
@@ -208,7 +208,7 @@ class FingerprintSettingsNavigationViewModelTest {
|
||||
fun enrollAdditionalFingerprints_fails() =
|
||||
testScope.runTest {
|
||||
fakeFingerprintManagerInteractor.enrolledFingerprintsInternal =
|
||||
mutableListOf(FingerprintViewModel("a", 1, 3L))
|
||||
mutableListOf(FingerprintData("a", 1, 3L))
|
||||
fakeFingerprintManagerInteractor.challengeToGenerate = Pair(4L, byteArrayOf(3, 3, 1))
|
||||
|
||||
var nextStep: NextStepViewModel? = null
|
||||
@@ -227,7 +227,7 @@ class FingerprintSettingsNavigationViewModelTest {
|
||||
fun enrollAdditional_success() =
|
||||
testScope.runTest {
|
||||
fakeFingerprintManagerInteractor.enrolledFingerprintsInternal =
|
||||
mutableListOf(FingerprintViewModel("a", 1, 3L))
|
||||
mutableListOf(FingerprintData("a", 1, 3L))
|
||||
|
||||
var nextStep: NextStepViewModel? = null
|
||||
val job = launch { underTest.nextStep.collect { nextStep = it } }
|
||||
@@ -245,7 +245,7 @@ class FingerprintSettingsNavigationViewModelTest {
|
||||
fun confirmDeviceCredential_withEnrolledFingerprint_showsSettings() =
|
||||
testScope.runTest {
|
||||
fakeFingerprintManagerInteractor.enrolledFingerprintsInternal =
|
||||
mutableListOf(FingerprintViewModel("a", 1, 3L))
|
||||
mutableListOf(FingerprintData("a", 1, 3L))
|
||||
fakeFingerprintManagerInteractor.challengeToGenerate = Pair(10L, byteArrayOf(1, 2, 3))
|
||||
|
||||
var nextStep: NextStepViewModel? = null
|
||||
@@ -320,7 +320,7 @@ class FingerprintSettingsNavigationViewModelTest {
|
||||
fun showSettings_shouldFinish() =
|
||||
testScope.runTest {
|
||||
fakeFingerprintManagerInteractor.enrolledFingerprintsInternal =
|
||||
mutableListOf(FingerprintViewModel("a", 1, 3L))
|
||||
mutableListOf(FingerprintData("a", 1, 3L))
|
||||
|
||||
var nextStep: NextStepViewModel? = null
|
||||
val job = launch { underTest.nextStep.collect { nextStep = it } }
|
||||
|
||||
@@ -17,8 +17,8 @@
|
||||
package com.android.settings.fingerprint2.ui.settings
|
||||
|
||||
import androidx.arch.core.executor.testing.InstantTaskExecutorRule
|
||||
import com.android.settings.biometrics.fingerprint2.shared.model.FingerprintAuthAttemptViewModel
|
||||
import com.android.settings.biometrics.fingerprint2.shared.model.FingerprintViewModel
|
||||
import com.android.settings.biometrics.fingerprint2.shared.model.FingerprintAuthAttemptModel
|
||||
import com.android.settings.biometrics.fingerprint2.shared.model.FingerprintData
|
||||
import com.android.settings.biometrics.fingerprint2.ui.settings.viewmodel.FingerprintSettingsNavigationViewModel
|
||||
import com.android.settings.biometrics.fingerprint2.ui.settings.viewmodel.FingerprintSettingsViewModel
|
||||
import com.android.settings.biometrics.fingerprint2.ui.settings.viewmodel.PreferenceViewModel
|
||||
@@ -103,7 +103,7 @@ class FingerprintSettingsViewModelTest {
|
||||
FingerprintSensorType.UDFPS_OPTICAL,
|
||||
)
|
||||
fakeFingerprintManagerInteractor.enrolledFingerprintsInternal =
|
||||
mutableListOf(FingerprintViewModel("a", 1, 3L))
|
||||
mutableListOf(FingerprintData("a", 1, 3L))
|
||||
|
||||
underTest =
|
||||
FingerprintSettingsViewModel.FingerprintSettingsViewModelFactory(
|
||||
@@ -114,7 +114,7 @@ class FingerprintSettingsViewModelTest {
|
||||
)
|
||||
.create(FingerprintSettingsViewModel::class.java)
|
||||
|
||||
var authAttempt: FingerprintAuthAttemptViewModel? = null
|
||||
var authAttempt: FingerprintAuthAttemptModel? = null
|
||||
val job = launch { underTest.authFlow.take(5).collectLatest { authAttempt = it } }
|
||||
|
||||
underTest.shouldAuthenticate(true)
|
||||
@@ -139,7 +139,7 @@ class FingerprintSettingsViewModelTest {
|
||||
FingerprintSensorType.UDFPS_ULTRASONIC,
|
||||
)
|
||||
fakeFingerprintManagerInteractor.enrolledFingerprintsInternal =
|
||||
mutableListOf(FingerprintViewModel("a", 1, 3L))
|
||||
mutableListOf(FingerprintData("a", 1, 3L))
|
||||
|
||||
underTest =
|
||||
FingerprintSettingsViewModel.FingerprintSettingsViewModelFactory(
|
||||
@@ -150,7 +150,7 @@ class FingerprintSettingsViewModelTest {
|
||||
)
|
||||
.create(FingerprintSettingsViewModel::class.java)
|
||||
|
||||
var authAttempt: FingerprintAuthAttemptViewModel? = null
|
||||
var authAttempt: FingerprintAuthAttemptModel? = null
|
||||
val job = launch { underTest.authFlow.take(5).collectLatest { authAttempt = it } }
|
||||
|
||||
underTest.shouldAuthenticate(true)
|
||||
@@ -173,8 +173,8 @@ class FingerprintSettingsViewModelTest {
|
||||
FingerprintSensorType.POWER_BUTTON
|
||||
)
|
||||
fakeFingerprintManagerInteractor.enrolledFingerprintsInternal =
|
||||
mutableListOf(FingerprintViewModel("a", 1, 3L))
|
||||
val success = FingerprintAuthAttemptViewModel.Success(1)
|
||||
mutableListOf(FingerprintData("a", 1, 3L))
|
||||
val success = FingerprintAuthAttemptModel.Success(1)
|
||||
fakeFingerprintManagerInteractor.authenticateAttempt = success
|
||||
|
||||
underTest =
|
||||
@@ -186,7 +186,7 @@ class FingerprintSettingsViewModelTest {
|
||||
)
|
||||
.create(FingerprintSettingsViewModel::class.java)
|
||||
|
||||
var authAttempt: FingerprintAuthAttemptViewModel? = null
|
||||
var authAttempt: FingerprintAuthAttemptModel? = null
|
||||
|
||||
val job = launch { underTest.authFlow.take(5).collectLatest { authAttempt = it } }
|
||||
underTest.shouldAuthenticate(true)
|
||||
@@ -200,7 +200,7 @@ class FingerprintSettingsViewModelTest {
|
||||
|
||||
@Test
|
||||
fun deleteDialog_showAndDismiss() = runTest {
|
||||
val fingerprintToDelete = FingerprintViewModel("A", 1, 10L)
|
||||
val fingerprintToDelete = FingerprintData("A", 1, 10L)
|
||||
fakeFingerprintManagerInteractor.enrolledFingerprintsInternal =
|
||||
mutableListOf(fingerprintToDelete)
|
||||
|
||||
@@ -236,7 +236,7 @@ class FingerprintSettingsViewModelTest {
|
||||
|
||||
@Test
|
||||
fun renameDialog_showAndDismiss() = runTest {
|
||||
val fingerprintToRename = FingerprintViewModel("World", 1, 10L)
|
||||
val fingerprintToRename = FingerprintData("World", 1, 10L)
|
||||
fakeFingerprintManagerInteractor.enrolledFingerprintsInternal =
|
||||
mutableListOf(fingerprintToRename)
|
||||
|
||||
@@ -274,7 +274,7 @@ class FingerprintSettingsViewModelTest {
|
||||
|
||||
@Test
|
||||
fun testTwoDialogsCannotShow_atSameTime() = runTest {
|
||||
val fingerprintToDelete = FingerprintViewModel("A", 1, 10L)
|
||||
val fingerprintToDelete = FingerprintData("A", 1, 10L)
|
||||
fakeFingerprintManagerInteractor.enrolledFingerprintsInternal =
|
||||
mutableListOf(fingerprintToDelete)
|
||||
|
||||
@@ -311,9 +311,9 @@ class FingerprintSettingsViewModelTest {
|
||||
fun authenticatePauses_whenPaused() =
|
||||
testScope.runTest {
|
||||
val fingerprints = setupAuth()
|
||||
val success = FingerprintAuthAttemptViewModel.Success(fingerprints.first().fingerId)
|
||||
val success = FingerprintAuthAttemptModel.Success(fingerprints.first().fingerId)
|
||||
|
||||
var authAttempt: FingerprintAuthAttemptViewModel? = null
|
||||
var authAttempt: FingerprintAuthAttemptModel? = null
|
||||
|
||||
val job = launch { underTest.authFlow.take(5).collectLatest { authAttempt = it } }
|
||||
|
||||
@@ -325,7 +325,7 @@ class FingerprintSettingsViewModelTest {
|
||||
assertThat(authAttempt).isEqualTo(success)
|
||||
|
||||
fakeFingerprintManagerInteractor.authenticateAttempt =
|
||||
FingerprintAuthAttemptViewModel.Success(10)
|
||||
FingerprintAuthAttemptModel.Success(10)
|
||||
underTest.shouldAuthenticate(false)
|
||||
advanceTimeBy(400)
|
||||
runCurrent()
|
||||
@@ -340,7 +340,7 @@ class FingerprintSettingsViewModelTest {
|
||||
testScope.runTest {
|
||||
val fingerprints = setupAuth()
|
||||
|
||||
var authAttempt: FingerprintAuthAttemptViewModel? = null
|
||||
var authAttempt: FingerprintAuthAttemptModel? = null
|
||||
val job = launch { underTest.authFlow.take(1).collectLatest { authAttempt = it } }
|
||||
underTest.shouldAuthenticate(true)
|
||||
navigationViewModel.onConfirmDevice(true, 10L)
|
||||
@@ -357,7 +357,7 @@ class FingerprintSettingsViewModelTest {
|
||||
testScope.runTest {
|
||||
val fingerprints = setupAuth()
|
||||
|
||||
var authAttempt: FingerprintAuthAttemptViewModel? = null
|
||||
var authAttempt: FingerprintAuthAttemptModel? = null
|
||||
val job = launch { underTest.authFlow.take(1).collectLatest { authAttempt = it } }
|
||||
underTest.shouldAuthenticate(true)
|
||||
navigationViewModel.onConfirmDevice(true, 10L)
|
||||
@@ -370,7 +370,7 @@ class FingerprintSettingsViewModelTest {
|
||||
assertThat(authAttempt).isEqualTo(null)
|
||||
}
|
||||
|
||||
private fun setupAuth(): MutableList<FingerprintViewModel> {
|
||||
private fun setupAuth(): MutableList<FingerprintData> {
|
||||
fakeFingerprintManagerInteractor.sensorProp =
|
||||
FingerprintSensor(
|
||||
0 /* sensorId */,
|
||||
@@ -379,9 +379,9 @@ class FingerprintSettingsViewModelTest {
|
||||
FingerprintSensorType.POWER_BUTTON
|
||||
)
|
||||
val fingerprints =
|
||||
mutableListOf(FingerprintViewModel("a", 1, 3L), FingerprintViewModel("b", 2, 5L))
|
||||
mutableListOf(FingerprintData("a", 1, 3L), FingerprintData("b", 2, 5L))
|
||||
fakeFingerprintManagerInteractor.enrolledFingerprintsInternal = fingerprints
|
||||
val success = FingerprintAuthAttemptViewModel.Success(1)
|
||||
val success = FingerprintAuthAttemptModel.Success(1)
|
||||
fakeFingerprintManagerInteractor.authenticateAttempt = success
|
||||
|
||||
underTest =
|
||||
|
||||
Reference in New Issue
Block a user