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