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