def run_bot(): print_magic_file_state() # Ensure that there is nothing currently scheduled (broken/stopped run) for magic in ALL_MAGIC: if get_magic_file_exists(magic): log('ERROR: Synchronizing file %s exists, cleaning up' % magic) delete_magic_file(magic) print_magic_file_state() assert not get_magic_file_exists(READY_FOR_TESTING) git_hash = utils.get_HEAD_sha1() put_magic_file(READY_FOR_TESTING, git_hash) begin = time.time() while True: if time.time() - begin > BOT_RUN_TIMEOUT: log('Timeout exceeded: http://go/internal-r8-doc') raise Exception('Bot timeout') if get_magic_file_exists(TESTING_COMPLETE): if get_magic_file_content(TESTING_COMPLETE) == git_hash: break else: raise Exception( 'Non matching git hashes %s and %s' % (get_magic_file_content(TESTING_COMPLETE), git_hash)) log('Still waiting for test result') print_magic_file_state() time.sleep(PULL_DELAY) total_time = time.time() - begin log('Done running test for %s in %ss' % (git_hash, total_time)) test_status = get_status(git_hash) delete_magic_file(TESTING_COMPLETE) log('Test status is: %s' % test_status) if test_status != '0': fetch_and_print_logs(git_hash) return 1
def git_checkout(git_hash): ensure_git_clean() # Ensure that we are up to date to get the commit. git_pull() exitcode = subprocess.call(['git', 'checkout', git_hash]) if exitcode != 0: return None return utils.get_HEAD_sha1()
def run_once(archive): failed = False git_hash = utils.get_HEAD_sha1() log('Running once with hash %s' % git_hash) env = os.environ.copy() # Bot does not have a lot of memory. env['R8_GRADLE_CORES_PER_FORK'] = '8' failed = any([execute(cmd, archive, env) for cmd in TEST_COMMANDS]) archive_status(1 if failed else 0) return failed
def find_min_xmx(options, args): # Args will be destroyed assert len(args) == 0 # If we can run in 128 MB then we are good (which we can for small examples # or D8 on medium sized examples) if options.find_min_xmx_min_memory: not_working = options.find_min_xmx_min_memory elif options.compiler == 'd8': not_working = 128 else: not_working = 1024 if options.find_min_xmx_max_memory: working = options.find_min_xmx_max_memory else: working = 1024 * 8 exit_code = 0 range = int(options.find_min_xmx_range_size) while working - not_working > range: next_candidate = int(working - ((working - not_working) / 2)) print('working: %s, non_working: %s, next_candidate: %s' % (working, not_working, next_candidate)) extra_args = ['-Xmx%sM' % next_candidate] t0 = time.time() exit_code = run_with_options(options, [], extra_args) t1 = time.time() print('Running took: %s ms' % (1000.0 * (t1 - t0))) if exit_code != 0: if exit_code not in [OOM_EXIT_CODE, TIMEOUT_KILL_CODE]: print('Non OOM/Timeout error executing, exiting') return 2 if exit_code == 0: working = next_candidate elif exit_code == TIMEOUT_KILL_CODE: print('Timeout. Continue to the next candidate.') not_working = next_candidate else: assert exit_code == OOM_EXIT_CODE not_working = next_candidate assert working - not_working <= range found_range = 'Found range: %s - %s' % (not_working, working) print(found_range) if options.find_min_xmx_archive: sha = utils.get_HEAD_sha1() (version, _) = get_version_and_data(options) destination = os.path.join(utils.R8_TEST_RESULTS_BUCKET, FIND_MIN_XMX_DIR, sha, options.compiler, options.compiler_build, options.app, version, get_type(options)) gs_destination = 'gs://%s' % destination utils.archive_value(FIND_MIN_XMX_FILE, gs_destination, found_range + '\n') return 0
def archive_log(stdout, stderr, exitcode, timed_out, cmd): sha = utils.get_HEAD_sha1() cmd_dir = cmd.replace(' ', '_').replace('/', '_') destination = os.path.join(get_sha_destination(sha), cmd_dir) gs_destination = 'gs://%s' % destination url = 'https://storage.cloud.google.com/%s' % destination log('Archiving logs to: %s' % gs_destination) archive_value(EXITCODE, gs_destination, exitcode) archive_value(TIMED_OUT, gs_destination, timed_out) archive_file(STDOUT, gs_destination, stdout) archive_file(STDERR, gs_destination, stderr) log('Logs available at: %s' % url)
def run_once(archive): failed = False git_hash = utils.get_HEAD_sha1() log('Running once with hash %s' % git_hash) env = os.environ.copy() # Bot does not have a lot of memory. env['R8_GRADLE_CORES_PER_FORK'] = '16' failed = any([execute(cmd, archive, env) for cmd in TEST_COMMANDS]) # Gradle daemon occasionally leaks memory, stop it. gradle.RunGradle('--stop') archive_status(1 if failed else 0) return failed
def ParseOptions(argv): result = optparse.OptionParser() result.add_option('--compiler', help='The compiler to use', default='d8', choices=COMPILERS) result.add_option('--app', help='What app to run on', default='gmail', choices=APPS) result.add_option('--top', default=utils.get_HEAD_sha1(), help='The most recent commit to test') result.add_option('--bottom', help='The oldest commit to test') result.add_option('--output', default='build', help='Directory where to output results') return result.parse_args(argv)
def enumerate_git_commits(options): top = options.top if options.top else utils.get_HEAD_sha1() # TODO(ricow): if not set, search back 1000 if not options.bottom: raise Exception('No bottom specified') bottom = options.bottom output = subprocess.check_output( ['git', 'rev-list', '--first-parent', top]) found_bottom = False commits = [] for c in output.splitlines(): commits.append(git_commit_from_hash(c.strip())) if c.strip() == bottom: found_bottom = True break if not found_bottom: raise Exception('Bottom not found, did you not use a merge commit') return commits
def run_once(archive): failed = False git_hash = utils.get_HEAD_sha1() log('Running once with hash %s' % git_hash) # Run test.py internal testing. cmd = ['tools/test.py', '--only_internal'] env = os.environ.copy() # Bot does not have a lot of memory. env['R8_GRADLE_CORES_PER_FORK'] = '8' if execute(cmd, archive, env): failed = True # Ensure that all internal apps compile. cmd = [ 'tools/run_on_app.py', '--ignore-java-version', '--run-all', '--out=out' ] if execute(cmd, archive): failed = True archive_status(1 if failed else 0) return failed
def Main(): (options, args) = ParseOptions() if utils.is_bot(): print "Result of 'java -version':" print subprocess.check_output(['java', '-version']) gradle.RunGradle(['clean']) gradle_args = ['--stacktrace'] # Set all necessary Gradle properties and options first. if options.verbose: gradle_args.append('-Pprint_test_stdout') if options.no_internal: gradle_args.append('-Pno_internal') if options.only_internal: gradle_args.append('-Ponly_internal') if options.all_tests: gradle_args.append('-Pall_tests') if options.tool: gradle_args.append('-Ptool=%s' % options.tool) if options.one_line_per_test: gradle_args.append('-Pone_line_per_test') if options.jctf: gradle_args.append('-Pjctf') if options.only_jctf: gradle_args.append('-Ponly_jctf') if options.jctf_compile_only: gradle_args.append('-Pjctf_compile_only') if options.aosp_jar: gradle_args.append('-Paosp_jar') if options.disable_assertions: gradle_args.append('-Pdisable_assertions') if options.with_code_coverage: gradle_args.append('-Pwith_code_coverage') if os.name == 'nt': # temporary hack gradle_args.append('-Pno_internal') gradle_args.append('-x') gradle_args.append('createJctfTests') gradle_args.append('-x') gradle_args.append('jctfCommonJar') gradle_args.append('-x') gradle_args.append('jctfTestsClasses') if options.test_dir: gradle_args.append('-Ptest_dir=' + options.test_dir) if not os.path.exists(options.test_dir): os.makedirs(options.test_dir) if options.java_home: gradle_args.append('-Dorg.gradle.java.home=' + options.java_home) if options.generate_golden_files_to: gradle_args.append('-Pgenerate_golden_files_to=' + options.generate_golden_files_to) if not os.path.exists(options.generate_golden_files_to): os.makedirs(options.generate_golden_files_to) gradle_args.append('-PHEAD_sha1=' + utils.get_HEAD_sha1()) if options.use_golden_files_in: gradle_args.append('-Puse_golden_files_in=' + options.use_golden_files_in) if not os.path.exists(options.use_golden_files_in): os.makedirs(options.use_golden_files_in) gradle_args.append('-PHEAD_sha1=' + utils.get_HEAD_sha1()) if (not options.no_r8lib) and options.r8lib_no_deps: print( 'Cannot run tests on r8lib with and without deps. R8lib is now default target.' ) exit(1) if not options.no_r8lib: gradle_args.append('-Pr8lib') # Force gradle to build a version of r8lib without dependencies for # BootstrapCurrentEqualityTest. gradle_args.append('R8LibNoDeps') if options.r8lib_no_deps: gradle_args.append('-Pr8lib_no_deps') # Build an R8 with dependencies for bootstrapping tests before adding test sources. gradle_args.append('r8WithRelocatedDeps') # Add Gradle tasks gradle_args.append('cleanTest') gradle_args.append('test') # Test filtering. Must always follow the 'test' task. for testFilter in args: gradle_args.append('--tests') gradle_args.append(testFilter) if options.with_code_coverage: # Create Jacoco report after tests. gradle_args.append('jacocoTestReport') if options.use_golden_files_in: sha1 = '%s' % utils.get_HEAD_sha1() with utils.ChangedWorkingDirectory(options.use_golden_files_in): utils.download_file_from_cloud_storage( 'gs://r8-test-results/golden-files/%s.tar.gz' % sha1, '%s.tar.gz' % sha1) utils.unpack_archive('%s.tar.gz' % sha1) if utils.is_bot() and not utils.IsWindows(): timestamp_file = os.path.join(utils.BUILD, 'last_test_time') if os.path.exists(timestamp_file): os.remove(timestamp_file) gradle_args.append('-Pupdate_test_timestamp=' + timestamp_file) thread.start_new_thread(timeout_handler, (timestamp_file, )) # Now run tests on selected runtime(s). vms_to_test = [options.dex_vm] if options.dex_vm != "all" else ALL_ART_VMS for art_vm in vms_to_test: vm_kind_to_test = "_" + options.dex_vm_kind if art_vm != "default" else "" return_code = gradle.RunGradle( gradle_args + ['-Pdex_vm=%s' % (art_vm + vm_kind_to_test)], throw_on_failure=False) if options.generate_golden_files_to: sha1 = '%s' % utils.get_HEAD_sha1() with utils.ChangedWorkingDirectory( options.generate_golden_files_to): archive = utils.create_archive(sha1) utils.upload_file_to_cloud_storage( archive, 'gs://r8-test-results/golden-files/' + archive) if return_code != 0: if options.archive_failures and os.name != 'nt': archive_failures() return return_code return 0
def Main(): (options, args) = ParseOptions() if 'BUILDBOT_BUILDERNAME' in os.environ: gradle.RunGradle(['clean']) # Build R8lib with dependencies for bootstrapping tests before adding test sources gradle.RunGradle(['r8libwithdeps']) gradle_args = ['--stacktrace'] # Set all necessary Gradle properties and options first. if options.verbose: gradle_args.append('-Pprint_test_stdout') if options.no_internal: gradle_args.append('-Pno_internal') if options.only_internal: gradle_args.append('-Ponly_internal') if options.all_tests: gradle_args.append('-Pall_tests') if options.tool: gradle_args.append('-Ptool=%s' % options.tool) if options.one_line_per_test: gradle_args.append('-Pone_line_per_test') if options.jctf: gradle_args.append('-Pjctf') if options.only_jctf: gradle_args.append('-Ponly_jctf') if options.jctf_compile_only: gradle_args.append('-Pjctf_compile_only') if options.aosp_jar: gradle_args.append('-Paosp_jar') if options.disable_assertions: gradle_args.append('-Pdisable_assertions') if options.with_code_coverage: gradle_args.append('-Pwith_code_coverage') if os.name == 'nt': # temporary hack gradle_args.append('-Pno_internal') gradle_args.append('-x') gradle_args.append('createJctfTests') gradle_args.append('-x') gradle_args.append('jctfCommonJar') gradle_args.append('-x') gradle_args.append('jctfTestsClasses') if options.test_dir: gradle_args.append('-Ptest_dir=' + options.test_dir) if not os.path.exists(options.test_dir): os.makedirs(options.test_dir) if options.java_home: gradle_args.append('-Dorg.gradle.java.home=' + options.java_home) if options.generate_golden_files_to: gradle_args.append('-Pgenerate_golden_files_to=' + options.generate_golden_files_to) if not os.path.exists(options.generate_golden_files_to): os.makedirs(options.generate_golden_files_to) gradle_args.append('-PHEAD_sha1=' + utils.get_HEAD_sha1()) if options.use_golden_files_in: gradle_args.append('-Puse_golden_files_in=' + options.use_golden_files_in) if not os.path.exists(options.use_golden_files_in): os.makedirs(options.use_golden_files_in) gradle_args.append('-PHEAD_sha1=' + utils.get_HEAD_sha1()) # Add Gradle tasks gradle_args.append('cleanTest') gradle_args.append('test') # Test filtering. Must always follow the 'test' task. for testFilter in args: gradle_args.append('--tests') gradle_args.append(testFilter) if options.with_code_coverage: # Create Jacoco report after tests. gradle_args.append('jacocoTestReport') if options.use_golden_files_in: sha1 = '%s' % utils.get_HEAD_sha1() with utils.ChangedWorkingDirectory(options.use_golden_files_in): utils.download_file_from_cloud_storage( 'gs://r8-test-results/golden-files/%s.tar.gz' % sha1, '%s.tar.gz' % sha1) utils.unpack_archive('%s.tar.gz' % sha1) # Now run tests on selected runtime(s). vms_to_test = [options.dex_vm] if options.dex_vm != "all" else ALL_ART_VMS for art_vm in vms_to_test: vm_kind_to_test = "_" + options.dex_vm_kind if art_vm != "default" else "" return_code = gradle.RunGradle( gradle_args + ['-Pdex_vm=%s' % (art_vm + vm_kind_to_test)], throw_on_failure=False) if options.generate_golden_files_to: sha1 = '%s' % utils.get_HEAD_sha1() with utils.ChangedWorkingDirectory( options.generate_golden_files_to): archive = utils.create_archive(sha1) utils.upload_file_to_cloud_storage( archive, 'gs://r8-test-results/golden-files/' + archive) if return_code != 0: if options.archive_failures and os.name != 'nt': archive_failures() return return_code return 0
def archive_status(failed): gs_destination = 'gs://%s' % get_sha_destination(utils.get_HEAD_sha1()) archive_value('status', gs_destination, failed)
def git_checkout(git_hash): ensure_git_clean() # Ensure that we are up to date to get the commit. git_pull() subprocess.check_call(['git', 'checkout', git_hash]) return utils.get_HEAD_sha1()
def git_pull(): ensure_git_clean() subprocess.check_call(['git', 'checkout', 'master']) subprocess.check_call(['git', 'pull']) return utils.get_HEAD_sha1()
def Main(): (options, args) = ParseOptions() if utils.is_bot(): gradle.RunGradle(['--no-daemon', 'clean']) gradle_args = ['--stacktrace'] if utils.is_bot(): # Bots don't like dangling processes gradle_args.append('--no-daemon') # Set all necessary Gradle properties and options first. if options.shard_count: assert options.shard_number gradle_args.append('-Pshard_count=%s' % options.shard_count) gradle_args.append('-Pshard_number=%s' % options.shard_number) if options.verbose: gradle_args.append('-Pprint_test_stdout') if options.no_internal: gradle_args.append('-Pno_internal') if options.only_internal: gradle_args.append('-Ponly_internal') if options.all_tests: gradle_args.append('-Pall_tests') if options.tool: gradle_args.append('-Ptool=%s' % options.tool) if options.one_line_per_test: gradle_args.append('-Pone_line_per_test') if options.jctf: gradle_args.append('-Pjctf') if options.only_jctf: gradle_args.append('-Ponly_jctf') if options.jctf_compile_only: gradle_args.append('-Pjctf_compile_only') if options.disable_assertions: gradle_args.append('-Pdisable_assertions') if options.with_code_coverage: gradle_args.append('-Pwith_code_coverage') if os.name == 'nt': # temporary hack gradle_args.append('-Pno_internal') gradle_args.append('-x') gradle_args.append('createJctfTests') gradle_args.append('-x') gradle_args.append('jctfCommonJar') gradle_args.append('-x') gradle_args.append('jctfTestsClasses') if options.test_dir: gradle_args.append('-Ptest_dir=' + options.test_dir) if not os.path.exists(options.test_dir): os.makedirs(options.test_dir) if options.java_home: gradle_args.append('-Dorg.gradle.java.home=' + options.java_home) if options.java_max_memory_size: gradle_args.append('-Dorg.gradle.jvmargs=-Xmx' + options.java_max_memory_size) if options.generate_golden_files_to: gradle_args.append('-Pgenerate_golden_files_to=' + options.generate_golden_files_to) if not os.path.exists(options.generate_golden_files_to): os.makedirs(options.generate_golden_files_to) gradle_args.append('-PHEAD_sha1=' + utils.get_HEAD_sha1()) if options.use_golden_files_in: gradle_args.append('-Puse_golden_files_in=' + options.use_golden_files_in) if not os.path.exists(options.use_golden_files_in): os.makedirs(options.use_golden_files_in) gradle_args.append('-PHEAD_sha1=' + utils.get_HEAD_sha1()) if options.alternative_frontend: gradle_args.append('-Palternative_frontend') if (not options.no_r8lib) and options.r8lib_no_deps: print( 'Cannot run tests on r8lib with and without deps. R8lib is now default target.' ) exit(1) if not options.no_r8lib: gradle_args.append('-Pr8lib') # Force gradle to build a version of r8lib without dependencies for # BootstrapCurrentEqualityTest. gradle_args.append('R8LibNoDeps') if options.r8lib_no_deps: gradle_args.append('-Pr8lib_no_deps') # Build an R8 with dependencies for bootstrapping tests before adding test sources. gradle_args.append('r8WithRelocatedDeps') gradle_args.append('r8WithRelocatedDeps11') # Add Gradle tasks gradle_args.append('cleanTest') gradle_args.append('test') if options.fail_fast: gradle_args.append('--fail-fast') if options.failed: args = compute_failed_tests(args) if args is None: return 1 if len(args) == 0: print "No failing tests" return 0 # Test filtering. Must always follow the 'test' task. for testFilter in args: gradle_args.append('--tests') gradle_args.append(testFilter) if options.with_code_coverage: # Create Jacoco report after tests. gradle_args.append('jacocoTestReport') if options.use_golden_files_in: sha1 = '%s' % utils.get_HEAD_sha1() with utils.ChangedWorkingDirectory(options.use_golden_files_in): utils.download_file_from_cloud_storage( 'gs://r8-test-results/golden-files/%s.tar.gz' % sha1, '%s.tar.gz' % sha1) utils.unpack_archive('%s.tar.gz' % sha1) if utils.is_bot() and not utils.IsWindows(): timestamp_file = os.path.join(utils.BUILD, 'last_test_time') if os.path.exists(timestamp_file): os.remove(timestamp_file) gradle_args.append('-Pupdate_test_timestamp=' + timestamp_file) thread.start_new_thread(timeout_handler, (timestamp_file, )) rotate_test_reports() if options.only_jctf: # Note: not setting -Pruntimes will run with all available runtimes. return_code = gradle.RunGradle(gradle_args, throw_on_failure=False) return archive_and_return(return_code, options) # Now run tests on selected runtime(s). vms_to_test = [options.dex_vm] if options.dex_vm != "all" else ALL_ART_VMS for art_vm in vms_to_test: vm_suffix = "_" + options.dex_vm_kind if art_vm != "default" else "" runtimes = ['dex-' + art_vm] # Only append the "none" runtime and JVMs if running on the "default" DEX VM. if art_vm == "default": runtimes.extend(['jdk8', 'jdk9', 'jdk11', 'none']) return_code = gradle.RunGradle(gradle_args + [ '-Pdex_vm=%s' % art_vm + vm_suffix, '-Pruntimes=%s' % ':'.join(runtimes), ], throw_on_failure=False) if options.generate_golden_files_to: sha1 = '%s' % utils.get_HEAD_sha1() with utils.ChangedWorkingDirectory( options.generate_golden_files_to): archive = utils.create_archive(sha1) utils.upload_file_to_cloud_storage( archive, 'gs://r8-test-results/golden-files/' + archive) if return_code != 0: return archive_and_return(return_code, options) return 0
def top_or_default(top=None): return top if top else utils.get_HEAD_sha1()
def Main(): (options, args) = ParseOptions() if utils.is_bot(): gradle.RunGradle(['--no-daemon', 'clean']) gradle_args = ['--stacktrace'] if utils.is_bot(): # Bots don't like dangling processes. gradle_args.append('--no-daemon') # Set all necessary Gradle properties and options first. if options.shard_count: assert options.shard_number gradle_args.append('-Pshard_count=%s' % options.shard_count) gradle_args.append('-Pshard_number=%s' % options.shard_number) if options.verbose: gradle_args.append('-Pprint_test_stdout') if options.no_internal: gradle_args.append('-Pno_internal') if options.only_internal: gradle_args.append('-Ponly_internal') if options.all_tests: gradle_args.append('-Pall_tests') if options.slow_tests: gradle_args.append('-Pslow_tests=1') if options.tool: gradle_args.append('-Ptool=%s' % options.tool) if options.one_line_per_test: gradle_args.append('-Pone_line_per_test') if options.jctf: gradle_args.append('-Pjctf') if options.only_jctf: gradle_args.append('-Ponly_jctf') if options.test_namespace: gradle_args.append('-Ptest_namespace=%s' % options.test_namespace) if options.jctf_compile_only: gradle_args.append('-Pjctf_compile_only') if options.disable_assertions: gradle_args.append('-Pdisable_assertions') if options.with_code_coverage: gradle_args.append('-Pwith_code_coverage') if os.name == 'nt': # temporary hack gradle_args.append('-Pno_internal') gradle_args.append('-x') gradle_args.append('createJctfTests') gradle_args.append('-x') gradle_args.append('jctfCommonJar') gradle_args.append('-x') gradle_args.append('jctfTestsClasses') if options.test_dir: gradle_args.append('-Ptest_dir=' + options.test_dir) if not os.path.exists(options.test_dir): os.makedirs(options.test_dir) if options.java_home: gradle_args.append('-Dorg.gradle.java.home=' + options.java_home) if options.java_max_memory_size: gradle_args.append('-Ptest_xmx=' + options.java_max_memory_size) if options.generate_golden_files_to: gradle_args.append('-Pgenerate_golden_files_to=' + options.generate_golden_files_to) if not os.path.exists(options.generate_golden_files_to): os.makedirs(options.generate_golden_files_to) gradle_args.append('-PHEAD_sha1=' + utils.get_HEAD_sha1()) if options.use_golden_files_in: gradle_args.append('-Puse_golden_files_in=' + options.use_golden_files_in) if not os.path.exists(options.use_golden_files_in): os.makedirs(options.use_golden_files_in) gradle_args.append('-PHEAD_sha1=' + utils.get_HEAD_sha1()) if (not options.no_r8lib) and options.r8lib_no_deps: print( 'Cannot run tests on r8lib with and without deps. R8lib is now default target.' ) exit(1) if not options.no_r8lib: gradle_args.append('-Pr8lib') # Force gradle to build a version of r8lib without dependencies for # BootstrapCurrentEqualityTest. gradle_args.append('R8LibNoDeps') if options.r8lib_no_deps: gradle_args.append('-Pr8lib_no_deps') if options.worktree: gradle_args.append('-g=' + os.path.join(utils.REPO_ROOT, ".gradle_user_home")) gradle_args.append('--no-daemon') # Build an R8 with dependencies for bootstrapping tests before adding test sources. gradle_args.append('r8WithDeps') gradle_args.append('r8WithDeps11') gradle_args.append('r8WithRelocatedDeps') gradle_args.append('r8WithRelocatedDeps11') # Add Gradle tasks gradle_args.append('cleanTest') gradle_args.append('test') if options.fail_fast: gradle_args.append('--fail-fast') if options.failed: args = compute_failed_tests(args) if args is None: return 1 if len(args) == 0: print "No failing tests" return 0 # Test filtering. Must always follow the 'test' task. for testFilter in args: gradle_args.append('--tests') gradle_args.append(testFilter) if options.with_code_coverage: # Create Jacoco report after tests. gradle_args.append('jacocoTestReport') if options.use_golden_files_in: sha1 = '%s' % utils.get_HEAD_sha1() with utils.ChangedWorkingDirectory(options.use_golden_files_in): utils.download_file_from_cloud_storage( 'gs://r8-test-results/golden-files/%s.tar.gz' % sha1, '%s.tar.gz' % sha1) utils.unpack_archive('%s.tar.gz' % sha1) print_stacks_timeout = options.print_hanging_stacks if (utils.is_bot() and not utils.IsWindows()) or print_stacks_timeout > -1: timestamp_file = os.path.join(utils.BUILD, 'last_test_time') if os.path.exists(timestamp_file): os.remove(timestamp_file) gradle_args.append('-Pupdate_test_timestamp=' + timestamp_file) print_stacks_timeout = (print_stacks_timeout if print_stacks_timeout != -1 else TIMEOUT_HANDLER_PERIOD) thread.start_new_thread(timeout_handler, ( timestamp_file, print_stacks_timeout, )) rotate_test_reports() if options.only_jctf: # Note: not setting -Pruntimes will run with all available runtimes. return_code = gradle.RunGradle(gradle_args, throw_on_failure=False) return archive_and_return(return_code, options) if options.horizontal_class_merging: gradle_args.append('-PhorizontalClassMerging') # Now run tests on selected runtime(s). if options.runtimes: if options.dex_vm != 'default': print 'Unexpected runtimes and dex_vm argument: ' + options.dex_vm sys.exit(1) if options.runtimes == 'empty': # Set runtimes with no content will configure no runtimes. gradle_args.append('-Pruntimes=') elif options.runtimes == 'all': # An unset runtimes will configure all runtimes pass else: prefixes = [ prefix.strip() for prefix in options.runtimes.split(':') ] runtimes = [] for prefix in prefixes: matches = [ rt for rt in VALID_RUNTIMES if rt.startswith(prefix) ] if len(matches) == 0: print "Invalid runtime prefix '%s'." % prefix print "Must be just 'all', 'empty'," \ " or a prefix of %s" % ', '.join(VALID_RUNTIMES) sys.exit(1) runtimes.extend(matches) gradle_args.append('-Pruntimes=%s' % ':'.join(runtimes)) return_code = gradle.RunGradle(gradle_args, throw_on_failure=False) return archive_and_return(return_code, options) # Legacy testing populates the runtimes based on dex_vm. vms_to_test = [options.dex_vm] if options.dex_vm != "all" else ALL_ART_VMS for art_vm in vms_to_test: vm_suffix = "_" + options.dex_vm_kind if art_vm != "default" else "" runtimes = ['dex-' + art_vm] # Only append the "none" runtime and JVMs if running on the "default" DEX VM. if art_vm == "default": # TODO(b/170454076): Remove special casing for bot when rex-script has # been migrated to account for runtimes. if utils.is_bot(): runtimes.extend(['jdk11', 'none']) else: runtimes.extend(['jdk8', 'jdk9', 'jdk11', 'none']) return_code = gradle.RunGradle(gradle_args + [ '-Pdex_vm=%s' % art_vm + vm_suffix, '-Pruntimes=%s' % ':'.join(runtimes), ], throw_on_failure=False) if options.generate_golden_files_to: sha1 = '%s' % utils.get_HEAD_sha1() with utils.ChangedWorkingDirectory( options.generate_golden_files_to): archive = utils.create_archive(sha1) utils.upload_file_to_cloud_storage( archive, 'gs://r8-test-results/golden-files/' + archive) if return_code != 0: return archive_and_return(return_code, options) return 0