#!/usr/bin/env vpython3
# Copyright 2017 The Chromium Authors
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

import argparse
import json
import os
import subprocess
import sys

import common

sys.path.append(
    os.path.abspath(os.path.join(os.path.dirname(__file__), os.path.pardir)))
# //testing imports.
import xvfb


def main(argv):
  parser = argparse.ArgumentParser()
  parser.add_argument('--isolated-script-test-output', type=str, required=False)
  parser.add_argument('--isolated-script-test-chartjson-output',
                      type=str,
                      required=False)
  parser.add_argument('--isolated-script-test-perf-output',
                      type=str,
                      required=False)
  parser.add_argument('--isolated-script-test-filter', type=str, required=False)
  parser.add_argument('--isolated-script-test-launcher-retry-limit',
                      type=int,
                      required=False)
  parser.add_argument('--platform',
                      type=str,
                      default=sys.platform,
                      required=False)

  args, unrecognized = parser.parse_known_args(argv)

  env = os.environ.copy()

  additional_args = []
  if args.platform == 'win32':
    exe = os.path.join('.', 'content_shell.exe')
  elif args.platform == 'darwin':
    exe = os.path.join('.', 'Content Shell.app', 'Contents', 'MacOS',
                       'Content Shell')
    # The Content Shell binary does not directly link against
    # the Content Shell Framework (it is loaded at runtime). Ensure that
    # symbols are dumped for the Framework too.
    additional_args = [
        '--additional-binary',
        os.path.join('.', 'Content Shell.app', 'Contents', 'Frameworks',
                     'Content Shell Framework.framework', 'Versions', 'Current',
                     'Content Shell Framework')
    ]
  elif args.platform == 'android':
    exe = os.path.join('.', 'lib.unstripped',
                       'libcontent_shell_content_view.so')
  elif args.platform == 'fuchsia':
    exe = os.path.join('.', 'exe.unstripped', 'content_shell')
  else:
    exe = os.path.join('.', 'content_shell')

  with common.temporary_file() as tempfile_path:
    env['CHROME_HEADLESS'] = '1'
    cmd = [
        sys.executable,
        os.path.join(common.SRC_DIR, 'content', 'shell', 'tools',
                     'breakpad_integration_test.py'),
        '--verbose',
        '--build-dir',
        '.',
        '--binary',
        exe,
        '--json',
        tempfile_path,
        '--platform',
        args.platform,
    ] + additional_args + unrecognized

    if args.platform == 'fuchsia':
      rc = subprocess.call(cmd, env=env)
    else:
      rc = xvfb.run_executable(cmd, env)

    with open(tempfile_path) as f:
      failures = json.load(f)

  if args.isolated_script_test_output:
    with open(args.isolated_script_test_output, 'w') as fp:
      common.record_local_script_results('content_shell_crash_test', fp,
                                         failures, True)

  return rc


def main_compile_targets(args):
  json.dump(['content_shell_crash_test'], args.output)


if __name__ == '__main__':
  # Conform minimally to the protocol defined by ScriptTest.
  if 'compile_targets' in sys.argv:
    funcs = {
        'run': None,
        'compile_targets': main_compile_targets,
    }
    sys.exit(common.run_script(sys.argv[1:], funcs))
  sys.exit(main(sys.argv[1:]))
