| #!/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()) |