This first CL adds a class, PowerProfile that parses the power profile xml file into a set of individual *Profile classes, one for each of the hardware "components." There will be more to come. This library will be used to compute the power model from a batterystats or statsd dump, with abstractions so clients don't need to know all of the nuances of batterystats' old versions, or statsd's configs. Test: atest frameworks/base/tools/powermodel --host Change-Id: I79802f91234b09539072d10f15534cef391fe04a
160 lines
7.7 KiB
Java
160 lines
7.7 KiB
Java
/*
|
|
* Copyright (C) 2018 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.
|
|
*/
|
|
|
|
package com.android.powermodel;
|
|
|
|
import java.io.InputStream;
|
|
|
|
import com.android.powermodel.component.CpuProfile;
|
|
import com.android.powermodel.component.AudioProfile;
|
|
import com.android.powermodel.component.BluetoothProfile;
|
|
import com.android.powermodel.component.CameraProfile;
|
|
import com.android.powermodel.component.FlashlightProfile;
|
|
import com.android.powermodel.component.GpsProfile;
|
|
import com.android.powermodel.component.ModemProfile;
|
|
import com.android.powermodel.component.ScreenProfile;
|
|
import com.android.powermodel.component.VideoProfile;
|
|
import com.android.powermodel.component.WifiProfile;
|
|
import org.junit.Assert;
|
|
import org.junit.Test;
|
|
|
|
/*
|
|
* Additional tests needed:
|
|
* - CPU clusters with mismatching counts of speeds and coefficients
|
|
* - Extra fields
|
|
* - Name listed twice
|
|
*/
|
|
|
|
/**
|
|
* Tests {@link PowerProfile}
|
|
*/
|
|
public class PowerProfileTest {
|
|
private static final float EPSILON = 0.00001f;
|
|
|
|
private static InputStream loadPowerProfileStream() {
|
|
return PowerProfileTest.class.getResourceAsStream("/power_profile.xml");
|
|
}
|
|
|
|
@Test public void testReadGood() throws Exception {
|
|
final InputStream is = loadPowerProfileStream();
|
|
|
|
final PowerProfile profile = PowerProfile.parse(is);
|
|
|
|
// Audio
|
|
final AudioProfile audio = (AudioProfile)profile.getComponent(Component.AUDIO);
|
|
Assert.assertEquals(12.0f, audio.onMa, EPSILON);
|
|
|
|
// Bluetooth
|
|
final BluetoothProfile bluetooth
|
|
= (BluetoothProfile)profile.getComponent(Component.BLUETOOTH);
|
|
Assert.assertEquals(0.02f, bluetooth.idleMa, EPSILON);
|
|
Assert.assertEquals(3.0f, bluetooth.rxMa, EPSILON);
|
|
Assert.assertEquals(5.0f, bluetooth.txMa, EPSILON);
|
|
|
|
// Camera
|
|
final CameraProfile camera = (CameraProfile)profile.getComponent(Component.CAMERA);
|
|
Assert.assertEquals(941.0f, camera.onMa, EPSILON);
|
|
|
|
// CPU
|
|
final CpuProfile cpu = (CpuProfile)profile.getComponent(Component.CPU);
|
|
Assert.assertEquals(1.3f, cpu.suspendMa, EPSILON);
|
|
Assert.assertEquals(3.9f, cpu.idleMa, EPSILON);
|
|
Assert.assertEquals(18.33f, cpu.activeMa, EPSILON);
|
|
Assert.assertEquals(2, cpu.clusters.length);
|
|
// Cluster 0
|
|
Assert.assertEquals(4, cpu.clusters[0].coreCount);
|
|
Assert.assertEquals(2.41f, cpu.clusters[0].onMa, EPSILON);
|
|
Assert.assertEquals(9, cpu.clusters[0].frequencies.length, EPSILON);
|
|
Assert.assertEquals(100000, cpu.clusters[0].frequencies[0].speedHz);
|
|
Assert.assertEquals(0.29f, cpu.clusters[0].frequencies[0].onMa, EPSILON);
|
|
Assert.assertEquals(303200, cpu.clusters[0].frequencies[1].speedHz);
|
|
Assert.assertEquals(0.63f, cpu.clusters[0].frequencies[1].onMa, EPSILON);
|
|
Assert.assertEquals(380000, cpu.clusters[0].frequencies[2].speedHz);
|
|
Assert.assertEquals(1.23f, cpu.clusters[0].frequencies[2].onMa, EPSILON);
|
|
Assert.assertEquals(476000, cpu.clusters[0].frequencies[3].speedHz);
|
|
Assert.assertEquals(1.24f, cpu.clusters[0].frequencies[3].onMa, EPSILON);
|
|
Assert.assertEquals(552800, cpu.clusters[0].frequencies[4].speedHz);
|
|
Assert.assertEquals(2.47f, cpu.clusters[0].frequencies[4].onMa, EPSILON);
|
|
Assert.assertEquals(648800, cpu.clusters[0].frequencies[5].speedHz);
|
|
Assert.assertEquals(2.54f, cpu.clusters[0].frequencies[5].onMa, EPSILON);
|
|
Assert.assertEquals(725600, cpu.clusters[0].frequencies[6].speedHz);
|
|
Assert.assertEquals(3.60f, cpu.clusters[0].frequencies[6].onMa, EPSILON);
|
|
Assert.assertEquals(802400, cpu.clusters[0].frequencies[7].speedHz);
|
|
Assert.assertEquals(3.64f, cpu.clusters[0].frequencies[7].onMa, EPSILON);
|
|
Assert.assertEquals(879200, cpu.clusters[0].frequencies[8].speedHz);
|
|
Assert.assertEquals(4.42f, cpu.clusters[0].frequencies[8].onMa, EPSILON);
|
|
// Cluster 1
|
|
Assert.assertEquals(2, cpu.clusters[1].coreCount);
|
|
Assert.assertEquals(5.29f, cpu.clusters[1].onMa, EPSILON);
|
|
Assert.assertEquals(7, cpu.clusters[1].frequencies.length, EPSILON);
|
|
Assert.assertEquals(825600, cpu.clusters[1].frequencies[0].speedHz);
|
|
Assert.assertEquals(28.98f, cpu.clusters[1].frequencies[0].onMa, EPSILON);
|
|
Assert.assertEquals(902400, cpu.clusters[1].frequencies[1].speedHz);
|
|
Assert.assertEquals(31.40f, cpu.clusters[1].frequencies[1].onMa, EPSILON);
|
|
Assert.assertEquals(979200, cpu.clusters[1].frequencies[2].speedHz);
|
|
Assert.assertEquals(33.33f, cpu.clusters[1].frequencies[2].onMa, EPSILON);
|
|
Assert.assertEquals(1056000, cpu.clusters[1].frequencies[3].speedHz);
|
|
Assert.assertEquals(40.12f, cpu.clusters[1].frequencies[3].onMa, EPSILON);
|
|
Assert.assertEquals(1209600, cpu.clusters[1].frequencies[4].speedHz);
|
|
Assert.assertEquals(44.10f, cpu.clusters[1].frequencies[4].onMa, EPSILON);
|
|
Assert.assertEquals(1286400, cpu.clusters[1].frequencies[5].speedHz);
|
|
Assert.assertEquals(90.14f, cpu.clusters[1].frequencies[5].onMa, EPSILON);
|
|
Assert.assertEquals(1363200, cpu.clusters[1].frequencies[6].speedHz);
|
|
Assert.assertEquals(100f, cpu.clusters[1].frequencies[6].onMa, EPSILON);
|
|
|
|
// Flashlight
|
|
final FlashlightProfile flashlight
|
|
= (FlashlightProfile)profile.getComponent(Component.FLASHLIGHT);
|
|
Assert.assertEquals(1233.47f, flashlight.onMa, EPSILON);
|
|
|
|
// GPS
|
|
final GpsProfile gps = (GpsProfile)profile.getComponent(Component.GPS);
|
|
Assert.assertEquals(1.0f, gps.onMa, EPSILON);
|
|
Assert.assertEquals(2, gps.signalQualityMa.length);
|
|
Assert.assertEquals(88.0f, gps.signalQualityMa[0], EPSILON);
|
|
Assert.assertEquals(7.0f, gps.signalQualityMa[1], EPSILON);
|
|
|
|
// Modem
|
|
final ModemProfile modem = (ModemProfile)profile.getComponent(Component.MODEM);
|
|
Assert.assertEquals(1.0f, modem.sleepMa, EPSILON);
|
|
Assert.assertEquals(44.0f, modem.idleMa, EPSILON);
|
|
Assert.assertEquals(12.0f, modem.scanningMa, EPSILON);
|
|
Assert.assertEquals(11.0f, modem.rxMa, EPSILON);
|
|
Assert.assertEquals(5, modem.txMa.length);
|
|
Assert.assertEquals(16.0f, modem.txMa[0], EPSILON);
|
|
Assert.assertEquals(19.0f, modem.txMa[1], EPSILON);
|
|
Assert.assertEquals(22.0f, modem.txMa[2], EPSILON);
|
|
Assert.assertEquals(73.0f, modem.txMa[3], EPSILON);
|
|
Assert.assertEquals(132.0f, modem.txMa[4], EPSILON);
|
|
|
|
// Screen
|
|
final ScreenProfile screen = (ScreenProfile)profile.getComponent(Component.SCREEN);
|
|
Assert.assertEquals(102.4f, screen.onMa, EPSILON);
|
|
Assert.assertEquals(1234.0f, screen.fullMa, EPSILON);
|
|
Assert.assertEquals(12.0f, screen.ambientMa, EPSILON);
|
|
|
|
// Video
|
|
final VideoProfile video = (VideoProfile)profile.getComponent(Component.VIDEO);
|
|
Assert.assertEquals(123.0f, video.onMa, EPSILON);
|
|
|
|
// Wifi
|
|
final WifiProfile wifi = (WifiProfile)profile.getComponent(Component.WIFI);
|
|
Assert.assertEquals(2.0f, wifi.idleMa, EPSILON);
|
|
Assert.assertEquals(123.0f, wifi.rxMa, EPSILON);
|
|
Assert.assertEquals(333.0f, wifi.txMa, EPSILON);
|
|
}
|
|
}
|