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

Commit c90b10e2 authored by Dmitri Plotnikov's avatar Dmitri Plotnikov
Browse files

[Attempt 2] Add test for BatteryUsageStatsPerUid atom

Bug: 353323761
Bug: 353731368
Test: atest PowerStatsTestsRavenwood; atest PowerStatsTests
Flag: com.android.server.power.optimization.add_battery_usage_stats_slice_atom
Change-Id: I1d783b10253005bb308355955a79b0d73f23be5f
parent 5fe91634
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -119,7 +119,7 @@
        "PowerComponents\\.java",
        "[^/]*BatteryConsumer[^/]*\\.java"
      ],
      "name": "BatteryUsageStatsProtoTests"
      "name": "PowerStatsTests"
    },
    {
      "file_patterns": ["SharedMemory[^/]*\\.java"],
+1 −1
Original line number Diff line number Diff line
@@ -18,7 +18,7 @@
        "Kernel[^/]*\\.java",
        "[^/]*Power[^/]*\\.java"
      ],
      "name": "BatteryUsageStatsProtoTests"
      "name": "PowerStatsTests"
    },
    {
      "file_patterns": [
+0 −30
Original line number Diff line number Diff line
package {
    // See: http://go/android-license-faq
    // A large-scale-change added 'default_applicable_licenses' to import
    // all of the 'license_kinds' from "frameworks_base_license"
    // to get the below license kinds:
    //   SPDX-license-identifier-Apache-2.0
    default_applicable_licenses: ["frameworks_base_license"],
}

android_test {
    name: "BatteryUsageStatsProtoTests",
    srcs: ["src/**/*.java"],

    static_libs: [
        "androidx.test.rules",
        "junit",
        "mockito-target-minus-junit4",
        "platform-test-annotations",
        "platformprotosnano",
        "statsdprotolite",
        "truth",
    ],

    libs: ["android.test.runner"],

    platform_apis: true,
    certificate: "platform",

    test_suites: ["device-tests"],
}
+0 −28
Original line number Diff line number Diff line
<?xml version="1.0" encoding="utf-8"?>
<!--
  ~ Copyright (C) 2021 The Android Open Source Project
  ~
  ~ Licensed under the Apache License, Version 2.0 (the "License");
  ~ you may not use this file except in compliance with the License.
  ~ You may obtain a copy of the License at
  ~
  ~      http://www.apache.org/licenses/LICENSE-2.0
  ~
  ~ Unless required by applicable law or agreed to in writing, software
  ~ distributed under the License is distributed on an "AS IS" BASIS,
  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  ~ See the License for the specific language governing permissions and
  ~ limitations under the License.
  -->

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
          package="com.android.frameworks.core.batteryusagestatsprototests">

    <uses-permission android:name="android.permission.BATTERY_STATS"/>

    <instrumentation
        android:name="androidx.test.runner.AndroidJUnitRunner"
        android:targetPackage="com.android.frameworks.core.batteryusagestatsprototests"
        android:label="BatteryUsageStats Proto Tests" />

</manifest>
+47 −9
Original line number Diff line number Diff line
@@ -102,6 +102,7 @@ import android.util.StatsEvent;

import com.android.internal.R;
import com.android.internal.annotations.GuardedBy;
import com.android.internal.annotations.VisibleForTesting;
import com.android.internal.app.IBatteryStats;
import com.android.internal.os.BinderCallsStats;
import com.android.internal.os.Clock;
@@ -1191,7 +1192,7 @@ public final class BatteryStatsService extends IBatteryStats.Stub
                                    .setMinConsumedPowerThreshold(minConsumedPowerThreshold)
                                    .build();
                    bus = getBatteryUsageStats(List.of(query)).get(0);
                    return StatsPerUidLogger.logStats(bus, data);
                    return new StatsPerUidLogger(new FrameworkStatsLogger()).logStats(bus, data);
                }
                default:
                    throw new UnsupportedOperationException("Unknown tagId=" + atomTag);
@@ -1204,7 +1205,35 @@ public final class BatteryStatsService extends IBatteryStats.Stub
        }
    }

    private static class StatsPerUidLogger {
    public static class FrameworkStatsLogger {
        /**
         * Wrapper for the FrameworkStatsLog.buildStatsEvent method that makes it easier
         * for mocking.
         */
        @VisibleForTesting
        public StatsEvent buildStatsEvent(long sessionStartTs, long sessionEndTs,
                long sessionDuration, int sessionDischargePercentage, long sessionDischargeDuration,
                int uid, @BatteryConsumer.ProcessState int processState, long timeInStateMillis,
                String powerComponentName, float totalConsumedPowerMah, float powerComponentMah,
                long powerComponentDurationMillis) {
            return FrameworkStatsLog.buildStatsEvent(
                    FrameworkStatsLog.BATTERY_USAGE_STATS_PER_UID,
                    sessionStartTs,
                    sessionEndTs,
                    sessionDuration,
                    sessionDischargePercentage,
                    sessionDischargeDuration,
                    uid,
                    processState,
                    timeInStateMillis,
                    powerComponentName,
                    totalConsumedPowerMah,
                    powerComponentMah,
                    powerComponentDurationMillis);
        }
    }

    public static class StatsPerUidLogger {

        private static final int STATSD_METRIC_MAX_DIMENSIONS_COUNT = 3000;

@@ -1224,7 +1253,18 @@ public final class BatteryStatsService extends IBatteryStats.Stub
                long dischargeDuration) {}
        ;

        static int logStats(BatteryUsageStats bus, List<StatsEvent> data) {
        private final FrameworkStatsLogger mFrameworkStatsLogger;

        public StatsPerUidLogger(FrameworkStatsLogger frameworkStatsLogger) {
            mFrameworkStatsLogger = frameworkStatsLogger;
        }

        /**
         * Generates StatsEvents for the supplied battery usage stats and adds them to
         * the supplied list.
         */
        @VisibleForTesting
        public int logStats(BatteryUsageStats bus, List<StatsEvent> data) {
            final SessionInfo sessionInfo =
                    new SessionInfo(
                            bus.getStatsStartTimestamp(),
@@ -1340,7 +1380,7 @@ public final class BatteryStatsService extends IBatteryStats.Stub
            return StatsManager.PULL_SUCCESS;
        }

        private static boolean addStatsForPredefinedComponent(
        private boolean addStatsForPredefinedComponent(
                List<StatsEvent> data,
                SessionInfo sessionInfo,
                int uid,
@@ -1380,7 +1420,7 @@ public final class BatteryStatsService extends IBatteryStats.Stub
                    powerComponentDurationMillis);
        }

        private static boolean addStatsForCustomComponent(
        private boolean addStatsForCustomComponent(
                List<StatsEvent> data,
                SessionInfo sessionInfo,
                int uid,
@@ -1422,7 +1462,7 @@ public final class BatteryStatsService extends IBatteryStats.Stub
         * Returns true on success and false if reached max atoms capacity and no more atoms should
         * be added
         */
        private static boolean addStatsAtom(
        private boolean addStatsAtom(
                List<StatsEvent> data,
                SessionInfo sessionInfo,
                int uid,
@@ -1432,9 +1472,7 @@ public final class BatteryStatsService extends IBatteryStats.Stub
                float totalConsumedPowerMah,
                float powerComponentMah,
                long powerComponentDurationMillis) {
            data.add(
                    FrameworkStatsLog.buildStatsEvent(
                            FrameworkStatsLog.BATTERY_USAGE_STATS_PER_UID,
            data.add(mFrameworkStatsLogger.buildStatsEvent(
                            sessionInfo.startTs(),
                            sessionInfo.endTs(),
                            sessionInfo.duration(),
Loading