• 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'],
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    parser.add_argument('--es2022', default=False, const='all',
55                        nargs='?', choices=['all', 'only'],
56                        help='Run test262 - ES2022. ' +
57                        'all: Contains all use cases for es5_tests and es2015_tests and es2021_tests' +
58                        'and es2022_tests and intl_tests' +
59                        'only: Only include use cases for ES2022')
60    parser.add_argument('--es2023', default=False, const='all',
61                        nargs='?', choices=['all', 'only'],
62                        help='Run test262 - ES2023. ' +
63                        'all: Contains all use cases for es5_tests and es2015_tests and es2021_tests' +
64                        'and es2022_tests and es2023_tests and intl_tests' +
65                        'only: Only include use cases for ES2023')
66    parser.add_argument('--intl', default=False, const='intl',
67                        nargs='?', choices=['intl'],
68                        help='Run test262 - Intltest. ' +
69                        'intl: Only include use cases for intlcsae')
70    parser.add_argument('--es2015', default=False, const='es2015',
71                        nargs='?', choices=['es2015'],
72                        help='Run test262 - es2015. ' +
73                        'es2015: Only include use cases for es2015')
74    parser.add_argument('--ci-build', action='store_true',
75                        help='Run test262 ES2015 filter cases for build version')
76    parser.add_argument('--esnext', action='store_true',
77                        help='Run test262 - ES.next.')
78    parser.add_argument('--engine', metavar='FILE',
79                        help='Other engine binarys to run tests(as:d8,qjs...)')
80    parser.add_argument('--babel', action='store_true',
81                        help='Whether to use Babel conversion')
82    parser.add_argument('--timeout', default=DEFAULT_TIMEOUT, type=int,
83                        help='Set a custom test timeout in milliseconds !!!\n')
84    parser.add_argument('--threads', default=DEFAULT_THREADS, type=int,
85                        help="Run this many tests in parallel.")
86    parser.add_argument('--hostArgs',
87                        help="command-line arguments to pass to eshost host\n")
88    parser.add_argument('--ark-tool',
89                        help="ark's binary tool")
90    parser.add_argument('--ark-aot', action='store_true',
91                        help="Run test262 with aot")
92    parser.add_argument('--ark-aot-tool',
93                        help="ark's aot tool")
94    parser.add_argument("--libs-dir",
95                        help="The path collection of dependent so has been divided by':'")
96    parser.add_argument('--ark-frontend',
97                        nargs='?', choices=ARK_FRONTEND_LIST, type=str,
98                        help="Choose one of them")
99    parser.add_argument('--ark-frontend-binary',
100                        help="ark frontend conversion binary tool")
101    parser.add_argument('--ark-arch',
102                        default=DEFAULT_ARK_ARCH,
103                        nargs='?', choices=ARK_ARCH_LIST, type=str,
104                        help="Choose one of them")
105    parser.add_argument('--ark-arch-root',
106                        default=DEFAULT_ARK_ARCH,
107                        help="the root path for qemu-aarch64 or qemu-arm")
108    parser.add_argument('--opt-level',
109                        default=DEFAULT_OPT_LEVEL,
110                        help="the opt level for es2abc")
111    parser.add_argument('--es2abc-thread-count',
112                        default=DEFAULT_ES2ABC_THREAD_COUNT,
113                        help="the thread count for es2abc")
114    parser.add_argument('--merge-abc-binary',
115                        help="frontend merge abc binary tool")
116    parser.add_argument('--merge-abc-mode',
117                        help="run test for merge abc mode")
118    parser.add_argument('--product-name',
119                        default=DEFAULT_PRODUCT_NAME,
120                        help="ark's product name")
121    parser.add_argument('--run-pgo', action='store_true',
122                        help="Run test262 with aot pgo")
123    return parser.parse_args()
124
125
126def run_check(runnable, env=None):
127    report_command('Test command:', runnable, env=env)
128
129    if env is not None:
130        full_env = dict(os.environ)
131        full_env.update(env)
132        env = full_env
133
134    proc = subprocess.Popen(runnable, env=env)
135    proc.wait()
136    return proc.returncode
137
138
139def excuting_npm_install(args):
140    ark_frontend = DEFAULT_ARK_FRONTEND
141    if args.ark_frontend:
142        ark_frontend = args.ark_frontend
143
144    if ark_frontend != ARK_FRONTEND_LIST[0]:
145        return
146
147    ark_frontend_binary = os.path.join(ARK_FRONTEND_BINARY_LIST[0])
148    if args.ark_frontend_binary:
149        ark_frontend_binary = os.path.join(args.ark_frontend_binary)
150
151    ts2abc_build_dir = os.path.join(os.path.dirname(
152        os.path.realpath(ark_frontend_binary)), "..")
153
154    if not os.path.exists(os.path.join(ts2abc_build_dir, "package.json")) and \
155        not os.path.exists(os.path.join(ts2abc_build_dir, "..", "package.json")):
156        return
157
158    if os.path.exists(os.path.join(ts2abc_build_dir, "..", "package.json")) and \
159        not os.path.exists(os.path.join(ts2abc_build_dir, "package.json")):
160        ts2abc_build_dir = os.path.join(ts2abc_build_dir, "..")
161    # copy deps/ohos-typescript
162    deps_dir = os.path.join(ts2abc_build_dir, "deps")
163    mkdir(deps_dir)
164
165    shutil.copyfile(OHOS_TYPESCRIPT_TGZ_PATH, os.path.join(deps_dir, OHOS_TYPESCRIPT))
166
167    npm_install(ts2abc_build_dir)
168
169
170def init(args):
171    remove_dir(BASE_OUT_DIR)
172    remove_dir(TEST_ES5_DIR)
173    remove_dir(TEST_ES2015_DIR)
174    remove_dir(TEST_INTL_DIR)
175    remove_dir(TEST_ES2021_DIR)
176    remove_dir(TEST_ES2022_DIR)
177    remove_dir(TEST_ES2023_DIR)
178    remove_dir(TEST_CI_DIR)
179    get_all_skip_tests(args)
180    excuting_npm_install(args)
181
182
183def get_all_skip_tests(args):
184    # !!! plz correct the condition when changing the default frontend
185    if args.ark_frontend and args.ark_frontend == ARK_FRONTEND_LIST[1]:
186        SKIP_LIST_FILES.append(ES2ABC_SKIP_LIST_FILE)
187    else:
188        SKIP_LIST_FILES.append(TS2ABC_SKIP_LIST_FILE)
189
190    for file in SKIP_LIST_FILES:
191        with open(file) as jsonfile:
192            json_data = json.load(jsonfile)
193            for key in json_data:
194                ALL_SKIP_TESTS.extend(key["files"])
195
196
197def collect_files(path):
198    if os.path.isfile(path):
199        yield path
200        return
201
202    if not os.path.isdir(path):
203        raise ValueError(f'Not found: "{path}"')
204
205    for root, _, file_names in os.walk(path):
206        for file_name in file_names:
207            if file_name.startswith('.') or not file_name.endswith(".js"):
208                continue
209
210            yield os.path.join(root, file_name)
211
212
213def mkdstdir(file, src_dir, dist_dir):
214    idx = file.rfind(src_dir)
215    if idx == -1:
216        raise SystemExit(f'{file} can not found in {src_dir}')
217
218    fpath, fname = os.path.split(file[idx:])
219    fpath = fpath.replace(src_dir, dist_dir)
220    mkdir(fpath)
221
222
223class TestPrepare():
224    def __init__(self, args):
225        self.args = args
226        self.out_dir = BASE_OUT_DIR
227
228
229    def prepare_test262_code(self):
230        if not os.path.isdir(os.path.join(DATA_DIR, '.git')):
231            git_clone(TEST262_GIT_URL, DATA_DIR)
232            git_checkout(TEST262_GIT_HASH, DATA_DIR)
233
234        if not os.path.isdir(os.path.join(ESHOST_DIR, '.git')):
235            git_clone(ESHOST_GIT_URL, ESHOST_DIR)
236            git_checkout(ESHOST_GIT_HASH, ESHOST_DIR)
237            git_apply('../eshost.patch', ESHOST_DIR)
238
239        npm_install(ESHOST_DIR)
240
241        if not os.path.isdir(os.path.join(HARNESS_DIR, '.git')):
242            git_clone(HARNESS_GIT_URL, HARNESS_DIR)
243            git_checkout(HARNESS_GIT_HASH, HARNESS_DIR)
244            git_apply('../harness.patch', HARNESS_DIR)
245
246        npm_install(HARNESS_DIR)
247
248    def prepare_clean_data(self):
249        git_clean(DATA_DIR)
250        git_checkout(TEST262_GIT_HASH, DATA_DIR)
251
252    def patching_the_plugin(self):
253        remove_file(os.path.join(ESHOST_DIR, "lib/agents/panda.js"))
254        remove_file(os.path.join(ESHOST_DIR, "runtimes/panda.js"))
255
256        git_clean(ESHOST_DIR)
257        git_apply("../eshost.patch", ESHOST_DIR)
258        git_clean(HARNESS_DIR)
259        git_apply("../harness.patch", HARNESS_DIR)
260
261    def prepare_args_es51_es2021(self):
262        if self.args.dir:
263            if TEST_ES5_DIR in self.args.dir:
264                self.args.es51 = True
265            elif TEST_ES2015_DIR in self.args.dir:
266                self.args.es2015 = "es2015"
267            elif TEST_INTL_DIR in self.args.dir:
268                self.args.intl = "intl"
269            elif TEST_ES2021_DIR in self.args.dir:
270                self.args.es2021 = "all"
271            elif TEST_ES2022_DIR in self.args.dir:
272                self.args.es2022 = "all"
273            elif TEST_ES2023_DIR in self.args.dir:
274                self.args.es2023 = "all"
275
276        if self.args.file:
277            if TEST_ES5_DIR in self.args.file:
278                self.args.es51 = True
279            elif TEST_ES2015_DIR in self.args.file:
280                self.args.es2015 = "es2015"
281            elif TEST_INTL_DIR in self.args.file:
282                self.args.intl = "intl"
283            elif TEST_ES2021_DIR in self.args.file:
284                self.args.es2021 = "all"
285            elif TEST_ES2022_DIR in self.args.file:
286                self.args.es2022 = "all"
287            elif TEST_ES2023_DIR in self.args.file:
288                self.args.es2023 = "all"
289
290    def prepare_out_dir(self):
291        if self.args.es51:
292            self.out_dir = os.path.join(BASE_OUT_DIR, "test_es51")
293        elif self.args.es2015:
294            self.out_dir = os.path.join(BASE_OUT_DIR, "test_es2015")
295        elif self.args.intl:
296            self.out_dir = os.path.join(BASE_OUT_DIR, "test_intl")
297        elif self.args.es2021:
298            self.out_dir = os.path.join(BASE_OUT_DIR, "test_es2021")
299        elif self.args.es2022:
300            self.out_dir = os.path.join(BASE_OUT_DIR, "test_es2022")
301        elif self.args.es2023:
302            self.out_dir = os.path.join(BASE_OUT_DIR, "test_es2023")
303        elif self.args.ci_build:
304            self.out_dir = os.path.join(BASE_OUT_DIR, "test_CI")
305        else:
306            self.out_dir = os.path.join(BASE_OUT_DIR, "test")
307
308    def prepare_args_testdir(self):
309        if self.args.dir:
310            return
311
312        if self.args.es51:
313            self.args.dir = TEST_ES5_DIR
314        elif self.args.es2015:
315            self.args.dir = TEST_ES2015_DIR
316        elif self.args.intl:
317            self.args.dir = TEST_INTL_DIR
318        elif self.args.es2021:
319            self.args.dir = TEST_ES2021_DIR
320        elif self.args.es2022:
321            self.args.dir = TEST_ES2022_DIR
322        elif self.args.es2023:
323            self.args.dir = TEST_ES2023_DIR
324        elif self.args.ci_build:
325            self.args.dir = TEST_CI_DIR
326        else:
327            self.args.dir = os.path.join(DATA_DIR, "test")
328
329    def copyfile(self, file, all_skips):
330        dstdir = os.path.join(DATA_DIR, "test")
331        file = file.strip()
332        file = file.strip('\n')
333        file = file.replace("\\", "/")
334        if file in all_skips:
335            return
336
337        srcdir = os.path.join(DATA_DIR, "test", file)
338        if self.args.es51:
339            dstdir = os.path.join(TEST_ES5_DIR, file)
340        elif self.args.es2015:
341            dstdir = os.path.join(TEST_ES2015_DIR, file)
342        elif self.args.intl:
343            dstdir = os.path.join(TEST_INTL_DIR, file)
344        elif self.args.es2021:
345            dstdir = os.path.join(TEST_ES2021_DIR, file)
346        elif self.args.es2022:
347            dstdir = os.path.join(TEST_ES2022_DIR, file)
348        elif self.args.es2023:
349            dstdir = os.path.join(TEST_ES2023_DIR, file)
350        elif self.args.ci_build:
351            dstdir = os.path.join(TEST_CI_DIR, file)
352
353        if os.path.isfile(srcdir):
354            shutil.copyfile(srcdir, dstdir)
355
356
357    def collect_tests(self):
358        files = []
359        origin_dir = os.path.join(DATA_DIR, "test/")
360        file_names = collect_files(origin_dir)
361        esid = ""
362        if self.args.es51:
363            esid = "es5id"
364        elif self.args.es2021 or self.args.es2022 or self.args.es2023:
365            esid = "es6id"
366
367        for file_name in file_names:
368            with open(file_name, 'r', encoding='utf-8') as file:
369                file_content = file.read()
370                if esid in file_content:
371                    files.append(file_name.split(origin_dir)[1])
372        return files
373
374    def get_tests_from_file(self, file):
375        with open(file) as fopen:
376            files = fopen.readlines()
377        return files
378
379    def prepare_es2021_tests(self):
380        files = []
381        files = self.collect_tests()
382        files.extend(self.get_tests_from_file(ES2021_LIST_FILE))
383        if self.args.es2021 == "all":
384            files.extend(self.get_tests_from_file(ES5_LIST_FILE))
385            files.extend(self.get_tests_from_file(INTL_LIST_FILE))
386            files.extend(self.get_tests_from_file(ES2015_LIST_FILE))
387        return files
388
389    def prepare_es2022_tests(self):
390        files = []
391        files.extend(self.get_tests_from_file(ES2022_LIST_FILE))
392        if self.args.es2022 == "all":
393            files.extend(self.get_tests_from_file(ES5_LIST_FILE))
394            files.extend(self.get_tests_from_file(INTL_LIST_FILE))
395            files.extend(self.get_tests_from_file(ES2015_LIST_FILE))
396            files.extend(self.collect_tests())
397            files.extend(self.get_tests_from_file(ES2021_LIST_FILE))
398        return files
399
400    def prepare_es2023_tests(self):
401        files = []
402        files.extend(self.get_tests_from_file(ES2023_LIST_FILE))
403        if self.args.es2023 == "all":
404            files.extend(self.get_tests_from_file(ES5_LIST_FILE))
405            files.extend(self.get_tests_from_file(INTL_LIST_FILE))
406            files.extend(self.get_tests_from_file(ES2015_LIST_FILE))
407            files.extend(self.collect_tests())
408            files.extend(self.get_tests_from_file(ES2021_LIST_FILE))
409            files.extend(self.get_tests_from_file(ES2022_LIST_FILE))
410        return files
411
412    def prepare_intl_tests(self):
413        files = []
414        files = self.collect_tests()
415        if self.args.intl:
416            files = self.get_tests_from_file(INTL_LIST_FILE)
417        return files
418
419    def prepare_es2015_tests(self):
420        files = []
421        files = self.collect_tests()
422        if self.args.es2015:
423            files = self.get_tests_from_file(ES2015_LIST_FILE)
424        return files
425
426    def prepare_test_suit(self):
427        files = []
428        test_dir = ""
429        if self.args.es51:
430            test_dir = TEST_ES5_DIR
431            files = self.get_tests_from_file(ES5_LIST_FILE)
432        elif self.args.es2015:
433            test_dir = TEST_ES2015_DIR
434            files = self.prepare_es2015_tests()
435        elif self.args.intl:
436            test_dir = TEST_INTL_DIR
437            files = self.prepare_intl_tests()
438        elif self.args.es2021:
439            test_dir = TEST_ES2021_DIR
440            files = self.prepare_es2021_tests()
441        elif self.args.es2022:
442            test_dir = TEST_ES2022_DIR
443            files = self.prepare_es2022_tests()
444        elif self.args.es2023:
445            test_dir = TEST_ES2023_DIR
446            files = self.prepare_es2023_tests()
447        elif self.args.ci_build:
448            test_dir = TEST_CI_DIR
449            files = self.get_tests_from_file(CI_LIST_FILE)
450
451        for file in files:
452            path = os.path.split(file)[0]
453            path = os.path.join(test_dir, path)
454            mkdir(path)
455
456            self.copyfile(file, ALL_SKIP_TESTS)
457
458    def prepare_test262_test(self):
459        src_dir = TEST_FULL_DIR
460        if self.args.es51:
461            self.prepare_test_suit()
462            src_dir = TEST_ES5_DIR
463        elif self.args.es2015:
464            self.prepare_test_suit()
465            src_dir = TEST_ES2015_DIR
466        elif self.args.intl:
467            self.prepare_test_suit()
468            src_dir = TEST_INTL_DIR
469        elif self.args.es2021:
470            self.prepare_test_suit()
471            src_dir = TEST_ES2021_DIR
472        elif self.args.es2022:
473            self.prepare_test_suit()
474            src_dir = TEST_ES2022_DIR
475        elif self.args.es2023:
476            self.prepare_test_suit()
477            src_dir = TEST_ES2023_DIR
478        elif self.args.ci_build:
479            self.prepare_test_suit()
480            src_dir = TEST_CI_DIR
481        elif self.args.esnext:
482            git_checkout(ESNEXT_GIT_HASH, DATA_DIR)
483        else:
484            git_checkout(TEST262_GIT_HASH, DATA_DIR)
485
486        if self.args.file:
487            mkdstdir(self.args.file, src_dir, self.out_dir)
488            return
489
490        files = collect_files(self.args.dir)
491        for file in files:
492            mkdstdir(file, src_dir, self.out_dir)
493
494    def run(self):
495        self.prepare_test262_code()
496        self.prepare_clean_data()
497        self.patching_the_plugin()
498        self.prepare_args_es51_es2021()
499        self.prepare_out_dir()
500        self.prepare_args_testdir()
501        self.prepare_test262_test()
502
503
504def run_test262_prepare(args):
505    init(args)
506
507    test_prepare = TestPrepare(args)
508    test_prepare.run()
509
510
511def modetype_to_string(mode):
512    if mode == 1:
513        return "only default"
514    if mode == 2:
515        return "only strict mode"
516    return "both default and strict mode"
517
518
519def run_test262_mode(args):
520    if args.mode:
521        return modetype_to_string(args.mode)
522    return modetype_to_string(DEFAULT_MODE)
523
524
525def get_execute_arg(args):
526    execute_args = ""
527
528    if args.file:
529        execute_args = args.file
530    else:
531        execute_args = os.path.join(args.dir, "**", "*.js")
532    return execute_args
533
534
535def get_host_path_type(args):
536    host_path = DEFAULT_HOST_PATH
537    host_type = DEFAULT_HOST_TYPE
538    if args.engine:
539        host_path = args.engine
540        host_type = os.path.split(args.engine.strip())[1]
541    return host_path, host_type
542
543
544def get_timeout(args, threads):
545    timeout = DEFAULT_TIMEOUT * threads
546    if args.timeout:
547        timeout = args.timeout
548    return timeout
549
550
551def get_threads(args):
552    threads = DEFAULT_THREADS
553    if args.threads:
554        threads = args.threads
555    return threads
556
557
558def get_host_args(args, host_type):
559    host_args = ""
560    ark_tool = DEFAULT_ARK_TOOL
561    ark_aot_tool = DEFAULT_ARK_AOT_TOOL
562    libs_dir = DEFAULT_LIBS_DIR
563    ark_frontend = DEFAULT_ARK_FRONTEND
564    ark_frontend_binary = DEFAULT_ARK_FRONTEND_BINARY
565    ark_arch = DEFAULT_ARK_ARCH
566    opt_level = DEFAULT_OPT_LEVEL
567    es2abc_thread_count = DEFAULT_ES2ABC_THREAD_COUNT
568    merge_abc_binary = DEFAULT_MERGE_ABC_BINARY
569    merge_abc_mode = DEFAULT_MERGE_ABC_MODE
570    product_name = DEFAULT_PRODUCT_NAME
571
572    if args.product_name:
573        product_name = args.product_name
574        ark_dir = f"{ARGS_PREFIX}{product_name}/{ARK_DIR_SUFFIX}"
575        icui_dir = f"{ARGS_PREFIX}{product_name}/{ICUI_DIR_SUFFIX}"
576        ark_js_runtime_dir = f"{ARGS_PREFIX}{product_name}/{ARK_JS_RUNTIME_DIR_SUFFIX}"
577        zlib_dir = f"{ARGS_PREFIX}{product_name}/{ZLIB_DIR_SUFFIX}"
578
579        ark_tool = os.path.join(ark_js_runtime_dir, "ark_js_vm")
580        libs_dir = f"{icui_dir}:{LLVM_DIR}:{ark_js_runtime_dir}:{zlib_dir}"
581        ark_aot_tool = os.path.join(ark_js_runtime_dir, "ark_aot_compiler")
582        merge_abc_binary = os.path.join(ark_dir, "merge_abc")
583
584    if args.hostArgs:
585        host_args = args.hostArgs
586
587    if args.ark_tool:
588        ark_tool = args.ark_tool
589
590    if args.ark_aot_tool:
591        ark_aot_tool = args.ark_aot_tool
592
593    if args.libs_dir:
594        libs_dir = args.libs_dir
595
596    if args.ark_frontend:
597        ark_frontend = args.ark_frontend
598
599    if args.ark_frontend_binary:
600        ark_frontend_binary = args.ark_frontend_binary
601
602    if args.opt_level:
603        opt_level = args.opt_level
604
605    if args.es2abc_thread_count:
606        es2abc_thread_count = args.es2abc_thread_count
607
608    if args.merge_abc_binary:
609        merge_abc_binary = args.merge_abc_binary
610
611    if args.merge_abc_mode:
612        merge_abc_mode = args.merge_abc_mode
613    if host_type == DEFAULT_HOST_TYPE:
614        host_args = f"-B test262/run_sunspider.py "
615        host_args += f"--ark-tool={ark_tool} "
616        if args.ark_aot:
617            host_args += f"--ark-aot "
618        if args.run_pgo:
619            host_args += f"--run-pgo "
620        host_args += f"--ark-aot-tool={ark_aot_tool} "
621        host_args += f"--libs-dir={libs_dir} "
622        host_args += f"--ark-frontend={ark_frontend} "
623        host_args += f"--ark-frontend-binary={ark_frontend_binary} "
624        host_args += f"--opt-level={opt_level} "
625        host_args += f"--es2abc-thread-count={es2abc_thread_count} "
626        host_args += f"--merge-abc-binary={merge_abc_binary} "
627        host_args += f"--merge-abc-mode={merge_abc_mode} "
628        host_args += f"--product-name={product_name} "
629
630    if args.ark_arch != ark_arch:
631        host_args += f"--ark-arch={args.ark_arch} "
632        host_args += f"--ark-arch-root={args.ark_arch_root} "
633
634    return host_args
635
636
637def run_test262_test(args):
638    execute_args = get_execute_arg(args)
639    host_path, host_type = get_host_path_type(args)
640    host_args = get_host_args(args, host_type)
641    threads = get_threads(args)
642    timeout = get_timeout(args, threads)
643
644    test_cmd = ["node", TEST262_RUNNER_SCRIPT]
645    test_cmd.append(f"--hostType={host_type}")
646    test_cmd.append(f"--hostPath={host_path}")
647    if host_args != "":
648        test_cmd.append(f"--hostArgs='{host_args}'")
649    test_cmd.append(f"--threads={threads}")
650    test_cmd.append(f"--mode={run_test262_mode(args)}")
651    test_cmd.append(f"--timeout={timeout}")
652    if platform.system() == "Windows" :
653        global BASE_OUT_DIR
654        global DATA_DIR
655        BASE_OUT_DIR = BASE_OUT_DIR.replace("/","\\")
656        DATA_DIR = DATA_DIR.replace("/","\\")
657        execute_args = execute_args.replace("/","\\")
658    test_cmd.append(f"--tempDir={BASE_OUT_DIR}")
659    test_cmd.append(f"--test262Dir={DATA_DIR}")
660
661    if args.babel:
662        test_cmd.append("--preprocessor='test262/babel-preprocessor.js'")
663    test_cmd.append(DEFAULT_OTHER_ARGS)
664    test_cmd.append(execute_args)
665
666    run_check(test_cmd)
667
668
669Check = collections.namedtuple('Check', ['enabled', 'runner', 'arg'])
670
671
672def main(args):
673    print("\nWait a moment..........\n")
674    starttime = datetime.datetime.now()
675    run_test262_prepare(args)
676    check = Check(True, run_test262_test, args)
677    ret = check.runner(check.arg)
678    if ret:
679        sys.exit(ret)
680    endtime = datetime.datetime.now()
681    print(f"used time is: {str(endtime - starttime)}")
682
683
684if __name__ == "__main__":
685    sys.exit(main(parse_args()))
686