Merge "Add error handling for checked exceptions from Thermal AIDL HAL"

This commit is contained in:
Xiang Wang
2022-12-21 02:34:03 +00:00
committed by Android (Google) Code Review
2 changed files with 169 additions and 2 deletions

View File

@@ -746,6 +746,8 @@ public class ThermalManagerService extends SystemService {
}
ret.add(new Temperature(t.value, t.type, t.name, t.throttlingStatus));
}
} catch (IllegalArgumentException | IllegalStateException e) {
Slog.e(TAG, "Couldn't getCurrentCoolingDevices due to invalid status", e);
} catch (RemoteException e) {
Slog.e(TAG, "Couldn't getCurrentTemperatures, reconnecting", e);
connectToHal();
@@ -776,6 +778,8 @@ public class ThermalManagerService extends SystemService {
}
ret.add(new CoolingDevice(t.value, t.type, t.name));
}
} catch (IllegalArgumentException | IllegalStateException e) {
Slog.e(TAG, "Couldn't getCurrentCoolingDevices due to invalid status", e);
} catch (RemoteException e) {
Slog.e(TAG, "Couldn't getCurrentCoolingDevices, reconnecting", e);
connectToHal();
@@ -799,6 +803,8 @@ public class ThermalManagerService extends SystemService {
return Arrays.stream(halRet).filter(t -> t.type == type).collect(
Collectors.toList());
} catch (IllegalArgumentException | IllegalStateException e) {
Slog.e(TAG, "Couldn't getTemperatureThresholds due to invalid status", e);
} catch (RemoteException e) {
Slog.e(TAG, "Couldn't getTemperatureThresholds, reconnecting...", e);
connectToHal();
@@ -824,15 +830,30 @@ public class ThermalManagerService extends SystemService {
mInstance = IThermal.Stub.asInterface(binder);
try {
binder.linkToDeath(this, 0);
mInstance.registerThermalChangedCallback(mThermalChangedCallback);
} catch (RemoteException e) {
Slog.e(TAG, "Unable to connect IThermal AIDL instance", e);
mInstance = null;
}
if (mInstance != null) {
registerThermalChangedCallback();
}
}
}
}
@VisibleForTesting
void registerThermalChangedCallback() {
try {
mInstance.registerThermalChangedCallback(mThermalChangedCallback);
} catch (IllegalArgumentException | IllegalStateException e) {
Slog.e(TAG, "Couldn't registerThermalChangedCallback due to invalid status",
e);
} catch (RemoteException e) {
Slog.e(TAG, "Unable to connect IThermal AIDL instance", e);
mInstance = null;
}
}
@Override
protected void dump(PrintWriter pw, String prefix) {
synchronized (mHalLock) {

View File

@@ -18,6 +18,7 @@ package com.android.server.power;
import static org.junit.Assert.assertArrayEquals;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertTrue;
import android.hardware.thermal.CoolingType;
@@ -83,6 +84,42 @@ public class ThermalManagerServiceMockingTest {
assertEquals(halT.throttlingStatus, temperature.getStatus());
}
@Test
public void setCallback_illegalState_aidl() throws Exception {
Mockito.doThrow(new IllegalStateException()).when(
mAidlHalMock).registerThermalChangedCallback(Mockito.any());
verifyWrapperStatusOnCallbackError();
}
@Test
public void setCallback_illegalArgument_aidl() throws Exception {
Mockito.doThrow(new IllegalStateException()).when(
mAidlHalMock).registerThermalChangedCallback(Mockito.any());
verifyWrapperStatusOnCallbackError();
}
void verifyWrapperStatusOnCallbackError() throws RemoteException {
android.hardware.thermal.Temperature halT1 = new android.hardware.thermal.Temperature();
halT1.type = TemperatureType.MODEM;
halT1.name = "test1";
Mockito.when(mAidlHalMock.getTemperaturesWithType(Mockito.anyInt())).thenReturn(
new android.hardware.thermal.Temperature[]{
halT1
});
List<Temperature> ret = mAidlWrapper.getCurrentTemperatures(true, TemperatureType.MODEM);
Mockito.verify(mAidlHalMock, Mockito.times(1)).getTemperaturesWithType(
TemperatureType.MODEM);
assertNotNull(ret);
Temperature expectedT1 = new Temperature(halT1.value, halT1.type, halT1.name,
halT1.throttlingStatus);
List<Temperature> expectedRet = List.of(expectedT1);
// test that even if the callback fails to register without hal connection error, the
// wrapper should still work
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();
@@ -135,7 +172,42 @@ public class ThermalManagerServiceMockingTest {
List<Temperature> expectedRet = List.of(
new Temperature(halTInvalid.value, halTInvalid.type, halTInvalid.name,
ThrottlingSeverity.NONE));
assertEquals(expectedRet, ret);
assertTrue("Got temperature list as " + ret + " with different values compared to "
+ expectedRet, expectedRet.containsAll(ret));
}
@Test
public void getCurrentTemperatures_illegalArgument_aidl() throws RemoteException {
Mockito.when(mAidlHalMock.getTemperatures()).thenThrow(new IllegalArgumentException());
List<Temperature> ret = mAidlWrapper.getCurrentTemperatures(false, 0);
Mockito.verify(mAidlHalMock, Mockito.times(1)).getTemperatures();
assertNotNull(ret);
assertEquals(0, ret.size());
Mockito.when(mAidlHalMock.getTemperaturesWithType(TemperatureType.MODEM)).thenThrow(
new IllegalArgumentException());
ret = mAidlWrapper.getCurrentTemperatures(true, TemperatureType.MODEM);
Mockito.verify(mAidlHalMock, Mockito.times(1)).getTemperaturesWithType(
TemperatureType.MODEM);
assertNotNull(ret);
assertEquals(0, ret.size());
}
@Test
public void getCurrentTemperatures_illegalState_aidl() throws RemoteException {
Mockito.when(mAidlHalMock.getTemperatures()).thenThrow(new IllegalStateException());
List<Temperature> ret = mAidlWrapper.getCurrentTemperatures(false, 0);
Mockito.verify(mAidlHalMock, Mockito.times(1)).getTemperatures();
assertNotNull(ret);
assertEquals(0, ret.size());
Mockito.when(mAidlHalMock.getTemperaturesWithType(TemperatureType.MODEM)).thenThrow(
new IllegalStateException());
ret = mAidlWrapper.getCurrentTemperatures(true, TemperatureType.MODEM);
Mockito.verify(mAidlHalMock, Mockito.times(1)).getTemperaturesWithType(
TemperatureType.MODEM);
assertNotNull(ret);
assertEquals(0, ret.size());
}
@Test
@@ -186,6 +258,40 @@ public class ThermalManagerServiceMockingTest {
assertTrue("Got cooling device list as " + ret + ", expecting empty list", ret.isEmpty());
}
@Test
public void getCurrentCoolingDevices_illegalArgument_aidl() throws RemoteException {
Mockito.when(mAidlHalMock.getCoolingDevices()).thenThrow(new IllegalArgumentException());
List<CoolingDevice> ret = mAidlWrapper.getCurrentCoolingDevices(false, 0);
Mockito.verify(mAidlHalMock, Mockito.times(1)).getCoolingDevices();
assertNotNull(ret);
assertEquals(0, ret.size());
Mockito.when(mAidlHalMock.getCoolingDevicesWithType(Mockito.anyInt())).thenThrow(
new IllegalArgumentException());
ret = mAidlWrapper.getCurrentCoolingDevices(true, CoolingType.SPEAKER);
Mockito.verify(mAidlHalMock, Mockito.times(1)).getCoolingDevicesWithType(
CoolingType.SPEAKER);
assertNotNull(ret);
assertEquals(0, ret.size());
}
@Test
public void getCurrentCoolingDevices_illegalState_aidl() throws RemoteException {
Mockito.when(mAidlHalMock.getCoolingDevices()).thenThrow(new IllegalStateException());
List<CoolingDevice> ret = mAidlWrapper.getCurrentCoolingDevices(false, 0);
Mockito.verify(mAidlHalMock, Mockito.times(1)).getCoolingDevices();
assertNotNull(ret);
assertEquals(0, ret.size());
Mockito.when(mAidlHalMock.getCoolingDevicesWithType(Mockito.anyInt())).thenThrow(
new IllegalStateException());
ret = mAidlWrapper.getCurrentCoolingDevices(true, CoolingType.SPEAKER);
Mockito.verify(mAidlHalMock, Mockito.times(1)).getCoolingDevicesWithType(
CoolingType.SPEAKER);
assertNotNull(ret);
assertEquals(0, ret.size());
}
@Test
public void getTemperatureThresholds_withFilter_aidl() throws RemoteException {
TemperatureThreshold halT1 = new TemperatureThreshold();
@@ -215,4 +321,44 @@ public class ThermalManagerServiceMockingTest {
assertArrayEquals(halT1.hotThrottlingThresholds, threshold.hotThrottlingThresholds, 0.1f);
assertArrayEquals(halT1.coldThrottlingThresholds, threshold.coldThrottlingThresholds, 0.1f);
}
@Test
public void getTemperatureThresholds_illegalArgument_aidl() throws RemoteException {
Mockito.when(mAidlHalMock.getTemperatureThresholdsWithType(Mockito.anyInt())).thenThrow(
new IllegalArgumentException());
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()).thenThrow(
new IllegalArgumentException());
ret = mAidlWrapper.getTemperatureThresholds(false,
Temperature.TYPE_SOC);
Mockito.verify(mAidlHalMock, Mockito.times(1)).getTemperatureThresholds();
assertNotNull(ret);
assertEquals(0, ret.size());
}
@Test
public void getTemperatureThresholds_illegalState_aidl() throws RemoteException {
Mockito.when(mAidlHalMock.getTemperatureThresholdsWithType(Mockito.anyInt())).thenThrow(
new IllegalStateException());
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()).thenThrow(
new IllegalStateException());
ret = mAidlWrapper.getTemperatureThresholds(false,
Temperature.TYPE_SOC);
Mockito.verify(mAidlHalMock, Mockito.times(1)).getTemperatureThresholds();
assertNotNull(ret);
assertEquals(0, ret.size());
}
}