blob: 288274509eec5380cb51de1e5234169b6d1429f4 [file] [log] [blame]
Heemin Seog9d5e9072018-11-13 10:20:49 -08001/*
2 * Copyright (C) 2018 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
17package com.android.car.settings.users;
18
19import static com.google.common.truth.Truth.assertThat;
20
Heemin Seog9d5e9072018-11-13 10:20:49 -080021import static org.mockito.Mockito.when;
22
23import android.car.userlib.CarUserManagerHelper;
24import android.content.pm.UserInfo;
Anthony Hugh492f1842019-07-11 13:50:15 -070025import android.os.Process;
Anthony Hugh095c3522019-07-08 15:13:28 -070026import android.os.UserHandle;
Heemin Seog9d5e9072018-11-13 10:20:49 -080027import android.os.UserManager;
28import android.view.View;
29import android.widget.Button;
30
Heemin Seog9d5e9072018-11-13 10:20:49 -080031import com.android.car.settings.R;
kwakyfc2851b2019-03-01 14:56:56 -080032import com.android.car.settings.common.ConfirmationDialogFragment;
Heemin Seog9d5e9072018-11-13 10:20:49 -080033import com.android.car.settings.testutils.BaseTestActivity;
34import com.android.car.settings.testutils.ShadowCarUserManagerHelper;
35import com.android.car.settings.testutils.ShadowUserIconProvider;
36import com.android.car.settings.testutils.ShadowUserManager;
37
38import org.junit.After;
39import org.junit.Before;
40import org.junit.Test;
41import org.junit.runner.RunWith;
42import org.mockito.Mock;
43import org.mockito.MockitoAnnotations;
44import org.robolectric.Robolectric;
davidln15c93512019-06-07 16:58:00 -070045import org.robolectric.RobolectricTestRunner;
Anthony Hugh492f1842019-07-11 13:50:15 -070046import org.robolectric.RuntimeEnvironment;
Heemin Seog9d5e9072018-11-13 10:20:49 -080047import org.robolectric.annotation.Config;
Anthony Hugh492f1842019-07-11 13:50:15 -070048import org.robolectric.shadow.api.Shadow;
Heemin Seog9d5e9072018-11-13 10:20:49 -080049
50import java.util.Arrays;
51
davidln15c93512019-06-07 16:58:00 -070052@RunWith(RobolectricTestRunner.class)
Heemin Seog9d5e9072018-11-13 10:20:49 -080053@Config(shadows = {ShadowUserManager.class, ShadowCarUserManagerHelper.class,
54 ShadowUserIconProvider.class})
55public class UserDetailsBaseFragmentTest {
56
57 /*
58 * This class needs to be public and static in order for it to be recreated from instance
59 * state if necessary.
60 */
61 public static class TestUserDetailsBaseFragment extends UserDetailsBaseFragment {
62
63 @Override
64 protected String getTitleText() {
65 return "test_title";
66 }
67
68 @Override
69 protected int getPreferenceScreenResId() {
Heemin Seog8a470d72018-12-12 16:19:03 -080070 return R.xml.test_user_details_base_fragment;
Heemin Seog9d5e9072018-11-13 10:20:49 -080071 }
72 }
73
74 private BaseTestActivity mTestActivity;
75 private UserDetailsBaseFragment mUserDetailsBaseFragment;
76 @Mock
77 private CarUserManagerHelper mCarUserManagerHelper;
78 @Mock
79 private UserManager mUserManager;
80
81 private Button mRemoveUserButton;
82
83 @Before
84 public void setUpTestActivity() {
85 MockitoAnnotations.initMocks(this);
86 ShadowCarUserManagerHelper.setMockInstance(mCarUserManagerHelper);
87 ShadowUserManager.setInstance(mUserManager);
88
89 mTestActivity = Robolectric.setupActivity(BaseTestActivity.class);
90 }
91
92 @After
93 public void tearDown() {
94 ShadowCarUserManagerHelper.reset();
95 ShadowUserManager.reset();
96 }
97
98 @Test
99 public void testRemoveUserButtonVisible_whenAllowedToRemoveUsers() {
Anthony Hugh492f1842019-07-11 13:50:15 -0700100 getShadowUserManager().setUserRestriction(
101 Process.myUserHandle(), UserManager.DISALLOW_REMOVE_USER, false);
Heemin Seog9d5e9072018-11-13 10:20:49 -0800102 when(mCarUserManagerHelper.isCurrentProcessDemoUser()).thenReturn(false);
Anthony Hugh095c3522019-07-08 15:13:28 -0700103 createUserDetailsBaseFragment(/*userId=*/1);
Heemin Seog9d5e9072018-11-13 10:20:49 -0800104
105 assertThat(mRemoveUserButton.getVisibility()).isEqualTo(View.VISIBLE);
106 }
107
108 @Test
Anthony Hugh095c3522019-07-08 15:13:28 -0700109 public void testRemoveUserButtonHidden_whenNotAllowedToRemoveUsers() {
Anthony Hugh492f1842019-07-11 13:50:15 -0700110 getShadowUserManager().setUserRestriction(
111 Process.myUserHandle(), UserManager.DISALLOW_REMOVE_USER, true);
Heemin Seog9d5e9072018-11-13 10:20:49 -0800112 when(mCarUserManagerHelper.isCurrentProcessDemoUser()).thenReturn(false);
Anthony Hugh095c3522019-07-08 15:13:28 -0700113 createUserDetailsBaseFragment(/*userId=*/1);
Heemin Seog9d5e9072018-11-13 10:20:49 -0800114
115 assertThat(mRemoveUserButton.getVisibility()).isEqualTo(View.GONE);
116 }
117
118 @Test
Anthony Hugh095c3522019-07-08 15:13:28 -0700119 public void testRemoveUserButtonHidden_whenUserIsSystemUser() {
Anthony Hugh492f1842019-07-11 13:50:15 -0700120 getShadowUserManager().setUserRestriction(
121 Process.myUserHandle(), UserManager.DISALLOW_REMOVE_USER, false);
Heemin Seog9d5e9072018-11-13 10:20:49 -0800122 when(mCarUserManagerHelper.isCurrentProcessDemoUser()).thenReturn(false);
Anthony Hugh095c3522019-07-08 15:13:28 -0700123 createUserDetailsBaseFragment(UserHandle.USER_SYSTEM);
Heemin Seog9d5e9072018-11-13 10:20:49 -0800124
125 assertThat(mRemoveUserButton.getVisibility()).isEqualTo(View.GONE);
126 }
127
128 @Test
129 public void testRemoveUserButtonHidden_demoUser() {
Anthony Hugh492f1842019-07-11 13:50:15 -0700130 getShadowUserManager().setUserRestriction(
131 Process.myUserHandle(), UserManager.DISALLOW_REMOVE_USER, false);
Heemin Seog9d5e9072018-11-13 10:20:49 -0800132 when(mCarUserManagerHelper.isCurrentProcessDemoUser()).thenReturn(true);
Anthony Hugh095c3522019-07-08 15:13:28 -0700133 createUserDetailsBaseFragment(/*userId=*/1);
Heemin Seog9d5e9072018-11-13 10:20:49 -0800134
135 assertThat(mRemoveUserButton.getVisibility()).isEqualTo(View.GONE);
136 }
137
138 @Test
139 public void testRemoveUserButtonClick_createsRemovalDialog() {
Anthony Hugh492f1842019-07-11 13:50:15 -0700140 getShadowUserManager().setUserRestriction(
141 Process.myUserHandle(), UserManager.DISALLOW_REMOVE_USER, false);
Heemin Seog9d5e9072018-11-13 10:20:49 -0800142 when(mCarUserManagerHelper.isCurrentProcessDemoUser()).thenReturn(false);
143 when(mCarUserManagerHelper.getAllPersistentUsers()).thenReturn(
144 Arrays.asList(new UserInfo()));
Anthony Hugh095c3522019-07-08 15:13:28 -0700145 createUserDetailsBaseFragment(/*userId=*/1);
Heemin Seog9d5e9072018-11-13 10:20:49 -0800146 mRemoveUserButton.performClick();
147
kwakyfc2851b2019-03-01 14:56:56 -0800148 assertThat(mUserDetailsBaseFragment.findDialogByTag(
149 ConfirmationDialogFragment.TAG)).isNotNull();
Heemin Seog9d5e9072018-11-13 10:20:49 -0800150 }
151
Anthony Hugh095c3522019-07-08 15:13:28 -0700152 private void createUserDetailsBaseFragment(int userId) {
Heemin Seog9d5e9072018-11-13 10:20:49 -0800153 UserInfo testUser = new UserInfo();
Anthony Hugh095c3522019-07-08 15:13:28 -0700154 testUser.id = userId;
Heemin Seog9d5e9072018-11-13 10:20:49 -0800155 // Use UserDetailsFragment, since we cannot test an abstract class.
156 mUserDetailsBaseFragment = UserDetailsBaseFragment.addUserIdToFragmentArguments(
157 new TestUserDetailsBaseFragment(), testUser.id);
158 when(mUserManager.getUserInfo(testUser.id)).thenReturn(testUser);
159 mTestActivity.launchFragment(mUserDetailsBaseFragment);
Heemin Seog9d5e9072018-11-13 10:20:49 -0800160 mRemoveUserButton = (Button) mTestActivity.findViewById(R.id.action_button1);
161 }
Anthony Hugh492f1842019-07-11 13:50:15 -0700162
163 private ShadowUserManager getShadowUserManager() {
164 return Shadow.extract(RuntimeEnvironment.application.getSystemService(UserManager.class));
165 }
Heemin Seog9d5e9072018-11-13 10:20:49 -0800166}