1 /* 2 * Copyright (C) 2016 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.settings.deviceinfo; 18 19 import static com.google.common.truth.Truth.assertThat; 20 import static org.mockito.Answers.RETURNS_DEEP_STUBS; 21 import static org.mockito.Matchers.any; 22 import static org.mockito.Matchers.eq; 23 import static org.mockito.Mockito.mock; 24 import static org.mockito.Mockito.never; 25 import static org.mockito.Mockito.verify; 26 import static org.mockito.Mockito.when; 27 28 import android.app.Activity; 29 import android.app.Fragment; 30 import android.arch.lifecycle.LifecycleOwner; 31 import android.content.Context; 32 import android.os.Build; 33 import android.os.Process; 34 import android.os.UserManager; 35 import android.provider.Settings; 36 import android.support.v7.preference.Preference; 37 import android.support.v7.preference.PreferenceScreen; 38 import android.text.BidiFormatter; 39 40 import com.android.internal.logging.nano.MetricsProto; 41 import com.android.settings.search.DatabaseIndexingManager; 42 import com.android.settings.testutils.FakeFeatureFactory; 43 import com.android.settings.testutils.SettingsRobolectricTestRunner; 44 import com.android.settings.testutils.shadow.ShadowUtils; 45 import com.android.settingslib.core.lifecycle.Lifecycle; 46 import com.android.settingslib.development.DevelopmentSettingsEnabler; 47 48 import org.junit.After; 49 import org.junit.Before; 50 import org.junit.Test; 51 import org.junit.runner.RunWith; 52 import org.mockito.Answers; 53 import org.mockito.Mock; 54 import org.mockito.MockitoAnnotations; 55 import org.robolectric.RuntimeEnvironment; 56 import org.robolectric.Shadows; 57 import org.robolectric.annotation.Config; 58 import org.robolectric.shadows.ShadowUserManager; 59 60 @RunWith(SettingsRobolectricTestRunner.class) 61 @Config(shadows = ShadowUtils.class) 62 public class BuildNumberPreferenceControllerTest { 63 64 @Mock(answer = Answers.RETURNS_DEEP_STUBS) 65 private Activity mActivity; 66 @Mock(answer = Answers.RETURNS_DEEP_STUBS) 67 private Fragment mFragment; 68 @Mock(answer = RETURNS_DEEP_STUBS) 69 private PreferenceScreen mScreen; 70 71 private ShadowUserManager mShadowUserManager; 72 73 private Context mContext; 74 private LifecycleOwner mLifecycleOwner; 75 private Lifecycle mLifecycle; 76 private FakeFeatureFactory mFactory; 77 private Preference mPreference; 78 private BuildNumberPreferenceController mController; 79 80 @Before setUp()81 public void setUp() { 82 MockitoAnnotations.initMocks(this); 83 mContext = RuntimeEnvironment.application; 84 final UserManager userManager = 85 (UserManager) mContext.getSystemService(Context.USER_SERVICE); 86 mShadowUserManager = Shadows.shadowOf(userManager); 87 mShadowUserManager.setIsAdminUser(true); 88 mFactory = FakeFeatureFactory.setupForTest(); 89 mLifecycleOwner = () -> mLifecycle; 90 mLifecycle = new Lifecycle(mLifecycleOwner); 91 mController = 92 new BuildNumberPreferenceController(mContext, mActivity, mFragment, mLifecycle); 93 94 mPreference = new Preference(mContext); 95 mPreference.setKey(mController.getPreferenceKey()); 96 DevelopmentSettingsEnabler.setDevelopmentSettingsEnabled(mContext, false); 97 Settings.Global.putInt(mContext.getContentResolver(), 98 Settings.Global.DEVICE_PROVISIONED, 1); 99 } 100 101 @After tearDown()102 public void tearDown() { 103 ShadowUtils.reset(); 104 mShadowUserManager.setIsAdminUser(false); 105 mShadowUserManager.setIsDemoUser(false); 106 } 107 108 @Test displayPref_shouldAlwaysDisplay()109 public void displayPref_shouldAlwaysDisplay() { 110 mController.displayPreference(mScreen); 111 112 verify(mScreen.findPreference(mController.getPreferenceKey())) 113 .setSummary(BidiFormatter.getInstance().unicodeWrap(Build.DISPLAY)); 114 verify(mScreen, never()).removePreference(any(Preference.class)); 115 } 116 117 @Test handlePrefTreeClick_onlyHandleBuildNumberPref()118 public void handlePrefTreeClick_onlyHandleBuildNumberPref() { 119 assertThat(mController.handlePreferenceTreeClick(mock(Preference.class))).isFalse(); 120 } 121 122 @Test handlePrefTreeClick_notAdminUser_notDemoUser_doNothing()123 public void handlePrefTreeClick_notAdminUser_notDemoUser_doNothing() { 124 mShadowUserManager.setIsAdminUser(false); 125 mShadowUserManager.setIsDemoUser(false); 126 127 assertThat(mController.handlePreferenceTreeClick(mPreference)).isFalse(); 128 } 129 130 @Test handlePrefTreeClick_isAdminUser_notDemoUser_handleBuildNumberPref()131 public void handlePrefTreeClick_isAdminUser_notDemoUser_handleBuildNumberPref() { 132 mShadowUserManager.setIsAdminUser(true); 133 mShadowUserManager.setIsDemoUser(false); 134 135 assertThat(mController.handlePreferenceTreeClick(mPreference)).isTrue(); 136 } 137 138 @Test handlePrefTreeClick_notAdminUser_isDemoUser_handleBuildNumberPref()139 public void handlePrefTreeClick_notAdminUser_isDemoUser_handleBuildNumberPref() { 140 mShadowUserManager.setIsAdminUser(false); 141 mShadowUserManager.setIsDemoUser(true); 142 143 assertThat(mController.handlePreferenceTreeClick(mPreference)).isTrue(); 144 } 145 146 @Test handlePrefTreeClick_deviceNotProvisioned_doNothing()147 public void handlePrefTreeClick_deviceNotProvisioned_doNothing() { 148 mShadowUserManager.setIsAdminUser(true); 149 mShadowUserManager.setIsDemoUser(false); 150 151 Settings.Global.putInt(mContext.getContentResolver(), Settings.Global.DEVICE_PROVISIONED, 152 0); 153 154 assertThat(mController.handlePreferenceTreeClick(mPreference)).isFalse(); 155 verify(mFactory.metricsFeatureProvider).action( 156 any(Context.class), 157 eq(MetricsProto.MetricsEvent.ACTION_SETTINGS_BUILD_NUMBER_PREF)); 158 } 159 160 @Test handlePrefTreeClick_isMonkeyRun_doNothing()161 public void handlePrefTreeClick_isMonkeyRun_doNothing() { 162 ShadowUtils.setIsUserAMonkey(true); 163 assertThat(mController.handlePreferenceTreeClick(mPreference)).isFalse(); 164 } 165 166 @Test handlePrefTreeClick_userHasRestriction_doNothing()167 public void handlePrefTreeClick_userHasRestriction_doNothing() { 168 mShadowUserManager.setIsAdminUser(true); 169 mShadowUserManager.setIsDemoUser(false); 170 171 mShadowUserManager.setUserRestriction(Process.myUserHandle(), 172 UserManager.DISALLOW_DEBUGGING_FEATURES, true); 173 174 assertThat(mController.handlePreferenceTreeClick(mPreference)).isFalse(); 175 verify(mFactory.metricsFeatureProvider).action( 176 any(Context.class), 177 eq(MetricsProto.MetricsEvent.ACTION_SETTINGS_BUILD_NUMBER_PREF)); 178 } 179 180 @Test onActivityResult_notConfirmPasswordRequest_doNothing()181 public void onActivityResult_notConfirmPasswordRequest_doNothing() { 182 final boolean activityResultHandled = mController.onActivityResult( 183 BuildNumberPreferenceController.REQUEST_CONFIRM_PASSWORD_FOR_DEV_PREF + 1, 184 Activity.RESULT_OK, 185 null); 186 187 assertThat(activityResultHandled).isFalse(); 188 assertThat(DevelopmentSettingsEnabler.isDevelopmentSettingsEnabled(mContext)).isFalse(); 189 } 190 191 @Test onActivityResult_confirmPasswordRequestFailed_doNotEnableDevPref()192 public void onActivityResult_confirmPasswordRequestFailed_doNotEnableDevPref() { 193 final boolean activityResultHandled = mController.onActivityResult( 194 BuildNumberPreferenceController.REQUEST_CONFIRM_PASSWORD_FOR_DEV_PREF, 195 Activity.RESULT_CANCELED, 196 null); 197 198 assertThat(activityResultHandled).isTrue(); 199 assertThat(DevelopmentSettingsEnabler.isDevelopmentSettingsEnabled(mContext)).isFalse(); 200 } 201 202 @Test onActivityResult_confirmPasswordRequestCompleted_enableDevPref()203 public void onActivityResult_confirmPasswordRequestCompleted_enableDevPref() { 204 when(mFactory.searchFeatureProvider.getIndexingManager(any(Context.class))) 205 .thenReturn(mock(DatabaseIndexingManager.class)); 206 207 mController = 208 new BuildNumberPreferenceController(mContext, mActivity, mFragment, mLifecycle); 209 210 final boolean activityResultHandled = mController.onActivityResult( 211 BuildNumberPreferenceController.REQUEST_CONFIRM_PASSWORD_FOR_DEV_PREF, 212 Activity.RESULT_OK, 213 null); 214 215 assertThat(activityResultHandled).isTrue(); 216 assertThat(DevelopmentSettingsEnabler.isDevelopmentSettingsEnabled(mContext)).isTrue(); 217 } 218 } 219