Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 3449acf9 authored by Dmitri Plotnikov's avatar Dmitri Plotnikov
Browse files

Ensure tests pass when streamlined_misc_battery_stats flag is enabled

Bug: 409605114
Flag: EXEMPT tests only
Test: atest PowerStatsTests

Change-Id: Ifbfea9e187145958593d6c87795eacfbf5233bed
parent 3bd4cd1e
Loading
Loading
Loading
Loading
+7 −3
Original line number Diff line number Diff line
@@ -2138,7 +2138,6 @@ public class BatteryStatsImpl extends BatteryStats {
            WifiPowerStatsCollector.Injector, BluetoothPowerStatsCollector.Injector,
            EnergyConsumerPowerStatsCollector.Injector, WakelockPowerStatsCollector.Injector {
        private PackageManager mPackageManager;
        private PowerStatsCollector.ConsumedEnergyRetriever mConsumedEnergyRetriever;
        private NetworkStatsManager mNetworkStatsManager;
        private TelephonyManager mTelephonyManager;
        private WifiManager mWifiManager;
@@ -2147,8 +2146,11 @@ public class BatteryStatsImpl extends BatteryStats {
        @SuppressLint("WifiManagerPotentialLeak")
        void setContext(Context context) {
            mPackageManager = context.getPackageManager();
            if (mConsumedEnergyRetriever == null) {
                mConsumedEnergyRetriever = new PowerStatsCollector.ConsumedEnergyRetrieverImpl(
                    LocalServices.getService(PowerStatsInternal.class), () -> mBatteryVoltageMv);
                        LocalServices.getService(PowerStatsInternal.class),
                        () -> mBatteryVoltageMv);
            }
            mNetworkStatsManager = context.getSystemService(NetworkStatsManager.class);
            mTelephonyManager =
                    (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);
@@ -2266,6 +2268,8 @@ public class BatteryStatsImpl extends BatteryStats {
        }
    }
    @VisibleForTesting
    protected PowerStatsCollector.ConsumedEnergyRetriever mConsumedEnergyRetriever;
    private final PowerStatsCollectorInjector mPowerStatsCollectorInjector =
            new PowerStatsCollectorInjector();
+2 −0
Original line number Diff line number Diff line
@@ -121,6 +121,8 @@ abstract class BinaryStatePowerStatsProcessor extends PowerStatsProcessor {
                // The component got turned OFF, which means that it had been ON since the start
                if (state == STATE_OFF) {
                    mLastState = STATE_ON;
                } else {
                    mLastState = STATE_OFF;
                }
            } else {
                mLastState = state;
+3 −2
Original line number Diff line number Diff line
@@ -140,14 +140,15 @@ public class PowerStatsAggregator {
                        mCurrentScreenState = screenState;
                    }

                    if ((item.states
                    if (((item.states
                            & BatteryStats.HistoryItem.IMPORTANT_FOR_POWER_STATS_STATES)
                            != lastStates
                            || (item.states2
                            & BatteryStats.HistoryItem.IMPORTANT_FOR_POWER_STATS_STATES2)
                            != lastStates2
                            || (item.eventCode & BatteryStats.HistoryItem.EVENT_TYPE_MASK)
                            == BatteryStats.HistoryItem.EVENT_STATE_CHANGE) {
                            == BatteryStats.HistoryItem.EVENT_STATE_CHANGE)
                            && item.cmd != BatteryStats.HistoryItem.CMD_RESET) {
                        mStats.noteStateChange(item);
                        lastStates = item.states
                                & BatteryStats.HistoryItem.IMPORTANT_FOR_POWER_STATS_STATES;
+9 −3
Original line number Diff line number Diff line
@@ -67,6 +67,7 @@ import com.android.internal.os.KernelSingleUidTimeReader;
import com.android.internal.os.LongArrayMultiStateCounter;
import com.android.internal.os.MonotonicClock;
import com.android.internal.os.PowerProfile;
import com.android.server.power.stats.processor.MultiStatePowerAttributor;

import com.google.common.collect.ImmutableList;
import com.google.common.truth.LongSubject;
@@ -115,8 +116,6 @@ public class BatteryStatsImplTest {
    private Handler mHandler;
    private PowerStatsStore mPowerStatsStore;
    private BatteryUsageStatsProvider mBatteryUsageStatsProvider;
    @Mock
    private PowerAttributor mPowerAttributor;

    @Before
    public void setUp() throws IOException {
@@ -148,7 +147,14 @@ public class BatteryStatsImplTest {
            context = InstrumentationRegistry.getContext();
        }
        mPowerStatsStore = new PowerStatsStore(systemDir, mHandler);
        mBatteryUsageStatsProvider = new BatteryUsageStatsProvider(context, mPowerAttributor,

        MultiStatePowerAttributor powerAttributor = new MultiStatePowerAttributor(context,
                mPowerStatsStore, mPowerProfile, mBatteryStatsImpl.getCpuScalingPolicies(),
                () -> 3500);
        powerAttributor.setPowerComponentSupported(BatteryConsumer.POWER_COMPONENT_FLASHLIGHT,
                true);

        mBatteryUsageStatsProvider = new BatteryUsageStatsProvider(context, powerAttributor,
                mPowerProfile, mBatteryStatsImpl.getCpuScalingPolicies(), mPowerStatsStore, 0,
                mMockClock, mMonotonicClock);
    }
+52 −34
Original line number Diff line number Diff line
@@ -19,6 +19,7 @@ package com.android.server.power.stats;
import static com.google.common.truth.Truth.assertThat;

import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.anyInt;
import static org.mockito.ArgumentMatchers.anyLong;
import static org.mockito.Mockito.doAnswer;
import static org.mockito.Mockito.mock;
@@ -29,6 +30,8 @@ import static org.mockito.Mockito.when;
import android.app.ActivityManager;
import android.content.Context;
import android.hardware.SensorManager;
import android.hardware.power.stats.EnergyConsumerAttribution;
import android.hardware.power.stats.EnergyConsumerResult;
import android.os.AggregateBatteryConsumer;
import android.os.BatteryConsumer;
import android.os.BatteryManager;
@@ -42,7 +45,6 @@ import android.os.UidBatteryConsumer;
import android.platform.test.annotations.EnableFlags;
import android.platform.test.flag.junit.SetFlagsRule;
import android.platform.test.ravenwood.RavenwoodRule;
import android.util.SparseLongArray;

import androidx.test.InstrumentationRegistry;
import androidx.test.filters.SmallTest;
@@ -55,6 +57,7 @@ import com.android.server.power.optimization.Flags;
import com.android.server.power.stats.processor.MultiStatePowerAttributor;

import org.junit.Before;
import org.junit.Ignore;
import org.junit.Rule;
import org.junit.Test;
import org.junit.runner.RunWith;
@@ -73,6 +76,7 @@ public class BatteryUsageStatsProviderTest {
    private static final int APP_UID = Process.FIRST_APPLICATION_UID + 42;
    private static final long MINUTE_IN_MS = 60 * 1000;
    private static final double PRECISION = 0.00001;
    private static final int VOLTAGE_MV = 3500;

    @Rule(order = 1)
    public final BatteryUsageStatsRule mStatsRule =
@@ -148,15 +152,12 @@ public class BatteryUsageStatsProviderTest {
        batteryUsageStats.close();
    }

    @Ignore("BatteryUsageStatsQuery.includePowerComponents is unsupported")
    @Test
    public void test_selectPowerComponents() throws IOException {
        BatteryStatsImpl batteryStats = prepareBatteryStats(false);

        BatteryUsageStatsProvider provider = new BatteryUsageStatsProvider(mContext,
                mock(PowerAttributor.class), mStatsRule.getPowerProfile(),
                mStatsRule.getCpuScalingPolicies(), mock(PowerStatsStore.class), 0, mMockClock,
                mMonotonicClock);

        BatteryUsageStatsProvider provider = createBatteryUsageStatsProvider(0);
        final BatteryUsageStats batteryUsageStats =
                provider.getBatteryUsageStats(batteryStats,
                        new BatteryUsageStatsQuery.Builder()
@@ -272,15 +273,6 @@ public class BatteryUsageStatsProviderTest {

    private BatteryUsageStats prepareBatteryUsageStats(boolean plugInAtTheEnd) {
        BatteryStatsImpl batteryStats = prepareBatteryStats(plugInAtTheEnd);

        MultiStatePowerAttributor powerAttributor = new MultiStatePowerAttributor(mContext,
                mock(PowerStatsStore.class), mStatsRule.getPowerProfile(),
                mStatsRule.getCpuScalingPolicies(), () -> 3500);
        powerAttributor.setPowerComponentSupported(BatteryConsumer.POWER_COMPONENT_AUDIO,
                true);
        powerAttributor.setPowerComponentSupported(BatteryConsumer.POWER_COMPONENT_FLASHLIGHT,
                true);

        BatteryUsageStatsProvider provider = createBatteryUsageStatsProvider(0);

        return provider.getBatteryUsageStats(batteryStats, BatteryUsageStatsQuery.DEFAULT);
@@ -485,22 +477,20 @@ public class BatteryUsageStatsProviderTest {
    @Test
    public void testAggregateBatteryStats() throws Throwable {
        BatteryStatsImpl batteryStats = mStatsRule.getBatteryStats();
        batteryStats.forceRecordAllHistory();

        setTime(5 * MINUTE_IN_MS);
        batteryStats.startNewSession(BatteryStatsImpl.RESET_REASON_ADB_COMMAND);
        mStatsRule.waitForBackgroundThread();

        PowerStatsStore powerStatsStore = new PowerStatsStore(
        mPowerStatsStore = new PowerStatsStore(
                new File(mStatsRule.getHistoryDir(), "powerstatsstore"),
                mStatsRule.getHandler());
        powerStatsStore.reset();
        mPowerStatsStore.reset();

        BatteryUsageStatsProvider provider = new BatteryUsageStatsProvider(mContext,
                mock(PowerAttributor.class), mStatsRule.getPowerProfile(),
                mStatsRule.getCpuScalingPolicies(), powerStatsStore, 0, mMockClock,
                mMonotonicClock);
        BatteryUsageStatsProvider provider = createBatteryUsageStatsProvider(0);

        batteryStats.saveBatteryUsageStatsOnReset(provider, powerStatsStore,
        batteryStats.saveBatteryUsageStatsOnReset(provider, mPowerStatsStore,
                /* accumulateBatteryUsageStats */ false);
        batteryStats.startNewSession(BatteryStatsImpl.RESET_REASON_ADB_COMMAND);
        mStatsRule.waitForBackgroundThread();
@@ -758,7 +748,7 @@ public class BatteryUsageStatsProviderTest {
            int accumulatedBatteryUsageStatsSpanSize) {
        MultiStatePowerAttributor powerAttributor = new MultiStatePowerAttributor(mContext,
                mPowerStatsStore, mStatsRule.getPowerProfile(), mStatsRule.getCpuScalingPolicies(),
                () -> 3500);
                () -> VOLTAGE_MV);
        for (int powerComponentId = 0; powerComponentId < BatteryConsumer.POWER_COMPONENT_COUNT;
                powerComponentId++) {
            powerAttributor.setPowerComponentSupported(powerComponentId, true);
@@ -804,23 +794,42 @@ public class BatteryUsageStatsProviderTest {
    @Test
    public void saveBatteryUsageStatsOnReset_incompatibleEnergyConsumers() throws Throwable {
        MockBatteryStatsImpl batteryStats = mStatsRule.getBatteryStats();
        PowerStatsCollector.ConsumedEnergyRetriever consumedEnergyRetriever =
                mock(PowerStatsCollector.ConsumedEnergyRetriever.class);
        when(consumedEnergyRetriever.getVoltageMv()).thenReturn(VOLTAGE_MV);

        batteryStats.setConsumedEnergyRetriever(consumedEnergyRetriever);

        batteryStats.onSystemReady(mContext);

        batteryStats.setPowerStatsCollectorEnabled(BatteryConsumer.POWER_COMPONENT_ANY, true);

        batteryStats.initMeasuredEnergyStats(new String[]{"FOO", "BAR"});
        int componentId0 = BatteryConsumer.FIRST_CUSTOM_POWER_COMPONENT_ID;
        int componentId1 = BatteryConsumer.FIRST_CUSTOM_POWER_COMPONENT_ID + 1;

        synchronized (batteryStats) {
            batteryStats.getUidStatsLocked(APP_UID);
        when(consumedEnergyRetriever.getEnergyConsumerIds(anyInt()))
                .thenReturn(new int[]{componentId0, componentId1});
        when(consumedEnergyRetriever.getEnergyConsumerName(componentId0)).thenReturn("FOO");
        when(consumedEnergyRetriever.getEnergyConsumerName(componentId1)).thenReturn("BAR");

            SparseLongArray uidEnergies = new SparseLongArray();
            uidEnergies.put(APP_UID, 30_000_000);
            batteryStats.updateCustomEnergyConsumerStatsLocked(0, 100_000_000, uidEnergies);
            batteryStats.updateCustomEnergyConsumerStatsLocked(1, 200_000_000, uidEnergies);
        }
        // Establish a baseline
        mMockClock.advance(100000);
        when(consumedEnergyRetriever.getConsumedEnergy(new int[]{componentId0})).thenReturn(
                new EnergyConsumerResult[]{mockEnergyConsumer(0, 0)});
        when(consumedEnergyRetriever.getConsumedEnergy(new int[]{componentId1})).thenReturn(
                new EnergyConsumerResult[]{mockEnergyConsumer(0, 0)});
        batteryStats.collectPowerStatsSamples();

        BatteryUsageStatsProvider provider = new BatteryUsageStatsProvider(mContext,
                mock(PowerAttributor.class), mStatsRule.getPowerProfile(),
                mStatsRule.getCpuScalingPolicies(), mock(PowerStatsStore.class), 0, mMockClock,
                mMonotonicClock);
        mMockClock.advance(100000);
        when(consumedEnergyRetriever.getConsumedEnergy(new int[]{componentId0})).thenReturn(
                new EnergyConsumerResult[]{mockEnergyConsumer(100_000_000, 30_000_000)});
        when(consumedEnergyRetriever.getConsumedEnergy(new int[]{componentId1})).thenReturn(
                new EnergyConsumerResult[]{mockEnergyConsumer(200_000_000, 30_000_000)});

        batteryStats.collectPowerStatsSamples();

        BatteryUsageStatsProvider provider = createBatteryUsageStatsProvider(0);

        PowerStatsStore powerStatsStore = mock(PowerStatsStore.class);
        doAnswer(invocation -> {
@@ -856,6 +865,15 @@ public class BatteryUsageStatsProviderTest {
        verify(powerStatsStore).storeBatteryUsageStatsAsync(anyLong(), any());
    }

    private EnergyConsumerResult mockEnergyConsumer(long chargeUc, long appChargeUc) {
        EnergyConsumerResult ecr = new EnergyConsumerResult();
        ecr.energyUWs = chargeUc * VOLTAGE_MV / 1000;
        ecr.attribution = new EnergyConsumerAttribution[]{new EnergyConsumerAttribution()};
        ecr.attribution[0].uid = APP_UID;
        ecr.attribution[0].energyUWs = appChargeUc * VOLTAGE_MV / 1000;
        return ecr;
    }

    @Test
    public void testAggregateBatteryStats_incompatibleSnapshot() throws IOException {
        MockBatteryStatsImpl batteryStats = mStatsRule.getBatteryStats();
Loading