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.Mockito.mock; 20 import static org.mockito.Mockito.when; 21 22 import android.annotation.NonNull; 23 import android.app.usage.NetworkStatsManager; 24 import android.net.NetworkStats; 25 import android.os.Handler; 26 import android.os.Looper; 27 import android.util.SparseArray; 28 29 import com.android.internal.annotations.GuardedBy; 30 import com.android.internal.os.BatteryStatsHistory; 31 import com.android.internal.os.Clock; 32 import com.android.internal.os.CpuScalingPolicies; 33 import com.android.internal.os.KernelCpuSpeedReader; 34 import com.android.internal.os.KernelCpuUidTimeReader.KernelCpuUidActiveTimeReader; 35 import com.android.internal.os.KernelCpuUidTimeReader.KernelCpuUidClusterTimeReader; 36 import com.android.internal.os.KernelCpuUidTimeReader.KernelCpuUidFreqTimeReader; 37 import com.android.internal.os.KernelCpuUidTimeReader.KernelCpuUidUserSysTimeReader; 38 import com.android.internal.os.KernelSingleUidTimeReader; 39 import com.android.internal.os.MonotonicClock; 40 import com.android.internal.os.PowerProfile; 41 import com.android.internal.power.EnergyConsumerStats; 42 43 import java.io.File; 44 import java.util.ArrayList; 45 import java.util.Arrays; 46 import java.util.Queue; 47 48 /** 49 * Mocks a BatteryStatsImpl object. 50 */ 51 public class MockBatteryStatsImpl extends BatteryStatsImpl { 52 public boolean mForceOnBattery; 53 // The mNetworkStats will be used for both wifi and mobile categories 54 private NetworkStats mNetworkStats; 55 private DummyExternalStatsSync mExternalStatsSync = new DummyExternalStatsSync(); 56 public static final BatteryStatsConfig DEFAULT_CONFIG = 57 new BatteryStatsConfig.Builder().build(); 58 MockBatteryStatsImpl()59 MockBatteryStatsImpl() { 60 this(new MockClock()); 61 } 62 MockBatteryStatsImpl(Clock clock)63 MockBatteryStatsImpl(Clock clock) { 64 this(clock, null); 65 } 66 MockBatteryStatsImpl(Clock clock, File historyDirectory)67 MockBatteryStatsImpl(Clock clock, File historyDirectory) { 68 this(clock, historyDirectory, new Handler(Looper.getMainLooper())); 69 } 70 MockBatteryStatsImpl(Clock clock, File historyDirectory, Handler handler)71 MockBatteryStatsImpl(Clock clock, File historyDirectory, Handler handler) { 72 this(DEFAULT_CONFIG, clock, historyDirectory, handler, new PowerStatsUidResolver()); 73 } 74 MockBatteryStatsImpl(BatteryStatsConfig config, Clock clock, File historyDirectory)75 MockBatteryStatsImpl(BatteryStatsConfig config, Clock clock, File historyDirectory) { 76 this(config, clock, historyDirectory, new Handler(Looper.getMainLooper()), 77 new PowerStatsUidResolver()); 78 } 79 MockBatteryStatsImpl(BatteryStatsConfig config, Clock clock, File historyDirectory, Handler handler, PowerStatsUidResolver powerStatsUidResolver)80 MockBatteryStatsImpl(BatteryStatsConfig config, Clock clock, File historyDirectory, 81 Handler handler, PowerStatsUidResolver powerStatsUidResolver) { 82 super(config, clock, new MonotonicClock(0, clock), historyDirectory, handler, 83 mock(PlatformIdleStateCallback.class), mock(EnergyStatsRetriever.class), 84 mock(UserInfoProvider.class), mockPowerProfile(), 85 new CpuScalingPolicies(new SparseArray<>(), new SparseArray<>()), 86 powerStatsUidResolver, mock(FrameworkStatsLogger.class), 87 mock(BatteryStatsHistory.TraceDelegate.class), 88 mock(BatteryStatsHistory.EventLogger.class)); 89 setMaxHistoryBuffer(128 * 1024); 90 91 setExternalStatsSyncLocked(mExternalStatsSync); 92 informThatAllExternalStatsAreFlushed(); 93 94 mHandler = handler; 95 96 mCpuUidFreqTimeReader = mock(KernelCpuUidFreqTimeReader.class); 97 mKernelWakelockReader = null; 98 } 99 mockPowerProfile()100 private static PowerProfile mockPowerProfile() { 101 PowerProfile powerProfile = mock(PowerProfile.class); 102 when(powerProfile.getNumDisplays()).thenReturn(1); 103 return powerProfile; 104 } 105 initMeasuredEnergyStats(String[] customBucketNames)106 public void initMeasuredEnergyStats(String[] customBucketNames) { 107 final boolean[] supportedStandardBuckets = 108 new boolean[EnergyConsumerStats.NUMBER_STANDARD_POWER_BUCKETS]; 109 Arrays.fill(supportedStandardBuckets, true); 110 synchronized (this) { 111 mEnergyConsumerStatsConfig = new EnergyConsumerStats.Config(supportedStandardBuckets, 112 customBucketNames, new int[0], new String[]{""}); 113 mGlobalEnergyConsumerStats = new EnergyConsumerStats(mEnergyConsumerStatsConfig); 114 } 115 } 116 getOnBatteryTimeBase()117 public TimeBase getOnBatteryTimeBase() { 118 return mOnBatteryTimeBase; 119 } 120 getOnBatteryScreenOffTimeBase()121 public TimeBase getOnBatteryScreenOffTimeBase() { 122 return mOnBatteryScreenOffTimeBase; 123 } 124 getScreenState()125 public int getScreenState() { 126 return mScreenState; 127 } 128 getPendingRemovedUids()129 public Queue<UidToRemove> getPendingRemovedUids() { 130 synchronized (this) { 131 return mPendingRemovedUids; 132 } 133 } 134 isOnBattery()135 public boolean isOnBattery() { 136 return mForceOnBattery ? true : super.isOnBattery(); 137 } 138 getOnBatteryBackgroundTimeBase(int uid)139 public TimeBase getOnBatteryBackgroundTimeBase(int uid) { 140 return getUidStatsLocked(uid).mOnBatteryBackgroundTimeBase; 141 } 142 getOnBatteryScreenOffBackgroundTimeBase(int uid)143 public TimeBase getOnBatteryScreenOffBackgroundTimeBase(int uid) { 144 return getUidStatsLocked(uid).mOnBatteryScreenOffBackgroundTimeBase; 145 } 146 getMobileRadioPowerStateUpdateRateLimit()147 public long getMobileRadioPowerStateUpdateRateLimit() { 148 return MOBILE_RADIO_POWER_STATE_UPDATE_FREQ_MS; 149 } 150 setNetworkStats(NetworkStats networkStats)151 public MockBatteryStatsImpl setNetworkStats(NetworkStats networkStats) { 152 mNetworkStats = networkStats; 153 return this; 154 } 155 156 @Override readMobileNetworkStatsLocked( @onNull NetworkStatsManager networkStatsManager)157 protected NetworkStats readMobileNetworkStatsLocked( 158 @NonNull NetworkStatsManager networkStatsManager) { 159 return mNetworkStats; 160 } 161 162 @Override readWifiNetworkStatsLocked( @onNull NetworkStatsManager networkStatsManager)163 protected NetworkStats readWifiNetworkStatsLocked( 164 @NonNull NetworkStatsManager networkStatsManager) { 165 return mNetworkStats; 166 } 167 setPowerProfile(PowerProfile powerProfile)168 public MockBatteryStatsImpl setPowerProfile(PowerProfile powerProfile) { 169 mPowerProfile = powerProfile; 170 setTestCpuScalingPolicies(); 171 return this; 172 } 173 setTestCpuScalingPolicies()174 public MockBatteryStatsImpl setTestCpuScalingPolicies() { 175 SparseArray<int[]> cpusByPolicy = new SparseArray<>(); 176 cpusByPolicy.put(0, new int[]{0}); 177 SparseArray<int[]> freqsByPolicy = new SparseArray<>(); 178 freqsByPolicy.put(0, new int[]{100, 200, 300}); 179 180 setCpuScalingPolicies(new CpuScalingPolicies(freqsByPolicy, freqsByPolicy)); 181 return this; 182 } 183 setCpuScalingPolicies(CpuScalingPolicies cpuScalingPolicies)184 public MockBatteryStatsImpl setCpuScalingPolicies(CpuScalingPolicies cpuScalingPolicies) { 185 mCpuScalingPolicies = cpuScalingPolicies; 186 return this; 187 } 188 setKernelCpuUidFreqTimeReader(KernelCpuUidFreqTimeReader reader)189 public MockBatteryStatsImpl setKernelCpuUidFreqTimeReader(KernelCpuUidFreqTimeReader reader) { 190 mCpuUidFreqTimeReader = reader; 191 return this; 192 } 193 setKernelCpuUidActiveTimeReader( KernelCpuUidActiveTimeReader reader)194 public MockBatteryStatsImpl setKernelCpuUidActiveTimeReader( 195 KernelCpuUidActiveTimeReader reader) { 196 mCpuUidActiveTimeReader = reader; 197 return this; 198 } 199 setKernelCpuUidClusterTimeReader( KernelCpuUidClusterTimeReader reader)200 public MockBatteryStatsImpl setKernelCpuUidClusterTimeReader( 201 KernelCpuUidClusterTimeReader reader) { 202 mCpuUidClusterTimeReader = reader; 203 return this; 204 } 205 setKernelCpuUidUserSysTimeReader( KernelCpuUidUserSysTimeReader reader)206 public MockBatteryStatsImpl setKernelCpuUidUserSysTimeReader( 207 KernelCpuUidUserSysTimeReader reader) { 208 mCpuUidUserSysTimeReader = reader; 209 return this; 210 } 211 setKernelSingleUidTimeReader(KernelSingleUidTimeReader reader)212 public MockBatteryStatsImpl setKernelSingleUidTimeReader(KernelSingleUidTimeReader reader) { 213 mKernelSingleUidTimeReader = reader; 214 return this; 215 } 216 setKernelCpuSpeedReaders(KernelCpuSpeedReader[] readers)217 public MockBatteryStatsImpl setKernelCpuSpeedReaders(KernelCpuSpeedReader[] readers) { 218 mKernelCpuSpeedReaders = readers; 219 return this; 220 } 221 setKernelWakelockReader(KernelWakelockReader reader)222 public MockBatteryStatsImpl setKernelWakelockReader(KernelWakelockReader reader) { 223 mKernelWakelockReader = reader; 224 return this; 225 } 226 setSystemServerCpuThreadReader( SystemServerCpuThreadReader systemServerCpuThreadReader)227 public MockBatteryStatsImpl setSystemServerCpuThreadReader( 228 SystemServerCpuThreadReader systemServerCpuThreadReader) { 229 mSystemServerCpuThreadReader = systemServerCpuThreadReader; 230 return this; 231 } 232 setUserInfoProvider(UserInfoProvider provider)233 public MockBatteryStatsImpl setUserInfoProvider(UserInfoProvider provider) { 234 mUserInfoProvider = provider; 235 return this; 236 } 237 setPartialTimers(ArrayList<StopwatchTimer> partialTimers)238 public MockBatteryStatsImpl setPartialTimers(ArrayList<StopwatchTimer> partialTimers) { 239 mPartialTimers = partialTimers; 240 return this; 241 } 242 setLastPartialTimers(ArrayList<StopwatchTimer> lastPartialTimers)243 public MockBatteryStatsImpl setLastPartialTimers(ArrayList<StopwatchTimer> lastPartialTimers) { 244 mLastPartialTimers = lastPartialTimers; 245 return this; 246 } 247 setOnBatteryInternal(boolean onBatteryInternal)248 public MockBatteryStatsImpl setOnBatteryInternal(boolean onBatteryInternal) { 249 mOnBatteryInternal = onBatteryInternal; 250 return this; 251 } 252 253 @GuardedBy("this") setMaxHistoryFiles(int maxHistoryFiles)254 public MockBatteryStatsImpl setMaxHistoryFiles(int maxHistoryFiles) { 255 mConstants.MAX_HISTORY_FILES = maxHistoryFiles; 256 mConstants.onChange(); 257 return this; 258 } 259 260 @GuardedBy("this") setMaxHistoryBuffer(int maxHistoryBuffer)261 public MockBatteryStatsImpl setMaxHistoryBuffer(int maxHistoryBuffer) { 262 mConstants.MAX_HISTORY_BUFFER = maxHistoryBuffer; 263 mConstants.onChange(); 264 return this; 265 } 266 267 @GuardedBy("this") setPerUidModemModel(int perUidModemModel)268 public MockBatteryStatsImpl setPerUidModemModel(int perUidModemModel) { 269 mConstants.PER_UID_MODEM_MODEL = perUidModemModel; 270 mConstants.onChange(); 271 return this; 272 } 273 getAndClearExternalStatsSyncFlags()274 public int getAndClearExternalStatsSyncFlags() { 275 final int flags = mExternalStatsSync.flags; 276 mExternalStatsSync.flags = 0; 277 return flags; 278 } 279 setDummyExternalStatsSync(DummyExternalStatsSync externalStatsSync)280 public void setDummyExternalStatsSync(DummyExternalStatsSync externalStatsSync) { 281 mExternalStatsSync = externalStatsSync; 282 setExternalStatsSyncLocked(mExternalStatsSync); 283 } 284 285 @Override writeSyncLocked()286 public void writeSyncLocked() { 287 } 288 289 @Override updateBatteryPropertiesLocked()290 protected void updateBatteryPropertiesLocked() { 291 } 292 293 public static class DummyExternalStatsSync implements ExternalStatsSync { 294 public int flags = 0; 295 296 @Override scheduleSync(String reason, int flags)297 public void scheduleSync(String reason, int flags) { 298 } 299 300 @Override scheduleCleanupDueToRemovedUser(int userId)301 public void scheduleCleanupDueToRemovedUser(int userId) { 302 } 303 304 @Override scheduleCpuSyncDueToRemovedUid(int uid)305 public void scheduleCpuSyncDueToRemovedUid(int uid) { 306 } 307 308 @Override scheduleSyncDueToScreenStateChange(int flag, boolean onBattery, boolean onBatteryScreenOff, int screenState, int[] perDisplayScreenStates)309 public void scheduleSyncDueToScreenStateChange(int flag, boolean onBattery, 310 boolean onBatteryScreenOff, int screenState, int[] perDisplayScreenStates) { 311 flags |= flag; 312 } 313 314 @Override scheduleCpuSyncDueToWakelockChange(long delayMillis)315 public void scheduleCpuSyncDueToWakelockChange(long delayMillis) { 316 } 317 318 @Override cancelCpuSyncDueToWakelockChange()319 public void cancelCpuSyncDueToWakelockChange() { 320 } 321 322 @Override scheduleSyncDueToBatteryLevelChange(long delayMillis)323 public void scheduleSyncDueToBatteryLevelChange(long delayMillis) { 324 } 325 326 @Override scheduleSyncDueToProcessStateChange(int flags, long delayMillis)327 public void scheduleSyncDueToProcessStateChange(int flags, long delayMillis) { 328 } 329 } 330 } 331