# -*- Python -*-

import os
import platform
import sys

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.
config.substitutions.append(('%{inputs}', os.path.join(
    config.test_source_root, 'Inputs')))
config.substitutions.append(('%{lit}',
    "{env} %{{python}} {lit}".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 psutil is available
supported, errormsg = lit_config.maxIndividualTestTimeIsSupported
if supported:
    config.available_features.add("lit-max-individual-test-time")
else:
    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.
test_bin = os.path.join(os.path.dirname(__file__), 'Inputs', 'fake-externals')
config.environment['PATH'] = os.path.pathsep.join((test_bin,
                                                   config.environment['PATH']))
