Ian Zerny | dcb172e | 2022-02-22 15:36:45 +0100 | [diff] [blame] | 1 | #!/usr/bin/env python3 |
Mads Ager | 418d1ca | 2017-05-22 09:35:49 +0200 | [diff] [blame] | 2 | # Copyright (c) 2017, the R8 project authors. Please see the AUTHORS file |
| 3 | # for details. All rights reserved. Use of this source code is governed by a |
| 4 | # BSD-style license that can be found in the LICENSE file. |
| 5 | |
| 6 | import os |
| 7 | import subprocess |
| 8 | import sys |
| 9 | import utils |
| 10 | |
| 11 | DEFAULT_TEST = 'org.apache.harmony.jpda.tests.share.AllTests' |
| 12 | |
| 13 | TEST_RUNNER = 'org.junit.runner.JUnitCore' |
| 14 | TEST_PACKAGE = 'org.apache.harmony.jpda.tests.jdwp' |
| 15 | |
| 16 | VERSIONS = [ |
Christoffer Quist Adamsen | 2434a4d | 2023-10-16 11:29:03 +0200 | [diff] [blame] | 17 | 'default', '10.0.0', '9.0.0', '8.1.0', '7.0.0', '6.0.1', '5.1.1', '4.4.4' |
Mads Ager | 418d1ca | 2017-05-22 09:35:49 +0200 | [diff] [blame] | 18 | ] |
| 19 | |
Christoffer Quist Adamsen | 2434a4d | 2023-10-16 11:29:03 +0200 | [diff] [blame] | 20 | JUNIT_HOSTDEX = os.path.join(utils.REPO_ROOT, 'third_party', 'jdwp-tests', |
| 21 | 'junit-hostdex.jar') |
Mads Ager | 418d1ca | 2017-05-22 09:35:49 +0200 | [diff] [blame] | 22 | |
Christoffer Quist Adamsen | 2434a4d | 2023-10-16 11:29:03 +0200 | [diff] [blame] | 23 | JDWP_TESTS_HOSTDEX = os.path.join(utils.REPO_ROOT, 'third_party', 'jdwp-tests', |
| 24 | 'apache-harmony-jdwp-tests-hostdex.jar') |
Mads Ager | 418d1ca | 2017-05-22 09:35:49 +0200 | [diff] [blame] | 25 | |
Christoffer Quist Adamsen | 2434a4d | 2023-10-16 11:29:03 +0200 | [diff] [blame] | 26 | IMAGE = '/system/non/existent/jdwp/image.art' |
Mads Ager | 418d1ca | 2017-05-22 09:35:49 +0200 | [diff] [blame] | 27 | |
| 28 | # Timeout in ms |
Ian Zerny | 7aa0023 | 2024-02-27 14:46:05 +0100 | [diff] [blame] | 29 | TIMEOUT = 20000 |
Mads Ager | 418d1ca | 2017-05-22 09:35:49 +0200 | [diff] [blame] | 30 | |
| 31 | DEBUGGER_EXTRA_FLAGS = [ |
Christoffer Quist Adamsen | 2434a4d | 2023-10-16 11:29:03 +0200 | [diff] [blame] | 32 | '-Xjnigreflimit:2000', '-Duser.language=en', '-Duser.region=US', |
| 33 | '-Djpda.settings.verbose=true', |
| 34 | '-Djpda.settings.transportAddress=127.0.0.1:55107', |
| 35 | '-Djpda.settings.timeout=%d' % TIMEOUT, |
| 36 | '-Djpda.settings.waitingTime=%d' % TIMEOUT |
Mads Ager | 418d1ca | 2017-05-22 09:35:49 +0200 | [diff] [blame] | 37 | ] |
| 38 | |
Christoffer Quist Adamsen | 2434a4d | 2023-10-16 11:29:03 +0200 | [diff] [blame] | 39 | DEBUGGEE_EXTRA_FLAGS = [] |
| 40 | |
Mads Ager | 418d1ca | 2017-05-22 09:35:49 +0200 | [diff] [blame] | 41 | |
| 42 | def get_art_dir(version): |
Christoffer Quist Adamsen | 2434a4d | 2023-10-16 11:29:03 +0200 | [diff] [blame] | 43 | if version == '4.4.4': |
| 44 | art_dir = 'dalvik' |
| 45 | else: |
| 46 | art_dir = version == 'default' and 'art' or 'art-%s' % version |
| 47 | return os.path.join(utils.REPO_ROOT, 'tools', 'linux', art_dir) |
| 48 | |
Mads Ager | 418d1ca | 2017-05-22 09:35:49 +0200 | [diff] [blame] | 49 | |
| 50 | def get_lib_dir(version): |
Christoffer Quist Adamsen | 2434a4d | 2023-10-16 11:29:03 +0200 | [diff] [blame] | 51 | return os.path.join(get_art_dir(version), 'lib') |
| 52 | |
Mads Ager | 418d1ca | 2017-05-22 09:35:49 +0200 | [diff] [blame] | 53 | |
| 54 | def get_fw_dir(version): |
Christoffer Quist Adamsen | 2434a4d | 2023-10-16 11:29:03 +0200 | [diff] [blame] | 55 | return os.path.join(get_art_dir(version), 'framework') |
| 56 | |
Mads Ager | 418d1ca | 2017-05-22 09:35:49 +0200 | [diff] [blame] | 57 | |
| 58 | def get_vm(version): |
Christoffer Quist Adamsen | 2434a4d | 2023-10-16 11:29:03 +0200 | [diff] [blame] | 59 | return os.path.join(get_art_dir(version), 'bin', 'dalvikvm') |
| 60 | |
Mads Ager | 418d1ca | 2017-05-22 09:35:49 +0200 | [diff] [blame] | 61 | |
| 62 | def setup_environment(version): |
Christoffer Quist Adamsen | 2434a4d | 2023-10-16 11:29:03 +0200 | [diff] [blame] | 63 | art_dir = get_art_dir(version) |
| 64 | lib_dir = get_lib_dir(version) |
| 65 | android_data = os.path.join(utils.REPO_ROOT, 'build', 'tmp', version) |
| 66 | if not os.path.isdir(android_data): |
| 67 | os.makedirs(android_data) |
| 68 | if version == '4.4.4': |
| 69 | # Dalvik expects that the dalvik-cache dir already exists. |
| 70 | dalvik_cache_dir = os.path.join(android_data, 'dalvik-cache') |
| 71 | if not os.path.isdir(dalvik_cache_dir): |
| 72 | os.makedirs(dalvik_cache_dir) |
| 73 | os.environ['ANDROID_DATA'] = android_data |
| 74 | os.environ['ANDROID_ROOT'] = art_dir |
| 75 | os.environ['LD_LIBRARY_PATH'] = lib_dir |
| 76 | os.environ['DYLD_LIBRARY_PATH'] = lib_dir |
| 77 | os.environ['LD_USE_LOAD_BIAS'] = '1' |
| 78 | |
Mads Ager | 418d1ca | 2017-05-22 09:35:49 +0200 | [diff] [blame] | 79 | |
| 80 | def get_boot_libs(version): |
Christoffer Quist Adamsen | 2434a4d | 2023-10-16 11:29:03 +0200 | [diff] [blame] | 81 | boot_libs = [] |
| 82 | if version == '4.4.4': |
| 83 | # Dalvik |
| 84 | boot_libs.extend(['core-hostdex.jar']) |
| 85 | else: |
| 86 | # ART |
| 87 | boot_libs.extend(['core-libart-hostdex.jar']) |
| 88 | if version != '5.1.1' and version != '6.0.1': |
| 89 | boot_libs.extend(['core-oj-hostdex.jar']) |
| 90 | boot_libs.extend(['apache-xml-hostdex.jar']) |
| 91 | return [os.path.join(get_fw_dir(version), lib) for lib in boot_libs] |
| 92 | |
Mads Ager | 418d1ca | 2017-05-22 09:35:49 +0200 | [diff] [blame] | 93 | |
| 94 | def get_common_flags(version): |
Christoffer Quist Adamsen | 2434a4d | 2023-10-16 11:29:03 +0200 | [diff] [blame] | 95 | flags = [] |
| 96 | flags.extend(['-Xbootclasspath:%s' % ':'.join(get_boot_libs(version))]) |
| 97 | if version != '4.4.4': |
| 98 | flags.extend(['-Ximage:%s' % IMAGE]) |
| 99 | if version != '5.1.1': |
| 100 | flags.extend(['-Xcompiler-option', '--debuggable']) |
| 101 | if version == '9.0.0' or version == '10.0.0': |
| 102 | flags.extend(['-XjdwpProvider:internal']) |
| 103 | return flags |
| 104 | |
Mads Ager | 418d1ca | 2017-05-22 09:35:49 +0200 | [diff] [blame] | 105 | |
| 106 | def get_debuggee_flags(version): |
Christoffer Quist Adamsen | 2434a4d | 2023-10-16 11:29:03 +0200 | [diff] [blame] | 107 | return get_common_flags(version) + DEBUGGEE_EXTRA_FLAGS |
| 108 | |
Mads Ager | 418d1ca | 2017-05-22 09:35:49 +0200 | [diff] [blame] | 109 | |
| 110 | def get_debugger_flags(version): |
Christoffer Quist Adamsen | 2434a4d | 2023-10-16 11:29:03 +0200 | [diff] [blame] | 111 | return get_common_flags(version) + DEBUGGER_EXTRA_FLAGS |
| 112 | |
Mads Ager | 418d1ca | 2017-05-22 09:35:49 +0200 | [diff] [blame] | 113 | |
| 114 | def runDebuggee(version, args): |
Christoffer Quist Adamsen | 2434a4d | 2023-10-16 11:29:03 +0200 | [diff] [blame] | 115 | art_dir = get_art_dir(version) |
| 116 | lib_dir = get_lib_dir(version) |
| 117 | fw_dir = get_fw_dir(version) |
| 118 | cmd = [get_vm(version)] |
| 119 | cmd.extend(get_debuggee_flags(version)) |
| 120 | cmd.extend(args) |
| 121 | setup_environment(version) |
| 122 | print("Running debuggee as: %s" % cmd) |
| 123 | return subprocess.check_call(cmd) |
| 124 | |
Mads Ager | 418d1ca | 2017-05-22 09:35:49 +0200 | [diff] [blame] | 125 | |
| 126 | def runDebugger(version, classpath, args): |
Christoffer Quist Adamsen | 2434a4d | 2023-10-16 11:29:03 +0200 | [diff] [blame] | 127 | art_dir = get_art_dir(version) |
| 128 | lib_dir = get_lib_dir(version) |
| 129 | fw_dir = get_fw_dir(version) |
| 130 | dalvikvm = os.path.join(art_dir, 'bin', 'dalvikvm') |
| 131 | cmd = [dalvikvm] |
| 132 | cmd.extend(['-classpath', '%s:%s' % (classpath, JUNIT_HOSTDEX)]) |
| 133 | cmd.extend(get_debugger_flags(version)) |
| 134 | cmd.append('-Djpda.settings.debuggeeJavaPath=%s %s' %\ |
| 135 | (dalvikvm, ' '.join(get_debuggee_flags(version)))) |
| 136 | cmd.extend(args) |
| 137 | setup_environment(version) |
| 138 | print("Running debugger as: " % cmd) |
| 139 | return subprocess.check_call(cmd) |
| 140 | |
Mads Ager | 418d1ca | 2017-05-22 09:35:49 +0200 | [diff] [blame] | 141 | |
| 142 | def usage(): |
Christoffer Quist Adamsen | 2434a4d | 2023-10-16 11:29:03 +0200 | [diff] [blame] | 143 | print( |
| 144 | "Usage: %s [--debuggee] [--version=<version>] [--classpath=<classpath>] <args>" |
| 145 | % (sys.argv[0])) |
| 146 | print("where <version> is one of:", ', '.join(VERSIONS)) |
| 147 | print(" and <classpath> is optional classpath (default: %s)" % |
| 148 | JDWP_TESTS_HOSTDEX) |
| 149 | print(" and <args> will be passed on as arguments to the art runtime.") |
| 150 | |
Mads Ager | 418d1ca | 2017-05-22 09:35:49 +0200 | [diff] [blame] | 151 | |
| 152 | def main(): |
Christoffer Quist Adamsen | 2434a4d | 2023-10-16 11:29:03 +0200 | [diff] [blame] | 153 | version = 'default' |
| 154 | debuggee = False |
| 155 | args = [] |
| 156 | classpath = JDWP_TESTS_HOSTDEX |
| 157 | for arg in sys.argv[1:]: |
| 158 | if arg == '--help': |
| 159 | usage() |
| 160 | return 0 |
| 161 | elif arg.startswith('--version='): |
| 162 | version = arg[len('--version='):] |
| 163 | elif arg.startswith('--classpath='): |
| 164 | classpath = arg[len('--classpath='):] |
| 165 | else: |
| 166 | args.append(arg) |
| 167 | if version not in VERSIONS: |
| 168 | print("Invalid version %s" % version) |
| 169 | usage() |
| 170 | return 1 |
| 171 | if not debuggee and len(args) == 0: |
| 172 | args.append(DEFAULT_TEST) |
| 173 | if debuggee: |
| 174 | return runDebuggee(version, args) |
Mads Ager | 418d1ca | 2017-05-22 09:35:49 +0200 | [diff] [blame] | 175 | else: |
Christoffer Quist Adamsen | 2434a4d | 2023-10-16 11:29:03 +0200 | [diff] [blame] | 176 | if len(args) == 0: |
| 177 | args.append(DEFAULT_TEST) |
| 178 | elif len(args) == 1: |
| 179 | args = [TEST_RUNNER, args[0]] |
| 180 | return runDebugger(version, classpath, args) |
| 181 | |
Mads Ager | 418d1ca | 2017-05-22 09:35:49 +0200 | [diff] [blame] | 182 | |
| 183 | if __name__ == '__main__': |
Christoffer Quist Adamsen | 2434a4d | 2023-10-16 11:29:03 +0200 | [diff] [blame] | 184 | sys.exit(main()) |