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