1/* 2 * Copyright (C) 2023 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 {assertDefined} from 'common/assert_utils'; 18import { 19 TimestampConverterUtils, 20 timestampEqualityTester, 21} from 'common/time/test_utils'; 22import {UnitTestUtils} from 'test/unit/utils'; 23import {CoarseVersion} from 'trace/coarse_version'; 24import {Parser} from 'trace/parser'; 25import {TraceType} from 'trace/trace_type'; 26import {PropertyTreeNode} from 'trace/tree_node/property_tree_node'; 27 28describe('Perfetto ParserTransitions', () => { 29 describe('valid trace', () => { 30 let parser: Parser<PropertyTreeNode>; 31 32 beforeAll(async () => { 33 jasmine.addCustomEqualityTester(timestampEqualityTester); 34 parser = await UnitTestUtils.getPerfettoParser( 35 TraceType.TRANSITION, 36 'traces/perfetto/shell_transitions_trace.perfetto-trace', 37 ); 38 }); 39 40 it('has expected trace type', () => { 41 expect(parser.getTraceType()).toEqual(TraceType.TRANSITION); 42 }); 43 44 it('has expected coarse version', () => { 45 expect(parser.getCoarseVersion()).toEqual(CoarseVersion.LATEST); 46 }); 47 48 it('provides timestamps', () => { 49 const expected = [ 50 TimestampConverterUtils.makeRealTimestamp(1700573425448299306n), 51 TimestampConverterUtils.makeRealTimestamp(1700573426522433299n), 52 TimestampConverterUtils.makeRealTimestamp(1700573433040642612n), 53 TimestampConverterUtils.makeRealTimestamp(1700573433279358351n), 54 ]; 55 const actual = assertDefined(parser.getTimestamps()); 56 expect(actual).toEqual(expected); 57 }); 58 59 it('decodes transition properties', async () => { 60 const entry = await parser.getEntry(0); 61 const wmDataNode = assertDefined(entry.getChildByName('wmData')); 62 const shellDataNode = assertDefined(entry.getChildByName('shellData')); 63 64 expect(entry.getChildByName('id')?.getValue()).toEqual(32n); 65 expect( 66 wmDataNode.getChildByName('createTimeNs')?.formattedValue(), 67 ).toEqual('2023-11-21, 13:30:25.429'); 68 expect(wmDataNode.getChildByName('sendTimeNs')?.formattedValue()).toEqual( 69 '2023-11-21, 13:30:25.442', 70 ); 71 expect( 72 wmDataNode.getChildByName('finishTimeNs')?.formattedValue(), 73 ).toEqual('2023-11-21, 13:30:25.970'); 74 expect(entry.getChildByName('merged')?.getValue()).toBeFalse(); 75 expect(entry.getChildByName('played')?.getValue()).toBeTrue(); 76 expect(entry.getChildByName('aborted')?.getValue()).toBeFalse(); 77 78 expect( 79 assertDefined( 80 wmDataNode.getChildByName('startingWindowRemoveTimeNs'), 81 ).formattedValue(), 82 ).toEqual('2023-11-21, 13:30:25.565'); 83 expect( 84 assertDefined( 85 wmDataNode.getChildByName('startTransactionId'), 86 ).formattedValue(), 87 ).toEqual('5811090758076'); 88 expect( 89 assertDefined( 90 wmDataNode.getChildByName('finishTransactionId'), 91 ).formattedValue(), 92 ).toEqual('5811090758077'); 93 expect( 94 assertDefined(wmDataNode.getChildByName('type')).formattedValue(), 95 ).toEqual('OPEN'); 96 97 const targets = assertDefined( 98 wmDataNode.getChildByName('targets'), 99 ).getAllChildren(); 100 expect(targets.length).toEqual(2); 101 expect( 102 assertDefined(targets[0].getChildByName('layerId')).formattedValue(), 103 ).toEqual('398'); 104 expect( 105 assertDefined(targets[1].getChildByName('layerId')).formattedValue(), 106 ).toEqual('47'); 107 expect( 108 assertDefined(targets[0].getChildByName('mode')).formattedValue(), 109 ).toEqual('TO_FRONT'); 110 expect( 111 assertDefined(targets[1].getChildByName('mode')).formattedValue(), 112 ).toEqual('TO_BACK'); 113 expect( 114 assertDefined(targets[0].getChildByName('flags')).formattedValue(), 115 ).toEqual('FLAG_MOVED_TO_TOP'); 116 expect( 117 assertDefined(targets[1].getChildByName('flags')).formattedValue(), 118 ).toEqual('FLAG_SHOW_WALLPAPER'); 119 120 expect( 121 assertDefined( 122 shellDataNode.getChildByName('dispatchTimeNs'), 123 ).formattedValue(), 124 ).toEqual('2023-11-21, 13:30:25.448'); 125 expect(shellDataNode.getChildByName('mergeRequestTime')).toBeUndefined(); 126 expect(shellDataNode.getChildByName('mergeTime')).toBeUndefined(); 127 expect(shellDataNode.getChildByName('abortTimeNs')).toBeUndefined(); 128 expect(shellDataNode.getChildByName('mergeTarget')).toBeUndefined(); 129 expect( 130 assertDefined(shellDataNode.getChildByName('handler')).formattedValue(), 131 ).toEqual('com.android.wm.shell.transition.DefaultMixedHandler'); 132 133 const entryWithFlags = await parser.getEntry(1); 134 const wmDataWithFlags = assertDefined( 135 entryWithFlags.getChildByName('wmData'), 136 ); 137 expect( 138 assertDefined(wmDataWithFlags.getChildByName('flags')).formattedValue(), 139 ).toEqual('TRANSIT_FLAG_IS_RECENTS'); 140 }); 141 }); 142}); 143