From 584e2a4c346c347b0251d00ef6ee1d5102f8c2c8 Mon Sep 17 00:00:00 2001 From: Joe Bolinger Date: Thu, 24 Feb 2022 17:55:37 -0800 Subject: [PATCH] Cache start callback for watchdog in case the HAL operation does not complete its expected lifecycle. Bug: 218592144 Test: atest BiometricSchedulerOperationTest Test: manual (with BP test app) Change-Id: I4d45a415fc92384dcc3c4bdd1bdd5dacfe86f08d --- .../sensors/BiometricSchedulerOperation.java | 6 +++++- .../sensors/BiometricSchedulerOperationTest.java | 13 ++++++++++--- 2 files changed, 15 insertions(+), 4 deletions(-) diff --git a/services/core/java/com/android/server/biometrics/sensors/BiometricSchedulerOperation.java b/services/core/java/com/android/server/biometrics/sensors/BiometricSchedulerOperation.java index 812ca8ac62fe2..15f0cadced991 100644 --- a/services/core/java/com/android/server/biometrics/sensors/BiometricSchedulerOperation.java +++ b/services/core/java/com/android/server/biometrics/sensors/BiometricSchedulerOperation.java @@ -84,6 +84,8 @@ public class BiometricSchedulerOperation { private final BaseClientMonitor mClientMonitor; @Nullable private final ClientMonitorCallback mClientCallback; + @Nullable + private ClientMonitorCallback mOnStartCallback; @OperationState private int mState; @VisibleForTesting @@ -108,7 +110,8 @@ public class BiometricSchedulerOperation { mCancelWatchdog = () -> { if (!isFinished()) { Slog.e(TAG, "[Watchdog Triggered]: " + this); - getWrappedCallback().onClientFinished(mClientMonitor, false /* success */); + getWrappedCallback(mOnStartCallback) + .onClientFinished(mClientMonitor, false /* success */); } }; } @@ -174,6 +177,7 @@ public class BiometricSchedulerOperation { } private boolean doStart(@NonNull ClientMonitorCallback callback) { + mOnStartCallback = callback; final ClientMonitorCallback cb = getWrappedCallback(callback); if (mState == STATE_WAITING_IN_QUEUE_CANCELING) { diff --git a/services/tests/servicestests/src/com/android/server/biometrics/sensors/BiometricSchedulerOperationTest.java b/services/tests/servicestests/src/com/android/server/biometrics/sensors/BiometricSchedulerOperationTest.java index 64be56906d4b2..eab96c09a00a8 100644 --- a/services/tests/servicestests/src/com/android/server/biometrics/sensors/BiometricSchedulerOperationTest.java +++ b/services/tests/servicestests/src/com/android/server/biometrics/sensors/BiometricSchedulerOperationTest.java @@ -40,12 +40,14 @@ import com.android.server.biometrics.log.BiometricContext; import com.android.server.biometrics.log.BiometricLogger; import org.junit.Before; +import org.junit.Rule; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.ArgumentCaptor; import org.mockito.Captor; import org.mockito.Mock; -import org.mockito.MockitoAnnotations; +import org.mockito.junit.MockitoJUnit; +import org.mockito.junit.MockitoRule; @Presubmit @RunWith(AndroidTestingRunner.class) @@ -62,6 +64,9 @@ public class BiometricSchedulerOperationTest { } } + @Rule + public final MockitoRule mockito = MockitoJUnit.rule(); + @Mock private InterruptableMonitor mClientMonitor; @Mock @@ -76,7 +81,6 @@ public class BiometricSchedulerOperationTest { @Before public void setUp() { - MockitoAnnotations.initMocks(this); mHandler = new Handler(TestableLooper.get(this).getLooper()); mOperation = new BiometricSchedulerOperation(mClientMonitor, mClientCallback); } @@ -311,10 +315,12 @@ public class BiometricSchedulerOperationTest { private void cancelWatchdog(boolean start) { when(mClientMonitor.getFreshDaemon()).thenReturn(mHal); - mOperation.start(mock(ClientMonitorCallback.class)); + final ClientMonitorCallback opStartCallback = mock(ClientMonitorCallback.class); + mOperation.start(opStartCallback); if (start) { verify(mClientMonitor).start(mStartCallback.capture()); mStartCallback.getValue().onClientStarted(mClientMonitor); + verify(opStartCallback).onClientStarted(eq(mClientMonitor)); } mOperation.cancel(mHandler, mock(ClientMonitorCallback.class)); @@ -325,6 +331,7 @@ public class BiometricSchedulerOperationTest { assertThat(mOperation.isFinished()).isTrue(); assertThat(mOperation.isCanceling()).isFalse(); + verify(opStartCallback).onClientFinished(eq(mClientMonitor), eq(false)); verify(mClientMonitor).destroy(); } }