blob: db2b82c5adea1749073529c3c95f364255981cb5 [file] [log] [blame]
Ian Zernydcb172e2022-02-22 15:36:45 +01001#!/usr/bin/env python3
Mads Ager418d1ca2017-05-22 09:35:49 +02002# 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
6import os
7import subprocess
8import sys
9import utils
10
11DEFAULT_TEST = 'org.apache.harmony.jpda.tests.share.AllTests'
12
13TEST_RUNNER = 'org.junit.runner.JUnitCore'
14TEST_PACKAGE = 'org.apache.harmony.jpda.tests.jdwp'
15
16VERSIONS = [
Christoffer Quist Adamsen2434a4d2023-10-16 11:29:03 +020017 'default', '10.0.0', '9.0.0', '8.1.0', '7.0.0', '6.0.1', '5.1.1', '4.4.4'
Mads Ager418d1ca2017-05-22 09:35:49 +020018]
19
Christoffer Quist Adamsen2434a4d2023-10-16 11:29:03 +020020JUNIT_HOSTDEX = os.path.join(utils.REPO_ROOT, 'third_party', 'jdwp-tests',
21 'junit-hostdex.jar')
Mads Ager418d1ca2017-05-22 09:35:49 +020022
Christoffer Quist Adamsen2434a4d2023-10-16 11:29:03 +020023JDWP_TESTS_HOSTDEX = os.path.join(utils.REPO_ROOT, 'third_party', 'jdwp-tests',
24 'apache-harmony-jdwp-tests-hostdex.jar')
Mads Ager418d1ca2017-05-22 09:35:49 +020025
Christoffer Quist Adamsen2434a4d2023-10-16 11:29:03 +020026IMAGE = '/system/non/existent/jdwp/image.art'
Mads Ager418d1ca2017-05-22 09:35:49 +020027
28# Timeout in ms
Ian Zerny7aa00232024-02-27 14:46:05 +010029TIMEOUT = 20000
Mads Ager418d1ca2017-05-22 09:35:49 +020030
31DEBUGGER_EXTRA_FLAGS = [
Christoffer Quist Adamsen2434a4d2023-10-16 11:29:03 +020032 '-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 Ager418d1ca2017-05-22 09:35:49 +020037]
38
Christoffer Quist Adamsen2434a4d2023-10-16 11:29:03 +020039DEBUGGEE_EXTRA_FLAGS = []
40
Mads Ager418d1ca2017-05-22 09:35:49 +020041
42def get_art_dir(version):
Christoffer Quist Adamsen2434a4d2023-10-16 11:29:03 +020043 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 Ager418d1ca2017-05-22 09:35:49 +020049
50def get_lib_dir(version):
Christoffer Quist Adamsen2434a4d2023-10-16 11:29:03 +020051 return os.path.join(get_art_dir(version), 'lib')
52
Mads Ager418d1ca2017-05-22 09:35:49 +020053
54def get_fw_dir(version):
Christoffer Quist Adamsen2434a4d2023-10-16 11:29:03 +020055 return os.path.join(get_art_dir(version), 'framework')
56
Mads Ager418d1ca2017-05-22 09:35:49 +020057
58def get_vm(version):
Christoffer Quist Adamsen2434a4d2023-10-16 11:29:03 +020059 return os.path.join(get_art_dir(version), 'bin', 'dalvikvm')
60
Mads Ager418d1ca2017-05-22 09:35:49 +020061
62def setup_environment(version):
Christoffer Quist Adamsen2434a4d2023-10-16 11:29:03 +020063 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 Ager418d1ca2017-05-22 09:35:49 +020079
80def get_boot_libs(version):
Christoffer Quist Adamsen2434a4d2023-10-16 11:29:03 +020081 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 Ager418d1ca2017-05-22 09:35:49 +020093
94def get_common_flags(version):
Christoffer Quist Adamsen2434a4d2023-10-16 11:29:03 +020095 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 Ager418d1ca2017-05-22 09:35:49 +0200105
106def get_debuggee_flags(version):
Christoffer Quist Adamsen2434a4d2023-10-16 11:29:03 +0200107 return get_common_flags(version) + DEBUGGEE_EXTRA_FLAGS
108
Mads Ager418d1ca2017-05-22 09:35:49 +0200109
110def get_debugger_flags(version):
Christoffer Quist Adamsen2434a4d2023-10-16 11:29:03 +0200111 return get_common_flags(version) + DEBUGGER_EXTRA_FLAGS
112
Mads Ager418d1ca2017-05-22 09:35:49 +0200113
114def runDebuggee(version, args):
Christoffer Quist Adamsen2434a4d2023-10-16 11:29:03 +0200115 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 Ager418d1ca2017-05-22 09:35:49 +0200125
126def runDebugger(version, classpath, args):
Christoffer Quist Adamsen2434a4d2023-10-16 11:29:03 +0200127 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 Ager418d1ca2017-05-22 09:35:49 +0200141
142def usage():
Christoffer Quist Adamsen2434a4d2023-10-16 11:29:03 +0200143 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 Ager418d1ca2017-05-22 09:35:49 +0200151
152def main():
Christoffer Quist Adamsen2434a4d2023-10-16 11:29:03 +0200153 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 Ager418d1ca2017-05-22 09:35:49 +0200175 else:
Christoffer Quist Adamsen2434a4d2023-10-16 11:29:03 +0200176 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 Ager418d1ca2017-05-22 09:35:49 +0200182
183if __name__ == '__main__':
Christoffer Quist Adamsen2434a4d2023-10-16 11:29:03 +0200184 sys.exit(main())