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