Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit c0ee6ba0 authored by Lloyd Pique's avatar Lloyd Pique
Browse files

CE: Unit test coverage for Output::updateLayerStateFromFE()

Bug: 144117262
Test: atest libcompositionengine_test
Change-Id: Ib65063f0008cf6a506bf47620b6c8d18fbfd221d
parent f4e507c9
Loading
Loading
Loading
Loading
+91 −0
Original line number Diff line number Diff line
@@ -104,6 +104,44 @@ struct OutputTest : public testing::Test {
    std::shared_ptr<Output> mOutput = createOutput(mCompositionEngine);
};

// Extension of the base test useful for checking interactions with the LayerFE
// functions to latch composition state.
struct OutputLatchFEStateTest : public OutputTest {
    OutputLatchFEStateTest() {
        EXPECT_CALL(*mOutputLayer1, getLayer()).WillRepeatedly(ReturnRef(mLayer1));
        EXPECT_CALL(*mOutputLayer2, getLayer()).WillRepeatedly(ReturnRef(mLayer2));
        EXPECT_CALL(*mOutputLayer3, getLayer()).WillRepeatedly(ReturnRef(mLayer3));

        EXPECT_CALL(*mOutputLayer1, getLayerFE()).WillRepeatedly(ReturnRef(mLayer1FE));
        EXPECT_CALL(*mOutputLayer2, getLayerFE()).WillRepeatedly(ReturnRef(mLayer2FE));
        EXPECT_CALL(*mOutputLayer3, getLayerFE()).WillRepeatedly(ReturnRef(mLayer3FE));

        EXPECT_CALL(mLayer1, editFEState()).WillRepeatedly(ReturnRef(mLayer1FEState));
        EXPECT_CALL(mLayer2, editFEState()).WillRepeatedly(ReturnRef(mLayer2FEState));
        EXPECT_CALL(mLayer3, editFEState()).WillRepeatedly(ReturnRef(mLayer3FEState));
    }

    void injectLayer(std::unique_ptr<mock::OutputLayer> layer) {
        mOutput->injectOutputLayerForTest(std::unique_ptr<OutputLayer>(layer.release()));
    }

    std::unique_ptr<mock::OutputLayer> mOutputLayer1{new StrictMock<mock::OutputLayer>};
    std::unique_ptr<mock::OutputLayer> mOutputLayer2{new StrictMock<mock::OutputLayer>};
    std::unique_ptr<mock::OutputLayer> mOutputLayer3{new StrictMock<mock::OutputLayer>};

    StrictMock<mock::Layer> mLayer1;
    StrictMock<mock::Layer> mLayer2;
    StrictMock<mock::Layer> mLayer3;

    StrictMock<mock::LayerFE> mLayer1FE;
    StrictMock<mock::LayerFE> mLayer2FE;
    StrictMock<mock::LayerFE> mLayer3FE;

    LayerFECompositionState mLayer1FEState;
    LayerFECompositionState mLayer2FEState;
    LayerFECompositionState mLayer3FEState;
};

const Rect OutputTest::kDefaultDisplaySize{100, 200};

/*
@@ -534,6 +572,59 @@ TEST_F(OutputSetReleasedLayersTest, setReleasedLayersTakesGivenLayers) {
    ASSERT_EQ(layer3FE.get(), setLayers[2].promote().get());
}

/*
 * Output::updateLayerStateFromFE()
 */

using OutputUpdateLayerStateFromFETest = OutputLatchFEStateTest;

TEST_F(OutputUpdateLayerStateFromFETest, handlesNoOutputLayerCase) {
    CompositionRefreshArgs refreshArgs;

    mOutput->updateLayerStateFromFE(refreshArgs);
}

TEST_F(OutputUpdateLayerStateFromFETest, latchesContentStateForAllContainedLayers) {
    EXPECT_CALL(mLayer1FE,
                latchCompositionState(Ref(mLayer1FEState), LayerFE::StateSubset::Content));
    EXPECT_CALL(mLayer2FE,
                latchCompositionState(Ref(mLayer2FEState), LayerFE::StateSubset::Content));
    EXPECT_CALL(mLayer3FE,
                latchCompositionState(Ref(mLayer3FEState), LayerFE::StateSubset::Content));

    // Note: Must be performed after any expectations on these mocks
    injectLayer(std::move(mOutputLayer1));
    injectLayer(std::move(mOutputLayer2));
    injectLayer(std::move(mOutputLayer3));

    CompositionRefreshArgs refreshArgs;
    refreshArgs.updatingGeometryThisFrame = false;

    mOutput->updateLayerStateFromFE(refreshArgs);
}

TEST_F(OutputUpdateLayerStateFromFETest, latchesGeometryAndContentStateForAllContainedLayers) {
    EXPECT_CALL(mLayer1FE,
                latchCompositionState(Ref(mLayer1FEState),
                                      LayerFE::StateSubset::GeometryAndContent));
    EXPECT_CALL(mLayer2FE,
                latchCompositionState(Ref(mLayer2FEState),
                                      LayerFE::StateSubset::GeometryAndContent));
    EXPECT_CALL(mLayer3FE,
                latchCompositionState(Ref(mLayer3FEState),
                                      LayerFE::StateSubset::GeometryAndContent));

    // Note: Must be performed after any expectations on these mocks
    injectLayer(std::move(mOutputLayer1));
    injectLayer(std::move(mOutputLayer2));
    injectLayer(std::move(mOutputLayer3));

    CompositionRefreshArgs refreshArgs;
    refreshArgs.updatingGeometryThisFrame = true;

    mOutput->updateLayerStateFromFE(refreshArgs);
}

/*
 * Output::updateAndWriteCompositionState()
 */