summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--services/core/java/com/android/server/biometrics/sensors/BiometricScheduler.java14
-rw-r--r--services/tests/servicestests/src/com/android/server/biometrics/sensors/BiometricSchedulerTest.java81
2 files changed, 88 insertions, 7 deletions
diff --git a/services/core/java/com/android/server/biometrics/sensors/BiometricScheduler.java b/services/core/java/com/android/server/biometrics/sensors/BiometricScheduler.java
index 0aeb7abe706e..4f37dccea42e 100644
--- a/services/core/java/com/android/server/biometrics/sensors/BiometricScheduler.java
+++ b/services/core/java/com/android/server/biometrics/sensors/BiometricScheduler.java
@@ -194,19 +194,19 @@ public class BiometricScheduler {
return;
}
+ if (clientMonitor != mCurrentOperation.clientMonitor) {
+ Slog.e(getTag(), "[Ignoring Finish] " + clientMonitor + " does not match"
+ + " current: " + mCurrentOperation.clientMonitor);
+ return;
+ }
+
+ Slog.d(getTag(), "[Finishing] " + clientMonitor + ", success: " + success);
mCurrentOperation.state = Operation.STATE_FINISHED;
if (mCurrentOperation.clientFinishCallback != null) {
mCurrentOperation.clientFinishCallback.onClientFinished(clientMonitor, success);
}
- if (clientMonitor != mCurrentOperation.clientMonitor) {
- throw new IllegalStateException("Mismatched operation, "
- + " current: " + mCurrentOperation.clientMonitor
- + " received: " + clientMonitor);
- }
-
- Slog.d(getTag(), "[Finished] " + clientMonitor + ", success: " + success);
if (mGestureAvailabilityDispatcher != null) {
mGestureAvailabilityDispatcher.markSensorActive(
mCurrentOperation.clientMonitor.getSensorId(), false /* active */);
diff --git a/services/tests/servicestests/src/com/android/server/biometrics/sensors/BiometricSchedulerTest.java b/services/tests/servicestests/src/com/android/server/biometrics/sensors/BiometricSchedulerTest.java
new file mode 100644
index 000000000000..dad360d40515
--- /dev/null
+++ b/services/tests/servicestests/src/com/android/server/biometrics/sensors/BiometricSchedulerTest.java
@@ -0,0 +1,81 @@
+/*
+ * Copyright (C) 2020 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.server.biometrics.sensors;
+
+import android.content.Context;
+import android.os.IBinder;
+import android.platform.test.annotations.Presubmit;
+
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+import androidx.test.InstrumentationRegistry;
+import androidx.test.filters.SmallTest;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+
+@Presubmit
+@SmallTest
+public class BiometricSchedulerTest {
+
+ private static final String TAG = "BiometricSchedulerTest";
+
+ private BiometricScheduler mScheduler;
+
+ @Mock
+ private Context mContext;
+ @Mock
+ private ClientMonitor.LazyDaemon<Object> mLazyDaemon;
+
+ @Before
+ public void setUp() {
+ MockitoAnnotations.initMocks(this);
+ mScheduler = new BiometricScheduler(TAG, null /* gestureAvailabilityTracker */);
+ }
+
+ @Test
+ public void testClientDuplicateFinish_ignoredBySchedulerAndDoesNotCrash() {
+ final ClientMonitor<Object> client1 = new TestClientMonitor(mContext, mLazyDaemon);
+ final ClientMonitor<Object> client2 = new TestClientMonitor(mContext, mLazyDaemon);
+ mScheduler.scheduleClientMonitor(client1);
+ mScheduler.scheduleClientMonitor(client2);
+
+ client1.mFinishCallback.onClientFinished(client1, true /* success */);
+ client1.mFinishCallback.onClientFinished(client1, true /* success */);
+ }
+
+ private static class TestClientMonitor extends ClientMonitor<Object> {
+
+ public TestClientMonitor(@NonNull Context context, @NonNull LazyDaemon<Object> lazyDaemon) {
+ super(context, lazyDaemon, null /* token */, null /* listener */, 0 /* userId */,
+ TAG, 0 /* cookie */, 0 /* sensorId */, 0 /* statsModality */,
+ 0 /* statsAction */, 0 /* statsClient */);
+ }
+
+ @Override
+ public void unableToStart() {
+
+ }
+
+ @Override
+ protected void startHalOperation() {
+
+ }
+ }
+}