• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1/*
2 * Copyright (C) 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 ANYf KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17import {assertDefined} from 'common/assert_utils';
18import {InMemoryStorage} from 'common/in_memory_storage';
19import {Rect} from 'common/rect';
20import {TracePositionUpdate} from 'messaging/winscope_event';
21import {TraceBuilder} from 'test/unit/trace_builder';
22import {UnitTestUtils} from 'test/unit/utils';
23import {Trace} from 'trace/trace';
24import {Traces} from 'trace/traces';
25import {TraceType} from 'trace/trace_type';
26import {HierarchyTreeNode} from 'trace/tree_node/hierarchy_tree_node';
27import {NotifyHierarchyViewCallbackType} from 'viewers/common/abstract_hierarchy_viewer_presenter';
28import {AbstractHierarchyViewerPresenterTest} from 'viewers/common/abstract_hierarchy_viewer_presenter_test';
29import {DiffType} from 'viewers/common/diff_type';
30import {UiDataHierarchy} from 'viewers/common/ui_data_hierarchy';
31import {UiHierarchyTreeNode} from 'viewers/common/ui_hierarchy_tree_node';
32import {UiTreeUtils} from 'viewers/common/ui_tree_utils';
33import {Presenter} from './presenter';
34
35class PresenterWindowManagerTest extends AbstractHierarchyViewerPresenterTest {
36  private trace: Trace<HierarchyTreeNode> | undefined;
37  private positionUpdate: TracePositionUpdate | undefined;
38  private secondPositionUpdate: TracePositionUpdate | undefined;
39  private selectedTree: UiHierarchyTreeNode | undefined;
40  private selectedTreeAfterPositionUpdate: UiHierarchyTreeNode | undefined;
41
42  override readonly shouldExecuteFlatTreeTest = true;
43  override readonly shouldExecuteRectTests = true;
44  override readonly shouldExecuteShowDiffTests = true;
45  override readonly shouldExecuteSimplifyNamesTest = true;
46
47  override readonly numberOfDefaultProperties = 29;
48  override readonly numberOfNonDefaultProperties = 21;
49  override readonly expectedFirstRect = new Rect(0, 0, 1080, 2400);
50  override readonly propertiesFilterString = 'requested';
51  override readonly expectedTotalRects = 12;
52  override readonly expectedVisibleRects = 7;
53  override readonly treeNodeLongName =
54    'f7092ed com.google.android.apps.nexuslauncher/.NexusLauncherActivity';
55  override readonly treeNodeShortName =
56    'com.google.(...).NexusLauncherActivity';
57  override readonly numberOfFilteredProperties = 2;
58  override readonly hierarchyFilterString = 'ScreenDecor';
59  override readonly expectedHierarchyChildrenAfterStringFilter = 2;
60  override readonly propertyWithDiff = 'animator';
61  override readonly expectedPropertyDiffType = DiffType.ADDED;
62
63  private readonly numberOfFlattenedChildren = 68;
64  private readonly numberOfVisibleChildren = 6;
65  private readonly numberOfNestedChildren = 1;
66
67  override async setUpTestEnvironment(): Promise<void> {
68    this.trace = new TraceBuilder<HierarchyTreeNode>()
69      .setType(TraceType.WINDOW_MANAGER)
70      .setEntries([
71        await UnitTestUtils.getWindowManagerState(0),
72        await UnitTestUtils.getWindowManagerState(1),
73      ])
74      .build();
75
76    const firstEntry = this.trace.getEntry(0);
77    this.positionUpdate = TracePositionUpdate.fromTraceEntry(firstEntry);
78    this.secondPositionUpdate = TracePositionUpdate.fromTraceEntry(
79      this.trace.getEntry(1),
80    );
81
82    const firstEntryDataTree = await firstEntry.getValue();
83    this.selectedTree = UiHierarchyTreeNode.from(
84      assertDefined(
85        firstEntryDataTree.findDfs(UiTreeUtils.makeIdFilter('93d3f3c')),
86      ),
87    );
88    this.selectedTreeAfterPositionUpdate = UiHierarchyTreeNode.from(
89      assertDefined(
90        firstEntryDataTree.findDfs(UiTreeUtils.makeIdFilter('f7092ed')),
91      ),
92    );
93  }
94
95  override createPresenterWithEmptyTrace(
96    callback: NotifyHierarchyViewCallbackType,
97  ): Presenter {
98    const trace = new TraceBuilder<HierarchyTreeNode>()
99      .setType(TraceType.WINDOW_MANAGER)
100      .setEntries([])
101      .build();
102    const traces = new Traces();
103    traces.addTrace(trace);
104    return new Presenter(trace, traces, new InMemoryStorage(), callback);
105  }
106
107  override createPresenter(
108    callback: NotifyHierarchyViewCallbackType,
109  ): Presenter {
110    const traces = new Traces();
111    const trace = assertDefined(this.trace);
112    traces.addTrace(trace);
113    return new Presenter(trace, traces, new InMemoryStorage(), callback);
114  }
115
116  override getPositionUpdate(): TracePositionUpdate {
117    return assertDefined(this.positionUpdate);
118  }
119
120  override getSecondPositionUpdate(): TracePositionUpdate {
121    return assertDefined(this.secondPositionUpdate);
122  }
123
124  override getShowDiffPositionUpdate(): TracePositionUpdate {
125    return assertDefined(this.positionUpdate);
126  }
127
128  override getExpectedChildrenBeforeVisibilityFilter(): number {
129    return this.numberOfFlattenedChildren;
130  }
131
132  override getExpectedChildrenAfterVisibilityFilter(): number {
133    return this.numberOfVisibleChildren;
134  }
135
136  override getExpectedChildrenBeforeFlatFilter(): number {
137    return this.numberOfNestedChildren;
138  }
139
140  override getExpectedChildrenAfterFlatFilter(): number {
141    return this.numberOfFlattenedChildren;
142  }
143
144  override getExpectedHierarchyChildrenBeforeStringFilter(): number {
145    return this.numberOfFlattenedChildren;
146  }
147
148  override getSelectedTree(): UiHierarchyTreeNode {
149    return assertDefined(this.selectedTree);
150  }
151
152  override getSelectedTreeAfterPositionUpdate(): UiHierarchyTreeNode {
153    return assertDefined(this.selectedTreeAfterPositionUpdate);
154  }
155
156  override executeChecksForPropertiesTreeAfterPositionUpdate(
157    uiData: UiDataHierarchy,
158  ) {
159    const propertiesTree = assertDefined(uiData.propertiesTree);
160    expect(
161      assertDefined(propertiesTree.getChildByName('state')).formattedValue(),
162    ).toEqual('STOPPED');
163  }
164
165  override executeChecksForPropertiesTreeAfterSecondPositionUpdate(
166    uiData: UiDataHierarchy,
167  ) {
168    const propertiesTree = assertDefined(uiData.propertiesTree);
169    expect(
170      assertDefined(propertiesTree.getChildByName('state')).formattedValue(),
171    ).toEqual('RESUMED');
172  }
173}
174
175describe('PresenterWindowManager', () => {
176  new PresenterWindowManagerTest().execute();
177});
178