SF: Cleanup Layer membership test

Rather than passing the individual data for the layer (stack id,
primaryOnly flag), pass the entire layer, and have the Output class look
for the right data.

This makes it easier to change the membership logic later if desired.

Test: atest libsurfaceflinger_unittest libcompositionengine_test
Test: go/wm-smoke
Bug: 121291683
Change-Id: Ieccb3986dd4f045b68329825a7e3e05734811cc0
diff --git a/services/surfaceflinger/CompositionEngine/tests/OutputTest.cpp b/services/surfaceflinger/CompositionEngine/tests/OutputTest.cpp
index 10ec1ee..a0b8017 100644
--- a/services/surfaceflinger/CompositionEngine/tests/OutputTest.cpp
+++ b/services/surfaceflinger/CompositionEngine/tests/OutputTest.cpp
@@ -376,6 +376,71 @@
     EXPECT_FALSE(mOutput.belongsInOutput(layerStack2, false));
 }
 
+TEST_F(OutputTest, belongsInOutputFiltersLayersAsExpected) {
+    StrictMock<mock::Layer> layer;
+    impl::LayerCompositionState layerState;
+
+    EXPECT_CALL(layer, getState()).WillRepeatedly(ReturnRef(layerState));
+
+    const uint32_t layerStack1 = 123u;
+    const uint32_t layerStack2 = 456u;
+
+    // If the output accepts layerStack1 and internal-only layers....
+    mOutput.setLayerStackFilter(layerStack1, true);
+
+    // A null layer pointer does not belong to the output
+    EXPECT_FALSE(mOutput.belongsInOutput(nullptr));
+
+    // A layer with no layerStack does not belong to it, internal-only or not.
+    layerState.frontEnd.layerStackId = std::nullopt;
+    layerState.frontEnd.internalOnly = false;
+    EXPECT_FALSE(mOutput.belongsInOutput(&layer));
+
+    layerState.frontEnd.layerStackId = std::nullopt;
+    layerState.frontEnd.internalOnly = true;
+    EXPECT_FALSE(mOutput.belongsInOutput(&layer));
+
+    // Any layer with layerStack1 belongs to it, internal-only or not.
+    layerState.frontEnd.layerStackId = layerStack1;
+    layerState.frontEnd.internalOnly = false;
+    EXPECT_TRUE(mOutput.belongsInOutput(&layer));
+
+    layerState.frontEnd.layerStackId = layerStack1;
+    layerState.frontEnd.internalOnly = true;
+    EXPECT_TRUE(mOutput.belongsInOutput(&layer));
+
+    layerState.frontEnd.layerStackId = layerStack2;
+    layerState.frontEnd.internalOnly = true;
+    EXPECT_FALSE(mOutput.belongsInOutput(&layer));
+
+    layerState.frontEnd.layerStackId = layerStack2;
+    layerState.frontEnd.internalOnly = false;
+    EXPECT_FALSE(mOutput.belongsInOutput(&layer));
+
+    // If the output accepts layerStack1 but not internal-only layers...
+    mOutput.setLayerStackFilter(layerStack1, false);
+
+    // A null layer pointer does not belong to the output
+    EXPECT_FALSE(mOutput.belongsInOutput(nullptr));
+
+    // Only non-internal layers with layerStack1 belong to it.
+    layerState.frontEnd.layerStackId = layerStack1;
+    layerState.frontEnd.internalOnly = false;
+    EXPECT_TRUE(mOutput.belongsInOutput(&layer));
+
+    layerState.frontEnd.layerStackId = layerStack1;
+    layerState.frontEnd.internalOnly = true;
+    EXPECT_FALSE(mOutput.belongsInOutput(&layer));
+
+    layerState.frontEnd.layerStackId = layerStack2;
+    layerState.frontEnd.internalOnly = true;
+    EXPECT_FALSE(mOutput.belongsInOutput(&layer));
+
+    layerState.frontEnd.layerStackId = layerStack2;
+    layerState.frontEnd.internalOnly = false;
+    EXPECT_FALSE(mOutput.belongsInOutput(&layer));
+}
+
 /*
  * Output::getOutputLayerForLayer()
  */