1 /* 2 * Copyright (C) 2020 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.documentsui; 18 19 import static com.google.common.truth.Truth.assertThat; 20 21 import static org.mockito.Mockito.mock; 22 import static org.mockito.Mockito.when; 23 24 import android.Manifest; 25 import android.content.Context; 26 import android.content.pm.PackageManager; 27 import android.os.UserHandle; 28 import android.os.UserManager; 29 30 import androidx.test.filters.SmallTest; 31 32 import com.android.documentsui.base.UserId; 33 import com.android.documentsui.util.VersionUtils; 34 35 import org.junit.Before; 36 import org.junit.Test; 37 38 import java.util.Arrays; 39 import java.util.List; 40 41 @SmallTest 42 public class UserIdManagerTest { 43 44 private final UserHandle systemUser = UserHandle.SYSTEM; 45 private final UserHandle managedUser1 = UserHandle.of(100); 46 private final UserHandle nonManagedUser1 = UserHandle.of(200); 47 private final UserHandle nonManagedUser2 = UserHandle.of(201); 48 49 private final Context mockContext = mock(Context.class); 50 private final UserManager mockUserManager = mock(UserManager.class); 51 52 private UserIdManager mUserIdManager; 53 54 @Before setUp()55 public void setUp() throws Exception { 56 when(mockContext.getApplicationContext()).thenReturn(mockContext); 57 58 when(mockUserManager.isManagedProfile(managedUser1.getIdentifier())).thenReturn(true); 59 when(mockUserManager.isManagedProfile(systemUser.getIdentifier())).thenReturn(false); 60 when(mockUserManager.isManagedProfile(nonManagedUser1.getIdentifier())).thenReturn(false); 61 when(mockUserManager.isManagedProfile(nonManagedUser2.getIdentifier())).thenReturn(false); 62 63 when(mockContext.getSystemService(Context.USER_SERVICE)).thenReturn(mockUserManager); 64 } 65 66 // common cases for getUserIds 67 @Test testGetUserIds_systemUser_currentUserIsSystemUser()68 public void testGetUserIds_systemUser_currentUserIsSystemUser() { 69 // Returns the current user if there is only system user. 70 UserId currentUser = UserId.of(systemUser); 71 initializeUserIdManager(currentUser, Arrays.asList(systemUser)); 72 assertThat(mUserIdManager.getUserIds()).containsExactly(UserId.of(systemUser)); 73 } 74 75 @Test testGetUserIds_systemUserAndManagedUser_currentUserIsSystemUser()76 public void testGetUserIds_systemUserAndManagedUser_currentUserIsSystemUser() { 77 // Returns the both if there are system and managed users. 78 UserId currentUser = UserId.of(systemUser); 79 initializeUserIdManager(currentUser, Arrays.asList(systemUser, managedUser1)); 80 assertThat(mUserIdManager.getUserIds()) 81 .containsExactly(UserId.of(systemUser), UserId.of(managedUser1)).inOrder(); 82 } 83 84 @Test testGetUserIds_systemUserAndManagedUser_currentUserIsManagedUser()85 public void testGetUserIds_systemUserAndManagedUser_currentUserIsManagedUser() { 86 // Returns the both if there are system and managed users. 87 UserId currentUser = UserId.of(managedUser1); 88 initializeUserIdManager(currentUser, Arrays.asList(systemUser, managedUser1)); 89 assertThat(mUserIdManager.getUserIds()) 90 .containsExactly(UserId.of(systemUser), UserId.of(managedUser1)).inOrder(); 91 } 92 93 @Test testGetUserIds_managedUserAndSystemUser_currentUserIsSystemUser()94 public void testGetUserIds_managedUserAndSystemUser_currentUserIsSystemUser() { 95 // Returns the both if there are system and managed users, regardless of input list order. 96 UserId currentUser = UserId.of(systemUser); 97 initializeUserIdManager(currentUser, Arrays.asList(managedUser1, systemUser)); 98 assertThat(mUserIdManager.getUserIds()) 99 .containsExactly(UserId.of(systemUser), UserId.of(managedUser1)).inOrder(); 100 } 101 102 // other cases for getUserIds 103 @Test testGetUserIds_NormalUser1AndNormalUser2_currentUserIsNormalUser2()104 public void testGetUserIds_NormalUser1AndNormalUser2_currentUserIsNormalUser2() { 105 // When there is no managed user, returns the current user. 106 UserId currentUser = UserId.of(nonManagedUser2); 107 initializeUserIdManager(currentUser, Arrays.asList(nonManagedUser1, nonManagedUser2)); 108 assertThat(mUserIdManager.getUserIds()).containsExactly(UserId.of(nonManagedUser2)); 109 } 110 111 @Test testGetUserIds_NormalUserAndManagedUser_currentUserIsNormalUser()112 public void testGetUserIds_NormalUserAndManagedUser_currentUserIsNormalUser() { 113 // When there is no system user, returns the current user. 114 // This is a case theoretically can happen but we don't expect. So we return the current 115 // user only. 116 UserId currentUser = UserId.of(nonManagedUser1); 117 initializeUserIdManager(currentUser, Arrays.asList(nonManagedUser1, managedUser1)); 118 assertThat(mUserIdManager.getUserIds()).containsExactly(UserId.of(nonManagedUser1)); 119 } 120 121 @Test testGetUserIds_NormalUserAndManagedUser_currentUserIsManagedUser()122 public void testGetUserIds_NormalUserAndManagedUser_currentUserIsManagedUser() { 123 // When there is no system user, returns the current user. 124 // This is a case theoretically can happen but we don't expect. So we return the current 125 // user only. 126 UserId currentUser = UserId.of(managedUser1); 127 initializeUserIdManager(currentUser, Arrays.asList(nonManagedUser1, managedUser1)); 128 assertThat(mUserIdManager.getUserIds()).containsExactly(UserId.of(managedUser1)); 129 } 130 131 @Test testGetUserIds_deviceNotSupported()132 public void testGetUserIds_deviceNotSupported() { 133 // we should return the current user when device is not supported. 134 UserId currentUser = UserId.of(systemUser); 135 when(mockUserManager.getUserProfiles()).thenReturn(Arrays.asList(systemUser, managedUser1)); 136 mUserIdManager = new UserIdManager.RuntimeUserIdManager(mockContext, currentUser, false); 137 assertThat(mUserIdManager.getUserIds()).containsExactly(UserId.of(systemUser)); 138 } 139 140 @Test testGetUserIds_deviceWithoutPermission()141 public void testGetUserIds_deviceWithoutPermission() { 142 // This test only tests for Android R or later. This test case always passes before R. 143 if (VersionUtils.isAtLeastR()) { 144 // When permission is denied, only returns the current user. 145 when(mockContext.checkSelfPermission(Manifest.permission.INTERACT_ACROSS_USERS)) 146 .thenReturn(PackageManager.PERMISSION_DENIED); 147 UserId currentUser = UserId.of(systemUser); 148 when(mockUserManager.getUserProfiles()).thenReturn( 149 Arrays.asList(systemUser, managedUser1)); 150 mUserIdManager = UserIdManager.create(mockContext); 151 assertThat(mUserIdManager.getUserIds()).containsExactly(UserId.of(systemUser)); 152 } 153 } 154 155 @Test testGetUserIds_systemUserAndManagedUser_returnCachedList()156 public void testGetUserIds_systemUserAndManagedUser_returnCachedList() { 157 // Returns the both if there are system and managed users. 158 UserId currentUser = UserId.of(systemUser); 159 initializeUserIdManager(currentUser, Arrays.asList(systemUser, managedUser1)); 160 assertThat(mUserIdManager.getUserIds()).isSameInstanceAs(mUserIdManager.getUserIds()); 161 } 162 163 @Test testGetManagedUser_contains()164 public void testGetManagedUser_contains() { 165 UserId currentUser = UserId.of(systemUser); 166 initializeUserIdManager(currentUser, Arrays.asList(systemUser, managedUser1)); 167 assertThat(mUserIdManager.getManagedUser()).isEqualTo(UserId.of(managedUser1)); 168 } 169 170 @Test testGetSystemUser_contains()171 public void testGetSystemUser_contains() { 172 UserId currentUser = UserId.of(systemUser); 173 initializeUserIdManager(currentUser, Arrays.asList(systemUser, managedUser1)); 174 assertThat(mUserIdManager.getSystemUser()).isEqualTo(UserId.of(systemUser)); 175 } 176 177 @Test testGetSystemUser_singletonList_returnNull()178 public void testGetSystemUser_singletonList_returnNull() { 179 UserId currentUser = UserId.of(systemUser); 180 initializeUserIdManager(currentUser, Arrays.asList(systemUser)); 181 assertThat(mUserIdManager.getSystemUser()).isNull(); 182 } 183 184 @Test testGetManagedUser_missing()185 public void testGetManagedUser_missing() { 186 UserId currentUser = UserId.of(systemUser); 187 initializeUserIdManager(currentUser, Arrays.asList(systemUser, nonManagedUser1)); 188 assertThat(mUserIdManager.getManagedUser()).isNull(); 189 } 190 initializeUserIdManager(UserId current, List<UserHandle> usersOnDevice)191 private void initializeUserIdManager(UserId current, List<UserHandle> usersOnDevice) { 192 when(mockUserManager.getUserProfiles()).thenReturn(usersOnDevice); 193 mUserIdManager = new UserIdManager.RuntimeUserIdManager(mockContext, current, true); 194 } 195 } 196