mirror of
https://github.com/llvm/llvm-project.git
synced 2025-05-16 08:26:07 +00:00

This patch extends lit's test suite to check that lit's internal shell doesn't accidentally execute internal commands as external commands. It does so by putting fake failing versions of those commands in `PATH` while the entire lit test suite is running. Without the fixes in D65697 but with its tests, this approach catches accidental external `env` calls. Reviewed By: probinson Differential Revision: https://reviews.llvm.org/D66293 llvm-svn: 369309
89 lines
3.6 KiB
Python
89 lines
3.6 KiB
Python
# -*- 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']))
|