• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1#!/usr/bin/env python3
2# -*- coding: utf-8 -*-
3
4"""
5Copyright (c) 2021 Huawei Device Co., Ltd.
6Licensed under the Apache License, Version 2.0 (the "License");
7you may not use this file except in compliance with the License.
8You may obtain a copy of the License at
9
10    http://www.apache.org/licenses/LICENSE-2.0
11
12Unless required by applicable law or agreed to in writing, software
13distributed under the License is distributed on an "AS IS" BASIS,
14WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15See the License for the specific language governing permissions and
16limitations under the License.
17
18Description: Use ark to execute test 262 test suite
19"""
20
21import argparse
22import datetime
23import collections
24import json
25import os
26import shutil
27import sys
28import subprocess
29from multiprocessing import Pool
30import platform
31from utils import *
32from config import *
33
34
35def parse_args():
36    parser = argparse.ArgumentParser()
37    parser.add_argument('--dir', metavar='DIR',
38                        help='Directory to test ')
39    parser.add_argument('--file', metavar='FILE',
40                        help='File to test')
41    parser.add_argument('--mode',
42                        nargs='?', choices=[1, 2, 3], type=int,
43                        help='selection information as: ' +
44                        '1: only default \n ' +
45                        '2: only strict mode \n' +
46                        '3: both default and strict mode\n')
47    parser.add_argument('--es51', action='store_true',
48                        help='Run test262 ES5.1 version')
49    parser.add_argument('--es2021', default=False, const='all',
50                        nargs='?', choices=['all', 'only', 'other'],
51                        help='Run test262 - ES2021. ' +
52                        'all: Contains all use cases for es5_tests and es2015_tests and es2021_tests and intl_tests' +
53                        'only: Only include use cases for ES2021' +
54                        'other: Contains all use cases for es5_tests and es2015_tests and es2021_tests and intl_tests' +
55                        'and other_tests')
56    parser.add_argument('--es2022', default=False, const='all',
57                        nargs='?', choices=['all', 'only', 'other'],
58                        help='Run test262 - ES2022. ' +
59                        'all: Contains all use cases for es5_tests and es2015_tests and es2021_tests' +
60                        'and es2022_tests and intl_tests' +
61                        'only: Only include use cases for ES2022' +
62                        'other: Contains all use cases for es5_tests and es2015_tests and es2021_tests' +
63                        'and es2022_tests and intl_tests and other_tests')
64    parser.add_argument('--es2023', default=False, const='all',
65                        nargs='?', choices=['all', 'only', 'other'],
66                        help='Run test262 - ES2023. ' +
67                        'all: Contains all use cases for es5_tests and es2015_tests and es2021_tests' +
68                        'and es2022_tests and es2023_tests and intl_tests' +
69                        'only: Only include use cases for ES2023' +
70                        'other: Contains all use cases for es5_tests and es2015_tests and es2021_tests' +
71                        'and es2022_tests and es2023_tests and intl_tests and other_tests')
72    parser.add_argument('--intl', default=False, const='intl',
73                        nargs='?', choices=['intl'],
74                        help='Run test262 - Intltest. ' +
75                        'intl: Only include use cases for intlcsae')
76    parser.add_argument('--other', default=False, const='other',
77                        nargs='?', choices=['other'],
78                        help='Run test262 - other_tests ' +
79                        'other_tests: Only include use cases for other_tests')
80    parser.add_argument('--es2015', default=False, const='es2015',
81                        nargs='?', choices=['es2015'],
82                        help='Run test262 - es2015. ' +
83                        'es2015: Only include use cases for es2015')
84    parser.add_argument('--ci-build', action='store_true',
85                        help='Run test262 ES2015 filter cases for build version')
86    parser.add_argument('--esnext', action='store_true',
87                        help='Run test262 - ES.next.')
88    parser.add_argument('--engine', metavar='FILE',
89                        help='Other engine binarys to run tests(as:d8,qjs...)')
90    parser.add_argument('--babel', action='store_true',
91                        help='Whether to use Babel conversion')
92    parser.add_argument('--timeout', default=DEFAULT_TIMEOUT, type=int,
93                        help='Set a custom test timeout in milliseconds !!!\n')
94    parser.add_argument('--threads', default=DEFAULT_THREADS, type=int,
95                        help="Run this many tests in parallel.")
96    parser.add_argument('--hostArgs',
97                        help="command-line arguments to pass to eshost host\n")
98    parser.add_argument('--ark-tool',
99                        help="ark's binary tool")
100    parser.add_argument('--ark-aot', action='store_true',
101                        help="Run test262 with aot")
102    parser.add_argument('--ark-aot-tool',
103                        help="ark's aot tool")
104    parser.add_argument("--libs-dir",
105                        help="The path collection of dependent so has been divided by':'")
106    parser.add_argument('--ark-frontend',
107                        nargs='?', choices=ARK_FRONTEND_LIST, type=str,
108                        help="Choose one of them")
109    parser.add_argument('--ark-frontend-binary',
110                        help="ark frontend conversion binary tool")
111    parser.add_argument('--ark-arch',
112                        default=DEFAULT_ARK_ARCH,
113                        nargs='?', choices=ARK_ARCH_LIST, type=str,
114                        help="Choose one of them")
115    parser.add_argument('--ark-arch-root',
116                        default=DEFAULT_ARK_ARCH,
117                        help="the root path for qemu-aarch64 or qemu-arm")
118    parser.add_argument('--opt-level',
119                        default=DEFAULT_OPT_LEVEL,
120                        help="the opt level for es2abc")
121    parser.add_argument('--es2abc-thread-count',
122                        default=DEFAULT_ES2ABC_THREAD_COUNT,
123                        help="the thread count for es2abc")
124    parser.add_argument('--merge-abc-binary',
125                        help="frontend merge abc binary tool")
126    parser.add_argument('--merge-abc-mode',
127                        help="run test for merge abc mode")
128    parser.add_argument('--product-name',
129                        default=DEFAULT_PRODUCT_NAME,
130                        help="ark's product name")
131    parser.add_argument('--run-pgo', action='store_true',
132                        help="Run test262 with aot pgo")
133    parser.add_argument('--enable-litecg', action='store_true',
134                        help="Run test262 with aot litecg enabled")
135    parser.add_argument('--run-jit', action='store_true',
136                        help="Run test262 with JIT")
137    parser.add_argument('--run-baseline-jit', action='store_true',
138                        help="Run test262 with baseline JIT")
139    parser.add_argument('--enable-rm', action='store_true',
140                        help="Enable force remove of the data directory")
141    parser.add_argument('--abc2program', action='store_true',
142                        help="Use abc2prog to generate abc, aot or pgo is not supported yet under this option")
143    parser.add_argument('--stub-file',
144                        default=DEFAULT_STUB_FILE,
145                        help="stub file")
146    parser.add_argument('--disable-force-gc', action='store_true',
147                        help="Run test262 with close force-gc")
148    parser.add_argument('--enable-arkguard', action='store_true',
149                        help="enable arkguard for 262 tests")
150
151    args = parser.parse_args()
152    if args.abc2program and (args.run_pgo or args.ark_aot):
153        sys.exit("Error: '--abc2program' used together with  '--ark-aot' or '--run-pgo' is not supported")
154    return args
155
156
157def run_check(runnable, env=None):
158    report_command('Test command:', runnable, env=env)
159
160    if env is not None:
161        full_env = dict(os.environ)
162        full_env.update(env)
163        env = full_env
164
165    proc = subprocess.Popen(runnable, env=env)
166    proc.wait()
167    return proc.returncode
168
169
170def excuting_npm_install(args):
171    ark_frontend = DEFAULT_ARK_FRONTEND
172    if args.ark_frontend:
173        ark_frontend = args.ark_frontend
174
175    if ark_frontend != ARK_FRONTEND_LIST[0]:
176        return
177
178    ark_frontend_binary = os.path.join(ARK_FRONTEND_BINARY_LIST[0])
179    if args.ark_frontend_binary:
180        ark_frontend_binary = os.path.join(args.ark_frontend_binary)
181
182    ts2abc_build_dir = os.path.join(os.path.dirname(
183        os.path.realpath(ark_frontend_binary)), "..")
184
185    if not os.path.exists(os.path.join(ts2abc_build_dir, "package.json")) and \
186        not os.path.exists(os.path.join(ts2abc_build_dir, "..", "package.json")):
187        return
188
189    if os.path.exists(os.path.join(ts2abc_build_dir, "..", "package.json")) and \
190        not os.path.exists(os.path.join(ts2abc_build_dir, "package.json")):
191        ts2abc_build_dir = os.path.join(ts2abc_build_dir, "..")
192    # copy deps/ohos-typescript
193    deps_dir = os.path.join(ts2abc_build_dir, "deps")
194    mkdir(deps_dir)
195
196    shutil.copyfile(OHOS_TYPESCRIPT_TGZ_PATH, os.path.join(deps_dir, OHOS_TYPESCRIPT))
197
198    npm_install(ts2abc_build_dir)
199
200
201def init(args):
202    remove_dir(BASE_OUT_DIR)
203    remove_dir(TEST_ES5_DIR)
204    remove_dir(TEST_ES2015_DIR)
205    remove_dir(TEST_INTL_DIR)
206    remove_dir(TEST_ES2021_DIR)
207    remove_dir(TEST_ES2022_DIR)
208    remove_dir(TEST_ES2023_DIR)
209    remove_dir(TEST_CI_DIR)
210    get_all_skip_tests(args)
211    excuting_npm_install(args)
212
213
214def get_all_skip_tests(args):
215    # !!! plz correct the condition when changing the default frontend
216    if args.ark_frontend and args.ark_frontend == ARK_FRONTEND_LIST[1]:
217        SKIP_LIST_FILES.append(ES2ABC_SKIP_LIST_FILE)
218    else:
219        SKIP_LIST_FILES.append(TS2ABC_SKIP_LIST_FILE)
220
221    for file in SKIP_LIST_FILES:
222        with open(file) as jsonfile:
223            json_data = json.load(jsonfile)
224            for key in json_data:
225                ALL_SKIP_TESTS.extend(key["files"])
226
227
228def collect_files(path):
229    if os.path.isfile(path):
230        yield path
231        return
232
233    if not os.path.isdir(path):
234        raise ValueError(f'Not found: "{path}"')
235
236    for root, _, file_names in os.walk(path):
237        for file_name in file_names:
238            if file_name.startswith('.') or not file_name.endswith(".js"):
239                continue
240
241            yield os.path.join(root, file_name)
242
243
244def mkdstdir(file, src_dir, dist_dir):
245    idx = file.rfind(src_dir)
246    if idx == -1:
247        raise SystemExit(f'{file} can not found in {src_dir}')
248
249    fpath, fname = os.path.split(file[idx:])
250    fpath = fpath.replace(src_dir, dist_dir)
251    mkdir(fpath)
252
253
254class TestPrepare():
255    def __init__(self, args):
256        self.args = args
257        self.out_dir = BASE_OUT_DIR
258
259
260    def prepare_test262_code(self):
261        if not os.path.isdir(os.path.join(DATA_DIR, '.git')):
262            if self.args.run_jit:
263                git_clone(TEST262_JIT_GIT_URL, DATA_DIR)
264                git_checkout(TEST262_JIT_GIT_HASH, DATA_DIR)
265            else:
266                git_clone(TEST262_GIT_URL, DATA_DIR)
267                git_checkout(TEST262_GIT_HASH, DATA_DIR)
268
269        if self.args.enable_rm and self.args.run_jit and not os.path.isfile(TEST262_JIT_LABEL):
270            remove_dir(DATA_DIR)
271            git_clone(TEST262_JIT_GIT_URL, DATA_DIR)
272            git_checkout(TEST262_JIT_GIT_HASH, DATA_DIR)
273
274        if not os.path.isdir(os.path.join(ESHOST_DIR, '.git')):
275            git_clone(ESHOST_GIT_URL, ESHOST_DIR)
276            git_checkout(ESHOST_GIT_HASH, ESHOST_DIR)
277            git_apply('../eshost.patch', ESHOST_DIR)
278
279        npm_install(ESHOST_DIR)
280
281        if not os.path.isdir(os.path.join(HARNESS_DIR, '.git')):
282            git_clone(HARNESS_GIT_URL, HARNESS_DIR)
283            git_checkout(HARNESS_GIT_HASH, HARNESS_DIR)
284            git_apply('../harness.patch', HARNESS_DIR)
285
286        npm_install(HARNESS_DIR)
287
288    def prepare_clean_data(self):
289        git_clean(DATA_DIR)
290        if self.args.run_jit:
291            git_checkout(TEST262_JIT_GIT_HASH, DATA_DIR)
292        else:
293            git_checkout(TEST262_GIT_HASH, DATA_DIR)
294
295    def patching_the_plugin(self):
296        remove_file(os.path.join(ESHOST_DIR, "lib/agents/panda.js"))
297        remove_file(os.path.join(ESHOST_DIR, "runtimes/panda.js"))
298
299        git_clean(ESHOST_DIR)
300        git_apply("../eshost.patch", ESHOST_DIR)
301        git_clean(HARNESS_DIR)
302        git_apply("../harness.patch", HARNESS_DIR)
303
304    def prepare_args_es51_es2021(self):
305        if self.args.dir:
306            if TEST_ES5_DIR in self.args.dir:
307                self.args.es51 = True
308            elif TEST_ES2015_DIR in self.args.dir:
309                self.args.es2015 = "es2015"
310            elif TEST_INTL_DIR in self.args.dir:
311                self.args.intl = "intl"
312            elif TEST_ES2021_DIR in self.args.dir:
313                self.args.es2021 = "all"
314            elif TEST_ES2022_DIR in self.args.dir:
315                self.args.es2022 = "all"
316            elif TEST_ES2023_DIR in self.args.dir:
317                self.args.es2023 = "all"
318            elif TEST_OTHERTESTS_DIR in self.args.dir:
319                self.args.other = "other"
320
321        if self.args.file:
322            if TEST_ES5_DIR in self.args.file:
323                self.args.es51 = True
324            elif TEST_ES2015_DIR in self.args.file:
325                self.args.es2015 = "es2015"
326            elif TEST_INTL_DIR in self.args.file:
327                self.args.intl = "intl"
328            elif TEST_ES2021_DIR in self.args.file:
329                self.args.es2021 = "all"
330            elif TEST_ES2022_DIR in self.args.file:
331                self.args.es2022 = "all"
332            elif TEST_ES2023_DIR in self.args.file:
333                self.args.es2023 = "all"
334            elif TEST_OTHERTESTS_DIR in self.args.dir:
335                self.args.other = "other"
336
337    def prepare_out_dir(self):
338        if self.args.es51:
339            self.out_dir = os.path.join(BASE_OUT_DIR, "test_es51")
340        elif self.args.es2015:
341            self.out_dir = os.path.join(BASE_OUT_DIR, "test_es2015")
342        elif self.args.intl:
343            self.out_dir = os.path.join(BASE_OUT_DIR, "test_intl")
344        elif self.args.es2021:
345            self.out_dir = os.path.join(BASE_OUT_DIR, "test_es2021")
346        elif self.args.es2022:
347            self.out_dir = os.path.join(BASE_OUT_DIR, "test_es2022")
348        elif self.args.es2023:
349            self.out_dir = os.path.join(BASE_OUT_DIR, "test_es2023")
350        elif self.args.ci_build:
351            self.out_dir = os.path.join(BASE_OUT_DIR, "test_CI")
352        elif self.args.other:
353            self.out_dir = os.path.join(BASE_OUT_DIR, "other_tests")
354        else:
355            self.out_dir = os.path.join(BASE_OUT_DIR, "test")
356
357    def prepare_args_testdir(self):
358        if self.args.dir:
359            return
360
361        if self.args.es51:
362            self.args.dir = TEST_ES5_DIR
363        elif self.args.es2015:
364            self.args.dir = TEST_ES2015_DIR
365        elif self.args.intl:
366            self.args.dir = TEST_INTL_DIR
367        elif self.args.es2021:
368            self.args.dir = TEST_ES2021_DIR
369        elif self.args.es2022:
370            self.args.dir = TEST_ES2022_DIR
371        elif self.args.es2023:
372            self.args.dir = TEST_ES2023_DIR
373        elif self.args.other:
374            self.args.dir = TEST_OTHERTESTS_DIR
375        elif self.args.ci_build:
376            self.args.dir = TEST_CI_DIR
377        else:
378            self.args.dir = os.path.join(DATA_DIR, "test")
379
380    def copyfile(self, file, all_skips):
381        dstdir = os.path.join(DATA_DIR, "test")
382        file = file.strip()
383        file = file.strip('\n')
384        file = file.replace("\\", "/")
385        if file in all_skips:
386            return
387
388        srcdir = os.path.join(DATA_DIR, "test", file)
389        if self.args.es51:
390            dstdir = os.path.join(TEST_ES5_DIR, file)
391        elif self.args.es2015:
392            dstdir = os.path.join(TEST_ES2015_DIR, file)
393        elif self.args.intl:
394            dstdir = os.path.join(TEST_INTL_DIR, file)
395        elif self.args.es2021:
396            dstdir = os.path.join(TEST_ES2021_DIR, file)
397        elif self.args.es2022:
398            dstdir = os.path.join(TEST_ES2022_DIR, file)
399        elif self.args.es2023:
400            dstdir = os.path.join(TEST_ES2023_DIR, file)
401        elif self.args.other:
402            dstdir = os.path.join(TEST_OTHERTESTS_DIR, file)
403        elif self.args.ci_build:
404            dstdir = os.path.join(TEST_CI_DIR, file)
405
406        if os.path.isfile(srcdir):
407            shutil.copyfile(srcdir, dstdir)
408
409
410    def collect_tests(self):
411        files = []
412        origin_dir = os.path.join(DATA_DIR, "test/")
413        file_names = collect_files(origin_dir)
414        esid = ""
415        if self.args.es51:
416            esid = "es5id"
417        elif self.args.es2021 or self.args.es2022 or self.args.es2023:
418            esid = "es6id"
419
420        for file_name in file_names:
421            with open(file_name, 'r', encoding='utf-8') as file:
422                file_content = file.read()
423                if esid in file_content:
424                    files.append(file_name.split(origin_dir)[1])
425        return files
426
427    def get_tests_from_file(self, file):
428        with open(file) as fopen:
429            files = fopen.readlines()
430        return files
431
432    def prepare_es2021_tests(self):
433        files = []
434        files = self.collect_tests()
435        files.extend(self.get_tests_from_file(ES2021_LIST_FILE))
436        if self.args.es2021 == "all":
437            files.extend(self.get_tests_from_file(ES5_LIST_FILE))
438            files.extend(self.get_tests_from_file(INTL_LIST_FILE))
439            files.extend(self.get_tests_from_file(ES2015_LIST_FILE))
440        if self.args.es2021 == "other":
441            files.extend(self.get_tests_from_file(ES5_LIST_FILE))
442            files.extend(self.get_tests_from_file(INTL_LIST_FILE))
443            files.extend(self.get_tests_from_file(ES2015_LIST_FILE))
444            files.extend(self.get_tests_from_file(OTHER_LIST_FILE))
445        return files
446
447    def prepare_es2022_tests(self):
448        files = []
449        files.extend(self.get_tests_from_file(ES2022_LIST_FILE))
450        if self.args.es2022 == "all":
451            files.extend(self.get_tests_from_file(ES5_LIST_FILE))
452            files.extend(self.get_tests_from_file(INTL_LIST_FILE))
453            files.extend(self.get_tests_from_file(ES2015_LIST_FILE))
454            files.extend(self.collect_tests())
455            files.extend(self.get_tests_from_file(ES2021_LIST_FILE))
456        if self.args.es2022 == "other":
457            files.extend(self.get_tests_from_file(ES5_LIST_FILE))
458            files.extend(self.get_tests_from_file(INTL_LIST_FILE))
459            files.extend(self.get_tests_from_file(ES2015_LIST_FILE))
460            files.extend(self.collect_tests())
461            files.extend(self.get_tests_from_file(ES2021_LIST_FILE))
462            files.extend(self.get_tests_from_file(OTHER_LIST_FILE))
463        return files
464
465    def prepare_es2023_tests(self):
466        files = []
467        files.extend(self.get_tests_from_file(ES2023_LIST_FILE))
468        if self.args.es2023 == "all":
469            files.extend(self.get_tests_from_file(ES5_LIST_FILE))
470            files.extend(self.get_tests_from_file(INTL_LIST_FILE))
471            files.extend(self.get_tests_from_file(ES2015_LIST_FILE))
472            files.extend(self.collect_tests())
473            files.extend(self.get_tests_from_file(ES2021_LIST_FILE))
474            files.extend(self.get_tests_from_file(ES2022_LIST_FILE))
475        if self.args.es2023 == "other":
476            files.extend(self.get_tests_from_file(ES5_LIST_FILE))
477            files.extend(self.get_tests_from_file(INTL_LIST_FILE))
478            files.extend(self.get_tests_from_file(ES2015_LIST_FILE))
479            files.extend(self.collect_tests())
480            files.extend(self.get_tests_from_file(ES2021_LIST_FILE))
481            files.extend(self.get_tests_from_file(ES2022_LIST_FILE))
482            files.extend(self.get_tests_from_file(OTHER_LIST_FILE))
483        return files
484
485    def prepare_intl_tests(self):
486        files = []
487        files = self.collect_tests()
488        if self.args.intl:
489            files = self.get_tests_from_file(INTL_LIST_FILE)
490        return files
491
492    def prepare_other_tests(self):
493        files = []
494        files = self.collect_tests()
495        if self.args.other:
496            files = self.get_tests_from_file(OTHER_LIST_FILE)
497        return files
498
499    def prepare_es2015_tests(self):
500        files = []
501        files = self.collect_tests()
502        if self.args.es2015:
503            files = self.get_tests_from_file(ES2015_LIST_FILE)
504        return files
505
506    def prepare_test_suit(self):
507        files = []
508        test_dir = ""
509        if self.args.es51:
510            test_dir = TEST_ES5_DIR
511            files = self.get_tests_from_file(ES5_LIST_FILE)
512        elif self.args.es2015:
513            test_dir = TEST_ES2015_DIR
514            files = self.prepare_es2015_tests()
515        elif self.args.intl:
516            test_dir = TEST_INTL_DIR
517            files = self.prepare_intl_tests()
518        elif self.args.other:
519            test_dir = TEST_OTHERTESTS_DIR
520            files = self.prepare_other_tests()
521        elif self.args.es2021:
522            test_dir = TEST_ES2021_DIR
523            files = self.prepare_es2021_tests()
524        elif self.args.es2022:
525            test_dir = TEST_ES2022_DIR
526            files = self.prepare_es2022_tests()
527        elif self.args.es2023:
528            test_dir = TEST_ES2023_DIR
529            files = self.prepare_es2023_tests()
530        elif self.args.ci_build:
531            test_dir = TEST_CI_DIR
532            files = self.get_tests_from_file(CI_LIST_FILE)
533
534        for file in files:
535            path = os.path.split(file)[0]
536            path = os.path.join(test_dir, path)
537            mkdir(path)
538
539            self.copyfile(file, ALL_SKIP_TESTS)
540
541    def prepare_test262_test(self):
542        src_dir = TEST_FULL_DIR
543        if self.args.es51:
544            self.prepare_test_suit()
545            src_dir = TEST_ES5_DIR
546        elif self.args.es2015:
547            self.prepare_test_suit()
548            src_dir = TEST_ES2015_DIR
549        elif self.args.intl:
550            self.prepare_test_suit()
551            src_dir = TEST_INTL_DIR
552        elif self.args.other:
553            self.prepare_test_suit()
554            src_dir = TEST_OTHERTESTS_DIR
555        elif self.args.es2021:
556            self.prepare_test_suit()
557            src_dir = TEST_ES2021_DIR
558        elif self.args.es2022:
559            self.prepare_test_suit()
560            src_dir = TEST_ES2022_DIR
561        elif self.args.es2023:
562            self.prepare_test_suit()
563            src_dir = TEST_ES2023_DIR
564        elif self.args.ci_build:
565            self.prepare_test_suit()
566            src_dir = TEST_CI_DIR
567        elif self.args.esnext:
568            git_checkout(ESNEXT_GIT_HASH, DATA_DIR)
569        else:
570            if self.args.run_jit:
571                git_checkout(TEST262_JIT_GIT_HASH, DATA_DIR)
572            else:
573                git_checkout(TEST262_GIT_HASH, DATA_DIR)
574
575        if self.args.file:
576            mkdstdir(self.args.file, src_dir, self.out_dir)
577            return
578
579        files = collect_files(self.args.dir)
580        for file in files:
581            mkdstdir(file, src_dir, self.out_dir)
582
583    def run(self):
584        self.prepare_test262_code()
585        self.prepare_clean_data()
586        self.patching_the_plugin()
587        self.prepare_args_es51_es2021()
588        self.prepare_out_dir()
589        self.prepare_args_testdir()
590        self.prepare_test262_test()
591
592
593def run_test262_prepare(args):
594    init(args)
595
596    test_prepare = TestPrepare(args)
597    test_prepare.run()
598
599
600def modetype_to_string(mode):
601    if mode == 1:
602        return "only default"
603    if mode == 2:
604        return "only strict mode"
605    return "both default and strict mode"
606
607
608def run_test262_mode(args):
609    if args.mode:
610        return modetype_to_string(args.mode)
611    return modetype_to_string(DEFAULT_MODE)
612
613
614def get_execute_arg(args):
615    execute_args = ""
616
617    if args.file:
618        execute_args = args.file
619    else:
620        execute_args = os.path.join(args.dir, "**", "*.js")
621    return execute_args
622
623
624def get_host_path_type(args):
625    host_path = DEFAULT_HOST_PATH
626    host_type = DEFAULT_HOST_TYPE
627    if args.engine:
628        host_path = args.engine
629        host_type = os.path.split(args.engine.strip())[1]
630    return host_path, host_type
631
632
633def get_timeout(args, threads):
634    timeout = DEFAULT_TIMEOUT * threads
635    if args.timeout:
636        timeout = args.timeout
637    return timeout
638
639
640def get_threads(args):
641    threads = DEFAULT_THREADS
642    if args.threads:
643        threads = args.threads
644    return threads
645
646
647def get_host_args_of_product_name(args):
648    product_name = args.product_name
649    ark_dir = f"{ARGS_PREFIX}{product_name}/{ARK_DIR_SUFFIX}"
650    icui_dir = f"{ARGS_PREFIX}{product_name}/{ICUI_DIR_SUFFIX}"
651    ark_js_runtime_dir = f"{ARGS_PREFIX}{product_name}/{ARK_JS_RUNTIME_DIR_SUFFIX}"
652    zlib_dir = f"{ARGS_PREFIX}{product_name}/{ZLIB_DIR_SUFFIX}"
653
654    ark_tool = os.path.join(ark_js_runtime_dir, "ark_js_vm")
655    libs_dir = f"{icui_dir}:{LLVM_DIR}:{ark_js_runtime_dir}:{zlib_dir}"
656    ark_aot_tool = os.path.join(ark_js_runtime_dir, "ark_aot_compiler")
657    merge_abc_binary = os.path.join(ark_dir, "merge_abc")
658
659    return ark_tool, libs_dir, ark_aot_tool, merge_abc_binary
660
661
662def get_host_args_of_host_type(args, host_args, ark_tool, ark_aot_tool, libs_dir, ark_frontend,
663                               ark_frontend_binary, opt_level, es2abc_thread_count,
664                               merge_abc_binary, merge_abc_mode, product_name):
665    host_args = f"-B test262/run_sunspider.py "
666    host_args += f"--ark-tool={ark_tool} "
667    if args.ark_aot:
668        host_args += f"--ark-aot "
669    if args.run_pgo:
670        host_args += f"--run-pgo "
671    if args.enable_litecg:
672        host_args += f"--enable-litecg "
673    if args.run_jit:
674        host_args += f"--run-jit "
675    if args.run_baseline_jit:
676        host_args += f"--run-baseline-jit "
677    host_args += f"--ark-aot-tool={ark_aot_tool} "
678    host_args += f"--libs-dir={libs_dir} "
679    host_args += f"--ark-frontend={ark_frontend} "
680    host_args += f"--ark-frontend-binary={ark_frontend_binary} "
681    host_args += f"--opt-level={opt_level} "
682    host_args += f"--es2abc-thread-count={es2abc_thread_count} "
683    host_args += f"--merge-abc-binary={merge_abc_binary} "
684    host_args += f"--merge-abc-mode={merge_abc_mode} "
685    host_args += f"--product-name={product_name} "
686    if args.abc2program:
687        host_args = f"{host_args}--abc2program "
688    if args.enable_arkguard:
689        host_args = f"{host_args}--enable-arkguard "
690
691    return host_args
692
693
694def get_host_args_of_ark_arch(args, host_args):
695    host_args += f"--ark-arch={args.ark_arch} "
696    host_args += f"--ark-arch-root={args.ark_arch_root} "
697
698    return host_args
699
700
701def get_disable_force_gc(host_args, args):
702    host_args += f"--disable-force-gc "
703
704    return host_args
705
706
707def get_host_args_of_stub_file(args, host_args):
708    host_args += f"--stub-file={args.stub_file} "
709
710    return host_args
711
712
713def get_host_args(args, host_type):
714    host_args = ""
715    ark_tool = DEFAULT_ARK_TOOL
716    ark_aot_tool = DEFAULT_ARK_AOT_TOOL
717    libs_dir = DEFAULT_LIBS_DIR
718    ark_frontend = DEFAULT_ARK_FRONTEND
719    ark_frontend_binary = DEFAULT_ARK_FRONTEND_BINARY
720    ark_arch = DEFAULT_ARK_ARCH
721    stub_file = DEFAULT_STUB_FILE
722    opt_level = DEFAULT_OPT_LEVEL
723    es2abc_thread_count = DEFAULT_ES2ABC_THREAD_COUNT
724    merge_abc_binary = DEFAULT_MERGE_ABC_BINARY
725    merge_abc_mode = DEFAULT_MERGE_ABC_MODE
726    product_name = DEFAULT_PRODUCT_NAME
727
728    if args.product_name:
729        ark_tool, libs_dir, ark_aot_tool, merge_abc_binary = get_host_args_of_product_name(args)
730
731    if args.hostArgs:
732        host_args = args.hostArgs
733
734    if args.ark_tool:
735        ark_tool = args.ark_tool
736
737    if args.ark_aot_tool:
738        ark_aot_tool = args.ark_aot_tool
739
740    if args.libs_dir:
741        libs_dir = args.libs_dir
742
743    if args.ark_frontend:
744        ark_frontend = args.ark_frontend
745
746    if args.ark_frontend_binary:
747        ark_frontend_binary = args.ark_frontend_binary
748
749    if args.opt_level:
750        opt_level = args.opt_level
751
752    if args.es2abc_thread_count:
753        es2abc_thread_count = args.es2abc_thread_count
754
755    if args.merge_abc_binary:
756        merge_abc_binary = args.merge_abc_binary
757
758    if args.merge_abc_mode:
759        merge_abc_mode = args.merge_abc_mode
760
761    if host_type == DEFAULT_HOST_TYPE:
762        host_args = get_host_args_of_host_type(args, host_args, ark_tool, ark_aot_tool, libs_dir, ark_frontend,
763                                               ark_frontend_binary, opt_level, es2abc_thread_count,
764                                               merge_abc_binary, merge_abc_mode, product_name)
765
766    if args.ark_arch != ark_arch:
767        host_args = get_host_args_of_ark_arch(args, host_args)
768
769    if args.stub_file != stub_file:
770        host_args = get_host_args_of_stub_file(args, host_args)
771
772    if args.disable_force_gc:
773        host_args = get_disable_force_gc(host_args, args)
774
775    return host_args
776
777
778def run_test262_test(args):
779    execute_args = get_execute_arg(args)
780    host_path, host_type = get_host_path_type(args)
781    host_args = get_host_args(args, host_type)
782    threads = get_threads(args)
783    timeout = get_timeout(args, threads)
784
785    test_cmd = ["node", TEST262_RUNNER_SCRIPT]
786    test_cmd.append(f"--hostType={host_type}")
787    test_cmd.append(f"--hostPath={host_path}")
788    if host_args != "":
789        test_cmd.append(f"--hostArgs='{host_args}'")
790    test_cmd.append(f"--threads={threads}")
791    test_cmd.append(f"--mode={run_test262_mode(args)}")
792    test_cmd.append(f"--timeout={timeout}")
793    if platform.system() == "Windows" :
794        global BASE_OUT_DIR
795        global DATA_DIR
796        BASE_OUT_DIR = BASE_OUT_DIR.replace("/","\\")
797        DATA_DIR = DATA_DIR.replace("/","\\")
798        execute_args = execute_args.replace("/","\\")
799    test_cmd.append(f"--tempDir={BASE_OUT_DIR}")
800    test_cmd.append(f"--test262Dir={DATA_DIR}")
801
802    if args.babel:
803        test_cmd.append("--preprocessor='test262/babel-preprocessor.js'")
804    test_cmd.append(DEFAULT_OTHER_ARGS)
805    test_cmd.append(execute_args)
806
807    run_check(test_cmd)
808
809Check = collections.namedtuple('Check', ['enabled', 'runner', 'arg'])
810
811
812def main(args):
813    print("\nWait a moment..........\n")
814    starttime = datetime.datetime.now()
815    run_test262_prepare(args)
816    check = Check(True, run_test262_test, args)
817    ret = check.runner(check.arg)
818    if ret:
819        sys.exit(ret)
820    endtime = datetime.datetime.now()
821    print(f"used time is: {str(endtime - starttime)}")
822
823if __name__ == "__main__":
824    sys.exit(main(parse_args()))
825