• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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