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