Joel E. Denny 971a9f7eea [lit] Check for accidental external command calls
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
2019-08-19 22:59:37 +00:00

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