blob: 6e48aa6c229206a02effdff0c94ad34bd7592729 [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 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
elif len(args) == 1:
if args[0] == '--help':
print('Usage: test_self_retrace.py [<path-to-r8lib-jar>]')
print('If the path is missing the script builds and uses ' + utils.R8LIB_JAR)
return
else:
r8lib = args[0]
else:
raise Exception("Only one argument is allowed, see '--help'.")
# Run 'r8 --help' which throws an exception.
cmd = ['java','-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 = ['java', '-jar', utils.RETRACE_JAR, r8lib + ".map"]
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())