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