From 97e5b65afaba96554e744b4059c2ac8b06e4b9b5 Mon Sep 17 00:00:00 2001 From: Xiang Wang Date: Thu, 9 Feb 2023 15:58:40 -0800 Subject: [PATCH] Fix the filter for getTemperatureThresholds Add null check and more unit tests for each case Bug: b/268508448 Test: atest ThermalManagerServiceMockingTest Change-Id: I28a41964c5ca5e4439c9f51bfe8b44a116f601f8 --- .../server/power/ThermalManagerService.java | 17 +- .../ThermalManagerServiceMockingTest.java | 162 +++++++++++++++++- 2 files changed, 170 insertions(+), 9 deletions(-) diff --git a/services/core/java/com/android/server/power/ThermalManagerService.java b/services/core/java/com/android/server/power/ThermalManagerService.java index 58c814a7ad3e6..e3d2189f981bd 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 @@ public class ThermalManagerService extends SystemService { 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 @@ public class ThermalManagerService extends SystemService { 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 @@ public class ThermalManagerService extends SystemService { 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 0ae8dfdce6cc0..aa9d8c6ea713a 100644 --- a/services/tests/mockingservicestests/src/com/android/server/power/ThermalManagerServiceMockingTest.java +++ b/services/tests/mockingservicestests/src/com/android/server/power/ThermalManagerServiceMockingTest.java @@ -119,6 +119,34 @@ public class ThermalManagerServiceMockingTest { + expectedRet, expectedRet.containsAll(ret)); } + @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 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 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(); @@ -153,6 +181,23 @@ public class ThermalManagerServiceMockingTest { + expectedRet, expectedRet.containsAll(ret)); } + @Test + public void getCurrentTemperatures_nullResult_aidl() throws RemoteException { + Mockito.when(mAidlHalMock.getTemperaturesWithType(Mockito.anyInt())).thenReturn(null); + List 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 = @@ -209,6 +254,55 @@ public class ThermalManagerServiceMockingTest { assertEquals(0, ret.size()); } + @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 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 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 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(); @@ -291,6 +385,44 @@ public class ThermalManagerServiceMockingTest { assertEquals(0, ret.size()); } + @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 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(); @@ -300,18 +432,18 @@ public class ThermalManagerServiceMockingTest { 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 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); @@ -321,6 +453,24 @@ public class ThermalManagerServiceMockingTest { assertArrayEquals(halT1.coldThrottlingThresholds, threshold.coldThrottlingThresholds, 0.1f); } + @Test + public void getTemperatureThresholds_nullResult_aidl() throws RemoteException { + Mockito.when(mAidlHalMock.getTemperatureThresholdsWithType(Mockito.anyInt())).thenReturn( + null); + List 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(