11424c1d77cfcd2e44366f5a3fbed153ba782f265jackqdyulei/* 21424c1d77cfcd2e44366f5a3fbed153ba782f265jackqdyulei * Copyright (C) 2017 The Android Open Source Project 31424c1d77cfcd2e44366f5a3fbed153ba782f265jackqdyulei * Licensed under the Apache License, Version 2.0 (the "License"); 41424c1d77cfcd2e44366f5a3fbed153ba782f265jackqdyulei * you may not use this file except in compliance with the License. 51424c1d77cfcd2e44366f5a3fbed153ba782f265jackqdyulei * You may obtain a copy of the License at 61424c1d77cfcd2e44366f5a3fbed153ba782f265jackqdyulei * 71424c1d77cfcd2e44366f5a3fbed153ba782f265jackqdyulei * http://www.apache.org/licenses/LICENSE-2.0 81424c1d77cfcd2e44366f5a3fbed153ba782f265jackqdyulei * 91424c1d77cfcd2e44366f5a3fbed153ba782f265jackqdyulei * Unless required by applicable law or agreed to in writing, software 101424c1d77cfcd2e44366f5a3fbed153ba782f265jackqdyulei * distributed under the License is distributed on an "AS IS" BASIS, 111424c1d77cfcd2e44366f5a3fbed153ba782f265jackqdyulei * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 121424c1d77cfcd2e44366f5a3fbed153ba782f265jackqdyulei * See the License for the specific language governing permissions and 131424c1d77cfcd2e44366f5a3fbed153ba782f265jackqdyulei * limitations under the License. 141424c1d77cfcd2e44366f5a3fbed153ba782f265jackqdyulei * 151424c1d77cfcd2e44366f5a3fbed153ba782f265jackqdyulei * 161424c1d77cfcd2e44366f5a3fbed153ba782f265jackqdyulei */ 171424c1d77cfcd2e44366f5a3fbed153ba782f265jackqdyulei 181424c1d77cfcd2e44366f5a3fbed153ba782f265jackqdyuleipackage com.android.internal.os; 191424c1d77cfcd2e44366f5a3fbed153ba782f265jackqdyulei 201424c1d77cfcd2e44366f5a3fbed153ba782f265jackqdyulei 21ce0fd25e2ca2f8f7505dea7e684c5d05cb8d3890jackqdyuleiimport static android.os.BatteryStats.Uid.PROCESS_STATE_TOP; 22ce0fd25e2ca2f8f7505dea7e684c5d05cb8d3890jackqdyulei 231424c1d77cfcd2e44366f5a3fbed153ba782f265jackqdyuleiimport static com.google.common.truth.Truth.assertThat; 241424c1d77cfcd2e44366f5a3fbed153ba782f265jackqdyulei 251424c1d77cfcd2e44366f5a3fbed153ba782f265jackqdyuleiimport static org.mockito.Matchers.any; 26ce0fd25e2ca2f8f7505dea7e684c5d05cb8d3890jackqdyuleiimport static org.mockito.Matchers.anyInt; 271424c1d77cfcd2e44366f5a3fbed153ba782f265jackqdyuleiimport static org.mockito.Matchers.anyLong; 281424c1d77cfcd2e44366f5a3fbed153ba782f265jackqdyuleiimport static org.mockito.Matchers.eq; 291424c1d77cfcd2e44366f5a3fbed153ba782f265jackqdyuleiimport static org.mockito.Mockito.RETURNS_DEEP_STUBS; 301424c1d77cfcd2e44366f5a3fbed153ba782f265jackqdyuleiimport static org.mockito.Mockito.doNothing; 311424c1d77cfcd2e44366f5a3fbed153ba782f265jackqdyuleiimport static org.mockito.Mockito.doReturn; 321424c1d77cfcd2e44366f5a3fbed153ba782f265jackqdyuleiimport static org.mockito.Mockito.mock; 331424c1d77cfcd2e44366f5a3fbed153ba782f265jackqdyuleiimport static org.mockito.Mockito.spy; 341424c1d77cfcd2e44366f5a3fbed153ba782f265jackqdyuleiimport static org.mockito.Mockito.when; 351424c1d77cfcd2e44366f5a3fbed153ba782f265jackqdyulei 361424c1d77cfcd2e44366f5a3fbed153ba782f265jackqdyuleiimport android.content.Context; 371424c1d77cfcd2e44366f5a3fbed153ba782f265jackqdyuleiimport android.content.pm.PackageManager; 381424c1d77cfcd2e44366f5a3fbed153ba782f265jackqdyuleiimport android.os.BatteryStats; 391424c1d77cfcd2e44366f5a3fbed153ba782f265jackqdyuleiimport android.os.Process; 401424c1d77cfcd2e44366f5a3fbed153ba782f265jackqdyuleiimport android.support.test.InstrumentationRegistry; 411424c1d77cfcd2e44366f5a3fbed153ba782f265jackqdyuleiimport android.support.test.filters.SmallTest; 421424c1d77cfcd2e44366f5a3fbed153ba782f265jackqdyuleiimport android.support.test.runner.AndroidJUnit4; 431424c1d77cfcd2e44366f5a3fbed153ba782f265jackqdyuleiimport android.text.format.DateUtils; 441424c1d77cfcd2e44366f5a3fbed153ba782f265jackqdyulei 451424c1d77cfcd2e44366f5a3fbed153ba782f265jackqdyuleiimport junit.framework.TestCase; 461424c1d77cfcd2e44366f5a3fbed153ba782f265jackqdyulei 471424c1d77cfcd2e44366f5a3fbed153ba782f265jackqdyuleiimport org.junit.Before; 481424c1d77cfcd2e44366f5a3fbed153ba782f265jackqdyuleiimport org.junit.Test; 491424c1d77cfcd2e44366f5a3fbed153ba782f265jackqdyuleiimport org.junit.runner.RunWith; 501424c1d77cfcd2e44366f5a3fbed153ba782f265jackqdyuleiimport org.mockito.Mock; 511424c1d77cfcd2e44366f5a3fbed153ba782f265jackqdyuleiimport org.mockito.MockitoAnnotations; 521424c1d77cfcd2e44366f5a3fbed153ba782f265jackqdyulei 531424c1d77cfcd2e44366f5a3fbed153ba782f265jackqdyuleiimport java.util.ArrayList; 541424c1d77cfcd2e44366f5a3fbed153ba782f265jackqdyuleiimport java.util.List; 551424c1d77cfcd2e44366f5a3fbed153ba782f265jackqdyulei 561424c1d77cfcd2e44366f5a3fbed153ba782f265jackqdyulei@RunWith(AndroidJUnit4.class) 571424c1d77cfcd2e44366f5a3fbed153ba782f265jackqdyulei@SmallTest 581424c1d77cfcd2e44366f5a3fbed153ba782f265jackqdyuleipublic class BatteryStatsHelperTest extends TestCase { 591424c1d77cfcd2e44366f5a3fbed153ba782f265jackqdyulei private static final long TIME_FOREGROUND_ACTIVITY_ZERO = 0; 60ce0fd25e2ca2f8f7505dea7e684c5d05cb8d3890jackqdyulei private static final long TIME_FOREGROUND_ACTIVITY = 100 * DateUtils.MINUTE_IN_MILLIS * 1000; 61ce0fd25e2ca2f8f7505dea7e684c5d05cb8d3890jackqdyulei private static final long TIME_STATE_FOREGROUND_MS = 10 * DateUtils.MINUTE_IN_MILLIS; 62ce0fd25e2ca2f8f7505dea7e684c5d05cb8d3890jackqdyulei private static final long TIME_STATE_FOREGROUND_US = TIME_STATE_FOREGROUND_MS * 1000; 631424c1d77cfcd2e44366f5a3fbed153ba782f265jackqdyulei 641424c1d77cfcd2e44366f5a3fbed153ba782f265jackqdyulei private static final int UID = 123456; 651424c1d77cfcd2e44366f5a3fbed153ba782f265jackqdyulei private static final double BATTERY_SCREEN_USAGE = 300; 661424c1d77cfcd2e44366f5a3fbed153ba782f265jackqdyulei private static final double BATTERY_SYSTEM_USAGE = 600; 67ce0fd25e2ca2f8f7505dea7e684c5d05cb8d3890jackqdyulei private static final double BATTERY_WIFI_USAGE = 200; 68ce0fd25e2ca2f8f7505dea7e684c5d05cb8d3890jackqdyulei private static final double BATTERY_IDLE_USAGE = 600; 69ce0fd25e2ca2f8f7505dea7e684c5d05cb8d3890jackqdyulei private static final double BATTERY_BLUETOOTH_USAGE = 300; 701424c1d77cfcd2e44366f5a3fbed153ba782f265jackqdyulei private static final double BATTERY_OVERACCOUNTED_USAGE = 500; 711424c1d77cfcd2e44366f5a3fbed153ba782f265jackqdyulei private static final double BATTERY_UNACCOUNTED_USAGE = 700; 721424c1d77cfcd2e44366f5a3fbed153ba782f265jackqdyulei private static final double BATTERY_APP_USAGE = 100; 731424c1d77cfcd2e44366f5a3fbed153ba782f265jackqdyulei private static final double TOTAL_BATTERY_USAGE = 1000; 741424c1d77cfcd2e44366f5a3fbed153ba782f265jackqdyulei private static final double PRECISION = 0.001; 751424c1d77cfcd2e44366f5a3fbed153ba782f265jackqdyulei 761424c1d77cfcd2e44366f5a3fbed153ba782f265jackqdyulei @Mock 771424c1d77cfcd2e44366f5a3fbed153ba782f265jackqdyulei private BatteryStats.Uid mUid; 781424c1d77cfcd2e44366f5a3fbed153ba782f265jackqdyulei @Mock 79ce0fd25e2ca2f8f7505dea7e684c5d05cb8d3890jackqdyulei private BatterySipper mWifiBatterySipper; 80ce0fd25e2ca2f8f7505dea7e684c5d05cb8d3890jackqdyulei @Mock 81ce0fd25e2ca2f8f7505dea7e684c5d05cb8d3890jackqdyulei private BatterySipper mBluetoothBatterySipper; 82ce0fd25e2ca2f8f7505dea7e684c5d05cb8d3890jackqdyulei @Mock 83ce0fd25e2ca2f8f7505dea7e684c5d05cb8d3890jackqdyulei private BatterySipper mIdleBatterySipper; 84ce0fd25e2ca2f8f7505dea7e684c5d05cb8d3890jackqdyulei @Mock 851424c1d77cfcd2e44366f5a3fbed153ba782f265jackqdyulei private BatterySipper mNormalBatterySipper; 861424c1d77cfcd2e44366f5a3fbed153ba782f265jackqdyulei @Mock 871424c1d77cfcd2e44366f5a3fbed153ba782f265jackqdyulei private BatterySipper mScreenBatterySipper; 881424c1d77cfcd2e44366f5a3fbed153ba782f265jackqdyulei @Mock 891424c1d77cfcd2e44366f5a3fbed153ba782f265jackqdyulei private BatterySipper mOvercountedBatterySipper; 901424c1d77cfcd2e44366f5a3fbed153ba782f265jackqdyulei @Mock 911424c1d77cfcd2e44366f5a3fbed153ba782f265jackqdyulei private BatterySipper mUnaccountedBatterySipper; 921424c1d77cfcd2e44366f5a3fbed153ba782f265jackqdyulei @Mock 931424c1d77cfcd2e44366f5a3fbed153ba782f265jackqdyulei private BatterySipper mSystemBatterySipper; 941424c1d77cfcd2e44366f5a3fbed153ba782f265jackqdyulei @Mock 951424c1d77cfcd2e44366f5a3fbed153ba782f265jackqdyulei private BatterySipper mCellBatterySipper; 961424c1d77cfcd2e44366f5a3fbed153ba782f265jackqdyulei @Mock 971424c1d77cfcd2e44366f5a3fbed153ba782f265jackqdyulei private PackageManager mPackageManager; 981424c1d77cfcd2e44366f5a3fbed153ba782f265jackqdyulei 991424c1d77cfcd2e44366f5a3fbed153ba782f265jackqdyulei private BatteryStatsHelper mBatteryStatsHelper; 1001424c1d77cfcd2e44366f5a3fbed153ba782f265jackqdyulei private Context mContext; 1011424c1d77cfcd2e44366f5a3fbed153ba782f265jackqdyulei 1021424c1d77cfcd2e44366f5a3fbed153ba782f265jackqdyulei @Before 1031424c1d77cfcd2e44366f5a3fbed153ba782f265jackqdyulei public void setUp() { 1041424c1d77cfcd2e44366f5a3fbed153ba782f265jackqdyulei MockitoAnnotations.initMocks(this); 1051424c1d77cfcd2e44366f5a3fbed153ba782f265jackqdyulei 1061424c1d77cfcd2e44366f5a3fbed153ba782f265jackqdyulei mNormalBatterySipper.drainType = BatterySipper.DrainType.APP; 1071424c1d77cfcd2e44366f5a3fbed153ba782f265jackqdyulei mNormalBatterySipper.totalPowerMah = TOTAL_BATTERY_USAGE; 1081424c1d77cfcd2e44366f5a3fbed153ba782f265jackqdyulei when(mNormalBatterySipper.getUid()).thenReturn(UID); 1091424c1d77cfcd2e44366f5a3fbed153ba782f265jackqdyulei mNormalBatterySipper.uidObj = mUid; 1101424c1d77cfcd2e44366f5a3fbed153ba782f265jackqdyulei 1111424c1d77cfcd2e44366f5a3fbed153ba782f265jackqdyulei 1121424c1d77cfcd2e44366f5a3fbed153ba782f265jackqdyulei mScreenBatterySipper.drainType = BatterySipper.DrainType.SCREEN; 1131424c1d77cfcd2e44366f5a3fbed153ba782f265jackqdyulei mScreenBatterySipper.totalPowerMah = BATTERY_SCREEN_USAGE; 1141424c1d77cfcd2e44366f5a3fbed153ba782f265jackqdyulei 1151424c1d77cfcd2e44366f5a3fbed153ba782f265jackqdyulei mSystemBatterySipper.drainType = BatterySipper.DrainType.APP; 1161424c1d77cfcd2e44366f5a3fbed153ba782f265jackqdyulei mSystemBatterySipper.totalPowerMah = BATTERY_SYSTEM_USAGE; 1171424c1d77cfcd2e44366f5a3fbed153ba782f265jackqdyulei mSystemBatterySipper.uidObj = mUid; 1181424c1d77cfcd2e44366f5a3fbed153ba782f265jackqdyulei when(mSystemBatterySipper.getUid()).thenReturn(Process.SYSTEM_UID); 1191424c1d77cfcd2e44366f5a3fbed153ba782f265jackqdyulei 1201424c1d77cfcd2e44366f5a3fbed153ba782f265jackqdyulei mOvercountedBatterySipper.drainType = BatterySipper.DrainType.OVERCOUNTED; 1211424c1d77cfcd2e44366f5a3fbed153ba782f265jackqdyulei mOvercountedBatterySipper.totalPowerMah = BATTERY_OVERACCOUNTED_USAGE; 1221424c1d77cfcd2e44366f5a3fbed153ba782f265jackqdyulei 1231424c1d77cfcd2e44366f5a3fbed153ba782f265jackqdyulei mUnaccountedBatterySipper.drainType = BatterySipper.DrainType.UNACCOUNTED; 1241424c1d77cfcd2e44366f5a3fbed153ba782f265jackqdyulei mUnaccountedBatterySipper.totalPowerMah = BATTERY_UNACCOUNTED_USAGE; 1251424c1d77cfcd2e44366f5a3fbed153ba782f265jackqdyulei 126ce0fd25e2ca2f8f7505dea7e684c5d05cb8d3890jackqdyulei mWifiBatterySipper.drainType = BatterySipper.DrainType.WIFI; 127ce0fd25e2ca2f8f7505dea7e684c5d05cb8d3890jackqdyulei mWifiBatterySipper.totalPowerMah = BATTERY_WIFI_USAGE; 128ce0fd25e2ca2f8f7505dea7e684c5d05cb8d3890jackqdyulei 129ce0fd25e2ca2f8f7505dea7e684c5d05cb8d3890jackqdyulei mBluetoothBatterySipper.drainType = BatterySipper.DrainType.BLUETOOTH; 130ce0fd25e2ca2f8f7505dea7e684c5d05cb8d3890jackqdyulei mBluetoothBatterySipper.totalPowerMah = BATTERY_BLUETOOTH_USAGE; 131ce0fd25e2ca2f8f7505dea7e684c5d05cb8d3890jackqdyulei 132ce0fd25e2ca2f8f7505dea7e684c5d05cb8d3890jackqdyulei mIdleBatterySipper.drainType = BatterySipper.DrainType.IDLE; 133ce0fd25e2ca2f8f7505dea7e684c5d05cb8d3890jackqdyulei mIdleBatterySipper.totalPowerMah = BATTERY_IDLE_USAGE; 134ce0fd25e2ca2f8f7505dea7e684c5d05cb8d3890jackqdyulei 1351424c1d77cfcd2e44366f5a3fbed153ba782f265jackqdyulei mContext = InstrumentationRegistry.getContext(); 1361424c1d77cfcd2e44366f5a3fbed153ba782f265jackqdyulei mBatteryStatsHelper = spy(new BatteryStatsHelper(mContext)); 1371424c1d77cfcd2e44366f5a3fbed153ba782f265jackqdyulei mBatteryStatsHelper.setPackageManager(mPackageManager); 1381424c1d77cfcd2e44366f5a3fbed153ba782f265jackqdyulei } 1391424c1d77cfcd2e44366f5a3fbed153ba782f265jackqdyulei 1401424c1d77cfcd2e44366f5a3fbed153ba782f265jackqdyulei @Test 1411424c1d77cfcd2e44366f5a3fbed153ba782f265jackqdyulei public void testShouldHideSipper_TypeUnAccounted_ReturnTrue() { 1421424c1d77cfcd2e44366f5a3fbed153ba782f265jackqdyulei mNormalBatterySipper.drainType = BatterySipper.DrainType.UNACCOUNTED; 1431424c1d77cfcd2e44366f5a3fbed153ba782f265jackqdyulei assertThat(mBatteryStatsHelper.shouldHideSipper(mNormalBatterySipper)).isTrue(); 1441424c1d77cfcd2e44366f5a3fbed153ba782f265jackqdyulei } 1451424c1d77cfcd2e44366f5a3fbed153ba782f265jackqdyulei 1461424c1d77cfcd2e44366f5a3fbed153ba782f265jackqdyulei @Test 1471424c1d77cfcd2e44366f5a3fbed153ba782f265jackqdyulei public void testShouldHideSipper_TypeOverAccounted_ReturnTrue() { 1481424c1d77cfcd2e44366f5a3fbed153ba782f265jackqdyulei mNormalBatterySipper.drainType = BatterySipper.DrainType.OVERCOUNTED; 1491424c1d77cfcd2e44366f5a3fbed153ba782f265jackqdyulei assertThat(mBatteryStatsHelper.shouldHideSipper(mNormalBatterySipper)).isTrue(); 1501424c1d77cfcd2e44366f5a3fbed153ba782f265jackqdyulei } 1511424c1d77cfcd2e44366f5a3fbed153ba782f265jackqdyulei 1521424c1d77cfcd2e44366f5a3fbed153ba782f265jackqdyulei @Test 1531424c1d77cfcd2e44366f5a3fbed153ba782f265jackqdyulei public void testShouldHideSipper_TypeIdle_ReturnTrue() { 1541424c1d77cfcd2e44366f5a3fbed153ba782f265jackqdyulei mNormalBatterySipper.drainType = BatterySipper.DrainType.IDLE; 1551424c1d77cfcd2e44366f5a3fbed153ba782f265jackqdyulei assertThat(mBatteryStatsHelper.shouldHideSipper(mNormalBatterySipper)).isTrue(); 1561424c1d77cfcd2e44366f5a3fbed153ba782f265jackqdyulei } 1571424c1d77cfcd2e44366f5a3fbed153ba782f265jackqdyulei 1581424c1d77cfcd2e44366f5a3fbed153ba782f265jackqdyulei @Test 1591424c1d77cfcd2e44366f5a3fbed153ba782f265jackqdyulei public void testShouldHideSipper_TypeCell_ReturnTrue() { 1601424c1d77cfcd2e44366f5a3fbed153ba782f265jackqdyulei mNormalBatterySipper.drainType = BatterySipper.DrainType.CELL; 1611424c1d77cfcd2e44366f5a3fbed153ba782f265jackqdyulei assertThat(mBatteryStatsHelper.shouldHideSipper(mNormalBatterySipper)).isTrue(); 1621424c1d77cfcd2e44366f5a3fbed153ba782f265jackqdyulei } 1631424c1d77cfcd2e44366f5a3fbed153ba782f265jackqdyulei 1641424c1d77cfcd2e44366f5a3fbed153ba782f265jackqdyulei @Test 1651424c1d77cfcd2e44366f5a3fbed153ba782f265jackqdyulei public void testShouldHideSipper_TypeScreen_ReturnTrue() { 1661424c1d77cfcd2e44366f5a3fbed153ba782f265jackqdyulei mNormalBatterySipper.drainType = BatterySipper.DrainType.SCREEN; 1671424c1d77cfcd2e44366f5a3fbed153ba782f265jackqdyulei assertThat(mBatteryStatsHelper.shouldHideSipper(mNormalBatterySipper)).isTrue(); 1681424c1d77cfcd2e44366f5a3fbed153ba782f265jackqdyulei } 1691424c1d77cfcd2e44366f5a3fbed153ba782f265jackqdyulei 1701424c1d77cfcd2e44366f5a3fbed153ba782f265jackqdyulei @Test 1711424c1d77cfcd2e44366f5a3fbed153ba782f265jackqdyulei public void testShouldHideSipper_TypeSystem_ReturnTrue() { 1721424c1d77cfcd2e44366f5a3fbed153ba782f265jackqdyulei mNormalBatterySipper.drainType = BatterySipper.DrainType.APP; 1731424c1d77cfcd2e44366f5a3fbed153ba782f265jackqdyulei when(mNormalBatterySipper.getUid()).thenReturn(Process.ROOT_UID); 1741424c1d77cfcd2e44366f5a3fbed153ba782f265jackqdyulei assertThat(mBatteryStatsHelper.shouldHideSipper(mNormalBatterySipper)).isTrue(); 1751424c1d77cfcd2e44366f5a3fbed153ba782f265jackqdyulei } 1761424c1d77cfcd2e44366f5a3fbed153ba782f265jackqdyulei 1771424c1d77cfcd2e44366f5a3fbed153ba782f265jackqdyulei @Test 1781424c1d77cfcd2e44366f5a3fbed153ba782f265jackqdyulei public void testShouldHideSipper_UidNormal_ReturnFalse() { 1791424c1d77cfcd2e44366f5a3fbed153ba782f265jackqdyulei mNormalBatterySipper.drainType = BatterySipper.DrainType.APP; 1801424c1d77cfcd2e44366f5a3fbed153ba782f265jackqdyulei assertThat(mBatteryStatsHelper.shouldHideSipper(mNormalBatterySipper)).isFalse(); 1811424c1d77cfcd2e44366f5a3fbed153ba782f265jackqdyulei } 1821424c1d77cfcd2e44366f5a3fbed153ba782f265jackqdyulei 1831424c1d77cfcd2e44366f5a3fbed153ba782f265jackqdyulei @Test 1841424c1d77cfcd2e44366f5a3fbed153ba782f265jackqdyulei public void testRemoveHiddenBatterySippers_ContainsHiddenSippers_RemoveAndReturnValue() { 1851424c1d77cfcd2e44366f5a3fbed153ba782f265jackqdyulei final List<BatterySipper> sippers = new ArrayList<>(); 1861424c1d77cfcd2e44366f5a3fbed153ba782f265jackqdyulei sippers.add(mNormalBatterySipper); 1871424c1d77cfcd2e44366f5a3fbed153ba782f265jackqdyulei sippers.add(mScreenBatterySipper); 1881424c1d77cfcd2e44366f5a3fbed153ba782f265jackqdyulei sippers.add(mSystemBatterySipper); 1891424c1d77cfcd2e44366f5a3fbed153ba782f265jackqdyulei sippers.add(mOvercountedBatterySipper); 1901424c1d77cfcd2e44366f5a3fbed153ba782f265jackqdyulei sippers.add(mUnaccountedBatterySipper); 191ce0fd25e2ca2f8f7505dea7e684c5d05cb8d3890jackqdyulei sippers.add(mWifiBatterySipper); 192ce0fd25e2ca2f8f7505dea7e684c5d05cb8d3890jackqdyulei sippers.add(mBluetoothBatterySipper); 193ce0fd25e2ca2f8f7505dea7e684c5d05cb8d3890jackqdyulei sippers.add(mIdleBatterySipper); 1941424c1d77cfcd2e44366f5a3fbed153ba782f265jackqdyulei doReturn(true).when(mBatteryStatsHelper).isTypeSystem(mSystemBatterySipper); 1951424c1d77cfcd2e44366f5a3fbed153ba782f265jackqdyulei doNothing().when(mBatteryStatsHelper).smearScreenBatterySipper(any(), any()); 1961424c1d77cfcd2e44366f5a3fbed153ba782f265jackqdyulei 1971424c1d77cfcd2e44366f5a3fbed153ba782f265jackqdyulei final double totalUsage = mBatteryStatsHelper.removeHiddenBatterySippers(sippers); 1981424c1d77cfcd2e44366f5a3fbed153ba782f265jackqdyulei 1991424c1d77cfcd2e44366f5a3fbed153ba782f265jackqdyulei assertThat(mNormalBatterySipper.shouldHide).isFalse(); 2001424c1d77cfcd2e44366f5a3fbed153ba782f265jackqdyulei assertThat(mScreenBatterySipper.shouldHide).isTrue(); 2011424c1d77cfcd2e44366f5a3fbed153ba782f265jackqdyulei assertThat(mSystemBatterySipper.shouldHide).isTrue(); 2021424c1d77cfcd2e44366f5a3fbed153ba782f265jackqdyulei assertThat(mOvercountedBatterySipper.shouldHide).isTrue(); 2031424c1d77cfcd2e44366f5a3fbed153ba782f265jackqdyulei assertThat(mUnaccountedBatterySipper.shouldHide).isTrue(); 2041424c1d77cfcd2e44366f5a3fbed153ba782f265jackqdyulei assertThat(totalUsage).isWithin(PRECISION).of(BATTERY_SYSTEM_USAGE); 2051424c1d77cfcd2e44366f5a3fbed153ba782f265jackqdyulei } 2061424c1d77cfcd2e44366f5a3fbed153ba782f265jackqdyulei 2071424c1d77cfcd2e44366f5a3fbed153ba782f265jackqdyulei @Test 2081424c1d77cfcd2e44366f5a3fbed153ba782f265jackqdyulei public void testSmearScreenBatterySipper() { 2091424c1d77cfcd2e44366f5a3fbed153ba782f265jackqdyulei final BatterySipper sipperNull = createTestSmearBatterySipper(TIME_FOREGROUND_ACTIVITY_ZERO, 2101424c1d77cfcd2e44366f5a3fbed153ba782f265jackqdyulei BATTERY_APP_USAGE, 0 /* uid */, true /* isUidNull */); 2111424c1d77cfcd2e44366f5a3fbed153ba782f265jackqdyulei final BatterySipper sipperBg = createTestSmearBatterySipper(TIME_FOREGROUND_ACTIVITY_ZERO, 2121424c1d77cfcd2e44366f5a3fbed153ba782f265jackqdyulei BATTERY_APP_USAGE, 1 /* uid */, false /* isUidNull */); 2131424c1d77cfcd2e44366f5a3fbed153ba782f265jackqdyulei final BatterySipper sipperFg = createTestSmearBatterySipper(TIME_FOREGROUND_ACTIVITY, 2141424c1d77cfcd2e44366f5a3fbed153ba782f265jackqdyulei BATTERY_APP_USAGE, 2 /* uid */, false /* isUidNull */); 2151424c1d77cfcd2e44366f5a3fbed153ba782f265jackqdyulei 2161424c1d77cfcd2e44366f5a3fbed153ba782f265jackqdyulei final List<BatterySipper> sippers = new ArrayList<>(); 2171424c1d77cfcd2e44366f5a3fbed153ba782f265jackqdyulei sippers.add(sipperNull); 2181424c1d77cfcd2e44366f5a3fbed153ba782f265jackqdyulei sippers.add(sipperBg); 2191424c1d77cfcd2e44366f5a3fbed153ba782f265jackqdyulei sippers.add(sipperFg); 2201424c1d77cfcd2e44366f5a3fbed153ba782f265jackqdyulei 2211424c1d77cfcd2e44366f5a3fbed153ba782f265jackqdyulei mBatteryStatsHelper.smearScreenBatterySipper(sippers, mScreenBatterySipper); 2221424c1d77cfcd2e44366f5a3fbed153ba782f265jackqdyulei 2231424c1d77cfcd2e44366f5a3fbed153ba782f265jackqdyulei assertThat(sipperNull.screenPowerMah).isWithin(PRECISION).of(0); 2241424c1d77cfcd2e44366f5a3fbed153ba782f265jackqdyulei assertThat(sipperBg.screenPowerMah).isWithin(PRECISION).of(0); 2251424c1d77cfcd2e44366f5a3fbed153ba782f265jackqdyulei assertThat(sipperFg.screenPowerMah).isWithin(PRECISION).of(BATTERY_SCREEN_USAGE); 2261424c1d77cfcd2e44366f5a3fbed153ba782f265jackqdyulei } 2271424c1d77cfcd2e44366f5a3fbed153ba782f265jackqdyulei 2281424c1d77cfcd2e44366f5a3fbed153ba782f265jackqdyulei @Test 2291424c1d77cfcd2e44366f5a3fbed153ba782f265jackqdyulei public void testIsTypeSystem_systemPackage_returnTrue() { 2301424c1d77cfcd2e44366f5a3fbed153ba782f265jackqdyulei final String[] systemPackages = {"com.android.system"}; 2311424c1d77cfcd2e44366f5a3fbed153ba782f265jackqdyulei mBatteryStatsHelper.setSystemPackageArray(systemPackages); 2321424c1d77cfcd2e44366f5a3fbed153ba782f265jackqdyulei doReturn(UID).when(mNormalBatterySipper).getUid(); 2331424c1d77cfcd2e44366f5a3fbed153ba782f265jackqdyulei doReturn(systemPackages).when(mPackageManager).getPackagesForUid(UID); 2341424c1d77cfcd2e44366f5a3fbed153ba782f265jackqdyulei 2351424c1d77cfcd2e44366f5a3fbed153ba782f265jackqdyulei assertThat(mBatteryStatsHelper.isTypeSystem(mNormalBatterySipper)).isTrue(); 2361424c1d77cfcd2e44366f5a3fbed153ba782f265jackqdyulei } 2371424c1d77cfcd2e44366f5a3fbed153ba782f265jackqdyulei 2381424c1d77cfcd2e44366f5a3fbed153ba782f265jackqdyulei @Test 2391424c1d77cfcd2e44366f5a3fbed153ba782f265jackqdyulei public void testIsTypeService_servicePackage_returnTrue() { 2401424c1d77cfcd2e44366f5a3fbed153ba782f265jackqdyulei final String[] servicePackages = {"com.android.service"}; 2411424c1d77cfcd2e44366f5a3fbed153ba782f265jackqdyulei mBatteryStatsHelper.setServicePackageArray(servicePackages); 2421424c1d77cfcd2e44366f5a3fbed153ba782f265jackqdyulei doReturn(UID).when(mNormalBatterySipper).getUid(); 2431424c1d77cfcd2e44366f5a3fbed153ba782f265jackqdyulei doReturn(servicePackages).when(mPackageManager).getPackagesForUid(UID); 2441424c1d77cfcd2e44366f5a3fbed153ba782f265jackqdyulei 2451424c1d77cfcd2e44366f5a3fbed153ba782f265jackqdyulei assertThat(mBatteryStatsHelper.isTypeService(mNormalBatterySipper)).isTrue(); 2461424c1d77cfcd2e44366f5a3fbed153ba782f265jackqdyulei } 2471424c1d77cfcd2e44366f5a3fbed153ba782f265jackqdyulei 248ce0fd25e2ca2f8f7505dea7e684c5d05cb8d3890jackqdyulei @Test 249ce0fd25e2ca2f8f7505dea7e684c5d05cb8d3890jackqdyulei public void testGetProcessForegroundTimeMs_largerActivityTime_returnMinTime() { 250ce0fd25e2ca2f8f7505dea7e684c5d05cb8d3890jackqdyulei doReturn(TIME_STATE_FOREGROUND_US + 500).when(mBatteryStatsHelper) 251ce0fd25e2ca2f8f7505dea7e684c5d05cb8d3890jackqdyulei .getForegroundActivityTotalTimeUs(eq(mUid), anyLong()); 252ce0fd25e2ca2f8f7505dea7e684c5d05cb8d3890jackqdyulei doReturn(TIME_STATE_FOREGROUND_US).when(mUid).getProcessStateTime(eq(PROCESS_STATE_TOP), 253ce0fd25e2ca2f8f7505dea7e684c5d05cb8d3890jackqdyulei anyLong(), anyInt()); 254ce0fd25e2ca2f8f7505dea7e684c5d05cb8d3890jackqdyulei 255ce0fd25e2ca2f8f7505dea7e684c5d05cb8d3890jackqdyulei final long time = mBatteryStatsHelper.getProcessForegroundTimeMs(mUid, 256ce0fd25e2ca2f8f7505dea7e684c5d05cb8d3890jackqdyulei BatteryStats.STATS_SINCE_CHARGED); 257ce0fd25e2ca2f8f7505dea7e684c5d05cb8d3890jackqdyulei 258ce0fd25e2ca2f8f7505dea7e684c5d05cb8d3890jackqdyulei assertThat(time).isEqualTo(TIME_STATE_FOREGROUND_MS); 259ce0fd25e2ca2f8f7505dea7e684c5d05cb8d3890jackqdyulei } 260ce0fd25e2ca2f8f7505dea7e684c5d05cb8d3890jackqdyulei 2611424c1d77cfcd2e44366f5a3fbed153ba782f265jackqdyulei private BatterySipper createTestSmearBatterySipper(long activityTime, double totalPowerMah, 2621424c1d77cfcd2e44366f5a3fbed153ba782f265jackqdyulei int uidCode, boolean isUidNull) { 2631424c1d77cfcd2e44366f5a3fbed153ba782f265jackqdyulei final BatterySipper sipper = mock(BatterySipper.class); 2641424c1d77cfcd2e44366f5a3fbed153ba782f265jackqdyulei sipper.drainType = BatterySipper.DrainType.APP; 2651424c1d77cfcd2e44366f5a3fbed153ba782f265jackqdyulei sipper.totalPowerMah = totalPowerMah; 2661424c1d77cfcd2e44366f5a3fbed153ba782f265jackqdyulei doReturn(uidCode).when(sipper).getUid(); 2671424c1d77cfcd2e44366f5a3fbed153ba782f265jackqdyulei if (!isUidNull) { 2681424c1d77cfcd2e44366f5a3fbed153ba782f265jackqdyulei final BatteryStats.Uid uid = mock(BatteryStats.Uid.class, RETURNS_DEEP_STUBS); 269ce0fd25e2ca2f8f7505dea7e684c5d05cb8d3890jackqdyulei doReturn(activityTime).when(mBatteryStatsHelper).getProcessForegroundTimeMs(eq(uid), 270ce0fd25e2ca2f8f7505dea7e684c5d05cb8d3890jackqdyulei anyInt()); 2711424c1d77cfcd2e44366f5a3fbed153ba782f265jackqdyulei doReturn(uidCode).when(uid).getUid(); 2721424c1d77cfcd2e44366f5a3fbed153ba782f265jackqdyulei sipper.uidObj = uid; 2731424c1d77cfcd2e44366f5a3fbed153ba782f265jackqdyulei } 2741424c1d77cfcd2e44366f5a3fbed153ba782f265jackqdyulei 2751424c1d77cfcd2e44366f5a3fbed153ba782f265jackqdyulei return sipper; 2761424c1d77cfcd2e44366f5a3fbed153ba782f265jackqdyulei } 2771424c1d77cfcd2e44366f5a3fbed153ba782f265jackqdyulei 2781424c1d77cfcd2e44366f5a3fbed153ba782f265jackqdyulei} 279