2 * Copyright (C) 2017 The Android Open Source Project
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
8 * http://www.apache.org/licenses/LICENSE-2.0
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.
17 package com.android.settings.fuelgauge;
19 import static com.google.common.truth.Truth.assertThat;
20 import static org.mockito.Matchers.anyInt;
21 import static org.mockito.Matchers.anyString;
22 import static org.mockito.Mockito.doNothing;
23 import static org.mockito.Mockito.doReturn;
24 import static org.mockito.Mockito.spy;
25 import static org.mockito.Mockito.verify;
26 import static org.mockito.Mockito.when;
28 import android.app.AppOpsManager;
29 import android.app.admin.DevicePolicyManager;
30 import android.content.Context;
31 import android.content.pm.ApplicationInfo;
32 import android.content.pm.PackageManager;
33 import android.os.Build;
34 import android.os.UserManager;
35 import android.support.v7.preference.Preference;
37 import com.android.settings.R;
38 import com.android.settings.testutils.FakeFeatureFactory;
39 import com.android.settings.testutils.shadow.SettingsShadowResources;
40 import com.android.settings.testutils.shadow.ShadowFragment;
41 import com.android.settingslib.fuelgauge.PowerWhitelistBackend;
43 import org.junit.Before;
44 import org.junit.Test;
45 import org.junit.runner.RunWith;
46 import org.mockito.Answers;
47 import org.mockito.Mock;
48 import org.mockito.MockitoAnnotations;
49 import org.robolectric.RobolectricTestRunner;
50 import org.robolectric.RuntimeEnvironment;
51 import org.robolectric.annotation.Config;
53 @RunWith(RobolectricTestRunner.class)
54 @Config(shadows = {SettingsShadowResources.SettingsShadowTheme.class, ShadowFragment.class})
55 public class BackgroundActivityPreferenceControllerTest {
57 private static final int UID_LOW_SDK = 1234;
58 private static final String HIGH_SDK_PACKAGE = "com.android.package.high";
59 private static final String LOW_SDK_PACKAGE = "com.android.package.low";
61 @Mock(answer = Answers.RETURNS_DEEP_STUBS)
62 private Context mContext;
64 private PackageManager mPackageManager;
66 private AppOpsManager mAppOpsManager;
68 private ApplicationInfo mHighApplicationInfo;
70 private ApplicationInfo mLowApplicationInfo;
72 private UserManager mUserManager;
74 private DevicePolicyManager mDevicePolicyManager;
76 private DevicePolicyManager mDevicePolicyManagerWrapper;
77 @Mock(answer = Answers.RETURNS_DEEP_STUBS)
78 private AdvancedPowerUsageDetail mFragment;
80 private PowerWhitelistBackend mPowerWhitelistBackend;
81 private BackgroundActivityPreferenceController mController;
82 private Preference mPreference;
83 private Context mShadowContext;
84 private BatteryUtils mBatteryUtils;
87 public void setUp() throws Exception {
88 MockitoAnnotations.initMocks(this);
90 mShadowContext = RuntimeEnvironment.application;
91 FakeFeatureFactory.setupForTest();
92 when(mContext.getPackageManager()).thenReturn(mPackageManager);
93 when(mContext.getSystemService(Context.APP_OPS_SERVICE)).thenReturn(mAppOpsManager);
94 when(mContext.getSystemService(Context.USER_SERVICE)).thenReturn(mUserManager);
95 when(mContext.getSystemService(Context.DEVICE_POLICY_SERVICE)).thenReturn(
96 mDevicePolicyManager);
98 when(mPackageManager.getApplicationInfo(HIGH_SDK_PACKAGE, PackageManager.GET_META_DATA))
99 .thenReturn(mHighApplicationInfo);
100 when(mPackageManager.getApplicationInfo(LOW_SDK_PACKAGE, PackageManager.GET_META_DATA))
101 .thenReturn(mLowApplicationInfo);
103 when(mPowerWhitelistBackend.isWhitelisted(LOW_SDK_PACKAGE)).thenReturn(false);
104 mHighApplicationInfo.targetSdkVersion = Build.VERSION_CODES.O;
105 mLowApplicationInfo.targetSdkVersion = Build.VERSION_CODES.L;
107 mBatteryUtils = spy(new BatteryUtils(mShadowContext));
108 doNothing().when(mBatteryUtils).setForceAppStandby(anyInt(), anyString(), anyInt());
110 mPreference = new Preference(mShadowContext);
111 mPreference.setKey(BackgroundActivityPreferenceController.KEY_BACKGROUND_ACTIVITY);
112 mController = spy(new BackgroundActivityPreferenceController(
113 mContext, mFragment, UID_LOW_SDK, LOW_SDK_PACKAGE, mPowerWhitelistBackend));
114 mController.mDpm = mDevicePolicyManagerWrapper;
115 mController.mBatteryUtils = mBatteryUtils;
119 public void testHandlePreferenceTreeClick_restrictApp_showDialog() {
120 doReturn(AppOpsManager.MODE_ALLOWED).when(mAppOpsManager)
121 .checkOpNoThrow(anyInt(), anyInt(), anyString());
123 mController.handlePreferenceTreeClick(mPreference);
125 verify(mController).showDialog(false /* restrict */);
129 public void testHandlePreferenceTreeClick_unRestrictApp_showDialog() {
130 doReturn(AppOpsManager.MODE_IGNORED).when(mAppOpsManager)
131 .checkOpNoThrow(anyInt(), anyInt(), anyString());
133 mController.handlePreferenceTreeClick(mPreference);
135 verify(mController).showDialog(true /* restrict */);
139 public void testUpdateState_noError_setEnabled() {
140 when(mAppOpsManager.checkOpNoThrow(AppOpsManager.OP_RUN_ANY_IN_BACKGROUND, UID_LOW_SDK,
141 LOW_SDK_PACKAGE)).thenReturn(AppOpsManager.MODE_ALLOWED);
143 mController.updateState(mPreference);
145 assertThat(mPreference.isEnabled()).isTrue();
146 verify(mController).updateSummary(mPreference);
150 public void testUpdateState_whitelisted() {
151 when(mPowerWhitelistBackend.isWhitelisted(LOW_SDK_PACKAGE)).thenReturn(true);
152 mController.updateState(mPreference);
153 assertThat(mPreference.isEnabled()).isFalse();
154 assertThat(mPreference.getSummary()).isEqualTo(
155 mShadowContext.getText(R.string.background_activity_summary_whitelisted));
159 public void testUpdateSummary_modeError_showSummaryDisabled() {
160 when(mAppOpsManager.checkOpNoThrow(AppOpsManager.OP_RUN_ANY_IN_BACKGROUND, UID_LOW_SDK,
161 LOW_SDK_PACKAGE)).thenReturn(AppOpsManager.MODE_ERRORED);
162 final CharSequence expectedSummary = mShadowContext.getText(
163 R.string.background_activity_summary_disabled);
164 mController.updateSummary(mPreference);
166 assertThat(mPreference.getSummary()).isEqualTo(expectedSummary);
170 public void testUpdateSummary_modeDefault_showNotRestricted() {
171 when(mAppOpsManager.checkOpNoThrow(AppOpsManager.OP_RUN_ANY_IN_BACKGROUND, UID_LOW_SDK,
172 LOW_SDK_PACKAGE)).thenReturn(AppOpsManager.MODE_DEFAULT);
174 mController.updateSummary(mPreference);
176 assertThat(mPreference.getSummary()).isEqualTo("App can use battery in background");
180 public void testUpdateSummary_modeIgnored_showRestricted() {
181 when(mAppOpsManager.checkOpNoThrow(AppOpsManager.OP_RUN_ANY_IN_BACKGROUND, UID_LOW_SDK,
182 LOW_SDK_PACKAGE)).thenReturn(AppOpsManager.MODE_IGNORED);
184 mController.updateSummary(mPreference);
186 assertThat(mPreference.getSummary()).isEqualTo("Restricted");
190 public void testIsAvailable_ReturnTrue() {
191 assertThat(mController.isAvailable()).isTrue();