| /* |
| * Copyright (C) 2022 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.systemui.log; |
| |
| import static android.app.StatusBarManager.ALL_SESSIONS; |
| import static android.app.StatusBarManager.SESSION_BIOMETRIC_PROMPT; |
| import static android.app.StatusBarManager.SESSION_KEYGUARD; |
| |
| import static junit.framework.Assert.assertNotNull; |
| import static junit.framework.Assert.assertNull; |
| |
| import static org.mockito.ArgumentMatchers.any; |
| import static org.mockito.ArgumentMatchers.eq; |
| import static org.mockito.Mockito.verify; |
| import static org.mockito.Mockito.when; |
| |
| import android.os.RemoteException; |
| import android.testing.AndroidTestingRunner; |
| import android.testing.TestableLooper; |
| |
| import androidx.test.filters.SmallTest; |
| |
| import com.android.internal.logging.InstanceId; |
| import com.android.internal.statusbar.IStatusBarService; |
| import com.android.keyguard.KeyguardUpdateMonitor; |
| import com.android.keyguard.KeyguardUpdateMonitorCallback; |
| import com.android.systemui.SysuiTestCase; |
| import com.android.systemui.biometrics.AuthController; |
| import com.android.systemui.statusbar.policy.KeyguardStateController; |
| |
| import org.junit.Before; |
| 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; |
| |
| @RunWith(AndroidTestingRunner.class) |
| @TestableLooper.RunWithLooper |
| @SmallTest |
| public class SessionTrackerTest extends SysuiTestCase { |
| @Mock |
| private IStatusBarService mStatusBarService; |
| @Mock |
| private AuthController mAuthController; |
| @Mock |
| private KeyguardUpdateMonitor mKeyguardUpdateMonitor; |
| @Mock |
| private KeyguardStateController mKeyguardStateController; |
| |
| @Captor |
| ArgumentCaptor<KeyguardUpdateMonitorCallback> mKeyguardUpdateMonitorCallbackCaptor; |
| KeyguardUpdateMonitorCallback mKeyguardUpdateMonitorCallback; |
| |
| @Captor |
| ArgumentCaptor<KeyguardStateController.Callback> mKeyguardStateCallbackCaptor; |
| KeyguardStateController.Callback mKeyguardStateCallback; |
| |
| @Captor |
| ArgumentCaptor<AuthController.Callback> mAuthControllerCallbackCaptor; |
| AuthController.Callback mAuthControllerCallback; |
| |
| private SessionTracker mSessionTracker; |
| |
| @Before |
| public void setup() throws RemoteException { |
| MockitoAnnotations.initMocks(this); |
| |
| mSessionTracker = new SessionTracker( |
| mContext, |
| mStatusBarService, |
| mAuthController, |
| mKeyguardUpdateMonitor, |
| mKeyguardStateController |
| ); |
| } |
| |
| @Test |
| public void testOnStartShowingKeyguard() throws RemoteException { |
| // GIVEN the keyguard is showing before start |
| when(mKeyguardStateController.isShowing()).thenReturn(true); |
| |
| // WHEN started |
| mSessionTracker.start(); |
| |
| // THEN keyguard session has a session id |
| assertNotNull(mSessionTracker.getSessionId(SESSION_KEYGUARD)); |
| |
| // THEN send event to status bar service |
| verify(mStatusBarService).onSessionStarted(eq(SESSION_KEYGUARD), any(InstanceId.class)); |
| } |
| |
| @Test |
| public void testNoSessions() throws RemoteException { |
| // GIVEN no sessions |
| when(mKeyguardStateController.isShowing()).thenReturn(false); |
| |
| // WHEN started |
| mSessionTracker.start(); |
| |
| // THEN all sessions are null |
| for (int sessionType : ALL_SESSIONS) { |
| assertNull(mSessionTracker.getSessionId(sessionType)); |
| } |
| } |
| |
| @Test |
| public void testBiometricPromptShowing() throws RemoteException { |
| // GIVEN session tracker started w/o any sessions |
| mSessionTracker.start(); |
| captureAuthControllerCallback(); |
| |
| // WHEN auth controller shows the biometric prompt |
| mAuthControllerCallback.onBiometricPromptShown(); |
| |
| // THEN the biometric prompt session has a session id |
| assertNotNull(mSessionTracker.getSessionId(SESSION_BIOMETRIC_PROMPT)); |
| |
| // THEN session started event gets sent to status bar service |
| verify(mStatusBarService).onSessionStarted( |
| eq(SESSION_BIOMETRIC_PROMPT), any(InstanceId.class)); |
| } |
| |
| @Test |
| public void testBiometricPromptDismissed() throws RemoteException { |
| // GIVEN session tracker started w/o any sessions |
| mSessionTracker.start(); |
| captureAuthControllerCallback(); |
| |
| // WHEN auth controller shows the biometric prompt and then hides it |
| mAuthControllerCallback.onBiometricPromptShown(); |
| mAuthControllerCallback.onBiometricPromptDismissed(); |
| |
| // THEN the biometric prompt session no longer has a session id |
| assertNull(mSessionTracker.getSessionId(SESSION_BIOMETRIC_PROMPT)); |
| |
| // THEN session end event gets sent to status bar service |
| verify(mStatusBarService).onSessionEnded( |
| eq(SESSION_BIOMETRIC_PROMPT), any(InstanceId.class)); |
| } |
| |
| @Test |
| public void testKeyguardSessionOnDeviceStartsSleeping() throws RemoteException { |
| // GIVEN session tracker started w/o any sessions |
| mSessionTracker.start(); |
| captureKeyguardUpdateMonitorCallback(); |
| |
| // WHEN device starts going to sleep |
| mKeyguardUpdateMonitorCallback.onStartedGoingToSleep(0); |
| |
| // THEN the keyguard session has a session id |
| assertNotNull(mSessionTracker.getSessionId(SESSION_KEYGUARD)); |
| |
| // THEN session start event gets sent to status bar service |
| verify(mStatusBarService).onSessionStarted( |
| eq(SESSION_KEYGUARD), any(InstanceId.class)); |
| } |
| |
| @Test |
| public void testKeyguardSessionOnKeyguardShowingChange() throws RemoteException { |
| // GIVEN session tracker started w/o any sessions |
| mSessionTracker.start(); |
| captureKeyguardStateControllerCallback(); |
| |
| // WHEN keyguard becomes visible (ie: from lockdown) |
| when(mKeyguardStateController.isShowing()).thenReturn(true); |
| mKeyguardStateCallback.onKeyguardShowingChanged(); |
| |
| // THEN the keyguard session has a session id |
| assertNotNull(mSessionTracker.getSessionId(SESSION_KEYGUARD)); |
| |
| // THEN session start event gets sent to status bar service |
| verify(mStatusBarService).onSessionStarted( |
| eq(SESSION_KEYGUARD), any(InstanceId.class)); |
| } |
| |
| @Test |
| public void testKeyguardSessionOnKeyguardNotShowing() throws RemoteException { |
| // GIVEN session tracker started w/o any sessions |
| mSessionTracker.start(); |
| captureKeyguardStateControllerCallback(); |
| |
| // WHEN keyguard was showing and now it's not |
| when(mKeyguardStateController.isShowing()).thenReturn(true); |
| mKeyguardStateCallback.onKeyguardShowingChanged(); |
| when(mKeyguardStateController.isShowing()).thenReturn(false); |
| mKeyguardStateCallback.onKeyguardShowingChanged(); |
| |
| // THEN the keyguard session no longer has a session id |
| assertNull(mSessionTracker.getSessionId(SESSION_KEYGUARD)); |
| |
| // THEN session end event gets sent to status bar service |
| verify(mStatusBarService).onSessionEnded( |
| eq(SESSION_KEYGUARD), any(InstanceId.class)); |
| } |
| |
| void captureKeyguardUpdateMonitorCallback() { |
| verify(mKeyguardUpdateMonitor).registerCallback( |
| mKeyguardUpdateMonitorCallbackCaptor.capture()); |
| mKeyguardUpdateMonitorCallback = mKeyguardUpdateMonitorCallbackCaptor.getValue(); |
| } |
| |
| void captureKeyguardStateControllerCallback() { |
| verify(mKeyguardStateController).addCallback( |
| mKeyguardStateCallbackCaptor.capture()); |
| mKeyguardStateCallback = mKeyguardStateCallbackCaptor.getValue(); |
| } |
| |
| void captureAuthControllerCallback() { |
| verify(mAuthController).addCallback( |
| mAuthControllerCallbackCaptor.capture()); |
| mAuthControllerCallback = mAuthControllerCallbackCaptor.getValue(); |
| } |
| } |