1 /* 2 * Copyright (C) 2019 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.locksettings.recoverablekeystore.storage; 18 19 import static org.mockito.ArgumentMatchers.eq; 20 import static org.mockito.Mockito.times; 21 import static org.mockito.Mockito.verify; 22 import static org.mockito.Mockito.when; 23 24 import android.content.Context; 25 import android.os.UserHandle; 26 import android.os.UserManager; 27 28 import androidx.test.InstrumentationRegistry; 29 import androidx.test.filters.SmallTest; 30 import androidx.test.runner.AndroidJUnit4; 31 32 import org.junit.Before; 33 import org.junit.Test; 34 import org.junit.runner.RunWith; 35 import org.mockito.Mock; 36 import org.mockito.MockitoAnnotations; 37 38 import java.util.ArrayList; 39 import java.util.HashMap; 40 import java.util.List; 41 import java.util.Map; 42 43 @SmallTest 44 @RunWith(AndroidJUnit4.class) 45 public class CleanupManagerTest { 46 private static final int USER_ID = 10; 47 private static final int USER_ID_2 = 20; 48 private static final int UID = 1234; 49 private static final long USER_SERIAL_NUMBER = 101L; 50 private static final long USER_SERIAL_NUMBER_2 = 202L; 51 52 private Context mContext; 53 private CleanupManager mManager; 54 55 @Mock private RecoverableKeyStoreDb mDatabase; 56 @Mock private RecoverySnapshotStorage mRecoverySnapshotStorage; 57 @Mock private UserManager mUserManager; 58 @Mock private ApplicationKeyStorage mApplicationKeyStorage; 59 60 @Before setUp()61 public void setUp() throws Exception { 62 MockitoAnnotations.initMocks(this); 63 mContext = InstrumentationRegistry.getTargetContext(); 64 mManager = new CleanupManager(mContext, mRecoverySnapshotStorage, mDatabase, mUserManager, 65 mApplicationKeyStorage); 66 } 67 68 @Test registerRecoveryAgent_unknownUser_storesInDb()69 public void registerRecoveryAgent_unknownUser_storesInDb() throws Exception { 70 when(mDatabase.getUserSerialNumbers()).thenReturn(new HashMap<>()); 71 when(mUserManager.getSerialNumberForUser(eq(UserHandle.of(USER_ID)))) 72 .thenReturn(USER_SERIAL_NUMBER); 73 when(mUserManager.getSerialNumberForUser(eq(UserHandle.of(USER_ID_2)))) 74 .thenReturn(USER_SERIAL_NUMBER_2); 75 76 mManager.registerRecoveryAgent(USER_ID, UID); 77 mManager.registerRecoveryAgent(USER_ID_2, UID); 78 79 verify(mDatabase).setUserSerialNumber(USER_ID, USER_SERIAL_NUMBER); 80 verify(mDatabase).setUserSerialNumber(USER_ID_2, USER_SERIAL_NUMBER_2); 81 82 } 83 84 @Test registerRecoveryAgent_registersSameUser_doesntChangeDb()85 public void registerRecoveryAgent_registersSameUser_doesntChangeDb() throws Exception { 86 when(mDatabase.getUserSerialNumbers()).thenReturn(new HashMap<>()); 87 when(mUserManager.getSerialNumberForUser(eq(UserHandle.of(USER_ID)))) 88 .thenReturn(USER_SERIAL_NUMBER); 89 90 mManager.registerRecoveryAgent(USER_ID, UID); 91 mManager.registerRecoveryAgent(USER_ID, UID); // ignored. 92 93 verify(mDatabase, times(1)).setUserSerialNumber(USER_ID, USER_SERIAL_NUMBER); 94 } 95 96 @Test verifyKnownUsers_newSerialNumber_deletesData()97 public void verifyKnownUsers_newSerialNumber_deletesData() throws Exception { 98 Map knownSerialNumbers = new HashMap<>(); 99 knownSerialNumbers.put(USER_ID, USER_SERIAL_NUMBER); 100 when(mDatabase.getUserSerialNumbers()).thenReturn(knownSerialNumbers); 101 List<Integer> recoveryAgents = new ArrayList<>(); 102 recoveryAgents.add(UID); 103 when(mDatabase.getRecoveryAgents(USER_ID)).thenReturn(recoveryAgents); 104 105 when(mUserManager.getSerialNumberForUser(eq(UserHandle.of(USER_ID)))) 106 .thenReturn(USER_SERIAL_NUMBER_2); // new value 107 108 109 mManager.verifyKnownUsers(); 110 111 verify(mDatabase).removeUserFromAllTables(USER_ID); 112 verify(mDatabase).setUserSerialNumber(USER_ID, USER_SERIAL_NUMBER_2); 113 verify(mRecoverySnapshotStorage).remove(UID); 114 } 115 } 116 117