# -*- Python -*-

import os
import platform
import sys
import subprocess

import lit.formats
from lit.llvm import llvm_config

# Configuration file for the 'lit' test runner.

# name: The name of this test suite.
config.name = 'lit'

# testFormat: The test format to use to interpret tests.
config.test_format = lit.formats.ShTest(execute_external=False)

# suffixes: A list of file extensions to treat as test files.
config.suffixes = ['.py']

# excludes: A list of individual files to exclude.
config.excludes = ['Inputs']

# test_source_root: The root path where tests are located.
config.test_source_root = os.path.dirname(__file__)
config.test_exec_root = config.test_source_root

config.target_triple = '(unused)'

llvm_src_root = getattr(config, 'llvm_src_root', None)
if llvm_src_root:
  # ``test_source_root`` may be in LLVM's binary build directory which does not contain
  # ``lit.py``, so use `llvm_src_root` instead.
  lit_path = os.path.join(llvm_src_root, 'utils', 'lit')
else:
  lit_path = os.path.join(config.test_source_root, '..')

# Required because some tests import the lit module
if llvm_config:
  llvm_config.with_environment('PYTHONPATH', lit_path, append_path=True)
else:
  config.environment['PYTHONPATH'] = os.pathsep.join([lit_path])
# Do not add user-site packages directory to the python search path. This avoids test failures if there's an
# incompatible lit module installed inside the user-site packages directory, as it gets prioritized over the lit
# from the PYTHONPATH.
config.environment['PYTHONNOUSERSITE'] = '1'

# Add llvm and lit tools directories if this config is being loaded indirectly.
# In this case, we can also expect llvm_config to have been imported correctly.
for attribute in ('llvm_tools_dir', 'lit_tools_dir'):
    directory = getattr(config, attribute, None)
    if directory:
        llvm_config.with_environment('PATH', directory, append_path=True)

# This test suite calls %{lit} to test lit's behavior for the sample test
# suites in %{inputs}.  This test suite's results are then determined in part
# by %{lit}'s textual output, which includes the output of FileCheck calls
# within %{inputs}'s test suites.  Thus, %{lit} clears environment variables
# that can affect FileCheck's output.  It also includes "--order=lexical -j1"
# to ensure predictable test order, as it is often required for FileCheck
# matches.
config.substitutions.append(('%{inputs}', os.path.join(
    config.test_source_root, 'Inputs')))
config.substitutions.append(('%{lit}', '%{lit-no-order-opt} --order=lexical'))
config.substitutions.append(('%{lit-no-order-opt}',
    "{env} %{{python}} {lit} -j1".format(
        env="env -u FILECHECK_OPTS",
        lit=os.path.join(lit_path, 'lit.py'))))
config.substitutions.append(('%{python}', '"%s"' % (sys.executable)))

# Enable coverage.py reporting, assuming the coverage module has been installed
# and sitecustomize.py in the virtualenv has been modified appropriately.
if lit_config.params.get('check-coverage', None):
    config.environment['COVERAGE_PROCESS_START'] = os.path.join(
        os.path.dirname(__file__), ".coveragerc")

# Add a feature to detect if test cancellation is available. Check the ability
# to do cancellation in the same environment as where RUN commands are run.
# The reason is that on most systems cancellation depends on psutil being
# available and RUN commands are run with a cleared PYTHONPATH and user site
# packages disabled.
testing_script_path = "/".join((os.path.dirname(__file__),
                                "check-tested-lit-timeout-ability"))
proc = subprocess.run([sys.executable, testing_script_path],
                      stderr=subprocess.PIPE, env=config.environment,
                      universal_newlines=True)
if proc.returncode == 0:
    config.available_features.add("lit-max-individual-test-time")
else:
    errormsg = proc.stderr
    lit_config.warning('Setting a timeout per test not supported. ' + errormsg
                       + ' Some tests will be skipped and the --timeout'
                         ' command line argument will not work.')

# When running the lit tests standalone, we want to define the same features
# that the llvm_config defines. This means that the 'system-windows' feature
# (and any others) need to match the names in llvm_config for consistency
if not llvm_config:
  if sys.platform.startswith('win') or sys.platform.startswith('cygwin'):
    config.available_features.add('system-windows')
  if platform.system() == 'AIX':
    config.available_features.add('system-aix')

# For each of lit's internal shell commands ('env', 'cd', 'diff', etc.), put
# a fake command that always fails at the start of PATH.  This helps us check
# that we always use lit's internal version rather than some external version
# that might not be present or behave correctly on all platforms.  Don't do
# this for 'echo' because an external version is used when it appears in a
# pipeline.  Don't do this for ':' because it doesn't appear to be a valid file
# name under Windows. Don't do this for 'not' because lit uses the external
# 'not' throughout a RUN line that calls 'not --crash'.
test_bin = os.path.join(os.path.dirname(__file__), 'Inputs', 'fake-externals')
config.environment['PATH'] = os.path.pathsep.join((test_bin,
                                                   config.environment['PATH']))
