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.development; 18 19 import android.content.ComponentName; 20 import android.content.Context; 21 import android.content.pm.PackageManager; 22 import android.provider.Settings; 23 import android.os.UserManager; 24 import android.support.v14.preference.SwitchPreference; 25 import android.support.v7.preference.Preference; 26 import android.support.v7.preference.PreferenceScreen; 27 28 import com.android.settings.testutils.SettingsRobolectricTestRunner; 29 import com.android.settings.TestConfig; 30 31 import org.junit.Before; 32 import org.junit.Test; 33 import org.junit.runner.RunWith; 34 import org.mockito.Mock; 35 import org.mockito.MockitoAnnotations; 36 import org.robolectric.annotation.Config; 37 import org.robolectric.shadows.ShadowApplication; 38 39 import static com.google.common.truth.Truth.assertThat; 40 import static org.mockito.Answers.RETURNS_DEEP_STUBS; 41 import static org.mockito.Matchers.any; 42 import static org.mockito.Matchers.anyInt; 43 import static org.mockito.Matchers.anyString; 44 import static org.mockito.Matchers.eq; 45 import static org.mockito.Mockito.never; 46 import static org.mockito.Mockito.spy; 47 import static org.mockito.Mockito.verify; 48 import static org.mockito.Mockito.when; 49 50 @RunWith(SettingsRobolectricTestRunner.class) 51 @Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION) 52 public class BugReportInPowerPreferenceControllerTest { 53 54 @Mock(answer = RETURNS_DEEP_STUBS) 55 private PreferenceScreen mScreen; 56 @Mock 57 private UserManager mUserManager; 58 @Mock 59 private PackageManager mPackageManager; 60 61 private Context mContext; 62 private SwitchPreference mPreference; 63 private BugReportInPowerPreferenceController mController; 64 65 @Before 66 public void setUp() { 67 MockitoAnnotations.initMocks(this); 68 ShadowApplication shadowContext = ShadowApplication.getInstance(); 69 shadowContext.setSystemService(Context.USER_SERVICE, mUserManager); 70 mContext = spy(shadowContext.getApplicationContext()); 71 when(mContext.getPackageManager()).thenReturn(mPackageManager); 72 mPreference = new SwitchPreference(mContext); 73 when(mScreen.findPreference(anyString())).thenReturn(mPreference); 74 mController = new BugReportInPowerPreferenceController(mContext); 75 mPreference.setKey(mController.getPreferenceKey()); 76 } 77 78 @Test 79 public void displayPreference_hasDebugRestriction_shouldRemovePreference() { 80 when(mUserManager.hasUserRestriction(anyString())).thenReturn(true); 81 when(mScreen.getPreferenceCount()).thenReturn(1); 82 when(mScreen.getPreference(0)).thenReturn(mPreference); 83 84 mController.displayPreference(mScreen); 85 86 verify(mScreen).removePreference(any(Preference.class)); 87 } 88 89 @Test 90 public void displayPreference_noDebugRestriction_shouldNotRemovePreference() { 91 when(mUserManager.hasUserRestriction(anyString())).thenReturn(false); 92 93 mController.displayPreference(mScreen); 94 95 verify(mScreen, never()).removePreference(any(Preference.class)); 96 } 97 98 @Test 99 public void enablePreference_hasDebugRestriction_shouldNotEnable() { 100 when(mUserManager.hasUserRestriction(anyString())).thenReturn(true); 101 mController.displayPreference(mScreen); 102 mPreference.setEnabled(false); 103 104 mController.enablePreference(true); 105 106 assertThat(mPreference.isEnabled()).isFalse(); 107 } 108 109 @Test 110 public void enablePreference_noDebugRestriction_shouldEnable() { 111 when(mUserManager.hasUserRestriction(anyString())).thenReturn(false); 112 mController.displayPreference(mScreen); 113 mPreference.setEnabled(false); 114 115 mController.enablePreference(true); 116 117 assertThat(mPreference.isEnabled()).isTrue(); 118 } 119 120 @Test 121 public void resetPreference_shouldUncheck() { 122 when(mUserManager.hasUserRestriction(anyString())).thenReturn(false); 123 mController.displayPreference(mScreen); 124 mPreference.setChecked(true); 125 126 mController.resetPreference(); 127 128 assertThat(mPreference.isChecked()).isFalse(); 129 } 130 131 @Test 132 public void handlePreferenceTreeClick_shouldUpdateSettings() { 133 when(mUserManager.hasUserRestriction(anyString())).thenReturn(false); 134 Settings.Secure.putInt(mContext.getContentResolver(), 135 Settings.Global.BUGREPORT_IN_POWER_MENU, 0); 136 mPreference.setChecked(true); 137 mController.displayPreference(mScreen); 138 139 mController.handlePreferenceTreeClick(mPreference); 140 141 assertThat(Settings.Secure.getInt(mContext.getContentResolver(), 142 Settings.Global.BUGREPORT_IN_POWER_MENU, 0)).isEqualTo(1); 143 } 144 145 @Test 146 public void updateState_settingsOn_shouldCheck() { 147 when(mUserManager.hasUserRestriction(anyString())).thenReturn(false); 148 Settings.Secure.putInt(mContext.getContentResolver(), 149 Settings.Global.BUGREPORT_IN_POWER_MENU, 1); 150 mPreference.setChecked(false); 151 mController.displayPreference(mScreen); 152 153 mController.updateState(mPreference); 154 155 assertThat(mPreference.isChecked()).isTrue(); 156 } 157 158 @Test 159 public void updateState_settingsOff_shouldUncheck() { 160 when(mUserManager.hasUserRestriction(anyString())).thenReturn(false); 161 Settings.Secure.putInt(mContext.getContentResolver(), 162 Settings.Global.BUGREPORT_IN_POWER_MENU, 0); 163 mPreference.setChecked(true); 164 mController.displayPreference(mScreen); 165 166 mController.updateState(mPreference); 167 168 assertThat(mPreference.isChecked()).isFalse(); 169 } 170 171 @Test 172 public void updateBugreportOptions_shouldEnable() { 173 when(mUserManager.hasUserRestriction(anyString())).thenReturn(false); 174 mPreference.setEnabled(false); 175 mController.displayPreference(mScreen); 176 177 mController.updateBugreportOptions(); 178 179 assertThat(mPreference.isEnabled()).isTrue(); 180 } 181 182 @Test 183 public void updateBugreportOptions_shouldEnableBugReportStorage() { 184 final ComponentName componentName = new ComponentName("com.android.shell", 185 "com.android.shell.BugreportStorageProvider"); 186 when(mUserManager.hasUserRestriction(anyString())).thenReturn(false); 187 mController.displayPreference(mScreen); 188 189 mController.updateBugreportOptions(); 190 191 verify(mPackageManager).setComponentEnabledSetting(eq(componentName), anyInt(), anyInt()); 192 } 193 } 194