1*90c8c64dSAndroid Build Coastguard Worker/* 2*90c8c64dSAndroid Build Coastguard Worker * Copyright (C) 2023 The Android Open Source Project 3*90c8c64dSAndroid Build Coastguard Worker * 4*90c8c64dSAndroid Build Coastguard Worker * Licensed under the Apache License, Version 2.0 (the "License"); 5*90c8c64dSAndroid Build Coastguard Worker * you may not use this file except in compliance with the License. 6*90c8c64dSAndroid Build Coastguard Worker * You may obtain a copy of the License at 7*90c8c64dSAndroid Build Coastguard Worker * 8*90c8c64dSAndroid Build Coastguard Worker * http://www.apache.org/licenses/LICENSE-2.0 9*90c8c64dSAndroid Build Coastguard Worker * 10*90c8c64dSAndroid Build Coastguard Worker * Unless required by applicable law or agreed to in writing, software 11*90c8c64dSAndroid Build Coastguard Worker * distributed under the License is distributed on an "AS IS" BASIS, 12*90c8c64dSAndroid Build Coastguard Worker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13*90c8c64dSAndroid Build Coastguard Worker * See the License for the specific language governing permissions and 14*90c8c64dSAndroid Build Coastguard Worker * limitations under the License. 15*90c8c64dSAndroid Build Coastguard Worker */ 16*90c8c64dSAndroid Build Coastguard Worker 17*90c8c64dSAndroid Build Coastguard Workerimport {assertDefined} from 'common/assert_utils'; 18*90c8c64dSAndroid Build Coastguard Workerimport {FunctionUtils} from 'common/function_utils'; 19*90c8c64dSAndroid Build Coastguard Workerimport {TimestampConverterUtils} from 'test/unit/timestamp_converter_utils'; 20*90c8c64dSAndroid Build Coastguard Workerimport {TracesBuilder} from 'test/unit/traces_builder'; 21*90c8c64dSAndroid Build Coastguard Workerimport {TracesUtils} from 'test/unit/traces_utils'; 22*90c8c64dSAndroid Build Coastguard Workerimport {TraceBuilder} from 'test/unit/trace_builder'; 23*90c8c64dSAndroid Build Coastguard Workerimport {TraceUtils} from 'test/unit/trace_utils'; 24*90c8c64dSAndroid Build Coastguard Workerimport {UnitTestUtils} from 'test/unit/utils'; 25*90c8c64dSAndroid Build Coastguard Workerimport {FrameMapBuilder} from './frame_map_builder'; 26*90c8c64dSAndroid Build Coastguard Workerimport {AbsoluteFrameIndex} from './index_types'; 27*90c8c64dSAndroid Build Coastguard Workerimport {Traces} from './traces'; 28*90c8c64dSAndroid Build Coastguard Workerimport {TraceType} from './trace_type'; 29*90c8c64dSAndroid Build Coastguard Worker 30*90c8c64dSAndroid Build Coastguard Workerdescribe('Traces', () => { 31*90c8c64dSAndroid Build Coastguard Worker let traces: Traces; 32*90c8c64dSAndroid Build Coastguard Worker 33*90c8c64dSAndroid Build Coastguard Worker const time1 = TimestampConverterUtils.makeRealTimestamp(1n); 34*90c8c64dSAndroid Build Coastguard Worker const time2 = TimestampConverterUtils.makeRealTimestamp(2n); 35*90c8c64dSAndroid Build Coastguard Worker const time3 = TimestampConverterUtils.makeRealTimestamp(3n); 36*90c8c64dSAndroid Build Coastguard Worker const time4 = TimestampConverterUtils.makeRealTimestamp(4n); 37*90c8c64dSAndroid Build Coastguard Worker const time5 = TimestampConverterUtils.makeRealTimestamp(5n); 38*90c8c64dSAndroid Build Coastguard Worker const time6 = TimestampConverterUtils.makeRealTimestamp(6n); 39*90c8c64dSAndroid Build Coastguard Worker const time7 = TimestampConverterUtils.makeRealTimestamp(7n); 40*90c8c64dSAndroid Build Coastguard Worker const time8 = TimestampConverterUtils.makeRealTimestamp(8n); 41*90c8c64dSAndroid Build Coastguard Worker const time9 = TimestampConverterUtils.makeRealTimestamp(9n); 42*90c8c64dSAndroid Build Coastguard Worker const time10 = TimestampConverterUtils.makeRealTimestamp(10n); 43*90c8c64dSAndroid Build Coastguard Worker 44*90c8c64dSAndroid Build Coastguard Worker let extractedEntriesEmpty: Map<TraceType, Array<{}>>; 45*90c8c64dSAndroid Build Coastguard Worker let extractedEntriesFull: Map<TraceType, Array<{}>>; 46*90c8c64dSAndroid Build Coastguard Worker let extractedFramesEmpty: Map<AbsoluteFrameIndex, Map<TraceType, Array<{}>>>; 47*90c8c64dSAndroid Build Coastguard Worker let extractedFramesFull: Map<AbsoluteFrameIndex, Map<TraceType, Array<{}>>>; 48*90c8c64dSAndroid Build Coastguard Worker 49*90c8c64dSAndroid Build Coastguard Worker beforeAll(() => { 50*90c8c64dSAndroid Build Coastguard Worker // Time: 1 2 3 4 5 6 7 8 9 10 51*90c8c64dSAndroid Build Coastguard Worker // 52*90c8c64dSAndroid Build Coastguard Worker // TEST_TRACE_STRING: 0 1--2 3 4 53*90c8c64dSAndroid Build Coastguard Worker // \ \ \ \ 54*90c8c64dSAndroid Build Coastguard Worker // \ \ \ \ 55*90c8c64dSAndroid Build Coastguard Worker // TEST_TRACE_NUMBER: 0 1 2--3 4 56*90c8c64dSAndroid Build Coastguard Worker // \ \ \ \ 57*90c8c64dSAndroid Build Coastguard Worker // \ \ \ \ 58*90c8c64dSAndroid Build Coastguard Worker // Frame on screen: 0 1 2 3---4 59*90c8c64dSAndroid Build Coastguard Worker traces = new Traces(); 60*90c8c64dSAndroid Build Coastguard Worker traces.addTrace( 61*90c8c64dSAndroid Build Coastguard Worker new TraceBuilder<string>() 62*90c8c64dSAndroid Build Coastguard Worker .setType(TraceType.TEST_TRACE_STRING) 63*90c8c64dSAndroid Build Coastguard Worker .setEntries(['0', '1', '2', '3', '4']) 64*90c8c64dSAndroid Build Coastguard Worker .setTimestamps([time1, time3, time4, time6, time9]) 65*90c8c64dSAndroid Build Coastguard Worker .setFrame(0, 0) 66*90c8c64dSAndroid Build Coastguard Worker .setFrame(1, 1) 67*90c8c64dSAndroid Build Coastguard Worker .setFrame(2, 1) 68*90c8c64dSAndroid Build Coastguard Worker .setFrame(3, 2) 69*90c8c64dSAndroid Build Coastguard Worker .setFrame(4, 3) 70*90c8c64dSAndroid Build Coastguard Worker .setFrame(4, 4) 71*90c8c64dSAndroid Build Coastguard Worker .build(), 72*90c8c64dSAndroid Build Coastguard Worker ); 73*90c8c64dSAndroid Build Coastguard Worker traces.addTrace( 74*90c8c64dSAndroid Build Coastguard Worker new TraceBuilder<number>() 75*90c8c64dSAndroid Build Coastguard Worker .setType(TraceType.TEST_TRACE_NUMBER) 76*90c8c64dSAndroid Build Coastguard Worker .setEntries([0, 1, 2, 3, 4]) 77*90c8c64dSAndroid Build Coastguard Worker .setTimestamps([time2, time5, time7, time8, time10]) 78*90c8c64dSAndroid Build Coastguard Worker .setFrame(0, 0) 79*90c8c64dSAndroid Build Coastguard Worker .setFrame(1, 1) 80*90c8c64dSAndroid Build Coastguard Worker .setFrame(2, 2) 81*90c8c64dSAndroid Build Coastguard Worker .setFrame(3, 2) 82*90c8c64dSAndroid Build Coastguard Worker .setFrame(4, 3) 83*90c8c64dSAndroid Build Coastguard Worker .setFrame(4, 4) 84*90c8c64dSAndroid Build Coastguard Worker .build(), 85*90c8c64dSAndroid Build Coastguard Worker ); 86*90c8c64dSAndroid Build Coastguard Worker 87*90c8c64dSAndroid Build Coastguard Worker extractedEntriesEmpty = new Map<TraceType, Array<{}>>([ 88*90c8c64dSAndroid Build Coastguard Worker [TraceType.TEST_TRACE_STRING, []], 89*90c8c64dSAndroid Build Coastguard Worker [TraceType.TEST_TRACE_NUMBER, []], 90*90c8c64dSAndroid Build Coastguard Worker ]); 91*90c8c64dSAndroid Build Coastguard Worker 92*90c8c64dSAndroid Build Coastguard Worker extractedEntriesFull = new Map<TraceType, Array<{}>>([ 93*90c8c64dSAndroid Build Coastguard Worker [TraceType.TEST_TRACE_STRING, ['0', '1', '2', '3', '4']], 94*90c8c64dSAndroid Build Coastguard Worker [TraceType.TEST_TRACE_NUMBER, [0, 1, 2, 3, 4]], 95*90c8c64dSAndroid Build Coastguard Worker ]); 96*90c8c64dSAndroid Build Coastguard Worker 97*90c8c64dSAndroid Build Coastguard Worker extractedFramesEmpty = new Map< 98*90c8c64dSAndroid Build Coastguard Worker AbsoluteFrameIndex, 99*90c8c64dSAndroid Build Coastguard Worker Map<TraceType, Array<{}>> 100*90c8c64dSAndroid Build Coastguard Worker >(); 101*90c8c64dSAndroid Build Coastguard Worker 102*90c8c64dSAndroid Build Coastguard Worker extractedFramesFull = new Map< 103*90c8c64dSAndroid Build Coastguard Worker AbsoluteFrameIndex, 104*90c8c64dSAndroid Build Coastguard Worker Map<TraceType, Array<{}>> 105*90c8c64dSAndroid Build Coastguard Worker >(); 106*90c8c64dSAndroid Build Coastguard Worker extractedFramesFull.set( 107*90c8c64dSAndroid Build Coastguard Worker 0, 108*90c8c64dSAndroid Build Coastguard Worker new Map<TraceType, Array<{}>>([ 109*90c8c64dSAndroid Build Coastguard Worker [TraceType.TEST_TRACE_STRING, ['0']], 110*90c8c64dSAndroid Build Coastguard Worker [TraceType.TEST_TRACE_NUMBER, [0]], 111*90c8c64dSAndroid Build Coastguard Worker ]), 112*90c8c64dSAndroid Build Coastguard Worker ); 113*90c8c64dSAndroid Build Coastguard Worker extractedFramesFull.set( 114*90c8c64dSAndroid Build Coastguard Worker 1, 115*90c8c64dSAndroid Build Coastguard Worker new Map<TraceType, Array<{}>>([ 116*90c8c64dSAndroid Build Coastguard Worker [TraceType.TEST_TRACE_STRING, ['1', '2']], 117*90c8c64dSAndroid Build Coastguard Worker [TraceType.TEST_TRACE_NUMBER, [1]], 118*90c8c64dSAndroid Build Coastguard Worker ]), 119*90c8c64dSAndroid Build Coastguard Worker ); 120*90c8c64dSAndroid Build Coastguard Worker extractedFramesFull.set( 121*90c8c64dSAndroid Build Coastguard Worker 2, 122*90c8c64dSAndroid Build Coastguard Worker new Map<TraceType, Array<{}>>([ 123*90c8c64dSAndroid Build Coastguard Worker [TraceType.TEST_TRACE_STRING, ['3']], 124*90c8c64dSAndroid Build Coastguard Worker [TraceType.TEST_TRACE_NUMBER, [2, 3]], 125*90c8c64dSAndroid Build Coastguard Worker ]), 126*90c8c64dSAndroid Build Coastguard Worker ); 127*90c8c64dSAndroid Build Coastguard Worker extractedFramesFull.set( 128*90c8c64dSAndroid Build Coastguard Worker 3, 129*90c8c64dSAndroid Build Coastguard Worker new Map<TraceType, Array<{}>>([ 130*90c8c64dSAndroid Build Coastguard Worker [TraceType.TEST_TRACE_STRING, ['4']], 131*90c8c64dSAndroid Build Coastguard Worker [TraceType.TEST_TRACE_NUMBER, [4]], 132*90c8c64dSAndroid Build Coastguard Worker ]), 133*90c8c64dSAndroid Build Coastguard Worker ); 134*90c8c64dSAndroid Build Coastguard Worker extractedFramesFull.set( 135*90c8c64dSAndroid Build Coastguard Worker 4, 136*90c8c64dSAndroid Build Coastguard Worker new Map<TraceType, Array<{}>>([ 137*90c8c64dSAndroid Build Coastguard Worker [TraceType.TEST_TRACE_STRING, ['4']], 138*90c8c64dSAndroid Build Coastguard Worker [TraceType.TEST_TRACE_NUMBER, [4]], 139*90c8c64dSAndroid Build Coastguard Worker ]), 140*90c8c64dSAndroid Build Coastguard Worker ); 141*90c8c64dSAndroid Build Coastguard Worker }); 142*90c8c64dSAndroid Build Coastguard Worker 143*90c8c64dSAndroid Build Coastguard Worker it('getTrace()', async () => { 144*90c8c64dSAndroid Build Coastguard Worker expect( 145*90c8c64dSAndroid Build Coastguard Worker await TraceUtils.extractEntries( 146*90c8c64dSAndroid Build Coastguard Worker assertDefined(traces.getTrace(TraceType.TEST_TRACE_STRING)), 147*90c8c64dSAndroid Build Coastguard Worker ), 148*90c8c64dSAndroid Build Coastguard Worker ).toEqual( 149*90c8c64dSAndroid Build Coastguard Worker extractedEntriesFull.get(TraceType.TEST_TRACE_STRING) as string[], 150*90c8c64dSAndroid Build Coastguard Worker ); 151*90c8c64dSAndroid Build Coastguard Worker expect( 152*90c8c64dSAndroid Build Coastguard Worker await TraceUtils.extractEntries( 153*90c8c64dSAndroid Build Coastguard Worker assertDefined(traces.getTrace(TraceType.TEST_TRACE_NUMBER)), 154*90c8c64dSAndroid Build Coastguard Worker ), 155*90c8c64dSAndroid Build Coastguard Worker ).toEqual( 156*90c8c64dSAndroid Build Coastguard Worker extractedEntriesFull.get(TraceType.TEST_TRACE_NUMBER) as number[], 157*90c8c64dSAndroid Build Coastguard Worker ); 158*90c8c64dSAndroid Build Coastguard Worker expect(traces.getTrace(TraceType.SURFACE_FLINGER)).toBeUndefined(); 159*90c8c64dSAndroid Build Coastguard Worker }); 160*90c8c64dSAndroid Build Coastguard Worker 161*90c8c64dSAndroid Build Coastguard Worker it('getTraces()', async () => { 162*90c8c64dSAndroid Build Coastguard Worker expect(traces.getTraces(TraceType.TEST_TRACE_NUMBER)).toEqual([ 163*90c8c64dSAndroid Build Coastguard Worker assertDefined(traces.getTrace(TraceType.TEST_TRACE_NUMBER)), 164*90c8c64dSAndroid Build Coastguard Worker ]); 165*90c8c64dSAndroid Build Coastguard Worker }); 166*90c8c64dSAndroid Build Coastguard Worker 167*90c8c64dSAndroid Build Coastguard Worker it('deleteTrace()', () => { 168*90c8c64dSAndroid Build Coastguard Worker const trace0 = UnitTestUtils.makeEmptyTrace(TraceType.TEST_TRACE_STRING); 169*90c8c64dSAndroid Build Coastguard Worker const trace1 = UnitTestUtils.makeEmptyTrace(TraceType.TEST_TRACE_NUMBER); 170*90c8c64dSAndroid Build Coastguard Worker 171*90c8c64dSAndroid Build Coastguard Worker const traces = new Traces(); 172*90c8c64dSAndroid Build Coastguard Worker traces.addTrace(trace0); 173*90c8c64dSAndroid Build Coastguard Worker traces.addTrace(trace1); 174*90c8c64dSAndroid Build Coastguard Worker 175*90c8c64dSAndroid Build Coastguard Worker expect(TracesUtils.extractTraces(traces)).toEqual([trace0, trace1]); 176*90c8c64dSAndroid Build Coastguard Worker 177*90c8c64dSAndroid Build Coastguard Worker traces.deleteTrace(trace0); 178*90c8c64dSAndroid Build Coastguard Worker expect(TracesUtils.extractTraces(traces)).toEqual([trace1]); 179*90c8c64dSAndroid Build Coastguard Worker 180*90c8c64dSAndroid Build Coastguard Worker traces.deleteTrace(trace1); 181*90c8c64dSAndroid Build Coastguard Worker expect(TracesUtils.extractTraces(traces)).toEqual([]); 182*90c8c64dSAndroid Build Coastguard Worker 183*90c8c64dSAndroid Build Coastguard Worker traces.deleteTrace(trace1); 184*90c8c64dSAndroid Build Coastguard Worker expect(TracesUtils.extractTraces(traces)).toEqual([]); 185*90c8c64dSAndroid Build Coastguard Worker }); 186*90c8c64dSAndroid Build Coastguard Worker 187*90c8c64dSAndroid Build Coastguard Worker it('hasTrace()', () => { 188*90c8c64dSAndroid Build Coastguard Worker const trace0 = UnitTestUtils.makeEmptyTrace(TraceType.TEST_TRACE_STRING); 189*90c8c64dSAndroid Build Coastguard Worker const trace1 = UnitTestUtils.makeEmptyTrace(TraceType.TEST_TRACE_NUMBER); 190*90c8c64dSAndroid Build Coastguard Worker 191*90c8c64dSAndroid Build Coastguard Worker const traces = new Traces(); 192*90c8c64dSAndroid Build Coastguard Worker traces.addTrace(trace0); 193*90c8c64dSAndroid Build Coastguard Worker 194*90c8c64dSAndroid Build Coastguard Worker expect(traces.hasTrace(trace0)).toBeTrue(); 195*90c8c64dSAndroid Build Coastguard Worker expect(traces.hasTrace(trace1)).toBeFalse(); 196*90c8c64dSAndroid Build Coastguard Worker }); 197*90c8c64dSAndroid Build Coastguard Worker 198*90c8c64dSAndroid Build Coastguard Worker it('sliceTime()', async () => { 199*90c8c64dSAndroid Build Coastguard Worker // empty 200*90c8c64dSAndroid Build Coastguard Worker { 201*90c8c64dSAndroid Build Coastguard Worker const slice = traces.sliceTime(time3, time3); 202*90c8c64dSAndroid Build Coastguard Worker expect(await TracesUtils.extractEntries(slice)).toEqual( 203*90c8c64dSAndroid Build Coastguard Worker extractedEntriesEmpty, 204*90c8c64dSAndroid Build Coastguard Worker ); 205*90c8c64dSAndroid Build Coastguard Worker } 206*90c8c64dSAndroid Build Coastguard Worker // full 207*90c8c64dSAndroid Build Coastguard Worker { 208*90c8c64dSAndroid Build Coastguard Worker const slice = traces.sliceTime(); 209*90c8c64dSAndroid Build Coastguard Worker expect(await TracesUtils.extractEntries(slice)).toEqual( 210*90c8c64dSAndroid Build Coastguard Worker extractedEntriesFull, 211*90c8c64dSAndroid Build Coastguard Worker ); 212*90c8c64dSAndroid Build Coastguard Worker } 213*90c8c64dSAndroid Build Coastguard Worker // middle 214*90c8c64dSAndroid Build Coastguard Worker { 215*90c8c64dSAndroid Build Coastguard Worker const slice = traces.sliceTime(time4, time8); 216*90c8c64dSAndroid Build Coastguard Worker expect(await TracesUtils.extractEntries(slice)).toEqual( 217*90c8c64dSAndroid Build Coastguard Worker new Map<TraceType, Array<{}>>([ 218*90c8c64dSAndroid Build Coastguard Worker [TraceType.TEST_TRACE_STRING, ['2', '3']], 219*90c8c64dSAndroid Build Coastguard Worker [TraceType.TEST_TRACE_NUMBER, [1, 2]], 220*90c8c64dSAndroid Build Coastguard Worker ]), 221*90c8c64dSAndroid Build Coastguard Worker ); 222*90c8c64dSAndroid Build Coastguard Worker } 223*90c8c64dSAndroid Build Coastguard Worker // slice away front 224*90c8c64dSAndroid Build Coastguard Worker { 225*90c8c64dSAndroid Build Coastguard Worker const slice = traces.sliceTime(time8); 226*90c8c64dSAndroid Build Coastguard Worker expect(await TracesUtils.extractEntries(slice)).toEqual( 227*90c8c64dSAndroid Build Coastguard Worker new Map<TraceType, Array<{}>>([ 228*90c8c64dSAndroid Build Coastguard Worker [TraceType.TEST_TRACE_STRING, ['4']], 229*90c8c64dSAndroid Build Coastguard Worker [TraceType.TEST_TRACE_NUMBER, [3, 4]], 230*90c8c64dSAndroid Build Coastguard Worker ]), 231*90c8c64dSAndroid Build Coastguard Worker ); 232*90c8c64dSAndroid Build Coastguard Worker } 233*90c8c64dSAndroid Build Coastguard Worker // slice away back 234*90c8c64dSAndroid Build Coastguard Worker { 235*90c8c64dSAndroid Build Coastguard Worker const slice = traces.sliceTime(undefined, time8); 236*90c8c64dSAndroid Build Coastguard Worker expect(await TracesUtils.extractEntries(slice)).toEqual( 237*90c8c64dSAndroid Build Coastguard Worker new Map<TraceType, Array<{}>>([ 238*90c8c64dSAndroid Build Coastguard Worker [TraceType.TEST_TRACE_STRING, ['0', '1', '2', '3']], 239*90c8c64dSAndroid Build Coastguard Worker [TraceType.TEST_TRACE_NUMBER, [0, 1, 2]], 240*90c8c64dSAndroid Build Coastguard Worker ]), 241*90c8c64dSAndroid Build Coastguard Worker ); 242*90c8c64dSAndroid Build Coastguard Worker } 243*90c8c64dSAndroid Build Coastguard Worker }); 244*90c8c64dSAndroid Build Coastguard Worker 245*90c8c64dSAndroid Build Coastguard Worker it('sliceFrames()', async () => { 246*90c8c64dSAndroid Build Coastguard Worker // empty 247*90c8c64dSAndroid Build Coastguard Worker { 248*90c8c64dSAndroid Build Coastguard Worker const slice = traces.sliceFrames(1, 1); 249*90c8c64dSAndroid Build Coastguard Worker expect(await TracesUtils.extractFrames(slice)).toEqual( 250*90c8c64dSAndroid Build Coastguard Worker extractedFramesEmpty, 251*90c8c64dSAndroid Build Coastguard Worker ); 252*90c8c64dSAndroid Build Coastguard Worker } 253*90c8c64dSAndroid Build Coastguard Worker // full 254*90c8c64dSAndroid Build Coastguard Worker { 255*90c8c64dSAndroid Build Coastguard Worker const slice = traces.sliceFrames(); 256*90c8c64dSAndroid Build Coastguard Worker expect(await TracesUtils.extractFrames(slice)).toEqual( 257*90c8c64dSAndroid Build Coastguard Worker extractedFramesFull, 258*90c8c64dSAndroid Build Coastguard Worker ); 259*90c8c64dSAndroid Build Coastguard Worker } 260*90c8c64dSAndroid Build Coastguard Worker // middle 261*90c8c64dSAndroid Build Coastguard Worker { 262*90c8c64dSAndroid Build Coastguard Worker const slice = traces.sliceFrames(1, 4); 263*90c8c64dSAndroid Build Coastguard Worker const expectedFrames = structuredClone(extractedFramesFull); 264*90c8c64dSAndroid Build Coastguard Worker expectedFrames.delete(0); 265*90c8c64dSAndroid Build Coastguard Worker expectedFrames.delete(4); 266*90c8c64dSAndroid Build Coastguard Worker expect(await TracesUtils.extractFrames(slice)).toEqual(expectedFrames); 267*90c8c64dSAndroid Build Coastguard Worker } 268*90c8c64dSAndroid Build Coastguard Worker // slice away front 269*90c8c64dSAndroid Build Coastguard Worker { 270*90c8c64dSAndroid Build Coastguard Worker const slice = traces.sliceFrames(2); 271*90c8c64dSAndroid Build Coastguard Worker const expectedFrames = structuredClone(extractedFramesFull); 272*90c8c64dSAndroid Build Coastguard Worker expectedFrames.delete(0); 273*90c8c64dSAndroid Build Coastguard Worker expectedFrames.delete(1); 274*90c8c64dSAndroid Build Coastguard Worker expect(await TracesUtils.extractFrames(slice)).toEqual(expectedFrames); 275*90c8c64dSAndroid Build Coastguard Worker } 276*90c8c64dSAndroid Build Coastguard Worker // slice away back 277*90c8c64dSAndroid Build Coastguard Worker { 278*90c8c64dSAndroid Build Coastguard Worker const slice = traces.sliceFrames(undefined, 2); 279*90c8c64dSAndroid Build Coastguard Worker const expectedFrames = structuredClone(extractedFramesFull); 280*90c8c64dSAndroid Build Coastguard Worker expectedFrames.delete(2); 281*90c8c64dSAndroid Build Coastguard Worker expectedFrames.delete(3); 282*90c8c64dSAndroid Build Coastguard Worker expectedFrames.delete(4); 283*90c8c64dSAndroid Build Coastguard Worker expect(await TracesUtils.extractFrames(slice)).toEqual(expectedFrames); 284*90c8c64dSAndroid Build Coastguard Worker } 285*90c8c64dSAndroid Build Coastguard Worker }); 286*90c8c64dSAndroid Build Coastguard Worker 287*90c8c64dSAndroid Build Coastguard Worker it('mapTrace()', async () => { 288*90c8c64dSAndroid Build Coastguard Worker const promises = traces.mapTrace(async (trace) => { 289*90c8c64dSAndroid Build Coastguard Worker const expectedEntries = extractedEntriesFull.get(trace.type) as Array<{}>; 290*90c8c64dSAndroid Build Coastguard Worker const actualEntries = await TraceUtils.extractEntries(trace); 291*90c8c64dSAndroid Build Coastguard Worker expect(actualEntries).toEqual(expectedEntries); 292*90c8c64dSAndroid Build Coastguard Worker }); 293*90c8c64dSAndroid Build Coastguard Worker await Promise.all(promises); 294*90c8c64dSAndroid Build Coastguard Worker }); 295*90c8c64dSAndroid Build Coastguard Worker 296*90c8c64dSAndroid Build Coastguard Worker it('mapFrame()', async () => { 297*90c8c64dSAndroid Build Coastguard Worker expect(await TracesUtils.extractFrames(traces)).toEqual( 298*90c8c64dSAndroid Build Coastguard Worker extractedFramesFull, 299*90c8c64dSAndroid Build Coastguard Worker ); 300*90c8c64dSAndroid Build Coastguard Worker }); 301*90c8c64dSAndroid Build Coastguard Worker 302*90c8c64dSAndroid Build Coastguard Worker it('supports empty traces', async () => { 303*90c8c64dSAndroid Build Coastguard Worker const traces = new TracesBuilder() 304*90c8c64dSAndroid Build Coastguard Worker .setEntries(TraceType.TEST_TRACE_STRING, []) 305*90c8c64dSAndroid Build Coastguard Worker .setFrameMap( 306*90c8c64dSAndroid Build Coastguard Worker TraceType.TEST_TRACE_STRING, 307*90c8c64dSAndroid Build Coastguard Worker new FrameMapBuilder(0, 0).build(), 308*90c8c64dSAndroid Build Coastguard Worker ) 309*90c8c64dSAndroid Build Coastguard Worker 310*90c8c64dSAndroid Build Coastguard Worker .setEntries(TraceType.TEST_TRACE_NUMBER, []) 311*90c8c64dSAndroid Build Coastguard Worker .setFrameMap( 312*90c8c64dSAndroid Build Coastguard Worker TraceType.TEST_TRACE_NUMBER, 313*90c8c64dSAndroid Build Coastguard Worker new FrameMapBuilder(0, 0).build(), 314*90c8c64dSAndroid Build Coastguard Worker ) 315*90c8c64dSAndroid Build Coastguard Worker .build(); 316*90c8c64dSAndroid Build Coastguard Worker 317*90c8c64dSAndroid Build Coastguard Worker expect(await TracesUtils.extractEntries(traces)).toEqual( 318*90c8c64dSAndroid Build Coastguard Worker extractedEntriesEmpty, 319*90c8c64dSAndroid Build Coastguard Worker ); 320*90c8c64dSAndroid Build Coastguard Worker expect(await TracesUtils.extractFrames(traces)).toEqual( 321*90c8c64dSAndroid Build Coastguard Worker extractedFramesEmpty, 322*90c8c64dSAndroid Build Coastguard Worker ); 323*90c8c64dSAndroid Build Coastguard Worker 324*90c8c64dSAndroid Build Coastguard Worker expect( 325*90c8c64dSAndroid Build Coastguard Worker await TracesUtils.extractEntries(traces.sliceTime(time1, time10)), 326*90c8c64dSAndroid Build Coastguard Worker ).toEqual(extractedEntriesEmpty); 327*90c8c64dSAndroid Build Coastguard Worker expect( 328*90c8c64dSAndroid Build Coastguard Worker await TracesUtils.extractFrames(traces.sliceTime(time1, time10)), 329*90c8c64dSAndroid Build Coastguard Worker ).toEqual(extractedFramesEmpty); 330*90c8c64dSAndroid Build Coastguard Worker 331*90c8c64dSAndroid Build Coastguard Worker expect(await TracesUtils.extractEntries(traces.sliceFrames(0, 10))).toEqual( 332*90c8c64dSAndroid Build Coastguard Worker extractedEntriesEmpty, 333*90c8c64dSAndroid Build Coastguard Worker ); 334*90c8c64dSAndroid Build Coastguard Worker expect(await TracesUtils.extractFrames(traces.sliceFrames(0, 10))).toEqual( 335*90c8c64dSAndroid Build Coastguard Worker extractedFramesEmpty, 336*90c8c64dSAndroid Build Coastguard Worker ); 337*90c8c64dSAndroid Build Coastguard Worker }); 338*90c8c64dSAndroid Build Coastguard Worker 339*90c8c64dSAndroid Build Coastguard Worker it('supports unavailable frame mapping', async () => { 340*90c8c64dSAndroid Build Coastguard Worker const traces = new TracesBuilder() 341*90c8c64dSAndroid Build Coastguard Worker .setEntries(TraceType.TEST_TRACE_STRING, ['entry-0']) 342*90c8c64dSAndroid Build Coastguard Worker .setTimestamps(TraceType.TEST_TRACE_STRING, [time1]) 343*90c8c64dSAndroid Build Coastguard Worker .setFrameMap(TraceType.TEST_TRACE_STRING, undefined) 344*90c8c64dSAndroid Build Coastguard Worker 345*90c8c64dSAndroid Build Coastguard Worker .setEntries(TraceType.TEST_TRACE_NUMBER, [0]) 346*90c8c64dSAndroid Build Coastguard Worker .setTimestamps(TraceType.TEST_TRACE_NUMBER, [time1]) 347*90c8c64dSAndroid Build Coastguard Worker .setFrameMap(TraceType.TEST_TRACE_NUMBER, undefined) 348*90c8c64dSAndroid Build Coastguard Worker .build(); 349*90c8c64dSAndroid Build Coastguard Worker 350*90c8c64dSAndroid Build Coastguard Worker const expectedEntries = new Map<TraceType, Array<{}>>([ 351*90c8c64dSAndroid Build Coastguard Worker [TraceType.TEST_TRACE_STRING, ['entry-0']], 352*90c8c64dSAndroid Build Coastguard Worker [TraceType.TEST_TRACE_NUMBER, [0]], 353*90c8c64dSAndroid Build Coastguard Worker ]); 354*90c8c64dSAndroid Build Coastguard Worker 355*90c8c64dSAndroid Build Coastguard Worker expect(await TracesUtils.extractEntries(traces)).toEqual(expectedEntries); 356*90c8c64dSAndroid Build Coastguard Worker expect(await TracesUtils.extractEntries(traces.sliceTime())).toEqual( 357*90c8c64dSAndroid Build Coastguard Worker expectedEntries, 358*90c8c64dSAndroid Build Coastguard Worker ); 359*90c8c64dSAndroid Build Coastguard Worker 360*90c8c64dSAndroid Build Coastguard Worker expect(() => { 361*90c8c64dSAndroid Build Coastguard Worker traces.sliceFrames(); 362*90c8c64dSAndroid Build Coastguard Worker }).toThrow(); 363*90c8c64dSAndroid Build Coastguard Worker expect(() => { 364*90c8c64dSAndroid Build Coastguard Worker traces.forEachFrame(FunctionUtils.DO_NOTHING); 365*90c8c64dSAndroid Build Coastguard Worker }).toThrow(); 366*90c8c64dSAndroid Build Coastguard Worker expect(() => { 367*90c8c64dSAndroid Build Coastguard Worker traces.mapFrame(FunctionUtils.DO_NOTHING); 368*90c8c64dSAndroid Build Coastguard Worker }).toThrow(); 369*90c8c64dSAndroid Build Coastguard Worker }); 370*90c8c64dSAndroid Build Coastguard Worker 371*90c8c64dSAndroid Build Coastguard Worker it('supports multiple traces with same type', () => { 372*90c8c64dSAndroid Build Coastguard Worker const traceShort = new TraceBuilder<number>() 373*90c8c64dSAndroid Build Coastguard Worker .setType(TraceType.TEST_TRACE_NUMBER) 374*90c8c64dSAndroid Build Coastguard Worker .setEntries([0]) 375*90c8c64dSAndroid Build Coastguard Worker .build(); 376*90c8c64dSAndroid Build Coastguard Worker const traceLong = new TraceBuilder<number>() 377*90c8c64dSAndroid Build Coastguard Worker .setType(TraceType.TEST_TRACE_NUMBER) 378*90c8c64dSAndroid Build Coastguard Worker .setEntries([1, 2]) 379*90c8c64dSAndroid Build Coastguard Worker .build(); 380*90c8c64dSAndroid Build Coastguard Worker 381*90c8c64dSAndroid Build Coastguard Worker const traces = new Traces(); 382*90c8c64dSAndroid Build Coastguard Worker traces.addTrace(traceShort); 383*90c8c64dSAndroid Build Coastguard Worker traces.addTrace(traceLong); 384*90c8c64dSAndroid Build Coastguard Worker 385*90c8c64dSAndroid Build Coastguard Worker expect(traces.getTraces(TraceType.TEST_TRACE_NUMBER)).toEqual([ 386*90c8c64dSAndroid Build Coastguard Worker traceShort, 387*90c8c64dSAndroid Build Coastguard Worker traceLong, 388*90c8c64dSAndroid Build Coastguard Worker ]); 389*90c8c64dSAndroid Build Coastguard Worker expect(traces.getTrace(TraceType.TEST_TRACE_NUMBER)).toEqual(traceLong); 390*90c8c64dSAndroid Build Coastguard Worker }); 391*90c8c64dSAndroid Build Coastguard Worker}); 392