13af6ab5fSopenharmony_ci/*
23af6ab5fSopenharmony_ci * Copyright (c) 2024 Huawei Device Co., Ltd.
33af6ab5fSopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License");
43af6ab5fSopenharmony_ci * you may not use this file except in compliance with the License.
53af6ab5fSopenharmony_ci * You may obtain a copy of the License at
63af6ab5fSopenharmony_ci *
73af6ab5fSopenharmony_ci *     http://www.apache.org/licenses/LICENSE-2.0
83af6ab5fSopenharmony_ci *
93af6ab5fSopenharmony_ci * Unless required by applicable law or agreed to in writing, software
103af6ab5fSopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS,
113af6ab5fSopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
123af6ab5fSopenharmony_ci * See the License for the specific language governing permissions and
133af6ab5fSopenharmony_ci * limitations under the License.
143af6ab5fSopenharmony_ci */
153af6ab5fSopenharmony_ci
163af6ab5fSopenharmony_ci
173af6ab5fSopenharmony_ciimport type { RawSourceMap } from 'typescript';
183af6ab5fSopenharmony_ciimport Benchmark from 'benchmark';
193af6ab5fSopenharmony_ciimport {
203af6ab5fSopenharmony_ci  ArkObfuscator,
213af6ab5fSopenharmony_ci  renameIdentifierModule
223af6ab5fSopenharmony_ci} from '../../src/ArkObfuscator';
233af6ab5fSopenharmony_ciimport {
243af6ab5fSopenharmony_ci  decodeSourcemap,
253af6ab5fSopenharmony_ci  mergeSourceMap,
263af6ab5fSopenharmony_ci  Source,
273af6ab5fSopenharmony_ci  SourceMapLink
283af6ab5fSopenharmony_ci} from '../../src/utils/SourceMapMergingUtil';
293af6ab5fSopenharmony_ciimport {
303af6ab5fSopenharmony_ci  IDENTIFIER_CACHE,
313af6ab5fSopenharmony_ci  MEM_METHOD_CACHE,
323af6ab5fSopenharmony_ci} from '../../src/utils/NameCacheUtil';
333af6ab5fSopenharmony_ci
343af6ab5fSopenharmony_ciconst benchmarkSuite = new Benchmark.Suite;
353af6ab5fSopenharmony_ciconst namePaddingSize: number = 56;
363af6ab5fSopenharmony_ciconst dataPaddingSize: number = 16;
373af6ab5fSopenharmony_ci
383af6ab5fSopenharmony_ciconst previousMap = {
393af6ab5fSopenharmony_ci  version: 3,
403af6ab5fSopenharmony_ci  file: 'EntryAbility.ts',
413af6ab5fSopenharmony_ci  sourceRoot: '',
423af6ab5fSopenharmony_ci  sources: [ 'entry/src/main/ets/entryability/EntryAbility.ts' ],
433af6ab5fSopenharmony_ci  names: [],
443af6ab5fSopenharmony_ci  mappings: 'OAAO,SAAS;OACT,KAAK;YACL,MAAM;AAEb,MAAM,CAAC,OAAO,OAAO,YAAa,SAAQ,SAAS;IACjD,QAAQ,CAAC,IAAI,EAAE,WAAW;'
453af6ab5fSopenharmony_ci    + 'QACxB,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,SAAS,EAAE,YAAY,EAAE,kBAAkB,CAAC,CAAC;IAClE,CAAC;'
463af6ab5fSopenharmony_ci    + 'IAED,SAAS;QACP,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,SAAS,EAAE,YAAY,EAAE,mBAAmB,CAAC,CAAC;'
473af6ab5fSopenharmony_ci    + 'IACnE,CAAC;IAED,mBAAmB,CAAC,WAAW,EAAE,MAAM,CAAC,WAAW;QACjD,yDAAyD;'
483af6ab5fSopenharmony_ci    + 'QACzD,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,SAAS,EAAE,YAAY,EAAE,6BAA6B,CAAC,CAAC;'
493af6ab5fSopenharmony_ci    + 'QAE3E,WAAW,CAAC,WAAW,CAAC,aAAa,EAAE,CAAC,GAAG,EAAE,IAAI,EAAE,EAAE;YACnD,IAAI,GAAG,CAAC,IAAI,EAAE;'
503af6ab5fSopenharmony_ci    + 'gBACZ,KAAK,CAAC,KAAK,CAAC,MAAM,EAAE,SAAS,EAAE,+CAA+C,EAAE,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC;'
513af6ab5fSopenharmony_ci    + 'gBAC3G,OAAO;aACR;YACD,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,SAAS,EAAE,oDAAoD,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;'
523af6ab5fSopenharmony_ci    + 'QAClH,CAAC,CAAC,CAAC;IACL,CAAC;IAED,oBAAoB;QAClB,yDAAyD;QACzD,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,SAAS,EAAE,YAAY,EAAE,8BAA8B,CAAC,CAAC;'
533af6ab5fSopenharmony_ci    + 'IAC9E,CAAC;IAED,YAAY;QACV,oCAAoC;QACpC,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,SAAS,EAAE,YAAY,EAAE,sBAAsB,CAAC,CAAC;IACtE,CAAC;'
543af6ab5fSopenharmony_ci    + 'IAED,YAAY;QACV,iCAAiC;QACjC,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,SAAS,EAAE,YAAY,EAAE,sBAAsB,CAAC,CAAC;IACtE,CAAC;CACF',
553af6ab5fSopenharmony_ci  sourcesContent: undefined
563af6ab5fSopenharmony_ci};
573af6ab5fSopenharmony_ci
583af6ab5fSopenharmony_ciconst currentMap = {
593af6ab5fSopenharmony_ci  version: 3,
603af6ab5fSopenharmony_ci  file: 'EntryAbility.ts',
613af6ab5fSopenharmony_ci  sourceRoot: '',
623af6ab5fSopenharmony_ci  sources: [
633af6ab5fSopenharmony_ci    'entry/build/default/cache/default/default@CompileArkTS/esmodule/release/entry/src/main/ets/entryability/EntryAbility.ts'
643af6ab5fSopenharmony_ci  ],
653af6ab5fSopenharmony_ci  names: [],
663af6ab5fSopenharmony_ci  mappings: 'AAAA,OAAO,SAAS,MAAM,6BAA6B,CAAC;AACpD,OAAO,KAAK,MAAM,aAAa,CAAC;AAChC,OAAO,KAAK,MAAM,MAAM,cAAc,CAAC;'
673af6ab5fSopenharmony_ci    + 'AACvC,MAAM,CAAC,OAAO,OAAO,YAAa,SAAQ,SAAS;IAC/C,QAAQ,CAAC,CAAI,EAAE,CAAW;'
683af6ab5fSopenharmony_ci    + 'QACtB,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,SAAS,EAAE,YAAY,EAAE,kBAAkB,CAAC,CAAC;'
693af6ab5fSopenharmony_ci    + 'IACpE,CAAC;IACD,SAAS;QACL,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,SAAS,EAAE,YAAY,EAAE,mBAAmB,CAAC,CAAC;'
703af6ab5fSopenharmony_ci    + 'IACrE,CAAC;IACD,mBAAmB,CAAC,GAAa,MAAM,CAAC,WAAW;QAE/C,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,SAAS,EAAE,YAAY,EAAE,6BAA6B,CAAC,CAAC;'
713af6ab5fSopenharmony_ci    + 'QAC3E,EAAY,WAAW,CAAC,aAAa,EAAE,CAAC,CAAG,EAAE,CAAI,EAAE,EAAE;YACjD,IAAI,EAAI,IAAI,EAAE;'
723af6ab5fSopenharmony_ci    + 'gBACV,KAAK,CAAC,KAAK,CAAC,MAAM,EAAE,SAAS,EAAE,+CAA+C,EAAE,IAAI,CAAC,SAAS,GAAK,IAAI,EAAE,CAAC,CAAC;'
733af6ab5fSopenharmony_ci    + 'gBAC3G,OAAO;aACV;YACD,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,SAAS,EAAE,oDAAoD,EAAE,IAAI,CAAC,SAAS,GAAM,IAAI,EAAE,CAAC,CAAC;'
743af6ab5fSopenharmony_ci    + 'QACpH,CAAC,CAAC,CAAC;IACP,CAAC;IACD,oBAAoB;QAEhB,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,SAAS,EAAE,YAAY,EAAE,8BAA8B,CAAC,CAAC;'
753af6ab5fSopenharmony_ci    + 'IAChF,CAAC;IACD,YAAY;QAER,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,SAAS,EAAE,YAAY,EAAE,sBAAsB,CAAC,CAAC;IACxE,CAAC;IACD,YAAY;'
763af6ab5fSopenharmony_ci    + 'QAER,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,SAAS,EAAE,YAAY,EAAE,sBAAsB,CAAC,CAAC;IACxE,CAAC;CACJ',
773af6ab5fSopenharmony_ci  sourcesContent: undefined
783af6ab5fSopenharmony_ci};
793af6ab5fSopenharmony_ci
803af6ab5fSopenharmony_cirenameIdentifierModule.nameCache = new Map([
813af6ab5fSopenharmony_ci  [
823af6ab5fSopenharmony_ci    'IdentifierCache',
833af6ab5fSopenharmony_ci    new Map([
843af6ab5fSopenharmony_ci      ['EntryAbility#onWindowStageCreate#windowStage', 'a'],
853af6ab5fSopenharmony_ci      ['EntryAbility#onWindowStageCreate#__function', 'b'],
863af6ab5fSopenharmony_ci      ['EntryAbility#onWindowStageCreate#$0#err', 'c'],
873af6ab5fSopenharmony_ci      ['EntryAbility#onWindowStageCreate#$0#data', 'd'],
883af6ab5fSopenharmony_ci      ['EntryAbility#onCreate#want', 'e'],
893af6ab5fSopenharmony_ci      ['EntryAbility#onCreate#launchParam', 'f']
903af6ab5fSopenharmony_ci    ])
913af6ab5fSopenharmony_ci  ],
923af6ab5fSopenharmony_ci  [
933af6ab5fSopenharmony_ci    'MemberMethodCache',
943af6ab5fSopenharmony_ci    new Map([
953af6ab5fSopenharmony_ci      ['onCreate:5:5:7:6', 'onCreate'],
963af6ab5fSopenharmony_ci      ['onDestroy:8:5:10:6', 'onDestroy'],
973af6ab5fSopenharmony_ci      ['onWindowStageCreate:11:5:20:6', 'onWindowStageCreate'],
983af6ab5fSopenharmony_ci      ['onWindowStageDestroy:21:5:23:6', 'onWindowStageDestroy'],
993af6ab5fSopenharmony_ci      ['onForeground:24:5:26:6', 'onForeground'],
1003af6ab5fSopenharmony_ci      ['onBackground:27:5:29:6', 'onBackground']
1013af6ab5fSopenharmony_ci    ])
1023af6ab5fSopenharmony_ci  ]
1033af6ab5fSopenharmony_ci]);
1043af6ab5fSopenharmony_ci
1053af6ab5fSopenharmony_cifunction alignColumn(name, ops, variance, runsSampled) {
1063af6ab5fSopenharmony_ci  const namePadding = name.padEnd(namePaddingSize);
1073af6ab5fSopenharmony_ci  const opsPadding = ops.padEnd(dataPaddingSize);
1083af6ab5fSopenharmony_ci  const variancePadding = variance.padEnd(dataPaddingSize);
1093af6ab5fSopenharmony_ci  const runsSampledPadding = runsSampled.toString().padEnd(dataPaddingSize);
1103af6ab5fSopenharmony_ci  return `| ${namePadding} | ${opsPadding} | ${variancePadding} | ${runsSampledPadding} |`;
1113af6ab5fSopenharmony_ci}
1123af6ab5fSopenharmony_ci
1133af6ab5fSopenharmony_ciclass ArkObfuscatorMock extends ArkObfuscator {
1143af6ab5fSopenharmony_ci  convertLineBasedOnSourceMapMock(targetCache: string, sourceMapLink?: SourceMapLink): Map<string, string> {
1153af6ab5fSopenharmony_ci      // Ignore `property is private and only accessible within class` error
1163af6ab5fSopenharmony_ci      // @ts-ignore
1173af6ab5fSopenharmony_ci      return this.convertLineBasedOnSourceMap(targetCache, sourceMapLink);
1183af6ab5fSopenharmony_ci  }
1193af6ab5fSopenharmony_ci};
1203af6ab5fSopenharmony_ci
1213af6ab5fSopenharmony_cidescribe('SourceMap Benchmark Test', function() {
1223af6ab5fSopenharmony_ci  after(() => {
1233af6ab5fSopenharmony_ci      benchmarkSuite.on('complete', function() {
1243af6ab5fSopenharmony_ci        console.log('\n  Benchmark Summary Results:\n');
1253af6ab5fSopenharmony_ci        console.log(' ', alignColumn('Test Name', 'Ops/Sec', 'Variance', 'Number of Runs'));
1263af6ab5fSopenharmony_ci        console.log(' ',alignColumn('-'.repeat(namePaddingSize), '-'.repeat(dataPaddingSize),
1273af6ab5fSopenharmony_ci                                '-'.repeat(dataPaddingSize), '-'.repeat(dataPaddingSize)));
1283af6ab5fSopenharmony_ci        this.forEach(result => {
1293af6ab5fSopenharmony_ci          console.log(' ', alignColumn(result.name, `${Math.round(result.hz)}`,
1303af6ab5fSopenharmony_ci                      `${result.stats.rme.toFixed(2)}%`, result.stats.sample.length));
1313af6ab5fSopenharmony_ci        });
1323af6ab5fSopenharmony_ci        console.log('\n');
1333af6ab5fSopenharmony_ci      });
1343af6ab5fSopenharmony_ci  });
1353af6ab5fSopenharmony_ci
1363af6ab5fSopenharmony_ci  it('run sourcemap benchmark test', function() {
1373af6ab5fSopenharmony_ci      let decodedSourceMap;
1383af6ab5fSopenharmony_ci      benchmarkSuite.add('decodeSourcemap', function() {
1393af6ab5fSopenharmony_ci        decodedSourceMap = decodeSourcemap(previousMap as RawSourceMap);
1403af6ab5fSopenharmony_ci      });
1413af6ab5fSopenharmony_ci
1423af6ab5fSopenharmony_ci      benchmarkSuite.add('mergeSourceMap', function() {
1433af6ab5fSopenharmony_ci        mergeSourceMap(previousMap as RawSourceMap, currentMap as RawSourceMap);
1443af6ab5fSopenharmony_ci      });
1453af6ab5fSopenharmony_ci
1463af6ab5fSopenharmony_ci      benchmarkSuite.add('convertLineBasedOnSourceMap', function() {
1473af6ab5fSopenharmony_ci        const sourceFileName = previousMap.sources?.length === 1 ? previousMap.sources[0] : '';
1483af6ab5fSopenharmony_ci        const source = new Source(sourceFileName, null);
1493af6ab5fSopenharmony_ci        const sourceMapLink = new SourceMapLink(decodedSourceMap!, [source]);
1503af6ab5fSopenharmony_ci        const arkObfuscator = new ArkObfuscatorMock();
1513af6ab5fSopenharmony_ci        arkObfuscator.convertLineBasedOnSourceMapMock(IDENTIFIER_CACHE, sourceMapLink);
1523af6ab5fSopenharmony_ci        arkObfuscator.convertLineBasedOnSourceMapMock(MEM_METHOD_CACHE, sourceMapLink);
1533af6ab5fSopenharmony_ci      });
1543af6ab5fSopenharmony_ci
1553af6ab5fSopenharmony_ci      benchmarkSuite.on('cycle', (event: any) => {
1563af6ab5fSopenharmony_ci        console.log(' ', String(event.target));
1573af6ab5fSopenharmony_ci      });
1583af6ab5fSopenharmony_ci
1593af6ab5fSopenharmony_ci      benchmarkSuite.run({ 'async': true });
1603af6ab5fSopenharmony_ci  });
1613af6ab5fSopenharmony_ci});