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