Disallow PowerManager and AppHibernationManager to be missing.
We can safely assume that PowerManager and AppHibernationManager always
exist because:
- PowerManager is available once PowerManagerService and
ThermalManagerService are initialized.
- AppHibernationManager is available once AppHibernationService is
initialized.
- PowerManagerService, ThermalManagerService, and AppHibernationService
are all initialized before ArtManagerLocal, and the initializations
are blocking.
Bug: 244289352
Test: manual - call `optimizePackage` in `ArtManagerLocal` constructor
and see the optimization successful.
Ignore-AOSP-First: ART Services
Change-Id: I0c307fac2772fec3d8a0383f99e6cfb78163cb61
diff --git a/libartservice/service/javatests/com/android/server/art/DexOptHelperTest.java b/libartservice/service/javatests/com/android/server/art/DexOptHelperTest.java
index 1b9c852..518b972 100644
--- a/libartservice/service/javatests/com/android/server/art/DexOptHelperTest.java
+++ b/libartservice/service/javatests/com/android/server/art/DexOptHelperTest.java
@@ -62,6 +62,7 @@
@Mock private PrimaryDexOptimizer mPrimaryDexOptimizer;
@Mock private AppHibernationManager mAhm;
@Mock private PowerManager mPowerManager;
+ @Mock private PowerManager.WakeLock mWakeLock;
private PackageState mPkgState;
private AndroidPackageApi mPkg;
@@ -84,8 +85,15 @@
@Before
public void setUp() throws Exception {
lenient().when(mInjector.getPrimaryDexOptimizer()).thenReturn(mPrimaryDexOptimizer);
- lenient().when(mInjector.getAppHibernationManager()).thenReturn(null);
- lenient().when(mInjector.getPowerManager()).thenReturn(null);
+ lenient().when(mInjector.getAppHibernationManager()).thenReturn(mAhm);
+ lenient().when(mInjector.getPowerManager()).thenReturn(mPowerManager);
+
+ lenient()
+ .when(mPowerManager.newWakeLock(eq(PowerManager.PARTIAL_WAKE_LOCK), any()))
+ .thenReturn(mWakeLock);
+
+ lenient().when(mAhm.isHibernatingGlobally(PKG_NAME)).thenReturn(false);
+ lenient().when(mAhm.isOatArtifactDeletionEnabled()).thenReturn(true);
mPkgState = createPackageState();
mPkg = mPkgState.getAndroidPackage();
@@ -106,6 +114,11 @@
assertThat(result.getReason()).isEqualTo("install");
assertThat(result.getFinalStatus()).isEqualTo(OptimizeResult.OPTIMIZE_FAILED);
assertThat(result.getDexFileOptimizeResults()).containsExactlyElementsIn(mPrimaryResults);
+
+ InOrder inOrder = inOrder(mPrimaryDexOptimizer, mWakeLock);
+ inOrder.verify(mWakeLock).acquire(anyLong());
+ inOrder.verify(mPrimaryDexOptimizer).dexopt(any(), any(), any());
+ inOrder.verify(mWakeLock).release();
}
@Test
@@ -120,25 +133,8 @@
}
@Test
- public void testDexoptWithAppHibernationManager() throws Exception {
- when(mInjector.getAppHibernationManager()).thenReturn(mAhm);
- lenient().when(mAhm.isHibernatingGlobally(PKG_NAME)).thenReturn(false);
- lenient().when(mAhm.isOatArtifactDeletionEnabled()).thenReturn(true);
-
- when(mPrimaryDexOptimizer.dexopt(same(mPkgState), same(mPkg), same(mParams)))
- .thenReturn(mPrimaryResults);
-
- OptimizeResult result =
- mDexOptHelper.dexopt(mock(PackageDataSnapshot.class), mPkgState, mPkg, mParams);
-
- assertThat(result.getDexFileOptimizeResults()).containsExactlyElementsIn(mPrimaryResults);
- }
-
- @Test
public void testDexoptIsHibernating() throws Exception {
- when(mInjector.getAppHibernationManager()).thenReturn(mAhm);
lenient().when(mAhm.isHibernatingGlobally(PKG_NAME)).thenReturn(true);
- lenient().when(mAhm.isOatArtifactDeletionEnabled()).thenReturn(true);
OptimizeResult result =
mDexOptHelper.dexopt(mock(PackageDataSnapshot.class), mPkgState, mPkg, mParams);
@@ -149,7 +145,6 @@
@Test
public void testDexoptIsHibernatingButOatArtifactDeletionDisabled() throws Exception {
- when(mInjector.getAppHibernationManager()).thenReturn(mAhm);
lenient().when(mAhm.isHibernatingGlobally(PKG_NAME)).thenReturn(true);
lenient().when(mAhm.isOatArtifactDeletionEnabled()).thenReturn(false);
@@ -163,31 +158,7 @@
}
@Test
- public void testDexoptWithPowerManager() throws Exception {
- var wakeLock = mock(PowerManager.WakeLock.class);
- when(mInjector.getPowerManager()).thenReturn(mPowerManager);
- when(mPowerManager.newWakeLock(eq(PowerManager.PARTIAL_WAKE_LOCK), any()))
- .thenReturn(wakeLock);
-
- when(mPrimaryDexOptimizer.dexopt(same(mPkgState), same(mPkg), same(mParams)))
- .thenReturn(mPrimaryResults);
-
- OptimizeResult result =
- mDexOptHelper.dexopt(mock(PackageDataSnapshot.class), mPkgState, mPkg, mParams);
-
- InOrder inOrder = inOrder(mPrimaryDexOptimizer, wakeLock);
- inOrder.verify(wakeLock).acquire(anyLong());
- inOrder.verify(mPrimaryDexOptimizer).dexopt(any(), any(), any());
- inOrder.verify(wakeLock).release();
- }
-
- @Test
public void testDexoptAlwaysReleasesWakeLock() throws Exception {
- var wakeLock = mock(PowerManager.WakeLock.class);
- when(mInjector.getPowerManager()).thenReturn(mPowerManager);
- when(mPowerManager.newWakeLock(eq(PowerManager.PARTIAL_WAKE_LOCK), any()))
- .thenReturn(wakeLock);
-
when(mPrimaryDexOptimizer.dexopt(same(mPkgState), same(mPkg), same(mParams)))
.thenThrow(IllegalStateException.class);
@@ -197,7 +168,7 @@
} catch (Exception e) {
}
- verify(wakeLock).release();
+ verify(mWakeLock).release();
}
private AndroidPackageApi createPackage() {