1 /* 2 * Copyright (C) 2024 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; 18 19 20 import static com.android.dx.mockito.inline.extended.ExtendedMockito.doNothing; 21 import static com.android.dx.mockito.inline.extended.ExtendedMockito.verify; 22 23 import static com.google.common.truth.Truth.assertThat; 24 import static com.google.common.truth.Truth.assertWithMessage; 25 26 import static org.mockito.ArgumentMatchers.eq; 27 import static org.mockito.Mockito.spy; 28 29 import android.app.PropertyInvalidatedCache; 30 import android.content.Context; 31 import android.multiuser.Flags; 32 import android.os.UserManager; 33 import android.os.storage.ICeStorageLockEventListener; 34 import android.os.storage.StorageManagerInternal; 35 import android.platform.test.flag.junit.SetFlagsRule; 36 37 import com.android.modules.utils.testing.ExtendedMockitoRule; 38 39 import org.junit.After; 40 import org.junit.Before; 41 import org.junit.Rule; 42 import org.junit.Test; 43 44 import java.util.concurrent.CopyOnWriteArrayList; 45 46 public class StorageManagerServiceTest { 47 48 private final Context mRealContext = androidx.test.platform.app.InstrumentationRegistry 49 .getInstrumentation().getTargetContext(); 50 private StorageManagerService mStorageManagerService; 51 private StorageManagerInternal mStorageManagerInternal; 52 53 private static final int TEST_USER_ID = 1001; 54 55 @Rule 56 public final ExtendedMockitoRule mExtendedMockitoRule = new ExtendedMockitoRule.Builder(this) 57 .spyStatic(UserManager.class) 58 .build(); 59 @Rule 60 public final SetFlagsRule mSetFlagsRule = new SetFlagsRule(); 61 62 private static class TestStorageEventListener implements ICeStorageLockEventListener { 63 64 private int mExpectedUserId; 65 TestStorageEventListener(int userId)66 private TestStorageEventListener(int userId) { 67 mExpectedUserId = userId; 68 } 69 70 @Override onStorageLocked(int userId)71 public void onStorageLocked(int userId) { 72 assertThat(userId).isEqualTo(mExpectedUserId); 73 } 74 } 75 76 77 @Before setFixtures()78 public void setFixtures() { 79 PropertyInvalidatedCache.disableForTestMode(); 80 81 // Called when WatchedUserStates is constructed 82 doNothing().when(() -> UserManager.invalidateIsUserUnlockedCache()); 83 84 mStorageManagerService = new StorageManagerService(mRealContext); 85 mStorageManagerInternal = LocalServices.getService(StorageManagerInternal.class); 86 assertWithMessage("LocalServices.getService(StorageManagerInternal.class)") 87 .that(mStorageManagerInternal).isNotNull(); 88 } 89 90 @After tearDown()91 public void tearDown() { 92 LocalServices.removeServiceForTest(StorageManagerInternal.class); 93 } 94 95 @Test testRegisterLockEventListener()96 public void testRegisterLockEventListener() { 97 mSetFlagsRule.enableFlags(android.os.Flags.FLAG_ALLOW_PRIVATE_PROFILE, 98 Flags.FLAG_ENABLE_BIOMETRICS_TO_UNLOCK_PRIVATE_SPACE, 99 Flags.FLAG_ENABLE_PRIVATE_SPACE_FEATURES); 100 mSetFlagsRule.enableFlags(Flags.FLAG_ENABLE_BIOMETRICS_TO_UNLOCK_PRIVATE_SPACE); 101 CopyOnWriteArrayList<ICeStorageLockEventListener> storageLockEventListeners = 102 mStorageManagerService.getCeStorageEventCallbacks(); 103 assertThat(storageLockEventListeners).isNotNull(); 104 int registeredCallbackCount = storageLockEventListeners.size(); 105 TestStorageEventListener testStorageEventListener = 106 new TestStorageEventListener(TEST_USER_ID); 107 mStorageManagerInternal.registerStorageLockEventListener(testStorageEventListener); 108 assertNumberOfStorageCallbackReceivers(registeredCallbackCount + 1); 109 110 mStorageManagerInternal.unregisterStorageLockEventListener(testStorageEventListener); 111 assertNumberOfStorageCallbackReceivers(registeredCallbackCount); 112 } 113 114 @Test testDispatchCeStorageLockEvent()115 public void testDispatchCeStorageLockEvent() { 116 mSetFlagsRule.enableFlags(android.os.Flags.FLAG_ALLOW_PRIVATE_PROFILE, 117 Flags.FLAG_ENABLE_BIOMETRICS_TO_UNLOCK_PRIVATE_SPACE, 118 Flags.FLAG_ENABLE_PRIVATE_SPACE_FEATURES); 119 120 assertThat(mStorageManagerService.getCeStorageEventCallbacks()).isNotNull(); 121 int callbackReceiverSize = mStorageManagerService.getCeStorageEventCallbacks().size(); 122 TestStorageEventListener testStorageEventListener = 123 spy(new TestStorageEventListener(TEST_USER_ID)); 124 125 // Add testStorageEventListener to the list of storage callback listeners 126 mStorageManagerService.getCeStorageEventCallbacks().add(testStorageEventListener); 127 assertNumberOfStorageCallbackReceivers(callbackReceiverSize + 1); 128 129 mStorageManagerService.dispatchCeStorageLockedEvent(TEST_USER_ID); 130 verify(testStorageEventListener).onStorageLocked(eq(TEST_USER_ID)); 131 132 // Remove testStorageEventListener from the list of storage callback listeners 133 mStorageManagerService.getCeStorageEventCallbacks().remove(testStorageEventListener); 134 assertNumberOfStorageCallbackReceivers(callbackReceiverSize); 135 } 136 assertNumberOfStorageCallbackReceivers(int callbackReceiverSize)137 private void assertNumberOfStorageCallbackReceivers(int callbackReceiverSize) { 138 assertThat(mStorageManagerService.getCeStorageEventCallbacks()).isNotNull(); 139 assertThat(mStorageManagerService.getCeStorageEventCallbacks().size()) 140 .isEqualTo(callbackReceiverSize); 141 } 142 } 143