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