1 #include <gmock/gmock.h>
2 #include <gtest/gtest.h>
3 #include <gui/LayerMetadata.h>
4 
5 #include "TestableSurfaceFlinger.h"
6 
7 namespace android {
8 
9 using testing::_;
10 using testing::Return;
11 
12 class SurfaceFlingerUpdateLayerMetadataSnapshotTest : public testing::Test {
13 public:
SurfaceFlingerUpdateLayerMetadataSnapshotTest()14     SurfaceFlingerUpdateLayerMetadataSnapshotTest() { mFlinger.setupMockScheduler(); }
15 
16 protected:
createLayer(const char * name,LayerMetadata & inOutlayerMetadata)17     sp<Layer> createLayer(const char* name, LayerMetadata& inOutlayerMetadata) {
18         LayerCreationArgs args =
19                 LayerCreationArgs{mFlinger.flinger(), nullptr, name, 0, inOutlayerMetadata};
20         inOutlayerMetadata = args.metadata;
21         return sp<Layer>::make(args);
22     }
23 
24     TestableSurfaceFlinger mFlinger;
25 };
26 
27 class LayerMetadataBuilder {
28 public:
LayerMetadataBuilder(LayerMetadata layerMetadata={})29     LayerMetadataBuilder(LayerMetadata layerMetadata = {}) : mLayerMetadata(layerMetadata) {}
30 
setInt32(uint32_t key,int32_t value)31     LayerMetadataBuilder& setInt32(uint32_t key, int32_t value) {
32         mLayerMetadata.setInt32(key, value);
33         return *this;
34     }
35 
build()36     LayerMetadata build() { return mLayerMetadata; }
37 
38 private:
39     LayerMetadata mLayerMetadata;
40 };
41 
operator ==(const LayerMetadata & lhs,const LayerMetadata & rhs)42 bool operator==(const LayerMetadata& lhs, const LayerMetadata& rhs) {
43     return lhs.mMap == rhs.mMap;
44 }
45 
operator <<(std::ostream & stream,const LayerMetadata & layerMetadata)46 std::ostream& operator<<(std::ostream& stream, const LayerMetadata& layerMetadata) {
47     stream << "LayerMetadata{";
48     for (auto it = layerMetadata.mMap.cbegin(); it != layerMetadata.mMap.cend(); it++) {
49         if (it != layerMetadata.mMap.cbegin()) {
50             stream << ", ";
51         }
52         stream << layerMetadata.itemToString(it->first, ":");
53     }
54     return stream << "}";
55 }
56 
57 // Test that the snapshot's layer metadata is set.
TEST_F(SurfaceFlingerUpdateLayerMetadataSnapshotTest,updatesSnapshotMetadata)58 TEST_F(SurfaceFlingerUpdateLayerMetadataSnapshotTest, updatesSnapshotMetadata) {
59     auto layerMetadata = LayerMetadataBuilder().setInt32(METADATA_TASK_ID, 1).build();
60     auto layer = createLayer("layer", layerMetadata);
61     mFlinger.mutableDrawingState().layersSortedByZ.add(layer);
62 
63     mFlinger.updateLayerMetadataSnapshot();
64 
65     EXPECT_EQ(layer->getLayerSnapshot()->layerMetadata, layerMetadata);
66 }
67 
68 // Test that snapshot layer metadata is set by merging the child's metadata on top of its
69 // parent's metadata.
TEST_F(SurfaceFlingerUpdateLayerMetadataSnapshotTest,mergesSnapshotMetadata)70 TEST_F(SurfaceFlingerUpdateLayerMetadataSnapshotTest, mergesSnapshotMetadata) {
71     auto layerAMetadata = LayerMetadataBuilder()
72                                   .setInt32(METADATA_OWNER_UID, 1)
73                                   .setInt32(METADATA_TASK_ID, 2)
74                                   .build();
75     auto layerA = createLayer("parent", layerAMetadata);
76     auto layerBMetadata = LayerMetadataBuilder().setInt32(METADATA_TASK_ID, 3).build();
77     auto layerB = createLayer("child", layerBMetadata);
78     layerA->addChild(layerB);
79     layerA->commitChildList();
80     mFlinger.mutableDrawingState().layersSortedByZ.add(layerA);
81 
82     mFlinger.updateLayerMetadataSnapshot();
83 
84     EXPECT_EQ(layerA->getLayerSnapshot()->layerMetadata, layerAMetadata);
85     auto expectedChildMetadata =
86             LayerMetadataBuilder(layerAMetadata).setInt32(METADATA_TASK_ID, 3).build();
87     EXPECT_EQ(layerB->getLayerSnapshot()->layerMetadata, expectedChildMetadata);
88 }
89 
90 // Test that snapshot relative layer metadata is set to the parent's layer metadata merged on top of
91 // that parent's relative layer metadata.
TEST_F(SurfaceFlingerUpdateLayerMetadataSnapshotTest,updatesRelativeMetadata)92 TEST_F(SurfaceFlingerUpdateLayerMetadataSnapshotTest, updatesRelativeMetadata) {
93     auto layerAMetadata = LayerMetadataBuilder().setInt32(METADATA_TASK_ID, 1).build();
94     auto layerA = createLayer("relative-parent", layerAMetadata);
95     auto layerAHandle = layerA->getHandle();
96     auto layerBMetadata = LayerMetadataBuilder().setInt32(METADATA_TASK_ID, 2).build();
97     auto layerB = createLayer("relative-child", layerBMetadata);
98     layerB->setRelativeLayer(layerAHandle, 1);
99     mFlinger.mutableDrawingState().layersSortedByZ.add(layerA);
100     mFlinger.mutableDrawingState().layersSortedByZ.add(layerB);
101 
102     mFlinger.updateLayerMetadataSnapshot();
103 
104     EXPECT_EQ(layerA->getLayerSnapshot()->relativeLayerMetadata, LayerMetadata{});
105     EXPECT_EQ(layerB->getLayerSnapshot()->relativeLayerMetadata, layerAMetadata);
106 }
107 
108 // Test that snapshot relative layer metadata is set correctly when a layer is interleaved within
109 // two other layers.
110 //
111 // Layer
112 //      A
113 //     / \
114 //    B   D
115 //   /
116 //  C
117 //
118 // Z-order Relatives
119 //    B <- D <- C
TEST_F(SurfaceFlingerUpdateLayerMetadataSnapshotTest,updatesRelativeMetadataInterleaved)120 TEST_F(SurfaceFlingerUpdateLayerMetadataSnapshotTest, updatesRelativeMetadataInterleaved) {
121     auto layerAMetadata = LayerMetadataBuilder().setInt32(METADATA_OWNER_UID, 1).build();
122     auto layerA = createLayer("layer-a", layerAMetadata);
123     auto layerBMetadata = LayerMetadataBuilder()
124                                   .setInt32(METADATA_TASK_ID, 2)
125                                   .setInt32(METADATA_OWNER_PID, 3)
126                                   .build();
127     auto layerB = createLayer("layer-b", layerBMetadata);
128     auto layerBHandle = layerB->getHandle();
129     LayerMetadata layerCMetadata;
130     auto layerC = createLayer("layer-c", layerCMetadata);
131     auto layerDMetadata = LayerMetadataBuilder().setInt32(METADATA_TASK_ID, 4).build();
132     auto layerD = createLayer("layer-d", layerDMetadata);
133     auto layerDHandle = layerD->getHandle();
134     layerB->addChild(layerC);
135     layerA->addChild(layerB);
136     layerA->addChild(layerD);
137     layerC->setRelativeLayer(layerDHandle, 1);
138     layerD->setRelativeLayer(layerBHandle, 1);
139     layerA->commitChildList();
140     mFlinger.mutableDrawingState().layersSortedByZ.add(layerA);
141 
142     mFlinger.updateLayerMetadataSnapshot();
143 
144     auto expectedLayerDRelativeMetadata =
145             LayerMetadataBuilder()
146                     // From layer A, parent of relative parent
147                     .setInt32(METADATA_OWNER_UID, 1)
148                     // From layer B, relative parent
149                     .setInt32(METADATA_TASK_ID, 2)
150                     .setInt32(METADATA_OWNER_PID, 3)
151                     // added by layer creation args
152                     .setInt32(gui::METADATA_CALLING_UID,
153                               layerDMetadata.getInt32(gui::METADATA_CALLING_UID, 0))
154                     .build();
155     EXPECT_EQ(layerD->getLayerSnapshot()->relativeLayerMetadata, expectedLayerDRelativeMetadata);
156     auto expectedLayerCRelativeMetadata =
157             LayerMetadataBuilder()
158                     // From layer A, parent of relative parent
159                     .setInt32(METADATA_OWNER_UID, 1)
160                     // From layer B, relative parent of relative parent
161                     .setInt32(METADATA_OWNER_PID, 3)
162                     // From layer D, relative parent
163                     .setInt32(METADATA_TASK_ID, 4)
164                     // added by layer creation args
165                     .setInt32(gui::METADATA_CALLING_UID,
166                               layerDMetadata.getInt32(gui::METADATA_CALLING_UID, 0))
167                     .build();
168     EXPECT_EQ(layerC->getLayerSnapshot()->relativeLayerMetadata, expectedLayerCRelativeMetadata);
169 }
170 
TEST_F(SurfaceFlingerUpdateLayerMetadataSnapshotTest,updatesRelativeMetadataMultipleRelativeChildren)171 TEST_F(SurfaceFlingerUpdateLayerMetadataSnapshotTest,
172        updatesRelativeMetadataMultipleRelativeChildren) {
173     auto layerAMetadata = LayerMetadataBuilder().setInt32(METADATA_OWNER_UID, 1).build();
174     auto layerA = createLayer("layer-a", layerAMetadata);
175     auto layerAHandle = layerA->getHandle();
176     LayerMetadata layerBMetadata;
177     auto layerB = createLayer("layer-b", layerBMetadata);
178     LayerMetadata layerCMetadata;
179     auto layerC = createLayer("layer-c", layerCMetadata);
180     layerB->setRelativeLayer(layerAHandle, 1);
181     layerC->setRelativeLayer(layerAHandle, 2);
182     layerA->commitChildList();
183     mFlinger.mutableDrawingState().layersSortedByZ.add(layerA);
184     mFlinger.mutableDrawingState().layersSortedByZ.add(layerB);
185     mFlinger.mutableDrawingState().layersSortedByZ.add(layerC);
186 
187     mFlinger.updateLayerMetadataSnapshot();
188 
189     EXPECT_EQ(layerA->getLayerSnapshot()->relativeLayerMetadata, LayerMetadata{});
190     EXPECT_EQ(layerB->getLayerSnapshot()->relativeLayerMetadata, layerAMetadata);
191     EXPECT_EQ(layerC->getLayerSnapshot()->relativeLayerMetadata, layerAMetadata);
192 }
193 
194 } // namespace android
195