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 17package com.android.settingslib.development; 18 19import static com.google.common.truth.Truth.assertThat; 20import static org.mockito.Answers.RETURNS_DEEP_STUBS; 21import static org.mockito.Mockito.doReturn; 22import static org.mockito.Mockito.spy; 23import static org.mockito.Mockito.when; 24 25import android.content.Context; 26import android.content.pm.PackageManager; 27import android.os.UserManager; 28import android.provider.Settings; 29import android.support.v14.preference.SwitchPreference; 30import android.support.v7.preference.Preference; 31import android.support.v7.preference.PreferenceScreen; 32 33import com.android.settingslib.SettingsLibRobolectricTestRunner; 34 35import org.junit.Before; 36import org.junit.Test; 37import org.junit.runner.RunWith; 38import org.mockito.Mock; 39import org.mockito.MockitoAnnotations; 40import org.robolectric.shadows.ShadowApplication; 41 42@RunWith(SettingsLibRobolectricTestRunner.class) 43public class EnableAdbPreferenceControllerTest { 44 @Mock(answer = RETURNS_DEEP_STUBS) 45 private PreferenceScreen mScreen; 46 @Mock 47 private UserManager mUserManager; 48 @Mock 49 private PackageManager mPackageManager; 50 51 private Context mContext; 52 private SwitchPreference mPreference; 53 private ConcreteEnableAdbPreferenceController mController; 54 55 @Before 56 public void setUp() { 57 MockitoAnnotations.initMocks(this); 58 ShadowApplication shadowContext = ShadowApplication.getInstance(); 59 shadowContext.setSystemService(Context.USER_SERVICE, mUserManager); 60 mContext = spy(shadowContext.getApplicationContext()); 61 when(mContext.getPackageManager()).thenReturn(mPackageManager); 62 mController = new ConcreteEnableAdbPreferenceController(mContext); 63 mPreference = new SwitchPreference(mContext); 64 mPreference.setKey(mController.getPreferenceKey()); 65 when(mScreen.findPreference(mPreference.getKey())).thenReturn(mPreference); 66 } 67 68 @Test 69 public void displayPreference_isNotAdmin_shouldRemovePreference() { 70 when(mUserManager.isAdminUser()).thenReturn(false); 71 72 mController.displayPreference(mScreen); 73 74 assertThat(mPreference.isVisible()).isFalse(); 75 } 76 77 @Test 78 public void displayPreference_isAdmin_shouldNotRemovePreference() { 79 when(mUserManager.isAdminUser()).thenReturn(true); 80 81 mController.displayPreference(mScreen); 82 83 assertThat(mPreference.isVisible()).isTrue(); 84 } 85 86 87 @Test 88 public void resetPreference_shouldUncheck() { 89 when(mUserManager.isAdminUser()).thenReturn(true); 90 mController.displayPreference(mScreen); 91 mPreference.setChecked(true); 92 93 mController.resetPreference(); 94 95 assertThat(mPreference.isChecked()).isFalse(); 96 } 97 98 @Test 99 public void handlePreferenceTreeClick_shouldUpdateSettings() { 100 when(mUserManager.isAdminUser()).thenReturn(true); 101 Settings.Secure.putInt(mContext.getContentResolver(), 102 Settings.Global.ADB_ENABLED, 1); 103 mPreference.setChecked(true); 104 mController.displayPreference(mScreen); 105 106 mController.handlePreferenceTreeClick(mPreference); 107 108 assertThat(Settings.Secure.getInt(mContext.getContentResolver(), 109 Settings.Global.ADB_ENABLED, 0)).isEqualTo(0); 110 } 111 112 @Test 113 public void handlePreferenceTreeClick_isMonkeyUser_shouldBeFalse() { 114 mController = spy(mController); 115 doReturn(true).when(mController).isUserAMonkey(); 116 when(mUserManager.isAdminUser()).thenReturn(true); 117 mController.displayPreference(mScreen); 118 119 final boolean handled = mController.handlePreferenceTreeClick(mPreference); 120 121 assertThat(handled).isFalse(); 122 } 123 124 @Test 125 public void updateState_settingsOn_shouldCheck() { 126 when(mUserManager.isAdminUser()).thenReturn(true); 127 Settings.Secure.putInt(mContext.getContentResolver(), 128 Settings.Global.ADB_ENABLED, 1); 129 mPreference.setChecked(false); 130 mController.displayPreference(mScreen); 131 132 mController.updateState(mPreference); 133 134 assertThat(mPreference.isChecked()).isTrue(); 135 } 136 137 @Test 138 public void updateState_settingsOff_shouldUncheck() { 139 when(mUserManager.isAdminUser()).thenReturn(true); 140 Settings.Secure.putInt(mContext.getContentResolver(), 141 Settings.Global.ADB_ENABLED, 0); 142 mPreference.setChecked(true); 143 mController.displayPreference(mScreen); 144 145 mController.updateState(mPreference); 146 147 assertThat(mPreference.isChecked()).isFalse(); 148 } 149 150 class ConcreteEnableAdbPreferenceController extends AbstractEnableAdbPreferenceController { 151 public ConcreteEnableAdbPreferenceController(Context context) { 152 super(context); 153 } 154 155 @Override 156 public void showConfirmationDialog(Preference preference) { 157 // Don't show a dialog, just set setting. 158 writeAdbSetting(true); 159 } 160 161 @Override 162 public boolean isConfirmationDialogShowing() { 163 return false; 164 } 165 166 @Override 167 public void dismissConfirmationDialog() { 168 } 169 } 170} 171