1 /*
2  * Copyright (C) 2021 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 package com.android.server.biometrics.sensors.face.hidl;
18 
19 import static junit.framework.Assert.assertEquals;
20 
21 import static org.mockito.ArgumentMatchers.anyInt;
22 import static org.mockito.ArgumentMatchers.eq;
23 import static org.mockito.Mockito.never;
24 import static org.mockito.Mockito.verify;
25 import static org.mockito.Mockito.when;
26 
27 import android.content.Context;
28 import android.hardware.biometrics.face.V1_0.IBiometricsFace;
29 import android.hardware.biometrics.face.V1_0.OptionalUint64;
30 import android.hardware.face.IFaceServiceReceiver;
31 import android.os.Binder;
32 import android.platform.test.annotations.Presubmit;
33 
34 import androidx.test.core.app.ApplicationProvider;
35 import androidx.test.filters.SmallTest;
36 
37 import com.android.server.biometrics.log.BiometricContext;
38 import com.android.server.biometrics.log.BiometricLogger;
39 import com.android.server.biometrics.sensors.ClientMonitorCallback;
40 import com.android.server.biometrics.sensors.ClientMonitorCallbackConverter;
41 
42 import org.junit.Before;
43 import org.junit.Test;
44 import org.mockito.Mock;
45 import org.mockito.MockitoAnnotations;
46 
47 @Presubmit
48 @SmallTest
49 public class FaceGenerateChallengeClientTest {
50 
51     private static final String TAG = "FaceGenerateChallengeClientTest";
52     private static final int USER_ID = 2;
53     private static final int SENSOR_ID = 4;
54     private static final long START_TIME = 5000;
55     private static final long CHALLENGE = 200;
56 
57     private final Context mContext = ApplicationProvider.getApplicationContext();
58 
59     @Mock
60     private IBiometricsFace mIBiometricsFace;
61     @Mock
62     private IFaceServiceReceiver mClientReceiver;
63     @Mock
64     private IFaceServiceReceiver mOtherReceiver;
65     @Mock
66     private ClientMonitorCallback mMonitorCallback;
67     @Mock
68     private BiometricLogger mBiometricLogger;
69     @Mock
70     private BiometricContext mBiometricContext;
71 
72     private FaceGenerateChallengeClient mClient;
73 
74     @Before
setup()75     public void setup() throws Exception {
76         MockitoAnnotations.initMocks(this);
77 
78         final OptionalUint64 challenge = new OptionalUint64();
79         challenge.value = CHALLENGE;
80         when(mIBiometricsFace.generateChallenge(anyInt())).thenReturn(challenge);
81 
82         mClient = new FaceGenerateChallengeClient(mContext, () -> mIBiometricsFace, new Binder(),
83                 new ClientMonitorCallbackConverter(mClientReceiver), USER_ID,
84                 TAG, SENSOR_ID, mBiometricLogger, mBiometricContext , START_TIME);
85     }
86 
87     @Test
getCreatedAt()88     public void getCreatedAt() {
89         assertEquals(START_TIME, mClient.getCreatedAt());
90     }
91 
92     @Test
reuseResult_whenNotReady()93     public void reuseResult_whenNotReady() throws Exception {
94         mClient.reuseResult(mOtherReceiver);
95         verify(mOtherReceiver, never()).onChallengeGenerated(anyInt(), anyInt(), anyInt());
96     }
97 
98     @Test
reuseResult_whenReady()99     public void reuseResult_whenReady() throws Exception {
100         mClient.start(mMonitorCallback);
101         mClient.reuseResult(mOtherReceiver);
102         verify(mOtherReceiver).onChallengeGenerated(eq(SENSOR_ID), eq(USER_ID), eq(CHALLENGE));
103     }
104 
105     @Test
reuseResult_whenReallyReady()106     public void reuseResult_whenReallyReady() throws Exception {
107         mClient.reuseResult(mOtherReceiver);
108         mClient.start(mMonitorCallback);
109         verify(mOtherReceiver).onChallengeGenerated(eq(SENSOR_ID), eq(USER_ID), eq(CHALLENGE));
110     }
111 }
112