# -*- 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])

# 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)

config.substitutions.append(('%{inputs}', os.path.join(
    config.test_source_root, 'Inputs')))
config.substitutions.append(('%{lit}', "%%{python} %s" % (
    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')

# 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']))
