• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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