|  | #!/usr/bin/env python3 | 
|  | # Copyright (c) 2017, the R8 project authors. Please see the AUTHORS file | 
|  | # for details. All rights reserved. Use of this source code is governed by a | 
|  | # BSD-style license that can be found in the LICENSE file. | 
|  |  | 
|  | import os | 
|  | import subprocess | 
|  | import sys | 
|  | import utils | 
|  |  | 
|  | DEFAULT_TEST = 'org.apache.harmony.jpda.tests.share.AllTests' | 
|  |  | 
|  | TEST_RUNNER = 'org.junit.runner.JUnitCore' | 
|  | TEST_PACKAGE = 'org.apache.harmony.jpda.tests.jdwp' | 
|  |  | 
|  | VERSIONS = [ | 
|  | 'default', | 
|  | '10.0.0', | 
|  | '9.0.0', | 
|  | '8.1.0', | 
|  | '7.0.0', | 
|  | '6.0.1', | 
|  | '5.1.1', | 
|  | '4.4.4' | 
|  | ] | 
|  |  | 
|  | JUNIT_HOSTDEX = os.path.join( | 
|  | utils.REPO_ROOT, | 
|  | 'third_party', 'jdwp-tests', 'junit-hostdex.jar') | 
|  |  | 
|  | JDWP_TESTS_HOSTDEX = os.path.join( | 
|  | utils.REPO_ROOT, | 
|  | 'third_party', 'jdwp-tests', 'apache-harmony-jdwp-tests-hostdex.jar') | 
|  |  | 
|  | IMAGE='/system/non/existent/jdwp/image.art' | 
|  |  | 
|  | # Timeout in ms | 
|  | TIMEOUT=10000 | 
|  |  | 
|  | DEBUGGER_EXTRA_FLAGS = [ | 
|  | '-Xjnigreflimit:2000', | 
|  | '-Duser.language=en', | 
|  | '-Duser.region=US', | 
|  | '-Djpda.settings.verbose=true', | 
|  | '-Djpda.settings.transportAddress=127.0.0.1:55107', | 
|  | '-Djpda.settings.timeout=%d' % TIMEOUT, | 
|  | '-Djpda.settings.waitingTime=%d' % TIMEOUT | 
|  | ] | 
|  |  | 
|  | DEBUGGEE_EXTRA_FLAGS = [ | 
|  | ] | 
|  |  | 
|  | def get_art_dir(version): | 
|  | if version == '4.4.4': | 
|  | art_dir = 'dalvik' | 
|  | else: | 
|  | art_dir = version == 'default' and 'art' or 'art-%s' % version | 
|  | return os.path.join(utils.REPO_ROOT, 'tools', 'linux', art_dir) | 
|  |  | 
|  | def get_lib_dir(version): | 
|  | return os.path.join(get_art_dir(version), 'lib') | 
|  |  | 
|  | def get_fw_dir(version): | 
|  | return os.path.join(get_art_dir(version), 'framework') | 
|  |  | 
|  | def get_vm(version): | 
|  | return os.path.join(get_art_dir(version), 'bin', 'dalvikvm') | 
|  |  | 
|  | def setup_environment(version): | 
|  | art_dir = get_art_dir(version) | 
|  | lib_dir = get_lib_dir(version) | 
|  | android_data = os.path.join(utils.REPO_ROOT, 'build', 'tmp', version) | 
|  | if not os.path.isdir(android_data): | 
|  | os.mkdir(android_data) | 
|  | if version == '4.4.4': | 
|  | # Dalvik expects that the dalvik-cache dir already exists. | 
|  | dalvik_cache_dir = os.path.join(android_data, 'dalvik-cache') | 
|  | if not os.path.isdir(dalvik_cache_dir): | 
|  | os.mkdir(dalvik_cache_dir) | 
|  | os.environ['ANDROID_DATA'] = android_data | 
|  | os.environ['ANDROID_ROOT'] = art_dir | 
|  | os.environ['LD_LIBRARY_PATH'] = lib_dir | 
|  | os.environ['DYLD_LIBRARY_PATH'] = lib_dir | 
|  | os.environ['LD_USE_LOAD_BIAS'] = '1' | 
|  |  | 
|  | def get_boot_libs(version): | 
|  | boot_libs = [] | 
|  | if version == '4.4.4': | 
|  | # Dalvik | 
|  | boot_libs.extend(['core-hostdex.jar']) | 
|  | else: | 
|  | # ART | 
|  | boot_libs.extend(['core-libart-hostdex.jar']) | 
|  | if version != '5.1.1' and version != '6.0.1': | 
|  | boot_libs.extend(['core-oj-hostdex.jar']) | 
|  | boot_libs.extend(['apache-xml-hostdex.jar']) | 
|  | return [os.path.join(get_fw_dir(version), lib) for lib in boot_libs] | 
|  |  | 
|  | def get_common_flags(version): | 
|  | flags = [] | 
|  | flags.extend(['-Xbootclasspath:%s' % ':'.join(get_boot_libs(version))]) | 
|  | if version != '4.4.4': | 
|  | flags.extend(['-Ximage:%s' % IMAGE]) | 
|  | if version != '5.1.1': | 
|  | flags.extend(['-Xcompiler-option', '--debuggable']) | 
|  | if version == '9.0.0' or version == '10.0.0': | 
|  | flags.extend(['-XjdwpProvider:internal']) | 
|  | return flags | 
|  |  | 
|  | def get_debuggee_flags(version): | 
|  | return get_common_flags(version) + DEBUGGEE_EXTRA_FLAGS | 
|  |  | 
|  | def get_debugger_flags(version): | 
|  | return get_common_flags(version) + DEBUGGER_EXTRA_FLAGS | 
|  |  | 
|  | def runDebuggee(version, args): | 
|  | art_dir = get_art_dir(version) | 
|  | lib_dir = get_lib_dir(version) | 
|  | fw_dir = get_fw_dir(version) | 
|  | cmd = [get_vm(version)] | 
|  | cmd.extend(get_debuggee_flags(version)) | 
|  | cmd.extend(args) | 
|  | setup_environment(version) | 
|  | print("Running debuggee as: %s" % cmd) | 
|  | return subprocess.check_call(cmd) | 
|  |  | 
|  | def runDebugger(version, classpath, args): | 
|  | art_dir = get_art_dir(version) | 
|  | lib_dir = get_lib_dir(version) | 
|  | fw_dir = get_fw_dir(version) | 
|  | dalvikvm = os.path.join(art_dir, 'bin', 'dalvikvm') | 
|  | cmd = [dalvikvm] | 
|  | cmd.extend(['-classpath', '%s:%s' % (classpath, JUNIT_HOSTDEX)]) | 
|  | cmd.extend(get_debugger_flags(version)) | 
|  | cmd.append('-Djpda.settings.debuggeeJavaPath=%s %s' %\ | 
|  | (dalvikvm, ' '.join(get_debuggee_flags(version)))) | 
|  | cmd.extend(args) | 
|  | setup_environment(version) | 
|  | print("Running debugger as: " % cmd) | 
|  | return subprocess.check_call(cmd) | 
|  |  | 
|  | def usage(): | 
|  | print("Usage: %s [--debuggee] [--version=<version>] [--classpath=<classpath>] <args>" % (sys.argv[0])) | 
|  | print("where <version> is one of:", ', '.join(VERSIONS)) | 
|  | print("  and <classpath> is optional classpath (default: %s)" % JDWP_TESTS_HOSTDEX) | 
|  | print("  and <args> will be passed on as arguments to the art runtime.") | 
|  |  | 
|  | def main(): | 
|  | version = 'default' | 
|  | debuggee = False | 
|  | args = [] | 
|  | classpath = JDWP_TESTS_HOSTDEX | 
|  | for arg in sys.argv[1:]: | 
|  | if arg == '--help': | 
|  | usage() | 
|  | return 0 | 
|  | elif arg.startswith('--version='): | 
|  | version = arg[len('--version='):] | 
|  | elif arg.startswith('--classpath='): | 
|  | classpath = arg[len('--classpath='):] | 
|  | else: | 
|  | args.append(arg) | 
|  | if version not in VERSIONS: | 
|  | print("Invalid version %s" % version) | 
|  | usage() | 
|  | return 1 | 
|  | if not debuggee and len(args) == 0: | 
|  | args.append(DEFAULT_TEST) | 
|  | if debuggee: | 
|  | return runDebuggee(version, args) | 
|  | else: | 
|  | if len(args) == 0: | 
|  | args.append(DEFAULT_TEST) | 
|  | elif len(args) == 1: | 
|  | args = [TEST_RUNNER, args[0]] | 
|  | return runDebugger(version, classpath, args) | 
|  |  | 
|  | if __name__ == '__main__': | 
|  | sys.exit(main()) |