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