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