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