xref: /aosp_15_r20/development/tools/winscope/src/trace/parser_mock.ts (revision 90c8c64db3049935a07c6143d7fd006e26f8ecca)
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 {Timestamp} from 'common/time';
18*90c8c64dSAndroid Build Coastguard Workerimport {CoarseVersion} from './coarse_version';
19*90c8c64dSAndroid Build Coastguard Workerimport {CustomQueryParserResultTypeMap, CustomQueryType} from './custom_query';
20*90c8c64dSAndroid Build Coastguard Workerimport {AbsoluteEntryIndex, EntriesRange} from './index_types';
21*90c8c64dSAndroid Build Coastguard Workerimport {Parser} from './parser';
22*90c8c64dSAndroid Build Coastguard Workerimport {TraceType} from './trace_type';
23*90c8c64dSAndroid Build Coastguard Worker
24*90c8c64dSAndroid Build Coastguard Workerexport class ParserMock<T> implements Parser<T> {
25*90c8c64dSAndroid Build Coastguard Worker  constructor(
26*90c8c64dSAndroid Build Coastguard Worker    private readonly type: TraceType,
27*90c8c64dSAndroid Build Coastguard Worker    private readonly timestamps: Timestamp[],
28*90c8c64dSAndroid Build Coastguard Worker    private readonly entries: T[],
29*90c8c64dSAndroid Build Coastguard Worker    private readonly customQueryResult: Map<CustomQueryType, object>,
30*90c8c64dSAndroid Build Coastguard Worker    private readonly descriptors: string[],
31*90c8c64dSAndroid Build Coastguard Worker    private readonly noOffsets: boolean,
32*90c8c64dSAndroid Build Coastguard Worker    private readonly isCorrupted: boolean,
33*90c8c64dSAndroid Build Coastguard Worker  ) {
34*90c8c64dSAndroid Build Coastguard Worker    if (timestamps.length !== entries.length) {
35*90c8c64dSAndroid Build Coastguard Worker      throw new Error(`Timestamps and entries must have the same length`);
36*90c8c64dSAndroid Build Coastguard Worker    }
37*90c8c64dSAndroid Build Coastguard Worker  }
38*90c8c64dSAndroid Build Coastguard Worker
39*90c8c64dSAndroid Build Coastguard Worker  getTraceType(): TraceType {
40*90c8c64dSAndroid Build Coastguard Worker    return this.type;
41*90c8c64dSAndroid Build Coastguard Worker  }
42*90c8c64dSAndroid Build Coastguard Worker
43*90c8c64dSAndroid Build Coastguard Worker  getLengthEntries(): number {
44*90c8c64dSAndroid Build Coastguard Worker    return this.entries.length;
45*90c8c64dSAndroid Build Coastguard Worker  }
46*90c8c64dSAndroid Build Coastguard Worker
47*90c8c64dSAndroid Build Coastguard Worker  getCoarseVersion(): CoarseVersion {
48*90c8c64dSAndroid Build Coastguard Worker    return CoarseVersion.MOCK;
49*90c8c64dSAndroid Build Coastguard Worker  }
50*90c8c64dSAndroid Build Coastguard Worker
51*90c8c64dSAndroid Build Coastguard Worker  createTimestamps() {
52*90c8c64dSAndroid Build Coastguard Worker    throw new Error('Not implemented');
53*90c8c64dSAndroid Build Coastguard Worker  }
54*90c8c64dSAndroid Build Coastguard Worker
55*90c8c64dSAndroid Build Coastguard Worker  getRealToMonotonicTimeOffsetNs(): bigint | undefined {
56*90c8c64dSAndroid Build Coastguard Worker    return this.noOffsets ? undefined : 0n;
57*90c8c64dSAndroid Build Coastguard Worker  }
58*90c8c64dSAndroid Build Coastguard Worker
59*90c8c64dSAndroid Build Coastguard Worker  getRealToBootTimeOffsetNs(): bigint | undefined {
60*90c8c64dSAndroid Build Coastguard Worker    return this.noOffsets ? undefined : 0n;
61*90c8c64dSAndroid Build Coastguard Worker  }
62*90c8c64dSAndroid Build Coastguard Worker
63*90c8c64dSAndroid Build Coastguard Worker  getTimestamps(): Timestamp[] {
64*90c8c64dSAndroid Build Coastguard Worker    return this.timestamps;
65*90c8c64dSAndroid Build Coastguard Worker  }
66*90c8c64dSAndroid Build Coastguard Worker
67*90c8c64dSAndroid Build Coastguard Worker  getEntry(index: AbsoluteEntryIndex): Promise<T> {
68*90c8c64dSAndroid Build Coastguard Worker    if (this.isCorrupted) throw new Error('Corrupted trace');
69*90c8c64dSAndroid Build Coastguard Worker    return Promise.resolve(this.entries[index]);
70*90c8c64dSAndroid Build Coastguard Worker  }
71*90c8c64dSAndroid Build Coastguard Worker
72*90c8c64dSAndroid Build Coastguard Worker  customQuery<Q extends CustomQueryType>(
73*90c8c64dSAndroid Build Coastguard Worker    type: Q,
74*90c8c64dSAndroid Build Coastguard Worker    entriesRange: EntriesRange,
75*90c8c64dSAndroid Build Coastguard Worker  ): Promise<CustomQueryParserResultTypeMap[Q]> {
76*90c8c64dSAndroid Build Coastguard Worker    let result = this.customQueryResult.get(type);
77*90c8c64dSAndroid Build Coastguard Worker    if (result === undefined) {
78*90c8c64dSAndroid Build Coastguard Worker      throw new Error(
79*90c8c64dSAndroid Build Coastguard Worker        `This mock was not configured to support custom query type '${type}'. Something missing in your test set up?`,
80*90c8c64dSAndroid Build Coastguard Worker      );
81*90c8c64dSAndroid Build Coastguard Worker    }
82*90c8c64dSAndroid Build Coastguard Worker    if (
83*90c8c64dSAndroid Build Coastguard Worker      type !== CustomQueryType.SF_LAYERS_ID_AND_NAME &&
84*90c8c64dSAndroid Build Coastguard Worker      Array.isArray(result)
85*90c8c64dSAndroid Build Coastguard Worker    ) {
86*90c8c64dSAndroid Build Coastguard Worker      result = result.slice(entriesRange.start, entriesRange.end);
87*90c8c64dSAndroid Build Coastguard Worker    }
88*90c8c64dSAndroid Build Coastguard Worker    return Promise.resolve(result) as Promise<
89*90c8c64dSAndroid Build Coastguard Worker      CustomQueryParserResultTypeMap[Q]
90*90c8c64dSAndroid Build Coastguard Worker    >;
91*90c8c64dSAndroid Build Coastguard Worker  }
92*90c8c64dSAndroid Build Coastguard Worker
93*90c8c64dSAndroid Build Coastguard Worker  getDescriptors(): string[] {
94*90c8c64dSAndroid Build Coastguard Worker    return this.descriptors;
95*90c8c64dSAndroid Build Coastguard Worker  }
96*90c8c64dSAndroid Build Coastguard Worker}
97