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