#!/usr/bin/env vpython3

# Copyright (c) 2019 The WebRTC project authors. All Rights Reserved.
#
# Use of this source code is governed by a BSD-style license
# that can be found in the LICENSE file in the root of the source
# tree. An additional intellectual property rights grant can be found
# in the file PATENTS.  All contributing project authors may
# be found in the AUTHORS file in the root of the source tree.

import argparse
import logging
import subprocess
import sys


def main():
  parser = argparse.ArgumentParser()
  parser.add_argument('--isolated-script-test-output')
  parser.add_argument('--isolated-script-test-perf-output')
  args, unrecognized_args = parser.parse_known_args()

  test_command = _ForcePythonInterpreter(unrecognized_args)
  if args.isolated_script_test_output:
    test_command += [
        '--isolated_script_test_output', args.isolated_script_test_output
    ]
  if args.isolated_script_test_perf_output:
    test_command += [
        '--isolated_script_test_perf_output=' +
        args.isolated_script_test_perf_output
    ]
  logging.info('Running %r', test_command)

  return subprocess.call(test_command)


def _ForcePythonInterpreter(cmd):
  """Returns the fixed command line to call the right python executable."""
  out = cmd[:]
  if len(out) > 0:
    if out[0] == 'python':
      out[0] = sys.executable
    elif out[0].endswith('.py'):
      out.insert(0, sys.executable)
  return out


if __name__ == '__main__':
  logging.basicConfig(level=logging.INFO)
  sys.exit(main())
