blob: d7ab9aac10bfc8d0ec8488f3dc3ef85313574100 [file] [log] [blame]
#!/usr/bin/env python
# Copyright (c) 2018, 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.
from __future__ import absolute_import
from __future__ import division
from __future__ import print_function
import gradle
import jdk
import os
import subprocess
import sys
import utils
EXCEPTION_LINE = 'Intentional exception for testing retrace.'
EXPECTED_LINES = [
'com.android.tools.r8.utils.SelfRetraceTest.foo3(SelfRetraceTest.java:13)',
'com.android.tools.r8.utils.SelfRetraceTest.foo2(SelfRetraceTest.java:17)',
'com.android.tools.r8.utils.SelfRetraceTest.foo1(SelfRetraceTest.java:21)',
'com.android.tools.r8.utils.SelfRetraceTest.test(SelfRetraceTest.java:26)',
'com.android.tools.r8.R8.run(R8.java:',
]
def main():
args = sys.argv[1:]
if len(args) == 0:
gradle.RunGradle(['r8lib'])
r8lib = utils.R8LIB_JAR
r8map = utils.R8LIB + '.map'
elif len(args) == 2:
r8lib = args[0]
r8map = args[1]
elif len(args) == 1 and args[0] == '--help':
print('Usage: test_self_retrace.py [<path-to-r8lib-jar> <path-to-r8lib-map]')
print('If the path is missing the script builds and uses ' + utils.R8LIB_JAR)
return
else:
raise Exception("Only two argument allowed, see '--help'.")
# Run 'r8 --help' which throws an exception.
cmd = [
jdk.GetJavaExecutable(),'-cp', r8lib, 'com.android.tools.r8.R8', '--help'
]
os.environ["R8_THROW_EXCEPTION_FOR_TESTING_RETRACE"] = "1"
utils.PrintCmd(cmd)
p = subprocess.Popen(cmd, stderr=subprocess.PIPE)
_, stacktrace = p.communicate()
assert(p.returncode != 0)
assert(EXCEPTION_LINE in stacktrace)
# r8lib must be minified, original class names must not be present.
assert('SelfRetraceTest' not in stacktrace)
# Run the retrace tool.
cmd = [jdk.GetJavaExecutable(), '-jar', utils.RETRACE_JAR, r8map]
utils.PrintCmd(cmd)
p = subprocess.Popen(cmd, stdin=subprocess.PIPE, stdout=subprocess.PIPE)
retrace_stdout, _ = p.communicate(stacktrace)
assert p.returncode == 0
retrace_lines = retrace_stdout.splitlines()
line_index = -1
for line in retrace_lines:
if line_index < 0:
if 'java.lang.RuntimeException' in line:
assert(EXCEPTION_LINE in line)
line_index = 0;
else:
assert EXPECTED_LINES[line_index] in line
line_index += 1
if line_index >= len(EXPECTED_LINES):
break
assert(line_index >= 0)
if __name__ == '__main__':
sys.exit(main())