10cbc19e4a66f7db51596b57ca91afc6f5b27f3b4Rubin Xu/* 20cbc19e4a66f7db51596b57ca91afc6f5b27f3b4Rubin Xu * Copyright (C) 2016 The Android Open Source Project 30cbc19e4a66f7db51596b57ca91afc6f5b27f3b4Rubin Xu * 40cbc19e4a66f7db51596b57ca91afc6f5b27f3b4Rubin Xu * Licensed under the Apache License, Version 2.0 (the "License"); 50cbc19e4a66f7db51596b57ca91afc6f5b27f3b4Rubin Xu * you may not use this file except in compliance with the License. 60cbc19e4a66f7db51596b57ca91afc6f5b27f3b4Rubin Xu * You may obtain a copy of the License at 70cbc19e4a66f7db51596b57ca91afc6f5b27f3b4Rubin Xu * 80cbc19e4a66f7db51596b57ca91afc6f5b27f3b4Rubin Xu * http://www.apache.org/licenses/LICENSE-2.0 90cbc19e4a66f7db51596b57ca91afc6f5b27f3b4Rubin Xu * 100cbc19e4a66f7db51596b57ca91afc6f5b27f3b4Rubin Xu * Unless required by applicable law or agreed to in writing, software 110cbc19e4a66f7db51596b57ca91afc6f5b27f3b4Rubin Xu * distributed under the License is distributed on an "AS IS" BASIS, 120cbc19e4a66f7db51596b57ca91afc6f5b27f3b4Rubin Xu * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 130cbc19e4a66f7db51596b57ca91afc6f5b27f3b4Rubin Xu * See the License for the specific language governing permissions and 140cbc19e4a66f7db51596b57ca91afc6f5b27f3b4Rubin Xu * limitations under the License 150cbc19e4a66f7db51596b57ca91afc6f5b27f3b4Rubin Xu */ 160cbc19e4a66f7db51596b57ca91afc6f5b27f3b4Rubin Xu 17507d11c9353666a75fee014565f900825a907691Andrew Scullpackage com.android.server.locksettings; 180cbc19e4a66f7db51596b57ca91afc6f5b27f3b4Rubin Xu 190cbc19e4a66f7db51596b57ca91afc6f5b27f3b4Rubin Xuimport static org.mockito.Matchers.any; 207b7424b0b7c5b6be09ed6fb0ec70272574dfe718Rubin Xuimport static org.mockito.Matchers.anyBoolean; 210cbc19e4a66f7db51596b57ca91afc6f5b27f3b4Rubin Xuimport static org.mockito.Matchers.anyInt; 220cbc19e4a66f7db51596b57ca91afc6f5b27f3b4Rubin Xuimport static org.mockito.Matchers.eq; 23b31be1b157d9633d43e42b200a92c94e318a4e96Rubin Xuimport static org.mockito.Mockito.doAnswer; 240cbc19e4a66f7db51596b57ca91afc6f5b27f3b4Rubin Xuimport static org.mockito.Mockito.mock; 250cbc19e4a66f7db51596b57ca91afc6f5b27f3b4Rubin Xuimport static org.mockito.Mockito.when; 260cbc19e4a66f7db51596b57ca91afc6f5b27f3b4Rubin Xu 270cbc19e4a66f7db51596b57ca91afc6f5b27f3b4Rubin Xuimport android.app.IActivityManager; 28f49794b512745ca3b3a26221d36291440bc417e5Andrew Scullimport android.app.KeyguardManager; 290cbc19e4a66f7db51596b57ca91afc6f5b27f3b4Rubin Xuimport android.app.NotificationManager; 308b30ec3f49d4c8037bc6aa03ed6dd91aff3968adRubin Xuimport android.app.admin.DevicePolicyManager; 311416bd022f344b4fdeadcbdbf2f87e19f0fac7e7Andrew Scullimport android.app.admin.DevicePolicyManagerInternal; 3216c823ebf398138add71ad8ff82053e3676f85c3Rubin Xuimport android.app.trust.TrustManager; 338b30ec3f49d4c8037bc6aa03ed6dd91aff3968adRubin Xuimport android.content.ComponentName; 340cbc19e4a66f7db51596b57ca91afc6f5b27f3b4Rubin Xuimport android.content.pm.UserInfo; 35e6527c1285cf38057d95c33f5fac4f4ea124e003Andrew Scullimport android.hardware.authsecret.V1_0.IAuthSecret; 360cbc19e4a66f7db51596b57ca91afc6f5b27f3b4Rubin Xuimport android.os.FileUtils; 370cbc19e4a66f7db51596b57ca91afc6f5b27f3b4Rubin Xuimport android.os.IProgressListener; 38b31be1b157d9633d43e42b200a92c94e318a4e96Rubin Xuimport android.os.RemoteException; 390cbc19e4a66f7db51596b57ca91afc6f5b27f3b4Rubin Xuimport android.os.UserManager; 40aa32d1530594db74e730e99d5ebbf8809bacd9d1Rubin Xuimport android.os.storage.StorageManager; 41b31be1b157d9633d43e42b200a92c94e318a4e96Rubin Xuimport android.os.storage.IStorageManager; 420cbc19e4a66f7db51596b57ca91afc6f5b27f3b4Rubin Xuimport android.security.KeyStore; 430cbc19e4a66f7db51596b57ca91afc6f5b27f3b4Rubin Xuimport android.test.AndroidTestCase; 440cbc19e4a66f7db51596b57ca91afc6f5b27f3b4Rubin Xu 4516c823ebf398138add71ad8ff82053e3676f85c3Rubin Xuimport com.android.internal.widget.ILockSettings; 460cbc19e4a66f7db51596b57ca91afc6f5b27f3b4Rubin Xuimport com.android.internal.widget.LockPatternUtils; 47fcd49f993ede363d0b17900565dfe37066362480Rubin Xuimport com.android.internal.widget.LockSettingsInternal; 481416bd022f344b4fdeadcbdbf2f87e19f0fac7e7Andrew Scullimport com.android.server.LocalServices; 490cbc19e4a66f7db51596b57ca91afc6f5b27f3b4Rubin Xu 500cbc19e4a66f7db51596b57ca91afc6f5b27f3b4Rubin Xuimport org.mockito.invocation.InvocationOnMock; 510cbc19e4a66f7db51596b57ca91afc6f5b27f3b4Rubin Xuimport org.mockito.stubbing.Answer; 520cbc19e4a66f7db51596b57ca91afc6f5b27f3b4Rubin Xu 530cbc19e4a66f7db51596b57ca91afc6f5b27f3b4Rubin Xuimport java.io.File; 548e87af55337a19cf7242a1bf2f516bc26ae65f9eAndrew Scullimport java.util.ArrayList; 55dec0540d0d1e78800f5e74f5f58e94324e00ed30Charles Heimport java.util.Arrays; 560cbc19e4a66f7db51596b57ca91afc6f5b27f3b4Rubin Xu 570cbc19e4a66f7db51596b57ca91afc6f5b27f3b4Rubin Xu 580cbc19e4a66f7db51596b57ca91afc6f5b27f3b4Rubin Xupublic class BaseLockSettingsServiceTests extends AndroidTestCase { 590cbc19e4a66f7db51596b57ca91afc6f5b27f3b4Rubin Xu protected static final int PRIMARY_USER_ID = 0; 600cbc19e4a66f7db51596b57ca91afc6f5b27f3b4Rubin Xu protected static final int MANAGED_PROFILE_USER_ID = 12; 618e87af55337a19cf7242a1bf2f516bc26ae65f9eAndrew Scull protected static final int TURNED_OFF_PROFILE_USER_ID = 17; 620cbc19e4a66f7db51596b57ca91afc6f5b27f3b4Rubin Xu protected static final int SECONDARY_USER_ID = 20; 630cbc19e4a66f7db51596b57ca91afc6f5b27f3b4Rubin Xu 640cbc19e4a66f7db51596b57ca91afc6f5b27f3b4Rubin Xu private static final UserInfo PRIMARY_USER_INFO = new UserInfo(PRIMARY_USER_ID, null, null, 650cbc19e4a66f7db51596b57ca91afc6f5b27f3b4Rubin Xu UserInfo.FLAG_INITIALIZED | UserInfo.FLAG_ADMIN | UserInfo.FLAG_PRIMARY); 660cbc19e4a66f7db51596b57ca91afc6f5b27f3b4Rubin Xu private static final UserInfo SECONDARY_USER_INFO = new UserInfo(SECONDARY_USER_ID, null, null, 670cbc19e4a66f7db51596b57ca91afc6f5b27f3b4Rubin Xu UserInfo.FLAG_INITIALIZED); 680cbc19e4a66f7db51596b57ca91afc6f5b27f3b4Rubin Xu 698e87af55337a19cf7242a1bf2f516bc26ae65f9eAndrew Scull private ArrayList<UserInfo> mPrimaryUserProfiles = new ArrayList<>(); 708e87af55337a19cf7242a1bf2f516bc26ae65f9eAndrew Scull 710cbc19e4a66f7db51596b57ca91afc6f5b27f3b4Rubin Xu LockSettingsService mService; 72fcd49f993ede363d0b17900565dfe37066362480Rubin Xu LockSettingsInternal mLocalService; 730cbc19e4a66f7db51596b57ca91afc6f5b27f3b4Rubin Xu 740cbc19e4a66f7db51596b57ca91afc6f5b27f3b4Rubin Xu MockLockSettingsContext mContext; 750cbc19e4a66f7db51596b57ca91afc6f5b27f3b4Rubin Xu LockSettingsStorageTestable mStorage; 760cbc19e4a66f7db51596b57ca91afc6f5b27f3b4Rubin Xu 770cbc19e4a66f7db51596b57ca91afc6f5b27f3b4Rubin Xu LockPatternUtils mLockPatternUtils; 7816c823ebf398138add71ad8ff82053e3676f85c3Rubin Xu FakeGateKeeperService mGateKeeperService; 790cbc19e4a66f7db51596b57ca91afc6f5b27f3b4Rubin Xu NotificationManager mNotificationManager; 800cbc19e4a66f7db51596b57ca91afc6f5b27f3b4Rubin Xu UserManager mUserManager; 81b31be1b157d9633d43e42b200a92c94e318a4e96Rubin Xu FakeStorageManager mStorageManager; 820cbc19e4a66f7db51596b57ca91afc6f5b27f3b4Rubin Xu IActivityManager mActivityManager; 838b30ec3f49d4c8037bc6aa03ed6dd91aff3968adRubin Xu DevicePolicyManager mDevicePolicyManager; 841416bd022f344b4fdeadcbdbf2f87e19f0fac7e7Andrew Scull DevicePolicyManagerInternal mDevicePolicyManagerInternal; 850cbc19e4a66f7db51596b57ca91afc6f5b27f3b4Rubin Xu KeyStore mKeyStore; 867b7424b0b7c5b6be09ed6fb0ec70272574dfe718Rubin Xu MockSyntheticPasswordManager mSpManager; 87e6527c1285cf38057d95c33f5fac4f4ea124e003Andrew Scull IAuthSecret mAuthSecretService; 880cbc19e4a66f7db51596b57ca91afc6f5b27f3b4Rubin Xu 890cbc19e4a66f7db51596b57ca91afc6f5b27f3b4Rubin Xu @Override 900cbc19e4a66f7db51596b57ca91afc6f5b27f3b4Rubin Xu protected void setUp() throws Exception { 910cbc19e4a66f7db51596b57ca91afc6f5b27f3b4Rubin Xu super.setUp(); 920cbc19e4a66f7db51596b57ca91afc6f5b27f3b4Rubin Xu 9316c823ebf398138add71ad8ff82053e3676f85c3Rubin Xu mGateKeeperService = new FakeGateKeeperService(); 940cbc19e4a66f7db51596b57ca91afc6f5b27f3b4Rubin Xu mNotificationManager = mock(NotificationManager.class); 950cbc19e4a66f7db51596b57ca91afc6f5b27f3b4Rubin Xu mUserManager = mock(UserManager.class); 96b31be1b157d9633d43e42b200a92c94e318a4e96Rubin Xu mStorageManager = new FakeStorageManager(); 970cbc19e4a66f7db51596b57ca91afc6f5b27f3b4Rubin Xu mActivityManager = mock(IActivityManager.class); 988b30ec3f49d4c8037bc6aa03ed6dd91aff3968adRubin Xu mDevicePolicyManager = mock(DevicePolicyManager.class); 991416bd022f344b4fdeadcbdbf2f87e19f0fac7e7Andrew Scull mDevicePolicyManagerInternal = mock(DevicePolicyManagerInternal.class); 1001416bd022f344b4fdeadcbdbf2f87e19f0fac7e7Andrew Scull 101fcd49f993ede363d0b17900565dfe37066362480Rubin Xu LocalServices.removeServiceForTest(LockSettingsInternal.class); 1021416bd022f344b4fdeadcbdbf2f87e19f0fac7e7Andrew Scull LocalServices.removeServiceForTest(DevicePolicyManagerInternal.class); 1031416bd022f344b4fdeadcbdbf2f87e19f0fac7e7Andrew Scull LocalServices.addService(DevicePolicyManagerInternal.class, mDevicePolicyManagerInternal); 1047b7424b0b7c5b6be09ed6fb0ec70272574dfe718Rubin Xu 1058b30ec3f49d4c8037bc6aa03ed6dd91aff3968adRubin Xu mContext = new MockLockSettingsContext(getContext(), mUserManager, mNotificationManager, 106f49794b512745ca3b3a26221d36291440bc417e5Andrew Scull mDevicePolicyManager, mock(StorageManager.class), mock(TrustManager.class), 107f49794b512745ca3b3a26221d36291440bc417e5Andrew Scull mock(KeyguardManager.class)); 1080cbc19e4a66f7db51596b57ca91afc6f5b27f3b4Rubin Xu mStorage = new LockSettingsStorageTestable(mContext, 1090cbc19e4a66f7db51596b57ca91afc6f5b27f3b4Rubin Xu new File(getContext().getFilesDir(), "locksettings")); 1100cbc19e4a66f7db51596b57ca91afc6f5b27f3b4Rubin Xu File storageDir = mStorage.mStorageDir; 1110cbc19e4a66f7db51596b57ca91afc6f5b27f3b4Rubin Xu if (storageDir.exists()) { 1120cbc19e4a66f7db51596b57ca91afc6f5b27f3b4Rubin Xu FileUtils.deleteContents(storageDir); 1130cbc19e4a66f7db51596b57ca91afc6f5b27f3b4Rubin Xu } else { 1140cbc19e4a66f7db51596b57ca91afc6f5b27f3b4Rubin Xu storageDir.mkdirs(); 1150cbc19e4a66f7db51596b57ca91afc6f5b27f3b4Rubin Xu } 1160cbc19e4a66f7db51596b57ca91afc6f5b27f3b4Rubin Xu 11716c823ebf398138add71ad8ff82053e3676f85c3Rubin Xu mLockPatternUtils = new LockPatternUtils(mContext) { 11816c823ebf398138add71ad8ff82053e3676f85c3Rubin Xu @Override 11916c823ebf398138add71ad8ff82053e3676f85c3Rubin Xu public ILockSettings getLockSettings() { 12016c823ebf398138add71ad8ff82053e3676f85c3Rubin Xu return mService; 12116c823ebf398138add71ad8ff82053e3676f85c3Rubin Xu } 12216c823ebf398138add71ad8ff82053e3676f85c3Rubin Xu }; 1232adc263ce97ae6c8291653490868879841d31a63Adrian Roos mSpManager = new MockSyntheticPasswordManager(mContext, mStorage, mGateKeeperService, 1242adc263ce97ae6c8291653490868879841d31a63Adrian Roos mUserManager); 125e6527c1285cf38057d95c33f5fac4f4ea124e003Andrew Scull mAuthSecretService = mock(IAuthSecret.class); 126b31be1b157d9633d43e42b200a92c94e318a4e96Rubin Xu mService = new LockSettingsServiceTestable(mContext, mLockPatternUtils, mStorage, 127b31be1b157d9633d43e42b200a92c94e318a4e96Rubin Xu mGateKeeperService, mKeyStore, setUpStorageManagerMock(), mActivityManager, 128e6527c1285cf38057d95c33f5fac4f4ea124e003Andrew Scull mSpManager, mAuthSecretService); 1290cbc19e4a66f7db51596b57ca91afc6f5b27f3b4Rubin Xu when(mUserManager.getUserInfo(eq(PRIMARY_USER_ID))).thenReturn(PRIMARY_USER_INFO); 1308e87af55337a19cf7242a1bf2f516bc26ae65f9eAndrew Scull mPrimaryUserProfiles.add(PRIMARY_USER_INFO); 1318e87af55337a19cf7242a1bf2f516bc26ae65f9eAndrew Scull installChildProfile(MANAGED_PROFILE_USER_ID); 132dec0540d0d1e78800f5e74f5f58e94324e00ed30Charles He installAndTurnOffChildProfile(TURNED_OFF_PROFILE_USER_ID); 1338e87af55337a19cf7242a1bf2f516bc26ae65f9eAndrew Scull when(mUserManager.getProfiles(eq(PRIMARY_USER_ID))).thenReturn(mPrimaryUserProfiles); 1340cbc19e4a66f7db51596b57ca91afc6f5b27f3b4Rubin Xu when(mUserManager.getUserInfo(eq(SECONDARY_USER_ID))).thenReturn(SECONDARY_USER_INFO); 1350cbc19e4a66f7db51596b57ca91afc6f5b27f3b4Rubin Xu 136e6527c1285cf38057d95c33f5fac4f4ea124e003Andrew Scull final ArrayList<UserInfo> allUsers = new ArrayList<>(mPrimaryUserProfiles); 137e6527c1285cf38057d95c33f5fac4f4ea124e003Andrew Scull allUsers.add(SECONDARY_USER_INFO); 138e6527c1285cf38057d95c33f5fac4f4ea124e003Andrew Scull when(mUserManager.getUsers(anyBoolean())).thenReturn(allUsers); 139e6527c1285cf38057d95c33f5fac4f4ea124e003Andrew Scull 1400cbc19e4a66f7db51596b57ca91afc6f5b27f3b4Rubin Xu when(mActivityManager.unlockUser(anyInt(), any(), any(), any())).thenAnswer( 1410cbc19e4a66f7db51596b57ca91afc6f5b27f3b4Rubin Xu new Answer<Boolean>() { 1420cbc19e4a66f7db51596b57ca91afc6f5b27f3b4Rubin Xu @Override 1430cbc19e4a66f7db51596b57ca91afc6f5b27f3b4Rubin Xu public Boolean answer(InvocationOnMock invocation) throws Throwable { 1440cbc19e4a66f7db51596b57ca91afc6f5b27f3b4Rubin Xu Object[] args = invocation.getArguments(); 1450cbc19e4a66f7db51596b57ca91afc6f5b27f3b4Rubin Xu mStorageManager.unlockUser((int)args[0], (byte[])args[2], 1460cbc19e4a66f7db51596b57ca91afc6f5b27f3b4Rubin Xu (IProgressListener) args[3]); 1470cbc19e4a66f7db51596b57ca91afc6f5b27f3b4Rubin Xu return true; 1480cbc19e4a66f7db51596b57ca91afc6f5b27f3b4Rubin Xu } 1490cbc19e4a66f7db51596b57ca91afc6f5b27f3b4Rubin Xu }); 1500cbc19e4a66f7db51596b57ca91afc6f5b27f3b4Rubin Xu 1518b30ec3f49d4c8037bc6aa03ed6dd91aff3968adRubin Xu // Adding a fake Device Owner app which will enable escrow token support in LSS. 1528b30ec3f49d4c8037bc6aa03ed6dd91aff3968adRubin Xu when(mDevicePolicyManager.getDeviceOwnerComponentOnAnyUser()).thenReturn( 1538b30ec3f49d4c8037bc6aa03ed6dd91aff3968adRubin Xu new ComponentName("com.dummy.package", ".FakeDeviceOwner")); 154fcd49f993ede363d0b17900565dfe37066362480Rubin Xu mLocalService = LocalServices.getService(LockSettingsInternal.class); 1550cbc19e4a66f7db51596b57ca91afc6f5b27f3b4Rubin Xu } 1560cbc19e4a66f7db51596b57ca91afc6f5b27f3b4Rubin Xu 1578e87af55337a19cf7242a1bf2f516bc26ae65f9eAndrew Scull private UserInfo installChildProfile(int profileId) { 1588e87af55337a19cf7242a1bf2f516bc26ae65f9eAndrew Scull final UserInfo userInfo = new UserInfo( 1598e87af55337a19cf7242a1bf2f516bc26ae65f9eAndrew Scull profileId, null, null, UserInfo.FLAG_INITIALIZED | UserInfo.FLAG_MANAGED_PROFILE); 1608e87af55337a19cf7242a1bf2f516bc26ae65f9eAndrew Scull mPrimaryUserProfiles.add(userInfo); 1618e87af55337a19cf7242a1bf2f516bc26ae65f9eAndrew Scull when(mUserManager.getUserInfo(eq(profileId))).thenReturn(userInfo); 1628e87af55337a19cf7242a1bf2f516bc26ae65f9eAndrew Scull when(mUserManager.getProfileParent(eq(profileId))).thenReturn(PRIMARY_USER_INFO); 163dec0540d0d1e78800f5e74f5f58e94324e00ed30Charles He when(mUserManager.isUserRunning(eq(profileId))).thenReturn(true); 164dec0540d0d1e78800f5e74f5f58e94324e00ed30Charles He when(mUserManager.isUserUnlocked(eq(profileId))).thenReturn(true); 1658e87af55337a19cf7242a1bf2f516bc26ae65f9eAndrew Scull return userInfo; 1668e87af55337a19cf7242a1bf2f516bc26ae65f9eAndrew Scull } 1678e87af55337a19cf7242a1bf2f516bc26ae65f9eAndrew Scull 168dec0540d0d1e78800f5e74f5f58e94324e00ed30Charles He private UserInfo installAndTurnOffChildProfile(int profileId) { 1698e87af55337a19cf7242a1bf2f516bc26ae65f9eAndrew Scull final UserInfo userInfo = installChildProfile(profileId); 1708e87af55337a19cf7242a1bf2f516bc26ae65f9eAndrew Scull userInfo.flags |= UserInfo.FLAG_QUIET_MODE; 171dec0540d0d1e78800f5e74f5f58e94324e00ed30Charles He when(mUserManager.isUserRunning(eq(profileId))).thenReturn(false); 172dec0540d0d1e78800f5e74f5f58e94324e00ed30Charles He when(mUserManager.isUserUnlocked(eq(profileId))).thenReturn(false); 1738e87af55337a19cf7242a1bf2f516bc26ae65f9eAndrew Scull return userInfo; 1748e87af55337a19cf7242a1bf2f516bc26ae65f9eAndrew Scull } 1758e87af55337a19cf7242a1bf2f516bc26ae65f9eAndrew Scull 176b31be1b157d9633d43e42b200a92c94e318a4e96Rubin Xu private IStorageManager setUpStorageManagerMock() throws RemoteException { 177b31be1b157d9633d43e42b200a92c94e318a4e96Rubin Xu final IStorageManager sm = mock(IStorageManager.class); 178b31be1b157d9633d43e42b200a92c94e318a4e96Rubin Xu 179b31be1b157d9633d43e42b200a92c94e318a4e96Rubin Xu doAnswer(new Answer<Void>() { 180b31be1b157d9633d43e42b200a92c94e318a4e96Rubin Xu @Override 181b31be1b157d9633d43e42b200a92c94e318a4e96Rubin Xu public Void answer(InvocationOnMock invocation) throws Throwable { 182b31be1b157d9633d43e42b200a92c94e318a4e96Rubin Xu Object[] args = invocation.getArguments(); 183b31be1b157d9633d43e42b200a92c94e318a4e96Rubin Xu mStorageManager.addUserKeyAuth((int) args[0] /* userId */, 184b31be1b157d9633d43e42b200a92c94e318a4e96Rubin Xu (int) args[1] /* serialNumber */, 185b31be1b157d9633d43e42b200a92c94e318a4e96Rubin Xu (byte[]) args[2] /* token */, 186b31be1b157d9633d43e42b200a92c94e318a4e96Rubin Xu (byte[]) args[3] /* secret */); 187b31be1b157d9633d43e42b200a92c94e318a4e96Rubin Xu return null; 188b31be1b157d9633d43e42b200a92c94e318a4e96Rubin Xu } 189b31be1b157d9633d43e42b200a92c94e318a4e96Rubin Xu }).when(sm).addUserKeyAuth(anyInt(), anyInt(), any(), any()); 190b31be1b157d9633d43e42b200a92c94e318a4e96Rubin Xu 191b31be1b157d9633d43e42b200a92c94e318a4e96Rubin Xu doAnswer( 192b31be1b157d9633d43e42b200a92c94e318a4e96Rubin Xu new Answer<Void>() { 193b31be1b157d9633d43e42b200a92c94e318a4e96Rubin Xu @Override 194b31be1b157d9633d43e42b200a92c94e318a4e96Rubin Xu public Void answer(InvocationOnMock invocation) throws Throwable { 195b31be1b157d9633d43e42b200a92c94e318a4e96Rubin Xu Object[] args = invocation.getArguments(); 196b31be1b157d9633d43e42b200a92c94e318a4e96Rubin Xu mStorageManager.fixateNewestUserKeyAuth((int) args[0] /* userId */); 197b31be1b157d9633d43e42b200a92c94e318a4e96Rubin Xu return null; 198b31be1b157d9633d43e42b200a92c94e318a4e96Rubin Xu } 199b31be1b157d9633d43e42b200a92c94e318a4e96Rubin Xu }).when(sm).fixateNewestUserKeyAuth(anyInt()); 200b31be1b157d9633d43e42b200a92c94e318a4e96Rubin Xu return sm; 201b31be1b157d9633d43e42b200a92c94e318a4e96Rubin Xu } 202b31be1b157d9633d43e42b200a92c94e318a4e96Rubin Xu 2030cbc19e4a66f7db51596b57ca91afc6f5b27f3b4Rubin Xu @Override 2040cbc19e4a66f7db51596b57ca91afc6f5b27f3b4Rubin Xu protected void tearDown() throws Exception { 2050cbc19e4a66f7db51596b57ca91afc6f5b27f3b4Rubin Xu super.tearDown(); 2060cbc19e4a66f7db51596b57ca91afc6f5b27f3b4Rubin Xu mStorage.closeDatabase(); 2070cbc19e4a66f7db51596b57ca91afc6f5b27f3b4Rubin Xu File db = getContext().getDatabasePath("locksettings.db"); 2080cbc19e4a66f7db51596b57ca91afc6f5b27f3b4Rubin Xu assertTrue(!db.exists() || db.delete()); 2090cbc19e4a66f7db51596b57ca91afc6f5b27f3b4Rubin Xu 2100cbc19e4a66f7db51596b57ca91afc6f5b27f3b4Rubin Xu File storageDir = mStorage.mStorageDir; 2110cbc19e4a66f7db51596b57ca91afc6f5b27f3b4Rubin Xu assertTrue(FileUtils.deleteContents(storageDir)); 2120cbc19e4a66f7db51596b57ca91afc6f5b27f3b4Rubin Xu } 2133bf722a8d54ca7192dfe07ee7b73eac7d25ccac5Rubin Xu 2147f4ff4c17f3668080dcefa1f8acbbff5df184f0bAndrew Scull protected void assertNotEquals(long expected, long actual) { 2157f4ff4c17f3668080dcefa1f8acbbff5df184f0bAndrew Scull assertTrue(expected != actual); 2167f4ff4c17f3668080dcefa1f8acbbff5df184f0bAndrew Scull } 2177f4ff4c17f3668080dcefa1f8acbbff5df184f0bAndrew Scull 2183bf722a8d54ca7192dfe07ee7b73eac7d25ccac5Rubin Xu protected static void assertArrayEquals(byte[] expected, byte[] actual) { 2193bf722a8d54ca7192dfe07ee7b73eac7d25ccac5Rubin Xu assertTrue(Arrays.equals(expected, actual)); 2203bf722a8d54ca7192dfe07ee7b73eac7d25ccac5Rubin Xu } 2213bf722a8d54ca7192dfe07ee7b73eac7d25ccac5Rubin Xu 2227f4ff4c17f3668080dcefa1f8acbbff5df184f0bAndrew Scull protected static void assertArrayNotEquals(byte[] expected, byte[] actual) { 2233bf722a8d54ca7192dfe07ee7b73eac7d25ccac5Rubin Xu assertFalse(Arrays.equals(expected, actual)); 2243bf722a8d54ca7192dfe07ee7b73eac7d25ccac5Rubin Xu } 2250cbc19e4a66f7db51596b57ca91afc6f5b27f3b4Rubin Xu} 226