Fix the filter for getTemperatureThresholds
Add null check and more unit tests for each case
Bug: b/268508448
Test: atest ThermalManagerServiceMockingTest
Change-Id: I28a41964c5ca5e4439c9f51bfe8b44a116f601f8
diff --git a/services/core/java/com/android/server/power/ThermalManagerService.java b/services/core/java/com/android/server/power/ThermalManagerService.java
index 58c814a..e3d2189 100644
--- a/services/core/java/com/android/server/power/ThermalManagerService.java
+++ b/services/core/java/com/android/server/power/ThermalManagerService.java
@@ -741,6 +741,9 @@
final android.hardware.thermal.Temperature[] halRet =
shouldFilter ? mInstance.getTemperaturesWithType(type)
: mInstance.getTemperatures();
+ if (halRet == null) {
+ return ret;
+ }
for (android.hardware.thermal.Temperature t : halRet) {
if (!Temperature.isValidStatus(t.throttlingStatus)) {
Slog.e(TAG, "Invalid temperature status " + t.throttlingStatus
@@ -774,6 +777,9 @@
final android.hardware.thermal.CoolingDevice[] halRet = shouldFilter
? mInstance.getCoolingDevicesWithType(type)
: mInstance.getCoolingDevices();
+ if (halRet == null) {
+ return ret;
+ }
for (android.hardware.thermal.CoolingDevice t : halRet) {
if (!CoolingDevice.isValidType(t.type)) {
Slog.e(TAG, "Invalid cooling device type " + t.type + " from AIDL HAL");
@@ -806,9 +812,14 @@
final TemperatureThreshold[] halRet =
shouldFilter ? mInstance.getTemperatureThresholdsWithType(type)
: mInstance.getTemperatureThresholds();
-
- return Arrays.stream(halRet).filter(t -> t.type == type).collect(
- Collectors.toList());
+ if (halRet == null) {
+ return ret;
+ }
+ if (shouldFilter) {
+ return Arrays.stream(halRet).filter(t -> t.type == type).collect(
+ Collectors.toList());
+ }
+ return Arrays.asList(halRet);
} catch (IllegalArgumentException | IllegalStateException e) {
Slog.e(TAG, "Couldn't getTemperatureThresholds due to invalid status", e);
} catch (RemoteException e) {
diff --git a/services/tests/mockingservicestests/src/com/android/server/power/ThermalManagerServiceMockingTest.java b/services/tests/mockingservicestests/src/com/android/server/power/ThermalManagerServiceMockingTest.java
index 0ae8dfd..aa9d8c6 100644
--- a/services/tests/mockingservicestests/src/com/android/server/power/ThermalManagerServiceMockingTest.java
+++ b/services/tests/mockingservicestests/src/com/android/server/power/ThermalManagerServiceMockingTest.java
@@ -120,6 +120,34 @@
}
@Test
+ public void getCurrentTemperatures_aidl() throws RemoteException {
+ android.hardware.thermal.Temperature halT1 = new android.hardware.thermal.Temperature();
+ halT1.type = TemperatureType.MODEM;
+ halT1.name = "test1";
+ halT1.throttlingStatus = ThrottlingSeverity.EMERGENCY;
+ halT1.value = 99.0f;
+ android.hardware.thermal.Temperature halT2 = new android.hardware.thermal.Temperature();
+ halT2.name = "test2";
+ halT2.type = TemperatureType.SOC;
+ halT2.throttlingStatus = ThrottlingSeverity.NONE;
+
+ Mockito.when(mAidlHalMock.getTemperatures()).thenReturn(
+ new android.hardware.thermal.Temperature[]{
+ halT2, halT1
+ });
+ List<Temperature> ret = mAidlWrapper.getCurrentTemperatures(false, TemperatureType.UNKNOWN);
+ Mockito.verify(mAidlHalMock, Mockito.times(1)).getTemperatures();
+
+ Temperature expectedT1 = new Temperature(halT1.value, halT1.type, halT1.name,
+ halT1.throttlingStatus);
+ Temperature expectedT2 = new Temperature(halT2.value, halT2.type, halT2.name,
+ halT2.throttlingStatus);
+ List<Temperature> expectedRet = List.of(expectedT1, expectedT2);
+ assertTrue("Got temperature list as " + ret + " with different values compared to "
+ + expectedRet, expectedRet.containsAll(ret));
+ }
+
+ @Test
public void getCurrentTemperatures_withFilter_aidl() throws RemoteException {
android.hardware.thermal.Temperature halT1 = new android.hardware.thermal.Temperature();
halT1.type = TemperatureType.MODEM;
@@ -154,6 +182,23 @@
}
@Test
+ public void getCurrentTemperatures_nullResult_aidl() throws RemoteException {
+ Mockito.when(mAidlHalMock.getTemperaturesWithType(Mockito.anyInt())).thenReturn(null);
+ List<Temperature> ret = mAidlWrapper.getCurrentTemperatures(true,
+ Temperature.TYPE_SOC);
+ Mockito.verify(mAidlHalMock, Mockito.times(1)).getTemperaturesWithType(
+ Temperature.TYPE_SOC);
+ assertNotNull(ret);
+ assertEquals(0, ret.size());
+
+ Mockito.when(mAidlHalMock.getTemperatures()).thenReturn(null);
+ ret = mAidlWrapper.getCurrentTemperatures(false, Temperature.TYPE_SOC);
+ Mockito.verify(mAidlHalMock, Mockito.times(1)).getTemperatures();
+ assertNotNull(ret);
+ assertEquals(0, ret.size());
+ }
+
+ @Test
public void getCurrentTemperatures_invalidStatus_aidl() throws RemoteException {
android.hardware.thermal.Temperature halTInvalid =
new android.hardware.thermal.Temperature();
@@ -210,6 +255,55 @@
}
@Test
+ public void getCurrentCoolingDevices_aidl() throws RemoteException {
+ android.hardware.thermal.CoolingDevice halC1 = new android.hardware.thermal.CoolingDevice();
+ halC1.type = CoolingType.SPEAKER;
+ halC1.name = "test1";
+ halC1.value = 10;
+ android.hardware.thermal.CoolingDevice halC2 = new android.hardware.thermal.CoolingDevice();
+ halC2.type = CoolingType.MODEM;
+ halC2.name = "test2";
+ halC2.value = 110;
+
+ Mockito.when(mAidlHalMock.getCoolingDevicesWithType(Mockito.anyInt())).thenReturn(
+ new android.hardware.thermal.CoolingDevice[]{
+ halC1, halC2
+ }
+ );
+ Mockito.when(mAidlHalMock.getCoolingDevices()).thenReturn(
+ new android.hardware.thermal.CoolingDevice[]{
+ halC1, halC2
+ }
+ );
+ List<CoolingDevice> ret = mAidlWrapper.getCurrentCoolingDevices(false,
+ CoolingType.COMPONENT);
+ Mockito.verify(mAidlHalMock, Mockito.times(1)).getCoolingDevices();
+
+ CoolingDevice expectedC1 = new CoolingDevice(halC1.value, halC1.type, halC1.name);
+ CoolingDevice expectedC2 = new CoolingDevice(halC2.value, halC2.type, halC2.name);
+ List<CoolingDevice> expectedRet = List.of(expectedC1, expectedC2);
+ assertTrue("Got cooling device list as " + ret + " with different values compared to "
+ + expectedRet, expectedRet.containsAll(ret));
+ }
+
+ @Test
+ public void getCurrentCoolingDevices_nullResult_aidl() throws RemoteException {
+ Mockito.when(mAidlHalMock.getCoolingDevicesWithType(Mockito.anyInt())).thenReturn(null);
+ List<CoolingDevice> ret = mAidlWrapper.getCurrentCoolingDevices(true,
+ CoolingType.COMPONENT);
+ Mockito.verify(mAidlHalMock, Mockito.times(1)).getCoolingDevicesWithType(
+ CoolingType.COMPONENT);
+ assertNotNull(ret);
+ assertEquals(0, ret.size());
+
+ Mockito.when(mAidlHalMock.getCoolingDevices()).thenReturn(null);
+ ret = mAidlWrapper.getCurrentCoolingDevices(false, CoolingType.COMPONENT);
+ Mockito.verify(mAidlHalMock, Mockito.times(1)).getCoolingDevices();
+ assertNotNull(ret);
+ assertEquals(0, ret.size());
+ }
+
+ @Test
public void getCurrentCoolingDevices_withFilter_aidl() throws RemoteException {
android.hardware.thermal.CoolingDevice halC1 = new android.hardware.thermal.CoolingDevice();
halC1.type = CoolingType.SPEAKER;
@@ -292,6 +386,44 @@
}
@Test
+ public void getTemperatureThresholds_aidl() throws RemoteException {
+ TemperatureThreshold halT1 = new TemperatureThreshold();
+ halT1.name = "test1";
+ halT1.type = Temperature.TYPE_SKIN;
+ halT1.hotThrottlingThresholds = new float[]{1, 2, 3};
+ halT1.coldThrottlingThresholds = new float[]{};
+
+ TemperatureThreshold halT2 = new TemperatureThreshold();
+ halT2.name = "test2";
+ halT2.type = Temperature.TYPE_SOC;
+ halT2.hotThrottlingThresholds = new float[]{};
+ halT2.coldThrottlingThresholds = new float[]{3, 2, 1};
+
+ Mockito.when(mAidlHalMock.getTemperatureThresholds()).thenReturn(
+ new TemperatureThreshold[]{halT1, halT2}
+ );
+ List<TemperatureThreshold> ret = mAidlWrapper.getTemperatureThresholds(false,
+ Temperature.TYPE_UNKNOWN);
+ Mockito.verify(mAidlHalMock, Mockito.times(1)).getTemperatureThresholds();
+
+ assertEquals("Got unexpected temperature thresholds size", 2, ret.size());
+ TemperatureThreshold threshold = ret.get(0).type == Temperature.TYPE_SKIN ? ret.get(0)
+ : ret.get(1);
+
+ assertEquals(halT1.name, threshold.name);
+ assertEquals(halT1.type, threshold.type);
+ assertArrayEquals(halT1.hotThrottlingThresholds, threshold.hotThrottlingThresholds, 0.1f);
+ assertArrayEquals(halT1.coldThrottlingThresholds, threshold.coldThrottlingThresholds, 0.1f);
+
+ threshold = ret.get(0).type == Temperature.TYPE_SOC ? ret.get(0) : ret.get(1);
+
+ assertEquals(halT2.name, threshold.name);
+ assertEquals(halT2.type, threshold.type);
+ assertArrayEquals(halT2.hotThrottlingThresholds, threshold.hotThrottlingThresholds, 0.1f);
+ assertArrayEquals(halT2.coldThrottlingThresholds, threshold.coldThrottlingThresholds, 0.1f);
+ }
+
+ @Test
public void getTemperatureThresholds_withFilter_aidl() throws RemoteException {
TemperatureThreshold halT1 = new TemperatureThreshold();
halT1.name = "test1";
@@ -300,18 +432,18 @@
halT1.coldThrottlingThresholds = new float[]{};
TemperatureThreshold halT2 = new TemperatureThreshold();
- halT1.name = "test2";
- halT1.type = Temperature.TYPE_SOC;
- halT1.hotThrottlingThresholds = new float[]{};
- halT1.coldThrottlingThresholds = new float[]{3, 2, 1};
+ halT2.name = "test2";
+ halT2.type = Temperature.TYPE_SOC;
+ halT2.hotThrottlingThresholds = new float[]{};
+ halT2.coldThrottlingThresholds = new float[]{3, 2, 1};
Mockito.when(mAidlHalMock.getTemperatureThresholdsWithType(Mockito.anyInt())).thenReturn(
new TemperatureThreshold[]{halT1, halT2}
);
List<TemperatureThreshold> ret = mAidlWrapper.getTemperatureThresholds(true,
- Temperature.TYPE_SOC);
+ Temperature.TYPE_SKIN);
Mockito.verify(mAidlHalMock, Mockito.times(1)).getTemperatureThresholdsWithType(
- Temperature.TYPE_SOC);
+ Temperature.TYPE_SKIN);
assertEquals("Got unexpected temperature thresholds size", 1, ret.size());
TemperatureThreshold threshold = ret.get(0);
@@ -322,6 +454,24 @@
}
@Test
+ public void getTemperatureThresholds_nullResult_aidl() throws RemoteException {
+ Mockito.when(mAidlHalMock.getTemperatureThresholdsWithType(Mockito.anyInt())).thenReturn(
+ null);
+ List<TemperatureThreshold> ret = mAidlWrapper.getTemperatureThresholds(true,
+ Temperature.TYPE_SOC);
+ Mockito.verify(mAidlHalMock, Mockito.times(1)).getTemperatureThresholdsWithType(
+ Temperature.TYPE_SOC);
+ assertNotNull(ret);
+ assertEquals(0, ret.size());
+
+ Mockito.when(mAidlHalMock.getTemperatureThresholds()).thenReturn(null);
+ ret = mAidlWrapper.getTemperatureThresholds(false, Temperature.TYPE_SOC);
+ Mockito.verify(mAidlHalMock, Mockito.times(1)).getTemperatureThresholds();
+ assertNotNull(ret);
+ assertEquals(0, ret.size());
+ }
+
+ @Test
public void getTemperatureThresholds_illegalArgument_aidl() throws RemoteException {
Mockito.when(mAidlHalMock.getTemperatureThresholdsWithType(Mockito.anyInt())).thenThrow(
new IllegalArgumentException());