/* * Copyright 2020 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #undef LOG_TAG #define LOG_TAG "LibSurfaceFlingerUnittests" #include "DisplayTransactionTestHelpers.h" namespace android { namespace { class OnInitializeDisplaysTest : public DisplayTransactionTest {}; TEST_F(OnInitializeDisplaysTest, onInitializeDisplaysSetsUpPrimaryDisplay) { using Case = SimplePrimaryDisplayCase; // -------------------------------------------------------------------- // Preconditions // A primary display is set up Case::Display::injectHwcDisplay(this); auto primaryDisplay = Case::Display::makeFakeExistingDisplayInjector(this); primaryDisplay.inject(); // -------------------------------------------------------------------- // Call Expectations // We expect the surface interceptor to possibly be used, but we treat it as // disabled since it is called as a side effect rather than directly by this // function. EXPECT_CALL(*mSurfaceInterceptor, isEnabled()).WillOnce(Return(false)); // We expect a call to get the active display config. Case::Display::setupHwcGetActiveConfigCallExpectations(this); // We expect invalidate() to be invoked once to trigger display transaction // processing. EXPECT_CALL(*mMessageQueue, invalidate()).Times(1); EXPECT_CALL(*mVSyncTracker, nextAnticipatedVSyncTimeFrom(_)).WillRepeatedly(Return(0)); // -------------------------------------------------------------------- // Invocation mFlinger.onInitializeDisplays(); // -------------------------------------------------------------------- // Postconditions // The primary display should have a current state ASSERT_TRUE(hasCurrentDisplayState(primaryDisplay.token())); const auto& primaryDisplayState = getCurrentDisplayState(primaryDisplay.token()); // The layer stack state should be set to zero EXPECT_EQ(0u, primaryDisplayState.layerStack); // The orientation state should be set to zero EXPECT_EQ(ui::ROTATION_0, primaryDisplayState.orientation); // The orientedDisplaySpaceRect state should be set to INVALID EXPECT_EQ(Rect::INVALID_RECT, primaryDisplayState.orientedDisplaySpaceRect); // The layerStackSpaceRect state should be set to INVALID EXPECT_EQ(Rect::INVALID_RECT, primaryDisplayState.layerStackSpaceRect); // The width and height should both be zero EXPECT_EQ(0u, primaryDisplayState.width); EXPECT_EQ(0u, primaryDisplayState.height); // The display should be set to PowerMode::ON ASSERT_TRUE(hasDisplayDevice(primaryDisplay.token())); auto displayDevice = primaryDisplay.mutableDisplayDevice(); EXPECT_EQ(PowerMode::ON, displayDevice->getPowerMode()); // The display refresh period should be set in the orientedDisplaySpaceRect tracker. FrameStats stats; mFlinger.getAnimFrameTracker().getStats(&stats); EXPECT_EQ(DEFAULT_VSYNC_PERIOD, stats.refreshPeriodNano); // The display transaction needed flag should be set. EXPECT_TRUE(hasTransactionFlagSet(eDisplayTransactionNeeded)); // The compositor timing should be set to default values const auto& compositorTiming = mFlinger.getCompositorTiming(); EXPECT_EQ(-DEFAULT_VSYNC_PERIOD, compositorTiming.deadline); EXPECT_EQ(DEFAULT_VSYNC_PERIOD, compositorTiming.interval); EXPECT_EQ(DEFAULT_VSYNC_PERIOD, compositorTiming.presentLatency); } } // namespace } // namespace android