summaryrefslogtreecommitdiff
path: root/tests/BatteryStatsPerfTest
diff options
context:
space:
mode:
author Dmitri Plotnikov <dplotnikov@google.com> 2021-06-24 12:06:30 -0700
committer Dmitri Plotnikov <dplotnikov@google.com> 2021-06-24 15:09:47 -0700
commit72df58efc63823cc73fde83f43f4eb5de2d099f1 (patch)
tree8d0b6effba3e5c2c4af545238c27f8704dbc9a42 /tests/BatteryStatsPerfTest
parentd2b84e485e8b5fef203c713171115d132d065b62 (diff)
Add perf test for BatteryUsageStats transfer over Binder
Bug: 192004350 Test: atest BatteryUsageStatsPerfTest Change-Id: Ie950f6d857287cf7fc6838c32f236a529c9e3140
Diffstat (limited to 'tests/BatteryStatsPerfTest')
-rw-r--r--tests/BatteryStatsPerfTest/AndroidManifest.xml2
-rw-r--r--tests/BatteryStatsPerfTest/src/com/android/internal/os/BatteryUsageStatsPerfTest.java129
2 files changed, 130 insertions, 1 deletions
diff --git a/tests/BatteryStatsPerfTest/AndroidManifest.xml b/tests/BatteryStatsPerfTest/AndroidManifest.xml
index 7633d5283f5e..ab5728e75b9f 100644
--- a/tests/BatteryStatsPerfTest/AndroidManifest.xml
+++ b/tests/BatteryStatsPerfTest/AndroidManifest.xml
@@ -20,6 +20,8 @@
<application>
<uses-library android:name="android.test.runner" />
+ <service android:name="com.android.internal.os.BatteryUsageStatsPerfTest$BatteryUsageStatsService"
+ android:process=":BatteryUsageStatsService" />
</application>
<instrumentation android:name="androidx.test.runner.AndroidJUnitRunner"
diff --git a/tests/BatteryStatsPerfTest/src/com/android/internal/os/BatteryUsageStatsPerfTest.java b/tests/BatteryStatsPerfTest/src/com/android/internal/os/BatteryUsageStatsPerfTest.java
index 54d70478f762..2e4b6da3ba13 100644
--- a/tests/BatteryStatsPerfTest/src/com/android/internal/os/BatteryUsageStatsPerfTest.java
+++ b/tests/BatteryStatsPerfTest/src/com/android/internal/os/BatteryUsageStatsPerfTest.java
@@ -18,13 +18,25 @@ package com.android.internal.os;
import static com.google.common.truth.Truth.assertThat;
+import android.app.Service;
+import android.content.ComponentName;
import android.content.Context;
+import android.content.Intent;
+import android.content.ServiceConnection;
+import android.os.BatteryConsumer;
import android.os.BatteryStatsManager;
import android.os.BatteryUsageStats;
+import android.os.BatteryUsageStatsQuery;
+import android.os.Binder;
+import android.os.ConditionVariable;
+import android.os.IBinder;
+import android.os.Parcel;
import android.os.UidBatteryConsumer;
import android.perftests.utils.BenchmarkState;
import android.perftests.utils.PerfStatusReporter;
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
import androidx.test.InstrumentationRegistry;
import androidx.test.filters.LargeTest;
import androidx.test.runner.AndroidJUnit4;
@@ -54,7 +66,8 @@ public class BatteryUsageStatsPerfTest {
final BenchmarkState state = mPerfStatusReporter.getBenchmarkState();
while (state.keepRunning()) {
- BatteryUsageStats batteryUsageStats = batteryStatsManager.getBatteryUsageStats();
+ BatteryUsageStats batteryUsageStats = batteryStatsManager.getBatteryUsageStats(
+ new BatteryUsageStatsQuery.Builder().setMaxStatsAgeMs(0).build());
state.pauseTiming();
@@ -71,4 +84,118 @@ public class BatteryUsageStatsPerfTest {
state.resumeTiming();
}
}
+
+ private final ConditionVariable mServiceConnected = new ConditionVariable();
+ private IBinder mService;
+
+ private final ServiceConnection mConnection = new ServiceConnection() {
+ public void onServiceConnected(ComponentName name, IBinder service) {
+ mService = service;
+ mServiceConnected.open();
+ }
+
+ public void onServiceDisconnected(ComponentName name) {
+ mService = null;
+ }
+ };
+
+ /**
+ * Measures the performance of transferring BatteryUsageStats over a Binder.
+ */
+ @Test
+ public void testBatteryUsageStatsTransferOverBinder() throws Exception {
+ final Context context = InstrumentationRegistry.getContext();
+ context.bindService(
+ new Intent(context, BatteryUsageStatsService.class),
+ mConnection, Context.BIND_AUTO_CREATE);
+ mServiceConnected.block(30000);
+ assertThat(mService).isNotNull();
+
+ final BenchmarkState state = mPerfStatusReporter.getBenchmarkState();
+ while (state.keepRunning()) {
+ final Parcel data = Parcel.obtain();
+ final Parcel reply = Parcel.obtain();
+ mService.transact(42, data, reply, 0);
+ final BatteryUsageStats batteryUsageStats =
+ BatteryUsageStats.CREATOR.createFromParcel(reply);
+ reply.recycle();
+ data.recycle();
+
+ state.pauseTiming();
+
+ assertThat(batteryUsageStats.getBatteryCapacity()).isEqualTo(4000);
+ assertThat(batteryUsageStats.getUidBatteryConsumers()).hasSize(1000);
+ final UidBatteryConsumer uidBatteryConsumer =
+ batteryUsageStats.getUidBatteryConsumers().get(0);
+ assertThat(uidBatteryConsumer.getConsumedPower(1)).isEqualTo(123);
+
+ state.resumeTiming();
+ }
+
+ context.unbindService(mConnection);
+ }
+
+ /* This service runs in a separate process */
+ public static class BatteryUsageStatsService extends Service {
+ private final BatteryUsageStats mBatteryUsageStats;
+
+ public BatteryUsageStatsService() {
+ mBatteryUsageStats = buildBatteryUsageStats();
+ }
+
+ @Nullable
+ @Override
+ public IBinder onBind(Intent intent) {
+ return new Binder() {
+ @Override
+ protected boolean onTransact(int code, @NonNull Parcel data, @Nullable Parcel reply,
+ int flags) {
+ mBatteryUsageStats.writeToParcel(reply, 0);
+ return true;
+ }
+ };
+ }
+ }
+
+ private static BatteryUsageStats buildBatteryUsageStats() {
+ final BatteryUsageStats.Builder builder =
+ new BatteryUsageStats.Builder(new String[]{"FOO"}, true)
+ .setBatteryCapacity(4000)
+ .setDischargePercentage(20)
+ .setDischargedPowerRange(1000, 2000)
+ .setStatsStartTimestamp(1000)
+ .setStatsEndTimestamp(3000);
+
+ builder.getAggregateBatteryConsumerBuilder(
+ BatteryUsageStats.AGGREGATE_BATTERY_CONSUMER_SCOPE_ALL_APPS)
+ .setConsumedPower(123)
+ .setConsumedPower(
+ BatteryConsumer.POWER_COMPONENT_CPU, 10100)
+ .setConsumedPowerForCustomComponent(
+ BatteryConsumer.FIRST_CUSTOM_POWER_COMPONENT_ID, 10200)
+ .setUsageDurationMillis(
+ BatteryConsumer.POWER_COMPONENT_CPU, 10300)
+ .setUsageDurationForCustomComponentMillis(
+ BatteryConsumer.FIRST_CUSTOM_POWER_COMPONENT_ID, 10400);
+
+ for (int i = 0; i < 1000; i++) {
+ final UidBatteryConsumer.Builder consumerBuilder =
+ builder.getOrCreateUidBatteryConsumerBuilder(i)
+ .setPackageWithHighestDrain("example.packagename" + i)
+ .setTimeInStateMs(UidBatteryConsumer.STATE_FOREGROUND, i * 2000)
+ .setTimeInStateMs(UidBatteryConsumer.STATE_BACKGROUND, i * 1000);
+ for (int componentId = 0; componentId < BatteryConsumer.POWER_COMPONENT_COUNT;
+ componentId++) {
+ consumerBuilder.setConsumedPower(componentId, componentId * 123.0,
+ BatteryConsumer.POWER_MODEL_POWER_PROFILE);
+ consumerBuilder.setUsageDurationMillis(componentId, componentId * 1000);
+ }
+
+ consumerBuilder.setConsumedPowerForCustomComponent(
+ BatteryConsumer.FIRST_CUSTOM_POWER_COMPONENT_ID, 1234)
+ .setUsageDurationForCustomComponentMillis(
+ BatteryConsumer.FIRST_CUSTOM_POWER_COMPONENT_ID, 4321);
+ }
+ return builder.build();
+ }
}