1/* 2 * Copyright (C) 2024 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 17import {TimestampConverterUtils} from 'common/time/test_utils'; 18import {PropertyTreeBuilder} from 'test/unit/property_tree_builder'; 19import {PropertySource} from 'trace/tree_node/property_tree_node'; 20import {AddStatus} from './add_status'; 21 22describe('AddStatus', () => { 23 let operation: AddStatus; 24 const time0 = TimestampConverterUtils.makeRealTimestamp(0n); 25 const time10 = TimestampConverterUtils.makeRealTimestamp(10n); 26 27 beforeEach(() => { 28 operation = new AddStatus(); 29 }); 30 31 it('adds aborted true due to wm abort time', () => { 32 const propertyRoot = new PropertyTreeBuilder() 33 .setIsRoot(true) 34 .setRootId('TransitionsTraceEntry') 35 .setName('transition') 36 .setChildren([ 37 {name: 'wmData', children: [{name: 'abortTimeNs', value: time10}]}, 38 {name: 'shellData', value: null}, 39 ]) 40 .build(); 41 42 const expectedRoot = new PropertyTreeBuilder() 43 .setIsRoot(true) 44 .setRootId('TransitionsTraceEntry') 45 .setName('transition') 46 .setChildren([ 47 {name: 'wmData', children: [{name: 'abortTimeNs', value: time10}]}, 48 {name: 'shellData', value: null}, 49 {name: 'aborted', value: true, source: PropertySource.CALCULATED}, 50 {name: 'merged', value: false, source: PropertySource.CALCULATED}, 51 {name: 'played', value: false, source: PropertySource.CALCULATED}, 52 ]) 53 .build(); 54 55 operation.apply(propertyRoot); 56 expect(propertyRoot).toEqual(expectedRoot); 57 }); 58 59 it('adds aborted true due to shell abort time', () => { 60 const propertyRoot = new PropertyTreeBuilder() 61 .setIsRoot(true) 62 .setRootId('TransitionsTraceEntry') 63 .setName('transition') 64 .setChildren([ 65 {name: 'shellData', children: [{name: 'abortTimeNs', value: time10}]}, 66 {name: 'wmData', value: null}, 67 ]) 68 .build(); 69 70 const expectedRoot = new PropertyTreeBuilder() 71 .setIsRoot(true) 72 .setRootId('TransitionsTraceEntry') 73 .setName('transition') 74 .setChildren([ 75 {name: 'shellData', children: [{name: 'abortTimeNs', value: time10}]}, 76 {name: 'wmData', value: null}, 77 {name: 'aborted', value: true, source: PropertySource.CALCULATED}, 78 {name: 'merged', value: false, source: PropertySource.CALCULATED}, 79 {name: 'played', value: false, source: PropertySource.CALCULATED}, 80 ]) 81 .build(); 82 83 operation.apply(propertyRoot); 84 expect(propertyRoot).toEqual(expectedRoot); 85 }); 86 87 it('adds aborted false due to 0 abort time', () => { 88 const propertyRoot = new PropertyTreeBuilder() 89 .setIsRoot(true) 90 .setRootId('TransitionsTraceEntry') 91 .setName('transition') 92 .setChildren([ 93 {name: 'wmData', children: [{name: 'abortTimeNs', value: time0}]}, 94 {name: 'shellData', children: [{name: 'abortTimeNs', value: time0}]}, 95 ]) 96 .build(); 97 98 const expectedRoot = new PropertyTreeBuilder() 99 .setIsRoot(true) 100 .setRootId('TransitionsTraceEntry') 101 .setName('transition') 102 .setChildren([ 103 {name: 'wmData', children: [{name: 'abortTimeNs', value: time0}]}, 104 { 105 name: 'shellData', 106 children: [{name: 'abortTimeNs', value: time0}], 107 }, 108 {name: 'aborted', value: false, source: PropertySource.CALCULATED}, 109 {name: 'merged', value: false, source: PropertySource.CALCULATED}, 110 {name: 'played', value: false, source: PropertySource.CALCULATED}, 111 ]) 112 .build(); 113 114 operation.apply(propertyRoot); 115 expect(propertyRoot).toEqual(expectedRoot); 116 }); 117 118 it('adds merged true', () => { 119 const propertyRoot = new PropertyTreeBuilder() 120 .setIsRoot(true) 121 .setRootId('TransitionsTraceEntry') 122 .setName('transition') 123 .setChildren([ 124 {name: 'wmData', value: null}, 125 {name: 'shellData', children: [{name: 'mergeTimeNs', value: time10}]}, 126 ]) 127 .build(); 128 129 const expectedRoot = new PropertyTreeBuilder() 130 .setIsRoot(true) 131 .setRootId('TransitionsTraceEntry') 132 .setName('transition') 133 .setChildren([ 134 {name: 'wmData', value: null}, 135 { 136 name: 'shellData', 137 children: [{name: 'mergeTimeNs', value: time10}], 138 }, 139 {name: 'aborted', value: false, source: PropertySource.CALCULATED}, 140 {name: 'merged', value: true, source: PropertySource.CALCULATED}, 141 {name: 'played', value: false, source: PropertySource.CALCULATED}, 142 ]) 143 .build(); 144 145 operation.apply(propertyRoot); 146 expect(propertyRoot).toEqual(expectedRoot); 147 }); 148 149 it('adds merged false due to 0 merge time', () => { 150 const propertyRoot = new PropertyTreeBuilder() 151 .setIsRoot(true) 152 .setRootId('TransitionsTraceEntry') 153 .setName('transition') 154 .setChildren([ 155 {name: 'wmData', value: null}, 156 {name: 'shellData', children: [{name: 'mergeTimeNs', value: time0}]}, 157 ]) 158 .build(); 159 160 const expectedRoot = new PropertyTreeBuilder() 161 .setIsRoot(true) 162 .setRootId('TransitionsTraceEntry') 163 .setName('transition') 164 .setChildren([ 165 {name: 'wmData', value: null}, 166 { 167 name: 'shellData', 168 children: [{name: 'mergeTimeNs', value: time0}], 169 }, 170 {name: 'aborted', value: false, source: PropertySource.CALCULATED}, 171 {name: 'merged', value: false, source: PropertySource.CALCULATED}, 172 {name: 'played', value: false, source: PropertySource.CALCULATED}, 173 ]) 174 .build(); 175 176 operation.apply(propertyRoot); 177 expect(propertyRoot).toEqual(expectedRoot); 178 }); 179 180 it('adds played true', () => { 181 const propertyRoot = new PropertyTreeBuilder() 182 .setIsRoot(true) 183 .setRootId('TransitionsTraceEntry') 184 .setName('transition') 185 .setChildren([ 186 { 187 name: 'wmData', 188 children: [{name: 'finishTimeNs', value: time10}], 189 }, 190 {name: 'shellData', value: null}, 191 ]) 192 .build(); 193 194 const expectedRoot = new PropertyTreeBuilder() 195 .setIsRoot(true) 196 .setRootId('TransitionsTraceEntry') 197 .setName('transition') 198 .setChildren([ 199 { 200 name: 'wmData', 201 children: [{name: 'finishTimeNs', value: time10}], 202 }, 203 {name: 'shellData', value: null}, 204 {name: 'aborted', value: false, source: PropertySource.CALCULATED}, 205 {name: 'merged', value: false, source: PropertySource.CALCULATED}, 206 {name: 'played', value: true, source: PropertySource.CALCULATED}, 207 ]) 208 .build(); 209 210 operation.apply(propertyRoot); 211 expect(propertyRoot).toEqual(expectedRoot); 212 }); 213 214 it('adds played false due to 0 finish time', () => { 215 const propertyRoot = new PropertyTreeBuilder() 216 .setIsRoot(true) 217 .setRootId('TransitionsTraceEntry') 218 .setName('transition') 219 .setChildren([ 220 {name: 'wmData', value: null}, 221 {name: 'shellData', children: [{name: 'finishTimeNs', value: time0}]}, 222 ]) 223 .build(); 224 225 const expectedRoot = new PropertyTreeBuilder() 226 .setIsRoot(true) 227 .setRootId('TransitionsTraceEntry') 228 .setName('transition') 229 .setChildren([ 230 {name: 'wmData', value: null}, 231 { 232 name: 'shellData', 233 children: [{name: 'finishTimeNs', value: time0}], 234 }, 235 {name: 'aborted', value: false, source: PropertySource.CALCULATED}, 236 {name: 'merged', value: false, source: PropertySource.CALCULATED}, 237 {name: 'played', value: false, source: PropertySource.CALCULATED}, 238 ]) 239 .build(); 240 241 operation.apply(propertyRoot); 242 expect(propertyRoot).toEqual(expectedRoot); 243 }); 244}); 245