1 /* 2 * Copyright (C) 2016 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 package com.android.server.power.stats; 18 19 import static org.mockito.ArgumentMatchers.any; 20 import static org.mockito.Mockito.mock; 21 import static org.mockito.Mockito.when; 22 23 import android.annotation.NonNull; 24 import android.app.usage.NetworkStatsManager; 25 import android.net.NetworkStats; 26 import android.os.Handler; 27 import android.os.Looper; 28 29 import com.android.internal.annotations.GuardedBy; 30 import com.android.internal.os.Clock; 31 import com.android.internal.os.KernelCpuSpeedReader; 32 import com.android.internal.os.KernelCpuUidTimeReader.KernelCpuUidActiveTimeReader; 33 import com.android.internal.os.KernelCpuUidTimeReader.KernelCpuUidClusterTimeReader; 34 import com.android.internal.os.KernelCpuUidTimeReader.KernelCpuUidFreqTimeReader; 35 import com.android.internal.os.KernelCpuUidTimeReader.KernelCpuUidUserSysTimeReader; 36 import com.android.internal.os.KernelSingleUidTimeReader; 37 import com.android.internal.os.PowerProfile; 38 import com.android.internal.power.EnergyConsumerStats; 39 40 import java.io.File; 41 import java.util.ArrayList; 42 import java.util.Arrays; 43 import java.util.Queue; 44 import java.util.concurrent.Future; 45 46 /** 47 * Mocks a BatteryStatsImpl object. 48 */ 49 public class MockBatteryStatsImpl extends BatteryStatsImpl { 50 public boolean mForceOnBattery; 51 // The mNetworkStats will be used for both wifi and mobile categories 52 private NetworkStats mNetworkStats; 53 private DummyExternalStatsSync mExternalStatsSync = new DummyExternalStatsSync(); 54 MockBatteryStatsImpl()55 MockBatteryStatsImpl() { 56 this(new MockClock()); 57 } 58 MockBatteryStatsImpl(Clock clock)59 MockBatteryStatsImpl(Clock clock) { 60 this(clock, null); 61 } 62 MockBatteryStatsImpl(Clock clock, File historyDirectory)63 MockBatteryStatsImpl(Clock clock, File historyDirectory) { 64 super(clock, historyDirectory); 65 initTimersAndCounters(); 66 setMaxHistoryBuffer(128 * 1024); 67 68 setExternalStatsSyncLocked(mExternalStatsSync); 69 informThatAllExternalStatsAreFlushed(); 70 71 // A no-op handler. 72 mHandler = new Handler(Looper.getMainLooper()) { 73 }; 74 75 mCpuUidFreqTimeReader = mock(KernelCpuUidFreqTimeReader.class); 76 when(mCpuUidFreqTimeReader.readFreqs(any())).thenReturn(new long[]{100, 200}); 77 } 78 initMeasuredEnergyStats(String[] customBucketNames)79 public void initMeasuredEnergyStats(String[] customBucketNames) { 80 final boolean[] supportedStandardBuckets = 81 new boolean[EnergyConsumerStats.NUMBER_STANDARD_POWER_BUCKETS]; 82 Arrays.fill(supportedStandardBuckets, true); 83 synchronized (this) { 84 mEnergyConsumerStatsConfig = new EnergyConsumerStats.Config(supportedStandardBuckets, 85 customBucketNames, new int[0], new String[]{""}); 86 mGlobalEnergyConsumerStats = new EnergyConsumerStats(mEnergyConsumerStatsConfig); 87 } 88 } 89 getOnBatteryTimeBase()90 public TimeBase getOnBatteryTimeBase() { 91 return mOnBatteryTimeBase; 92 } 93 getOnBatteryScreenOffTimeBase()94 public TimeBase getOnBatteryScreenOffTimeBase() { 95 return mOnBatteryScreenOffTimeBase; 96 } 97 getScreenState()98 public int getScreenState() { 99 return mScreenState; 100 } 101 getPendingRemovedUids()102 public Queue<UidToRemove> getPendingRemovedUids() { 103 return mPendingRemovedUids; 104 } 105 isOnBattery()106 public boolean isOnBattery() { 107 return mForceOnBattery ? true : super.isOnBattery(); 108 } 109 getOnBatteryBackgroundTimeBase(int uid)110 public TimeBase getOnBatteryBackgroundTimeBase(int uid) { 111 return getUidStatsLocked(uid).mOnBatteryBackgroundTimeBase; 112 } 113 getOnBatteryScreenOffBackgroundTimeBase(int uid)114 public TimeBase getOnBatteryScreenOffBackgroundTimeBase(int uid) { 115 return getUidStatsLocked(uid).mOnBatteryScreenOffBackgroundTimeBase; 116 } 117 getMobileRadioPowerStateUpdateRateLimit()118 public long getMobileRadioPowerStateUpdateRateLimit() { 119 return MOBILE_RADIO_POWER_STATE_UPDATE_FREQ_MS; 120 } 121 setNetworkStats(NetworkStats networkStats)122 public MockBatteryStatsImpl setNetworkStats(NetworkStats networkStats) { 123 mNetworkStats = networkStats; 124 return this; 125 } 126 127 @Override readMobileNetworkStatsLocked( @onNull NetworkStatsManager networkStatsManager)128 protected NetworkStats readMobileNetworkStatsLocked( 129 @NonNull NetworkStatsManager networkStatsManager) { 130 return mNetworkStats; 131 } 132 133 @Override readWifiNetworkStatsLocked( @onNull NetworkStatsManager networkStatsManager)134 protected NetworkStats readWifiNetworkStatsLocked( 135 @NonNull NetworkStatsManager networkStatsManager) { 136 return mNetworkStats; 137 } setPowerProfile(PowerProfile powerProfile)138 public MockBatteryStatsImpl setPowerProfile(PowerProfile powerProfile) { 139 mPowerProfile = powerProfile; 140 return this; 141 } 142 setKernelCpuUidFreqTimeReader(KernelCpuUidFreqTimeReader reader)143 public MockBatteryStatsImpl setKernelCpuUidFreqTimeReader(KernelCpuUidFreqTimeReader reader) { 144 mCpuUidFreqTimeReader = reader; 145 return this; 146 } 147 setKernelCpuUidActiveTimeReader( KernelCpuUidActiveTimeReader reader)148 public MockBatteryStatsImpl setKernelCpuUidActiveTimeReader( 149 KernelCpuUidActiveTimeReader reader) { 150 mCpuUidActiveTimeReader = reader; 151 return this; 152 } 153 setKernelCpuUidClusterTimeReader( KernelCpuUidClusterTimeReader reader)154 public MockBatteryStatsImpl setKernelCpuUidClusterTimeReader( 155 KernelCpuUidClusterTimeReader reader) { 156 mCpuUidClusterTimeReader = reader; 157 return this; 158 } 159 setKernelCpuUidUserSysTimeReader( KernelCpuUidUserSysTimeReader reader)160 public MockBatteryStatsImpl setKernelCpuUidUserSysTimeReader( 161 KernelCpuUidUserSysTimeReader reader) { 162 mCpuUidUserSysTimeReader = reader; 163 return this; 164 } 165 setKernelSingleUidTimeReader(KernelSingleUidTimeReader reader)166 public MockBatteryStatsImpl setKernelSingleUidTimeReader(KernelSingleUidTimeReader reader) { 167 mKernelSingleUidTimeReader = reader; 168 return this; 169 } 170 setKernelCpuSpeedReaders(KernelCpuSpeedReader[] readers)171 public MockBatteryStatsImpl setKernelCpuSpeedReaders(KernelCpuSpeedReader[] readers) { 172 mKernelCpuSpeedReaders = readers; 173 return this; 174 } 175 setSystemServerCpuThreadReader( SystemServerCpuThreadReader systemServerCpuThreadReader)176 public MockBatteryStatsImpl setSystemServerCpuThreadReader( 177 SystemServerCpuThreadReader systemServerCpuThreadReader) { 178 mSystemServerCpuThreadReader = systemServerCpuThreadReader; 179 return this; 180 } 181 setUserInfoProvider(UserInfoProvider provider)182 public MockBatteryStatsImpl setUserInfoProvider(UserInfoProvider provider) { 183 mUserInfoProvider = provider; 184 return this; 185 } 186 setPartialTimers(ArrayList<StopwatchTimer> partialTimers)187 public MockBatteryStatsImpl setPartialTimers(ArrayList<StopwatchTimer> partialTimers) { 188 mPartialTimers = partialTimers; 189 return this; 190 } 191 setLastPartialTimers(ArrayList<StopwatchTimer> lastPartialTimers)192 public MockBatteryStatsImpl setLastPartialTimers(ArrayList<StopwatchTimer> lastPartialTimers) { 193 mLastPartialTimers = lastPartialTimers; 194 return this; 195 } 196 setOnBatteryInternal(boolean onBatteryInternal)197 public MockBatteryStatsImpl setOnBatteryInternal(boolean onBatteryInternal) { 198 mOnBatteryInternal = onBatteryInternal; 199 return this; 200 } 201 202 @GuardedBy("this") setMaxHistoryFiles(int maxHistoryFiles)203 public MockBatteryStatsImpl setMaxHistoryFiles(int maxHistoryFiles) { 204 mConstants.MAX_HISTORY_FILES = maxHistoryFiles; 205 mConstants.onChange(); 206 return this; 207 } 208 209 @GuardedBy("this") setMaxHistoryBuffer(int maxHistoryBuffer)210 public MockBatteryStatsImpl setMaxHistoryBuffer(int maxHistoryBuffer) { 211 mConstants.MAX_HISTORY_BUFFER = maxHistoryBuffer; 212 mConstants.onChange(); 213 return this; 214 } 215 216 @GuardedBy("this") setPerUidModemModel(int perUidModemModel)217 public MockBatteryStatsImpl setPerUidModemModel(int perUidModemModel) { 218 mConstants.PER_UID_MODEM_MODEL = perUidModemModel; 219 mConstants.onChange(); 220 return this; 221 } 222 getAndClearExternalStatsSyncFlags()223 public int getAndClearExternalStatsSyncFlags() { 224 final int flags = mExternalStatsSync.flags; 225 mExternalStatsSync.flags = 0; 226 return flags; 227 } 228 setDummyExternalStatsSync(DummyExternalStatsSync externalStatsSync)229 public void setDummyExternalStatsSync(DummyExternalStatsSync externalStatsSync) { 230 mExternalStatsSync = externalStatsSync; 231 setExternalStatsSyncLocked(mExternalStatsSync); 232 } 233 234 @Override writeSyncLocked()235 public void writeSyncLocked() { 236 } 237 238 public static class DummyExternalStatsSync implements ExternalStatsSync { 239 public int flags = 0; 240 241 @Override scheduleSync(String reason, int flags)242 public Future<?> scheduleSync(String reason, int flags) { 243 return null; 244 } 245 246 @Override scheduleCleanupDueToRemovedUser(int userId)247 public Future<?> scheduleCleanupDueToRemovedUser(int userId) { 248 return null; 249 } 250 251 @Override scheduleCpuSyncDueToRemovedUid(int uid)252 public Future<?> scheduleCpuSyncDueToRemovedUid(int uid) { 253 return null; 254 } 255 256 @Override scheduleSyncDueToScreenStateChange(int flag, boolean onBattery, boolean onBatteryScreenOff, int screenState, int[] perDisplayScreenStates)257 public Future<?> scheduleSyncDueToScreenStateChange(int flag, boolean onBattery, 258 boolean onBatteryScreenOff, int screenState, int[] perDisplayScreenStates) { 259 flags |= flag; 260 return null; 261 } 262 263 @Override scheduleCpuSyncDueToWakelockChange(long delayMillis)264 public Future<?> scheduleCpuSyncDueToWakelockChange(long delayMillis) { 265 return null; 266 } 267 268 @Override cancelCpuSyncDueToWakelockChange()269 public void cancelCpuSyncDueToWakelockChange() { 270 } 271 272 @Override scheduleSyncDueToBatteryLevelChange(long delayMillis)273 public Future<?> scheduleSyncDueToBatteryLevelChange(long delayMillis) { 274 return null; 275 } 276 277 @Override scheduleSyncDueToProcessStateChange(int flags, long delayMillis)278 public void scheduleSyncDueToProcessStateChange(int flags, long delayMillis) { 279 } 280 } 281 } 282 283