blob: 7d77126fd7d4c69b161db10e0b6a7f2059dea7ba [file] [log] [blame]
Vishnu Nair8248b7c2018-08-01 10:13:36 -07001/*
2 * Copyright (C) 2018 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
17package com.android.server.wm.flicker;
18
19import static com.android.server.wm.flicker.TestFileUtils.readTestFile;
20
21import static com.google.common.truth.Truth.assertThat;
22import static com.google.common.truth.Truth.assertWithMessage;
23
24import static org.junit.Assert.fail;
25
26import android.content.Context;
27import android.graphics.Point;
28import android.graphics.Rect;
Vishnu Nair8248b7c2018-08-01 10:13:36 -070029import android.view.WindowManager;
30
Brett Chabot502ec7a2019-03-01 14:43:20 -080031import androidx.test.InstrumentationRegistry;
32
Vishnu Nair8248b7c2018-08-01 10:13:36 -070033import org.junit.Test;
34
35import java.util.List;
36import java.util.stream.Collectors;
37
38/**
39 * Contains {@link LayersTrace} tests.
40 * To run this test: {@code atest FlickerLibTest:LayersTraceTest}
41 */
42public class LayersTraceTest {
43 private static LayersTrace readLayerTraceFromFile(String relativePath) {
44 try {
45 return LayersTrace.parseFrom(readTestFile(relativePath));
46 } catch (Exception e) {
47 throw new RuntimeException(e);
48 }
49 }
50
51 private static Rect getDisplayBounds() {
52 Point display = new Point();
53 WindowManager wm =
54 (WindowManager) InstrumentationRegistry.getContext().getSystemService(
55 Context.WINDOW_SERVICE);
56 wm.getDefaultDisplay().getRealSize(display);
57 return new Rect(0, 0, display.x, display.y);
58 }
59
60 @Test
61 public void canParseAllLayers() {
62 LayersTrace trace = readLayerTraceFromFile(
63 "layers_trace_emptyregion.pb");
64 assertThat(trace.getEntries()).isNotEmpty();
65 assertThat(trace.getEntries().get(0).getTimestamp()).isEqualTo(2307984557311L);
66 assertThat(trace.getEntries().get(trace.getEntries().size() - 1).getTimestamp())
67 .isEqualTo(2308521813510L);
68 List<LayersTrace.Layer> flattenedLayers = trace.getEntries().get(0).asFlattenedLayers();
69 String msg = "Layers:\n" + flattenedLayers.stream().map(layer -> layer.mProto.name)
70 .collect(Collectors.joining("\n\t"));
71 assertWithMessage(msg).that(flattenedLayers).hasSize(47);
72 }
73
74 @Test
75 public void canParseVisibleLayers() {
76 LayersTrace trace = readLayerTraceFromFile(
77 "layers_trace_emptyregion.pb");
78 assertThat(trace.getEntries()).isNotEmpty();
79 assertThat(trace.getEntries().get(0).getTimestamp()).isEqualTo(2307984557311L);
80 assertThat(trace.getEntries().get(trace.getEntries().size() - 1).getTimestamp())
81 .isEqualTo(2308521813510L);
82 List<LayersTrace.Layer> flattenedLayers = trace.getEntries().get(0).asFlattenedLayers();
83 List<LayersTrace.Layer> visibleLayers = flattenedLayers.stream()
84 .filter(layer -> layer.isVisible() && !layer.isHiddenByParent())
85 .collect(Collectors.toList());
86
87 String msg = "Visible Layers:\n" + visibleLayers.stream()
88 .map(layer -> layer.mProto.name)
89 .collect(Collectors.joining("\n\t"));
90
91 assertWithMessage(msg).that(visibleLayers).hasSize(9);
92 }
93
94 @Test
95 public void canParseLayerHierarchy() {
96 LayersTrace trace = readLayerTraceFromFile(
97 "layers_trace_emptyregion.pb");
98 assertThat(trace.getEntries()).isNotEmpty();
99 assertThat(trace.getEntries().get(0).getTimestamp()).isEqualTo(2307984557311L);
100 assertThat(trace.getEntries().get(trace.getEntries().size() - 1).getTimestamp())
101 .isEqualTo(2308521813510L);
102 List<LayersTrace.Layer> layers = trace.getEntries().get(0).getRootLayers();
103 assertThat(layers).hasSize(2);
104 assertThat(layers.get(0).mChildren).hasSize(layers.get(0).mProto.children.length);
105 assertThat(layers.get(1).mChildren).hasSize(layers.get(1).mProto.children.length);
106 }
107
108 // b/76099859
109 @Test
110 public void canDetectOrphanLayers() {
111 try {
112 readLayerTraceFromFile(
113 "layers_trace_orphanlayers.pb");
114 fail("Failed to detect orphaned layers.");
115 } catch (RuntimeException exception) {
116 assertThat(exception.getMessage()).contains(
117 "Failed to parse layers trace. Found orphan layers "
118 + "with parent layer id:1006 : 49");
119 }
120 }
121
122 // b/75276931
123 @Test
124 public void canDetectUncoveredRegion() {
125 LayersTrace trace = readLayerTraceFromFile(
126 "layers_trace_emptyregion.pb");
127 LayersTrace.Entry entry = trace.getEntry(2308008331271L);
128
129 Assertions.Result result = entry.coversRegion(getDisplayBounds());
130
131 assertThat(result.failed()).isTrue();
132 assertThat(result.reason).contains("Region to test: Rect(0, 0 - 1440, 2880)");
133 assertThat(result.reason).contains("first empty point: 0, 99");
134 assertThat(result.reason).contains("visible regions:");
135 assertWithMessage("Reason contains list of visible regions")
136 .that(result.reason).contains("StatusBar#0Rect(0, 0 - 1440, 98");
137 }
138
139 // Visible region tests
140 @Test
141 public void canTestLayerVisibleRegion_layerDoesNotExist() {
142 LayersTrace trace = readLayerTraceFromFile(
143 "layers_trace_emptyregion.pb");
144 LayersTrace.Entry entry = trace.getEntry(2308008331271L);
145
146 final Rect expectedVisibleRegion = new Rect(0, 0, 1, 1);
147 Assertions.Result result = entry.hasVisibleRegion("ImaginaryLayer",
148 expectedVisibleRegion);
149
150 assertThat(result.failed()).isTrue();
151 assertThat(result.reason).contains("Could not find ImaginaryLayer");
152 }
153
154 @Test
155 public void canTestLayerVisibleRegion_layerDoesNotHaveExpectedVisibleRegion() {
156 LayersTrace trace = readLayerTraceFromFile(
157 "layers_trace_emptyregion.pb");
158 LayersTrace.Entry entry = trace.getEntry(2307993020072L);
159
160 final Rect expectedVisibleRegion = new Rect(0, 0, 1, 1);
161 Assertions.Result result = entry.hasVisibleRegion("NexusLauncherActivity#2",
162 expectedVisibleRegion);
163
164 assertThat(result.failed()).isTrue();
165 assertThat(result.reason).contains(
166 "Layer com.google.android.apps.nexuslauncher/com.google.android.apps"
167 + ".nexuslauncher.NexusLauncherActivity#2 is invisible: activeBuffer=null"
168 + " type != ColorLayer flags=1 (FLAG_HIDDEN set) visible region is empty");
169 }
170
171 @Test
172 public void canTestLayerVisibleRegion_layerIsHiddenByParent() {
173 LayersTrace trace = readLayerTraceFromFile(
174 "layers_trace_emptyregion.pb");
175 LayersTrace.Entry entry = trace.getEntry(2308455948035L);
176
177 final Rect expectedVisibleRegion = new Rect(0, 0, 1, 1);
178 Assertions.Result result = entry.hasVisibleRegion(
179 "SurfaceView - com.android.chrome/com.google.android.apps.chrome.Main",
180 expectedVisibleRegion);
181
182 assertThat(result.failed()).isTrue();
183 assertThat(result.reason).contains(
184 "Layer SurfaceView - com.android.chrome/com.google.android.apps.chrome.Main#0 is "
185 + "hidden by parent: com.android.chrome/com.google.android.apps.chrome"
186 + ".Main#0");
187 }
188
189 @Test
190 public void canTestLayerVisibleRegion_incorrectRegionSize() {
191 LayersTrace trace = readLayerTraceFromFile(
192 "layers_trace_emptyregion.pb");
193 LayersTrace.Entry entry = trace.getEntry(2308008331271L);
194
195 final Rect expectedVisibleRegion = new Rect(0, 0, 1440, 99);
196 Assertions.Result result = entry.hasVisibleRegion(
197 "StatusBar",
198 expectedVisibleRegion);
199
200 assertThat(result.failed()).isTrue();
201 assertThat(result.reason).contains("StatusBar#0 has visible "
202 + "region:Rect(0, 0 - 1440, 98) expected:Rect(0, 0 - 1440, 99)");
203 }
204
205 @Test
206 public void canTestLayerVisibleRegion() {
207 LayersTrace trace = readLayerTraceFromFile(
208 "layers_trace_emptyregion.pb");
209 LayersTrace.Entry entry = trace.getEntry(2308008331271L);
210
211 final Rect expectedVisibleRegion = new Rect(0, 0, 1440, 98);
212 Assertions.Result result = entry.hasVisibleRegion("StatusBar", expectedVisibleRegion);
213
214 assertThat(result.passed()).isTrue();
215 }
216
217 @Test
218 public void canTestLayerVisibleRegion_layerIsNotVisible() {
219 LayersTrace trace = readLayerTraceFromFile(
220 "layers_trace_invalid_layer_visibility.pb");
221 LayersTrace.Entry entry = trace.getEntry(252794268378458L);
222
223 Assertions.Result result = entry.isVisible("com.android.server.wm.flicker.testapp");
224 assertThat(result.failed()).isTrue();
225 assertThat(result.reason).contains(
226 "Layer com.android.server.wm.flicker.testapp/com.android.server.wm.flicker"
227 + ".testapp.SimpleActivity#0 is invisible: type != ColorLayer visible "
228 + "region is empty");
229 }
230}