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 android.net.NetworkStats;
20 import android.os.Handler;
21 import android.os.Looper;
22 import android.util.SparseIntArray;
23 
24 import com.android.internal.os.KernelCpuUidTimeReader.KernelCpuUidActiveTimeReader;
25 import com.android.internal.os.KernelCpuUidTimeReader.KernelCpuUidClusterTimeReader;
26 import com.android.internal.os.KernelCpuUidTimeReader.KernelCpuUidFreqTimeReader;
27 import com.android.internal.os.KernelCpuUidTimeReader.KernelCpuUidUserSysTimeReader;
28 import com.android.internal.power.MeasuredEnergyStats;
29 
30 import java.util.ArrayList;
31 import java.util.Arrays;
32 import java.util.Queue;
33 import java.util.concurrent.Future;
34 
35 /**
36  * Mocks a BatteryStatsImpl object.
37  */
38 public class MockBatteryStatsImpl extends BatteryStatsImpl {
39     public BatteryStatsImpl.Clocks clocks;
40     public boolean mForceOnBattery;
41     private NetworkStats mNetworkStats;
42     private DummyExternalStatsSync mExternalStatsSync = new DummyExternalStatsSync();
43 
MockBatteryStatsImpl(Clocks clocks)44     MockBatteryStatsImpl(Clocks clocks) {
45         super(clocks);
46         this.clocks = mClocks;
47         initTimersAndCounters();
48 
49         setExternalStatsSyncLocked(mExternalStatsSync);
50         informThatAllExternalStatsAreFlushed();
51 
52         // A no-op handler.
53         mHandler = new Handler(Looper.getMainLooper()) {
54         };
55     }
56 
MockBatteryStatsImpl()57     MockBatteryStatsImpl() {
58         this(new MockClocks());
59     }
60 
initMeasuredEnergyStats(String[] customBucketNames)61     public void initMeasuredEnergyStats(String[] customBucketNames) {
62         final boolean[] supportedStandardBuckets =
63                 new boolean[MeasuredEnergyStats.NUMBER_STANDARD_POWER_BUCKETS];
64         Arrays.fill(supportedStandardBuckets, true);
65         mGlobalMeasuredEnergyStats =
66                 new MeasuredEnergyStats(supportedStandardBuckets, customBucketNames);
67     }
68 
getOnBatteryTimeBase()69     public TimeBase getOnBatteryTimeBase() {
70         return mOnBatteryTimeBase;
71     }
72 
getOnBatteryScreenOffTimeBase()73     public TimeBase getOnBatteryScreenOffTimeBase() {
74         return mOnBatteryScreenOffTimeBase;
75     }
76 
getScreenState()77     public int getScreenState() {
78         return mScreenState;
79     }
80 
getPendingRemovedUids()81     public Queue<UidToRemove> getPendingRemovedUids() {
82         return mPendingRemovedUids;
83     }
84 
isOnBattery()85     public boolean isOnBattery() {
86         return mForceOnBattery ? true : super.isOnBattery();
87     }
88 
forceRecordAllHistory()89     public void forceRecordAllHistory() {
90         mHaveBatteryLevel = true;
91         mRecordingHistory = true;
92         mRecordAllHistory = true;
93     }
94 
getOnBatteryBackgroundTimeBase(int uid)95     public TimeBase getOnBatteryBackgroundTimeBase(int uid) {
96         return getUidStatsLocked(uid).mOnBatteryBackgroundTimeBase;
97     }
98 
getOnBatteryScreenOffBackgroundTimeBase(int uid)99     public TimeBase getOnBatteryScreenOffBackgroundTimeBase(int uid) {
100         return getUidStatsLocked(uid).mOnBatteryScreenOffBackgroundTimeBase;
101     }
102 
setNetworkStats(NetworkStats networkStats)103     public MockBatteryStatsImpl setNetworkStats(NetworkStats networkStats) {
104         mNetworkStats = networkStats;
105         return this;
106     }
107 
108     @Override
readNetworkStatsLocked(String[] ifaces)109     protected NetworkStats readNetworkStatsLocked(String[] ifaces) {
110         return mNetworkStats;
111     }
112 
setPowerProfile(PowerProfile powerProfile)113     public MockBatteryStatsImpl setPowerProfile(PowerProfile powerProfile) {
114         mPowerProfile = powerProfile;
115         return this;
116     }
117 
setKernelCpuUidFreqTimeReader(KernelCpuUidFreqTimeReader reader)118     public MockBatteryStatsImpl setKernelCpuUidFreqTimeReader(KernelCpuUidFreqTimeReader reader) {
119         mCpuUidFreqTimeReader = reader;
120         return this;
121     }
122 
setKernelCpuUidActiveTimeReader( KernelCpuUidActiveTimeReader reader)123     public MockBatteryStatsImpl setKernelCpuUidActiveTimeReader(
124             KernelCpuUidActiveTimeReader reader) {
125         mCpuUidActiveTimeReader = reader;
126         return this;
127     }
128 
setKernelCpuUidClusterTimeReader( KernelCpuUidClusterTimeReader reader)129     public MockBatteryStatsImpl setKernelCpuUidClusterTimeReader(
130             KernelCpuUidClusterTimeReader reader) {
131         mCpuUidClusterTimeReader = reader;
132         return this;
133     }
134 
setKernelCpuUidUserSysTimeReader( KernelCpuUidUserSysTimeReader reader)135     public MockBatteryStatsImpl setKernelCpuUidUserSysTimeReader(
136             KernelCpuUidUserSysTimeReader reader) {
137         mCpuUidUserSysTimeReader = reader;
138         return this;
139     }
140 
setKernelSingleUidTimeReader(KernelSingleUidTimeReader reader)141     public MockBatteryStatsImpl setKernelSingleUidTimeReader(KernelSingleUidTimeReader reader) {
142         mKernelSingleUidTimeReader = reader;
143         return this;
144     }
145 
setKernelCpuSpeedReaders(KernelCpuSpeedReader[] readers)146     public MockBatteryStatsImpl setKernelCpuSpeedReaders(KernelCpuSpeedReader[] readers) {
147         mKernelCpuSpeedReaders = readers;
148         return this;
149     }
150 
setSystemServerCpuThreadReader( SystemServerCpuThreadReader systemServerCpuThreadReader)151     public MockBatteryStatsImpl setSystemServerCpuThreadReader(
152             SystemServerCpuThreadReader systemServerCpuThreadReader) {
153         mSystemServerCpuThreadReader = systemServerCpuThreadReader;
154         return this;
155     }
156 
setUserInfoProvider(UserInfoProvider provider)157     public MockBatteryStatsImpl setUserInfoProvider(UserInfoProvider provider) {
158         mUserInfoProvider = provider;
159         return this;
160     }
161 
setPartialTimers(ArrayList<StopwatchTimer> partialTimers)162     public MockBatteryStatsImpl setPartialTimers(ArrayList<StopwatchTimer> partialTimers) {
163         mPartialTimers = partialTimers;
164         return this;
165     }
166 
setLastPartialTimers(ArrayList<StopwatchTimer> lastPartialTimers)167     public MockBatteryStatsImpl setLastPartialTimers(ArrayList<StopwatchTimer> lastPartialTimers) {
168         mLastPartialTimers = lastPartialTimers;
169         return this;
170     }
171 
setOnBatteryInternal(boolean onBatteryInternal)172     public MockBatteryStatsImpl setOnBatteryInternal(boolean onBatteryInternal) {
173         mOnBatteryInternal = onBatteryInternal;
174         return this;
175     }
176 
setTrackingCpuByProcStateEnabled(boolean enabled)177     public MockBatteryStatsImpl setTrackingCpuByProcStateEnabled(boolean enabled) {
178         mConstants.TRACK_CPU_TIMES_BY_PROC_STATE = enabled;
179         return this;
180     }
181 
getPendingUids()182     public SparseIntArray getPendingUids() {
183         return mPendingUids;
184     }
185 
getAndClearExternalStatsSyncFlags()186     public int getAndClearExternalStatsSyncFlags() {
187         final int flags = mExternalStatsSync.flags;
188         mExternalStatsSync.flags = 0;
189         return flags;
190     }
191 
192     private class DummyExternalStatsSync implements ExternalStatsSync {
193         public int flags = 0;
194 
195         @Override
scheduleSync(String reason, int flags)196         public Future<?> scheduleSync(String reason, int flags) {
197             return null;
198         }
199 
200         @Override
scheduleCpuSyncDueToRemovedUid(int uid)201         public Future<?> scheduleCpuSyncDueToRemovedUid(int uid) {
202             return null;
203         }
204 
205         @Override
scheduleCpuSyncDueToSettingChange()206         public Future<?> scheduleCpuSyncDueToSettingChange() {
207             return null;
208         }
209 
210         @Override
scheduleReadProcStateCpuTimes(boolean onBattery, boolean onBatteryScreenOff, long delayMillis)211         public Future<?> scheduleReadProcStateCpuTimes(boolean onBattery,
212                 boolean onBatteryScreenOff, long delayMillis) {
213             return null;
214         }
215 
216         @Override
scheduleCopyFromAllUidsCpuTimes( boolean onBattery, boolean onBatteryScreenOff)217         public Future<?> scheduleCopyFromAllUidsCpuTimes(
218                 boolean onBattery, boolean onBatteryScreenOff) {
219             return null;
220         }
221 
222         @Override
scheduleSyncDueToScreenStateChange(int flag, boolean onBattery, boolean onBatteryScreenOff, int screenState, int[] perDisplayScreenStates)223         public Future<?> scheduleSyncDueToScreenStateChange(int flag, boolean onBattery,
224                 boolean onBatteryScreenOff, int screenState, int[] perDisplayScreenStates) {
225             flags |= flag;
226             return null;
227         }
228 
229         @Override
scheduleCpuSyncDueToWakelockChange(long delayMillis)230         public Future<?> scheduleCpuSyncDueToWakelockChange(long delayMillis) {
231             return null;
232         }
233 
234         @Override
cancelCpuSyncDueToWakelockChange()235         public void cancelCpuSyncDueToWakelockChange() {
236         }
237 
238         @Override
scheduleSyncDueToBatteryLevelChange(long delayMillis)239         public Future<?> scheduleSyncDueToBatteryLevelChange(long delayMillis) {
240             return null;
241         }
242     }
243 }
244 
245