1 /* 2 * Copyright (C) 2017 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.development; 18 19 import static com.android.settings.development.DevelopmentOptionsActivityRequestCodes.REQUEST_CODE_ENABLE_OEM_UNLOCK; 20 import static com.google.common.truth.Truth.assertThat; 21 import static org.mockito.Mockito.doNothing; 22 import static org.mockito.Mockito.doReturn; 23 import static org.mockito.Mockito.mock; 24 import static org.mockito.Mockito.spy; 25 import static org.mockito.Mockito.verify; 26 import static org.mockito.Mockito.when; 27 28 import android.app.Activity; 29 import android.app.FragmentManager; 30 import android.content.Context; 31 import android.content.res.Resources; 32 import android.os.UserManager; 33 import android.service.oemlock.OemLockManager; 34 import android.support.v7.preference.PreferenceScreen; 35 import android.telephony.TelephonyManager; 36 37 import com.android.settings.testutils.SettingsRobolectricTestRunner; 38 import com.android.settingslib.RestrictedSwitchPreference; 39 40 import org.junit.Before; 41 import org.junit.Test; 42 import org.junit.runner.RunWith; 43 import org.mockito.Answers; 44 import org.mockito.Mock; 45 import org.mockito.MockitoAnnotations; 46 47 @RunWith(SettingsRobolectricTestRunner.class) 48 public class OemUnlockPreferenceControllerTest { 49 50 @Mock 51 private Context mContext; 52 @Mock 53 private Activity mActivity; 54 @Mock 55 private DevelopmentSettingsDashboardFragment mFragment; 56 @Mock 57 private RestrictedSwitchPreference mPreference; 58 @Mock 59 private PreferenceScreen mPreferenceScreen; 60 @Mock 61 private OemLockManager mOemLockManager; 62 @Mock 63 private UserManager mUserManager; 64 @Mock 65 private TelephonyManager mTelephonyManager; 66 @Mock 67 private Resources mResources; 68 private OemUnlockPreferenceController mController; 69 70 @Before setup()71 public void setup() { 72 MockitoAnnotations.initMocks(this); 73 when(mContext.getSystemService(Context.OEM_LOCK_SERVICE)).thenReturn(mOemLockManager); 74 when(mContext.getSystemService(Context.USER_SERVICE)).thenReturn(mUserManager); 75 when(mContext.getSystemService(Context.TELEPHONY_SERVICE)).thenReturn(mTelephonyManager); 76 when(mContext.getResources()).thenReturn(mResources); 77 mController = new OemUnlockPreferenceController(mContext, mActivity, mFragment); 78 when(mPreferenceScreen.findPreference(mController.getPreferenceKey())) 79 .thenReturn(mPreference); 80 when(mFragment.getChildFragmentManager()) 81 .thenReturn(mock(FragmentManager.class, Answers.RETURNS_DEEP_STUBS)); 82 mController.displayPreference(mPreferenceScreen); 83 } 84 85 @Test isAvailable_shouldReturnTrueWhenOemLockManagerIsNotNull()86 public void isAvailable_shouldReturnTrueWhenOemLockManagerIsNotNull() { 87 boolean returnValue = mController.isAvailable(); 88 89 assertThat(returnValue).isTrue(); 90 } 91 92 @Test isAvailable_shouldReturnFalseWhenOemLockManagerIsNull()93 public void isAvailable_shouldReturnFalseWhenOemLockManagerIsNull() { 94 when(mContext.getSystemService(Context.OEM_LOCK_SERVICE)).thenReturn(null); 95 mController = new OemUnlockPreferenceController(mContext, mActivity, mFragment); 96 boolean returnValue = mController.isAvailable(); 97 98 assertThat(returnValue).isFalse(); 99 } 100 101 @Test onPreferenceChanged_turnOnUnlock()102 public void onPreferenceChanged_turnOnUnlock() { 103 mController = spy(mController); 104 doReturn(false).when(mController).showKeyguardConfirmation(mResources, 105 REQUEST_CODE_ENABLE_OEM_UNLOCK); 106 doNothing().when(mController).confirmEnableOemUnlock(); 107 108 mController.onPreferenceChange(null, true); 109 110 verify(mController).confirmEnableOemUnlock(); 111 } 112 113 @Test onPreferenceChanged_turnOffUnlock()114 public void onPreferenceChanged_turnOffUnlock() { 115 mController = spy(mController); 116 mController.onPreferenceChange(null, false); 117 doReturn(false).when(mController).isBootloaderUnlocked(); 118 119 verify(mFragment).getChildFragmentManager(); 120 } 121 122 @Test updateState_preferenceShouldBeCheckedAndShouldBeDisabled()123 public void updateState_preferenceShouldBeCheckedAndShouldBeDisabled() { 124 mController = spy(mController); 125 doReturn(true).when(mController).isOemUnlockedAllowed(); 126 doReturn(true).when(mController).isOemUnlockAllowedByUserAndCarrier(); 127 doReturn(true).when(mController).isBootloaderUnlocked(); 128 129 mController.updateState(mPreference); 130 131 verify(mPreference).setChecked(true); 132 verify(mPreference).setEnabled(false); 133 } 134 135 @Test updateState_preferenceShouldBeUncheckedAndShouldBeDisabled()136 public void updateState_preferenceShouldBeUncheckedAndShouldBeDisabled() { 137 mController = spy(mController); 138 doReturn(false).when(mController).isOemUnlockedAllowed(); 139 doReturn(true).when(mController).isOemUnlockAllowedByUserAndCarrier(); 140 doReturn(true).when(mController).isBootloaderUnlocked(); 141 142 mController.updateState(mPreference); 143 144 verify(mPreference).setChecked(false); 145 verify(mPreference).setEnabled(false); 146 } 147 148 @Test updateState_preferenceShouldBeCheckedAndShouldBeEnabled()149 public void updateState_preferenceShouldBeCheckedAndShouldBeEnabled() { 150 mController = spy(mController); 151 doReturn(true).when(mController).isOemUnlockedAllowed(); 152 doReturn(true).when(mController).isOemUnlockAllowedByUserAndCarrier(); 153 doReturn(false).when(mController).isBootloaderUnlocked(); 154 155 mController.updateState(mPreference); 156 157 verify(mPreference).setChecked(true); 158 verify(mPreference).setEnabled(true); 159 } 160 161 @Test onActivityResult_shouldReturnTrue()162 public void onActivityResult_shouldReturnTrue() { 163 final boolean result = mController.onActivityResult(REQUEST_CODE_ENABLE_OEM_UNLOCK, 164 Activity.RESULT_OK, null); 165 166 assertThat(result).isTrue(); 167 } 168 169 @Test onActivityResult_shouldReturnFalse()170 public void onActivityResult_shouldReturnFalse() { 171 final boolean result = mController.onActivityResult(123454, 1434, null); 172 173 assertThat(result).isFalse(); 174 } 175 176 @Test onDeveloperOptionsEnabled_preferenceShouldCheckRestriction()177 public void onDeveloperOptionsEnabled_preferenceShouldCheckRestriction() { 178 mController = spy(mController); 179 doReturn(false).when(mController).isOemUnlockAllowedByUserAndCarrier(); 180 doReturn(false).when(mController).isBootloaderUnlocked(); 181 when(mPreference.isEnabled()).thenReturn(true); 182 183 mController.onDeveloperOptionsEnabled(); 184 185 verify(mPreference).checkRestrictionAndSetDisabled(UserManager.DISALLOW_FACTORY_RESET); 186 187 } 188 189 @Test onOemUnlockConfirmed_oemManagerShouldSetUnlockAllowedByUser()190 public void onOemUnlockConfirmed_oemManagerShouldSetUnlockAllowedByUser() { 191 mController.onOemUnlockConfirmed(); 192 193 verify(mOemLockManager).setOemUnlockAllowedByUser(true); 194 } 195 } 196