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