1 /* 2 * Copyright (C) 2023 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.fuelgauge; 18 19 import static com.google.common.truth.Truth.assertThat; 20 21 import static org.mockito.Mockito.doReturn; 22 import static org.mockito.Mockito.spy; 23 import static org.mockito.Mockito.when; 24 25 import android.content.Context; 26 import android.content.pm.PackageManager; 27 28 import com.android.settingslib.widget.MainSwitchPreference; 29 30 import org.junit.Before; 31 import org.junit.Test; 32 import org.junit.runner.RunWith; 33 import org.mockito.Mock; 34 import org.mockito.MockitoAnnotations; 35 import org.robolectric.RobolectricTestRunner; 36 import org.robolectric.RuntimeEnvironment; 37 38 @RunWith(RobolectricTestRunner.class) 39 public class AllowBackgroundPreferenceControllerTest { 40 private static final int UID = 12345; 41 private static final String PACKAGE_NAME = "com.android.app"; 42 43 private AllowBackgroundPreferenceController mController; 44 private MainSwitchPreference mMainSwitchPreference; 45 private BatteryOptimizeUtils mBatteryOptimizeUtils; 46 47 @Mock private PackageManager mMockPackageManager; 48 49 @Before setUp()50 public void setUp() throws Exception { 51 MockitoAnnotations.initMocks(this); 52 53 Context context = spy(RuntimeEnvironment.application); 54 BatteryUtils.getInstance(context).reset(); 55 doReturn(UID) 56 .when(mMockPackageManager) 57 .getPackageUid(PACKAGE_NAME, PackageManager.GET_META_DATA); 58 59 mController = new AllowBackgroundPreferenceController(context, UID, PACKAGE_NAME); 60 mMainSwitchPreference = new MainSwitchPreference(RuntimeEnvironment.application); 61 mBatteryOptimizeUtils = spy(new BatteryOptimizeUtils(context, UID, PACKAGE_NAME)); 62 mController.mBatteryOptimizeUtils = mBatteryOptimizeUtils; 63 } 64 65 @Test testUpdateState_isValidPackage_prefEnabled()66 public void testUpdateState_isValidPackage_prefEnabled() { 67 when(mBatteryOptimizeUtils.isDisabledForOptimizeModeOnly()).thenReturn(false); 68 when(mBatteryOptimizeUtils.isSystemOrDefaultApp()).thenReturn(false); 69 70 mController.updateState(mMainSwitchPreference); 71 72 assertThat(mBatteryOptimizeUtils.isOptimizeModeMutable()).isTrue(); 73 assertThat(mMainSwitchPreference.isEnabled()).isTrue(); 74 } 75 76 @Test testUpdateState_invalidPackage_prefDisabled()77 public void testUpdateState_invalidPackage_prefDisabled() { 78 when(mBatteryOptimizeUtils.isDisabledForOptimizeModeOnly()).thenReturn(true); 79 when(mBatteryOptimizeUtils.isSystemOrDefaultApp()).thenReturn(false); 80 81 mController.updateState(mMainSwitchPreference); 82 83 assertThat(mBatteryOptimizeUtils.isOptimizeModeMutable()).isFalse(); 84 assertThat(mMainSwitchPreference.isEnabled()).isFalse(); 85 } 86 87 @Test testUpdateState_isSystemOrDefaultAppAndRestrictedStates_prefChecked()88 public void testUpdateState_isSystemOrDefaultAppAndRestrictedStates_prefChecked() { 89 when(mBatteryOptimizeUtils.isDisabledForOptimizeModeOnly()).thenReturn(false); 90 when(mBatteryOptimizeUtils.isSystemOrDefaultApp()).thenReturn(true); 91 when(mBatteryOptimizeUtils.getAppOptimizationMode()) 92 .thenReturn(BatteryOptimizeUtils.MODE_RESTRICTED); 93 94 mController.updateState(mMainSwitchPreference); 95 96 assertThat(mMainSwitchPreference.isEnabled()).isFalse(); 97 assertThat(mMainSwitchPreference.isChecked()).isFalse(); 98 } 99 100 @Test testUpdateState_isSystemOrDefaultApp_prefUnchecked()101 public void testUpdateState_isSystemOrDefaultApp_prefUnchecked() { 102 when(mBatteryOptimizeUtils.isDisabledForOptimizeModeOnly()).thenReturn(false); 103 when(mBatteryOptimizeUtils.isSystemOrDefaultApp()).thenReturn(true); 104 when(mBatteryOptimizeUtils.getAppOptimizationMode()) 105 .thenReturn(BatteryOptimizeUtils.MODE_OPTIMIZED); 106 107 mController.updateState(mMainSwitchPreference); 108 109 assertThat(mMainSwitchPreference.isEnabled()).isFalse(); 110 assertThat(mMainSwitchPreference.isChecked()).isTrue(); 111 } 112 113 @Test testUpdateState_isRestrictedStates_prefChecked()114 public void testUpdateState_isRestrictedStates_prefChecked() { 115 when(mBatteryOptimizeUtils.isOptimizeModeMutable()).thenReturn(true); 116 when(mBatteryOptimizeUtils.getAppOptimizationMode()) 117 .thenReturn(BatteryOptimizeUtils.MODE_RESTRICTED); 118 119 mController.updateState(mMainSwitchPreference); 120 121 assertThat(mMainSwitchPreference.isEnabled()).isTrue(); 122 assertThat(mMainSwitchPreference.isChecked()).isFalse(); 123 } 124 125 @Test testUpdateState_prefUnchecked()126 public void testUpdateState_prefUnchecked() { 127 when(mBatteryOptimizeUtils.isOptimizeModeMutable()).thenReturn(true); 128 when(mBatteryOptimizeUtils.getAppOptimizationMode()) 129 .thenReturn(BatteryOptimizeUtils.MODE_OPTIMIZED); 130 131 mController.updateState(mMainSwitchPreference); 132 133 assertThat(mMainSwitchPreference.isEnabled()).isTrue(); 134 assertThat(mMainSwitchPreference.isChecked()).isTrue(); 135 } 136 137 @Test testHandlePreferenceTreeClick_samePrefKey_verifyAction()138 public void testHandlePreferenceTreeClick_samePrefKey_verifyAction() { 139 mMainSwitchPreference.setKey( 140 AllowBackgroundPreferenceController.KEY_ALLOW_BACKGROUND_USAGE); 141 mController.handlePreferenceTreeClick(mMainSwitchPreference); 142 143 assertThat(mController.handlePreferenceTreeClick(mMainSwitchPreference)).isTrue(); 144 } 145 146 @Test testHandlePreferenceTreeClick_incorrectPrefKey_noAction()147 public void testHandlePreferenceTreeClick_incorrectPrefKey_noAction() { 148 assertThat(mController.handlePreferenceTreeClick(mMainSwitchPreference)).isFalse(); 149 } 150 } 151