Loading packages/SystemUI/tests/src/com/android/systemui/biometrics/AuthContainerViewTest.kt +49 −42 Original line number Original line Diff line number Diff line Loading @@ -41,7 +41,7 @@ import com.android.systemui.R import com.android.systemui.SysuiTestCase import com.android.systemui.SysuiTestCase import com.android.systemui.keyguard.WakefulnessLifecycle import com.android.systemui.keyguard.WakefulnessLifecycle import com.google.common.truth.Truth.assertThat import com.google.common.truth.Truth.assertThat import org.junit.Ignore import org.junit.After import org.junit.Rule import org.junit.Rule import org.junit.Test import org.junit.Test import org.junit.runner.RunWith import org.junit.runner.RunWith Loading @@ -52,7 +52,6 @@ import org.mockito.Mockito.verify import org.mockito.junit.MockitoJUnit import org.mockito.junit.MockitoJUnit import org.mockito.Mockito.`when` as whenever import org.mockito.Mockito.`when` as whenever @Ignore @RunWith(AndroidTestingRunner::class) @RunWith(AndroidTestingRunner::class) @RunWithLooper @RunWithLooper @SmallTest @SmallTest Loading @@ -72,12 +71,19 @@ class AuthContainerViewTest : SysuiTestCase() { @Mock @Mock lateinit var windowToken: IBinder lateinit var windowToken: IBinder private lateinit var authContainer: TestAuthContainerView private var authContainer: TestAuthContainerView? = null @After fun tearDown() { if (authContainer?.isAttachedToWindow == true) { ViewUtils.detachView(authContainer) } } @Test @Test fun testActionAuthenticated_sendsDismissedAuthenticated() { fun testActionAuthenticated_sendsDismissedAuthenticated() { initializeContainer(BiometricManager.Authenticators.BIOMETRIC_WEAK) val container = initializeContainer(BiometricManager.Authenticators.BIOMETRIC_WEAK) authContainer.mBiometricCallback.onAction( container.mBiometricCallback.onAction( AuthBiometricView.Callback.ACTION_AUTHENTICATED AuthBiometricView.Callback.ACTION_AUTHENTICATED ) ) waitForIdleSync() waitForIdleSync() Loading @@ -86,13 +92,13 @@ class AuthContainerViewTest : SysuiTestCase() { eq(AuthDialogCallback.DISMISSED_BIOMETRIC_AUTHENTICATED), eq(AuthDialogCallback.DISMISSED_BIOMETRIC_AUTHENTICATED), eq<ByteArray?>(null) /* credentialAttestation */ eq<ByteArray?>(null) /* credentialAttestation */ ) ) assertThat(authContainer.parent).isNull() assertThat(container.parent).isNull() } } @Test @Test fun testActionUserCanceled_sendsDismissedUserCanceled() { fun testActionUserCanceled_sendsDismissedUserCanceled() { initializeContainer(BiometricManager.Authenticators.BIOMETRIC_WEAK) val container = initializeContainer(BiometricManager.Authenticators.BIOMETRIC_WEAK) authContainer.mBiometricCallback.onAction( container.mBiometricCallback.onAction( AuthBiometricView.Callback.ACTION_USER_CANCELED AuthBiometricView.Callback.ACTION_USER_CANCELED ) ) waitForIdleSync() waitForIdleSync() Loading @@ -104,13 +110,13 @@ class AuthContainerViewTest : SysuiTestCase() { eq(AuthDialogCallback.DISMISSED_USER_CANCELED), eq(AuthDialogCallback.DISMISSED_USER_CANCELED), eq<ByteArray?>(null) /* credentialAttestation */ eq<ByteArray?>(null) /* credentialAttestation */ ) ) assertThat(authContainer.parent).isNull() assertThat(container.parent).isNull() } } @Test @Test fun testActionButtonNegative_sendsDismissedButtonNegative() { fun testActionButtonNegative_sendsDismissedButtonNegative() { initializeContainer(BiometricManager.Authenticators.BIOMETRIC_WEAK) val container = initializeContainer(BiometricManager.Authenticators.BIOMETRIC_WEAK) authContainer.mBiometricCallback.onAction( container.mBiometricCallback.onAction( AuthBiometricView.Callback.ACTION_BUTTON_NEGATIVE AuthBiometricView.Callback.ACTION_BUTTON_NEGATIVE ) ) waitForIdleSync() waitForIdleSync() Loading @@ -119,13 +125,13 @@ class AuthContainerViewTest : SysuiTestCase() { eq(AuthDialogCallback.DISMISSED_BUTTON_NEGATIVE), eq(AuthDialogCallback.DISMISSED_BUTTON_NEGATIVE), eq<ByteArray?>(null) /* credentialAttestation */ eq<ByteArray?>(null) /* credentialAttestation */ ) ) assertThat(authContainer.parent).isNull() assertThat(container.parent).isNull() } } @Test @Test fun testActionTryAgain_sendsTryAgain() { fun testActionTryAgain_sendsTryAgain() { initializeContainer(BiometricManager.Authenticators.BIOMETRIC_WEAK) val container = initializeContainer(BiometricManager.Authenticators.BIOMETRIC_WEAK) authContainer.mBiometricCallback.onAction( container.mBiometricCallback.onAction( AuthBiometricView.Callback.ACTION_BUTTON_TRY_AGAIN AuthBiometricView.Callback.ACTION_BUTTON_TRY_AGAIN ) ) waitForIdleSync() waitForIdleSync() Loading @@ -135,8 +141,8 @@ class AuthContainerViewTest : SysuiTestCase() { @Test @Test fun testActionError_sendsDismissedError() { fun testActionError_sendsDismissedError() { initializeContainer(BiometricManager.Authenticators.BIOMETRIC_WEAK) val container = initializeContainer(BiometricManager.Authenticators.BIOMETRIC_WEAK) authContainer.mBiometricCallback.onAction( authContainer!!.mBiometricCallback.onAction( AuthBiometricView.Callback.ACTION_ERROR AuthBiometricView.Callback.ACTION_ERROR ) ) waitForIdleSync() waitForIdleSync() Loading @@ -145,53 +151,53 @@ class AuthContainerViewTest : SysuiTestCase() { eq(AuthDialogCallback.DISMISSED_ERROR), eq(AuthDialogCallback.DISMISSED_ERROR), eq<ByteArray?>(null) /* credentialAttestation */ eq<ByteArray?>(null) /* credentialAttestation */ ) ) assertThat(authContainer.parent).isNull() assertThat(authContainer!!.parent).isNull() } } @Test @Test fun testActionUseDeviceCredential_sendsOnDeviceCredentialPressed() { fun testActionUseDeviceCredential_sendsOnDeviceCredentialPressed() { initializeContainer( val container = initializeContainer( BiometricManager.Authenticators.BIOMETRIC_WEAK or BiometricManager.Authenticators.BIOMETRIC_WEAK or BiometricManager.Authenticators.DEVICE_CREDENTIAL BiometricManager.Authenticators.DEVICE_CREDENTIAL ) ) authContainer.mBiometricCallback.onAction( container.mBiometricCallback.onAction( AuthBiometricView.Callback.ACTION_USE_DEVICE_CREDENTIAL AuthBiometricView.Callback.ACTION_USE_DEVICE_CREDENTIAL ) ) waitForIdleSync() waitForIdleSync() verify(callback).onDeviceCredentialPressed() verify(callback).onDeviceCredentialPressed() assertThat(authContainer.hasCredentialView()).isTrue() assertThat(container.hasCredentialView()).isTrue() } } @Test @Test fun testAnimateToCredentialUI_invokesStartTransitionToCredentialUI() { fun testAnimateToCredentialUI_invokesStartTransitionToCredentialUI() { initializeContainer( val container = initializeContainer( BiometricManager.Authenticators.BIOMETRIC_WEAK or BiometricManager.Authenticators.BIOMETRIC_WEAK or BiometricManager.Authenticators.DEVICE_CREDENTIAL BiometricManager.Authenticators.DEVICE_CREDENTIAL ) ) authContainer.animateToCredentialUI() container.animateToCredentialUI() waitForIdleSync() waitForIdleSync() assertThat(authContainer.hasCredentialView()).isTrue() assertThat(container.hasCredentialView()).isTrue() } } @Test @Test fun testShowBiometricUI() { fun testShowBiometricUI() { initializeContainer(BiometricManager.Authenticators.BIOMETRIC_WEAK) val container = initializeContainer(BiometricManager.Authenticators.BIOMETRIC_WEAK) waitForIdleSync() waitForIdleSync() assertThat(authContainer.hasCredentialView()).isFalse() assertThat(container.hasCredentialView()).isFalse() assertThat(authContainer.hasBiometricPrompt()).isTrue() assertThat(container.hasBiometricPrompt()).isTrue() } } @Test @Test fun testShowCredentialUI() { fun testShowCredentialUI() { initializeContainer(BiometricManager.Authenticators.DEVICE_CREDENTIAL) val container = initializeContainer(BiometricManager.Authenticators.DEVICE_CREDENTIAL) waitForIdleSync() waitForIdleSync() assertThat(authContainer.hasCredentialView()).isTrue() assertThat(container.hasCredentialView()).isTrue() assertThat(authContainer.hasBiometricPrompt()).isFalse() assertThat(container.hasBiometricPrompt()).isFalse() } } @Test @Test Loading @@ -201,11 +207,11 @@ class AuthContainerViewTest : SysuiTestCase() { DevicePolicyManager.PASSWORD_QUALITY_SOMETHING DevicePolicyManager.PASSWORD_QUALITY_SOMETHING ) ) initializeContainer(BiometricManager.Authenticators.DEVICE_CREDENTIAL) val container = initializeContainer(BiometricManager.Authenticators.DEVICE_CREDENTIAL) waitForIdleSync() waitForIdleSync() assertThat(authContainer.hasCredentialPatternView()).isTrue() assertThat(container.hasCredentialPatternView()).isTrue() assertThat(authContainer.hasBiometricPrompt()).isFalse() assertThat(container.hasBiometricPrompt()).isFalse() } } @Test @Test Loading @@ -218,20 +224,20 @@ class AuthContainerViewTest : SysuiTestCase() { // In the credential view, clicking on the background (to cancel authentication) is not // In the credential view, clicking on the background (to cancel authentication) is not // valid. Thus, the listener should be null, and it should not be in the accessibility // valid. Thus, the listener should be null, and it should not be in the accessibility // hierarchy. // hierarchy. initializeContainer(BiometricManager.Authenticators.DEVICE_CREDENTIAL) val container = initializeContainer(BiometricManager.Authenticators.DEVICE_CREDENTIAL) waitForIdleSync() waitForIdleSync() assertThat(authContainer.hasCredentialPasswordView()).isTrue() assertThat(container.hasCredentialPasswordView()).isTrue() assertThat(authContainer.hasBiometricPrompt()).isFalse() assertThat(container.hasBiometricPrompt()).isFalse() assertThat( assertThat( authContainer.findViewById<View>(R.id.background)?.isImportantForAccessibility container.findViewById<View>(R.id.background)?.isImportantForAccessibility ).isFalse() ).isFalse() authContainer.findViewById<View>(R.id.background)?.performClick() container.findViewById<View>(R.id.background)?.performClick() waitForIdleSync() waitForIdleSync() assertThat(authContainer.hasCredentialPasswordView()).isTrue() assertThat(container.hasCredentialPasswordView()).isTrue() assertThat(authContainer.hasBiometricPrompt()).isFalse() assertThat(container.hasBiometricPrompt()).isFalse() } } @Test @Test Loading @@ -246,7 +252,7 @@ class AuthContainerViewTest : SysuiTestCase() { assertThat((layoutParams.fitInsetsTypes and WindowInsets.Type.ime()) == 0).isTrue() assertThat((layoutParams.fitInsetsTypes and WindowInsets.Type.ime()) == 0).isTrue() } } private fun initializeContainer(authenticators: Int) { private fun initializeContainer(authenticators: Int): TestAuthContainerView { val config = AuthContainerView.Config() val config = AuthContainerView.Config() config.mContext = mContext config.mContext = mContext config.mCallback = callback config.mCallback = callback Loading Loading @@ -286,6 +292,7 @@ class AuthContainerViewTest : SysuiTestCase() { Handler(TestableLooper.get(this).looper) Handler(TestableLooper.get(this).looper) ) ) ViewUtils.attachView(authContainer) ViewUtils.attachView(authContainer) return authContainer!! } } private inner class TestAuthContainerView( private inner class TestAuthContainerView( Loading Loading
packages/SystemUI/tests/src/com/android/systemui/biometrics/AuthContainerViewTest.kt +49 −42 Original line number Original line Diff line number Diff line Loading @@ -41,7 +41,7 @@ import com.android.systemui.R import com.android.systemui.SysuiTestCase import com.android.systemui.SysuiTestCase import com.android.systemui.keyguard.WakefulnessLifecycle import com.android.systemui.keyguard.WakefulnessLifecycle import com.google.common.truth.Truth.assertThat import com.google.common.truth.Truth.assertThat import org.junit.Ignore import org.junit.After import org.junit.Rule import org.junit.Rule import org.junit.Test import org.junit.Test import org.junit.runner.RunWith import org.junit.runner.RunWith Loading @@ -52,7 +52,6 @@ import org.mockito.Mockito.verify import org.mockito.junit.MockitoJUnit import org.mockito.junit.MockitoJUnit import org.mockito.Mockito.`when` as whenever import org.mockito.Mockito.`when` as whenever @Ignore @RunWith(AndroidTestingRunner::class) @RunWith(AndroidTestingRunner::class) @RunWithLooper @RunWithLooper @SmallTest @SmallTest Loading @@ -72,12 +71,19 @@ class AuthContainerViewTest : SysuiTestCase() { @Mock @Mock lateinit var windowToken: IBinder lateinit var windowToken: IBinder private lateinit var authContainer: TestAuthContainerView private var authContainer: TestAuthContainerView? = null @After fun tearDown() { if (authContainer?.isAttachedToWindow == true) { ViewUtils.detachView(authContainer) } } @Test @Test fun testActionAuthenticated_sendsDismissedAuthenticated() { fun testActionAuthenticated_sendsDismissedAuthenticated() { initializeContainer(BiometricManager.Authenticators.BIOMETRIC_WEAK) val container = initializeContainer(BiometricManager.Authenticators.BIOMETRIC_WEAK) authContainer.mBiometricCallback.onAction( container.mBiometricCallback.onAction( AuthBiometricView.Callback.ACTION_AUTHENTICATED AuthBiometricView.Callback.ACTION_AUTHENTICATED ) ) waitForIdleSync() waitForIdleSync() Loading @@ -86,13 +92,13 @@ class AuthContainerViewTest : SysuiTestCase() { eq(AuthDialogCallback.DISMISSED_BIOMETRIC_AUTHENTICATED), eq(AuthDialogCallback.DISMISSED_BIOMETRIC_AUTHENTICATED), eq<ByteArray?>(null) /* credentialAttestation */ eq<ByteArray?>(null) /* credentialAttestation */ ) ) assertThat(authContainer.parent).isNull() assertThat(container.parent).isNull() } } @Test @Test fun testActionUserCanceled_sendsDismissedUserCanceled() { fun testActionUserCanceled_sendsDismissedUserCanceled() { initializeContainer(BiometricManager.Authenticators.BIOMETRIC_WEAK) val container = initializeContainer(BiometricManager.Authenticators.BIOMETRIC_WEAK) authContainer.mBiometricCallback.onAction( container.mBiometricCallback.onAction( AuthBiometricView.Callback.ACTION_USER_CANCELED AuthBiometricView.Callback.ACTION_USER_CANCELED ) ) waitForIdleSync() waitForIdleSync() Loading @@ -104,13 +110,13 @@ class AuthContainerViewTest : SysuiTestCase() { eq(AuthDialogCallback.DISMISSED_USER_CANCELED), eq(AuthDialogCallback.DISMISSED_USER_CANCELED), eq<ByteArray?>(null) /* credentialAttestation */ eq<ByteArray?>(null) /* credentialAttestation */ ) ) assertThat(authContainer.parent).isNull() assertThat(container.parent).isNull() } } @Test @Test fun testActionButtonNegative_sendsDismissedButtonNegative() { fun testActionButtonNegative_sendsDismissedButtonNegative() { initializeContainer(BiometricManager.Authenticators.BIOMETRIC_WEAK) val container = initializeContainer(BiometricManager.Authenticators.BIOMETRIC_WEAK) authContainer.mBiometricCallback.onAction( container.mBiometricCallback.onAction( AuthBiometricView.Callback.ACTION_BUTTON_NEGATIVE AuthBiometricView.Callback.ACTION_BUTTON_NEGATIVE ) ) waitForIdleSync() waitForIdleSync() Loading @@ -119,13 +125,13 @@ class AuthContainerViewTest : SysuiTestCase() { eq(AuthDialogCallback.DISMISSED_BUTTON_NEGATIVE), eq(AuthDialogCallback.DISMISSED_BUTTON_NEGATIVE), eq<ByteArray?>(null) /* credentialAttestation */ eq<ByteArray?>(null) /* credentialAttestation */ ) ) assertThat(authContainer.parent).isNull() assertThat(container.parent).isNull() } } @Test @Test fun testActionTryAgain_sendsTryAgain() { fun testActionTryAgain_sendsTryAgain() { initializeContainer(BiometricManager.Authenticators.BIOMETRIC_WEAK) val container = initializeContainer(BiometricManager.Authenticators.BIOMETRIC_WEAK) authContainer.mBiometricCallback.onAction( container.mBiometricCallback.onAction( AuthBiometricView.Callback.ACTION_BUTTON_TRY_AGAIN AuthBiometricView.Callback.ACTION_BUTTON_TRY_AGAIN ) ) waitForIdleSync() waitForIdleSync() Loading @@ -135,8 +141,8 @@ class AuthContainerViewTest : SysuiTestCase() { @Test @Test fun testActionError_sendsDismissedError() { fun testActionError_sendsDismissedError() { initializeContainer(BiometricManager.Authenticators.BIOMETRIC_WEAK) val container = initializeContainer(BiometricManager.Authenticators.BIOMETRIC_WEAK) authContainer.mBiometricCallback.onAction( authContainer!!.mBiometricCallback.onAction( AuthBiometricView.Callback.ACTION_ERROR AuthBiometricView.Callback.ACTION_ERROR ) ) waitForIdleSync() waitForIdleSync() Loading @@ -145,53 +151,53 @@ class AuthContainerViewTest : SysuiTestCase() { eq(AuthDialogCallback.DISMISSED_ERROR), eq(AuthDialogCallback.DISMISSED_ERROR), eq<ByteArray?>(null) /* credentialAttestation */ eq<ByteArray?>(null) /* credentialAttestation */ ) ) assertThat(authContainer.parent).isNull() assertThat(authContainer!!.parent).isNull() } } @Test @Test fun testActionUseDeviceCredential_sendsOnDeviceCredentialPressed() { fun testActionUseDeviceCredential_sendsOnDeviceCredentialPressed() { initializeContainer( val container = initializeContainer( BiometricManager.Authenticators.BIOMETRIC_WEAK or BiometricManager.Authenticators.BIOMETRIC_WEAK or BiometricManager.Authenticators.DEVICE_CREDENTIAL BiometricManager.Authenticators.DEVICE_CREDENTIAL ) ) authContainer.mBiometricCallback.onAction( container.mBiometricCallback.onAction( AuthBiometricView.Callback.ACTION_USE_DEVICE_CREDENTIAL AuthBiometricView.Callback.ACTION_USE_DEVICE_CREDENTIAL ) ) waitForIdleSync() waitForIdleSync() verify(callback).onDeviceCredentialPressed() verify(callback).onDeviceCredentialPressed() assertThat(authContainer.hasCredentialView()).isTrue() assertThat(container.hasCredentialView()).isTrue() } } @Test @Test fun testAnimateToCredentialUI_invokesStartTransitionToCredentialUI() { fun testAnimateToCredentialUI_invokesStartTransitionToCredentialUI() { initializeContainer( val container = initializeContainer( BiometricManager.Authenticators.BIOMETRIC_WEAK or BiometricManager.Authenticators.BIOMETRIC_WEAK or BiometricManager.Authenticators.DEVICE_CREDENTIAL BiometricManager.Authenticators.DEVICE_CREDENTIAL ) ) authContainer.animateToCredentialUI() container.animateToCredentialUI() waitForIdleSync() waitForIdleSync() assertThat(authContainer.hasCredentialView()).isTrue() assertThat(container.hasCredentialView()).isTrue() } } @Test @Test fun testShowBiometricUI() { fun testShowBiometricUI() { initializeContainer(BiometricManager.Authenticators.BIOMETRIC_WEAK) val container = initializeContainer(BiometricManager.Authenticators.BIOMETRIC_WEAK) waitForIdleSync() waitForIdleSync() assertThat(authContainer.hasCredentialView()).isFalse() assertThat(container.hasCredentialView()).isFalse() assertThat(authContainer.hasBiometricPrompt()).isTrue() assertThat(container.hasBiometricPrompt()).isTrue() } } @Test @Test fun testShowCredentialUI() { fun testShowCredentialUI() { initializeContainer(BiometricManager.Authenticators.DEVICE_CREDENTIAL) val container = initializeContainer(BiometricManager.Authenticators.DEVICE_CREDENTIAL) waitForIdleSync() waitForIdleSync() assertThat(authContainer.hasCredentialView()).isTrue() assertThat(container.hasCredentialView()).isTrue() assertThat(authContainer.hasBiometricPrompt()).isFalse() assertThat(container.hasBiometricPrompt()).isFalse() } } @Test @Test Loading @@ -201,11 +207,11 @@ class AuthContainerViewTest : SysuiTestCase() { DevicePolicyManager.PASSWORD_QUALITY_SOMETHING DevicePolicyManager.PASSWORD_QUALITY_SOMETHING ) ) initializeContainer(BiometricManager.Authenticators.DEVICE_CREDENTIAL) val container = initializeContainer(BiometricManager.Authenticators.DEVICE_CREDENTIAL) waitForIdleSync() waitForIdleSync() assertThat(authContainer.hasCredentialPatternView()).isTrue() assertThat(container.hasCredentialPatternView()).isTrue() assertThat(authContainer.hasBiometricPrompt()).isFalse() assertThat(container.hasBiometricPrompt()).isFalse() } } @Test @Test Loading @@ -218,20 +224,20 @@ class AuthContainerViewTest : SysuiTestCase() { // In the credential view, clicking on the background (to cancel authentication) is not // In the credential view, clicking on the background (to cancel authentication) is not // valid. Thus, the listener should be null, and it should not be in the accessibility // valid. Thus, the listener should be null, and it should not be in the accessibility // hierarchy. // hierarchy. initializeContainer(BiometricManager.Authenticators.DEVICE_CREDENTIAL) val container = initializeContainer(BiometricManager.Authenticators.DEVICE_CREDENTIAL) waitForIdleSync() waitForIdleSync() assertThat(authContainer.hasCredentialPasswordView()).isTrue() assertThat(container.hasCredentialPasswordView()).isTrue() assertThat(authContainer.hasBiometricPrompt()).isFalse() assertThat(container.hasBiometricPrompt()).isFalse() assertThat( assertThat( authContainer.findViewById<View>(R.id.background)?.isImportantForAccessibility container.findViewById<View>(R.id.background)?.isImportantForAccessibility ).isFalse() ).isFalse() authContainer.findViewById<View>(R.id.background)?.performClick() container.findViewById<View>(R.id.background)?.performClick() waitForIdleSync() waitForIdleSync() assertThat(authContainer.hasCredentialPasswordView()).isTrue() assertThat(container.hasCredentialPasswordView()).isTrue() assertThat(authContainer.hasBiometricPrompt()).isFalse() assertThat(container.hasBiometricPrompt()).isFalse() } } @Test @Test Loading @@ -246,7 +252,7 @@ class AuthContainerViewTest : SysuiTestCase() { assertThat((layoutParams.fitInsetsTypes and WindowInsets.Type.ime()) == 0).isTrue() assertThat((layoutParams.fitInsetsTypes and WindowInsets.Type.ime()) == 0).isTrue() } } private fun initializeContainer(authenticators: Int) { private fun initializeContainer(authenticators: Int): TestAuthContainerView { val config = AuthContainerView.Config() val config = AuthContainerView.Config() config.mContext = mContext config.mContext = mContext config.mCallback = callback config.mCallback = callback Loading Loading @@ -286,6 +292,7 @@ class AuthContainerViewTest : SysuiTestCase() { Handler(TestableLooper.get(this).looper) Handler(TestableLooper.get(this).looper) ) ) ViewUtils.attachView(authContainer) ViewUtils.attachView(authContainer) return authContainer!! } } private inner class TestAuthContainerView( private inner class TestAuthContainerView( Loading