#!/usr/bin/env python3
# -*- coding:utf-8 -*-
# Copyright 2019 The Android Open Source Project
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#      http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

"""Wrapper to run pytest with the right settings."""

from __future__ import print_function

import errno
import os
import shutil
import subprocess
import sys


def find_pytest():
  """Try to locate a good version of pytest."""
  # Use the Python 3 version if available.
  ret = shutil.which('pytest-3')
  if ret:
    return ret

  # Hopefully this is a Python 3 version.
  ret = shutil.which('pytest')
  if ret:
    return ret

  print(f'{__file__}: unable to find pytest.', file=sys.stderr)
  print(f'{__file__}: Try installing: sudo apt-get install python-pytest',
        file=sys.stderr)


def main(argv):
  """The main entry."""
  # Add the repo tree to PYTHONPATH as the tests expect to be able to import
  # modules directly.
  pythonpath = os.path.dirname(os.path.realpath(__file__))
  oldpythonpath = os.environ.get('PYTHONPATH', None)
  if oldpythonpath is not None:
    pythonpath += os.pathsep + oldpythonpath
  os.environ['PYTHONPATH'] = pythonpath

  pytest = find_pytest()
  return subprocess.run([pytest] + argv, check=True)


if __name__ == '__main__':
  sys.exit(main(sys.argv[1:]))
