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