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