diff --git a/services/tests/wmtests/src/com/android/server/wm/ActivityTaskManagerServiceTests.java b/services/tests/wmtests/src/com/android/server/wm/ActivityTaskManagerServiceTests.java index 8ada97147dd3f..a8571906bb06c 100644 --- a/services/tests/wmtests/src/com/android/server/wm/ActivityTaskManagerServiceTests.java +++ b/services/tests/wmtests/src/com/android/server/wm/ActivityTaskManagerServiceTests.java @@ -355,7 +355,8 @@ public class ActivityTaskManagerServiceTests extends WindowTestsBase { @Test public void testUpdateSleep() { doCallRealMethod().when(mWm.mRoot).hasAwakeDisplay(); - mSupervisor.mGoingToSleepWakeLock = mock(PowerManager.WakeLock.class); + mSupervisor.mGoingToSleepWakeLock = + mSystemServicesTestRule.createStubbedWakeLock(true /* needVerification */); final Task rootHomeTask = mWm.mRoot.getDefaultTaskDisplayArea().getOrCreateRootHomeTask(); final ActivityRecord homeActivity = new ActivityBuilder(mAtm).setTask(rootHomeTask).build(); final ActivityRecord topActivity = new ActivityBuilder(mAtm).setCreateTask(true).build(); diff --git a/services/tests/wmtests/src/com/android/server/wm/SystemServicesTestRule.java b/services/tests/wmtests/src/com/android/server/wm/SystemServicesTestRule.java index d038fea4680b7..f999e49784208 100644 --- a/services/tests/wmtests/src/com/android/server/wm/SystemServicesTestRule.java +++ b/services/tests/wmtests/src/com/android/server/wm/SystemServicesTestRule.java @@ -101,6 +101,10 @@ public class SystemServicesTestRule implements TestRule { static int sNextDisplayId = DEFAULT_DISPLAY + 100; private static final int[] TEST_USER_PROFILE_IDS = {}; + /** Use a real static object so there won't be NPE in finalize() after clearInlineMocks(). */ + private static final PowerManager.WakeLock sWakeLock = getInstrumentation().getContext() + .getSystemService(PowerManager.class).newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, TAG); + private PowerManager.WakeLock mStubbedWakeLock; private Description mDescription; private Context mContext; @@ -194,7 +198,8 @@ public class SystemServicesTestRule implements TestRule { // Prevent "WakeLock finalized while still held: SCREEN_FROZEN". final PowerManager pm = mock(PowerManager.class); doReturn(pm).when(mContext).getSystemService(eq(Context.POWER_SERVICE)); - doReturn(mock(PowerManager.WakeLock.class)).when(pm).newWakeLock(anyInt(), anyString()); + mStubbedWakeLock = createStubbedWakeLock(false /* needVerification */); + doReturn(mStubbedWakeLock).when(pm).newWakeLock(anyInt(), anyString()); // DisplayManagerInternal final DisplayManagerInternal dmi = mock(DisplayManagerInternal.class); @@ -401,6 +406,16 @@ public class SystemServicesTestRule implements TestRule { return mPowerManagerWrapper; } + /** Creates a no-op wakelock object. */ + PowerManager.WakeLock createStubbedWakeLock(boolean needVerification) { + if (needVerification) { + return mock(PowerManager.WakeLock.class, Mockito.withSettings() + .spiedInstance(sWakeLock).defaultAnswer(Mockito.RETURNS_DEFAULTS)); + } + return mock(PowerManager.WakeLock.class, Mockito.withSettings() + .spiedInstance(sWakeLock).stubOnly()); + } + void setSurfaceFactory(Supplier factory) { mSurfaceFactory = factory; } @@ -556,7 +571,7 @@ public class SystemServicesTestRule implements TestRule { // unit test version does not handle launch wake lock doNothing().when(this).acquireLaunchWakelock(); - mLaunchingActivityWakeLock = mock(PowerManager.WakeLock.class); + mLaunchingActivityWakeLock = mStubbedWakeLock; initialize();