1ab9ad195d1e873f7569dec45c4e627a4e8ba67e4Amith Yamasani/*
2ab9ad195d1e873f7569dec45c4e627a4e8ba67e4Amith Yamasani * Copyright (C) 2016 The Android Open Source Project
3ab9ad195d1e873f7569dec45c4e627a4e8ba67e4Amith Yamasani *
4ab9ad195d1e873f7569dec45c4e627a4e8ba67e4Amith Yamasani * Licensed under the Apache License, Version 2.0 (the "License"); you may not
5ab9ad195d1e873f7569dec45c4e627a4e8ba67e4Amith Yamasani * use this file except in compliance with the License. You may obtain a copy of
6ab9ad195d1e873f7569dec45c4e627a4e8ba67e4Amith Yamasani * the License at
7ab9ad195d1e873f7569dec45c4e627a4e8ba67e4Amith Yamasani *
8ab9ad195d1e873f7569dec45c4e627a4e8ba67e4Amith Yamasani * http://www.apache.org/licenses/LICENSE-2.0
9ab9ad195d1e873f7569dec45c4e627a4e8ba67e4Amith Yamasani *
10ab9ad195d1e873f7569dec45c4e627a4e8ba67e4Amith Yamasani * Unless required by applicable law or agreed to in writing, software
11ab9ad195d1e873f7569dec45c4e627a4e8ba67e4Amith Yamasani * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
12ab9ad195d1e873f7569dec45c4e627a4e8ba67e4Amith Yamasani * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
13ab9ad195d1e873f7569dec45c4e627a4e8ba67e4Amith Yamasani * License for the specific language governing permissions and limitations under
14ab9ad195d1e873f7569dec45c4e627a4e8ba67e4Amith Yamasani * the License.
15ab9ad195d1e873f7569dec45c4e627a4e8ba67e4Amith Yamasani */
16ab9ad195d1e873f7569dec45c4e627a4e8ba67e4Amith Yamasanipackage com.android.internal.os;
17ab9ad195d1e873f7569dec45c4e627a4e8ba67e4Amith Yamasani
18ab9ad195d1e873f7569dec45c4e627a4e8ba67e4Amith Yamasaniimport android.app.ActivityManager;
19ab9ad195d1e873f7569dec45c4e627a4e8ba67e4Amith Yamasaniimport android.os.BatteryStats;
20ab9ad195d1e873f7569dec45c4e627a4e8ba67e4Amith Yamasaniimport android.support.test.filters.SmallTest;
21c2f518a9dd4b625e52e2c424f288fb5d4d430b45Mike Maimport android.view.Display;
22ab9ad195d1e873f7569dec45c4e627a4e8ba67e4Amith Yamasani
23ab9ad195d1e873f7569dec45c4e627a4e8ba67e4Amith Yamasaniimport junit.framework.TestCase;
24ab9ad195d1e873f7569dec45c4e627a4e8ba67e4Amith Yamasani
25ab9ad195d1e873f7569dec45c4e627a4e8ba67e4Amith Yamasani/**
26ab9ad195d1e873f7569dec45c4e627a4e8ba67e4Amith Yamasani * Test BatteryStatsImpl Sensor Timers.
27ab9ad195d1e873f7569dec45c4e627a4e8ba67e4Amith Yamasani */
28ab9ad195d1e873f7569dec45c4e627a4e8ba67e4Amith Yamasanipublic class BatteryStatsSensorTest extends TestCase {
29ab9ad195d1e873f7569dec45c4e627a4e8ba67e4Amith Yamasani
30ab9ad195d1e873f7569dec45c4e627a4e8ba67e4Amith Yamasani    private static final int UID = 10500;
31ab9ad195d1e873f7569dec45c4e627a4e8ba67e4Amith Yamasani    private static final int SENSOR_ID = -10000;
32ab9ad195d1e873f7569dec45c4e627a4e8ba67e4Amith Yamasani
33ab9ad195d1e873f7569dec45c4e627a4e8ba67e4Amith Yamasani    @SmallTest
34ab9ad195d1e873f7569dec45c4e627a4e8ba67e4Amith Yamasani    public void testSensorStartStop() throws Exception {
35ab9ad195d1e873f7569dec45c4e627a4e8ba67e4Amith Yamasani        final MockClocks clocks = new MockClocks();
36ab9ad195d1e873f7569dec45c4e627a4e8ba67e4Amith Yamasani        MockBatteryStatsImpl bi = new MockBatteryStatsImpl(clocks);
37ab9ad195d1e873f7569dec45c4e627a4e8ba67e4Amith Yamasani        bi.mForceOnBattery = true;
38ab9ad195d1e873f7569dec45c4e627a4e8ba67e4Amith Yamasani        clocks.realtime = 100;
39ab9ad195d1e873f7569dec45c4e627a4e8ba67e4Amith Yamasani        clocks.uptime = 100;
40867c0d72af63b67cd0abce8a0f40e94e04193aa6Bookatz        bi.getOnBatteryTimeBase().setRunning(true, 100_000, 100_000);
41ab9ad195d1e873f7569dec45c4e627a4e8ba67e4Amith Yamasani        bi.noteUidProcessStateLocked(UID, ActivityManager.PROCESS_STATE_CACHED_EMPTY);
42ab9ad195d1e873f7569dec45c4e627a4e8ba67e4Amith Yamasani        bi.noteUidProcessStateLocked(UID, ActivityManager.PROCESS_STATE_IMPORTANT_FOREGROUND);
43ab9ad195d1e873f7569dec45c4e627a4e8ba67e4Amith Yamasani        bi.noteStartSensorLocked(UID, SENSOR_ID);
44ab9ad195d1e873f7569dec45c4e627a4e8ba67e4Amith Yamasani        clocks.realtime = 200;
45ab9ad195d1e873f7569dec45c4e627a4e8ba67e4Amith Yamasani        clocks.uptime = 200;
46ab9ad195d1e873f7569dec45c4e627a4e8ba67e4Amith Yamasani        bi.noteStopSensorLocked(UID, SENSOR_ID);
47ab9ad195d1e873f7569dec45c4e627a4e8ba67e4Amith Yamasani
48ab9ad195d1e873f7569dec45c4e627a4e8ba67e4Amith Yamasani        bi.noteUidProcessStateLocked(UID, ActivityManager.PROCESS_STATE_RECEIVER);
49ab9ad195d1e873f7569dec45c4e627a4e8ba67e4Amith Yamasani        bi.noteStartSensorLocked(UID, SENSOR_ID);
50154d124ace83350da51e2d6f795f88f7bda6b041Amith Yamasani        bi.noteStartSensorLocked(UID, SENSOR_ID);
51ab9ad195d1e873f7569dec45c4e627a4e8ba67e4Amith Yamasani        clocks.realtime = 400;
52ab9ad195d1e873f7569dec45c4e627a4e8ba67e4Amith Yamasani        clocks.uptime = 400;
53ab9ad195d1e873f7569dec45c4e627a4e8ba67e4Amith Yamasani        bi.noteStopSensorLocked(UID, SENSOR_ID);
54154d124ace83350da51e2d6f795f88f7bda6b041Amith Yamasani        bi.noteStopSensorLocked(UID, SENSOR_ID);
55ab9ad195d1e873f7569dec45c4e627a4e8ba67e4Amith Yamasani
56ab9ad195d1e873f7569dec45c4e627a4e8ba67e4Amith Yamasani        BatteryStats.Timer sensorTimer = bi.getUidStats().get(UID).getSensorStats()
57ab9ad195d1e873f7569dec45c4e627a4e8ba67e4Amith Yamasani                .get(SENSOR_ID).getSensorTime();
58867c0d72af63b67cd0abce8a0f40e94e04193aa6Bookatz        BatteryStats.Timer sensorBgTimer = bi.getUidStats().get(UID).getSensorStats()
59867c0d72af63b67cd0abce8a0f40e94e04193aa6Bookatz                .get(SENSOR_ID).getSensorBackgroundTime();
60ab9ad195d1e873f7569dec45c4e627a4e8ba67e4Amith Yamasani
61ab9ad195d1e873f7569dec45c4e627a4e8ba67e4Amith Yamasani        assertEquals(2, sensorTimer.getCountLocked(BatteryStats.STATS_SINCE_CHARGED));
62867c0d72af63b67cd0abce8a0f40e94e04193aa6Bookatz        assertEquals(300_000, sensorTimer.getTotalTimeLocked(
63867c0d72af63b67cd0abce8a0f40e94e04193aa6Bookatz                clocks.realtime * 1000, BatteryStats.STATS_SINCE_CHARGED));
64867c0d72af63b67cd0abce8a0f40e94e04193aa6Bookatz
65867c0d72af63b67cd0abce8a0f40e94e04193aa6Bookatz        assertEquals(1, sensorBgTimer.getCountLocked(BatteryStats.STATS_SINCE_CHARGED));
66867c0d72af63b67cd0abce8a0f40e94e04193aa6Bookatz        assertEquals(200_000, sensorBgTimer.getTotalTimeLocked(
67867c0d72af63b67cd0abce8a0f40e94e04193aa6Bookatz                clocks.realtime * 1000, BatteryStats.STATS_SINCE_CHARGED));
68867c0d72af63b67cd0abce8a0f40e94e04193aa6Bookatz    }
69867c0d72af63b67cd0abce8a0f40e94e04193aa6Bookatz
70867c0d72af63b67cd0abce8a0f40e94e04193aa6Bookatz    @SmallTest
71867c0d72af63b67cd0abce8a0f40e94e04193aa6Bookatz    public void testCountingWhileOffBattery() throws Exception {
72867c0d72af63b67cd0abce8a0f40e94e04193aa6Bookatz        final MockClocks clocks = new MockClocks();
73867c0d72af63b67cd0abce8a0f40e94e04193aa6Bookatz        MockBatteryStatsImpl bi = new MockBatteryStatsImpl(clocks);
74867c0d72af63b67cd0abce8a0f40e94e04193aa6Bookatz        long curr = 0; // realtime in us
75867c0d72af63b67cd0abce8a0f40e94e04193aa6Bookatz
76867c0d72af63b67cd0abce8a0f40e94e04193aa6Bookatz        // Plugged-in (battery=off, sensor=off)
77867c0d72af63b67cd0abce8a0f40e94e04193aa6Bookatz        curr = 1000 * (clocks.realtime = clocks.uptime = 100);
78c2f518a9dd4b625e52e2c424f288fb5d4d430b45Mike Ma        bi.updateTimeBasesLocked(false, Display.STATE_ON, curr, curr);
79867c0d72af63b67cd0abce8a0f40e94e04193aa6Bookatz
80867c0d72af63b67cd0abce8a0f40e94e04193aa6Bookatz
81867c0d72af63b67cd0abce8a0f40e94e04193aa6Bookatz        // Start sensor (battery=off, sensor=on)
82867c0d72af63b67cd0abce8a0f40e94e04193aa6Bookatz        curr = 1000 * (clocks.realtime = clocks.uptime = 200);
83867c0d72af63b67cd0abce8a0f40e94e04193aa6Bookatz        bi.noteStartSensorLocked(UID, SENSOR_ID);
84867c0d72af63b67cd0abce8a0f40e94e04193aa6Bookatz
85867c0d72af63b67cd0abce8a0f40e94e04193aa6Bookatz        // Test situation
86867c0d72af63b67cd0abce8a0f40e94e04193aa6Bookatz        curr = 1000 * (clocks.realtime = clocks.uptime = 215);
87867c0d72af63b67cd0abce8a0f40e94e04193aa6Bookatz        BatteryStats.Timer sensorTimer = bi.getUidStats().get(UID).getSensorStats()
88867c0d72af63b67cd0abce8a0f40e94e04193aa6Bookatz                .get(SENSOR_ID).getSensorTime();
89867c0d72af63b67cd0abce8a0f40e94e04193aa6Bookatz        assertEquals(0,
90867c0d72af63b67cd0abce8a0f40e94e04193aa6Bookatz                sensorTimer.getTotalTimeLocked(curr, BatteryStats.STATS_SINCE_CHARGED));
91ceebafe41a127c18213ca39ddf692ae1cbfb100eBookatz        assertEquals(0, sensorTimer.getCountLocked(BatteryStats.STATS_SINCE_CHARGED));
92867c0d72af63b67cd0abce8a0f40e94e04193aa6Bookatz
93867c0d72af63b67cd0abce8a0f40e94e04193aa6Bookatz        // Stop sensor (battery=off, sensor=off)
94867c0d72af63b67cd0abce8a0f40e94e04193aa6Bookatz        curr = 1000 * (clocks.realtime = clocks.uptime = 550);
95867c0d72af63b67cd0abce8a0f40e94e04193aa6Bookatz        bi.noteStopSensorLocked(UID, SENSOR_ID);
96867c0d72af63b67cd0abce8a0f40e94e04193aa6Bookatz
97867c0d72af63b67cd0abce8a0f40e94e04193aa6Bookatz        // Test situation
98867c0d72af63b67cd0abce8a0f40e94e04193aa6Bookatz        curr = 1000 * (clocks.realtime = clocks.uptime = 678);
99867c0d72af63b67cd0abce8a0f40e94e04193aa6Bookatz        sensorTimer = bi.getUidStats().get(UID).getSensorStats()
100867c0d72af63b67cd0abce8a0f40e94e04193aa6Bookatz                .get(SENSOR_ID).getSensorTime();
101867c0d72af63b67cd0abce8a0f40e94e04193aa6Bookatz        assertEquals(0,
102867c0d72af63b67cd0abce8a0f40e94e04193aa6Bookatz                sensorTimer.getTotalTimeLocked(curr, BatteryStats.STATS_SINCE_CHARGED));
103867c0d72af63b67cd0abce8a0f40e94e04193aa6Bookatz        assertEquals(0, sensorTimer.getCountLocked(BatteryStats.STATS_SINCE_CHARGED));
104867c0d72af63b67cd0abce8a0f40e94e04193aa6Bookatz    }
105867c0d72af63b67cd0abce8a0f40e94e04193aa6Bookatz
106867c0d72af63b67cd0abce8a0f40e94e04193aa6Bookatz    @SmallTest
107867c0d72af63b67cd0abce8a0f40e94e04193aa6Bookatz    public void testCountingWhileOnBattery() throws Exception {
108867c0d72af63b67cd0abce8a0f40e94e04193aa6Bookatz        final MockClocks clocks = new MockClocks();
109867c0d72af63b67cd0abce8a0f40e94e04193aa6Bookatz        MockBatteryStatsImpl bi = new MockBatteryStatsImpl(clocks);
110867c0d72af63b67cd0abce8a0f40e94e04193aa6Bookatz        long curr = 0; // realtime in us
111867c0d72af63b67cd0abce8a0f40e94e04193aa6Bookatz
112867c0d72af63b67cd0abce8a0f40e94e04193aa6Bookatz        // Unplugged (battery=on, sensor=off)
113867c0d72af63b67cd0abce8a0f40e94e04193aa6Bookatz        curr = 1000 * (clocks.realtime = clocks.uptime = 100);
114c2f518a9dd4b625e52e2c424f288fb5d4d430b45Mike Ma        bi.updateTimeBasesLocked(true, Display.STATE_ON, curr, curr);
115867c0d72af63b67cd0abce8a0f40e94e04193aa6Bookatz
116867c0d72af63b67cd0abce8a0f40e94e04193aa6Bookatz        // Start sensor (battery=on, sensor=on)
117867c0d72af63b67cd0abce8a0f40e94e04193aa6Bookatz        curr = 1000 * (clocks.realtime = clocks.uptime = 200);
118867c0d72af63b67cd0abce8a0f40e94e04193aa6Bookatz        bi.noteStartSensorLocked(UID, SENSOR_ID);
119867c0d72af63b67cd0abce8a0f40e94e04193aa6Bookatz
120867c0d72af63b67cd0abce8a0f40e94e04193aa6Bookatz        // Test situation
121867c0d72af63b67cd0abce8a0f40e94e04193aa6Bookatz        curr = 1000 * (clocks.realtime = clocks.uptime = 215);
122867c0d72af63b67cd0abce8a0f40e94e04193aa6Bookatz        BatteryStats.Timer sensorTimer = bi.getUidStats().get(UID).getSensorStats()
123867c0d72af63b67cd0abce8a0f40e94e04193aa6Bookatz                .get(SENSOR_ID).getSensorTime();
124867c0d72af63b67cd0abce8a0f40e94e04193aa6Bookatz        assertEquals((215-200)*1000,
125867c0d72af63b67cd0abce8a0f40e94e04193aa6Bookatz                sensorTimer.getTotalTimeLocked(curr, BatteryStats.STATS_SINCE_CHARGED));
126867c0d72af63b67cd0abce8a0f40e94e04193aa6Bookatz        assertEquals(1, sensorTimer.getCountLocked(BatteryStats.STATS_SINCE_CHARGED));
127867c0d72af63b67cd0abce8a0f40e94e04193aa6Bookatz
128867c0d72af63b67cd0abce8a0f40e94e04193aa6Bookatz        // Stop sensor (battery=on, sensor=off)
129867c0d72af63b67cd0abce8a0f40e94e04193aa6Bookatz        curr = 1000 * (clocks.realtime = clocks.uptime = 550);
130867c0d72af63b67cd0abce8a0f40e94e04193aa6Bookatz        bi.noteStopSensorLocked(UID, SENSOR_ID);
131867c0d72af63b67cd0abce8a0f40e94e04193aa6Bookatz
132867c0d72af63b67cd0abce8a0f40e94e04193aa6Bookatz        // Test situation
133867c0d72af63b67cd0abce8a0f40e94e04193aa6Bookatz        curr = 1000 * (clocks.realtime = clocks.uptime = 678);
134867c0d72af63b67cd0abce8a0f40e94e04193aa6Bookatz        sensorTimer = bi.getUidStats().get(UID).getSensorStats()
135867c0d72af63b67cd0abce8a0f40e94e04193aa6Bookatz                .get(SENSOR_ID).getSensorTime();
136867c0d72af63b67cd0abce8a0f40e94e04193aa6Bookatz        assertEquals((550-200)*1000,
137867c0d72af63b67cd0abce8a0f40e94e04193aa6Bookatz                sensorTimer.getTotalTimeLocked(curr, BatteryStats.STATS_SINCE_CHARGED));
138867c0d72af63b67cd0abce8a0f40e94e04193aa6Bookatz        assertEquals(1, sensorTimer.getCountLocked(BatteryStats.STATS_SINCE_CHARGED));
139867c0d72af63b67cd0abce8a0f40e94e04193aa6Bookatz    }
140867c0d72af63b67cd0abce8a0f40e94e04193aa6Bookatz
141867c0d72af63b67cd0abce8a0f40e94e04193aa6Bookatz    @SmallTest
142867c0d72af63b67cd0abce8a0f40e94e04193aa6Bookatz    public void testBatteryStatusOnToOff() throws Exception {
143867c0d72af63b67cd0abce8a0f40e94e04193aa6Bookatz        final MockClocks clocks = new MockClocks();
144867c0d72af63b67cd0abce8a0f40e94e04193aa6Bookatz        MockBatteryStatsImpl bi = new MockBatteryStatsImpl(clocks);
145867c0d72af63b67cd0abce8a0f40e94e04193aa6Bookatz        long curr = 0; // realtime in us
146867c0d72af63b67cd0abce8a0f40e94e04193aa6Bookatz
147867c0d72af63b67cd0abce8a0f40e94e04193aa6Bookatz        // On battery (battery=on, sensor=off)
148867c0d72af63b67cd0abce8a0f40e94e04193aa6Bookatz        curr = 1000 * (clocks.realtime = clocks.uptime = 100);
149c2f518a9dd4b625e52e2c424f288fb5d4d430b45Mike Ma        bi.updateTimeBasesLocked(true, Display.STATE_ON, curr, curr);
150867c0d72af63b67cd0abce8a0f40e94e04193aa6Bookatz        bi.noteUidProcessStateLocked(UID, ActivityManager.PROCESS_STATE_IMPORTANT_FOREGROUND);
151867c0d72af63b67cd0abce8a0f40e94e04193aa6Bookatz
152867c0d72af63b67cd0abce8a0f40e94e04193aa6Bookatz        // Start sensor (battery=on, sensor=on)
153867c0d72af63b67cd0abce8a0f40e94e04193aa6Bookatz        curr = 1000 * (clocks.realtime = clocks.uptime = 202);
154867c0d72af63b67cd0abce8a0f40e94e04193aa6Bookatz        bi.noteStartSensorLocked(UID, SENSOR_ID);
155867c0d72af63b67cd0abce8a0f40e94e04193aa6Bookatz
156867c0d72af63b67cd0abce8a0f40e94e04193aa6Bookatz        // Off battery (battery=off, sensor=on)
157867c0d72af63b67cd0abce8a0f40e94e04193aa6Bookatz        curr = 1000 * (clocks.realtime = clocks.uptime = 305);
158c2f518a9dd4b625e52e2c424f288fb5d4d430b45Mike Ma        bi.updateTimeBasesLocked(false, Display.STATE_ON, curr, curr);
159867c0d72af63b67cd0abce8a0f40e94e04193aa6Bookatz
160867c0d72af63b67cd0abce8a0f40e94e04193aa6Bookatz        // Stop sensor while off battery (battery=off, sensor=off)
161867c0d72af63b67cd0abce8a0f40e94e04193aa6Bookatz        curr = 1000 * (clocks.realtime = clocks.uptime = 409);
162867c0d72af63b67cd0abce8a0f40e94e04193aa6Bookatz        bi.noteStopSensorLocked(UID, SENSOR_ID);
163867c0d72af63b67cd0abce8a0f40e94e04193aa6Bookatz
164867c0d72af63b67cd0abce8a0f40e94e04193aa6Bookatz        // Start sensor while off battery (battery=off, sensor=on)
165867c0d72af63b67cd0abce8a0f40e94e04193aa6Bookatz        curr = 1000 * (clocks.realtime = clocks.uptime = 519);
166867c0d72af63b67cd0abce8a0f40e94e04193aa6Bookatz        bi.noteStartSensorLocked(UID, SENSOR_ID);
167867c0d72af63b67cd0abce8a0f40e94e04193aa6Bookatz
168867c0d72af63b67cd0abce8a0f40e94e04193aa6Bookatz        // Test while still running (but off battery)
169867c0d72af63b67cd0abce8a0f40e94e04193aa6Bookatz        curr = 1000 * (clocks.realtime = clocks.uptime = 657);
170867c0d72af63b67cd0abce8a0f40e94e04193aa6Bookatz        BatteryStats.Timer sensorTimer = bi.getUidStats().get(UID).getSensorStats()
171867c0d72af63b67cd0abce8a0f40e94e04193aa6Bookatz                .get(SENSOR_ID).getSensorTime();
172ceebafe41a127c18213ca39ddf692ae1cbfb100eBookatz        assertEquals(1, sensorTimer.getCountLocked(BatteryStats.STATS_SINCE_CHARGED));
173867c0d72af63b67cd0abce8a0f40e94e04193aa6Bookatz        assertEquals((305-202)*1000,
174867c0d72af63b67cd0abce8a0f40e94e04193aa6Bookatz                sensorTimer.getTotalTimeLocked(curr, BatteryStats.STATS_SINCE_CHARGED));
175867c0d72af63b67cd0abce8a0f40e94e04193aa6Bookatz
176867c0d72af63b67cd0abce8a0f40e94e04193aa6Bookatz        // Now stop running (still off battery) (battery=off, sensor=off)
177867c0d72af63b67cd0abce8a0f40e94e04193aa6Bookatz        curr = 1000 * (clocks.realtime = clocks.uptime = 693);
178867c0d72af63b67cd0abce8a0f40e94e04193aa6Bookatz        bi.noteStopSensorLocked(UID, SENSOR_ID);
179867c0d72af63b67cd0abce8a0f40e94e04193aa6Bookatz
180867c0d72af63b67cd0abce8a0f40e94e04193aa6Bookatz        sensorTimer = bi.getUidStats().get(UID).getSensorStats()
181867c0d72af63b67cd0abce8a0f40e94e04193aa6Bookatz                .get(SENSOR_ID).getSensorTime();
182867c0d72af63b67cd0abce8a0f40e94e04193aa6Bookatz        assertEquals(1, sensorTimer.getCountLocked(BatteryStats.STATS_SINCE_CHARGED));
183867c0d72af63b67cd0abce8a0f40e94e04193aa6Bookatz        assertEquals((305-202)*1000,
184867c0d72af63b67cd0abce8a0f40e94e04193aa6Bookatz                sensorTimer.getTotalTimeLocked(curr, BatteryStats.STATS_SINCE_CHARGED));
185867c0d72af63b67cd0abce8a0f40e94e04193aa6Bookatz    }
186867c0d72af63b67cd0abce8a0f40e94e04193aa6Bookatz
187867c0d72af63b67cd0abce8a0f40e94e04193aa6Bookatz    @SmallTest
188867c0d72af63b67cd0abce8a0f40e94e04193aa6Bookatz    public void testBatteryStatusOffToOn() throws Exception {
189867c0d72af63b67cd0abce8a0f40e94e04193aa6Bookatz        final MockClocks clocks = new MockClocks();
190867c0d72af63b67cd0abce8a0f40e94e04193aa6Bookatz        MockBatteryStatsImpl bi = new MockBatteryStatsImpl(clocks);
191867c0d72af63b67cd0abce8a0f40e94e04193aa6Bookatz        long curr = 0; // realtime in us
192867c0d72af63b67cd0abce8a0f40e94e04193aa6Bookatz
193867c0d72af63b67cd0abce8a0f40e94e04193aa6Bookatz        // Plugged-in (battery=off, sensor=off)
194867c0d72af63b67cd0abce8a0f40e94e04193aa6Bookatz        curr = 1000 * (clocks.realtime = clocks.uptime = 100);
195c2f518a9dd4b625e52e2c424f288fb5d4d430b45Mike Ma        bi.updateTimeBasesLocked(false, Display.STATE_ON, curr, curr);
196867c0d72af63b67cd0abce8a0f40e94e04193aa6Bookatz
197867c0d72af63b67cd0abce8a0f40e94e04193aa6Bookatz        // Start sensor (battery=off, sensor=on)
198867c0d72af63b67cd0abce8a0f40e94e04193aa6Bookatz        curr = 1000 * (clocks.realtime = clocks.uptime = 200);
199867c0d72af63b67cd0abce8a0f40e94e04193aa6Bookatz        bi.noteStartSensorLocked(UID, SENSOR_ID);
200867c0d72af63b67cd0abce8a0f40e94e04193aa6Bookatz
201867c0d72af63b67cd0abce8a0f40e94e04193aa6Bookatz        // Test situation
202867c0d72af63b67cd0abce8a0f40e94e04193aa6Bookatz        curr = 1000 * (clocks.realtime = clocks.uptime = 215);
203867c0d72af63b67cd0abce8a0f40e94e04193aa6Bookatz        BatteryStats.Timer sensorTimer = bi.getUidStats().get(UID).getSensorStats()
204867c0d72af63b67cd0abce8a0f40e94e04193aa6Bookatz                .get(SENSOR_ID).getSensorTime();
205867c0d72af63b67cd0abce8a0f40e94e04193aa6Bookatz        // Time was entirely off battery, so time=0.
206867c0d72af63b67cd0abce8a0f40e94e04193aa6Bookatz        assertEquals(0,
207867c0d72af63b67cd0abce8a0f40e94e04193aa6Bookatz                sensorTimer.getTotalTimeLocked(curr, BatteryStats.STATS_SINCE_CHARGED));
208867c0d72af63b67cd0abce8a0f40e94e04193aa6Bookatz        // Acquired off battery, so count=0.
209ceebafe41a127c18213ca39ddf692ae1cbfb100eBookatz        assertEquals(0, sensorTimer.getCountLocked(BatteryStats.STATS_SINCE_CHARGED));
210867c0d72af63b67cd0abce8a0f40e94e04193aa6Bookatz
211867c0d72af63b67cd0abce8a0f40e94e04193aa6Bookatz        // Unplug (battery=on, sensor=on)
212867c0d72af63b67cd0abce8a0f40e94e04193aa6Bookatz        curr = 1000 * (clocks.realtime = clocks.uptime = 305);
213c2f518a9dd4b625e52e2c424f288fb5d4d430b45Mike Ma        bi.updateTimeBasesLocked(true, Display.STATE_ON, curr, curr);
214867c0d72af63b67cd0abce8a0f40e94e04193aa6Bookatz
215867c0d72af63b67cd0abce8a0f40e94e04193aa6Bookatz        //Test situation
216867c0d72af63b67cd0abce8a0f40e94e04193aa6Bookatz        curr = 1000 * (clocks.realtime = clocks.uptime = 410);
217867c0d72af63b67cd0abce8a0f40e94e04193aa6Bookatz        sensorTimer = bi.getUidStats().get(UID).getSensorStats().get(SENSOR_ID).getSensorTime();
218867c0d72af63b67cd0abce8a0f40e94e04193aa6Bookatz        // Part of the time it was on battery.
219867c0d72af63b67cd0abce8a0f40e94e04193aa6Bookatz        assertEquals((410-305)*1000,
220867c0d72af63b67cd0abce8a0f40e94e04193aa6Bookatz                sensorTimer.getTotalTimeLocked(curr, BatteryStats.STATS_SINCE_CHARGED));
221867c0d72af63b67cd0abce8a0f40e94e04193aa6Bookatz        // Only ever acquired off battery, so count=0.
222ceebafe41a127c18213ca39ddf692ae1cbfb100eBookatz        assertEquals(0, sensorTimer.getCountLocked(BatteryStats.STATS_SINCE_CHARGED));
223867c0d72af63b67cd0abce8a0f40e94e04193aa6Bookatz
224867c0d72af63b67cd0abce8a0f40e94e04193aa6Bookatz        // Stop sensor (battery=on, sensor=off)
225867c0d72af63b67cd0abce8a0f40e94e04193aa6Bookatz        curr = 1000 * (clocks.realtime = clocks.uptime = 550);
226867c0d72af63b67cd0abce8a0f40e94e04193aa6Bookatz        bi.noteStopSensorLocked(UID, SENSOR_ID);
227ab9ad195d1e873f7569dec45c4e627a4e8ba67e4Amith Yamasani
228867c0d72af63b67cd0abce8a0f40e94e04193aa6Bookatz        // Test situation
229867c0d72af63b67cd0abce8a0f40e94e04193aa6Bookatz        curr = 1000 * (clocks.realtime = clocks.uptime = 678);
230867c0d72af63b67cd0abce8a0f40e94e04193aa6Bookatz        sensorTimer = bi.getUidStats().get(UID).getSensorStats().get(SENSOR_ID).getSensorTime();
231867c0d72af63b67cd0abce8a0f40e94e04193aa6Bookatz        // Part of the time it was on battery.
232867c0d72af63b67cd0abce8a0f40e94e04193aa6Bookatz        assertEquals((550-305)*1000,
233867c0d72af63b67cd0abce8a0f40e94e04193aa6Bookatz                sensorTimer.getTotalTimeLocked(curr, BatteryStats.STATS_SINCE_CHARGED));
234867c0d72af63b67cd0abce8a0f40e94e04193aa6Bookatz        // Only ever acquired off battery, so count=0.
235ceebafe41a127c18213ca39ddf692ae1cbfb100eBookatz        assertEquals(0, sensorTimer.getCountLocked(BatteryStats.STATS_SINCE_CHARGED));
236ab9ad195d1e873f7569dec45c4e627a4e8ba67e4Amith Yamasani    }
2375f212c86a4fce26e5f87413df3dbfee181fa1ff8Adam Lesinski
2385f212c86a4fce26e5f87413df3dbfee181fa1ff8Adam Lesinski    @SmallTest
239867c0d72af63b67cd0abce8a0f40e94e04193aa6Bookatz    public void testPooledBackgroundUsage() throws Exception {
240867c0d72af63b67cd0abce8a0f40e94e04193aa6Bookatz        final int UID_2 = 20000; // second uid for testing pool usage
2415f212c86a4fce26e5f87413df3dbfee181fa1ff8Adam Lesinski        final MockClocks clocks = new MockClocks();
2425f212c86a4fce26e5f87413df3dbfee181fa1ff8Adam Lesinski        MockBatteryStatsImpl bi = new MockBatteryStatsImpl(clocks);
2435f212c86a4fce26e5f87413df3dbfee181fa1ff8Adam Lesinski        bi.mForceOnBattery = true;
244867c0d72af63b67cd0abce8a0f40e94e04193aa6Bookatz        long curr = 0; // realtime in us
245867c0d72af63b67cd0abce8a0f40e94e04193aa6Bookatz        // Entire test is on-battery
246867c0d72af63b67cd0abce8a0f40e94e04193aa6Bookatz        curr = 1000 * (clocks.realtime = clocks.uptime = 1000);
247c2f518a9dd4b625e52e2c424f288fb5d4d430b45Mike Ma        bi.updateTimeBasesLocked(true, Display.STATE_ON, curr, curr);
2485f212c86a4fce26e5f87413df3dbfee181fa1ff8Adam Lesinski
249867c0d72af63b67cd0abce8a0f40e94e04193aa6Bookatz        // See below for a diagram of events.
2505f212c86a4fce26e5f87413df3dbfee181fa1ff8Adam Lesinski
251867c0d72af63b67cd0abce8a0f40e94e04193aa6Bookatz        // UID in foreground
252867c0d72af63b67cd0abce8a0f40e94e04193aa6Bookatz        curr = 1000 * (clocks.realtime = clocks.uptime = 2002);
253867c0d72af63b67cd0abce8a0f40e94e04193aa6Bookatz        bi.noteUidProcessStateLocked(UID, ActivityManager.PROCESS_STATE_IMPORTANT_FOREGROUND);
254867c0d72af63b67cd0abce8a0f40e94e04193aa6Bookatz
255867c0d72af63b67cd0abce8a0f40e94e04193aa6Bookatz        // UID starts the sensor (foreground)
256867c0d72af63b67cd0abce8a0f40e94e04193aa6Bookatz        curr = 1000 * (clocks.realtime = clocks.uptime = 3004);
2575f212c86a4fce26e5f87413df3dbfee181fa1ff8Adam Lesinski        bi.noteStartSensorLocked(UID, SENSOR_ID);
2585f212c86a4fce26e5f87413df3dbfee181fa1ff8Adam Lesinski
259867c0d72af63b67cd0abce8a0f40e94e04193aa6Bookatz        // UID_2 in background
260867c0d72af63b67cd0abce8a0f40e94e04193aa6Bookatz        curr = 1000 * (clocks.realtime = clocks.uptime = 4008);
261867c0d72af63b67cd0abce8a0f40e94e04193aa6Bookatz        bi.noteUidProcessStateLocked(UID_2, ActivityManager.PROCESS_STATE_RECEIVER); // background
262867c0d72af63b67cd0abce8a0f40e94e04193aa6Bookatz
263867c0d72af63b67cd0abce8a0f40e94e04193aa6Bookatz        // UID_2 starts the sensor (background)
264867c0d72af63b67cd0abce8a0f40e94e04193aa6Bookatz        curr = 1000 * (clocks.realtime = clocks.uptime = 5016);
265867c0d72af63b67cd0abce8a0f40e94e04193aa6Bookatz        bi.noteStartSensorLocked(UID_2, SENSOR_ID);
2665f212c86a4fce26e5f87413df3dbfee181fa1ff8Adam Lesinski
267867c0d72af63b67cd0abce8a0f40e94e04193aa6Bookatz        // UID enters background
268867c0d72af63b67cd0abce8a0f40e94e04193aa6Bookatz        curr = 1000 * (clocks.realtime = clocks.uptime = 6032);
269867c0d72af63b67cd0abce8a0f40e94e04193aa6Bookatz        bi.noteUidProcessStateLocked(UID, ActivityManager.PROCESS_STATE_IMPORTANT_BACKGROUND);
2705f212c86a4fce26e5f87413df3dbfee181fa1ff8Adam Lesinski
271867c0d72af63b67cd0abce8a0f40e94e04193aa6Bookatz        // UID enters background again (from a different background state)
272867c0d72af63b67cd0abce8a0f40e94e04193aa6Bookatz        curr = 1000 * (clocks.realtime = clocks.uptime = 7004);
273867c0d72af63b67cd0abce8a0f40e94e04193aa6Bookatz        bi.noteUidProcessStateLocked(UID, ActivityManager.PROCESS_STATE_LAST_ACTIVITY);
2745f212c86a4fce26e5f87413df3dbfee181fa1ff8Adam Lesinski
275867c0d72af63b67cd0abce8a0f40e94e04193aa6Bookatz        // UID_2 stops the sensor (background), then starts it again, then stops again
276867c0d72af63b67cd0abce8a0f40e94e04193aa6Bookatz        curr = 1000 * (clocks.realtime = clocks.uptime = 8064);
277867c0d72af63b67cd0abce8a0f40e94e04193aa6Bookatz        bi.noteStopSensorLocked(UID_2, SENSOR_ID);
278867c0d72af63b67cd0abce8a0f40e94e04193aa6Bookatz        curr = 1000 * (clocks.realtime = clocks.uptime = 9128);
279867c0d72af63b67cd0abce8a0f40e94e04193aa6Bookatz        bi.noteStartSensorLocked(UID_2, SENSOR_ID);
280867c0d72af63b67cd0abce8a0f40e94e04193aa6Bookatz        curr = 1000 * (clocks.realtime = clocks.uptime = 10256);
281867c0d72af63b67cd0abce8a0f40e94e04193aa6Bookatz        bi.noteStopSensorLocked(UID_2, SENSOR_ID);
2825f212c86a4fce26e5f87413df3dbfee181fa1ff8Adam Lesinski
283867c0d72af63b67cd0abce8a0f40e94e04193aa6Bookatz        // UID re-enters foreground
284867c0d72af63b67cd0abce8a0f40e94e04193aa6Bookatz        curr = 1000 * (clocks.realtime = clocks.uptime = 11512);
285867c0d72af63b67cd0abce8a0f40e94e04193aa6Bookatz        bi.noteUidProcessStateLocked(UID, ActivityManager.PROCESS_STATE_IMPORTANT_FOREGROUND);
286867c0d72af63b67cd0abce8a0f40e94e04193aa6Bookatz
287867c0d72af63b67cd0abce8a0f40e94e04193aa6Bookatz        // UID starts the sensor a second time (foreground)
288867c0d72af63b67cd0abce8a0f40e94e04193aa6Bookatz        curr = 1000 * (clocks.realtime = clocks.uptime = 12000);
289867c0d72af63b67cd0abce8a0f40e94e04193aa6Bookatz        bi.noteStartSensorLocked(UID, SENSOR_ID);
2905f212c86a4fce26e5f87413df3dbfee181fa1ff8Adam Lesinski
291867c0d72af63b67cd0abce8a0f40e94e04193aa6Bookatz        // UID re-enters background
292867c0d72af63b67cd0abce8a0f40e94e04193aa6Bookatz        curr = 1000 * (clocks.realtime = clocks.uptime = 13002);
293867c0d72af63b67cd0abce8a0f40e94e04193aa6Bookatz        bi.noteUidProcessStateLocked(UID, ActivityManager.PROCESS_STATE_IMPORTANT_BACKGROUND);
294867c0d72af63b67cd0abce8a0f40e94e04193aa6Bookatz
295867c0d72af63b67cd0abce8a0f40e94e04193aa6Bookatz        // UID stops the sensor completely (background)
296867c0d72af63b67cd0abce8a0f40e94e04193aa6Bookatz        curr = 1000 * (clocks.realtime = clocks.uptime = 14004);
297867c0d72af63b67cd0abce8a0f40e94e04193aa6Bookatz        bi.noteStopSensorLocked(UID, SENSOR_ID);
298867c0d72af63b67cd0abce8a0f40e94e04193aa6Bookatz        curr = 1000 * (clocks.realtime = clocks.uptime = 14024);
2995f212c86a4fce26e5f87413df3dbfee181fa1ff8Adam Lesinski        bi.noteStopSensorLocked(UID, SENSOR_ID);
3005f212c86a4fce26e5f87413df3dbfee181fa1ff8Adam Lesinski
301867c0d72af63b67cd0abce8a0f40e94e04193aa6Bookatz        // UID starts the sensor anew (background)
302867c0d72af63b67cd0abce8a0f40e94e04193aa6Bookatz        curr = 1000 * (clocks.realtime = clocks.uptime = 15010);
303867c0d72af63b67cd0abce8a0f40e94e04193aa6Bookatz        bi.noteStartSensorLocked(UID, SENSOR_ID);
304867c0d72af63b67cd0abce8a0f40e94e04193aa6Bookatz
305867c0d72af63b67cd0abce8a0f40e94e04193aa6Bookatz        // UID stops the sensor (background)
306867c0d72af63b67cd0abce8a0f40e94e04193aa6Bookatz        curr = 1000 * (clocks.realtime = clocks.uptime = 16020);
307867c0d72af63b67cd0abce8a0f40e94e04193aa6Bookatz        bi.noteStopSensorLocked(UID, SENSOR_ID);
308867c0d72af63b67cd0abce8a0f40e94e04193aa6Bookatz
309867c0d72af63b67cd0abce8a0f40e94e04193aa6Bookatz//      Summary
310867c0d72af63b67cd0abce8a0f40e94e04193aa6Bookatz//        UID
311867c0d72af63b67cd0abce8a0f40e94e04193aa6Bookatz//        foreground: 2002---6032,              11512---13002
312867c0d72af63b67cd0abce8a0f40e94e04193aa6Bookatz//        background:        6032---------------11512,  13002--------------------------
313867c0d72af63b67cd0abce8a0f40e94e04193aa6Bookatz//        sensor running: 3004-----------------------------14024, 15010-16020
314867c0d72af63b67cd0abce8a0f40e94e04193aa6Bookatz//
315867c0d72af63b67cd0abce8a0f40e94e04193aa6Bookatz//        UID2
316867c0d72af63b67cd0abce8a0f40e94e04193aa6Bookatz//        foreground:
317867c0d72af63b67cd0abce8a0f40e94e04193aa6Bookatz//        background:       4008-------------------------------------------------------
318867c0d72af63b67cd0abce8a0f40e94e04193aa6Bookatz//        sensor running:    5016--8064, 9128-10256
319867c0d72af63b67cd0abce8a0f40e94e04193aa6Bookatz
320867c0d72af63b67cd0abce8a0f40e94e04193aa6Bookatz        BatteryStats.Timer timer1 = bi.getUidStats().get(UID).getSensorStats()
321867c0d72af63b67cd0abce8a0f40e94e04193aa6Bookatz                .get(SENSOR_ID).getSensorTime();
322867c0d72af63b67cd0abce8a0f40e94e04193aa6Bookatz        BatteryStats.Timer bgTimer1 = bi.getUidStats().get(UID).getSensorStats()
323867c0d72af63b67cd0abce8a0f40e94e04193aa6Bookatz                .get(SENSOR_ID).getSensorBackgroundTime();
324867c0d72af63b67cd0abce8a0f40e94e04193aa6Bookatz
325867c0d72af63b67cd0abce8a0f40e94e04193aa6Bookatz        BatteryStats.Timer timer2 = bi.getUidStats().get(UID_2).getSensorStats()
326867c0d72af63b67cd0abce8a0f40e94e04193aa6Bookatz                .get(SENSOR_ID).getSensorTime();
327867c0d72af63b67cd0abce8a0f40e94e04193aa6Bookatz        BatteryStats.Timer bgTimer2 = bi.getUidStats().get(UID_2).getSensorStats()
328867c0d72af63b67cd0abce8a0f40e94e04193aa6Bookatz                .get(SENSOR_ID).getSensorBackgroundTime();
329867c0d72af63b67cd0abce8a0f40e94e04193aa6Bookatz
330867c0d72af63b67cd0abce8a0f40e94e04193aa6Bookatz        // Expected values
331867c0d72af63b67cd0abce8a0f40e94e04193aa6Bookatz        long expActualTime1 = (14024 - 3004) + (16020 - 15010);
332867c0d72af63b67cd0abce8a0f40e94e04193aa6Bookatz        long expBgTime1 = (11512 - 6032) + (14024 - 13002) + (16020 - 15010);
333867c0d72af63b67cd0abce8a0f40e94e04193aa6Bookatz
334867c0d72af63b67cd0abce8a0f40e94e04193aa6Bookatz        long expActualTime2 = (8064 - 5016) + (10256 - 9128);
335867c0d72af63b67cd0abce8a0f40e94e04193aa6Bookatz        long expBgTime2 = (8064 - 5016) + (10256 - 9128);
336867c0d72af63b67cd0abce8a0f40e94e04193aa6Bookatz
337867c0d72af63b67cd0abce8a0f40e94e04193aa6Bookatz        long expBlamedTime1 = (5016 - 3004) + (8064 - 5016)/2 + (9128 - 8064) + (10256 - 9128)/2
338867c0d72af63b67cd0abce8a0f40e94e04193aa6Bookatz                + (14024 - 10256) + (16020 - 15010);
339867c0d72af63b67cd0abce8a0f40e94e04193aa6Bookatz        long expBlamedTime2 = (8064 - 5016)/2 + (10256 - 9128)/2;
340867c0d72af63b67cd0abce8a0f40e94e04193aa6Bookatz
341867c0d72af63b67cd0abce8a0f40e94e04193aa6Bookatz        // Test: UID - blamed time
342867c0d72af63b67cd0abce8a0f40e94e04193aa6Bookatz        assertEquals(expBlamedTime1 * 1000,
343867c0d72af63b67cd0abce8a0f40e94e04193aa6Bookatz                timer1.getTotalTimeLocked(curr, BatteryStats.STATS_SINCE_CHARGED));
344867c0d72af63b67cd0abce8a0f40e94e04193aa6Bookatz        // Test: UID - actual time
345867c0d72af63b67cd0abce8a0f40e94e04193aa6Bookatz        assertEquals(expActualTime1 * 1000,
346867c0d72af63b67cd0abce8a0f40e94e04193aa6Bookatz                timer1.getTotalDurationMsLocked(clocks.realtime) * 1000 );
347867c0d72af63b67cd0abce8a0f40e94e04193aa6Bookatz        // Test: UID - background time
348867c0d72af63b67cd0abce8a0f40e94e04193aa6Bookatz        // bg timer ignores pools, so both totalTime and totalDuration should give the same result
349867c0d72af63b67cd0abce8a0f40e94e04193aa6Bookatz        assertEquals(expBgTime1 * 1000,
350867c0d72af63b67cd0abce8a0f40e94e04193aa6Bookatz                bgTimer1.getTotalTimeLocked(curr, BatteryStats.STATS_SINCE_CHARGED));
351867c0d72af63b67cd0abce8a0f40e94e04193aa6Bookatz        assertEquals(expBgTime1 * 1000,
352867c0d72af63b67cd0abce8a0f40e94e04193aa6Bookatz                bgTimer1.getTotalDurationMsLocked(clocks.realtime) * 1000 );
353867c0d72af63b67cd0abce8a0f40e94e04193aa6Bookatz        // Test: UID - count
354867c0d72af63b67cd0abce8a0f40e94e04193aa6Bookatz        assertEquals(2, timer1.getCountLocked(BatteryStats.STATS_SINCE_CHARGED));
355867c0d72af63b67cd0abce8a0f40e94e04193aa6Bookatz        // Test: UID - background count
356ceebafe41a127c18213ca39ddf692ae1cbfb100eBookatz        assertEquals(1, bgTimer1.getCountLocked(BatteryStats.STATS_SINCE_CHARGED));
3575f212c86a4fce26e5f87413df3dbfee181fa1ff8Adam Lesinski
358867c0d72af63b67cd0abce8a0f40e94e04193aa6Bookatz        // Test: UID_2 - blamed time
359867c0d72af63b67cd0abce8a0f40e94e04193aa6Bookatz        assertEquals(expBlamedTime2 * 1000,
360867c0d72af63b67cd0abce8a0f40e94e04193aa6Bookatz                timer2.getTotalTimeLocked(curr, BatteryStats.STATS_SINCE_CHARGED));
361867c0d72af63b67cd0abce8a0f40e94e04193aa6Bookatz        // Test: UID_2 - actual time
362867c0d72af63b67cd0abce8a0f40e94e04193aa6Bookatz        assertEquals(expActualTime2 * 1000,
363867c0d72af63b67cd0abce8a0f40e94e04193aa6Bookatz                timer2.getTotalDurationMsLocked(clocks.realtime) * 1000);
364867c0d72af63b67cd0abce8a0f40e94e04193aa6Bookatz        // Test: UID_2 - background time
365867c0d72af63b67cd0abce8a0f40e94e04193aa6Bookatz        // bg timer ignores pools, so both totalTime and totalDuration should give the same result
366867c0d72af63b67cd0abce8a0f40e94e04193aa6Bookatz        assertEquals(expBgTime2 * 1000,
367867c0d72af63b67cd0abce8a0f40e94e04193aa6Bookatz                bgTimer2.getTotalTimeLocked(curr, BatteryStats.STATS_SINCE_CHARGED));
368867c0d72af63b67cd0abce8a0f40e94e04193aa6Bookatz        assertEquals(expBgTime2 * 1000,
369867c0d72af63b67cd0abce8a0f40e94e04193aa6Bookatz                bgTimer2.getTotalDurationMsLocked(clocks.realtime) * 1000 );
370867c0d72af63b67cd0abce8a0f40e94e04193aa6Bookatz        // Test: UID_2 - count
371867c0d72af63b67cd0abce8a0f40e94e04193aa6Bookatz        assertEquals(2, timer2.getCountLocked(BatteryStats.STATS_SINCE_CHARGED));
372867c0d72af63b67cd0abce8a0f40e94e04193aa6Bookatz        // Test: UID_2 - background count
373867c0d72af63b67cd0abce8a0f40e94e04193aa6Bookatz        assertEquals(2, bgTimer2.getCountLocked(BatteryStats.STATS_SINCE_CHARGED));
3745f212c86a4fce26e5f87413df3dbfee181fa1ff8Adam Lesinski    }
3754a3eda992b70601e26a76d9492b2f9381cf0fe51Bookatz
3764a3eda992b70601e26a76d9492b2f9381cf0fe51Bookatz    @SmallTest
3774a3eda992b70601e26a76d9492b2f9381cf0fe51Bookatz    public void testSensorReset() throws Exception {
3784a3eda992b70601e26a76d9492b2f9381cf0fe51Bookatz        final MockClocks clocks = new MockClocks();
3794a3eda992b70601e26a76d9492b2f9381cf0fe51Bookatz        MockBatteryStatsImpl bi = new MockBatteryStatsImpl(clocks);
3804a3eda992b70601e26a76d9492b2f9381cf0fe51Bookatz        bi.mForceOnBattery = true;
3814a3eda992b70601e26a76d9492b2f9381cf0fe51Bookatz        clocks.realtime = 100;
3824a3eda992b70601e26a76d9492b2f9381cf0fe51Bookatz        clocks.uptime = 100;
3834a3eda992b70601e26a76d9492b2f9381cf0fe51Bookatz        bi.getOnBatteryTimeBase().setRunning(true, 100_000, 100_000);
3844a3eda992b70601e26a76d9492b2f9381cf0fe51Bookatz        bi.noteUidProcessStateLocked(UID, ActivityManager.PROCESS_STATE_RECEIVER);
3854a3eda992b70601e26a76d9492b2f9381cf0fe51Bookatz
3864a3eda992b70601e26a76d9492b2f9381cf0fe51Bookatz        clocks.realtime += 100;
3874a3eda992b70601e26a76d9492b2f9381cf0fe51Bookatz        clocks.uptime += 100;
3884a3eda992b70601e26a76d9492b2f9381cf0fe51Bookatz
3894a3eda992b70601e26a76d9492b2f9381cf0fe51Bookatz        bi.noteStartSensorLocked(UID, SENSOR_ID);
3904a3eda992b70601e26a76d9492b2f9381cf0fe51Bookatz
3914a3eda992b70601e26a76d9492b2f9381cf0fe51Bookatz        clocks.realtime += 100;
3924a3eda992b70601e26a76d9492b2f9381cf0fe51Bookatz        clocks.uptime += 100;
3934a3eda992b70601e26a76d9492b2f9381cf0fe51Bookatz
3944a3eda992b70601e26a76d9492b2f9381cf0fe51Bookatz        // The sensor is started and the timer has been created.
3954a3eda992b70601e26a76d9492b2f9381cf0fe51Bookatz        final BatteryStats.Uid uid = bi.getUidStats().get(UID);
3964a3eda992b70601e26a76d9492b2f9381cf0fe51Bookatz        assertNotNull(uid);
3974a3eda992b70601e26a76d9492b2f9381cf0fe51Bookatz
3984a3eda992b70601e26a76d9492b2f9381cf0fe51Bookatz        BatteryStats.Uid.Sensor sensor = uid.getSensorStats().get(SENSOR_ID);
3994a3eda992b70601e26a76d9492b2f9381cf0fe51Bookatz        assertNotNull(sensor);
4004a3eda992b70601e26a76d9492b2f9381cf0fe51Bookatz        assertNotNull(sensor.getSensorTime());
4014a3eda992b70601e26a76d9492b2f9381cf0fe51Bookatz        assertNotNull(sensor.getSensorBackgroundTime());
4024a3eda992b70601e26a76d9492b2f9381cf0fe51Bookatz
4034a3eda992b70601e26a76d9492b2f9381cf0fe51Bookatz        // Reset the stats. Since the sensor is still running, we should still see the timer
404993a0be6760e4109b0a89458dd11a729c77f40baBookatz        bi.getUidStatsLocked(UID).reset(clocks.uptime * 1000, clocks.realtime * 1000);
4054a3eda992b70601e26a76d9492b2f9381cf0fe51Bookatz
4064a3eda992b70601e26a76d9492b2f9381cf0fe51Bookatz        sensor = uid.getSensorStats().get(SENSOR_ID);
4074a3eda992b70601e26a76d9492b2f9381cf0fe51Bookatz        assertNotNull(sensor);
4084a3eda992b70601e26a76d9492b2f9381cf0fe51Bookatz        assertNotNull(sensor.getSensorTime());
4094a3eda992b70601e26a76d9492b2f9381cf0fe51Bookatz        assertNotNull(sensor.getSensorBackgroundTime());
4104a3eda992b70601e26a76d9492b2f9381cf0fe51Bookatz
4114a3eda992b70601e26a76d9492b2f9381cf0fe51Bookatz        bi.noteStopSensorLocked(UID, SENSOR_ID);
4124a3eda992b70601e26a76d9492b2f9381cf0fe51Bookatz
4134a3eda992b70601e26a76d9492b2f9381cf0fe51Bookatz        // Now the sensor timer has stopped so this reset should also take out the sensor.
414993a0be6760e4109b0a89458dd11a729c77f40baBookatz        bi.getUidStatsLocked(UID).reset(clocks.uptime * 1000, clocks.realtime * 1000);
4154a3eda992b70601e26a76d9492b2f9381cf0fe51Bookatz
4164a3eda992b70601e26a76d9492b2f9381cf0fe51Bookatz        sensor = uid.getSensorStats().get(SENSOR_ID);
4174a3eda992b70601e26a76d9492b2f9381cf0fe51Bookatz        assertNull(sensor);
4184a3eda992b70601e26a76d9492b2f9381cf0fe51Bookatz    }
419993a0be6760e4109b0a89458dd11a729c77f40baBookatz
420993a0be6760e4109b0a89458dd11a729c77f40baBookatz    @SmallTest
421993a0be6760e4109b0a89458dd11a729c77f40baBookatz    public void testSensorResetTimes() throws Exception {
422993a0be6760e4109b0a89458dd11a729c77f40baBookatz        final MockClocks clocks = new MockClocks();
423993a0be6760e4109b0a89458dd11a729c77f40baBookatz        MockBatteryStatsImpl bi = new MockBatteryStatsImpl(clocks);
424993a0be6760e4109b0a89458dd11a729c77f40baBookatz        final int which = BatteryStats.STATS_SINCE_CHARGED;
425993a0be6760e4109b0a89458dd11a729c77f40baBookatz        bi.mForceOnBattery = true;
426993a0be6760e4109b0a89458dd11a729c77f40baBookatz        clocks.realtime = 100; // in ms
427993a0be6760e4109b0a89458dd11a729c77f40baBookatz        clocks.uptime = 100; // in ms
428993a0be6760e4109b0a89458dd11a729c77f40baBookatz
429993a0be6760e4109b0a89458dd11a729c77f40baBookatz        // TimeBases are on for some time.
430993a0be6760e4109b0a89458dd11a729c77f40baBookatz        BatteryStatsImpl.TimeBase timeBase = bi.getOnBatteryTimeBase();
431993a0be6760e4109b0a89458dd11a729c77f40baBookatz        BatteryStatsImpl.TimeBase bgTimeBase = bi.getOnBatteryBackgroundTimeBase(UID);
432993a0be6760e4109b0a89458dd11a729c77f40baBookatz        timeBase.setRunning(true, clocks.uptime * 1000, clocks.realtime * 1000);
433993a0be6760e4109b0a89458dd11a729c77f40baBookatz        bgTimeBase.setRunning(true, clocks.uptime * 1000, clocks.realtime * 1000);
434993a0be6760e4109b0a89458dd11a729c77f40baBookatz        bi.noteUidProcessStateLocked(UID, ActivityManager.PROCESS_STATE_IMPORTANT_BACKGROUND);
435993a0be6760e4109b0a89458dd11a729c77f40baBookatz
436993a0be6760e4109b0a89458dd11a729c77f40baBookatz        clocks.realtime += 100;
437993a0be6760e4109b0a89458dd11a729c77f40baBookatz        clocks.uptime += 100;
438993a0be6760e4109b0a89458dd11a729c77f40baBookatz
439993a0be6760e4109b0a89458dd11a729c77f40baBookatz        // TimeBases are turned off
440993a0be6760e4109b0a89458dd11a729c77f40baBookatz        timeBase.setRunning(false, clocks.uptime * 1000, clocks.realtime * 1000);
441993a0be6760e4109b0a89458dd11a729c77f40baBookatz        bgTimeBase.setRunning(false, clocks.uptime * 1000, clocks.realtime * 1000);
442993a0be6760e4109b0a89458dd11a729c77f40baBookatz
443993a0be6760e4109b0a89458dd11a729c77f40baBookatz        clocks.realtime += 100;
444993a0be6760e4109b0a89458dd11a729c77f40baBookatz        clocks.uptime += 100;
445993a0be6760e4109b0a89458dd11a729c77f40baBookatz
446993a0be6760e4109b0a89458dd11a729c77f40baBookatz        // Timer is turned on
447993a0be6760e4109b0a89458dd11a729c77f40baBookatz        bi.noteStartSensorLocked(UID, SENSOR_ID);
448993a0be6760e4109b0a89458dd11a729c77f40baBookatz
449993a0be6760e4109b0a89458dd11a729c77f40baBookatz        clocks.realtime += 100;
450993a0be6760e4109b0a89458dd11a729c77f40baBookatz        clocks.uptime += 100;
451993a0be6760e4109b0a89458dd11a729c77f40baBookatz
452993a0be6760e4109b0a89458dd11a729c77f40baBookatz        // Timebase was off so times are all 0.
453993a0be6760e4109b0a89458dd11a729c77f40baBookatz        BatteryStats.Uid.Sensor sensor = bi.getUidStats().get(UID).getSensorStats().get(SENSOR_ID);
454993a0be6760e4109b0a89458dd11a729c77f40baBookatz        BatteryStats.Timer timer = sensor.getSensorTime();
455993a0be6760e4109b0a89458dd11a729c77f40baBookatz        BatteryStats.Timer bgTimer = sensor.getSensorBackgroundTime();
456993a0be6760e4109b0a89458dd11a729c77f40baBookatz        assertEquals(0, timer.getTotalTimeLocked(1000*clocks.realtime, which));
457993a0be6760e4109b0a89458dd11a729c77f40baBookatz        assertEquals(0, timer.getTotalDurationMsLocked(clocks.realtime));
458993a0be6760e4109b0a89458dd11a729c77f40baBookatz        assertEquals(0, bgTimer.getTotalTimeLocked(1000*clocks.realtime, which));
459993a0be6760e4109b0a89458dd11a729c77f40baBookatz        assertEquals(0, bgTimer.getTotalDurationMsLocked(clocks.realtime));
460993a0be6760e4109b0a89458dd11a729c77f40baBookatz
461993a0be6760e4109b0a89458dd11a729c77f40baBookatz        clocks.realtime += 100;
462993a0be6760e4109b0a89458dd11a729c77f40baBookatz        clocks.uptime += 100;
463993a0be6760e4109b0a89458dd11a729c77f40baBookatz
464993a0be6760e4109b0a89458dd11a729c77f40baBookatz        // Reset the stats. Since the sensor is still running, we should still see the timer
465993a0be6760e4109b0a89458dd11a729c77f40baBookatz        // but still with 0 times.
466993a0be6760e4109b0a89458dd11a729c77f40baBookatz        bi.getUidStatsLocked(UID).reset(clocks.uptime * 1000, clocks.realtime * 1000);
467993a0be6760e4109b0a89458dd11a729c77f40baBookatz        assertEquals(0, timer.getTotalTimeLocked(1000*clocks.realtime, which));
468993a0be6760e4109b0a89458dd11a729c77f40baBookatz        assertEquals(0, timer.getTotalDurationMsLocked(clocks.realtime));
469993a0be6760e4109b0a89458dd11a729c77f40baBookatz        assertEquals(0, bgTimer.getTotalTimeLocked(1000*clocks.realtime, which));
470993a0be6760e4109b0a89458dd11a729c77f40baBookatz        assertEquals(0, bgTimer.getTotalDurationMsLocked(clocks.realtime));
471993a0be6760e4109b0a89458dd11a729c77f40baBookatz
472993a0be6760e4109b0a89458dd11a729c77f40baBookatz        clocks.realtime += 100;
473993a0be6760e4109b0a89458dd11a729c77f40baBookatz        clocks.uptime += 100;
474993a0be6760e4109b0a89458dd11a729c77f40baBookatz
475993a0be6760e4109b0a89458dd11a729c77f40baBookatz        // Now stop the timer. The times should still be 0.
476993a0be6760e4109b0a89458dd11a729c77f40baBookatz        bi.noteStopSensorLocked(UID, SENSOR_ID);
477993a0be6760e4109b0a89458dd11a729c77f40baBookatz        assertEquals(0, timer.getTotalTimeLocked(1000*clocks.realtime, which));
478993a0be6760e4109b0a89458dd11a729c77f40baBookatz        assertEquals(0, timer.getTotalDurationMsLocked(clocks.realtime));
479993a0be6760e4109b0a89458dd11a729c77f40baBookatz        assertEquals(0, bgTimer.getTotalTimeLocked(1000*clocks.realtime, which));
480993a0be6760e4109b0a89458dd11a729c77f40baBookatz        assertEquals(0, bgTimer.getTotalDurationMsLocked(clocks.realtime));
481993a0be6760e4109b0a89458dd11a729c77f40baBookatz
482993a0be6760e4109b0a89458dd11a729c77f40baBookatz        // Now repeat with the TimeBases turned on the entire time.
483993a0be6760e4109b0a89458dd11a729c77f40baBookatz        timeBase.setRunning(true, clocks.uptime * 1000, clocks.realtime * 1000);
484993a0be6760e4109b0a89458dd11a729c77f40baBookatz        bgTimeBase.setRunning(true, clocks.uptime * 1000, clocks.realtime * 1000);
485993a0be6760e4109b0a89458dd11a729c77f40baBookatz        clocks.realtime += 100;
486993a0be6760e4109b0a89458dd11a729c77f40baBookatz        clocks.uptime += 100;
487993a0be6760e4109b0a89458dd11a729c77f40baBookatz
488993a0be6760e4109b0a89458dd11a729c77f40baBookatz        // Timer is turned on
489993a0be6760e4109b0a89458dd11a729c77f40baBookatz        bi.noteStartSensorLocked(UID, SENSOR_ID);
490993a0be6760e4109b0a89458dd11a729c77f40baBookatz
491993a0be6760e4109b0a89458dd11a729c77f40baBookatz        clocks.realtime += 111;
49298d4d5cf3f95fb32814d476fdd899e7d251aa6e9Bookatz        clocks.uptime += 111;
493993a0be6760e4109b0a89458dd11a729c77f40baBookatz
494993a0be6760e4109b0a89458dd11a729c77f40baBookatz        // Timebase and timer was on so times have increased.
495993a0be6760e4109b0a89458dd11a729c77f40baBookatz        assertEquals(111_000, timer.getTotalTimeLocked(1000*clocks.realtime, which));
496993a0be6760e4109b0a89458dd11a729c77f40baBookatz        assertEquals(111, timer.getTotalDurationMsLocked(clocks.realtime));
497993a0be6760e4109b0a89458dd11a729c77f40baBookatz        assertEquals(111_000, bgTimer.getTotalTimeLocked(1000*clocks.realtime, which));
498993a0be6760e4109b0a89458dd11a729c77f40baBookatz        assertEquals(111, bgTimer.getTotalDurationMsLocked(clocks.realtime));
499993a0be6760e4109b0a89458dd11a729c77f40baBookatz
500993a0be6760e4109b0a89458dd11a729c77f40baBookatz        clocks.realtime += 100;
501993a0be6760e4109b0a89458dd11a729c77f40baBookatz        clocks.uptime += 100;
502993a0be6760e4109b0a89458dd11a729c77f40baBookatz
503993a0be6760e4109b0a89458dd11a729c77f40baBookatz        // Reset the stats. Since the sensor is still running, we should still see the timer
504993a0be6760e4109b0a89458dd11a729c77f40baBookatz        // but with 0 times.
505993a0be6760e4109b0a89458dd11a729c77f40baBookatz        bi.getUidStatsLocked(UID).reset(clocks.uptime * 1000, clocks.realtime * 1000);
506993a0be6760e4109b0a89458dd11a729c77f40baBookatz        assertEquals(0, timer.getTotalTimeLocked(1000*clocks.realtime, which));
507993a0be6760e4109b0a89458dd11a729c77f40baBookatz        assertEquals(0, timer.getTotalDurationMsLocked(clocks.realtime));
508993a0be6760e4109b0a89458dd11a729c77f40baBookatz        assertEquals(0, bgTimer.getTotalTimeLocked(1000*clocks.realtime, which));
509993a0be6760e4109b0a89458dd11a729c77f40baBookatz        assertEquals(0, bgTimer.getTotalDurationMsLocked(clocks.realtime));
510993a0be6760e4109b0a89458dd11a729c77f40baBookatz
511993a0be6760e4109b0a89458dd11a729c77f40baBookatz        clocks.realtime += 112;
512993a0be6760e4109b0a89458dd11a729c77f40baBookatz        clocks.uptime += 112;
513993a0be6760e4109b0a89458dd11a729c77f40baBookatz
514993a0be6760e4109b0a89458dd11a729c77f40baBookatz        // Now stop the timer. The times should have increased since the timebase was on.
515993a0be6760e4109b0a89458dd11a729c77f40baBookatz        bi.noteStopSensorLocked(UID, SENSOR_ID);
516993a0be6760e4109b0a89458dd11a729c77f40baBookatz        assertEquals(112_000, timer.getTotalTimeLocked(1000*clocks.realtime, which));
517993a0be6760e4109b0a89458dd11a729c77f40baBookatz        assertEquals(112, timer.getTotalDurationMsLocked(clocks.realtime));
518993a0be6760e4109b0a89458dd11a729c77f40baBookatz        assertEquals(112_000, bgTimer.getTotalTimeLocked(1000*clocks.realtime, which));
519993a0be6760e4109b0a89458dd11a729c77f40baBookatz        assertEquals(112, bgTimer.getTotalDurationMsLocked(clocks.realtime));
520993a0be6760e4109b0a89458dd11a729c77f40baBookatz    }
521ab9ad195d1e873f7569dec45c4e627a4e8ba67e4Amith Yamasani}
522