blob: 2b333f4b87c75bf45bc58f5f3870fa1b42e62cd8 [file] [log] [blame]
Vishnu Nair04f89692022-11-16 23:21:05 +00001/*
2 * Copyright 2022 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17#include <gmock/gmock.h>
18#include <gtest/gtest.h>
19
Vishnu Nair04f89692022-11-16 23:21:05 +000020#include "FrontEnd/LayerHierarchy.h"
21#include "FrontEnd/LayerLifecycleManager.h"
Vishnu Nair8fc721b2022-12-22 20:06:32 +000022#include "LayerHierarchyTest.h"
Vishnu Nair04f89692022-11-16 23:21:05 +000023
24#define UPDATE_AND_VERIFY(HIERARCHY) \
25 ({ \
26 SCOPED_TRACE(""); \
27 updateAndVerify((HIERARCHY)); \
28 })
29
30namespace android::surfaceflinger::frontend {
31
Vishnu Nair04f89692022-11-16 23:21:05 +000032// To run test:
33/**
34 mp :libsurfaceflinger_unittest && adb sync; adb shell \
35 /data/nativetest/libsurfaceflinger_unittest/libsurfaceflinger_unittest \
36 --gtest_filter="LayerHierarchyTest.*" --gtest_repeat=100 \
37 --gtest_shuffle \
38 --gtest_brief=1
39*/
40
Vishnu Nair8fc721b2022-12-22 20:06:32 +000041class LayerHierarchyTest : public LayerHierarchyTestBase {
Vishnu Nair04f89692022-11-16 23:21:05 +000042protected:
Vishnu Nair8fc721b2022-12-22 20:06:32 +000043 LayerHierarchyTest() : LayerHierarchyTestBase() { mLifecycleManager.commitChanges(); }
Vishnu Nair04f89692022-11-16 23:21:05 +000044};
45
46// reparenting tests
47TEST_F(LayerHierarchyTest, addLayer) {
Vishnu Naira0292282023-12-16 14:32:00 -080048 LayerHierarchyBuilder hierarchyBuilder;
49 hierarchyBuilder.update(mLifecycleManager);
Vishnu Nair04f89692022-11-16 23:21:05 +000050 std::vector<uint32_t> expectedTraversalPath = {1, 11, 111, 12, 121, 122, 1221, 13, 2};
51 EXPECT_EQ(getTraversalPath(hierarchyBuilder.getHierarchy()), expectedTraversalPath);
52 EXPECT_EQ(getTraversalPathInZOrder(hierarchyBuilder.getHierarchy()), expectedTraversalPath);
53 expectedTraversalPath = {};
54 EXPECT_EQ(getTraversalPath(hierarchyBuilder.getOffscreenHierarchy()), expectedTraversalPath);
55
56 createRootLayer(3);
57 createLayer(112, 11);
58 createLayer(12211, 1221);
59 UPDATE_AND_VERIFY(hierarchyBuilder);
60 expectedTraversalPath = {1, 11, 111, 112, 12, 121, 122, 1221, 12211, 13, 2, 3};
61 EXPECT_EQ(getTraversalPath(hierarchyBuilder.getHierarchy()), expectedTraversalPath);
62 EXPECT_EQ(getTraversalPathInZOrder(hierarchyBuilder.getHierarchy()), expectedTraversalPath);
63 expectedTraversalPath = {};
64 EXPECT_EQ(getTraversalPath(hierarchyBuilder.getOffscreenHierarchy()), expectedTraversalPath);
65}
66
67TEST_F(LayerHierarchyTest, reparentLayer) {
Vishnu Naira0292282023-12-16 14:32:00 -080068 LayerHierarchyBuilder hierarchyBuilder;
69 hierarchyBuilder.update(mLifecycleManager);
Vishnu Nair04f89692022-11-16 23:21:05 +000070 reparentLayer(2, 11);
71 reparentLayer(111, 12);
72 reparentLayer(1221, 1);
73 reparentLayer(1221, 13);
74 UPDATE_AND_VERIFY(hierarchyBuilder);
75
76 std::vector<uint32_t> expectedTraversalPath = {1, 11, 2, 12, 111, 121, 122, 13, 1221};
77 EXPECT_EQ(getTraversalPath(hierarchyBuilder.getHierarchy()), expectedTraversalPath);
78 EXPECT_EQ(getTraversalPathInZOrder(hierarchyBuilder.getHierarchy()), expectedTraversalPath);
79 expectedTraversalPath = {};
80 EXPECT_EQ(getTraversalPath(hierarchyBuilder.getOffscreenHierarchy()), expectedTraversalPath);
81}
82
83TEST_F(LayerHierarchyTest, reparentLayerToNull) {
Vishnu Naira0292282023-12-16 14:32:00 -080084 LayerHierarchyBuilder hierarchyBuilder;
85 hierarchyBuilder.update(mLifecycleManager);
Vishnu Nair04f89692022-11-16 23:21:05 +000086
87 reparentLayer(2, UNASSIGNED_LAYER_ID);
88 reparentLayer(11, UNASSIGNED_LAYER_ID);
89 reparentLayer(1221, 13);
90 reparentLayer(1221, UNASSIGNED_LAYER_ID);
91
92 UPDATE_AND_VERIFY(hierarchyBuilder);
93
94 std::vector<uint32_t> expectedTraversalPath = {1, 12, 121, 122, 13};
95 EXPECT_EQ(getTraversalPath(hierarchyBuilder.getHierarchy()), expectedTraversalPath);
96 EXPECT_EQ(getTraversalPathInZOrder(hierarchyBuilder.getHierarchy()), expectedTraversalPath);
97 expectedTraversalPath = {2, 11, 111, 1221};
98 EXPECT_EQ(getTraversalPath(hierarchyBuilder.getOffscreenHierarchy()), expectedTraversalPath);
99}
100
101TEST_F(LayerHierarchyTest, reparentLayerToNullAndDestroyHandles) {
Vishnu Naira0292282023-12-16 14:32:00 -0800102 LayerHierarchyBuilder hierarchyBuilder;
103 hierarchyBuilder.update(mLifecycleManager);
Vishnu Nair04f89692022-11-16 23:21:05 +0000104 reparentLayer(2, UNASSIGNED_LAYER_ID);
105 reparentLayer(11, UNASSIGNED_LAYER_ID);
106 reparentLayer(1221, UNASSIGNED_LAYER_ID);
107
108 destroyLayerHandle(2);
109 destroyLayerHandle(11);
110 destroyLayerHandle(1221);
111
112 UPDATE_AND_VERIFY(hierarchyBuilder);
113
114 std::vector<uint32_t> expectedTraversalPath = {1, 12, 121, 122, 13};
115 EXPECT_EQ(getTraversalPath(hierarchyBuilder.getHierarchy()), expectedTraversalPath);
116 EXPECT_EQ(getTraversalPathInZOrder(hierarchyBuilder.getHierarchy()), expectedTraversalPath);
117 expectedTraversalPath = {111};
118 EXPECT_EQ(getTraversalPath(hierarchyBuilder.getOffscreenHierarchy()), expectedTraversalPath);
119}
120
121TEST_F(LayerHierarchyTest, destroyHandleThenDestroyParentLayer) {
Vishnu Naira0292282023-12-16 14:32:00 -0800122 LayerHierarchyBuilder hierarchyBuilder;
123 hierarchyBuilder.update(mLifecycleManager);
Vishnu Nair04f89692022-11-16 23:21:05 +0000124 destroyLayerHandle(111);
125 UPDATE_AND_VERIFY(hierarchyBuilder);
126
127 // handle is destroyed but layer is kept alive and reachable by parent
128 std::vector<uint32_t> expectedTraversalPath = {1, 11, 111, 12, 121, 122, 1221, 13, 2};
129 EXPECT_EQ(getTraversalPath(hierarchyBuilder.getHierarchy()), expectedTraversalPath);
130 EXPECT_EQ(getTraversalPathInZOrder(hierarchyBuilder.getHierarchy()), expectedTraversalPath);
131 expectedTraversalPath = {};
132 EXPECT_EQ(getTraversalPath(hierarchyBuilder.getOffscreenHierarchy()), expectedTraversalPath);
133
134 // destroy parent layer and the child gets destroyed
135 reparentLayer(11, UNASSIGNED_LAYER_ID);
136 destroyLayerHandle(11);
137 UPDATE_AND_VERIFY(hierarchyBuilder);
138
139 expectedTraversalPath = {1, 12, 121, 122, 1221, 13, 2};
140 EXPECT_EQ(getTraversalPath(hierarchyBuilder.getHierarchy()), expectedTraversalPath);
141 EXPECT_EQ(getTraversalPathInZOrder(hierarchyBuilder.getHierarchy()), expectedTraversalPath);
142 expectedTraversalPath = {};
143 EXPECT_EQ(getTraversalPath(hierarchyBuilder.getOffscreenHierarchy()), expectedTraversalPath);
144}
145
146TEST_F(LayerHierarchyTest, layerSurvivesTemporaryReparentToNull) {
Vishnu Naira0292282023-12-16 14:32:00 -0800147 LayerHierarchyBuilder hierarchyBuilder;
148 hierarchyBuilder.update(mLifecycleManager);
Vishnu Nair04f89692022-11-16 23:21:05 +0000149 reparentLayer(11, UNASSIGNED_LAYER_ID);
150 reparentLayer(11, 1);
151
152 UPDATE_AND_VERIFY(hierarchyBuilder);
153
154 std::vector<uint32_t> expectedTraversalPath = {1, 11, 111, 12, 121, 122, 1221, 13, 2};
155 EXPECT_EQ(getTraversalPath(hierarchyBuilder.getHierarchy()), expectedTraversalPath);
156 EXPECT_EQ(getTraversalPathInZOrder(hierarchyBuilder.getHierarchy()), expectedTraversalPath);
157 expectedTraversalPath = {};
158 EXPECT_EQ(getTraversalPath(hierarchyBuilder.getOffscreenHierarchy()), expectedTraversalPath);
159}
160
161// offscreen tests
162TEST_F(LayerHierarchyTest, layerMovesOnscreen) {
Vishnu Naira0292282023-12-16 14:32:00 -0800163 LayerHierarchyBuilder hierarchyBuilder;
164 hierarchyBuilder.update(mLifecycleManager);
Vishnu Nair04f89692022-11-16 23:21:05 +0000165
166 reparentLayer(11, UNASSIGNED_LAYER_ID);
167 UPDATE_AND_VERIFY(hierarchyBuilder);
168
169 reparentLayer(11, 1);
170 UPDATE_AND_VERIFY(hierarchyBuilder);
171
172 std::vector<uint32_t> expectedTraversalPath = {1, 11, 111, 12, 121, 122, 1221, 13, 2};
173 EXPECT_EQ(getTraversalPath(hierarchyBuilder.getHierarchy()), expectedTraversalPath);
174 EXPECT_EQ(getTraversalPathInZOrder(hierarchyBuilder.getHierarchy()), expectedTraversalPath);
175 expectedTraversalPath = {};
176 EXPECT_EQ(getTraversalPath(hierarchyBuilder.getOffscreenHierarchy()), expectedTraversalPath);
177}
178
179TEST_F(LayerHierarchyTest, addLayerToOffscreenParent) {
Vishnu Naira0292282023-12-16 14:32:00 -0800180 LayerHierarchyBuilder hierarchyBuilder;
181 hierarchyBuilder.update(mLifecycleManager);
Vishnu Nair04f89692022-11-16 23:21:05 +0000182
183 reparentLayer(11, UNASSIGNED_LAYER_ID);
184 UPDATE_AND_VERIFY(hierarchyBuilder);
185
186 createLayer(112, 11);
187 UPDATE_AND_VERIFY(hierarchyBuilder);
188
189 std::vector<uint32_t> expectedTraversalPath = {1, 12, 121, 122, 1221, 13, 2};
190 EXPECT_EQ(getTraversalPath(hierarchyBuilder.getHierarchy()), expectedTraversalPath);
191 EXPECT_EQ(getTraversalPathInZOrder(hierarchyBuilder.getHierarchy()), expectedTraversalPath);
192 expectedTraversalPath = {11, 111, 112};
193 EXPECT_EQ(getTraversalPath(hierarchyBuilder.getOffscreenHierarchy()), expectedTraversalPath);
194}
195
196// rel-z tests
197TEST_F(LayerHierarchyTest, setRelativeParent) {
Vishnu Naira0292282023-12-16 14:32:00 -0800198 LayerHierarchyBuilder hierarchyBuilder;
199 hierarchyBuilder.update(mLifecycleManager);
Vishnu Nair04f89692022-11-16 23:21:05 +0000200 reparentRelativeLayer(11, 2);
201 UPDATE_AND_VERIFY(hierarchyBuilder);
202
203 std::vector<uint32_t> expectedTraversalPath = {1, 11, 111, 12, 121, 122, 1221, 13, 2, 11, 111};
204 EXPECT_EQ(getTraversalPath(hierarchyBuilder.getHierarchy()), expectedTraversalPath);
205 expectedTraversalPath = {1, 12, 121, 122, 1221, 13, 2, 11, 111};
206 EXPECT_EQ(getTraversalPathInZOrder(hierarchyBuilder.getHierarchy()), expectedTraversalPath);
207 expectedTraversalPath = {};
208 EXPECT_EQ(getTraversalPath(hierarchyBuilder.getOffscreenHierarchy()), expectedTraversalPath);
209}
210
211TEST_F(LayerHierarchyTest, reparentFromRelativeParentWithSetLayer) {
Vishnu Naira0292282023-12-16 14:32:00 -0800212 LayerHierarchyBuilder hierarchyBuilder;
213 hierarchyBuilder.update(mLifecycleManager);
Vishnu Nair04f89692022-11-16 23:21:05 +0000214 reparentRelativeLayer(11, 2);
215 UPDATE_AND_VERIFY(hierarchyBuilder);
216
Vishnu Nair1391de22023-03-05 19:56:14 -0800217 // This calls setLayer
218 removeRelativeZ(11);
Vishnu Nair04f89692022-11-16 23:21:05 +0000219 UPDATE_AND_VERIFY(hierarchyBuilder);
220
221 std::vector<uint32_t> expectedTraversalPath = {1, 11, 111, 12, 121, 122, 1221, 13, 2};
222 EXPECT_EQ(getTraversalPath(hierarchyBuilder.getHierarchy()), expectedTraversalPath);
223 EXPECT_EQ(getTraversalPathInZOrder(hierarchyBuilder.getHierarchy()), expectedTraversalPath);
224 expectedTraversalPath = {};
225 EXPECT_EQ(getTraversalPath(hierarchyBuilder.getOffscreenHierarchy()), expectedTraversalPath);
226}
227
228TEST_F(LayerHierarchyTest, reparentToRelativeParent) {
Vishnu Naira0292282023-12-16 14:32:00 -0800229 LayerHierarchyBuilder hierarchyBuilder;
230 hierarchyBuilder.update(mLifecycleManager);
Vishnu Nair04f89692022-11-16 23:21:05 +0000231 reparentRelativeLayer(11, 2);
232 UPDATE_AND_VERIFY(hierarchyBuilder);
233
234 reparentLayer(11, 2);
235 UPDATE_AND_VERIFY(hierarchyBuilder);
236
237 std::vector<uint32_t> expectedTraversalPath = {1, 12, 121, 122, 1221, 13, 2, 11, 111};
238 EXPECT_EQ(getTraversalPath(hierarchyBuilder.getHierarchy()), expectedTraversalPath);
239 EXPECT_EQ(getTraversalPathInZOrder(hierarchyBuilder.getHierarchy()), expectedTraversalPath);
240 expectedTraversalPath = {};
241 EXPECT_EQ(getTraversalPath(hierarchyBuilder.getOffscreenHierarchy()), expectedTraversalPath);
242}
243
244TEST_F(LayerHierarchyTest, setParentAsRelativeParent) {
Vishnu Naira0292282023-12-16 14:32:00 -0800245 LayerHierarchyBuilder hierarchyBuilder;
246 hierarchyBuilder.update(mLifecycleManager);
Vishnu Nair04f89692022-11-16 23:21:05 +0000247 reparentLayer(11, 2);
248 UPDATE_AND_VERIFY(hierarchyBuilder);
249
250 reparentRelativeLayer(11, 2);
251 UPDATE_AND_VERIFY(hierarchyBuilder);
252
253 std::vector<uint32_t> expectedTraversalPath = {1, 12, 121, 122, 1221, 13, 2, 11, 111};
254 EXPECT_EQ(getTraversalPath(hierarchyBuilder.getHierarchy()), expectedTraversalPath);
255 EXPECT_EQ(getTraversalPathInZOrder(hierarchyBuilder.getHierarchy()), expectedTraversalPath);
256 expectedTraversalPath = {};
257 EXPECT_EQ(getTraversalPath(hierarchyBuilder.getOffscreenHierarchy()), expectedTraversalPath);
258}
259
260TEST_F(LayerHierarchyTest, relativeChildMovesOffscreenIsNotTraversable) {
Vishnu Naira0292282023-12-16 14:32:00 -0800261 LayerHierarchyBuilder hierarchyBuilder;
262 hierarchyBuilder.update(mLifecycleManager);
Vishnu Nair04f89692022-11-16 23:21:05 +0000263 reparentRelativeLayer(11, 2);
264 UPDATE_AND_VERIFY(hierarchyBuilder);
265
266 reparentLayer(2, UNASSIGNED_LAYER_ID);
267 UPDATE_AND_VERIFY(hierarchyBuilder);
268
269 std::vector<uint32_t> expectedTraversalPath = {1, 11, 111, 12, 121, 122, 1221, 13};
270 EXPECT_EQ(getTraversalPath(hierarchyBuilder.getHierarchy()), expectedTraversalPath);
271 expectedTraversalPath = {1, 12, 121, 122, 1221, 13};
272 EXPECT_EQ(getTraversalPathInZOrder(hierarchyBuilder.getHierarchy()), expectedTraversalPath);
273 expectedTraversalPath = {2, 11, 111};
274 EXPECT_EQ(getTraversalPath(hierarchyBuilder.getOffscreenHierarchy()), expectedTraversalPath);
275}
276
Vishnu Nairfccd6362023-02-24 23:39:53 +0000277TEST_F(LayerHierarchyTest, reparentRelativeLayer) {
Vishnu Naira0292282023-12-16 14:32:00 -0800278 LayerHierarchyBuilder hierarchyBuilder;
279 hierarchyBuilder.update(mLifecycleManager);
Vishnu Nairfccd6362023-02-24 23:39:53 +0000280 reparentRelativeLayer(11, 2);
281 UPDATE_AND_VERIFY(hierarchyBuilder);
282
283 std::vector<uint32_t> expectedTraversalPath = {1, 11, 111, 12, 121, 122, 1221, 13, 2, 11, 111};
284 EXPECT_EQ(getTraversalPath(hierarchyBuilder.getHierarchy()), expectedTraversalPath);
285 expectedTraversalPath = {1, 12, 121, 122, 1221, 13, 2, 11, 111};
286 EXPECT_EQ(getTraversalPathInZOrder(hierarchyBuilder.getHierarchy()), expectedTraversalPath);
287 expectedTraversalPath = {};
288 EXPECT_EQ(getTraversalPath(hierarchyBuilder.getOffscreenHierarchy()), expectedTraversalPath);
289
290 reparentLayer(11, 1);
291 UPDATE_AND_VERIFY(hierarchyBuilder);
292 expectedTraversalPath = {1, 11, 111, 12, 121, 122, 1221, 13, 2, 11, 111};
293 EXPECT_EQ(getTraversalPath(hierarchyBuilder.getHierarchy()), expectedTraversalPath);
294 expectedTraversalPath = {1, 12, 121, 122, 1221, 13, 2, 11, 111};
295 EXPECT_EQ(getTraversalPathInZOrder(hierarchyBuilder.getHierarchy()), expectedTraversalPath);
296 expectedTraversalPath = {};
297 EXPECT_EQ(getTraversalPath(hierarchyBuilder.getOffscreenHierarchy()), expectedTraversalPath);
298
299 setZ(11, 0);
300 UPDATE_AND_VERIFY(hierarchyBuilder);
301 expectedTraversalPath = {1, 11, 111, 12, 121, 122, 1221, 13, 2};
302 EXPECT_EQ(getTraversalPath(hierarchyBuilder.getHierarchy()), expectedTraversalPath);
303 expectedTraversalPath = {1, 11, 111, 12, 121, 122, 1221, 13, 2};
304 EXPECT_EQ(getTraversalPathInZOrder(hierarchyBuilder.getHierarchy()), expectedTraversalPath);
305 expectedTraversalPath = {};
306 EXPECT_EQ(getTraversalPath(hierarchyBuilder.getOffscreenHierarchy()), expectedTraversalPath);
307}
308
Vishnu Nair04f89692022-11-16 23:21:05 +0000309// mirror tests
310TEST_F(LayerHierarchyTest, canTraverseMirrorLayer) {
Vishnu Naira0292282023-12-16 14:32:00 -0800311 LayerHierarchyBuilder hierarchyBuilder;
312 hierarchyBuilder.update(mLifecycleManager);
Vishnu Nair04f89692022-11-16 23:21:05 +0000313
314 mirrorLayer(/*layer*/ 14, /*parent*/ 1, /*layerToMirror*/ 11);
315 UPDATE_AND_VERIFY(hierarchyBuilder);
316
317 std::vector<uint32_t> expectedTraversalPath = {1, 11, 111, 12, 121, 122,
318 1221, 13, 14, 11, 111, 2};
319 EXPECT_EQ(getTraversalPath(hierarchyBuilder.getHierarchy()), expectedTraversalPath);
320 EXPECT_EQ(getTraversalPathInZOrder(hierarchyBuilder.getHierarchy()), expectedTraversalPath);
321 expectedTraversalPath = {};
322 EXPECT_EQ(getTraversalPath(hierarchyBuilder.getOffscreenHierarchy()), expectedTraversalPath);
323}
324
325TEST_F(LayerHierarchyTest, canMirrorOffscreenLayer) {
Vishnu Naira0292282023-12-16 14:32:00 -0800326 LayerHierarchyBuilder hierarchyBuilder;
327 hierarchyBuilder.update(mLifecycleManager);
Vishnu Nair04f89692022-11-16 23:21:05 +0000328
329 reparentLayer(11, UNASSIGNED_LAYER_ID);
330 mirrorLayer(/*layer*/ 14, /*parent*/ 1, /*layerToMirror*/ 11);
331 UPDATE_AND_VERIFY(hierarchyBuilder);
332
333 std::vector<uint32_t> expectedTraversalPath = {1, 12, 121, 122, 1221, 13, 14, 11, 111, 2};
334 EXPECT_EQ(getTraversalPath(hierarchyBuilder.getHierarchy()), expectedTraversalPath);
335 EXPECT_EQ(getTraversalPathInZOrder(hierarchyBuilder.getHierarchy()), expectedTraversalPath);
336 expectedTraversalPath = {11, 111};
337 EXPECT_EQ(getTraversalPath(hierarchyBuilder.getOffscreenHierarchy()), expectedTraversalPath);
338}
339
340TEST_F(LayerHierarchyTest, newChildLayerIsUpdatedInMirrorHierarchy) {
341 mirrorLayer(/*layer*/ 14, /*parent*/ 1, /*layerToMirror*/ 11);
342 mLifecycleManager.commitChanges();
Vishnu Naira0292282023-12-16 14:32:00 -0800343 LayerHierarchyBuilder hierarchyBuilder;
344 hierarchyBuilder.update(mLifecycleManager);
Vishnu Nair04f89692022-11-16 23:21:05 +0000345
346 createLayer(1111, 111);
347 createLayer(112, 11);
348 UPDATE_AND_VERIFY(hierarchyBuilder);
349
350 std::vector<uint32_t> expectedTraversalPath = {1, 11, 111, 1111, 112, 12, 121, 122,
351 1221, 13, 14, 11, 111, 1111, 112, 2};
352 EXPECT_EQ(getTraversalPath(hierarchyBuilder.getHierarchy()), expectedTraversalPath);
353 EXPECT_EQ(getTraversalPathInZOrder(hierarchyBuilder.getHierarchy()), expectedTraversalPath);
354 expectedTraversalPath = {};
355 EXPECT_EQ(getTraversalPath(hierarchyBuilder.getOffscreenHierarchy()), expectedTraversalPath);
356}
357
358// mirror & relatives tests
359TEST_F(LayerHierarchyTest, mirrorWithRelativeOutsideMirrorHierarchy) {
Vishnu Naira0292282023-12-16 14:32:00 -0800360 LayerHierarchyBuilder hierarchyBuilder;
361 hierarchyBuilder.update(mLifecycleManager);
Vishnu Nair04f89692022-11-16 23:21:05 +0000362 reparentRelativeLayer(111, 12);
363 mirrorLayer(/*layer*/ 14, /*parent*/ 1, /*layerToMirror*/ 11);
364
365 // ROOT
366 // ├── 1
367 // │ ├── 11
368 // │ │ └── 111
369 // │ ├── 12
370 // │ │ ├── 121
371 // │ │ ├── 122
372 // │ │ │ └── 1221
373 // │ │ └ - 111 (relative)
374 // │ ├── 13
375 // │ └── 14
376 // │ └ * 11 (mirroring)
377 // └── 2
378
379 UPDATE_AND_VERIFY(hierarchyBuilder);
380
381 std::vector<uint32_t> expectedTraversalPath = {1, 11, 111, 12, 111, 121, 122,
382 1221, 13, 14, 11, 111, 2};
383 EXPECT_EQ(getTraversalPath(hierarchyBuilder.getHierarchy()), expectedTraversalPath);
384 // 111 is not reachable in the mirror
385 expectedTraversalPath = {1, 11, 12, 111, 121, 122, 1221, 13, 14, 11, 2};
386 EXPECT_EQ(getTraversalPathInZOrder(hierarchyBuilder.getHierarchy()), expectedTraversalPath);
387 expectedTraversalPath = {};
388 EXPECT_EQ(getTraversalPath(hierarchyBuilder.getOffscreenHierarchy()), expectedTraversalPath);
389}
390
391TEST_F(LayerHierarchyTest, mirrorWithRelativeInsideMirrorHierarchy) {
Vishnu Naira0292282023-12-16 14:32:00 -0800392 LayerHierarchyBuilder hierarchyBuilder;
393 hierarchyBuilder.update(mLifecycleManager);
Vishnu Nair04f89692022-11-16 23:21:05 +0000394 reparentRelativeLayer(1221, 12);
395 mirrorLayer(/*layer*/ 14, /*parent*/ 1, /*layerToMirror*/ 12);
396
397 // ROOT
398 // ├── 1
399 // │ ├── 11
400 // │ │ └── 111
401 // │ ├── 12
402 // │ │ ├── 121
403 // │ │ ├── 122
404 // │ │ │ └── 1221
405 // │ │ └ - 1221 (relative)
406 // │ ├── 13
407 // │ └── 14
408 // │ └ * 12 (mirroring)
409 // └── 2
410
411 UPDATE_AND_VERIFY(hierarchyBuilder);
412 std::vector<uint32_t> expectedTraversalPath = {1, 11, 111, 12, 121, 122, 1221, 1221,
413 13, 14, 12, 121, 122, 1221, 1221, 2};
414 EXPECT_EQ(getTraversalPath(hierarchyBuilder.getHierarchy()), expectedTraversalPath);
415 // relative layer 1221 is traversable in the mirrored hierarchy as well
416 expectedTraversalPath = {1, 11, 111, 12, 121, 122, 1221, 13, 14, 12, 121, 122, 1221, 2};
417 EXPECT_EQ(getTraversalPathInZOrder(hierarchyBuilder.getHierarchy()), expectedTraversalPath);
418 expectedTraversalPath = {};
419 EXPECT_EQ(getTraversalPath(hierarchyBuilder.getOffscreenHierarchy()), expectedTraversalPath);
420}
421
422TEST_F(LayerHierarchyTest, childMovesOffscreenWhenRelativeParentDies) {
Vishnu Naira0292282023-12-16 14:32:00 -0800423 LayerHierarchyBuilder hierarchyBuilder;
424 hierarchyBuilder.update(mLifecycleManager);
Vishnu Nair04f89692022-11-16 23:21:05 +0000425
426 reparentRelativeLayer(11, 2);
427 reparentLayer(2, UNASSIGNED_LAYER_ID);
428 destroyLayerHandle(2);
429
430 UPDATE_AND_VERIFY(hierarchyBuilder);
431 std::vector<uint32_t> expectedTraversalPath = {1, 11, 111, 12, 121, 122, 1221, 13};
432 EXPECT_EQ(getTraversalPath(hierarchyBuilder.getHierarchy()), expectedTraversalPath);
433 expectedTraversalPath = {1, 12, 121, 122, 1221, 13};
434 EXPECT_EQ(getTraversalPathInZOrder(hierarchyBuilder.getHierarchy()), expectedTraversalPath);
435 expectedTraversalPath = {11, 111};
436 EXPECT_EQ(getTraversalPath(hierarchyBuilder.getOffscreenHierarchy()), expectedTraversalPath);
437
438 // remove relative parent so layer becomes onscreen again
Vishnu Nair1391de22023-03-05 19:56:14 -0800439 removeRelativeZ(11);
Vishnu Nair04f89692022-11-16 23:21:05 +0000440 UPDATE_AND_VERIFY(hierarchyBuilder);
441
442 expectedTraversalPath = {1, 11, 111, 12, 121, 122, 1221, 13};
443 EXPECT_EQ(getTraversalPath(hierarchyBuilder.getHierarchy()), expectedTraversalPath);
444 EXPECT_EQ(getTraversalPathInZOrder(hierarchyBuilder.getHierarchy()), expectedTraversalPath);
445 expectedTraversalPath = {};
446 EXPECT_EQ(getTraversalPath(hierarchyBuilder.getOffscreenHierarchy()), expectedTraversalPath);
447}
448
449TEST_F(LayerHierarchyTest, offscreenLayerCannotBeRelativeToOnscreenLayer) {
Vishnu Naira0292282023-12-16 14:32:00 -0800450 LayerHierarchyBuilder hierarchyBuilder;
451 hierarchyBuilder.update(mLifecycleManager);
Vishnu Nair04f89692022-11-16 23:21:05 +0000452 reparentRelativeLayer(1221, 2);
453 UPDATE_AND_VERIFY(hierarchyBuilder);
454
455 // verify relz path
456 std::vector<uint32_t> expectedTraversalPath = {1, 11, 111, 12, 121, 122, 1221, 13, 2, 1221};
457 EXPECT_EQ(getTraversalPath(hierarchyBuilder.getHierarchy()), expectedTraversalPath);
458 expectedTraversalPath = {1, 11, 111, 12, 121, 122, 13, 2, 1221};
459 EXPECT_EQ(getTraversalPathInZOrder(hierarchyBuilder.getHierarchy()), expectedTraversalPath);
460 expectedTraversalPath = {};
461 EXPECT_EQ(getTraversalPath(hierarchyBuilder.getOffscreenHierarchy()), expectedTraversalPath);
462
463 // offscreen layer cannot be reached as a relative child
464 reparentLayer(12, UNASSIGNED_LAYER_ID);
465 UPDATE_AND_VERIFY(hierarchyBuilder);
466
467 expectedTraversalPath = {1, 11, 111, 13, 2};
468 EXPECT_EQ(getTraversalPath(hierarchyBuilder.getHierarchy()), expectedTraversalPath);
469 EXPECT_EQ(getTraversalPathInZOrder(hierarchyBuilder.getHierarchy()), expectedTraversalPath);
470 expectedTraversalPath = {12, 121, 122, 1221};
471 EXPECT_EQ(getTraversalPath(hierarchyBuilder.getOffscreenHierarchy()), expectedTraversalPath);
472
473 // layer when onscreen can be reached as a relative child again
474 reparentLayer(12, 1);
475 UPDATE_AND_VERIFY(hierarchyBuilder);
476
477 expectedTraversalPath = {1, 11, 111, 12, 121, 122, 1221, 13, 2, 1221};
478 EXPECT_EQ(getTraversalPath(hierarchyBuilder.getHierarchy()), expectedTraversalPath);
479 expectedTraversalPath = {1, 11, 111, 12, 121, 122, 13, 2, 1221};
480 EXPECT_EQ(getTraversalPathInZOrder(hierarchyBuilder.getHierarchy()), expectedTraversalPath);
481 expectedTraversalPath = {};
482 EXPECT_EQ(getTraversalPath(hierarchyBuilder.getOffscreenHierarchy()), expectedTraversalPath);
483}
484
485TEST_F(LayerHierarchyTest, backgroundLayersAreBehindParentLayer) {
Vishnu Naira0292282023-12-16 14:32:00 -0800486 LayerHierarchyBuilder hierarchyBuilder;
487 hierarchyBuilder.update(mLifecycleManager);
Vishnu Nair04f89692022-11-16 23:21:05 +0000488
489 updateBackgroundColor(1, 0.5);
490 UPDATE_AND_VERIFY(hierarchyBuilder);
Vishnu Nair150065b2023-04-17 19:14:11 -0700491 auto hierarchy = hierarchyBuilder.getPartialHierarchy(1, /*childrenOnly=*/true);
492 auto bgLayerId = hierarchy.mChildren.front().first->getLayer()->id;
Vishnu Naird47bcee2023-02-24 18:08:51 +0000493 std::vector<uint32_t> expectedTraversalPath = {1, bgLayerId, 11, 111, 12,
494 121, 122, 1221, 13, 2};
Vishnu Nair04f89692022-11-16 23:21:05 +0000495 EXPECT_EQ(getTraversalPath(hierarchyBuilder.getHierarchy()), expectedTraversalPath);
Vishnu Naird47bcee2023-02-24 18:08:51 +0000496 expectedTraversalPath = {bgLayerId, 1, 11, 111, 12, 121, 122, 1221, 13, 2};
Vishnu Nair04f89692022-11-16 23:21:05 +0000497 EXPECT_EQ(getTraversalPathInZOrder(hierarchyBuilder.getHierarchy()), expectedTraversalPath);
498 expectedTraversalPath = {};
499 EXPECT_EQ(getTraversalPath(hierarchyBuilder.getOffscreenHierarchy()), expectedTraversalPath);
500}
501
502// cycle tests
503TEST_F(LayerHierarchyTest, ParentBecomesTheChild) {
504 // remove default hierarchy
505 mLifecycleManager = LayerLifecycleManager();
506 createRootLayer(1);
507 createLayer(11, 1);
508 reparentLayer(1, 11);
509 mLifecycleManager.commitChanges();
Vishnu Naira0292282023-12-16 14:32:00 -0800510 LayerHierarchyBuilder hierarchyBuilder;
511 hierarchyBuilder.update(mLifecycleManager);
Vishnu Nair04f89692022-11-16 23:21:05 +0000512
513 std::vector<uint32_t> expectedTraversalPath = {};
514 EXPECT_EQ(getTraversalPath(hierarchyBuilder.getHierarchy()), expectedTraversalPath);
515 EXPECT_EQ(getTraversalPathInZOrder(hierarchyBuilder.getHierarchy()), expectedTraversalPath);
516 expectedTraversalPath = {};
517 EXPECT_EQ(getTraversalPath(hierarchyBuilder.getOffscreenHierarchy()), expectedTraversalPath);
518}
519
520TEST_F(LayerHierarchyTest, RelativeLoops) {
521 // remove default hierarchy
522 mLifecycleManager = LayerLifecycleManager();
523 createRootLayer(1);
524 createRootLayer(2);
525 createLayer(11, 1);
526 reparentRelativeLayer(11, 2);
527 reparentRelativeLayer(2, 11);
Vishnu Naira0292282023-12-16 14:32:00 -0800528 LayerHierarchyBuilder hierarchyBuilder;
529 // this call is expected to fix the loop!
530 hierarchyBuilder.update(mLifecycleManager);
531 uint32_t unused;
532 EXPECT_FALSE(hierarchyBuilder.getHierarchy().hasRelZLoop(unused));
Vishnu Nair04f89692022-11-16 23:21:05 +0000533
534 std::vector<uint32_t> expectedTraversalPath = {1, 11, 2, 2};
535 EXPECT_EQ(getTraversalPath(hierarchyBuilder.getHierarchy()), expectedTraversalPath);
536 expectedTraversalPath = {1};
537 EXPECT_EQ(getTraversalPathInZOrder(hierarchyBuilder.getHierarchy()), expectedTraversalPath);
538 expectedTraversalPath = {11, 2};
539 EXPECT_EQ(getTraversalPath(hierarchyBuilder.getOffscreenHierarchy()), expectedTraversalPath);
540}
541
542TEST_F(LayerHierarchyTest, IndirectRelativeLoops) {
543 // remove default hierarchy
544 mLifecycleManager = LayerLifecycleManager();
545 createRootLayer(1);
546 createRootLayer(2);
547 createLayer(11, 1);
548 createLayer(111, 11);
549 createLayer(21, 2);
550 createLayer(22, 2);
551 createLayer(221, 22);
552 reparentRelativeLayer(22, 111);
553 reparentRelativeLayer(11, 221);
Vishnu Naira0292282023-12-16 14:32:00 -0800554 LayerHierarchyBuilder hierarchyBuilder;
555 // this call is expected to fix the loop!
556 hierarchyBuilder.update(mLifecycleManager);
557 uint32_t unused;
558 EXPECT_FALSE(hierarchyBuilder.getHierarchy().hasRelZLoop(unused));
Vishnu Nair04f89692022-11-16 23:21:05 +0000559
560 std::vector<uint32_t> expectedTraversalPath = {1, 11, 111, 22, 221, 2, 21, 22, 221};
561 EXPECT_EQ(getTraversalPath(hierarchyBuilder.getHierarchy()), expectedTraversalPath);
562 expectedTraversalPath = {1, 2, 21};
563 EXPECT_EQ(getTraversalPathInZOrder(hierarchyBuilder.getHierarchy()), expectedTraversalPath);
564 expectedTraversalPath = {11, 111, 22, 221};
565 EXPECT_EQ(getTraversalPath(hierarchyBuilder.getOffscreenHierarchy()), expectedTraversalPath);
566}
567
568TEST_F(LayerHierarchyTest, ReparentRootLayerToNull) {
Vishnu Naira0292282023-12-16 14:32:00 -0800569 LayerHierarchyBuilder hierarchyBuilder;
570 hierarchyBuilder.update(mLifecycleManager);
Vishnu Nair04f89692022-11-16 23:21:05 +0000571 reparentLayer(1, UNASSIGNED_LAYER_ID);
572 UPDATE_AND_VERIFY(hierarchyBuilder);
573
574 std::vector<uint32_t> expectedTraversalPath = {2};
575 EXPECT_EQ(getTraversalPath(hierarchyBuilder.getHierarchy()), expectedTraversalPath);
576 EXPECT_EQ(getTraversalPathInZOrder(hierarchyBuilder.getHierarchy()), expectedTraversalPath);
577 expectedTraversalPath = {1, 11, 111, 12, 121, 122, 1221, 13};
578 EXPECT_EQ(getTraversalPath(hierarchyBuilder.getOffscreenHierarchy()), expectedTraversalPath);
579}
580
581TEST_F(LayerHierarchyTest, AddRemoveLayerInSameTransaction) {
582 // remove default hierarchy
583 mLifecycleManager = LayerLifecycleManager();
Vishnu Naira0292282023-12-16 14:32:00 -0800584 LayerHierarchyBuilder hierarchyBuilder;
585 hierarchyBuilder.update(mLifecycleManager);
Vishnu Nair04f89692022-11-16 23:21:05 +0000586 createRootLayer(1);
587 destroyLayerHandle(1);
588 UPDATE_AND_VERIFY(hierarchyBuilder);
589
590 std::vector<uint32_t> expectedTraversalPath = {};
591 EXPECT_EQ(getTraversalPath(hierarchyBuilder.getHierarchy()), expectedTraversalPath);
592 EXPECT_EQ(getTraversalPathInZOrder(hierarchyBuilder.getHierarchy()), expectedTraversalPath);
593 EXPECT_EQ(getTraversalPath(hierarchyBuilder.getOffscreenHierarchy()), expectedTraversalPath);
594}
595
596// traversal path test
597TEST_F(LayerHierarchyTest, traversalPathId) {
598 setZ(122, -1);
Vishnu Naira0292282023-12-16 14:32:00 -0800599 LayerHierarchyBuilder hierarchyBuilder;
600 hierarchyBuilder.update(mLifecycleManager);
Vishnu Nair04f89692022-11-16 23:21:05 +0000601 auto checkTraversalPathIdVisitor =
602 [](const LayerHierarchy& hierarchy,
603 const LayerHierarchy::TraversalPath& traversalPath) -> bool {
604 EXPECT_EQ(hierarchy.getLayer()->id, traversalPath.id);
605 return true;
606 };
607 hierarchyBuilder.getHierarchy().traverse(checkTraversalPathIdVisitor);
608 hierarchyBuilder.getHierarchy().traverseInZOrder(checkTraversalPathIdVisitor);
609}
610
Vishnu Naircfb2d252023-01-19 04:44:02 +0000611TEST_F(LayerHierarchyTest, zorderRespectsLayerSequenceId) {
612 // remove default hierarchy
613 mLifecycleManager = LayerLifecycleManager();
614 createRootLayer(1);
615 createRootLayer(2);
616 createRootLayer(4);
617 createRootLayer(5);
618 createLayer(11, 1);
619 createLayer(51, 5);
620 createLayer(53, 5);
621
622 mLifecycleManager.commitChanges();
Vishnu Naira0292282023-12-16 14:32:00 -0800623 LayerHierarchyBuilder hierarchyBuilder;
624 hierarchyBuilder.update(mLifecycleManager);
Vishnu Naircfb2d252023-01-19 04:44:02 +0000625 UPDATE_AND_VERIFY(hierarchyBuilder);
626 std::vector<uint32_t> expectedTraversalPath = {1, 11, 2, 4, 5, 51, 53};
627 EXPECT_EQ(getTraversalPath(hierarchyBuilder.getHierarchy()), expectedTraversalPath);
628
629 EXPECT_EQ(getTraversalPathInZOrder(hierarchyBuilder.getHierarchy()), expectedTraversalPath);
630 expectedTraversalPath = {};
631 EXPECT_EQ(getTraversalPath(hierarchyBuilder.getOffscreenHierarchy()), expectedTraversalPath);
632
633 // A new layer is added with a smaller sequence id. Make sure its sorted correctly. While
634 // sequence ids are always incremented, this scenario can happen when a layer is reparented.
635 createRootLayer(3);
636 createLayer(52, 5);
637
638 UPDATE_AND_VERIFY(hierarchyBuilder);
639 expectedTraversalPath = {1, 11, 2, 3, 4, 5, 51, 52, 53};
640 EXPECT_EQ(getTraversalPath(hierarchyBuilder.getHierarchy()), expectedTraversalPath);
641 EXPECT_EQ(getTraversalPathInZOrder(hierarchyBuilder.getHierarchy()), expectedTraversalPath);
642 expectedTraversalPath = {};
643 EXPECT_EQ(getTraversalPath(hierarchyBuilder.getOffscreenHierarchy()), expectedTraversalPath);
644}
645
646TEST_F(LayerHierarchyTest, zorderRespectsLayerZ) {
647 // remove default hierarchy
648 mLifecycleManager = LayerLifecycleManager();
649 createRootLayer(1);
650 createLayer(11, 1);
651 createLayer(12, 1);
652 createLayer(13, 1);
653 setZ(11, -1);
654 setZ(12, 2);
655 setZ(13, 1);
656
657 mLifecycleManager.commitChanges();
Vishnu Naira0292282023-12-16 14:32:00 -0800658 LayerHierarchyBuilder hierarchyBuilder;
659 hierarchyBuilder.update(mLifecycleManager);
Vishnu Naircfb2d252023-01-19 04:44:02 +0000660 UPDATE_AND_VERIFY(hierarchyBuilder);
661 std::vector<uint32_t> expectedTraversalPath = {1, 11, 13, 12};
662 EXPECT_EQ(getTraversalPath(hierarchyBuilder.getHierarchy()), expectedTraversalPath);
663
664 expectedTraversalPath = {11, 1, 13, 12};
665 EXPECT_EQ(getTraversalPathInZOrder(hierarchyBuilder.getHierarchy()), expectedTraversalPath);
666 expectedTraversalPath = {};
667 EXPECT_EQ(getTraversalPath(hierarchyBuilder.getOffscreenHierarchy()), expectedTraversalPath);
668}
669
670TEST_F(LayerHierarchyTest, zorderRespectsLayerStack) {
671 // remove default hierarchy
672 mLifecycleManager = LayerLifecycleManager();
673 createRootLayer(1);
674 createRootLayer(2);
675 createLayer(11, 1);
676 createLayer(21, 2);
677 setLayerStack(1, 20);
678 setLayerStack(2, 10);
679
680 mLifecycleManager.commitChanges();
Vishnu Naira0292282023-12-16 14:32:00 -0800681 LayerHierarchyBuilder hierarchyBuilder;
682 hierarchyBuilder.update(mLifecycleManager);
Vishnu Naircfb2d252023-01-19 04:44:02 +0000683 UPDATE_AND_VERIFY(hierarchyBuilder);
Vishnu Nair444f3952023-04-11 13:01:02 -0700684 std::vector<uint32_t> expectedTraversalPath = {2, 21, 1, 11};
Vishnu Naircfb2d252023-01-19 04:44:02 +0000685 EXPECT_EQ(getTraversalPath(hierarchyBuilder.getHierarchy()), expectedTraversalPath);
686
Vishnu Naircfb2d252023-01-19 04:44:02 +0000687 EXPECT_EQ(getTraversalPathInZOrder(hierarchyBuilder.getHierarchy()), expectedTraversalPath);
688 expectedTraversalPath = {};
689 EXPECT_EQ(getTraversalPath(hierarchyBuilder.getOffscreenHierarchy()), expectedTraversalPath);
690}
691
Vishnu Naira9c43762023-01-27 19:10:25 +0000692TEST_F(LayerHierarchyTest, canMirrorDisplay) {
Vishnu Naira0292282023-12-16 14:32:00 -0800693 LayerHierarchyBuilder hierarchyBuilder;
694 hierarchyBuilder.update(mLifecycleManager);
Vishnu Naira9c43762023-01-27 19:10:25 +0000695 setFlags(12, layer_state_t::eLayerSkipScreenshot, layer_state_t::eLayerSkipScreenshot);
696 createDisplayMirrorLayer(3, ui::LayerStack::fromValue(0));
697 setLayerStack(3, 1);
698 UPDATE_AND_VERIFY(hierarchyBuilder);
699
Vishnu Nair444f3952023-04-11 13:01:02 -0700700 std::vector<uint32_t> expected = {1, 11, 111, 12, 121, 122, 1221, 13, 2, 3,
701 1, 11, 111, 12, 121, 122, 1221, 13, 2};
Vishnu Naira9c43762023-01-27 19:10:25 +0000702 EXPECT_EQ(getTraversalPath(hierarchyBuilder.getHierarchy()), expected);
703 EXPECT_EQ(getTraversalPathInZOrder(hierarchyBuilder.getHierarchy()), expected);
704 expected = {};
705 EXPECT_EQ(getTraversalPath(hierarchyBuilder.getOffscreenHierarchy()), expected);
706}
707
708TEST_F(LayerHierarchyTest, mirrorNonExistingDisplay) {
Vishnu Naira0292282023-12-16 14:32:00 -0800709 LayerHierarchyBuilder hierarchyBuilder;
710 hierarchyBuilder.update(mLifecycleManager);
Vishnu Naira9c43762023-01-27 19:10:25 +0000711 setFlags(12, layer_state_t::eLayerSkipScreenshot, layer_state_t::eLayerSkipScreenshot);
712 createDisplayMirrorLayer(3, ui::LayerStack::fromValue(5));
713 setLayerStack(3, 1);
714 UPDATE_AND_VERIFY(hierarchyBuilder);
715
Vishnu Nair444f3952023-04-11 13:01:02 -0700716 std::vector<uint32_t> expected = {1, 11, 111, 12, 121, 122, 1221, 13, 2, 3};
Vishnu Naira9c43762023-01-27 19:10:25 +0000717 EXPECT_EQ(getTraversalPath(hierarchyBuilder.getHierarchy()), expected);
718 EXPECT_EQ(getTraversalPathInZOrder(hierarchyBuilder.getHierarchy()), expected);
719 expected = {};
720 EXPECT_EQ(getTraversalPath(hierarchyBuilder.getOffscreenHierarchy()), expected);
721}
722
723TEST_F(LayerHierarchyTest, newRootLayerIsMirrored) {
Vishnu Naira0292282023-12-16 14:32:00 -0800724 LayerHierarchyBuilder hierarchyBuilder;
725 hierarchyBuilder.update(mLifecycleManager);
Vishnu Naira9c43762023-01-27 19:10:25 +0000726 setFlags(12, layer_state_t::eLayerSkipScreenshot, layer_state_t::eLayerSkipScreenshot);
727 createDisplayMirrorLayer(3, ui::LayerStack::fromValue(0));
728 setLayerStack(3, 1);
729 UPDATE_AND_VERIFY(hierarchyBuilder);
730
731 createRootLayer(4);
732 UPDATE_AND_VERIFY(hierarchyBuilder);
733
Vishnu Nair444f3952023-04-11 13:01:02 -0700734 std::vector<uint32_t> expected = {1, 11, 111, 12, 121, 122, 1221, 13, 2, 4, 3,
735 1, 11, 111, 12, 121, 122, 1221, 13, 2, 4};
Vishnu Naira9c43762023-01-27 19:10:25 +0000736 EXPECT_EQ(getTraversalPath(hierarchyBuilder.getHierarchy()), expected);
737 EXPECT_EQ(getTraversalPathInZOrder(hierarchyBuilder.getHierarchy()), expected);
738 expected = {};
739 EXPECT_EQ(getTraversalPath(hierarchyBuilder.getOffscreenHierarchy()), expected);
740}
741
742TEST_F(LayerHierarchyTest, removedRootLayerIsNoLongerMirrored) {
Vishnu Naira0292282023-12-16 14:32:00 -0800743 LayerHierarchyBuilder hierarchyBuilder;
744 hierarchyBuilder.update(mLifecycleManager);
Vishnu Naira9c43762023-01-27 19:10:25 +0000745 setFlags(12, layer_state_t::eLayerSkipScreenshot, layer_state_t::eLayerSkipScreenshot);
746 createDisplayMirrorLayer(3, ui::LayerStack::fromValue(0));
747 setLayerStack(3, 1);
748 UPDATE_AND_VERIFY(hierarchyBuilder);
749
750 reparentLayer(1, UNASSIGNED_LAYER_ID);
751 destroyLayerHandle(1);
752 UPDATE_AND_VERIFY(hierarchyBuilder);
753
Vishnu Nair444f3952023-04-11 13:01:02 -0700754 std::vector<uint32_t> expected = {2, 3, 2};
Vishnu Naira9c43762023-01-27 19:10:25 +0000755 EXPECT_EQ(getTraversalPath(hierarchyBuilder.getHierarchy()), expected);
756 EXPECT_EQ(getTraversalPathInZOrder(hierarchyBuilder.getHierarchy()), expected);
757 expected = {11, 111, 12, 121, 122, 1221, 13};
758 EXPECT_EQ(getTraversalPath(hierarchyBuilder.getOffscreenHierarchy()), expected);
759}
760
Vishnu Nair6f878312023-09-08 11:05:01 -0700761TEST_F(LayerHierarchyTest, canMirrorDisplayWithMirrors) {
Vishnu Naira0292282023-12-16 14:32:00 -0800762 LayerHierarchyBuilder hierarchyBuilder;
763 hierarchyBuilder.update(mLifecycleManager);
Vishnu Nair6f878312023-09-08 11:05:01 -0700764 reparentLayer(12, UNASSIGNED_LAYER_ID);
765 mirrorLayer(/*layer*/ 14, /*parent*/ 1, /*layerToMirror*/ 11);
766 UPDATE_AND_VERIFY(hierarchyBuilder);
767
768 createDisplayMirrorLayer(3, ui::LayerStack::fromValue(0));
769 setLayerStack(3, 1);
770 UPDATE_AND_VERIFY(hierarchyBuilder);
771
772 std::vector<uint32_t> expected = {1, 11, 111, 13, 14, 11, 111, 2, 3,
773 1, 11, 111, 13, 14, 11, 111, 2};
774 EXPECT_EQ(getTraversalPath(hierarchyBuilder.getHierarchy()), expected);
775 EXPECT_EQ(getTraversalPathInZOrder(hierarchyBuilder.getHierarchy()), expected);
776 expected = {12, 121, 122, 1221};
777 EXPECT_EQ(getTraversalPath(hierarchyBuilder.getOffscreenHierarchy()), expected);
778}
779
Vishnu Nair04f89692022-11-16 23:21:05 +0000780} // namespace android::surfaceflinger::frontend