diff options
Diffstat (limited to 'services/surfaceflinger/tests/unittests/SurfaceFlinger_SetPowerModeInternalTest.cpp')
-rw-r--r-- | services/surfaceflinger/tests/unittests/SurfaceFlinger_SetPowerModeInternalTest.cpp | 85 |
1 files changed, 85 insertions, 0 deletions
diff --git a/services/surfaceflinger/tests/unittests/SurfaceFlinger_SetPowerModeInternalTest.cpp b/services/surfaceflinger/tests/unittests/SurfaceFlinger_SetPowerModeInternalTest.cpp index 583cf5f836..b560025929 100644 --- a/services/surfaceflinger/tests/unittests/SurfaceFlinger_SetPowerModeInternalTest.cpp +++ b/services/surfaceflinger/tests/unittests/SurfaceFlinger_SetPowerModeInternalTest.cpp @@ -323,6 +323,9 @@ class SetPowerModeInternalTest : public DisplayTransactionTest { public: template <typename Case> void transitionDisplayCommon(); + + template <bool kBoot> + sp<DisplayDevice> activeDisplayTest(); }; template <PowerMode PowerMode> @@ -499,5 +502,87 @@ TEST_F(SetPowerModeInternalTest, transitionsDisplayFromOnToUnknownExternalDispla transitionDisplayCommon<ExternalDisplayPowerCase<TransitionOnToUnknownVariant>>(); } +template <bool kBoot> +sp<DisplayDevice> SetPowerModeInternalTest::activeDisplayTest() { + using Case = SimplePrimaryDisplayCase; + + // -------------------------------------------------------------------- + // Preconditions + + // Inject a primary display. + Case::Display::injectHwcDisplay(this); + auto injector = Case::Display::makeFakeExistingDisplayInjector(this); + injector.setPowerMode(kBoot ? std::nullopt : std::make_optional(PowerMode::OFF)); + + const auto display = injector.inject(); + EXPECT_EQ(display->getDisplayToken(), mFlinger.mutableActiveDisplayToken()); + + using PowerCase = PrimaryDisplayPowerCase<TransitionOffToOnVariant>; + TransitionOffToOnVariant::template setupCallExpectations<PowerCase>(this); + + constexpr size_t kTimes = kBoot ? 1 : 0; + EXPECT_CALL(*mRenderEngine, onActiveDisplaySizeChanged(display->getSize())).Times(kTimes); + EXPECT_CALL(*mEventThread, onModeChanged(display->getActiveMode())).Times(kTimes); + + if constexpr (kBoot) { + mFlinger.mutableActiveDisplayToken() = nullptr; + } + + // -------------------------------------------------------------------- + // Invocation + + mFlinger.setPowerModeInternal(display, PowerMode::ON); + + // -------------------------------------------------------------------- + // Postconditions + + // The primary display should be the active display. + EXPECT_EQ(display->getDisplayToken(), mFlinger.mutableActiveDisplayToken()); + + Mock::VerifyAndClearExpectations(mComposer); + Mock::VerifyAndClearExpectations(mRenderEngine); + Mock::VerifyAndClearExpectations(mEventThread); + Mock::VerifyAndClearExpectations(mVsyncController); + Mock::VerifyAndClearExpectations(mVSyncTracker); + Mock::VerifyAndClearExpectations(mFlinger.scheduler()); + Mock::VerifyAndClearExpectations(&mFlinger.mockSchedulerCallback()); + + return display; +} + +TEST_F(SetPowerModeInternalTest, activeDisplayBoot) { + constexpr bool kBoot = true; + activeDisplayTest<kBoot>(); +} + +TEST_F(SetPowerModeInternalTest, activeDisplaySingle) { + constexpr bool kBoot = false; + activeDisplayTest<kBoot>(); +} + +TEST_F(SetPowerModeInternalTest, activeDisplayDual) { + constexpr bool kBoot = false; + const auto innerDisplay = activeDisplayTest<kBoot>(); + + // Inject a powered-off outer display. + const auto outerDisplay = mFakeDisplayInjector.injectInternalDisplay( + [&](FakeDisplayDeviceInjector& injector) { injector.setPowerMode(PowerMode::OFF); }, + {.displayId = PhysicalDisplayId::fromPort(254u), + .hwcDisplayId = 1, + .isPrimary = false}); + + EXPECT_EQ(innerDisplay->getDisplayToken(), mFlinger.mutableActiveDisplayToken()); + + mFlinger.setPowerModeInternal(innerDisplay, PowerMode::OFF); + mFlinger.setPowerModeInternal(outerDisplay, PowerMode::ON); + + EXPECT_EQ(outerDisplay->getDisplayToken(), mFlinger.mutableActiveDisplayToken()); + + mFlinger.setPowerModeInternal(outerDisplay, PowerMode::OFF); + mFlinger.setPowerModeInternal(innerDisplay, PowerMode::ON); + + EXPECT_EQ(innerDisplay->getDisplayToken(), mFlinger.mutableActiveDisplayToken()); +} + } // namespace } // namespace android |