blob: 2bc6a2e8ff5c7199ac3c02bfb48437cdffd01b1e [file] [log] [blame]
Heemin Seog34925a02018-12-04 16:45:28 -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.system;
18
19import static com.google.common.truth.Truth.assertThat;
20
21import static org.mockito.ArgumentMatchers.any;
Anthony Hugh492f1842019-07-11 13:50:15 -070022import static org.mockito.ArgumentMatchers.anyInt;
Heemin Seog34925a02018-12-04 16:45:28 -080023import static org.mockito.ArgumentMatchers.eq;
Heemin Seog34925a02018-12-04 16:45:28 -080024import static org.mockito.Mockito.when;
25
26import android.car.userlib.CarUserManagerHelper;
27import android.content.Context;
28import android.content.pm.UserInfo;
Anthony Hugh492f1842019-07-11 13:50:15 -070029import android.os.UserHandle;
Heemin Seog34925a02018-12-04 16:45:28 -080030import android.os.UserManager;
31import android.provider.Settings;
32
Heemin Seogf1ba5782018-12-18 08:45:50 -080033import androidx.lifecycle.Lifecycle;
Heemin Seog34925a02018-12-04 16:45:28 -080034import androidx.preference.Preference;
35
Heemin Seog34925a02018-12-04 16:45:28 -080036import com.android.car.settings.R;
Heemin Seogf1ba5782018-12-18 08:45:50 -080037import com.android.car.settings.common.PreferenceControllerTestHelper;
Heemin Seog34925a02018-12-04 16:45:28 -080038import com.android.car.settings.development.DevelopmentSettingsUtil;
39import com.android.car.settings.testutils.ShadowCarUserManagerHelper;
Anthony Hugh492f1842019-07-11 13:50:15 -070040import com.android.car.settings.testutils.ShadowUserManager;
Heemin Seog34925a02018-12-04 16:45:28 -080041
42import org.junit.After;
43import org.junit.Before;
44import org.junit.Test;
45import org.junit.runner.RunWith;
46import org.mockito.Mock;
47import org.mockito.MockitoAnnotations;
davidln15c93512019-06-07 16:58:00 -070048import org.robolectric.RobolectricTestRunner;
Heemin Seog34925a02018-12-04 16:45:28 -080049import org.robolectric.RuntimeEnvironment;
50import org.robolectric.annotation.Config;
51import org.robolectric.shadows.ShadowToast;
52
davidln15c93512019-06-07 16:58:00 -070053@RunWith(RobolectricTestRunner.class)
Anthony Hugh492f1842019-07-11 13:50:15 -070054@Config(shadows = {ShadowCarUserManagerHelper.class, ShadowUserManager.class})
Heemin Seog34925a02018-12-04 16:45:28 -080055public class BuildNumberPreferenceControllerTest {
56
Heemin Seog34925a02018-12-04 16:45:28 -080057 private Context mContext;
Heemin Seogf1ba5782018-12-18 08:45:50 -080058 private PreferenceControllerTestHelper<BuildNumberPreferenceController>
59 mPreferenceControllerHelper;
Heemin Seog34925a02018-12-04 16:45:28 -080060 private BuildNumberPreferenceController mController;
61 private Preference mPreference;
62 @Mock
63 private CarUserManagerHelper mCarUserManagerHelper;
Anthony Hugh492f1842019-07-11 13:50:15 -070064 @Mock
65 private UserManager mUserManager;
Heemin Seog34925a02018-12-04 16:45:28 -080066
67 @Before
68 public void setUp() {
69 MockitoAnnotations.initMocks(this);
70 ShadowCarUserManagerHelper.setMockInstance(mCarUserManagerHelper);
Anthony Hugh492f1842019-07-11 13:50:15 -070071 ShadowUserManager.setInstance(mUserManager);
Heemin Seog34925a02018-12-04 16:45:28 -080072 mContext = RuntimeEnvironment.application;
Heemin Seog34925a02018-12-04 16:45:28 -080073 mPreference = new Preference(mContext);
Heemin Seogf1ba5782018-12-18 08:45:50 -080074 mPreferenceControllerHelper = new PreferenceControllerTestHelper<>(mContext,
75 BuildNumberPreferenceController.class, mPreference);
76 mController = mPreferenceControllerHelper.getController();
Heemin Seog34925a02018-12-04 16:45:28 -080077
78 // By default, user is an admin user.
79 when(mCarUserManagerHelper.isCurrentProcessAdminUser()).thenReturn(true);
80 when(mCarUserManagerHelper.isCurrentProcessDemoUser()).thenReturn(false);
81
82 // By default, no restrictions on debugging features.
83 when(mCarUserManagerHelper.getCurrentProcessUserInfo()).thenReturn(new UserInfo());
Anthony Hugh492f1842019-07-11 13:50:15 -070084 when(mUserManager.hasUserRestriction(eq(UserManager.DISALLOW_DEBUGGING_FEATURES),
85 any(UserHandle.class))).thenReturn(false);
Heemin Seog34925a02018-12-04 16:45:28 -080086
87 // By default device is provisioned.
Heemin Seogf1ba5782018-12-18 08:45:50 -080088 Settings.Global.putInt(mContext.getContentResolver(),
89 Settings.Global.DEVICE_PROVISIONED, 1);
Heemin Seog34925a02018-12-04 16:45:28 -080090
91 // By default development settings is disabled.
92 Settings.Global.putInt(mContext.getContentResolver(),
93 Settings.Global.DEVELOPMENT_SETTINGS_ENABLED, 0);
Heemin Seogf1ba5782018-12-18 08:45:50 -080094 mPreferenceControllerHelper.sendLifecycleEvent(Lifecycle.Event.ON_RESUME);
Anthony Hugh492f1842019-07-11 13:50:15 -070095
96 when(mUserManager.getUserInfo(anyInt())).thenReturn(new UserInfo(10, null, 0));
Heemin Seog34925a02018-12-04 16:45:28 -080097 }
98
99 @After
100 public void tearDown() {
101 ShadowCarUserManagerHelper.reset();
Anthony Hugh492f1842019-07-11 13:50:15 -0700102 ShadowUserManager.reset();
Heemin Seog34925a02018-12-04 16:45:28 -0800103 }
104
105 @Test
Heemin Seogf1ba5782018-12-18 08:45:50 -0800106 public void testHandlePreferenceClicked_notProvisioned_returnFalse() {
107 Settings.Global.putInt(mContext.getContentResolver(),
108 Settings.Global.DEVICE_PROVISIONED, 0);
109 assertThat(mController.handlePreferenceClicked(mPreference)).isFalse();
Heemin Seog34925a02018-12-04 16:45:28 -0800110 }
111
112 @Test
Heemin Seogf1ba5782018-12-18 08:45:50 -0800113 public void testHandlePreferenceClicked_nonAdmin_returnFalse() {
Heemin Seog34925a02018-12-04 16:45:28 -0800114 when(mCarUserManagerHelper.isCurrentProcessAdminUser()).thenReturn(false);
115 when(mCarUserManagerHelper.isCurrentProcessDemoUser()).thenReturn(false);
116
Heemin Seogf1ba5782018-12-18 08:45:50 -0800117 assertThat(mController.handlePreferenceClicked(mPreference)).isFalse();
Heemin Seog34925a02018-12-04 16:45:28 -0800118 }
119
120 @Test
Heemin Seogf1ba5782018-12-18 08:45:50 -0800121 public void testHandlePreferenceClicked_demoUser_returnsTrue() {
Heemin Seog34925a02018-12-04 16:45:28 -0800122 when(mCarUserManagerHelper.isCurrentProcessAdminUser()).thenReturn(false);
123 when(mCarUserManagerHelper.isCurrentProcessDemoUser()).thenReturn(true);
124
Heemin Seogf1ba5782018-12-18 08:45:50 -0800125 assertThat(mController.handlePreferenceClicked(mPreference)).isTrue();
Heemin Seog34925a02018-12-04 16:45:28 -0800126 }
127
128 @Test
Heemin Seogf1ba5782018-12-18 08:45:50 -0800129 public void testHandlePreferenceClicked_adminUser_returnsTrue() {
130 assertThat(mController.handlePreferenceClicked(mPreference)).isTrue();
Heemin Seog34925a02018-12-04 16:45:28 -0800131 }
132
133 @Test
Heemin Seogf1ba5782018-12-18 08:45:50 -0800134 public void testHandlePreferenceClicked_devSettingsDisabled_firstClick_noToast() {
135 mPreference.performClick();
Heemin Seog34925a02018-12-04 16:45:28 -0800136 assertThat(ShadowToast.shownToastCount()).isEqualTo(0);
137 }
138
139 @Test
Heemin Seogf1ba5782018-12-18 08:45:50 -0800140 public void testHandlePreferenceClicked_devSettingsDisabled_someClicks_showToast() {
Heemin Seog34925a02018-12-04 16:45:28 -0800141 for (int i = 0; i < getTapsToShowToast(); i++) {
Heemin Seogf1ba5782018-12-18 08:45:50 -0800142 mPreference.performClick();
Heemin Seog34925a02018-12-04 16:45:28 -0800143 }
144
145 int remainingClicks = getTapsToBecomeDeveloper() - getTapsToShowToast();
146 assertThat(ShadowToast.getTextOfLatestToast()).isEqualTo(
147 mContext.getResources().getQuantityString(R.plurals.show_dev_countdown,
148 remainingClicks, remainingClicks));
149 }
150
151 @Test
Heemin Seogf1ba5782018-12-18 08:45:50 -0800152 public void testHandlePreferenceClicked_devSettingsDisabled_allClicks_showDevEnabledToast() {
Heemin Seog34925a02018-12-04 16:45:28 -0800153 for (int i = 0; i < getTapsToBecomeDeveloper(); i++) {
Heemin Seogf1ba5782018-12-18 08:45:50 -0800154 mPreference.performClick();
Heemin Seog34925a02018-12-04 16:45:28 -0800155 }
156 assertThat(ShadowToast.getTextOfLatestToast()).isEqualTo(
157 mContext.getString(R.string.show_dev_on));
158 }
159
160 @Test
Heemin Seogf1ba5782018-12-18 08:45:50 -0800161 public void testHandlePreferenceClicked_devSettingsDisabled_allClicks_devSettingsEnabled() {
Heemin Seog34925a02018-12-04 16:45:28 -0800162 for (int i = 0; i < getTapsToBecomeDeveloper(); i++) {
Heemin Seogf1ba5782018-12-18 08:45:50 -0800163 mPreference.performClick();
Heemin Seog34925a02018-12-04 16:45:28 -0800164 }
165 assertThat(DevelopmentSettingsUtil.isDevelopmentSettingsEnabled(mContext,
Anthony Hugh492f1842019-07-11 13:50:15 -0700166 mCarUserManagerHelper, mUserManager)).isTrue();
Heemin Seog34925a02018-12-04 16:45:28 -0800167 }
168
169 @Test
Heemin Seogf1ba5782018-12-18 08:45:50 -0800170 public void testHandlePreferenceClicked_devSettingsDisabled_extraClicks_noAlreadyDevToast() {
Heemin Seog34925a02018-12-04 16:45:28 -0800171 int extraClicks = 100;
172 for (int i = 0; i < getTapsToBecomeDeveloper() + extraClicks; i++) {
Heemin Seogf1ba5782018-12-18 08:45:50 -0800173 mPreference.performClick();
Heemin Seog34925a02018-12-04 16:45:28 -0800174 }
175 assertThat(
176 ShadowToast.showedToast(mContext.getString(R.string.show_dev_already))).isFalse();
177 }
178
179 @Test
Heemin Seogf1ba5782018-12-18 08:45:50 -0800180 public void testHandlePreferenceClicked_devSettingsEnabled_click_showAlreadyDevToast() {
Heemin Seog34925a02018-12-04 16:45:28 -0800181 Settings.Global.putInt(mContext.getContentResolver(),
182 Settings.Global.DEVELOPMENT_SETTINGS_ENABLED, 1);
Heemin Seogf1ba5782018-12-18 08:45:50 -0800183 mPreferenceControllerHelper.sendLifecycleEvent(Lifecycle.Event.ON_PAUSE);
184 mPreferenceControllerHelper.sendLifecycleEvent(Lifecycle.Event.ON_RESUME);
185 mPreference.performClick();
Heemin Seog34925a02018-12-04 16:45:28 -0800186 assertThat(ShadowToast.showedToast(mContext.getString(R.string.show_dev_already))).isTrue();
187 }
188
189 private int getTapsToBecomeDeveloper() {
190 return mContext.getResources().getInteger(R.integer.enable_developer_settings_click_count);
191 }
192
193 private int getTapsToShowToast() {
194 return mContext.getResources().getInteger(
195 R.integer.enable_developer_settings_clicks_to_show_toast_count);
196 }
197}