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 package com.android.settings.fuelgauge;
17 
18 import static android.os.BatteryStats.Uid.PROCESS_STATE_BACKGROUND;
19 import static android.os.BatteryStats.Uid.PROCESS_STATE_FOREGROUND;
20 import static android.os.BatteryStats.Uid.PROCESS_STATE_FOREGROUND_SERVICE;
21 import static android.os.BatteryStats.Uid.PROCESS_STATE_TOP;
22 import static android.os.BatteryStats.Uid.PROCESS_STATE_TOP_SLEEPING;
23 
24 import static com.google.common.truth.Truth.assertThat;
25 
26 import static org.mockito.ArgumentMatchers.any;
27 import static org.mockito.ArgumentMatchers.anyInt;
28 import static org.mockito.ArgumentMatchers.anyLong;
29 import static org.mockito.ArgumentMatchers.eq;
30 import static org.mockito.ArgumentMatchers.nullable;
31 import static org.mockito.Mockito.doReturn;
32 import static org.mockito.Mockito.doThrow;
33 import static org.mockito.Mockito.never;
34 import static org.mockito.Mockito.spy;
35 import static org.mockito.Mockito.verify;
36 import static org.mockito.Mockito.when;
37 
38 import android.app.AppOpsManager;
39 import android.content.BroadcastReceiver;
40 import android.content.Context;
41 import android.content.Intent;
42 import android.content.IntentFilter;
43 import android.content.pm.ApplicationInfo;
44 import android.content.pm.PackageManager;
45 import android.os.BatteryConsumer;
46 import android.os.BatteryStats;
47 import android.os.BatteryStatsManager;
48 import android.os.BatteryUsageStats;
49 import android.os.Build;
50 import android.os.SystemClock;
51 
52 import com.android.settings.fuelgauge.batterytip.AnomalyDatabaseHelper;
53 import com.android.settings.fuelgauge.batterytip.BatteryDatabaseManager;
54 import com.android.settings.testutils.FakeFeatureFactory;
55 import com.android.settings.testutils.shadow.ShadowThreadUtils;
56 import com.android.settingslib.fuelgauge.Estimate;
57 import com.android.settingslib.fuelgauge.PowerAllowlistBackend;
58 
59 import org.junit.Before;
60 import org.junit.Ignore;
61 import org.junit.Test;
62 import org.junit.runner.RunWith;
63 import org.mockito.Answers;
64 import org.mockito.Mock;
65 import org.mockito.MockitoAnnotations;
66 import org.robolectric.RobolectricTestRunner;
67 import org.robolectric.RuntimeEnvironment;
68 
69 @RunWith(RobolectricTestRunner.class)
70 public class BatteryUtilsTest {
71 
72     private static final String TAG = "BatteryUtilsTest";
73 
74     // unit that used to converted ms to us
75     private static final long UNIT = 1000;
76     private static final long TIME_STATE_TOP = 1500 * UNIT;
77     private static final long TIME_STATE_FOREGROUND_SERVICE = 2000 * UNIT;
78     private static final long TIME_STATE_TOP_SLEEPING = 2500 * UNIT;
79     private static final long TIME_STATE_FOREGROUND = 3000 * UNIT;
80     private static final long TIME_STATE_BACKGROUND = 6000 * UNIT;
81     private static final long TIME_SINCE_LAST_FULL_CHARGE_MS = 120 * 60 * 1000;
82     private static final long TIME_SINCE_LAST_FULL_CHARGE_US =
83             TIME_SINCE_LAST_FULL_CHARGE_MS * 1000;
84 
85     private static final int UID = 12345;
86     private static final long TIME_EXPECTED_FOREGROUND = 1500;
87     private static final long TIME_EXPECTED_BACKGROUND = 6000;
88     private static final long TIME_EXPECTED_ALL = 7500;
89     private static final double BATTERY_SYSTEM_USAGE = 600;
90     private static final double TOTAL_BATTERY_USAGE = 1000;
91     private static final int DISCHARGE_AMOUNT = 80;
92     private static final double PERCENT_SYSTEM_USAGE = 48;
93     private static final double PRECISION = 0.001;
94     private static final int SDK_VERSION = Build.VERSION_CODES.L;
95     private static final String PACKAGE_NAME = "com.android.app";
96     private static final String HIGH_SDK_PACKAGE = "com.android.package.high";
97     private static final String LOW_SDK_PACKAGE = "com.android.package.low";
98 
99     private static final String INFO_EXCESSIVE = "anomaly_type=4,auto_restriction=false";
100     private static final String INFO_WAKELOCK = "anomaly_type=1,auto_restriction=false";
101 
102     @Mock private BatteryStats.Uid mUid;
103     @Mock private BatteryStats.Timer mTimer;
104     @Mock private BatteryUsageStats mBatteryUsageStats;
105     @Mock private BatteryConsumer mAggregateBatteryConsumer;
106     @Mock private BatteryInfo mBatteryInfo;
107     @Mock private PackageManager mPackageManager;
108     @Mock private AppOpsManager mAppOpsManager;
109     @Mock private ApplicationInfo mApplicationInfo;
110 
111     @Mock(answer = Answers.RETURNS_DEEP_STUBS)
112     private BatteryStatsManager mBatteryStatsManager;
113 
114     @Mock private ApplicationInfo mHighApplicationInfo;
115     @Mock private ApplicationInfo mLowApplicationInfo;
116     @Mock private PowerAllowlistBackend mPowerAllowlistBackend;
117     @Mock private BatteryDatabaseManager mBatteryDatabaseManager;
118     private BatteryUtils mBatteryUtils;
119     private FakeFeatureFactory mFeatureFactory;
120     private PowerUsageFeatureProvider mProvider;
121     private Context mContext;
122 
123     @Before
setUp()124     public void setUp() throws PackageManager.NameNotFoundException {
125         MockitoAnnotations.initMocks(this);
126 
127         mFeatureFactory = FakeFeatureFactory.setupForTest();
128         mProvider = mFeatureFactory.powerUsageFeatureProvider;
129 
130         doReturn(TIME_STATE_TOP)
131                 .when(mUid)
132                 .getProcessStateTime(eq(PROCESS_STATE_TOP), anyLong(), anyInt());
133         doReturn(TIME_STATE_FOREGROUND_SERVICE)
134                 .when(mUid)
135                 .getProcessStateTime(eq(PROCESS_STATE_FOREGROUND_SERVICE), anyLong(), anyInt());
136         doReturn(TIME_STATE_TOP_SLEEPING)
137                 .when(mUid)
138                 .getProcessStateTime(eq(PROCESS_STATE_TOP_SLEEPING), anyLong(), anyInt());
139         doReturn(TIME_STATE_FOREGROUND)
140                 .when(mUid)
141                 .getProcessStateTime(eq(PROCESS_STATE_FOREGROUND), anyLong(), anyInt());
142         doReturn(TIME_STATE_BACKGROUND)
143                 .when(mUid)
144                 .getProcessStateTime(eq(PROCESS_STATE_BACKGROUND), anyLong(), anyInt());
145 
146         when(mPackageManager.getApplicationInfo(eq(HIGH_SDK_PACKAGE), anyInt()))
147                 .thenReturn(mHighApplicationInfo);
148         when(mPackageManager.getApplicationInfo(eq(LOW_SDK_PACKAGE), anyInt()))
149                 .thenReturn(mLowApplicationInfo);
150         mHighApplicationInfo.targetSdkVersion = Build.VERSION_CODES.O;
151         mLowApplicationInfo.targetSdkVersion = Build.VERSION_CODES.L;
152 
153         mContext = spy(RuntimeEnvironment.application);
154         doReturn(mPackageManager).when(mContext).getPackageManager();
155         doReturn(mAppOpsManager).when(mContext).getSystemService(Context.APP_OPS_SERVICE);
156         doReturn(mBatteryStatsManager)
157                 .when(mContext)
158                 .getSystemService(Context.BATTERY_STATS_SERVICE);
159         mBatteryUtils = spy(new BatteryUtils(mContext));
160         mBatteryUtils.mPowerUsageFeatureProvider = mProvider;
161         doReturn(0L)
162                 .when(mBatteryUtils)
163                 .getForegroundServiceTotalTimeUs(any(BatteryStats.Uid.class), anyLong());
164 
165         BatteryDatabaseManager.setUpForTest(mBatteryDatabaseManager);
166         ShadowThreadUtils.setIsMainThread(true);
167     }
168 
169     @Test
testGetProcessTimeMs_typeForeground_timeCorrect()170     public void testGetProcessTimeMs_typeForeground_timeCorrect() {
171         doReturn(TIME_STATE_FOREGROUND + 500)
172                 .when(mBatteryUtils)
173                 .getForegroundActivityTotalTimeUs(eq(mUid), anyLong());
174 
175         final long time =
176                 mBatteryUtils.getProcessTimeMs(
177                         BatteryUtils.StatusType.FOREGROUND, mUid, BatteryStats.STATS_SINCE_CHARGED);
178 
179         assertThat(time).isEqualTo(TIME_EXPECTED_FOREGROUND);
180     }
181 
182     @Test
testGetProcessTimeMs_typeBackground_timeCorrect()183     public void testGetProcessTimeMs_typeBackground_timeCorrect() {
184         final long time =
185                 mBatteryUtils.getProcessTimeMs(
186                         BatteryUtils.StatusType.BACKGROUND, mUid, BatteryStats.STATS_SINCE_CHARGED);
187 
188         assertThat(time).isEqualTo(TIME_EXPECTED_BACKGROUND);
189     }
190 
191     @Test
testGetProcessTimeMs_typeAll_timeCorrect()192     public void testGetProcessTimeMs_typeAll_timeCorrect() {
193         doReturn(TIME_STATE_FOREGROUND + 500)
194                 .when(mBatteryUtils)
195                 .getForegroundActivityTotalTimeUs(eq(mUid), anyLong());
196 
197         final long time =
198                 mBatteryUtils.getProcessTimeMs(
199                         BatteryUtils.StatusType.ALL, mUid, BatteryStats.STATS_SINCE_CHARGED);
200 
201         assertThat(time).isEqualTo(TIME_EXPECTED_ALL);
202     }
203 
204     @Test
testGetProcessTimeMs_uidNull_returnZero()205     public void testGetProcessTimeMs_uidNull_returnZero() {
206         final long time =
207                 mBatteryUtils.getProcessTimeMs(
208                         BatteryUtils.StatusType.ALL, null, BatteryStats.STATS_SINCE_CHARGED);
209 
210         assertThat(time).isEqualTo(0);
211     }
212 
213     @Test
testCalculateBatteryPercent()214     public void testCalculateBatteryPercent() {
215         assertThat(
216                         mBatteryUtils.calculateBatteryPercent(
217                                 BATTERY_SYSTEM_USAGE, TOTAL_BATTERY_USAGE, DISCHARGE_AMOUNT))
218                 .isWithin(PRECISION)
219                 .of(PERCENT_SYSTEM_USAGE);
220     }
221 
222     @Test
testCalculateLastFullChargeTime()223     public void testCalculateLastFullChargeTime() {
224         final long currentTimeMs = System.currentTimeMillis();
225         when(mBatteryUsageStats.getStatsStartTimestamp())
226                 .thenReturn(currentTimeMs - TIME_SINCE_LAST_FULL_CHARGE_MS);
227 
228         assertThat(mBatteryUtils.calculateLastFullChargeTime(mBatteryUsageStats, currentTimeMs))
229                 .isEqualTo(TIME_SINCE_LAST_FULL_CHARGE_MS);
230     }
231 
232     @Test
testGetForegroundActivityTotalTimeMs_returnMilliseconds()233     public void testGetForegroundActivityTotalTimeMs_returnMilliseconds() {
234         final long rawRealtimeUs = SystemClock.elapsedRealtime() * 1000;
235         doReturn(mTimer).when(mUid).getForegroundActivityTimer();
236         doReturn(TIME_SINCE_LAST_FULL_CHARGE_US)
237                 .when(mTimer)
238                 .getTotalTimeLocked(rawRealtimeUs, BatteryStats.STATS_SINCE_CHARGED);
239 
240         assertThat(mBatteryUtils.getForegroundActivityTotalTimeUs(mUid, rawRealtimeUs))
241                 .isEqualTo(TIME_SINCE_LAST_FULL_CHARGE_US);
242     }
243 
244     @Test
testGetTargetSdkVersion_packageExist_returnSdk()245     public void testGetTargetSdkVersion_packageExist_returnSdk()
246             throws PackageManager.NameNotFoundException {
247         doReturn(mApplicationInfo)
248                 .when(mPackageManager)
249                 .getApplicationInfo(PACKAGE_NAME, PackageManager.GET_META_DATA);
250         mApplicationInfo.targetSdkVersion = SDK_VERSION;
251 
252         assertThat(mBatteryUtils.getTargetSdkVersion(PACKAGE_NAME)).isEqualTo(SDK_VERSION);
253     }
254 
255     @Test
testGetTargetSdkVersion_packageNotExist_returnSdkNull()256     public void testGetTargetSdkVersion_packageNotExist_returnSdkNull()
257             throws PackageManager.NameNotFoundException {
258         doThrow(new PackageManager.NameNotFoundException())
259                 .when(mPackageManager)
260                 .getApplicationInfo(PACKAGE_NAME, PackageManager.GET_META_DATA);
261 
262         assertThat(mBatteryUtils.getTargetSdkVersion(PACKAGE_NAME))
263                 .isEqualTo(BatteryUtils.SDK_NULL);
264     }
265 
266     @Test
testBackgroundRestrictionOn_restrictionOn_returnTrue()267     public void testBackgroundRestrictionOn_restrictionOn_returnTrue() {
268         doReturn(AppOpsManager.MODE_IGNORED)
269                 .when(mAppOpsManager)
270                 .checkOpNoThrow(AppOpsManager.OP_RUN_IN_BACKGROUND, UID, PACKAGE_NAME);
271 
272         assertThat(mBatteryUtils.isBackgroundRestrictionEnabled(SDK_VERSION, UID, PACKAGE_NAME))
273                 .isTrue();
274     }
275 
276     @Test
testBackgroundRestrictionOn_restrictionOff_returnFalse()277     public void testBackgroundRestrictionOn_restrictionOff_returnFalse() {
278         doReturn(AppOpsManager.MODE_ALLOWED)
279                 .when(mAppOpsManager)
280                 .checkOpNoThrow(AppOpsManager.OP_RUN_IN_BACKGROUND, UID, PACKAGE_NAME);
281 
282         assertThat(mBatteryUtils.isBackgroundRestrictionEnabled(SDK_VERSION, UID, PACKAGE_NAME))
283                 .isFalse();
284     }
285 
286     @Test
testIsPreOApp_SdkLowerThanO_ReturnTrue()287     public void testIsPreOApp_SdkLowerThanO_ReturnTrue() {
288         assertThat(mBatteryUtils.isPreOApp(LOW_SDK_PACKAGE)).isTrue();
289     }
290 
291     @Test
testIsPreOApp_SdkLargerOrEqualThanO_ReturnFalse()292     public void testIsPreOApp_SdkLargerOrEqualThanO_ReturnFalse() {
293         assertThat(mBatteryUtils.isPreOApp(HIGH_SDK_PACKAGE)).isFalse();
294     }
295 
296     @Test
testIsPreOApp_containPreOApp_ReturnTrue()297     public void testIsPreOApp_containPreOApp_ReturnTrue() {
298         assertThat(mBatteryUtils.isPreOApp(new String[] {HIGH_SDK_PACKAGE, LOW_SDK_PACKAGE}))
299                 .isTrue();
300     }
301 
302     @Test
testIsPreOApp_emptyList_ReturnFalse()303     public void testIsPreOApp_emptyList_ReturnFalse() {
304         assertThat(mBatteryUtils.isPreOApp(new String[] {})).isFalse();
305     }
306 
307     @Ignore
308     @Test
testSetForceAppStandby_forcePreOApp_forceTwoRestrictions()309     public void testSetForceAppStandby_forcePreOApp_forceTwoRestrictions() {
310         mBatteryUtils.setForceAppStandby(UID, LOW_SDK_PACKAGE, AppOpsManager.MODE_IGNORED);
311 
312         // Restrict both OP_RUN_IN_BACKGROUND and OP_RUN_ANY_IN_BACKGROUND
313         verify(mAppOpsManager)
314                 .setMode(
315                         AppOpsManager.OP_RUN_IN_BACKGROUND,
316                         UID,
317                         LOW_SDK_PACKAGE,
318                         AppOpsManager.MODE_IGNORED);
319         verify(mAppOpsManager)
320                 .setMode(
321                         AppOpsManager.OP_RUN_ANY_IN_BACKGROUND,
322                         UID,
323                         LOW_SDK_PACKAGE,
324                         AppOpsManager.MODE_IGNORED);
325     }
326 
327     @Ignore
328     @Test
testSetForceAppStandby_forceOApp_forceOneRestriction()329     public void testSetForceAppStandby_forceOApp_forceOneRestriction() {
330         mBatteryUtils.setForceAppStandby(UID, HIGH_SDK_PACKAGE, AppOpsManager.MODE_IGNORED);
331 
332         // Don't restrict OP_RUN_IN_BACKGROUND because it is already been restricted for O app
333         verify(mAppOpsManager, never())
334                 .setMode(
335                         AppOpsManager.OP_RUN_IN_BACKGROUND,
336                         UID,
337                         HIGH_SDK_PACKAGE,
338                         AppOpsManager.MODE_IGNORED);
339         // Restrict OP_RUN_ANY_IN_BACKGROUND
340         verify(mAppOpsManager)
341                 .setMode(
342                         AppOpsManager.OP_RUN_ANY_IN_BACKGROUND,
343                         UID,
344                         HIGH_SDK_PACKAGE,
345                         AppOpsManager.MODE_IGNORED);
346     }
347 
348     @Test
testSetForceAppStandby_restrictApp_recordTime()349     public void testSetForceAppStandby_restrictApp_recordTime() {
350         mBatteryUtils.setForceAppStandby(UID, HIGH_SDK_PACKAGE, AppOpsManager.MODE_IGNORED);
351 
352         verify(mBatteryDatabaseManager)
353                 .insertAction(
354                         eq(AnomalyDatabaseHelper.ActionType.RESTRICTION), eq(UID),
355                         eq(HIGH_SDK_PACKAGE), anyLong());
356     }
357 
358     @Test
testSetForceAppStandby_unrestrictApp_deleteTime()359     public void testSetForceAppStandby_unrestrictApp_deleteTime() {
360         mBatteryUtils.setForceAppStandby(UID, HIGH_SDK_PACKAGE, AppOpsManager.MODE_ALLOWED);
361 
362         verify(mBatteryDatabaseManager)
363                 .deleteAction(AnomalyDatabaseHelper.ActionType.RESTRICTION, UID, HIGH_SDK_PACKAGE);
364     }
365 
366     @Test
testIsForceAppStandbyEnabled_enabled_returnTrue()367     public void testIsForceAppStandbyEnabled_enabled_returnTrue() {
368         when(mAppOpsManager.checkOpNoThrow(
369                         AppOpsManager.OP_RUN_ANY_IN_BACKGROUND, UID, PACKAGE_NAME))
370                 .thenReturn(AppOpsManager.MODE_IGNORED);
371 
372         assertThat(mBatteryUtils.isForceAppStandbyEnabled(UID, PACKAGE_NAME)).isTrue();
373     }
374 
375     @Test
testIsForceAppStandbyEnabled_disabled_returnFalse()376     public void testIsForceAppStandbyEnabled_disabled_returnFalse() {
377         when(mAppOpsManager.checkOpNoThrow(
378                         AppOpsManager.OP_RUN_ANY_IN_BACKGROUND, UID, PACKAGE_NAME))
379                 .thenReturn(AppOpsManager.MODE_ALLOWED);
380 
381         assertThat(mBatteryUtils.isForceAppStandbyEnabled(UID, PACKAGE_NAME)).isFalse();
382     }
383 
384     @Test
clearForceAppStandby_appRestricted_clearAndReturnTrue()385     public void clearForceAppStandby_appRestricted_clearAndReturnTrue() {
386         when(mBatteryUtils.getPackageUid(HIGH_SDK_PACKAGE)).thenReturn(UID);
387         when(mAppOpsManager.checkOpNoThrow(
388                         AppOpsManager.OP_RUN_ANY_IN_BACKGROUND, UID, HIGH_SDK_PACKAGE))
389                 .thenReturn(AppOpsManager.MODE_IGNORED);
390 
391         assertThat(mBatteryUtils.clearForceAppStandby(HIGH_SDK_PACKAGE)).isTrue();
392         verify(mAppOpsManager)
393                 .setMode(
394                         AppOpsManager.OP_RUN_ANY_IN_BACKGROUND,
395                         UID,
396                         HIGH_SDK_PACKAGE,
397                         AppOpsManager.MODE_ALLOWED);
398     }
399 
400     @Test
clearForceAppStandby_appInvalid_returnFalse()401     public void clearForceAppStandby_appInvalid_returnFalse() {
402         when(mBatteryUtils.getPackageUid(PACKAGE_NAME)).thenReturn(BatteryUtils.UID_NULL);
403 
404         assertThat(mBatteryUtils.clearForceAppStandby(PACKAGE_NAME)).isFalse();
405         verify(mAppOpsManager, never())
406                 .setMode(
407                         AppOpsManager.OP_RUN_ANY_IN_BACKGROUND,
408                         UID,
409                         PACKAGE_NAME,
410                         AppOpsManager.MODE_ALLOWED);
411     }
412 
413     @Test
clearForceAppStandby_appUnrestricted_returnFalse()414     public void clearForceAppStandby_appUnrestricted_returnFalse() {
415         when(mBatteryUtils.getPackageUid(PACKAGE_NAME)).thenReturn(UID);
416         when(mAppOpsManager.checkOpNoThrow(
417                         AppOpsManager.OP_RUN_ANY_IN_BACKGROUND, UID, PACKAGE_NAME))
418                 .thenReturn(AppOpsManager.MODE_ALLOWED);
419 
420         assertThat(mBatteryUtils.clearForceAppStandby(PACKAGE_NAME)).isFalse();
421         verify(mAppOpsManager, never())
422                 .setMode(
423                         AppOpsManager.OP_RUN_ANY_IN_BACKGROUND,
424                         UID,
425                         PACKAGE_NAME,
426                         AppOpsManager.MODE_ALLOWED);
427     }
428 
429     @Test
getBatteryInfo_providerNull_shouldNotCrash()430     public void getBatteryInfo_providerNull_shouldNotCrash() {
431         when(mProvider.isEnhancedBatteryPredictionEnabled(mContext)).thenReturn(true);
432         when(mProvider.getEnhancedBatteryPrediction(mContext)).thenReturn(null);
433         when(mContext.registerReceiver(nullable(BroadcastReceiver.class), any(IntentFilter.class)))
434                 .thenReturn(new Intent());
435 
436         // Should not crash
437         assertThat(mBatteryUtils.getBatteryInfo(TAG)).isNotNull();
438     }
439 
440     @Test
getEnhancedEstimate_doesNotUpdateCache_ifEstimateFresh()441     public void getEnhancedEstimate_doesNotUpdateCache_ifEstimateFresh() {
442         Estimate estimate = new Estimate(1000, true, 1000);
443         Estimate.storeCachedEstimate(mContext, estimate);
444 
445         estimate = mBatteryUtils.getEnhancedEstimate();
446 
447         // only pass if estimate has not changed
448         assertThat(estimate).isNotNull();
449         assertThat(estimate.isBasedOnUsage()).isTrue();
450         assertThat(estimate.getAverageDischargeTime()).isEqualTo(1000);
451     }
452 
453     @Test
testIsBatteryDefenderOn_isDefenderAndIsCharging_returnTrue()454     public void testIsBatteryDefenderOn_isDefenderAndIsCharging_returnTrue() {
455         mBatteryInfo.isBatteryDefender = true;
456         mBatteryInfo.discharging = false;
457 
458         assertThat(mBatteryUtils.isBatteryDefenderOn(mBatteryInfo)).isTrue();
459     }
460 
461     @Test
testIsBatteryDefenderOn_isDefenderAndDischarging_returnFalse()462     public void testIsBatteryDefenderOn_isDefenderAndDischarging_returnFalse() {
463         mBatteryInfo.isBatteryDefender = true;
464         mBatteryInfo.discharging = true;
465 
466         assertThat(mBatteryUtils.isBatteryDefenderOn(mBatteryInfo)).isFalse();
467     }
468 
469     @Test
testIsBatteryDefenderOn_notDefenderAndDischarging_returnFalse()470     public void testIsBatteryDefenderOn_notDefenderAndDischarging_returnFalse() {
471         mBatteryInfo.isBatteryDefender = false;
472         mBatteryInfo.discharging = true;
473 
474         assertThat(mBatteryUtils.isBatteryDefenderOn(mBatteryInfo)).isFalse();
475     }
476 
477     @Test
testIsBatteryDefenderOn_notDefenderAndIsCharging_returnFalse()478     public void testIsBatteryDefenderOn_notDefenderAndIsCharging_returnFalse() {
479         mBatteryInfo.isBatteryDefender = false;
480         mBatteryInfo.discharging = false;
481 
482         assertThat(mBatteryUtils.isBatteryDefenderOn(mBatteryInfo)).isFalse();
483     }
484 }
485