1 package com.example.android.fingerprintdialog; 2 3 import org.junit.Before; 4 import org.junit.Test; 5 import org.junit.runner.RunWith; 6 import org.mockito.ArgumentCaptor; 7 import org.mockito.Captor; 8 import org.mockito.InjectMocks; 9 import org.mockito.Mock; 10 import org.mockito.runners.MockitoJUnitRunner; 11 12 import android.content.res.Resources; 13 import android.hardware.fingerprint.FingerprintManager; 14 import android.os.CancellationSignal; 15 import android.os.Handler; 16 import android.widget.ImageView; 17 import android.widget.TextView; 18 19 import static org.mockito.Matchers.any; 20 import static org.mockito.Matchers.eq; 21 import static org.mockito.Matchers.isA; 22 import static org.mockito.Mockito.never; 23 import static org.mockito.Mockito.verify; 24 import static org.mockito.Mockito.when; 25 26 /** 27 * Unit tests for {@link FingerprintUiHelper}. 28 */ 29 @RunWith(MockitoJUnitRunner.class) 30 public class FingerprintUiHelperTest { 31 32 private static final int ERROR_MSG_ID = 1; 33 private static final CharSequence ERR_STRING = "ERROR_STRING"; 34 private static final int HINT_COLOR = 10; 35 36 @Mock private FingerprintManager mockFingerprintManager; 37 @Mock private ImageView mockIcon; 38 @Mock private TextView mockTextView; 39 @Mock private FingerprintUiHelper.Callback mockCallback; 40 @Mock private FingerprintManager.CryptoObject mockCryptoObject; 41 @Mock private Resources mockResources; 42 43 @Captor private ArgumentCaptor<Runnable> mRunnableArgumentCaptor; 44 45 @InjectMocks private FingerprintUiHelper.FingerprintUiHelperBuilder mockBuilder; 46 47 private FingerprintUiHelper mFingerprintUiHelper; 48 49 @Before 50 public void setUp() { 51 mFingerprintUiHelper = mockBuilder.build(mockIcon, mockTextView, mockCallback); 52 53 when(mockFingerprintManager.isHardwareDetected()).thenReturn(true); 54 when(mockFingerprintManager.hasEnrolledFingerprints()).thenReturn(true); 55 when(mockTextView.getResources()).thenReturn(mockResources); 56 when(mockResources.getColor(R.color.hint_color, null)).thenReturn(HINT_COLOR); 57 } 58 59 @Test 60 public void testStartListening_fingerprintAuthAvailable() { 61 mFingerprintUiHelper.startListening(mockCryptoObject); 62 63 verify(mockFingerprintManager).authenticate(eq(mockCryptoObject), 64 isA(CancellationSignal.class), eq(0), eq(mFingerprintUiHelper), 65 any(Handler.class)); 66 verify(mockIcon).setImageResource(R.drawable.ic_fp_40px); 67 } 68 69 @Test 70 public void testStartListening_fingerprintAuthNotAvailable() { 71 when(mockFingerprintManager.isHardwareDetected()).thenReturn(false); 72 73 mFingerprintUiHelper.startListening(mockCryptoObject); 74 75 verify(mockFingerprintManager, never()).authenticate( 76 any(FingerprintManager.CryptoObject.class), any(CancellationSignal.class), eq(0), 77 any(FingerprintUiHelper.class), any(Handler.class)); 78 } 79 80 @Test 81 public void testOnAuthenticationError() { 82 mFingerprintUiHelper.mSelfCancelled = false; 83 84 mFingerprintUiHelper.onAuthenticationError(ERROR_MSG_ID, ERR_STRING); 85 86 verify(mockIcon).setImageResource(R.drawable.ic_fingerprint_error); 87 verify(mockTextView).removeCallbacks(mFingerprintUiHelper.mResetErrorTextRunnable); 88 verify(mockTextView).postDelayed(mFingerprintUiHelper.mResetErrorTextRunnable, 89 FingerprintUiHelper.ERROR_TIMEOUT_MILLIS); 90 verify(mockIcon).postDelayed(mRunnableArgumentCaptor.capture(), 91 eq(FingerprintUiHelper.ERROR_TIMEOUT_MILLIS)); 92 93 mRunnableArgumentCaptor.getValue().run(); 94 95 verify(mockCallback).onError(); 96 } 97 98 @Test 99 public void testOnAuthenticationSucceeded() { 100 mFingerprintUiHelper.onAuthenticationSucceeded(null); 101 102 verify(mockIcon).setImageResource(R.drawable.ic_fingerprint_success); 103 verify(mockTextView).removeCallbacks(mFingerprintUiHelper.mResetErrorTextRunnable); 104 verify(mockIcon).postDelayed(mRunnableArgumentCaptor.capture(), 105 eq(FingerprintUiHelper.SUCCESS_DELAY_MILLIS)); 106 107 mRunnableArgumentCaptor.getValue().run(); 108 109 verify(mockCallback).onAuthenticated(); 110 } 111 } 112