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.internal.os; 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.KernelCpuUidTimeReader.KernelCpuUidActiveTimeReader; 31 import com.android.internal.os.KernelCpuUidTimeReader.KernelCpuUidClusterTimeReader; 32 import com.android.internal.os.KernelCpuUidTimeReader.KernelCpuUidFreqTimeReader; 33 import com.android.internal.os.KernelCpuUidTimeReader.KernelCpuUidUserSysTimeReader; 34 import com.android.internal.power.MeasuredEnergyStats; 35 36 import java.io.File; 37 import java.util.ArrayList; 38 import java.util.Arrays; 39 import java.util.Queue; 40 import java.util.concurrent.Future; 41 42 /** 43 * Mocks a BatteryStatsImpl object. 44 */ 45 public class MockBatteryStatsImpl extends BatteryStatsImpl { 46 public boolean mForceOnBattery; 47 // The mNetworkStats will be used for both wifi and mobile categories 48 private NetworkStats mNetworkStats; 49 private DummyExternalStatsSync mExternalStatsSync = new DummyExternalStatsSync(); 50 MockBatteryStatsImpl()51 MockBatteryStatsImpl() { 52 this(new MockClock()); 53 } 54 MockBatteryStatsImpl(Clock clock)55 MockBatteryStatsImpl(Clock clock) { 56 this(clock, null); 57 } 58 MockBatteryStatsImpl(Clock clock, File historyDirectory)59 MockBatteryStatsImpl(Clock clock, File historyDirectory) { 60 super(clock, historyDirectory); 61 initTimersAndCounters(); 62 63 setExternalStatsSyncLocked(mExternalStatsSync); 64 informThatAllExternalStatsAreFlushed(); 65 66 // A no-op handler. 67 mHandler = new Handler(Looper.getMainLooper()) { 68 }; 69 70 mCpuUidFreqTimeReader = mock(KernelCpuUidTimeReader.KernelCpuUidFreqTimeReader.class); 71 when(mCpuUidFreqTimeReader.readFreqs(any())).thenReturn(new long[]{100, 200}); 72 } 73 initMeasuredEnergyStats(String[] customBucketNames)74 public void initMeasuredEnergyStats(String[] customBucketNames) { 75 final boolean[] supportedStandardBuckets = 76 new boolean[MeasuredEnergyStats.NUMBER_STANDARD_POWER_BUCKETS]; 77 Arrays.fill(supportedStandardBuckets, true); 78 mMeasuredEnergyStatsConfig = new MeasuredEnergyStats.Config(supportedStandardBuckets, 79 customBucketNames, new int[0], new String[]{""}); 80 mGlobalMeasuredEnergyStats = new MeasuredEnergyStats(mMeasuredEnergyStatsConfig); 81 } 82 getOnBatteryTimeBase()83 public TimeBase getOnBatteryTimeBase() { 84 return mOnBatteryTimeBase; 85 } 86 getOnBatteryScreenOffTimeBase()87 public TimeBase getOnBatteryScreenOffTimeBase() { 88 return mOnBatteryScreenOffTimeBase; 89 } 90 getScreenState()91 public int getScreenState() { 92 return mScreenState; 93 } 94 getPendingRemovedUids()95 public Queue<UidToRemove> getPendingRemovedUids() { 96 return mPendingRemovedUids; 97 } 98 isOnBattery()99 public boolean isOnBattery() { 100 return mForceOnBattery ? true : super.isOnBattery(); 101 } 102 forceRecordAllHistory()103 public void forceRecordAllHistory() { 104 mHaveBatteryLevel = true; 105 mRecordingHistory = true; 106 mRecordAllHistory = true; 107 } 108 getOnBatteryBackgroundTimeBase(int uid)109 public TimeBase getOnBatteryBackgroundTimeBase(int uid) { 110 return getUidStatsLocked(uid).mOnBatteryBackgroundTimeBase; 111 } 112 getOnBatteryScreenOffBackgroundTimeBase(int uid)113 public TimeBase getOnBatteryScreenOffBackgroundTimeBase(int uid) { 114 return getUidStatsLocked(uid).mOnBatteryScreenOffBackgroundTimeBase; 115 } 116 getMobileRadioPowerStateUpdateRateLimit()117 public long getMobileRadioPowerStateUpdateRateLimit() { 118 return MOBILE_RADIO_POWER_STATE_UPDATE_FREQ_MS; 119 } 120 setNetworkStats(NetworkStats networkStats)121 public MockBatteryStatsImpl setNetworkStats(NetworkStats networkStats) { 122 mNetworkStats = networkStats; 123 return this; 124 } 125 126 @Override readMobileNetworkStatsLocked( @onNull NetworkStatsManager networkStatsManager)127 protected NetworkStats readMobileNetworkStatsLocked( 128 @NonNull NetworkStatsManager networkStatsManager) { 129 return mNetworkStats; 130 } 131 132 @Override readWifiNetworkStatsLocked( @onNull NetworkStatsManager networkStatsManager)133 protected NetworkStats readWifiNetworkStatsLocked( 134 @NonNull NetworkStatsManager networkStatsManager) { 135 return mNetworkStats; 136 } setPowerProfile(PowerProfile powerProfile)137 public MockBatteryStatsImpl setPowerProfile(PowerProfile powerProfile) { 138 mPowerProfile = powerProfile; 139 return this; 140 } 141 setKernelCpuUidFreqTimeReader(KernelCpuUidFreqTimeReader reader)142 public MockBatteryStatsImpl setKernelCpuUidFreqTimeReader(KernelCpuUidFreqTimeReader reader) { 143 mCpuUidFreqTimeReader = reader; 144 return this; 145 } 146 setKernelCpuUidActiveTimeReader( KernelCpuUidActiveTimeReader reader)147 public MockBatteryStatsImpl setKernelCpuUidActiveTimeReader( 148 KernelCpuUidActiveTimeReader reader) { 149 mCpuUidActiveTimeReader = reader; 150 return this; 151 } 152 setKernelCpuUidClusterTimeReader( KernelCpuUidClusterTimeReader reader)153 public MockBatteryStatsImpl setKernelCpuUidClusterTimeReader( 154 KernelCpuUidClusterTimeReader reader) { 155 mCpuUidClusterTimeReader = reader; 156 return this; 157 } 158 setKernelCpuUidUserSysTimeReader( KernelCpuUidUserSysTimeReader reader)159 public MockBatteryStatsImpl setKernelCpuUidUserSysTimeReader( 160 KernelCpuUidUserSysTimeReader reader) { 161 mCpuUidUserSysTimeReader = reader; 162 return this; 163 } 164 setKernelSingleUidTimeReader(KernelSingleUidTimeReader reader)165 public MockBatteryStatsImpl setKernelSingleUidTimeReader(KernelSingleUidTimeReader reader) { 166 mKernelSingleUidTimeReader = reader; 167 return this; 168 } 169 setKernelCpuSpeedReaders(KernelCpuSpeedReader[] readers)170 public MockBatteryStatsImpl setKernelCpuSpeedReaders(KernelCpuSpeedReader[] readers) { 171 mKernelCpuSpeedReaders = readers; 172 return this; 173 } 174 setSystemServerCpuThreadReader( SystemServerCpuThreadReader systemServerCpuThreadReader)175 public MockBatteryStatsImpl setSystemServerCpuThreadReader( 176 SystemServerCpuThreadReader systemServerCpuThreadReader) { 177 mSystemServerCpuThreadReader = systemServerCpuThreadReader; 178 return this; 179 } 180 setUserInfoProvider(UserInfoProvider provider)181 public MockBatteryStatsImpl setUserInfoProvider(UserInfoProvider provider) { 182 mUserInfoProvider = provider; 183 return this; 184 } 185 setPartialTimers(ArrayList<StopwatchTimer> partialTimers)186 public MockBatteryStatsImpl setPartialTimers(ArrayList<StopwatchTimer> partialTimers) { 187 mPartialTimers = partialTimers; 188 return this; 189 } 190 setLastPartialTimers(ArrayList<StopwatchTimer> lastPartialTimers)191 public MockBatteryStatsImpl setLastPartialTimers(ArrayList<StopwatchTimer> lastPartialTimers) { 192 mLastPartialTimers = lastPartialTimers; 193 return this; 194 } 195 setOnBatteryInternal(boolean onBatteryInternal)196 public MockBatteryStatsImpl setOnBatteryInternal(boolean onBatteryInternal) { 197 mOnBatteryInternal = onBatteryInternal; 198 return this; 199 } 200 201 @GuardedBy("this") setMaxHistoryFiles(int maxHistoryFiles)202 public MockBatteryStatsImpl setMaxHistoryFiles(int maxHistoryFiles) { 203 mConstants.MAX_HISTORY_FILES = maxHistoryFiles; 204 return this; 205 } 206 207 @GuardedBy("this") setMaxHistoryBuffer(int maxHistoryBuffer)208 public MockBatteryStatsImpl setMaxHistoryBuffer(int maxHistoryBuffer) { 209 mConstants.MAX_HISTORY_BUFFER = maxHistoryBuffer; 210 return this; 211 } 212 getAndClearExternalStatsSyncFlags()213 public int getAndClearExternalStatsSyncFlags() { 214 final int flags = mExternalStatsSync.flags; 215 mExternalStatsSync.flags = 0; 216 return flags; 217 } 218 setDummyExternalStatsSync(DummyExternalStatsSync externalStatsSync)219 public void setDummyExternalStatsSync(DummyExternalStatsSync externalStatsSync) { 220 mExternalStatsSync = externalStatsSync; 221 setExternalStatsSyncLocked(mExternalStatsSync); 222 } 223 224 public static class DummyExternalStatsSync implements ExternalStatsSync { 225 public int flags = 0; 226 227 @Override scheduleSync(String reason, int flags)228 public Future<?> scheduleSync(String reason, int flags) { 229 return null; 230 } 231 232 @Override scheduleCleanupDueToRemovedUser(int userId)233 public Future<?> scheduleCleanupDueToRemovedUser(int userId) { 234 return null; 235 } 236 237 @Override scheduleCpuSyncDueToRemovedUid(int uid)238 public Future<?> scheduleCpuSyncDueToRemovedUid(int uid) { 239 return null; 240 } 241 242 @Override scheduleCpuSyncDueToSettingChange()243 public Future<?> scheduleCpuSyncDueToSettingChange() { 244 return null; 245 } 246 247 @Override scheduleSyncDueToScreenStateChange(int flag, boolean onBattery, boolean onBatteryScreenOff, int screenState, int[] perDisplayScreenStates)248 public Future<?> scheduleSyncDueToScreenStateChange(int flag, boolean onBattery, 249 boolean onBatteryScreenOff, int screenState, int[] perDisplayScreenStates) { 250 flags |= flag; 251 return null; 252 } 253 254 @Override scheduleCpuSyncDueToWakelockChange(long delayMillis)255 public Future<?> scheduleCpuSyncDueToWakelockChange(long delayMillis) { 256 return null; 257 } 258 259 @Override cancelCpuSyncDueToWakelockChange()260 public void cancelCpuSyncDueToWakelockChange() { 261 } 262 263 @Override scheduleSyncDueToBatteryLevelChange(long delayMillis)264 public Future<?> scheduleSyncDueToBatteryLevelChange(long delayMillis) { 265 return null; 266 } 267 268 @Override scheduleSyncDueToProcessStateChange(int flags, long delayMillis)269 public void scheduleSyncDueToProcessStateChange(int flags, long delayMillis) { 270 } 271 } 272 } 273 274